OmniAICreator/Qiita-1.07M huggingface dataset:
【Drupal8】Twigのテンプレートファイルを任意に使いたい


## Drupal8 のViewの仕組みはMVCフレームワークのと勝手が違う
CakePHPやRailsといったフレームワークでは、MVCの仕組みを利用して、コントローラーでテンプレートファイルを指定してデータを渡すことで作成した任意のViewファイルをHTMLとして出力することができる。
DrupalではテンプレートエンジンにTwigを使っていて、使い方を検索するとDrupalのシステムがロードするTwigのテンプレートファイルの命名規則に従ったTwigファイルを用意することでその箇所のViewを上書きするというような使い方が出てくる。

Drupalで通常のフレームワークと同じように任意の場所に任意のTwigファイルの内容を出力したい時どうすればいいのかよくわからない。

## Twigファイルを指定してその中身のHTMLを取り出す
自作モジュールのコントローラー内で使うものとして説明。

1. twigのインスタンス(\Drupal\Core\Template\TwigEnvironmentクラス)をDrupalのサービスの仕組みを通して取り出す。
   * `$twig = \Drupal::service('twig');`
   * `new TwigEnvironment()` みたいにやろうとするとめんどくさい引数を要求される。
1. $twig->render() メソッドを呼び出してHTML文字列を取り出す。
   * 第一引数 : twigファイルのパス
   * 第二引数 : twigファイルに渡す変数

## 例
自作モジュール名が「helloworld」だとして。

```modules/custom/helloworld/src/Controller/HelloController.php
<?php
namespace Drupal\helloworld\Controller;
class HelloController
{
  public function helloTwig()
  {
    $twig = \Drupal::service('twig');
    $templateFile = drupal_get_path('module', 'helloworld') . '/templates/hello.html.twig';
    $markup = $twig->render($templateFile, ['name' => '山田太郎']);

    $render_array = [
      '#type'   => 'markup',
      '#markup' => $markup,
    ];
    return $render_array;
  }
}
```


```modules/custom/helloworld/templates/hello.html.twig
<p>Hello! {{ name }} !</p>
```


```modules/custom/helloworld/helloworld.routing.yml
helloworld.twig:
  path: '/helloworld/twig'
  defaults:
    _controller: '\Drupal\helloworld\Controller\HelloController::helloTwig'
  requirements:
    _permission: 'access content'
```

---

<img src="https://qiita-image-store.s3.amazonaws.com/0/159641/46285c56-978a-268a-9525-4f54f373bf2b.png" style="border:1px solid black;" />

---
ubuntuの単語めも

#単語！
・sudo～・・・スーパーユーザーで実行
・cd・・・移動
・ls・・・ファイル一覧表示
・rm・・・ファイルデリート
・pwd・・・現在地の表示
・mkdir・・・フォルダ、ディレクトリを作る
・rmdir・・・ディレクトリを消す
・touch・・・ファイル作成
・cp・・・コピー
・less /*index.html*/・・・中のソースコードがみれた
・wq・・・セーブして前のところに
・q・・・セーブせずに閉じる
・ifconfig・・・現在のネットワーク設定の表示
・sudo vi /*index*/・・・編集
・Esc → i　・・・文字を編集
・/～・・・文字列検索
・:～・・・コマンドをうてる状態
・../　・・・ひとつ前の階層へ
・./　・・・カレントディレクトリ
・シェルスクリプト
#最後に
毎回アップデートしようと思った。
~$ sudo apt-get update
~$ sudo apt-get -y install vim
UbuntuMateにApache、PHP、MySQLをインストールする手順

1．Apacheをインストールする：
下記コマンドでインストールする
<pre>sudo apt-get -y install apache2</pre>

出来たら、Apacheがちゃんとインストールされたかどうか確認する
<pre>apache2 -v</pre>

最後に、Apacheサーバの起動する
<pre>sudo /etc/init.d/apache2 start</pre>

2．PHP 7.0をインストールする：
下記コマンドでインストールする
<pre>sudo apt-get -y install php php-mysql libapache2-mod-php libapache2-mpm-itk</pre>

PHPの設定する
<pre>sudo nano /etc/php/7.0/apache2/php.ini</pre>

「extension=msql.so」を探して、コメントアウト「;」を削除し、有効化する。

PHP 7.0がちゃんとインストールされたかどうか確認する

<pre> php -v</pre>

「PHP 7.0.10-2+deb.sury.org~xenial+1 (cli) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
with Zend OPcache v7.0.10-2+deb.sury.org~xenial+1, Copyright (c) 1999-2016, by Zend Technologies」が出たらOK。

最後に、Apacheサーバの起動する
<pre>sudo /etc/init.d/apache2 start</pre>

3．MySQLをインストールする：
下記コマンドでインストールする
<pre>sudo apt-get -y install mysql-server</pre>
インストール中、MySQLのrootパスワードの設定を求められるので、設定する。「trustno1」を入力する。

Version確認
<pre>mysqld -V</pre>

外部から接続させるための設定編集
<pre>sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf</pre>

bind-address = 127.0.0.1を#bind-address = 127.0.0.1にする。

MySQLの再起動
<pre>sudo /etc/init.d/mysql restart</pre>
Virtual Box仮想HD作成について

#はじめに
授業で学んだ事をメモとして書きます。
※添付している画像は全てスクリーンショットとペイントで編集しました。

#VirtualBoxの仮想HD作成の手順

