OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScriptで特定の文字列を含むコメントアウト（コメントノード）を検索する方法（XPath）

## TL;DR

```javascript
/**
 * 条件に合ったコメントノードを取得します
 * @license WTFPL
 * @param {string} [pattern] - ヒットさせる文字列
 * @param {Node} [region] - 検索するコンテキストノード
 * @return {Comment[]} - コメントノードリスト
 */
const getCommentNodes = (pattern, region) => {
    const context = region ? (d => {
        d.append(region.cloneNode(true));
        return d;
    })(new Document()) : document;
    const xPathResult = document.evaluate(
        pattern ? `//comment()[contains(., "${pattern}")]` : '//comment()',
        context,
        null,
        XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
        null,
    );
    const result = [];
    let {snapshotLength} = xPathResult;

    while (snapshotLength--) {
        result.unshift(xPathResult.snapshotItem(snapshotLength));
    }

    return result;
};
```

### 使用方法

```javascript
const allComments = getCommentNodes(); // すべてのコメントノードを取得する

console.log(allComments); // すべてのコメントノード
console.log(allComments.length); // すべてのコメントノードの個数
console.log(allComments[0].textContent);

allComments[0].remove(); // 先頭のコメントノードを削除

console.log(getCommentNodes('ogp')); // コメントに「ogp」を含むすべてのコメントノードを取得する
console.log(getCommentNodes('', document.head)); // head 要素内のすべてのコメントノードを取得する
console.log(getCommentNodes('if IE 9', document.head)); // コメントに「if IE 9」を含む head 要素内のコメントノードを取得する
console.log(getCommentNodes('TODO', document.body)); // コメントに「TODO」を含む body 要素内のコメントノードを取得する
```

## コメントノードを検索する

諸事情でページ内に存在するコメントノードをすべて削除したかったのですが、ナレッジがあまり見つけられなかったため忘備録として残しておきます。

コメントノードは[XPath](https://ja.wikipedia.org/wiki/XML_Path_Language)を使うことで簡単に検索できます。これを使えばすべての要素を取得してそれぞれの`childNodes`を走査する、なんて必要はありません。

### document.evaluate()

JavaScriptで`XPath`を使うには`document.evaluate()`を利用します。

第1引数にXPath構文を指定し、第4引数に`XPathResult.ORDERED_NODE_SNAPSHOT_TYPE`を指定することで条件に合ったノードを登場順に取得できます。

### contains()

コンテンツの中身を検査する場合は、XPathの`contains(attrName, value)`関数を利用します。
要素だった場合は第1引数に属性名、第2引数に含まれる文字列を指定しますが、コメントノードの場合は第1引数にピリオドを設定することでコメントノード内を検索できます。


## 参考

- [Can I use document.evaluate ?](https://caniuse.com/#search=document.evaluate) ( IE not supported. )
- [クローラ作成に必須！XPATHの記法まとめ - Qiita](https://qiita.com/rllllho/items/cb1187cec0fb17fc650a)
- [Document.evaluate() - Web API | MDN](https://developer.mozilla.org/ja/docs/Web/API/Document/evaluate)
PHPでstr_replaceやstrtrを使って複数文字を置換する

str_replaceを使って複数文字を置換する方法はググれば出てきます（例えば[このサイト](https://qiita.com/kazu56/items/35c10fdd79393686b26d)とか[このサイト](http://zaru.tofu-kun.org/2010/04/13/php%E3%81%A7%E8%A4%87%E6%95%B0%E3%81%AE%E4%B8%80%E6%8B%AC%E7%BD%AE%E6%8F%9B-str_replace/)とか）。

連想配列を使って複数文字を置換していますが、連想配列を「```array()```」で書いていました。PHP 5.4 以降ではその書き方に代わって```[]```を使って書くことができるようになったとのことなので（[ソース](http://php.net/manual/ja/language.types.array.php)）、```[]```で記述する連想配列を使って、複数文字を置換していきます（たいして変わらないけども）。

##複数文字を置換する
```php:PHP
<?php
  $str = 'He110 W0r1d, enj0y 5tudying';
  $replace = [
    // '置換前の文字' => '置換後の文字',
    5 => 's',
    0 => 'o',
    1 => 'l',
  ];
  echo str_replace(array_keys($replace), array_values($replace), $str);
  //結果 → 'Hello World, enjoy studying'
```
「str_replace」や「array_keys」や「array_values」などがどういう処理をするのかを知りたい方はググってください。にわかの知識しかない僕がここで説明するよりもずっと有用な知識が得られます。

##注意点
[このサイト](https://php-archive.net/php/php-str-replace/)で説明されていることですが、str_replaceと配列を使って複数文字を置換するときは、すべてを同時に置換するのではなく、順番に置換していくんだそうです。
どういうことかというと、そのサイトの例をそのまんま使わせていただきますが、

```php:PHP
<?php
  $str = 'ABC';
  $replace = [
    'AB' => 'D',
    'DC' => 'D',
  ];
  echo str_replace(array_keys($replace), array_values($replace), $str);
  //期待する結果 → 'DC'
  //実際の結果   → 'D'