![virtualbox1.png](https://qiita-image-store.s3.amazonaws.com/0/249280/4b782e74-03d5-d851-4afa-e5f54d1e7d98.png)
Ubuntu公式HP↓
https://www.ubuntulinux.jp/
Ubuntu 16.04 LTS – 2021年4月までサポート 64bit版のISOイメージをダウンロード

![virtualbox.png](https://qiita-image-store.s3.amazonaws.com/0/249280/55e774bd-2358-19ff-e54c-4fb6473aab90.png)
VirtualBoxを起動し、新規作成をする
　※既に一つ作ってあるものは授業で作ったものです

![virtualbox3.png](https://qiita-image-store.s3.amazonaws.com/0/249280/a4c91a79-f4db-6ac6-cbf5-3f93d050eddb.png)
名前は任意、バージョンはUbuntu(64-bit)を選択
　※バージョンのBitは使用しているホストOSに依存する

![virtualbox4.png](https://qiita-image-store.s3.amazonaws.com/0/249280/c8279819-02f4-e26e-8f3a-52e82b6d8063.png)
メモリーサイズは使用しているPCに実装されているメモリに応じて調整

![virtualbox5.png](https://qiita-image-store.s3.amazonaws.com/0/249280/c5c07697-8069-0c28-dcd9-03ef727ceaf8.png)
仮想ハードディスクを作成するを選択し、作成

![virtualbox6.png](https://qiita-image-store.s3.amazonaws.com/0/249280/c17d403a-4e2a-1fbc-d762-13259e324e4c.png)
VDIを選択、次へ

![virtualbox7.png](https://qiita-image-store.s3.amazonaws.com/0/249280/5c5e0641-6452-2591-e7f4-06f73c59a46a.png)
可変サイズを選択、次へ

![virtualbox8.png](https://qiita-image-store.s3.amazonaws.com/0/249280/7358e90b-e8f6-2a4d-62f1-2addcb614504.png)
仮想ハードディスク名を入力し、サイズは[16GB]を設定する

![virtualbox9.png](https://qiita-image-store.s3.amazonaws.com/0/249280/8de0eeef-8b38-e51e-67be-a4288ee03c8b.png)
これでVirtualBox仮想HDの設定が完了する

#VirtualBox仮想HDの初期設定
![virtualbox9.png](https://qiita-image-store.s3.amazonaws.com/0/249280/0280113f-27db-c169-655f-f22257b5c77d.png)
追加した仮想HDを右クリックし、設定を選択

![virtualbox10.png](https://qiita-image-store.s3.amazonaws.com/0/249280/0edc3c73-a2f3-ad7f-02bf-aa898a5b48e0.png)
ビデオカードに余力があるならチェックを入れる
　※起動と動作が安定する場合がある

![virtualbox11.png](https://qiita-image-store.s3.amazonaws.com/0/249280/9f275a7d-2eff-cd7e-4347-af2b85524219.png)
ストレージのコントローラー:IDEにある光学ドライブの追加を選択し、ディスクを選択

![virtualbox12.png](https://qiita-image-store.s3.amazonaws.com/0/249280/26d3cdec-741b-0dd8-c5bf-3683aac4f966.png)
Ubuntu 16.04 LTSのISOイメージを選択するとコントローラー:IDEに追加、設定される

![virtualbox13.png](https://qiita-image-store.s3.amazonaws.com/0/249280/f77aeeb7-24b8-976c-c0c2-4d946dd89041.png)
ネットワークを選択、最初は割り当てがNATになっているのでブリッジアダプターに変更する
　※これで仮想端末とホスト端末が同じLAN内に所属できる
Wio LTEの開発環境セットアップとLチカまで

# Wio LTEの開発環境セットアップとLチカまで

[公式ガイドのチュートリアル](https://seeedjp.github.io/Wiki/Wio_LTE_for_Arduino/Setup-ja.html)に従ってWIo LTEの開発環境のセットアップとLチカまで進めていきましょう。今回はWindows環境で行っています。

## 必要なもの

- Wio LTE本体
- 開発用のPC
  - テスト環境はWindows10 64bitです
- PCとWioLTEをつなぐUSBケーブル

## Arduino IDEのインストール

[ARDUINO公式サイト](https://www.arduino.cc/)の[SOFTWARE](https://www.arduino.cc/en/Main/Software)からArduino IDEをダウンロードします。

Windows環境の場合は[Microsoft ストアのArduino IDEのページ](https://www.microsoft.com/ja-jp/store/p/arduino-ide/9nblggh4rsd8?ocid=badge&rtc=1)から直接ダウンロードしてもよいです。 (転送速度的にはこちらの方が早いです。)

## Arduino側のWioLTE関連のセットアップ

WioLTEの提供元から提供されている[公式セットアップガイド](https://github.com/SeeedJP/WioLTEforArduino/wiki/Setup-ja)に基づいてWio Tracker LTEボードとWio LTEライブラリを追加します。

### Wio Tracker LTEボードの追加

[公式手順](https://github.com/SeeedJP/WioLTEforArduino/wiki/AddWioLTEBoard-ja)

ファイル→環境設定から「追加のボードマネージャのURL」に[https://raw.githubusercontent.com/Seeed-Studio/Seeed_Platform/master/package_seeeduino_boards_index.json](https://raw.githubusercontent.com/Seeed-Studio/Seeed_Platform/master/package_seeeduino_boards_index.json)を入力します。

ツール→ボード→ボードマネージャに進み、Seeed STM32F4 Boards by Seeed Studioを選択してインストールボタンを押します。

### Wio LTEライブラリの追加

[公式手順](https://github.com/SeeedJP/WioLTEforArduino/wiki/AddWioLTELibrary-ja)

スケッチ→ライブラリをインクルード→ライブラリを管理に進み、Wio LTE for Arduinoを選択してインストールします。

## Windows側のWio LTE関連のセットアップ

### DFUモード用のドライバのインストール

[公式手順](https://github.com/SeeedJP/WioLTEforArduino/wiki/ReplaceDriver-ja)

まずWio LTEをDFUmモードで起動します。

ボード裏側のBOOT0ボタンを押しながら、USBケーブルをWio LTE本体に接続します。
デバイスドライバを開くとUnKnown Device扱いで STM32 BOOTLODER が表示されていると思いますので、WinUSBドライバをインストールします。

[Zadigのサイト](http://zadig.akeo.ie/)からZadigをダウンロードします。(執筆時点ではZadig 2.3)
Zadigを起動し、上側のテキストボックスにSTM32 BOOTLODERが表示されていて、画面中央寄りの緑色の右矢印の右側が WinUSB(vx.x.xxx.xxxxx)になっていることを確認し、 Install Driverボタンを押します。

### 通常モード用のドライバのインストール

[公式手順](https://github.com/SeeedJP/WioLTEforArduino/wiki/InstallVCOMDriver-ja)

PCとWio LTEを接続したままでボード表面のRSTボタンを押します。
この段階では、デバイスドライバを開いて ポート(COMとLPT) を確認しても、WioLTEっぽいものは見つからないと思います。(抜き差しして確認したところ USB シリアル デバイス (COM4) のようです。(COM 4のところは環境によって4以外の数字になります。))

ということでドライバをインストールします。
まず [公式サイトのWikiに添付されているドライバのファイル](https://github.com/SeeedJP/WioLTEforArduino/wiki/stsw-stm32102/stsw-stm32102.zip)をダウンロードします。
ダウンロードしたファイルをUnZIPするともう一つZIPファイルが出てくるので、さらにUnZIPします。
解凍されたファイルのうちVCP_V1.4.0_Setup.exeを実行します。
(インストール中の選択肢は全部デフォルトのままで、NextとかInstallのボタンを押していきます。)
C:\Program Files (x86)\STMicroelectronics\Software\Virtual comport driver にドライバのインストールファイルが展開されるので、[公式手順書の対応表](https://github.com/SeeedJP/WioLTEforArduino/wiki/InstallVCOMDriver-ja)を見て、該当するセットアップファイルを実行します。
セットアップファイルも設定はデフォルトのままで進めていきます。途中Windowsから警告が出ますが、気にせずOKを押して進めていきます。

セットアップ作業はここで終了です。

-----

## Lチカ

Arduino IDEとドライバ類のセットアップが終わったら、試しにWio LTEにサンプルスケッチを書き込んで正常にセットアップできているか確認しようと思います。

### Wio LTEをDFUモードへ切り替える

裏面のBOOT0ボタンを押しながら表面のRSTボタンを押します。

### Lチカのスケッチを書き込む

まずArduino IDEを起動します。
ツール→ボード: へ進み Wio Tracker LTE を選択します。
ファイル→スケッチ例→Wio LTE for Arduino へ進み、 LedSetRGB を選択します。
新しいArduinoIDEが立ち上がるので、丸で囲われた右矢印を押してスケッチを書き込みます。
(IDEの下のログに can't detachとか出てきても問題ないので気にしないでください。)

ログメッセージで DFU end と出てくれば書き込みが終わっているはずですので、Wio LTEの表面にあるRSTボタンを押します。表面の一番大きいチップの横にあるLEDがカラフルに光り始めれば成功です。
[Android] Material Design 2018 の変化。

こんにちは。

I/O 18 たのしんでますか？　皆さんみてますか？
Material Designは少し変化？になり、新しい色々追加になりました。
ComponentのCut Themeなど色々。

1. [Material Design IO](https://material.io)
2. [How to incorporate what's new with Material Design in your code base](https://www.youtube.com/watch?v=D7LB-QPxH9c)
3. [Code beautiful UI with Flutter and Material Design (Google I/O '18)](https://www.youtube.com/watch?v=hA0hrpR-o8U)
4. [Build great Material Design products across platforms (Google I/O '18)](https://www.youtube.com/watch?v=Ty6VjgVHiko)
5. [Customize Material Components for your product (Google I/O '18)](https://www.youtube.com/watch?v=3VUMl_l-_fI)

## iOS, Android, Flutter, Webを一体化。

アップルもアンドロイドもマテリアルデザインを同じに見えるように。

## Flutterもできる。

3番のリンクを見てみるとFlutterも新しいマテリアルが可能に。

### Tutorial
[Flutter Material Design Tutorial](https://material.io/collections/developer-tutorials/#flutter)

## Shape

[About shape](https://material.io/design/shape/about-shape.html#shaping-material)

## Iconの追加

1．Fill
2. Outline
3. Rounded
4. Two-Tone
5. Sharp 

など、種類か増えた。

## Material Theme Editor & Gallery

Designがぜんぜんできません。！と思っている方はこっちを
1. [Material Theme Editor](https://material.io/tools/theme-editor/)
2. [Gallery](https://gallery.io/login)
3. [Material Studies Shrine](https://material.io/design/material-studies/shrine.html#about-shrine)
カスタマージャーニーの目的

授業でした内容を自分のメモとして書き残します。

---

4/27、5/4の授業内容

---

前回のまとめ
　⇒ [プロジェクトの目的](https://qiita.com/112231/items/9859291a1c93af5032fa)

今回
　⇒ [カスタマージャーニーの目的](https://qiita.com/112231/items/20569e2e8202229b3c8e)

※ カスタマージャーニー ※
企画や事業などを立ち上げる際にあらかじめ設定した ペルソナの動きを可視化したもの

---

■ カスタマージャーニーが必要とされる理由

〇 スマートフォンの普及
⇒ ユーザが商品と接点を持ち、購入するまでの経路が多様化

ペルソナの設定だけではなく、そのペルソナの**行動**も設定することが重要視されるようになる

■ カスタマージャーニーマップ作成のメリット

1. 社内での共通認識
 - コミュニケーションミスの防止
2. 顧客目線で考えられる
 - 開発者目線での運営・開発の防止
3. 自社で提供するコンテンツがブレない
 - ユーザの行動パターン、ユーザに提供したいことを見失わない

■ フレームワークを決める

※ ペルソナ設定を行った後の工程 ※

今回は、極力シンプルなフレームワークを使用した

**横軸**
「認知」「興味・関心」「比較・検討」「行動」
**縦軸**
「接触ポイント」「行動」「思考」

⇒ ここに、ペルソナの行動の仮説を記入していく

〇 記入のルール

**横軸**

ユーザの消費行動フレームワーク「AISAS」をベースとする

※ AISAS ※
　Attention（注意）
　Interest（関心）
　Search（検索）
　Action（購買）
　Share（情報共有）
の頭文字を取ったもの

**縦軸**

- 接触ポイント
 - ユーザが行動する際に触れるメディアやサービス、それを知ったきっかけ
- 行動
 - ユーザが取る行動、したこと
- 思考
 - その行動を取っている時に抱いている思考や感情

■ フレームワークに仮設を埋める

テキストだけではなく、アイコンや写真などを用い、他の人が見てイメージしやすい状態にすると良い

〇 この工程で大切なこと

『 このポイントの何をサポート・解決し、ターゲットをどのような思考にさせるのか 』
を、明確にすること

---

最後までお読みいただきありがとうございました。
git stashやgit resetで削除してしまったときに対応するべきこと

# 概要

```bash:CommandLine
git stash clear
git reset --hard
```


これらのコマンドで必要なことまで削除してしまった経験がある。
今回社内勉強会にて先輩の発表を聞き、上記で削除してしまった奴らを救い出すためのコマンドがあることを知った。どうやら方法はいくつかあるらしい。それをまとめておく。


# 銀の弾丸

銀の弾丸になりうるコマンドとして以下の二つを発見した。

- git branch
- git fsck

## git branchだと？



## blobもcommitも表示

```bash:辿れないコミットたちを一覧で見る
$ git fsck --lost-found

Checking object directories: 100% (256/256), done.
Checking objects: 100% (378440/378440), done.
Checking connectivity: 364378, done.
dangling blob e50250e094d8b82bd6b03e54ac183edb3f1917be
dangling blob 170400a50ec51a2f0d41e6277c512a6ed059590e
dangling blob 230660ef7e0ecf019672f5e8ae501f63f18fcedf
dangling blob 7008c0d7ac965d41288a9c816149c594ec7ffed7
dangling blob 7a0ae01b9f072170af82c8939232f68277d287f2
dangling blob 790c00fe95fc08f630cb30221d3a62d878208b8b
dangling blob 0810505d9cdc261581b42ca21156f1094a22752e
dangling commit 4015100956830157a2fa44a447b35c76d7bb0b1a
dangling blob 0d169065dfa0bbc8bdc36150b22aa885c707ea12
dangling blob 4316900fafaf2c3e80e80350ea8c0f159906a6ac
dangling blob 9c1c00196cc604321d8c8fd2b02ae1f498d31030
dangling blob bf20f0c6ec773ccdacbfbcb3b606086e894df083
dangling blob 0323907eb78ae784b31d164ea6c6bd663fa7639a
dangling blob 632410a1cecd4620c916de719f9dd5ae18d36a50
dangling blob b724d07410a68848820c7df109d5ed450877e4e1
dangling blob 932f10c9091013b90db985f4d87840471033e66d
dangling blob 533600e3476bdf2596a5f5b26465c674241bc483
dangling blob ff3fc0f8c964d2bb92196d0a029d65970c1f1494
dangling blob f341f0f18a0efae13167951d5bdb1652c39a78d9
dangling blob 2644a0c68300cb2da2d796836fcd48f233391869
dangling commit cf44102dcc8ae1f455e0241e7f27e88c7ef1c291
(中略)
```

このコマンドは今までのログをかき集めてくる関係上、今までのコミットの量などが多いほど時間がかかるため、その場合は大人しく待つ。

## commitのみ表示

```bash:commitのみを表示
$ git fsck --lost-found | grep commit | awk '{print $3}'
```
ニューラルネットワークの入力（X）と出力（y）をランダムに並び替える

# はじめに

ニューラルネットワークでミニバッチ学習させるためには、入力（X）と出力（y）をランダムに並べ替える必要がある。そこで、Xとyの各要素の対応を崩さないでランダムに並び替える方法を調べてみた。

# 結果

ベタな方法は、配列のインデックスをランダムに並べ替え、ランダムに並び替えたインデックスの並びでXとyの配列要素を各々取り出す。

``` python
import numpy as np
X = np.array([1, 2, 3, 4])
y = np.array([11, 12, 13, 14])
p = np.random.permutation(len(X))
X = X[p]
y = y[p]
```
Xとyをzipでまとめると、Xとyの要素を同時に並び替えることができる。

``` python
import numpy as np
X = np.array([1, 2, 3, 4])
y = np.array([11, 12, 13, 14])
zipped = list(zip(X, y))
np.random.shuffle(zipped)
X_result, y_result = zip(*zipped)
X = np.asarray(X_result)
y = np.asarray(y_result)
```

これを関数にすると以下の通り。

``` python

def shuffle_dataset(X, y):
    zippded = list(zip(X, y))
    np.random.shuffle(zipped)
    X_result, y_result = zip(*zipped)
    return np.asarray(X_result), np.asarray(y_result)
```
# 参考

- <a href="http://ni4muraano.hatenablog.com/entry/2017/01/30/182447">【Python】 二つのリストの対応関係を保ったままシャッフルする</a>
- <a href="http://dlrecord.hatenablog.com/entry/2017/11/28/194512">zip()を使って複数配列(array, list)をshuffleする-python</a>
源真ゴシック のファイル名とフォントの種類(極太/太字/中/標準/中細/細字/特細)

源真ゴシック (げんしんゴシック) | 自家製フォント工房
http://jikasei.me/font/genshin/#_4

太さによってファイルが別れていて、インストール時に、すでに5,6回も迷っているので、源真ゴシック のファイル名とフォントの種類をまとめておきます。

該当のファイルだけインストールするとよいと思います。

ダウンロードできるファイルは次の通り

genshingothic-20150607.7z 

解凍すると、次のファイル列が取れます。
余分なファイルは除外します。

```
GenShinGothic-ExtraLight.ttf
GenShinGothic-Light.ttf
GenShinGothic-Normal.ttf
GenShinGothic-Regular.ttf
GenShinGothic-Medium.ttf
GenShinGothic-Bold.ttf
GenShinGothic-Heavy.ttf
GenShinGothic-Monospace-ExtraLight.ttf
GenShinGothic-Monospace-Light.ttf
GenShinGothic-Monospace-Normal.ttf
GenShinGothic-Monospace-Regular.ttf
GenShinGothic-Monospace-Medium.ttf
GenShinGothic-Monospace-Bold.ttf
GenShinGothic-Monospace-Heavy.ttf
GenShinGothic-P-ExtraLight.ttf
GenShinGothic-P-Light.ttf
GenShinGothic-P-Normal.ttf
GenShinGothic-P-Regular.ttf
GenShinGothic-P-Medium.ttf
GenShinGothic-P-Bold.ttf
GenShinGothic-P-Heavy.ttf
```
アルファベット順ではない並び替えをしています。

ファイル名のそれぞれの意味は、次の通りです。

- 無印は[源真ゴシック]
- Monospace は全て等幅フォントの[源真ゴシック等幅]
- P は、かなや一部記号がプロポーショナルフォントの[源真ゴシックP]

太さの項目は次の通りです。

- 特細	ExtraLight
- 細字	Light
- 中細	Normal
- 標準	Regular
- 中	Medium
- 太字	Bold
- 極太	Heavy

上から順番に太さがあがっていきます。

細字/中細/標準 くらいのフォントが使いやすいのではないでしょうか。

ご参考にどうぞ。
Slack 4スペースをタブ文字に変換

Slackにレポートをincoming-webhook使ったボットで投稿したいとするじゃないですか。
タブ区切りとかでデータ送ればそのままスプレッドシートに貼れたりして便利だなあと思うじゃないですか。

でも…

Slackが勝手にタブ文字をスペース4個(`&nbsp;`)に変換しちゃうんですよ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/13541/153a884d-6c9b-a2d2-89a1-9524310d0751.png)


これではコピペしてシートに貼り付けてもうまいこといかない。
みんなも困ってるだろうと思ってググってみたけど、みんな困ってないみたいｗ

ならば我らがjsで解決しよう。

pre要素をクリックしたタイミングでスペース4字をタブ文字に変換するようにした。
Tampermonkeyべんり。


https://gist.github.com/ishikawam/9c37b76a88559a5f32ea36b2b06908b7

```javascript
// ==UserScript==
// @name         Replace 4 spaces with a tab character for Slack.
// @namespace    M_Ishikawa
// @version      0.1
// @description  Slack 4スペースをタブ文字に変換
// @author       Masayuki Ishikawa
// @match        https://*.slack.com/*
// @grant        none
// ==/UserScript==

/**
 * https://qiita.com/M_Ishikawa/items/8d8db8d0c50039777f00
 * Slackはタブ文字を投稿するとスペース4字に変換してしまう。コピペで困る。
 * ので、要素をclickするとスペース4字をタブ文字に変換する。
 * <pre>のみで有効。
 */
(function() {
    'use strict';

    $(window).on('click', function(e) {
        if ($(e.target).prop("tagName") !== 'PRE' || $(e.target).attr('data-tab')) {
            return;
        }
        $(e.target).attr('data-tab', true);

        var str = $(e.target).html();
        var newStr = $(e.target).html().replace(/&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>/g, '\t');
        if (newStr != str) {
            $(e.target).html(newStr);

            // delete '```'
            $(e.target).removeAttr('data-stringify-prefix');
            $(e.target).removeAttr('data-stringify-suffix');
        }
    });
})();
```

これで

![image.png](https://qiita-image-store.s3.amazonaws.com/0/13541/9282afdd-ebf4-eea6-0da1-e86404cd29f3.png)

シートに貼り付けてみると

![image.png](https://qiita-image-store.s3.amazonaws.com/0/13541/d7603784-85fa-53c8-cadc-0697d47dabf3.png)

これこれ！
【yum】yumリポジトリにremiを追加【remi】

phpのバージョンを5.6から7にアップしたところ、既存サイトがpdoドライバがなくてコケてたのでインストールをこころみるも依存エラーが(´ﾟдﾟ｀)

```
yum install php-pdo_pgsql
```

```
＃ yum install php-pdo_pgsql
読み込んだプラグイン:fastestmirror, security
インストール処理の設定をしています
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * epel: ftp.yz.yamagata-u.ac.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> Package php-pgsql.x86_64 0:5.3.3-49.el6 will be インストール
--> 依存性の処理をしています: php-common(x86-64) = 5.3.3-49.el6 のパッケージ: php-pgsql-5.3.3-49.el6.x86_64
--> 依存性解決を終了しました。
エラー: パッケージ: php-pgsql-5.3.3-49.el6.x86_64 (base)
             要求: php-common(x86-64) = 5.3.3-49.el6
            インストール: php-common-7.2.5-1.el6.remi.x86_64 (@remi-php72)
                php-common(x86-64) = 7.2.5-1.el6.remi
            利用可能: php-common-5.3.3-49.el6.x86_64 (base)
                php-common(x86-64) = 5.3.3-49.el6
 問題を回避するために --skip-broken を用いることができません
 これらを試行できます: rpm -Va --nofiles --nodigest
 ```

#### 解決
レポジトリの参照元オプションを加えて無事インストール完了＼(^o^)／

```
yum install --enablerepo=remi-php72 php-pdo php-pgsql
```


<img width="981" alt="スクリーンショット 2018-05-10 15.29.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/151314/61cafc91-30ae-636e-cfa9-feeeeb3ed921.png">

いつも忘れるわ…
MySQL 5.7でJSON_OBJECTでハマった話

MySQL 5.7から導入された`JSON_OBJECT`がめっちゃ便利！と思ってたら、
ちょっと躓いてしまったことがあったのでメモ。


`JSON_OBJECT`したものを`GROUP_CONCAT`や`CONCAT`して、それを`JSON_OBJECT`にしたい、って時。

たとえばこういうテーブルがあったとして、

```mysql:create_data.sql
CREATE TABLE menus (occasion varchar(10),menu varchar(10));
INSERT INTO menus(occasion,menu) VALUE('朝','照り焼き');
INSERT INTO menus(occasion,menu) VALUE('昼','棒々鶏');
INSERT INTO menus(occasion,menu) VALUE('夜','唐揚げ');
```

```mysql:こうしたい
{"menus": [{"朝": "照り焼き"},
           {"昼": "棒々鶏"},
           {"夜": "唐揚げ"}]
}

```

で、こういう感じで書いてみた。

```mysql:first_try.sql
SELECT
	JSON_OBJECT("menus", menus)
FROM(
	SELECT
		CONCAT(
			'[',
			GROUP_CONCAT(JSON_OBJECT(occasion, menu))
			,']'
		) AS menus
	FROM
		menus
) AS m;
------------------------------------------
result ->
{"menus": "[{\"朝\": \"照り焼き\"},{\"昼\": \"棒々鶏\"},{\"夜\": \"唐揚げ\"}]"}
```

はじめに作ったJSON_OBJECTの`"`とかがエスケープされてしまっとる。。。

結論から書くと、CASTで型変換してあげなきゃいけないみたい。

```mysql:second_try.sql
SELECT
	JSON_OBJECT("menus", CAST(menus AS JSON))
FROM(
	SELECT
		CONCAT(
			'[',
			GROUP_CONCAT(JSON_OBJECT(occasion, menu))
			,']'
		) AS menus
	FROM
		menus
) AS m;
------------------------------------------
result ->
{"menus": [{"朝": "照り焼き"}, {"昼": "棒々鶏"}, {"夜": "唐揚げ"}]}
```


順序だてて説明。

```mysql
SELECT JSON_OBJECT('id', 87, 'name', 'carrot');

result -> {"id": 87, "name": "carrot"} // JSON_OBJECTだけだと、JSON型
```

```mysql
SELECT JSON_OBJECT("human",JSON_OBJECT('id', 87, 'name', 'carrot'));

result -> {"human": {"id": 87, "name": "carrot"}} // JSONのネストがちゃんとできる
```

でも、`CONCAT`もしくは`GROUP CONCAT`してしまうと

```mysql
SELECT CONCAT(JSON_OBJECT('id', 87, 'name', 'carrot'));

result -> {"id": 87, "name": "carrot"} // 文字列型になっちゃうっぽい
```

```mysql
SELECT JSON_OBJECT("human",CONCAT(JSON_OBJECT('id', 87, 'name', 'carrot')));

result -> {"human": "{\"id\": 87, \"name\": \"carrot\"}"} // 文字列と認識されるのでエスケープされちゃう
```

じゃあ、どうするか？

→`CAST`で型をJSONにしてやったらいいっぽい

```mysql
SELECT JSON_OBJECT("human",CAST(CONCAT(JSON_OBJECT('id', 87, 'name', 'carrot')) AS JSON));

result -> {"id": 87, "name": "carrot"} // うまくいった。
```

ちょっと見にくいですが、

```mysql
CAST(
    CONCAT(
        JSON_OBJECT('id', 87, 'name', 'carrot')
    ) AS JSON
)
```
ってことです。
アプリ上でデザインレビューできるHyperion-iOSが便利すぎる

## Hyperionとは

[iPhone上でデザインチェックできるツールが神がかっている](https://qiita.com/kaoryuuu/items/36ddbaa0d82db53f2690)

こちらの記事で見つけたHyperionがとても便利です。

なにが便利かっていうと、アプリ上でデザインレビューができるところです。Hyperionを導入したアプリを実行して、画面右端から左にスワイプするとメニューが表示されます。メニューをタップすることで、それぞれの機能を使うことができます。

![Hyperion.gif](https://qiita-image-store.s3.amazonaws.com/0/38924/c8506367-ce18-49b9-c2da-59f9e2f2ab5b.gif)


それでは、どういう機能なのかひとつずつ見ていきましょう。

### Slow Animations

まずはSlow Animationsです。

この機能をつかうとアニメーションの速度を変更できます。0.25、0.5、0.75のみっつからいずれかをタップで選択します。そうすると、通常のスピードの25%、50%、75%でアニメーションが再生されます。

![HyperionSlowAnimations.gif](https://qiita-image-store.s3.amazonaws.com/0/38924/4eb34676-d757-f545-ce08-65f73142d985.gif)


アニメーションが想定した通りに動いているか確認するときに役立ちます。

### Measurements

つぎはMeasurementsです。

この機能をつかうとふたつのViewの距離を測定できます。
また、Viewを拡大できるようになるので、Viewが多い画面でも簡単に測定できます。

![Hyperion Measurements.gif](https://qiita-image-store.s3.amazonaws.com/0/38924/25a8e375-8a4f-b8df-3789-829d5eac1ee4.gif)


レイアウトがデザイン通りになっているのか確認するときに役立ちます。

### View Inspector

最後はView Inspectorです。

この機能をつかうとViewの設定を参照できます。
Viewをタップすると、フォントの種類やサイズ、背景色などを表示してくれます。

![HyperionViewInspector.gif](https://qiita-image-store.s3.amazonaws.com/0/38924/9f5a41ca-c004-3cf3-5d4b-2722a0dc78a8.gif)


Viewの設定があっているか確認するときに役立ちます。

### Third-Party Plugins

Hyperionでは、サードパーティのプラグインを募集しています。プラグインの作成ガイドは作成中とのことですが、こちらからリファレンスを参照できます。
[HyperionCore Reference](https://willowtreeapps.github.io/Hyperion-iOS/)

いいアイデアをお持ちのかたは、ぜひチャレンジしてください。

## 導入方法

導入は、CocoaPods、Carthage、もしくはマニュアルから選択できます。

こちら↓のGithubに導入方法の解説があります。
[Hyperion-iOS](https://github.com/willowtreeapps/Hyperion-iOS)

CocoaPodsでインストールするなら、Podfileに以下の行を追加してpod installしてください。

```rb:Podfile
use_frameworks!

pod "HyperioniOS/Core", :configurations => ['Debug']

#"Configurations => Debug" ensures it is only included in debug builds. Add any configurations you would like Hyperion to be included in.
pod 'HyperioniOS/AttributesInspector', :configurations => ['Debug'] # Optional plugin
pod 'HyperioniOS/Measurements', :configurations => ['Debug'] # Optional plugin
pod 'HyperioniOS/SlowAnimations', :configurations => ['Debug'] # Optional plugin
```

たとえばこんな感じです（targetはプロジェクトのターゲット名に変えてください）。

```rb:Podfile
target 'TestHyperion' do
 use_frameworks!

 pod "HyperioniOS/Core", :configurations => ['Debug']
 #"Configurations => Debug" ensures it is only included in debug builds. Add any configurations you would like Hyperion to be included in.
 pod 'HyperioniOS/AttributesInspector', :configurations => ['Debug'] # Optional plugin
 pod 'HyperioniOS/Measurements', :configurations => ['Debug'] # Optional plugin
 pod 'HyperioniOS/SlowAnimations', :configurations => ['Debug'] # Optional plugin
end
```

Build ConfigurationがDebugのときだけで動くようになっているので、間違ってリリース版に入る心配がありません。

## おまけ

デバッグビルドとリリースビルドを切り替える方法は、こちらをご覧ください。

Edit Schemeを選択して、
![Hyperion01.png](https://qiita-image-store.s3.amazonaws.com/0/38924/009438f3-1f0a-59f5-537b-09db4ae10410.png)

RunのBuild ConfigurationをDebugにします。
<img width="896" alt="Hyperion02.png" src="https://qiita-image-store.s3.amazonaws.com/0/38924/eb4521ff-fb2c-736f-0dde-d31004f48cfa.png">

Hyperionを活用して、よいデバッグライフを！
Laravel5.4のインストールをやってみた

# laravel インストール手順
## 環境
CentOS-6.9
laravel-5.4.36
php-5.6.35
Apache-2.2.15

## 手順
### 1. remi-php56をインストール
```
rpm -Uvh http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
```

### 2. Apacheをインストール

```
yum install httpd httpd-devel httpd-manual httpd-tools
```

### 3. PHPをインストール

インストールオプションは必要に応じて変更してください

```
yum install --enablerepo=remi --enablerepo=remi-php56 php php-devel php-mbstring php-mcrypt php-mysqlnd
```

Apacheのconfを確認

```
ls -la /etc/httpd/conf.d/php.conf
-rw-r--r--. 1 root root 1.5K Apr 25 08:14 php.conf　　　　←このファイルがあればOK

ls -la /etc/httpd/modules/libphp5.so
-rwxr-xr-x. 1 root root 4.5M Apr 25 08:14 libphp5.so　　　←このファイルがあればOK
```

### 4. laravelのインストール

まずはcomposerをインストール

```
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
```

Laravelのインストーラをcomposerのルートディレクトリにもっていく
※この処理は少し時間がかかるので辛抱強く待ちましょう

```
composer global require "laravel/installer"
```

ちなみに上記をrootユーザーで実行すると下記のように警告が表示されるので、可能な限り一般ユーザーで実行しましょう
> **Do not run Composer as root/super user! See https://getcomposer.org/root for details**
参考URL: https://akamist.com/blog/archives/261


Laravelインストーラにパスを通す

```~/.bashrc 
export PATH=$HOME/.composer/vendor/bin:$PATH
source ~/.bashrc
```

新規プロジェクトを作成

```
cd /var/www
laravel new project-name
```

上記を実行すると、/var/www配下にproject-name　というフォルダが作成されます。
> 私の環境では、laravelコマンドを使用してプロジェクトを作成すると、**vendor/**
ディレクトリが作成されないため、composerコマンドで作成しました

composerコマンドでのプロジェクト作成は以下の手順で可能です

```
cd /var/www
composer create-project laravel/laravel --prefer-dist project-name
```

http://localhost/index.php
にアクセスしてLaravelの初期ページが表示されればインストール完了です
※project-name/public　をDocumentRootにした場合です
PowerShellでArcGIS Desktop 10.5のインストールを自動化してみた

Serverのときと同様にインストーラーの解凍だけはGUI必須...

自動化した処理

- ArcGIS Desktop 10.5のインストール
- ArcGIS Desktop 10.5の認証

## インストーラーを解凍する

ArcGIS_Desktop_105_ja_155323.exeを実行する.
解凍先を適宜設定する.
「今すぐプログラムを実行」のチェックを外すこと.

## インストーラーを実行する

``` powershell
$arcGISDesktopSetupExe = "{0}\..\Installer\Desktop_Japanese\Setup.exe" -f $scriptDir
$arcGISDesktopSetupArg = "/qn /quiet SOFTWARE_CLASS=Editor SEAT_PREFERENCE=Fixed DESKTOP_CONFIG=TRUE ENABLEEUEI=0"

Start-Process -FilePath $arcGISDesktopSetupExe -ArgumentList $arcGISDesktopSetupArg -Verb runas -Wait
```

## ライセンス認証を行う

``` powershell
$prvcPath = "E:\PrvcFiles\ArcGISDesktopStandard10.5.prvc"
$softwareAuthorizationExe = "C:\Program Files\Common Files\ArcGIS\bin\softwareauthorization.exe"
$softwareAuthorizationArg = "-S -LIF {0}" -f $prvcPath

Start-Process -FilePath $softwareAuthorizationExe -ArgumentList $softwareAuthorizationArg -Verb runas -Wait
```

``` txt:ArcGISDesktopStandard10.5.prvc
// User Information

First Name=Hoge

Last Name=Fuga

Organization=Some Company

Department=System Development

Email=someone@somecompany.co.jp

Address 1=1-1-1 Shinagawa

City=Shinagawa-ku

State/Province=Tokyo

Country=Japan

Zip/Postal Code=111-1111

Phone Number=+81(0)3-1234-5678

// Features and authorization numbers

ArcGIS Desktop=ESUP000000000

```

### 参考

- http://desktop.arcgis.com/ja/arcmap/10.5/get-started/installation-guide/installing-silently.htm
Ripple (XRP) の残高を取得 (JavaScript)

- Ripple (XRP) の残高を取得する方法のメモです。
- Ripple 公式のライブラリを使用します。
- Ripple 公式ライブラリ ripple-lib: https://github.com/ripple/ripple-lib

# ripple-lib のインストール
- 公式では、yarn を推奨しているけど、以下は npm でインストールする例

```
$ npm install ripple-lib
```

# コード例
- getAccountInfo の返り値のオブジェクトが持っている xrpBalance を読みます。

```js
const RippleAPI = require('ripple-lib').RippleAPI;

const api = new RippleAPI({
  server: 'wss://s1.ripple.com' // Public rippled server hosted by Ripple, Inc.
});

api.connect().then(() => {
	getXrpBalance('r39wDgtwjJkF5NAnXQhy3Z68dDboGebNJv');
}).then(() => {
  return api.disconnect();
}).catch(console.error);

function getXrpBalance(address) {
	api.getAccountInfo(address).then(info => {
		console.log(info.xrpBalance);
	});
};
```
[High Sierra] [ブラウザ] 日本語入力でEnter押したあと、風車で待たさせる件 

数日前にアップデートして以来、なぜかブラウザ（Safari / Chrome)で
日本語入力後にEnterを風車がでて待たされる問題が起きました。

NVRAMクリアしてみたり、入力ソースの推測変換OFFってみたり、
OnyX入れて、不要ファイルやファイルのアクセス権
調整してみたり、ある程度やってみたものの、解決せず。

とりあえず IMEをGoogleに切り替えてみたら、久しぶりに快適な入力状態に。

もし同じような不具合にお悩みの方がいらっしゃれば。
Vagrant環境のCentOSにLaravelをインストール


# はじめに

このドキュメントでは、Laravelの[インストールドキュメント](https://readouble.com/laravel/5.6/ja/installation.html)に従ってインストールするための準備について記述しています。

Laravel
https://readouble.com/laravel/

# 準備

## composerをインストール

https://getcomposer.org/download/

> php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('SHA384', 'composer-setup.php') === '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

実行したディレクトリにcomposer.pharが作成されるので/usr/bin/composerとして移動します。
パスが通っているのでコマンドが実行できるようになります。

```
$ composer [command]
```

## php-zipをインストール

以下のエラーが出る場合はPHPバージョンに応じてリポジトリを指定してインストールします。

>   Problem 1
    - laravel/installer v2.0.1 requires ext-zip * -> the requested PHP extension zip is missing from your system.
    - laravel/installer v2.0.0 requires ext-zip * -> the requested PHP extension zip is missing from your system.
    - Installation request for laravel/installer ^2.0 -> satisfiable by laravel/installer[v2.0.0, v2.0.1].


```
$ sudo yum -y install --enablerepo=remi --enablerepo=remi-php71 php-zip
```

## Laravelをインストール

```
$ composer global require "laravel/installer"
```

## Laravelのパス設定

```
$ vi ~/.bash_profile

# パスを追加して保存します
PATH=$PATH:$HOME/.local/bin:$HOME/bin:$HOME/.config/composer/vendor/bin/

# 再読み込みして設定を反映します
$ source ~/.bash_profile
```

以上で完了です。

# 補足

もしプロジェクトの作成で以下のようなエラーが出たときは、

```
$ laravel new blog
```

>   Problem 1
    - Installation request for phar-io/manifest 1.0.1 -> satisfiable by phar-io/manifest[1.0.1].
    - phar-io/manifest 1.0.1 requires ext-dom * -> the requested PHP extension dom is missing from your system.
  Problem 2
    - Installation request for phpunit/php-code-coverage 6.0.4 -> satisfiable by phpunit/php-code-coverage[6.0.4].
    - phpunit/php-code-coverage 6.0.4 requires ext-dom * -> the requested PHP extension dom is missing from your system.
  Problem 3
    - Installation request for phpunit/phpunit 7.1.5 -> satisfiable by phpunit/phpunit[7.1.5].
    - phpunit/phpunit 7.1.5 requires ext-dom * -> the requested PHP extension dom is missing from your system.
  Problem 4
    - Installation request for theseer/tokenizer 1.1.0 -> satisfiable by theseer/tokenizer[1.1.0].
    - theseer/tokenizer 1.1.0 requires ext-dom * -> the requested PHP extension dom is missing from your system.

php-domをインストールします。

```
$ sudo yum -y install --enablerepo=remi --enablerepo=remi-php71 php-dom
```

# migrate for MySQL

```
$ php artisan migrate
```

migrateを実行する際、Laravelのデフォルト設定がutf8mb4の文字コードになっているので以下のエラーが発生した場合はMySQLの設定を行う必要があります。

```
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes
```

対応方法は下記を参照してください。

> [LaravelでMysqlのcharsetをutf8mb4にしてエラーが出るときの対応方法](https://qiita.com/ichi944/items/03e3bb0bbc97a965faf7)

エラーにより不完全に実行された場合、migrationsテーブルに実行履歴が残らず再度実行した際にテーブルが作成済みであるエラーなどが起こるので、その場合は手動で変更を戻し（テーブルの削除などを行ってから）実行します。
初歩的コマンドまとめ

授業でした内容を自分のメモとして書き残します。

---

4/26(木)の授業内容
Linuxコマンドについてのまとめ

---

#1. Linuxとは
　当時大学生だったリーナス・トーバルズ氏が中心となり開発した、UNIX互換のOS(オペレーティング・システム)である

■ UNIX(OS)
　商用のOS、高額
■ Linux(OS)
　オープンソース、無料

・CUI(Character User Interface)
　黒画面に白文字
・GUI(Graphical User Interface)
　直感的にコンピューターを操作

---

#2. 初歩的なLinuxコマンド

- cd
 - 移動（ホームへ）
- pwd
 - 現在地
- touch
 - ファイル作成
- rm
 - ファイル削除
- mkdir
 - ディレクトリ作成
- rmdir
 - ディレクトリ削除
- ls
 - ファイル一覧表示
- ls -la
 - 詳細表示
- clear
 - コマンド画面をクリア
- sudo reboot
 - 再起動(パスワードを問われる)

■ sudo とは？
スーパーユーザ(管理者権限)で実行すること

■ [. (ドット)]とは？
隠しファイルのこと

---

5/10(木)の授業内容による追記

---

#3. コマンドでファイルを編集する

- less ファイル名.拡張子
 - ファイルを読み取り専用で開く
- ifconfig
 - PC情報表示
- :set number
 - 行番号表示
- sudo vi(⇐ エディター) ファイル名.拡張子
 - ファイルを読み書き専用で開く

■ 編集モード中のコマンド

- i
 - Insert(挿入)の略、挿入モード
- :q
 - 保存せず、編集モードを終わる
- :wq
 - 保存して、編集モードを終わる
- :q!
 - 変更を破棄して、編集モードを終わる

#4. その他、コマンド

- ls -F
 - ファイルかディレクトリかを識別
 - 名前の前に/(スラッシュ)がついていたらディレクトリ
- ls -a
 - 隠しファイルを表示
- cp 元ファイルパス 先ファイルパス
 - ファイルをコピーペーストする
 - 例1：cp sample.txt sample2.txt
 - 例2：cp sample.txt ../examle/sample3.txt
- chmod 777 ファイル名
 - 管理者権限ではなくとも、編集を可能にする(?)
- chown 新しい管理者名:新しい権限 ファイル名
 - 管理者、権限変更

---

最後までお読みいただきありがとうございました。
A-FRAME v0.8.2でvr-modeに移行したときに、iOS 11.3 Safariで動画の再生が一時停止される一時対処法

# 概要
A-FRAME v0.8.2を使用したときに、iOS 11.3.1で動画を再生しながらvr-modeへ移行したときに、動画がpauseされる事象の一時対処方法です。

注意：他のOSバージョンは試せていないです。

# 再現環境
* iOS 11.3.1
* A-FRAME v0.8.2

# 結論
とりあえず一時対処手段から

`AFRAME.utils.device.getVRDisplay().wakelock_.noSleepVideo.moted = true`にすれば動作します。

## 簡易実装例
```javascript
// renderstartイベントを待たなくても
// <script src="https://aframe.io/releases/0.8.2/aframe.min.js"></script>
// が読み込まれた後であれば、大丈夫かと思います。
document.getElementByTagNames('a-scene')[0].addEventListener('renderstart', () => {
  const disp = AFRAME.utils.device.getVRDisplay();
  // PCの場合にwakelock_はセットされなくて、wakelock_.noSleepVideoはiOS 10未満の場合にセットされないためチェックする
  if (disp && disp.wakelock_ && disp.wakelock_.noSleepVideo) {
    disp.wakelock_.noSleepVideo.muted = true
  }
})
```

# 原因
[A-FRAME v0.8.2](https://github.com/aframevr/aframe/tree/v0.8.2)で使用されている[webvr-polyfill v0.10.5](https://github.com/immersive-web/webvr-polyfill/tree/v0.10.5)で使用されている[cardboard-vr-display v1.0.11](https://github.com/immersive-web/cardboard-vr-display/tree/v1.0.11)で使用されている[NoSleep.js v0.7.0](https://github.com/richtr/NoSleep.js/tree/v0.7.0)で、生成しているHTMLVideoElementのmutedをtrueに設定されていないため、iOS Safariでの複数動画再生の条件に引っかかっているようです。

## この辺を見るとなんとなく処理順がわかるかもです
* https://github.com/aframevr/aframe/blob/v0.8.2/src/core/scene/a-scene.js#L253
* https://github.com/immersive-web/cardboard-vr-display/blob/v1.0.11/src/base.js#L382
* https://github.com/immersive-web/cardboard-vr-display/blob/v1.0.11/src/base.js#L120
* https://github.com/richtr/NoSleep.js/blob/v0.7.0/src/index.js#L15
初めてSalesForceをやってみた

#参考サイト
・まずは気になったサイトで勉強からしてみるべし
[無料でSalesforceの勉強をはじめる]
(https://qiita.com/haruto167/items/8afb35590a8622d7e218)

##備忘録
GitHub
Qiita
Apex
MySQL
Oculus Go とUnityとMacで始めるVR開発


# OculusGo買ったしアプリでも作るかー
記事がないやんけ（発売したばかりなので当たり前）
ってなったんで自分で書きます。いろんな記事を見た上でつまづいた所を書きます。
開発OSはMacなのでご了承ください
ちょっとずつスクショとか文献とか足していきます。乞うご期待
**まぁほとんどAndroid周りなんですけどね。**

#全体として
まずOculus GoはGearVR互換です（一部異なる点があります。Oculus goの公式ドキュメントを参照してね）。UnityならAndroid向けにビルドすれば大体ok。まぁ躓くんですけどね。
#Oculus側でやること
##Oculusユーザー登録
Oculusのアカウントをとりますfacebookとの連携ができるのですが、facebook単体でもいいしfacebookなくても大丈夫です。
##Oculusダッシュボードで団体を作る
<img width="1440" alt="スクリーンショット 2018-05-10 15.24.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/256231/e9d807d5-945e-2fd1-418d-c2c8cc4673dd.png">


名前とかは適当でいいんじゃないでしょうか。インターネット開いてダッシュボードに団体を登録します


##Go端末を開発者モードにする
AndroidのOculusアプリから「設定→接続している端末を選ぶ→その他の設定→開発者モード→オン」
![scsh001.jpg](https://qiita-image-store.s3.amazonaws.com/0/256231/2f2f4eb5-55fc-73f8-4e24-36cfe6825be3.jpeg)




HMD被って開発者モードです、みたいな記述があればok
#Unity側ですること
##Androidビルドの準備
###AndroidSDKのインストール
https://developer.android.com/studio/?hl=ja
からAndroidSDKをダウンロード
###JDKのインストール
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
からJDKをダウンロード
###Unityの設定
UnityのPreferenceからSDKの位置を入力
基本的には　/Users/（ユーザ名）/Library/Android/SDKs
UnityのPreferenceからJDKの位置を入力
基本的には
/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home
<img width="541" alt="スクリーンショット 2018-05-10 15.39.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/256231/7d5ea872-4628-e4f5-9c20-3183be11901a.png">

build settingsからandroidにswitch platform。
<img width="625" alt="スクリーンショット 2018-05-10 15.43.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/256231/8d40dce7-2818-941b-e215-d4dfbd071dde.png">


player settings→other settings→identification→package nameからcom.hogehoge.aheaheをデフォルトから変更する。

XR settingsからVirtualRealitySupportedをオン。
VirtualRealitySDKsからOculusを選択。
<img width="289" alt="スクリーンショット 2018-05-10 15.43.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/256231/8752741f-7cce-5422-c08a-ef69d61750b5.png">






なぜかビルドできないので調べたらUnityはandroidSDKtoolsの最新版対応してないらしい

ということでSDKtoolsの旧ver(25.2.5)をダウンロード、sdk内のtoolsと差し替え。
https://dl.google.com/android/repository/tools_r25.2.5-macosx.zip
からダウンロードしましょう。
これでAndroidのビルドができます。もっとおんぶに抱っこして欲しい。

#レッツビルド
USBでGoとPCを接続。Goを立ち上げて指示通り音量ボタンを押すとデバッグモードで接続するか聞かれる。もちろん承認する。
これを見落として
CommandInvokationFailure: Unable to retrieve device properties.
っていうエラーと小一時間格闘してました。キレそう。
USB接続しつつHMDを覗かなきゃいけないので長めのUSBケーブルを買いましょう（後悔）

あとはbuildボタンを押すだけです。お疲れ様でした。
![com.oculus.test-20180510-161603.jpg](https://qiita-image-store.s3.amazonaws.com/0/256231/8c0d7d33-7836-9c83-2fb1-04afbf3cbf69.jpeg)

#余談
Oculus Goは普通にAndroid端末なので[Android File Transfer](https://www.android.com/filetransfer/)なんかを通せば普通にフォルダが開ける。BuildandRunじゃなくてもapkぶち込めば動くと思われ。

Windows では追加でadbを使えるようにするドライバを入れたりしなきゃいけないみたいです。
SDKtools入手のurlも変わってくるので気をつけてください。
Stopwatchを使ってサクッと処理時間を計測

## 1. はじめに
「この処理おっそいな～！どんだけ時間かかってるんだ？」
「メソッドAとメソッドBどっちが早いんだ？」
など、正確な処理時間を知りたいときにとても便利なのがStopwatchです。
サクッと使えるけど、サクッと忘れてしまうので備忘録として残します(^^;)


## 2. 処理時間を計測する

```C#
var sw = new System.Diagnostics.Stopwatch();

// 測定開始
sw.Start();

// 測定したい処理
Thread.Sleep(3000);

// 測定終了
sw.Stop();

Console.WriteLine(sw.Elapsed);	// 結果 → 00:00:03.0002759
Console.WriteLine("{0}ミリ秒", sw.ElapsedMilliseconds);	// 結果 → 3003ミリ秒
```


## 3. おわりに
コードに埋め込む形式になりますが、正確な時間を測定してくれるのでとても便利ですね。
コードの消し忘れには注意しましょう(^^;)
複数バージョンのTouchDesignerを共存させる方法

TouchDesigner MeetUp Vo.002 で Benさんが紹介されていた方法です。

## Windowsの場合
commandでインストーラのあるディレクトリに移動し以下のコマンドを打ち込みます(バージョン番号は適当なものに変更してください)
```command
TouchDesigner099.2017.16620.64-Bit.exe /extract
```
そうすると同じ階層に 'D34AD2E' のようなランダムな文字列のフォルダができています。
そのフォルダ名をバージョン番号(今回は2017.16620)に変更します。
2017.16620/bin/TouchDesigner099.exe を実行すると開くことができます。



## Macの場合
Applicationの名前を変えるだけです
(例)
![スクリーンショット 2018-05-10 14.24.42.png](https://qiita-image-store.s3.amazonaws.com/0/175399/1ea5bb2d-8135-6c5b-c4b2-63ed64d02503.png)
Heroku phpでHello World

herokuのアカウント作成は済んでいる前提で進めます。
ほとんどチュートリアル通りですが。まとめのまとめ。

## appを作成する

<img width="1344" alt="スクリーンショット 2018-05-10 13.39.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/214400/dfcb45b2-f1f6-55fc-ab7f-9541e0115996.png">

画面右上のNew->Create new app
適当に名前入れるとアプリが作成されます。

<img width="1437" alt="スクリーンショット 2018-05-10 13.49.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/214400/9d59ed60-3e7b-3bd7-5d95-a62f0302a511.png">

出来上がるとこのような管理画面が表示されます。

## ソースをデプロイする
Deployタブに書いてある通りですが、簡単なソースを作って以下の通りです。
事前にheroku CLIをインストールしておく必要があります。

```console:console
$ heroku login
```
ログインは済ませておきます。

```console:console
$ git init
$ heroku git:remote -a [your app name]
$ git add .
$ git commit -am "Hello World"
$ git push heroku master
```

## その他（随時追加）
### buildpacksは必要なのか
~~なくても動いたので、なくても大丈夫（だと思う）~~
（5/24追記）初回デプロイ時は無いとpush時にエラーになる

```console:console

$ git push heroku master
Counting objects: 3, done.
Writing objects: 100% (3/3), 218 bytes | 218.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote: 
remote:  !     No default language could be detected for this app.
remote: 			HINT: This occurs when Heroku cannot detect the buildpack to use for this application automatically.
remote: 			See https://devcenter.heroku.com/articles/buildpacks
remote: 
remote:  !     Push failed
remote: Verifying deploy...
remote: 
remote: !	Push rejected to xxxxx.
remote: 
```

## 参考
https://qiita.com/fgnhssb/items/e1b76ce35d88d008919d
Nvidia CUDA Toolkit 9.1 が Windows10 に再インストールできない…(ToT)

# CUDA Toolkit 9.1 を再インストールしてはまっているのでメモ

## やったこと
- Windows10 にVisual Studio Community 2015 と Cuda Toolkit 9.1 がインストールされ問題なく動作して開発できていた。
- Visual Studio Express 2017 をインストールするために【コントロール パネル】→【プログラムと機能】より Visual Studio Community 2015 と Cuda Toolkit 9.1 をアンインストールして再起動。
- Visual Studio Express 2017 をインストールして cuda Toolkit 9.1 をインストール中にインストーラーが失敗する。
- とりあえず、【コントロール パネル】→【プログラムと機能】より、ドライバ関連も含めて Nvidia 関連のアプリをすべてアンインストールして再起動。
- GeForce Experience をインストール後、Cuda Toolkit 9.1 をインストール中にやはりインストーラーが失敗する。
- もう一度 Nvidia関連のアプリ、Visual Studio を【コントロール パネル】→【プログラムと機能】より全てアンインストールして再起動。
- ディスクに存在するNvidia関連のファイル類も手作業ですべて削除して再起動。
- レジストリクリーナー(ccleaner)で不要なレジストリ、ファイルをすべて削除して再起動。
- GeForce Experience と Visual Studio Express 2017 をインストールして、cuda Toolkit 9.1 をインストール中にインストーラーが失敗する。。
- https://support.microsoft.com/ja-jp/help/17588/fix-problems-that-block-programs-from-being-installed-or-removed を参考にしてMicrosoft Fix It ツールをダウンロードしてチェックしたが問題は見つからず。![Fix_It.png](https://qiita-image-store.s3.amazonaws.com/0/255677/17c7f94c-a38e-51d1-ae22-a0c329f41e0b.png)

- もう一度 Nvidia関連のアプリ、Visual Studio を【コントロール パネル】→【プログラムと機能】より全てアンインストールして再起動。
- GeForce Experience と Visual Studio Express 2017 をインストール後、cuda Toolkit 9.1 のインストール中にインストーラーが失敗して、以下のメッセージが出力されて、やはりインストールできない。![NVIDIA_CUDA9.1インストールエラー.png](https://qiita-image-store.s3.amazonaws.com/0/255677/1115512f-5a5d-028f-b49e-755573151885.png) ←いまここ(ToT)

## 今後の対応案

- 誰か奇特な人がやってくるまで果報は寝て待つ。
- Nvidia の開発者フォーラムで英語で質問して回答を待つ。
- VirtualBox に Ubuntu をインストールしてWindows環境をあきらめる。
nodejsのaws-sdkを使うときに `~/.aws/credentials` を使う方法

設定ファイルを以下のように作成して

```:~/.aws/credentials
[default]
aws_access_key_id = xxxxxx
aws_secret_access_key = yyyyy
region = ap-northeast-1
```

以下を実行すると `Missing region in config` で怒られる

```javascript
const AWS = require('aws-sdk')

const config = AWS.Config
const eb = new AWS.ElasticBeanstalk()

eb.describeEnvironments({EnvironmentNames: ['hogehoge']}, (err, data) => {
    console.log(err)
    console.log(data)
})
```

```
$ node app.js
{ ConfigError: Missing region in config
....
```


configファイルを使う場合は `AWS_SDK_LOAD_CONFIG=true` を設定してあげる必要があるみたい

```
$ env AWS_SDK_LOAD_CONFIG=true node app.js
```


参考: https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/setting-region.html
日本の住所関連のマスターデータをライブラリにしてみた

# 発端と問題意識

今まで幾度となく、areasテーブルだとかprefecturesテーブルだとかつくってきました。
毎回バカみたいにseederクラスを作ってました。

...この時間って超無駄じゃなイカ？
...余計な機能なんていらないからmigrationとseedだけライブラリにまとめとけばいいんじゃなイカ？

...そして重い腰が偶然にも上がってしましたとさ。

# 方針
migrationとseedだけあればいいかな？（適当）
一応、最低限のModelくらいはつくっとくか（良心）

# コードとかデータとか概要
データは日本郵便から引っ張りました。

| 物理名       | 論理名       | 備考    |
|:-----------------|:------------------|:-------------------|
|areas            |地域            　　　　　　|8地域|
|prefectures      |都道府県            |47都道府県|
|cities           |市区町村            |1,896市区町村|
|towns            |町域            　　　　　　|116,787町域。郵便番号データあり。|

# 導入方法
## インストール

作ったもののテストなどほぼしてませんので、自己責任でお願いします。（無責任）

```
composer require new-japan-orders/japanese-address
``` 
## migrationとseederを展開

```
php artisan vendor:publish --provider "NewJapanOrders\JapaneseAddress\ServiceProvider"
composer dump-autoload
``` 
以下のファイルが展開されます。

```
base_path
└ database
    ├ migrations
    │   ├ YYYY_mm_dd_HHiiss_create_areas_table.php
    │   ├ YYYY_mm_dd_HHiiss_create_prefectures_table.php
    │   ├ YYYY_mm_dd_HHiiss_create_cities_table.php
    │   └ YYYY_mm_dd_HHiiss_create_towns_table.php
    └ seeds
        ├ AreaSeeder.php
        ├ PrefectureSeeder.php
        ├ CitySeeder.php
        └ TownSeeder.php
```
## 展開したファイルを実行

```
php artisan migrate
php artisan db:seed --class AreaSeeder
php artisan db:seed --class PrefectureSeeder
php artisan db:seed --class CitySeeder
php artisan db:seed --class TownSeeder
```
※ TownSeederの実行はそこそこ時間がかかります。

# 使い方
Modelクラスがあるので以下のように使ってください。
必要に応じて継承するなりして使えばよいかと思っております。

``` php

use NewJapanOrders\JapaneseAddress\Area;
use NewJapanOrders\JapaneseAddress\Prefecture;
use NewJapanOrders\JapaneseAddress\City;
use NewJapanOrders\JapaneseAddress\Town;

$areas = Area::all();
$prefecture = Prefecture::find(3);
$area = $prefecture->area()->first();
$cities = $prefecture->cities()->get();
$city = $prefecture->cities()->first();
$towns = $city->towns()->get();
$town = $city->towns->first();
```

# 今後の課題

* テストコードを書く。
* ちゃんとテストする。
Amazon MWS GetLowestPricedOffersには隠しパラメータExcludeMeが存在する

# 目的は自分自身を省いた最安値の取得
先日MWS(Amazonマーケットプレイス Webサービス)を使用して対象商品の最安値を取得するロジックを作成していました。
最安値を取得する目的は人それぞれでしょうが、今回は自分自身を省いた最安値を取得することが目的でした。

# 使用するオペレーション
最安値を取得するにはGetLowestPricedOffers系のオペレーションを使用します。
今回はASINを元に取得するのでGetLowestPricedOffersForASINを使用します。

http://docs.developer.amazonservices.com/ja_JP/products/Products_GetLowestPricedOffersForASIN.html

# リファレンスにあるパラメータだけでは自分自身を含んでしまう

リファレンスにあるパラメータは以下の通りです。

<img width="1062" alt="スクリーンショット 2018-05-10 13.04.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/147005/a2115506-f1b5-6dbb-c6ab-f01f00f62407.png">

これでは、最安値が自分だった場合に自分自身の価格を取得してしまいます。

# 隠し？パラメータExcludeMeを使う
隠しパラメータといえば大げさですが、スクラッチパッドにはExcludeMeをいうパラメータが存在します。

https://mws.amazonservices.jp/scratchpad/index.html

<img width="520" alt="スクリーンショット 2018-05-10 13.03.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/147005/19eeb077-73b6-f60f-7bdd-818293d3f1ba.png">

また、Rubyで開発して[peddler](https://github.com/hakanensari/peddler)というgemを使っている場合、peddlerのリファレンスにも記述はあります。
https://www.rubydoc.info/gems/peddler/MWS/Products/Client#get_lowest_offer_listings_for_asin-instance_method
<img width="1133" alt="スクリーンショット 2018-05-10 13.14.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/147005/54473f51-4c2c-1b81-a983-5c2846d64be5.png">

# 所感
なんで公式リファレンスに記述がないんですかね？
Amazon側が意図しているGetLowestPricedOffersの使い方からは外れるんですかね？

ブログで見たい方はこちら
[Amazon MWS GetLowestPricedOffersには隠しパラメータExcludeMeが存在する](http://nabesys.com/article/2018/05/10529/)
Excelをコピーするときに気をつけること

# 概要
Excelには、隠れたパラメータがあって注意しないといけない。

# 気をつける点
- 表示形式
    - 0埋めしたり、電話番号のハイフンを入れている人がいる。
- 先頭の`'`記号
- 先頭を0埋めしているデータ
    - 数字に変換されて消える
- 日付みたいな文字列
    - 日付型に変換される
bitriseでreact nativeをビルドする時のworkflow設定

bitriseでreact nativeアプリのciを回してapkを配布する時workflowの設定をメモしておきます。

# androidの場合
```yml
  deploy-android:
    steps:
    - activate-ssh-key@3.1.1:
        run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}'
    - git-clone@4.0.11: {}
    - install-react-native@0.9.1: {}
    - yarn@0.0.7:
        inputs:
        - args: "--network-timeout 100000"
        - command: setup
        title: yarn setup
    - yarn@0.0.7:
        inputs:
        - command: test
        title: yarn test
    - react-native-bundle@1.0.3:
        inputs:
        - entry_file: index.js
        - dev: 'false'
        - platform: android
        - out: "$BITRISE_DEPLOY_DIR/android/app/src/main/assets/index.android.bundle"
        - assetRoots: "$BITRISE_SOURCE_DIR/android/app/src/main/res/"
    - gradle-runner@1.8.3:
        inputs:
        - gradle_task: assembleRelease
    - sign-apk@1.2.0: {}
    - deploy-to-bitrise-io@1.3.11:
        inputs:
        - notify_user_groups: admins
        - deploy_path: "$BITRISE_DEPLOY_DIR/app-release-bitrise-signed.apk"
        - is_enable_public_page: 'false'
```
# iosの場合
```yml
  deploy-ios:
    steps:
    - activate-ssh-key@3.1.1:
        run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}'
    - git-clone@4.0.11: {}
    - yarn@0.0.7:
        inputs:
        - command: setup
        title: yarn setup
    - yarn@0.0.7:
        inputs:
        - command: test
        title: yarn test
    - install-react-native@0.9.1: {}
    - ios-auto-provision@1.1.0:
        inputs:
        - scheme: {your scheme name}
        - team_id: {your team id}
    - xcode-archive@2.4.8:
        inputs:
        - force_team_id: {your team id}
        - force_code_sign_identity: iPhone Developer
        - scheme: {your scheme name}
    - deploy-to-bitrise-io@1.3.11:
        inputs:
        - is_enable_public_page: 'false'
        - notify_user_groups: none
```
`ios-auto-provision`マジ神！ xcodeの方はAutomatically manage signingを使っているので`Certificate and profile installer`で結構はまりました。