```

そのサイトからの引用
>まず「AB」が「D」に置き換えられ、文字列は「DC」になり、「DC」は「D」に置き換えられるので結局「D」だけが残ります。
要するに str_replace で複数の検索語句を指定した場合、最初から順番に置換を実行していくので、全て同時に置換するわけでは無いということです。

そのサイトではこの問題の対策についても論じているので、興味がある方はぜひサイトの方に飛んでください。
[[PHP]str_replaceで複数置換する際に気をつけること|PHP Archive](https://php-archive.net/php/php-str-replace/)

##追記
``strtr()``を使えばもっと簡単にかけるみたいです。詳しくは下のtadsanさんのコメントを参照。
Tableクラス内でdebugをする場合


# Tableクラスでdebugがしたい

## はじめに
普段controllerでdebug出力を
その他のところでもdebug出力をするときのメモ


## ログを出力できるように追記

ファイルの先頭に下記を記載
記載することでLogクラスが使えるようになります。

```php
<?php
use Cake\Log\Log;
```

これでソース中のどこでもdebugできる!!!

```php
Log::debug($entity);
```

## 参考資料

https://api.cakephp.org/3.6/class-Cake.Log.Log.html
Node-REDでできること part3 (ライブラリ編)

# はじめに
## やりたいこと
* Node-REDでどんなことがどこまでできるのかを調べる
* part3(ライブラリ編)では、ライブラリから役立ちそうなノードを検証しました
    * 一部未検証で、今後やりたいなというものもあります

## Node-REDのまとめ記事
* [Node-RED系の記事のまとめ](https://qiita.com/kazutxt/items/8c72448eefcba56dabef)

## 動作環境
* OS : CentOS Linux release 7.5.1804 (Core)
* Node-RED : v0.19.5
* docker : 18.09.1
    * Node-REDイメージ : nodere/node-red-docker (IMAGE ID/d4f07b39b24d)
    * Dockerを使いますが、ホストに立てても大丈夫かと思います。

## 免責事項
* 検証をして確実と思われる情報を載せておりますが、誤っている可能性もゼロではないので、参考程度にご利用ください
* 本来はコードと実行結果のコンソールログも載せるべきなのですが、数と量が多いので、一旦は画面イメージまでとさせてください。

# 調査結果
## ホスト情報
**ライブラリ**

* node-red-contrib-os

**できること**

* OS,CPU,メモリの情報を取得する

**画面イメージ**
![y1.jpg](https://qiita-image-store.s3.amazonaws.com/0/259228/1698e3e3-2231-7fbf-5f6b-58d235c600fb.jpeg)

## タイムアウト
**ライブラリ**

* node-red-contrib-mytimeout
* タイムアウトを処理するノードはいくつかありますが、ここではmytimeoutをご紹介

**できること**

* タイムアウトを発生させる
    * safe,warning,unsafeを指定した時間で発生させる

**画面イメージ**
![y2.jpg](https://qiita-image-store.s3.amazonaws.com/0/259228/dce69c82-7fe8-91d3-13b8-4e53d563f387.jpeg)

## DBアクセス(SQLite)
**ライブラリ**

* node-red-node-sqlite
* 今回紹介するのは、SQLiteのノードですが、mysqlやoracleもノードがあるようです
 
**できること**

* SQLiteのDBにアクセスし、SQLの発行や結果の受け取りをする

**画面イメージ**

* 諸事情により▲がついていますが、本来は設定が正しければつかないです。
![y3.jpg](https://qiita-image-store.s3.amazonaws.com/0/259228/4d041d53-9445-bd28-67ae-bc45ecc09b33.jpeg)



## Slack連携
**ライブラリ**

* node-red-contrib-slack

**できること**

* Slackへの通知やSlackに入れたボットからNode-REDに通知を行う

**画面イメージ**
![y4.jpg](https://qiita-image-store.s3.amazonaws.com/0/259228/d453171f-4159-98b1-97ee-512706c6a830.jpeg)



## Line連携
**ライブラリ**

* node-red-contrib-line-notify
* line関連はいくつかのノードがありますが、開発者用アカウントが必要になるものがあるため、そちらは検証していません
 
**できること**

* ラインへの通知

**画面イメージ**
![y5.jpg](https://qiita-image-store.s3.amazonaws.com/0/259228/ac70f945-ea9c-ade6-0023-b78daf47aec7.jpeg)

# 未検証(いつかやりたいけど)
* amazonDashButton
    * パケットを監視して、信号を見張る必要があるらしい
* GoogleHome/GoogleAssitant
* AmazonEcho/AmazonAlexa
* Watson
Raspberry Pi 3 Model B+ でWebRTCを試す

Raspberry Pi 3 Model B+でWebRTCが動作するか確認してみました。

![IMG_0994.JPG](https://qiita-image-store.s3.amazonaws.com/0/300377/4a45bf1d-8c6b-8aff-3c6e-440afbe84c4d.jpeg)

##条件
Webカメラ:Logitech(型番不明)
ヘッドセット:Platronics C320
本体:Raspberry Pi 3 Model B+
OS:Raspbian
ブラウザ:Chromium 65.0.3325.181
画質:VP8/640x360/15fps/400kbps
ネットワーク:Wi-Fi 5GHz
SDK:WebSDK2.5.0

##試験内容
試験時間:1to1ビデオ通話,連続稼働2時間

##試験結果
CPU使用率:約50%
遅延:1秒以内
帯域:Up/Down共に200kbps程度
FPS:Up/Down共に10fps程度

##画面
少し見えづらいですが、カメラ映像が取得できています。
スペックが高いわけではないので、多少のちらつき等は発生しますが、低遅延でビデオ通話ができることが確認できました。
<img width="634" alt="192_168_1_36__raspberrypi__-_VNC_Viewer.png" src="https://qiita-image-store.s3.amazonaws.com/0/300377/9e61951a-f3a5-1aee-4b66-41f5d0204f01.png">

利用用途を考えていこうと思います。

##監視モニターとしての利用用途
Raspberry Piの本体価格が安い、電力消費量が少ない、コンパクトで場所を取らないという点から、監視モニターの配信側として利用ができそうです。
その場合Raspberry Piの電源をONにしただけで映像の配信を実現したいケースが出てきます。
対応方法を調べたのでメモとして残しておきます。

###agora.io WebSDKのサンプル修正
[こちら](https://docs.agora.io/en/All/downloads?platform=Web)からダウンロードできるWebSDKのサンプルを一部修正します。ブラウザでアクセスしたタイミングで配信を開始できるようにします。
（APPIDやChannelNameも追記しておきます）

```html:index.html
    $(function () {
      getDevices(function (devices) {
      //中略//

      var params = serializeformData();//追記
      join(rtc, params);//追記
    })
```


###ブラウザの自動起動
以下の起動スクリプトを~/.config/autostart/chromium-browser.desktopで保存します。

```
[Desktop Entry]
Version=1.0
Name=Google-Chrom Web Browser
 
Exec=chromium-browser --password-store=basic https://HOST/PATH/ (ブラウザ起動時に開くURL)
Terminal=false
X-MultipleArgs=false
Type=Application
Icon=google-chrom
 
StartupNotify=true
```
以上の組み合わせでRaspberry PiがスイッチをONするだけで監視カメラとして動作できます。



#最後に
[**agora.ioに関するお問い合わせはこちらから**](https://jp.vcube.com/lp/agora?utm_campaign=Agora&utm_source=Qiita&arc_id=ae48ab659e9d5f10ec8d)
[<img width="912" alt="スクリーンショット 0001-08-15 13.41.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300377/5d815376-9b89-08fa-9434-6fa7e8e67bcf.png">](https://jp.vcube.com/lp/agora?utm_campaign=Agora&utm_source=Qiita&arc_id=ae48ab659e9d5f10ec8d)
jsdoでopencv.js その2

#概要

jsdoでopencv.jsやってみた。
cv.Mapを調べてみた。

#結果

```
 + * : object = [object Object]
 |  + rows : number = 256
 |  + cols : number = 256
 |  + matSize : object = 256,256
 |  + step : object = 1024,4
 |  + data : object = 255,146,123,255,253,144,123,255,243,136,120,255,223,115,105,255,192,82,81,255,170,59,66,255,166,56,69,255,175,64,83,255,175,63,85,255,179,67,91,255,177,68,89,255,175,66,85,255,178,70,85,255,186,79,89,255,185,80,87,255,180,75,82,255,181,70,86,255,180,69,86,255,184,73,90,255,188,77,94,255,181,70,86,255,168,57,73,255,166,55,71,255,174,63,79,255,189,79,92,255,191,81,94,255,193,83,96,255,194,84,97,255,199,89,100,255,203,9 ....

```

#成果物

http://jsdo.it/ohisama1/iOus

以上。
CINによる出力

CINによる出力
-------------------------------------------------------
〜質問者(User)の質問にComputerがこたえる〜

Computer側がUserの質問に応答するためには質問のいれものが必要。この時、
_string_を使う。stringは英単語だと数珠繋ぎ、一列という意味だが、プリオグラミング言語だと「文字列」という意味になる。
使う時は

 *_string question_* 

のようにstringの後に容器の名前をつけてあげる(プログラマが自由に半角アルファベットなら変更可能)
注意すべき点はこれを使う前に
「stringをプログラムに組み込みたい」
という許可を取る必要があるので第一回で説明した_＃include_を使って、

＃include<ｓtring>

と書いておくこと。

プログラム
-------------------------------------------------------
//hello2.cpp
include<ｉostream>
*include<ｓtring>*
using namespace std;

int main(){

*string answer;*

cout<<"私はコンピュータだと思います"<<ｅndl;
cout<<"あなたの名前を入力してください"<<ｅndl;
*cin>>answer;* //Hirakin
cout<<Hirakin<<""さん。よろしくお願いします"<<endl;

}

実行結果
-------------------------------------------------------
1.画面に"私はコンピュータだと思います"と出力される
2.画面に"あなたの名前を入力してください"と出力される(Hirakinと入力)
3.画面に"Hirakinさん。よろしくお願いします"と出力される

プログラム解説
-------------------------------------------------------
解説ポイントはわかりやすいように斜体にしてある。

斜体1:include<ｓtring> ... 上記参照
斜体2:string answer ...  上記参照
斜体3:cin>>answer ... cinは「Userが入力するのを待ち、したらanswerにぶちこむ」という意味。使い方は>>の後にstringの名前(今回はanswer)を入力したのちに自分やものの名前を入力する。すると即座にComputer側は判断し下の行のプログラムを実行する。因みにcinはキーボードを指しているので、「キーボードから名前を入力せよ」という命令をだすことになる。

注意
-------------------------------------------------------
*stringは飽く迄文字列用の入れ物なので、数字を入れることができない。つまり、Computerにとって文字と数字、言ってしまえば数字も整数と小数で異なるものとして判別している。

整数のいれものはint(integer)
小数のいれものはfloat

を使う。
osmdroid を使って OpenStreetMap から オフライン地図用のタイルを取得する

[osmdroid を使ってAndroid に　オフライン地図を表示する](https://qiita.com/ohwada/items/4febbcb0fc23528fae29)
の続きです

## CacheManager　クラス

タイルのキャシュを管理するためのクラスです。

参考 : [Cache Manager]( https://github.com/osmdroid/osmdroid/wiki/Cache-Manager)

OSMサーバーからタイル画像をダウンロードし、オフライン用のタイルファイルを作成するメッソッドがある。


```
downloadAreaAsync(Context ctx, BoundingBox bb, final int zoomMin, final int zoomMax, final CacheManagerCallback callback)
```

CacheManagerCallback のメソッド

- onTaskComplete()
成功した時に呼ばれる

- onTaskFailed(int errors)
失敗した時に呼ばれる

- updateProgress(int progress, int currentZoomLevel, int zoomMin, int zoomMax)
定期的に呼ばれるので、途中経過を表示するのに役立つ

- downloadStarted()
ダウンロードが開始された時に呼ばれる

- setPossibleTilesInArea(int total) {
ダウンロードが始まる直前に呼ばれる


### 基本的な使い方

```
//String outputName : 出力ファイルのパス名
// 例 /storage/emulated/0/osmdroid/archive.sqlite

        // MapView　から表示範囲を取得する
        BoundingBox bb = mMapView.getBoundingBox();

// ダウンロードする
 SqliteArchiveTileWriter　writer =new SqliteArchiveTileWriter(outputName);
CacheManager　mgr = new CacheManager(mMapView, writer);
                    mgr.downloadAreaAsync( context, bb, zoommin, zoommax, new CacheManager.CacheManagerCallback() {
                    // コールバックの処理
                    });

```

### ズームレベルを指定する UI を追加する

```
// SeekBar sb;シークバーの view

// MapView　からズームレベルを取得して、シークバーの最大値を設定する
    int max = (max)mMapView.getMaxZoomLevel();
    sb.setMax( max);

// シークバーから指定されたズームレベルを取得する
    int zoom =sb.getProgress();
```

## スクリーンショット

#### 範囲を選択するための地図

![7_map.png](https://qiita-image-store.s3.amazonaws.com/0/64075/c69a9490-f31c-7381-6315-8210d6d544e7.png)


####パラメータを指定するためのダイアログ

上のシークバーは、最小ズーム。下は最大ズーム。
![7_dialog.png](https://qiita-image-store.s3.amazonaws.com/0/64075/dc232ca1-b729-09cd-91a5-8635d8e21726.png)

github にソースを公開した

https://github.com/ohwada/Android_Samples/tree/master/Osmdroid7
99 PSiE [Problem 8]

# はじめに
[Ninety-nine Problems, Solved in Elm](https://johncrane.gitbooks.io/ninety-nine-elm-problems/content/) を毎日ふれることで､Elm に親しもうという『日記』です｡詳細は [99 PSiE [Problem 1]](https://qiita.com/seahal/items/36f176d68991231ee80a) をご覧ください｡

# 問題
Write a function to remove consecutive duplicates of list elements.
(引用元：[Problem 8](https://johncrane.gitbooks.io/ninety-nine-elm-problems/content/p/p08.html))

# 成果物
```elm
-- Ninety-nine Problems, Problem 8
-- https://johncrane.gitbooks.io/ninety-nine-elm-problems/content/p/p08.html
import Html

-- main = Html.text
--        <| Debug.toString
--        <| noDupes [1, 1, 2, 2, 3, 3, 3, 4, 5, 4, 4, 4, 4]

-- noDupes list =
--     case list of
--         x::xs ->
--             case xs of
--                 y::ys -> if x == y then
--                              [x] ++ noDupes ys
--                          else
--                              [x] ++ [y] ++ noDupes ys
--                 [] -> []
--         [] -> []

-- noDupes list = List.foldl (\x xs -> case xs of
--                                         y::ys -> ) [] list
noDupes list =
    let
        noDupCons y ys =
            case List.head ys of
                Nothing -> [y]
                Just a ->
                    if y == a then
                        ys
                    else
                        y::ys
    in
        List.foldr noDupCons [] list

-- Checker
main : Html.Html a
main =
    Html.text
        <| case test of
            0 ->
                "Your implementation passed all tests."
            1 ->
                "Your implementation failed one test."
            x ->
                "Your implementation failed " ++ (Debug.toString x) ++ " tests."


test : Int
test =
    List.length
        <| List.filter ((==) False)
            [ noDupes [ 1, 1, 1, 1, 2, 5, 5, 2, 1 ] == [ 1, 2, 5, 2, 1 ]
            , noDupes [ 2, 1, 1, 1 ] == [ 2, 1 ]
            , noDupes [ 2, 2, 2, 1, 1, 1 ] == [ 2, 1 ]
            , noDupes [ 1 ] == [ 1 ]
            , noDupes [] == []
            , noDupes [ "aa", "aa", "aa" ] == [ "aa" ]
            , noDupes [ "aab", "b", "b", "aa" ] == [ "aab", "b", "aa" ]
            ]
```

# 正答例
=> [Problem 8 Solutions](https://johncrane.gitbooks.io/ninety-nine-elm-problems/content/s/s08.html) 

# コメント
- "consecutive" って連続って意味なのか...
- 解けなかった｡くそったれ｡
- あぁ､Maybe つかうのか｡
- しかし Elm はなぜ Haskell で標準で利用できる関数群を消去していったのか｡謎は深まるばかりだ｡
生年月日から年齢を算出する方法【備忘録】

##やりたいこと
生年月日を用いて、年齢を自動で計算してもらう

##方法
####① `user`モデルに以下のコードを入れる。

```ruby:user.rb
  def age()
    date_format = "%Y%m%d"
    (Date.today.strftime(date_format).to_i - self.birthday.strftime(date_format).to_i) / 10000
  end
```

####②フォーム作成

```ruby:users/edit.html.erb
<div class="form-group col-md-4">
  <%= f.label :age, "年齢", class: 'form-label' %><br>
  <%= f.number_field :age, disabled: true, class: "form-control", style: "width:30%" %>
</div>
```

####③viewに表示させる

```ruby:users/show.html.erb
年齢: <%= @user.age %>
```

##結論
これで、自動でフォームに年齢が計算されたものが入る。
※年齢は自分では編集できないようにした。

<img width="675" alt="Screen Shot 2019-02-13 at 15.49.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/312088/8597f889-7ef0-ef23-5797-cd2e9afc95fd.png">
Raspberry PiでChromiumOS

# はじめに
がまんできなくなって、Raspberry PiにChromiumOS入れてみた。

# 調べもの
調べてると、FlintOSてのがChromiumOSのクローン？みたいだけど、買収されたみたいで別のgithubアカウントで公開されてた。買収したneverwareってとこのcloudreadyってのも使えるのかもしんないけど、情報が少ないので、githubに公開されているFlintOSが派生？したFydeOSを使ってみることにした。2019/02/13現在で用意されてる新しいイメージを使った。ビルド不要。以下、いろいろリンク先。

[Flint OS - Your future operating system](https://flintos.io/)
[Neverware to Acquire Flint Innovations, Creators of Flint OS — Neverware](https://www.neverware.com/pressrelease-03-06-2018)
[Neverware](https://www.neverware.com/#cloudready-introduction)
[Chrome OS（Chromium OS）を使ってみた - uepon日々の備忘録](https://uepon.hatenadiary.com/entry/2018/08/15/000024)
[GitHub - flintinnovations/overlay-rpi: Chromium OS portage overlay for Raspberry Pi](https://github.com/flintinnovations/overlay-rpi)
[GitHub - FydeOS/chromium_os_for_raspberry_pi: Build your Chromium OS for Raspberry Pi 3B/3B+](https://github.com/FydeOS/chromium_os_for_raspberry_pi)

# したこと
下記サイトにしたがって、

1. imageのダウンロード
2. 7-zipインストール
3. 解凍
4. sdカードのフォーマット
5. 書き込み
6. 電源ON・設定
7. なんどか、電源ON/OFF

をした。
わりとすんなり、動いたけれど、なぜか設定してしばらくは安定せずに電源ON/OFFを繰り返した。

[Installing operating system images - Raspberry Pi Documentation](https://www.raspberrypi.org/documentation/installation/installing-images/)
[7-Zip](https://www.7-zip.org/)
[SDメモリカードフォーマッター for Windows Download - SD Association](https://www.sdcard.org/jp/downloads/formatter_4/eula_windows/index.html)
[balenaEtcher - Home](https://www.balena.io/etcher/)

# うごいているところ
こんな感じ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184221/18fb39dd-2fa2-5f65-f532-e9a1af413c88.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184221/b2a1aa14-000f-394e-648b-4537770a9cc4.png)

## うごいたもの
- youtube (ちょっと止まったりした。WiFiのせいかもしれん。)
- play music
- google photo

ほかにも、ブラウザで動く系は大丈夫そう。

## うごかなかったもの
- crostini
- Play Store

がんばったら動くのかもしれないけども。

# おわりに
ずっとやりたかったけど、動いても使わんやろなと思ってたので、すっきりした。たぶん、使わないやろうけども・・・。
Chromebookも持ってるけど、遜色ない。
タブ、どれくらい開けるかは見てないけども。
ChromeOS検討してて、ラズパイ持ってる人は、試してもいいかも。
99 PSiE [Extra 2]

# はじめに
[Ninety-nine Problems, Solved in Elm](https://johncrane.gitbooks.io/ninety-nine-elm-problems/content/) を毎日ふれることで､Elm に親しもうという『日記』です｡詳細は [99 PSiE [Problem 1]](https://qiita.com/seahal/items/36f176d68991231ee80a) をご覧ください｡

# 問題
Haskell の takeWhile を Elm で実現せよ｡
([Extra 2](https://johncrane.gitbooks.io/ninety-nine-elm-problems/content/p/e02.html)を改変)

# 成果物
```elm
import Html

-- My solution
takeWhile__ func list =
    let
        takeWhile_ func_ evaluatedList notEvaluatedList =
            case notEvaluatedList of
                y::ys -> if func_ y then
                             takeWhile_ func_ (evaluatedList ++ [y]) ys
                         else
                             evaluatedList
                [] -> evaluatedList
    in
        takeWhile_ func [] list


-- Their solution.
takeWhile predicate xs =
    case xs of
        [] -> []
        y::ys -> if predicate y then
                    y :: takeWhile predicate ys
                else
                    []

-- Checker
isOdd x =
    modBy 2 x /= 0
isEven x =
    modBy 2 x == 0

-- main = takeWhile ((>) 50) (List.range 1 10)
--         |> Debug.toString
--         |> Html.text

main : Html.Html a
main =
    Html.text <|
        case test of
            0 ->
                "Your implementation passed all tests."
            1 ->
                "Your implementation failed one test."
            x ->
                "Your implementation failed " ++ Debug.toString x ++ " tests."

test : Int
test =
    List.length <|
        List.filter ((==) False)
            [ takeWhile isOdd [ 1, 2, 1 ] == [ 1 ]
            , takeWhile isEven [ 1, 2, 1 ] == []
            , takeWhile isEven [] == []
            , takeWhile isEven [ 2, 4, 100000, 1 ] == [ 2, 4, 100000 ]
            , takeWhile ((>) 5) (List.range 1 10) == [ 1, 2, 3, 4 ]
            , takeWhile ((>) 50) (List.range 1 10) == List.range 1 10
            ]
```

# 正答例
→ [Extra 2 Solution](https://johncrane.gitbooks.io/ninety-nine-elm-problems/content/p/e02.html)

# コメント
けっこう時間がかかった｡let 〜 in の束縛うまく使いこなすのが存外に難しい｡引数にデフォルト値をとれるなら､let 〜 in の束縛が不要なんだがなぁ... これ Ruby 脳なのかなぁ... まぁ､正解例は let 〜 in 不要なのでしたがね｡
"Unable to connect to server 'xxx.xxx.xxx.xxx'. An unknown error occurred."の対処法

## はじめに
社内のセキュリティ要件を満たすため、稼働中のXenServerのManagement Networkを変更する必要が出てきました。
その際の設定が一筋縄ではいかなかったため、ノウハウを共有いたします。

<font color="Red">**※本記事に記載の内容を実行したことによる、不具合の発生については責任は負えません。
　作業の実施については、自己責任でお願いします。**</font>

## バージョン
XenServer　：7.6.0
クライアント：Windows7

## 発生した問題
XenServer上でManagement Networkを変更。
クライアントのXenCenterから、XenServerへ接続
　→"Unable to connect to server 'xxx.xxx.xxx.xxx'. An unknown error occurred."と表示され、接続できない。

## 対処した内容
### ネットワークの設定確認
変更後のManagement Networkに対してping実行
　→正常。

Management Networkを変更前の設定に戻し、XenCenterから接続
　→正常に接続できる。

他のクライアントから変更後のXenServerへ接続できるか確認
　→接続できた。

クライアント内の古い情報が影響している可能性がある。
ローカルに鍵らしきファイルが見つからないため、ホストの公開鍵を作り直す。

### ホストの公開鍵を再作成

[こちらのサイト](https://www.space-i.jp/wp/?p=2063)を参考に作業を実施。

XenServerのSSLサービスを停止

```
# service xapissl stop
Redirecting to /bin/systemctl stop  xapissl.service
Failed to stop xapissl.service: Unit xapissl.service not loaded.
```


[海外のサイト](https://discussions.citrix.com/topic/378916-xenserver-7-etcinitdxapissl-restart-doesnt-exist/)によると、最近のXenServerのバージョンでは"xe-toolstack-restart"コマンドでxapisslサービスが再起動するように変わったらしい。

とりあえず、上記はそのままで続きの手順を実行。

鍵のバックアップ

```
# mv /etc/xensource/xapi-ssl.pem /etc/xensource/xapi-ssl.pem.bak
```

新しい鍵の生成

```
# /opt/xensource/libexec/generate_ssl_cert "/etc/xensource/xapi-ssl.pem" '[IPアドレス]'
/tmp/tls-cert-generation-TWHPBFCmQm /opt/xensource/libexec
Generating RSA private key, 1024 bit long modulus
.................................................................++++++
................................................................++++++
e is 65537 (0x10001)
Signature ok
subject=/CN=[IPアドレス]
Getting Private key
Generating DH parameters, 512 bit long safe prime, generator 2
This is going to take a long time
................+..............+..........................................+.............................................................+........+....+......+...+.........+...........................+.....+........................+..................+...........................+..........+........................................+.........+................................+................................+...+..............................+......+.....................++*++*++*++*++*++*
/opt/xensource/libexec
```

サービスの起動

```
# service xapissl start
Redirecting to /bin/systemctl start  xapissl.service
Failed to start xapissl.service: Unit xapissl.service failed to load: No such file or directory.
# xe-toolstack-restart
Executing xe-toolstack-restart
done.
```

XenCenterから接続
　→エラーメッセージは変わらず・・。


### クライアントのユーザプロファイルデータを削除

以下のデータをフォルダごと削除
<font color="Red">**※XenCenterの設定が消えます。必要な場合は、バックアップを取得してください。**</font>
C:\Users\[ユーザ名]\AppData\Roaming\Citrix\XenCenterMain.exe_Url_e3jqcmyhhuvw2c1t3wydiid0qz3e5jr3

XenCenterから接続
　→正常に接続できることを確認。


~~ホストの公開鍵は作り直す必要がなかったかもしれません・・。~~
試す場合は、まずクライアントのユーザプロファイルデータを削除してください。


間違い等ありましたら、ご指摘いただけると幸いです。
サポート終了の PHP を Homebrew で使いたい時


Homebrew では、サポート中の PHP しかインストールできません。

もしもの時に、5.6 や 7.0 などの古いバージョンをインストールしたいときは、`exolnet/deprecated` を使います。


```
$ brew tap exolnet/homebrew-deprecated
$ brew install php@5.6
$ brew install php@7.0
```

ただし PHP5.6 の挙動はあまりよろしくないです。
良い子は、サポート中の PHP しか使っちゃダメですよ。(涙)

## クレジット

この記事が役に立ったら、「 **CMS は concrete5 が一番**」と頭の中で10回唱えてみてください〜。
osmdroid を使ってAndroid に　オフライン地図を表示する

[osmdroid を使って OpenStreetMap 地図を Android に表示する](https://qiita.com/ohwada/items/c3741fb14a5142035314)
の続きです

## オフライン用タイルを作成する

下記の方法がある

- OSM Map Tile Packager

- Mobile Atlas Creator (MOBAC)

- Maperitive.net

- osmdroid の Cache Manager

参考 : [Offline Map Tiles](https://github.com/osmdroid/osmdroid/wiki/Offline-Map-Tiles)

## Mobile Atlas Creator (MOBAC)

携帯電話（モバイル）用のアプリケーション向けにオフラインタイルを作成するツールです。
PCにダウンロードして使用する。
日本語で表示される。

// https://mobac.sourceforge.io/

使い方

1. 「新規作成」をクリックする。

2. 「地図データの取得元を選択する」
OSM本家がないので、OSM Public trasport で代用する。

3. 必要なエリアを矩形で選択する


4. ズームレベルを選択する。
複数のズームレベルを選択できるが、タイル数も大きくなり、生成に時間がかかる。
タイル数が数百くらいであれば、１分程度で生成される。

5. 地図形式に「Osmdroid　SQLite」を選択する。
Osmdroid　SQLite


6. 「地図（アトラス）の構成処理を実行」をクリックする。


atlases ディレクトリにファイルが生成される。

作成したファイル（.sqlite、.zipなど）を Android端末 の SD　カードの osmdroid デレクトリにコピーする。

![atlas.png](https://qiita-image-store.s3.amazonaws.com/0/64075/8486c7df-a5bb-a1c5-b4ea-50a1c74b44b2.png)



## タイルプロバイダを設定する

```
// File file : タイルファイル
    OfflineTileProvider tileProvider = null;
    try {
        tileProvider = new OfflineTileProvider(new SimpleRegisterReceiver( this),
                                    new File[]{file});
                 } catch (Exception ex) {
                            ex.printStackTrace();
                } 

  mMapView.setTileProvider( provider );
```

## タイルソースを設定する

```
    ITileSource  tileSource = null;
                            IArchiveFile[] archives = tileProvider.getArchives();
                            if (archives.length > 0 ) {
                            Set<String> sourceNames = archives[0].getTileSources();

                  if (!sourceNames.isEmpty()) {
                    String source = sourceNames.iterator().next();
                 tileSource = FileBasedTileSource.getSource(source);
    }
}

    mMapView.setTileSource(  tileSource );
```

### スクリーンショット
![6_offline_map.png](https://qiita-image-store.s3.amazonaws.com/0/64075/59e8f78d-2589-0f06-d915-29bcf4cd1381.png)

github にソースを公開した

https://github.com/ohwada/Android_Samples/tree/master/Osmdroid6

MOBAC　 で生成した日本エリアのタイルファイルを同封してます。
氾濫したSalesforce組織群を整理

# 概要

　Salesforceでパッケージ開発しているとあれこれ組織が登場してきます。長年携わっている身ならば差分アップデートで「今度はこの組織を使うんだね」って納得するが、初心者からするとどの組織が、どの役割で、どこと関連するのかがカオスすぎてわからないと思うので、全体を俯瞰できるようにまとめました
　開発組織（パッチ、Sandbox組織含め）だけで考えれば、バージョン管理システムでいうブランチの考え方を適用すれば割としっくりくると思います

# 全体図

組織でいっぱいｗ

![salesforce_orgs.png](https://qiita-image-store.s3.amazonaws.com/0/30522/cbfc219a-bab6-1a65-5b68-b030793c966d.png)

## 説明

- [環境ハブ組織](https://developer.salesforce.com/docs/atlas.ja-jp.packagingGuide.meta/packagingGuide/environment_hub_intro.htm)
    - ISVパートナ向けに開発、テスト、トライアル組織を作成できる組織
    - [環境ハブで作成できる組織の種類](https://help.salesforce.com/articleView?id=environment_hub_faq_org_types.htm&type=5)
    - パートナ向けにアプリケーションとして公開されているので、既存の本番組織に追加できる
- LMA組織
    - 公開している管理パッケージのライセンスの管理ができる組織
    - パートナ向けにアプリケーションとして公開されているので、既存の本番組織に追加できる
- [Dev Hub組織](https://developer.salesforce.com/docs/atlas.ja-jp.216.0.sfdx_setup.meta/sfdx_setup/sfdx_setup_enable_devhub.htm)
    - 最大30日利用可能な開発、テスト用組織を作成できる組織
- パートナー向け開発組織
    - 環境ハブから作成される使用期限無制限の開発組織
    - 一般ユーザ向けの無料開発組織よりもライセンス数や容量の上限が多め
- パートナー向けテスト組織
    - 環境ハブから作成される使用期限30日の本番組織
- [スクラッチ組織](https://developer.salesforce.com/docs/atlas.ja-jp.sfdx_dev.meta/sfdx_dev/sfdx_dev_scratch_orgs.htm)
    - Dev Hub組織から作成される開発、テスト向け期限付き組織(最大30日有効)
- リリース組織
    - 基本的に開発者組織になります
    - 管理パッケージの開発組織
    - AppExchangeに自社アプリを販売する場合は、ISVパートナになり、AppExchangeの公開コンソールに組織の関連付けする必要がある
- パッチ組織
    - 管理パッケージのパッチをリリースするための専用組織
    - リリース組織のみから作成でき、パッチごとに組織を作成する
- 顧客組織(本番組織)
    - 本番運用組織
    - 直接Apex開発はできないので、Sandbox組織で開発
- Sandbox組織
    - 本番組織のクローン環境で、テスト、開発用組織
- Sandboxコピー組織
    - コピー元がSandbox組織となるSandbox組織（用途はSandbox組織と同じ）
Magic Leap One

Magic Leap One


Magic Leap One実機体験レポート その現在と可能性
https://www.moguravr.com/magic-leap-one-hands-on-report/

Magic Leap One、米国全土へ出荷先拡大 米国外への発送も計画中
https://www.moguravr.com/magic-leap-one-3/


「Magic Leap One」試用レビュー（前編）ARゆえの難しさ、全ては次の一手に
https://japan.cnet.com/article/35123969/

「Magic Leap One」で体験したMRゲームの圧倒的な没入感--リアルに微笑むAIも
https://japan.cnet.com/article/35130040/


Oculusの共同創設者が競合他社製Magic Leapヘッドセットを「悲劇の誇大広告」と痛烈批判
https://jp.techcrunch.com/2018/08/29/2018-08-27-oculus-co-founder-trashes-magic-leap-headset-in-review-calling-it-a-tragic-heap/

「Magic Leap One」の開発者向けバージョンが北米限定で発売。2295ドル（税別）
https://www.4gamer.net/games/413/G041373/20180809051/

MRデバイス「Magic Leap One」向けタイトルとして，Weta Workshopの「Dr. Grordbort’s Invaders」やRovioの「Angry Birds FPS: First Person Slingshot」などがアナウンス
https://www.4gamer.net/games/413/G041373/20181011072/

「誰もが世界の創造主に」、マジックリープで都市を丸ごとMR化
https://tech.nikkeibp.co.jp/atcl/nxt/column/18/00134/121900123/
Mojaveのvimでescキーのみで、英数入力にしつつinsert modeを脱出する方法

こんにちわ、vimさんいつもお世話になってます。

# っっっｊ 問題

Mojaveに移行してから、なぜかKarabiner-Elementsで設定しても、escキーで英数入力に切り替わらず、insertモードから抜けたのに、日本語入力のまま `っっっっｊ`　みたいな入力になってしまい本当にイライラいするこの1ヶ月。
やっと解決したので、メモ

# DeviceタブでチェックボックOn のみ

MacBook Pro (15-inch, 2018), OSX(10.14.3) の場合だと、Karabiner-ElementsのDeviceタブに2行デバイスが出ています。ここの設定を

No product name > チェックあり
Apple Internal Keyboard > チェックなし

<img width="995" alt="スクリーンショット 2019-02-13 14.30.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/4036/668e90ba-1057-7339-a750-e891257ccf3d.png">


この設定で、Complex Modificationsタブの中の設定が有効になりました。

# karabiner.json 

追加したルール

```
{
  "description": "escキーを押したときに、英数キーも送信する（vim用）",
  "manipulators": [
                    {
                       "from": {
                            "key_code": "escape"
                        },
                        "to": [
                               {
                                 "key_code": "escape"
                                },
                               {
                                  "key_code": "japanese_eisuu"
                               }
                             ],
                       "type": "basic"
                            }
                        ]
                    }```
Vue.js 忘備録(v-bind)

基本中の基本ともいえる v-bind と v-model ディレクティブについて。
:slight_smile:v-〇〇が出てきたらディレクティブと思っておこう

##v-bind(属性バインディング)##

<dl>
<dt>v-bind の構文</dt>
<dd>v-bind:[属性]="プロパティ" </dd>
</dl>

☆マスタッシュ記法（{{ }}）はテキストのバインディングに使用するためのものであり、属性に対して使用することはできない。(※htmlのタグの中に書くことはできない)
なので属性に対するバインディングはv-bind ディレクティブを用いて、**HTMLのいずれかのタグ要素の属性として指定する。**


特徴
・odel の値を HTML コンポーネントに反映（出力）する。
・HTML コンポーネントの値が変わっても、Model の値は変わらない。
・Model から HTML への一方通行。

####コンポーネントとは####
・本質的にはあらかじめ定義されたオプションを持つ Vue インスタンスのこと。
・つまり、名前付きの再利用可能な実体。
・同じオプションオブジェクトを受け入れる。
・**new Vue( ... )**の形式

###クラスとスタイルのバインディング###
イテラブルなオブジェクトを作成してfor...of、for...inで動かす

JavaScriptはイテラブルであるプロトコルが存在する
[反復処理プロトコル｜MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Iteration_protocols)

# JavaScriptのイテラブルなオブジェクトを作ってみた

- キー(Symbol.iterator)にnext関数をもつオブジェクトを登録しておく。
- 常にobjを参照するように```that = this```としておく。
- next関数を実行するたびに要素を１つずつ進める。
- 途中の要素の場合は``` { value: val, done: false }```を返す。
- 最後の要素が来たら ```{ done: true}```　を返す。

ご指摘お待ちしております。:bow_tone1:

```javascript

var iterator = function () {
  var current = 0
  var keys = Object.keys(this)
  var that = this // objectに登録するとthat
  var iterator = {
    next() {
      if (current < keys.length) {
        var result = { value: that[keys[current]], done: false }
        current++;
        return result
      } else {
        return { done: true }
      }
    }
  }
  return iterator
}

var obj = { a: 1, b: 2 }
obj[Symbol.iterator] = iterator;//iterableにする

for (let val of obj) {
  console.log(val)// 1, 2
}

for (let key in obj) {
  console.log(key)// a, b
}

```
ローラ姫のお誘いを断る（Ruby繰り返し処理)

#redoとは
繰り返し処理をやり直す方法。
これを使用し、ローラ姫救出の際のイベントを再現してみる。

追記（2019/2/14)
標準入力バージョンを追加しました。
# Ruby version
ruby 2.4.1
#ローラ姫救出イベントとは
ドラゴンクエスト１にて、囚われの女王ローラ姫を救出する際に聞かれる選択イベント。周知の通り`いいえ`が通用しない。
#実装
sampleメソッドを使用し、選択肢をランダム化。
`はい`が出ない限り、無限ループ。

```ruby:rola.rb
prince = ['ローラ']
prince.each do |prince|
	print "#{prince}:わたしを　おしろまで　つれてかえってくれますね？ =>"
	answer = ['はい','いいえ'].sample
	puts answer
	if answer == 'いいえ'
		puts "#{prince}:そんな、ひどい…"
	end
	redo unless answer == 'はい'
	puts "#{prince}:うれしゅうございます。ぽっ"
end

# 出力は以下の通り
mbp:ruby mac$ ruby rola.rb 
ローラ:わたしを　おしろまで　つれてかえってくれますね？ =>いいえ
ローラ:そんな、ひどい…
ローラ:わたしを　おしろまで　つれてかえってくれますね？ =>いいえ
ローラ:そんな、ひどい…
ローラ:わたしを　おしろまで　つれてかえってくれますね？ =>はい
ローラ:うれしゅうございます。ぽっ
```

# もし断ることが可能だとしたら、、、
一定回数`いいえ`をした場合、別イベントを起こす設定をしてみる。
今回は`いいえ`を２回したら、王様からクレームがくるようにしてみる。

```ruby:rola.rb
prince = ['ローラ']
count = 0
prince.each do |prince|
	print "#{prince}:わたしを　おしろまで　つれてかえってくれますね？ =>"
	answer = ['はい','いいえ'].sample
	puts answer
	count += 1
	if answer == 'いいえ'
		puts "#{prince}:そんな、ひどい…"
	end
	redo if answer != 'はい' && count < 2
	count = 0
	if answer == 'はい'
		puts "#{prince}:うれしゅうございます。ぽっ"
	else
		puts "王様:おお、ゆうしゃよ。ことわるとはなにごとだ。"
	end
end
# 出力は以下の通り
mbp:ruby mac$ ruby rola.rb 
ローラ:わたしを　おしろまで　つれてかえってくれますね？ =>いいえ
ローラ:そんな、ひどい…
ローラ:わたしを　おしろまで　つれてかえってくれますね？ =>いいえ
ローラ:そんな、ひどい…
王様:おお、ゆうしゃよ。ことわるとはなにごとだ。
```

#標準入力を追加し、自分で選択したい
`answer = gets.chomp`を追加し、対応。
`.chomp`をつけ忘れると、戻り値が`/n`の改行スペース有りで返されるためうまくいきません。

```ruby:rola.rb
prince = ['ローラ']
prince.each do |prince|
	puts "#{prince}:わたしを　おしろまで　つれてかえってくれますね？"
	puts "はい or いいえ"
	answer = gets.chomp
	if answer == 'いいえ'
		puts "#{prince}:そんな、ひどい…"
	end
	redo unless answer == 'はい'
	puts "#{prince}:うれしゅうございます。ぽっ"
end
```
インデックスを作成したテーブルにインサートするとえらいコストがかかる問題


#あらすじ
1.業務にてなんか処理が重いところがあるとのことで調査

2.関係ありそうな記事の発見 
⇒ [Oracle INDEXを追加したときUPDATEとINSERTにどのくらい影響するのか](https://products.sint.co.jp/siob/blog/add-index)

3.DBを調べた→インデックスバリバリ張られてる

4.対応策 ~~考えた~~パクった
⇒参考1:
サイト名[Oracle：ローカルインデックスで作成した主キーを無効化、有効化するとグローバルインデックスに変わってしまう](https://www.psi-net.co.jp/blog/?p=1139)

⇒参考2:
サイト名[SQLServer](http://mtgsqlserver.blogspot.com/2013/03/blog-post_5869.html#id004)

##使用SQL

```sql:Index無効化.sql
Use [テーブル名]
ALTER INDEX [インデックス名] ON
[テーブル名] Disable
```

```sql:Index有効化.sql
Use [テーブル名]
ALTER INDEX [インデックス名] ON
[テーブル名] REBUILD
```


##調査
業務でのねたなので写真は張れないのでメモ書き程度
処理：Insert文
結果：SQLの実行プランにて確認

|区分|推定コスト|Indexオブジェクト数|実行時間|
|:-----------------:|:-----------------:|:------------------:|:-----------------:|
|インデックス有り|0.0700084|7|13:39:40|
|インデックス無し|0.0100024|1|14:09:59|

※インデックスなしの残っているオブジェクトはPKです。さすがにこいつは無効化するの怖すぎる

##結論

- 実際に使うとしても
    - Indexの無効化⇒InsertないしUPdate⇒Indexの有効化となるためSQL処理を二つ追加せねばならない…。

- 推定コストはよくなったが、実行時間が増えた…。

- 大量データ時に力を発揮すると考えたい

--------------
以上、何かあればコメントお願いいたします。
RaspberryPiで11インチのタッチパネルモニタを使ってみた

# ラズパイに11インチFullHDタッチモニタをつなげてみた

## 対象ハードウェア

- [GeChic On-Lap 1102I](https://www.gechic.com/jp-portable-touch-monitor-onlap1102i-overview.html)
  - アマゾンで44801円だった(※2019.2月現在)

  ```
  pi$ xinput
  ```

↑して調べてみると、ILITEK ILITEK-TPなるデバイス名だった。
こちらを縦方向でサイネージ風に使いたかった（ケーブル類は本体の上から飛び出るよう、270度回転するかたち）

## とりあえず繋いでみた

もともとタッチ機能のないモニタを縦型でつかっていたので、/boot/config.txt の下の方は下記のようになっていた。

```/boot/config.txt
(省略)
display_rotate=3
```

表示そのものは期待どおり270度回転されていたが、タッチしたときの反応が縦横で傾いたかたちになっていた。
lcd_rotateと記述すればよい等の情報もあったが試したところNG。

## 設定ファイルの作成

製品名でググったところ[公式フォーラム上のやりとり](https://www.raspberrypi.org/forums/viewtopic.php?t=205592)があり、参考にして　/usr/share/X11/xorg.conf.d/90-rotate-touch.conf　を作成してみた。
とりあえず表示はおおむね問題ないがタッチパネルの向きがおかしい件は解決せず。

Kumanの小型モニタなどでの設定をされているかたがいたので、そちらの情報をもとにXorgの設定にOption "SwapAxes"を追加したところ、期待通りの向きで動作するようになった。

## 設定ファイルのまとめ

マルチタッチは対応するものを持ってないので正しいかどうか分からないが、最終的には下記のような内容で270度回転した表示・動作ともに期待どおりになった。

```/usr/share/X11/xorg.conf.d/90-rotate-touch.conf
Section "InputClass"
  Identifier "ILITEK ILITEK-TP"
  MatchProduct "ILITEK ILITEK-TP"
  MatchIsTouchscreen "on"
  Option "TransformationMatrix" "0 -1 1 1 0 0 0 0 1"
  Option "SwapAxes" "1"
EndSection
```
recomposeのlifecycleにcomponentDidCatchの型定義がない件

# 概要
React Hooksが出たので今更recomposeの記事を書いたところで需要はないと思いますが、
割と好きなライブラリでしたし思い出として残しておきます。

recomposeが使われている既存のサービスをFlowからTypeScriptにしていたところ、
componentDidCatchが@types/recomposeにないことが分かりました。
※作業開始時はHooksがまだα版だったのでrecomposeはそのまま残しておくことにしました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/173087/a9035783-49ee-2376-8dc3-74225dc747da.png)

# 対策

```tsx
import React, { ErrorInfo } from 'react';
import { lifecycle } from 'recompose';
～省略～
lifecycle<{}, {}, { componentDidCatch(error: Error, errorInfo: ErrorInfo): void }>({
  componentDidCatch(error, errorInfo) {
～省略～
```

こんな感じにcomponentDidCatchを追加して解決しました。
カスタムトークン作成時のエラー:error minting custom token

## 問題
以下のようなエラーがでる

```error minting custom token: http error status: 403; reason: Identity and Access Management (IAM) API has not been used in project XXXXXXXXXXXX before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/iam.googleapis.com/overview?project=XXXXXXXXXXXX then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.```

## 動作環境
 - Google App Engine / SE
 - Go 1.9
 - Firebase Authentication

## 問題が出たコード
```go
	conf := &firebase.Config{
	 	ServiceAccountID: "my-client-id@my-project-id.iam.gserviceaccount.com",
	}
	app, err := firebase.NewApp(ctx, conf)
	if err != nil {
		log.Errorf(ctx, "error initializing app: %v", err)
		return "", err
	}

```

## 解決法
該当のサービスアカウント(ここではGAEのデフォルトサービスアカウント)に`iam.serviceAccounts.signBlob`を付与。

・・・すれば解決するのだが、プロジェクトにて自分にIAMを設定する権限がなかったので、jsonを読む形で一時的に動した。

```go
	opt := option.WithCredentialsFile("./xxxxxxxxxxx.json")
	app, err := firebase.NewApp(ctx, nil, opt)
	if err != nil {
		log.Errorf(ctx, "error initializing app: %v", err)
		return "", err
	}
```


## 参考
公式ドキュメント - カスタム トークンを作成する
https://firebase.google.com/docs/auth/admin/create-custom-tokens?hl=ja#before_you_begin
Unity mlagents v5 環境構築 for YAD2U

※あくまでもメモ程度です・・・・

ここからAnacondaをダウンロード
https://www.anaconda.com/distribution/

![Anaconda.PNG](https://qiita-image-store.s3.amazonaws.com/0/246406/0d390cd4-6354-4318-23f1-9e5154b7c025.png)

python 3.7のVersionと書いてあるが,3.5 ~3.7まで対応しているので，気にせずDownload
Mac版も同様

任意のdirectoryにインストールして開くとこんな感じになっているはず．
![navogator.PNG](https://qiita-image-store.s3.amazonaws.com/0/246406/a64bf40c-d059-2cc3-a4cb-9c56df57b103.png)

このEnvironmentを開いてcreateを開くと
![create.PNG](https://qiita-image-store.s3.amazonaws.com/0/246406/13ab149a-f714-2b2c-6799-458baf60a33e.png)

こんな感じになっているので，pythonはver3.6 Nameは適当にmlagentsv5などとして作成

pip install mlagents==0.5.0
ですべてインストールされる．

Tesnorflowsharpのリンク
https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Using-TensorFlow-Sharp-in-Unity.md
Unity TensorFlow Plugin (Download here)　のDownloadからtensorflow sharp packageをとってくる

player settingのConfigから以下のように設定

tensorflow sharp packageをimportする．
ENABLE_TENSORFLOWを書き込む
![config.PNG](https://qiita-image-store.s3.amazonaws.com/0/246406/b84ab8ca-dc6f-53df-19eb-6dc99f5c0c79.png)


学習済みのByteファイルをBrainに取り付けて実行すると
![walking.PNG](https://qiita-image-store.s3.amazonaws.com/0/246406/0c57b929-a41f-4038-22bd-1fc6327d0bc3.png)



実行できる．

https://qiita.com/tanakataiki/items/94c7778341a40438cc99

Deepmimic追実装に続く

YAD2U流行らないかなぁ
SQLで行・列変更後の合計を求める

# サンプルデータ
|区分|金額|
|:--|--:|
|1|1,000|
|1|1,500|
|2|2,100|
|2|300|

# 予想の出力
区分別の合計を計算し、横並びで出力します。

|区分１合計|区分２合計|
|--:|--:|
|2,500|2,400|

# Create Table文
```sql
create table tbl02 (kbn integer, amount integer);
insert into tbl02 values(1, 1000);
insert into tbl02 values(1, 1500);
insert into tbl02 values(2, 2100);
insert into tbl02 values(2, 300);
```

# SQL
```sql
select
	sum(case when kbn = 1 then amount else 0 end) as 区分１合計,
	sum(case when kbn = 2 then amount else 0 end) as 区分２合計
from
	tbl02
```

# まとめ
上記SQL文からSUMを削除すれば結果が以下のようになるため分かりやすいと思います。

|区分１合計|区分２合計|
|--:|--:|
|1000|0|
|1500|0|
|0|2100|
|0|300|

追記：
この方法では、まとめて記載するようなテーブルになるため、SUMする前の
中間テーブルに、レコード数分の「0」が追加されるので、パフォーマンスや
リソースの消耗に影響が出るではないかと考えていますが、未テストです．．．
Ruby(Ruby on Rails)とGoをやってる人がPHP(CakePHP)をやる

#　今の自分のできること
・html css javascript(jQueryがメイン)でのフロントサイドの実装
・Ruby on Railsを使ったWEBアプリケーション開発
・Go言語を使ったWEBアプリケーション開発（メッセージアプリ）
　※使ってるフレームワークはginとgormがメイン

#　なぜPHPをやるのか
現在関西エリアで転職活動中で、その中でPHPを使っている会社が多いため

#　本記事の対象者
RailsでWEBアプリケーション作ってたけど、CakePHP使うことになった人
そもそも初学者でPHPから入る人

#　何を書くのか
主に学習内容のアウトプット用
あとは同じ境遇の人の役に少しでも立てば幸い

#　更新
不定期

#　リンク
※まだ記事はありません（2019年2月13日現在）。

##今後更新していきます
【Xmarin.Forms】Error: Could not find any available provisioning profiles for iOS.

# 【Xmarin.Forms】デプロイ時にError: Could not find any available provisioning profiles for iOS.で失敗する時

なぜかはいまいちわかりませんが、info.plistもhogehoge.iOS.csprojも弄ってないのに唐突に
Error: Could not find any available provisioning profiles for iOS.
エラーでデプロイできない場合が数回ありましたので残しておきます。

## XcodeのメニューからWindow→Devices and Simulatorsを開きます
![スクリーンショット 2019-02-13 13.27.46.png](https://qiita-image-store.s3.amazonaws.com/0/254052/627f5415-94a3-0699-39bb-1e3363447508.png)


## 上記のプロビジョニングプロファイルエラーとなっているアプリを選択し「−」で削除します
![スクリーンショット 2019-02-13 13.29.06.png](https://qiita-image-store.s3.amazonaws.com/0/254052/c82ae67e-3544-490f-05be-56b6eb6e9eb3.png)


## iOS端末で「設定」→「一般」→「デバイス管理」→から自分のデベロッパーIDでデバッグ対象のアプリを信頼します
![IMG_03027.png](https://qiita-image-store.s3.amazonaws.com/0/254052/04747463-4811-3df1-47e8-6f8d6cf6a362.png)

色々伏せてて見づらいですが、信頼するとこのような感じになると思います。

## Visual Studioに戻り再びビルドします


の順で再びデプロイできうようになると思います。
Arduinoと音声合成LSI_Aquestalk_ATP3011F1-PUを用いて音声合成する

Arduinoに言葉を話させたい場合があります。音声合成LSIを使用してArduinoに日本語を話させましたのでその手順を記載します。

# 準備
・[Arduino UNO R3 互換品](https://www.amazon.co.jp/スイッチサイエンス-SSCI-GettingStartedArduinoKit-Arduinoをはじめようキット/dp/B0025Y6C5G/ref=sr_1_4?s=toys&ie=UTF8&qid=1548518133&sr=1-4&keywords=Arduino+正規品)
・[音声合成ＬＳＩ　ＡＴＰ３０１１Ｆ１－ＰＵ（ゆっくりな女性](http://akizukidenshi.com/catalog/g/gI-06220/)
・スピーカ（１００均のものでOK）
・抵抗4.7kΩ ２個
・ジャンパワイヤ３個（オスーオス）

# 回路図
Arduino-ATP3011F1PUを下記の通り接続します。
![006.png](https://qiita-image-store.s3.amazonaws.com/0/344880/07313e45-e727-2866-a37a-dc43f952ec89.png)

Aquestalkの回路図は下記の通りです。
![004.png](https://qiita-image-store.s3.amazonaws.com/0/344880/da9331c2-4266-5275-b833-bd7516c9039e.png)

# コード
[AquesTalk ライブラリ](http://blog-yama.a-quest.com/?eid=970151)からArduino_AquesTalk_Library.zipを取得して使用します。

```
#include <AquesTalk.h>
#include <Wire.h>  // I2CライブラリAquesTalkライブラリ内部で使用するので定義必要

// Hello Talk - AquesTalk pico LSIで「こんにちは」を繰り返し発声する

AquesTalk atp;  //インスタンス定義 変数名は任意

void setup()
{
}

void loop()
{
	atp.Synthe("konnnichiwa.");  //引数に指定のテキストを発声
}
```

# テスト
konnnichiwa.,,,と繰り返し音声再生できればOKです。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">play aquastak micon <a href="https://t.co/PoXpUWnDXr">pic.twitter.com/PoXpUWnDXr</a></p>&mdash; st (@st17890027) <a href="https://twitter.com/st17890027/status/1094802855343452160?ref_src=twsrc%5Etfw">2019年2月11日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 


# 参考
・[組み込みエンジニアでなくても週末にArduinoを使って遊ぶ](https://qiita.com/seigot/items/958d3f2817a4bdac8754)
・[AquesTalk ライブラリ](http://blog-yama.a-quest.com/?eid=970151)
・[AquesTalk 3011 Datasheet](https://www.a-quest.com/archive/manual/atp3011_datasheet.pdf)
【rails5】railsでテンプレートエンジンをslimにする、erbからslimに変換する方法

#railsでテンプレートエンジンをslimにする、erbからslimに変換する方法

##rails gコマンドで生成するviewの拡張子をslimに変えたい

gemfileに

```
gem 'slim-rails'と記述
```

bundle install

インストール後、rails gコマンドで生成するviewの拡張子が.slimに変わります

##既存のerbやhtmlファイルをslimに変えたい

**html2slim**というgemを使います。

gemfileに

```
gem 'html2slim'
```

bundle install

インストールすると、既存のerbファイルをslimに変えるコマンドが使えるようになります。

```
以下のコマンドをこのまま入力する
for i in app/views/**/*.erb; do erb2slim $i ${i%erb}slim && rm $i; done
```

すると、既存のerbファイルからslimファイルが新規作成され、元のerbファイルは削除されます。
以上でerbからslimに変換できました。

[参考1]
(https://qiita.com/pugiemonn/items/b64171952d958dc4d6be#erb%E3%82%92slim%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B)

[参考2]
(http://www.mocchiblog.com/?p=14680)
Linuxでルートディスクのサイズを取得する方法

以下のスクリプトで取得可能

```bash
#!/bin/bash

ROOT_DEVICE=`mount | grep 'on / ' | awk '{print $1}'`
ROOT_SIZE=`df -k $ROOT_DEVICE | grep $ROOT_DEVICE | awk '{print $2}'`
echo $ROOT_SIZE
```

## なんでこんなスクリプトが必要になったか

ディスクサイズでswapファイルの上限を押さえつけるため

## 検証済み環境

Ubuntu 18.04とCentOS7
AWS CodeDeploy AppSpecファイルエラー

AppSpec file（YAML）でversion: 0.1を記載すると、デプロイ時に下記エラーが帰ってくる。

The deployment failed because an invalid version value (0.1) was entered in the application specification file. Make sure your AppSpec file specifies "0.0" as the version, and then try again.

AWSのユーザーガイドを確認したら、versionの現在許容されている値は、0.0 のみ

https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/reference-appspec-file-structure.html


バージョン
このセクションでは、AppSpec file のバージョンを指定します。この値を変更しないでください。この値は必須です。現在許容されている値は、0.0 のみです。将来の利用のために CodeDeploy で予約されています。

文字列で version を指定します。
RPG風マップを実現する Egret公式推奨の方法 (失敗編2) GZIP/ZLIB 圧縮された TMX はサポートされていない

```
assetsmanager.js:1177 Uncaught TypeError: Cannot read property 'getResByUrl' of undefined
    at Object.getResByUrl (assetsmanager.js:1177)
    at TMXImage.loadImage (tiled.js:1253)
    at new TMXImage (tiled.js:1187)
    at new TMXTileset (tiled.js:2568)
    at TMXTilemap.readMapObjects (tiled.js:1041)
    at TMXTilemap.getLayers (tiled.js:957)
    at TMXTilemap.render (tiled.js:946)
    at Main.onMapComplete (Main.ts:54)
    at WebHttpRequest.EventDispatcher.$notifyListener (egret.js:349)
    at WebHttpRequest.EventDispatcher.dispatchEvent (egret.js:328)
```

下記の「instance.getResByUrl」のinstanceが undefinedになっているかと思われます

```js:assetmanager.js
    function getResByUrl(url, compFunc, thisObject, type) {
        if (type === void 0) { type = ""; }
        return compatiblePromise(instance.getResByUrl(url, compFunc, thisObject, type));
    }
    RES.getResByUrl = getResByUrl;
```

本来であればloadConfigの中でinstanceが初期化されるようです

```js:assetmanager.js
    function loadConfig(url, resourceRoot) {
:
        if (!instance)
            instance = new Resource();
:
    }
```

ということで Main.tsで通常の RES.loadConfigを呼んであげます

```diff:Main.ts
-    private onAddToStage () {
+    private async onAddToStage () {
+        await this.loadResource()
:
    }
:
+    private async loadResource() {
+ :
+            await RES.loadConfig("resource/default.res.json", "resource/");
+            await RES.loadGroup("preload", 0, loadingView);
+ :
+    }
```

今度は `Uncaught Error: GZIP/ZLIB compressed TMX Tile Map not supported!`という
TMXファイルの形式がサポートされていない形式だと怒られました

```console
tiled.js:3096 Uncaught Error: GZIP/ZLIB compressed TMX Tile Map not supported!
    at Function.Base64.decompress (tiled.js:3096)
    at Function.TMXUtils.decode (tiled.js:3166)
    at new TMXLayer (tiled.js:539)
    at TMXTilemap.parseLayer (tiled.js:1114)
    at TMXTilemap.readMapObjects (tiled.js:1044)
    at TMXTilemap.getLayers (tiled.js:957)
    at TMXTilemap.render (tiled.js:946)
    at Main.onMapComplete (Main.ts:56)
    at WebHttpRequest.EventDispatcher.$notifyListener (egret.js:349)
    at WebHttpRequest.EventDispatcher.dispatchEvent (egret.js:328)
```
Laravel Mixにpugを導入する

Laravel Mixの存在を知って取り入れようとしたときに、pugも使いたいと思って設定してみたらハマったので共有
## 試したこと
[【Laravel5.5】Laravel Mix でPugを.blade.phpにコンパイルする方法](https://qiita.com/mastar_3104/items/994bad6335fa5c9783f1)
htmlに書き出すこともできませんでした
## 結果
pugの設定はnpm scriptsで書くことにしました

```json:package.json
{
  "scripts": {
    "dev": "pug ./src/ --out ./dist/ --pretty & NODE_ENV=development webpack --config=node_modules/laravel-mix/setup/webpack.config.js",
    "watch": "pug ./src/ --out ./dist/ --pretty --watch & NODE_ENV=development webpack --config=node_modules/laravel-mix/setup/webpack.config.js --watch",
    "prod": "pug ./src/ --out ./dist/ & NODE_ENV=production webpack --config=node_modules/laravel-mix/setup/webpack.config.js"
  },
  "devDependencies": {
    "pug": "^2.0.3",
    "pug-cli": "github:pugjs/pug-cli#master",
  }
}
```
※基本的な設定はできてるものとして、必要な部分だけ記述してます

また、単純にpug-cliをインストールするだけで使えなくもないですが、pug-cli 1.0.0-alpha6ではアンダースコア`_`から始まるディレクトリ名およびファイル名のものが除外されず、そのまま書き出しが行われてしまいます
なので、インストール先を指定してインストールして使用するのが良いと思います

```
yarn add github:pugjs/pug-cli#master --dev
```

### 参考
- [pug-cliで_がついたファイル（_header.pug）やディレクトリ（_include）もコンパイルされてしまう問題を解決する](https://qiita.com/soarflat/items/48cec8fb19252a3fc4ad)
[Git] Gitの手で打つのめんどくさい系コマンドをpecoのカーソル選択で行う

pecoの選択を使ってgitの手で打つのめんどくさい系コマンドを楽にする方法をご紹介します。
(コマンドを適宜aliasなどに設定して試してみてください)
pecoのインストールは[こちら](https://github.com/peco/peco)


# git checkout {branch_name}

```shell
git branch | peco | xargs git checkout
```

利用イメージ
<img width="533" alt="1__gco____Users_matsumotokazuya__ghq_github_com_otoshimono_mamorio-server__xargs_.png" src="https://qiita-image-store.s3.amazonaws.com/0/71154/5c99bcca-98b9-194b-e3ac-fccd8de04e4d.png">


# git branch -d {branch_name}

```shell
git branch | peco | xargs git branch -d
```

# git reset --soft {commit_hash}

```shell
git log --pretty=oneline | peco |  awk '{print $1}' | xargs git reset --soft
```

利用イメージ
<img width="911" alt="1__git____Users_matsumotokazuya__ghq_github_com_otoshimono_mamorio-server__xargs_.png" src="https://qiita-image-store.s3.amazonaws.com/0/71154/f04f5e68-4686-f681-2509-669d537feef8.png">



# git reset --hard {commit_hash} (:warning: hardなので利用注意)

```shell
git log --pretty=oneline | peco |  awk '{print $1}' | xargs git reset --hard
```

利用イメージ
--softと同じ

# git stash apply {stash num}

```shell
git stash list | peco | awk -F '{|}' '{print $2}' | git stash apply
```

利用イメージ
<img width="604" alt="1__git____Users_matsumotokazuya__ghq_github_com_kazuooooo_calendy-webapp__peco_.png" src="https://qiita-image-store.s3.amazonaws.com/0/71154/f10b3fa6-4f81-762d-19e1-aaf446467afa.png">