OmniAICreator/Qiita-1.07M huggingface dataset:
【node-sass】 導入方法

##node-sassの導入方法
まずnode-sassを使用するにはNode.jsがインストールされている必要があります。

homebrew等を使ってNode.jsのバージョン管理を行う方法もありますが、Sassのコンパイルのみでしか利用しない場合は公式サイトからファイルをダウンロードしてインストールするのが簡単です。

[Node.js公式サイト](https://nodejs.org/ja/)

インストールが完了したら、Windowsの場合はコマンドプロンプト、Macの場合はターミナルを起動して、下記のコマンドを入力してください。

```
node -v
```

v10.16.3のように表示されたらインストール成功です。
（数字は上記と同じでなくても問題ありません）

##プロジェクト内にnode-modulesをインストール
まずはpackage.jsonを作成する必要があります。
プロジェクト内でnpmを配置するディレクトリにcdコマンドで移動します。

移動したら下記のコマンドを入力

`npm init`

入力すると下記の画面になると思います

```terminal
package name: (パッケージの名前)
version:(1.0.0) でバージョンを生成するかどうか、問題なければEnter  
description: 概要説明 （例 sample Landing page) 無記載でもよければEnter 
entry point:(index.js) そのままエンターを押すと初期表示ファイルをindex.jsファイルのままにする
test command: 無記載でEnterを押すとテストコマンドを設定せず進める
git repository: Githubに保存するリポジトリ情報を登録するかどうか
keywords: npm公開時に使用されるkeywords設定 無記載Enterで設定せず進める
author: 作者情報 （例 Accio
licens: defaultのISCで問題なければそのままEnter
```

入力し終えると最後に上記の情報でいいか聞かれるので問題なければ`yes`

上記の作業を終えるとディレクトリ内にpackage.jsonが作成されている。

作成されてるのを確認したら

```terminal
npm install node-sass --save-dev
```

これでフォルダ内にnode_moduleが作成される。

##次のステップ
ディレクトリ内に```mkdir sass```でフォルダを作る
```cd sass```で移動し ```touch main.scss```


ここまで出来たらpackage.jsonのscriptsを変更する

```json
"scripts": {
   "compile:sass": "node-sass sass/main.scss css/style.css -w"
}
```

*自身のディレクトリ構造に合わせ変更してください

この状態で```npm run compile:sass```を実行するとコンパイルされます。
-w(watch)オプションをつけているので変更を加えた場合はその都度コンパイルが実行されます。


-wオプションをつけないと変更の度にコマンドを実行しないといけないため少々めんどくさいです。
終了するときは^Cです。


##まとめ
導入の流れは以上となります。
間違い、他にいい方法がありましたら教えていただけると助かります。

この記事が少しでもお役に立てれば幸いです。
Javascriptのイベントハンドラにクラス定義したfunctionを登録するには

今更ですがJavascriptのクラスについて勉強中です。

フォーム値を変更した場合にページ遷移確認ウィンドウ出す処理を汎用的にクラス化しようとしました。
その中で、イベントハンドラにクラス内関数を指定したらインスタンス内のオブジェクトにthisでアクセスできなくなるためクラスに定義した関数が使えない問題が発生しました。
そこそこ上手く解決できたと思うので記事にします。

# 最初に作ったクラス

``` TransitionObserver.js
class TransitionObserver {

    constructor(){
        this.InitValueMap = new Map();
        this.id = Math.random().toString(36).slice(-16);
    }

    addPattern(elementPattern) {
        const map = new Map();
        $(elementPattern).each(function (i, e) {
            const element = $(e);
            const valueObj = {};
            valueObj.name = element.attr("name");
            valueObj.val = element.val();
            valueObj.checked = element.is(':checked');
            map.set(element, valueObj);
        })
        this.InitValueMap.set(elementPattern, map);
    }

    start() {
        $(window).on('beforeunload.pagetransition' + this.id, this.pageTransitionEvent);
    }

    stop() {
        $(window).off('beforeunload.pagetransition' + this.id);
    }

    hasUpdateElement() {
        for(let mapEntry of this.InitValueMap) {
            for(let valueEntry of mapEntry[1]) {
                const element = valueEntry[0];
                const valueObj = valueEntry[1];
                if (valueObj.val != element.val() || valueObj.checked != element.is(':checked')) {
                    return true;
                }
            }
        }
        return false;
    }

    pageTransitionEvent(event) {
        if (this.hasUpdateElement()) { // ←このhasUpdateElementがundefinedになる
            event.preventDefault();
            return false;
        }
    }
}
```

コメントに書きましたがイベントハンドラからコールバックしたpreTransitionEventからhasUpdateElementが見えません。
これはイベントハンドラから呼ばれたときにthisがTransitionObserverのインスタンスではなく別のオブジェクトになっているためです。
イベントハンドラのコールバックメソッドでthisを使うなという話は多くされているのですが、クラス定義したときにthisを使うなってのは無理な話なので何とかする必要があります。

# 何とかした

``` TransitionObserver.js
class TransitionObserver {

    start() {
        $(window).on('beforeunload.pagetransition' + this.id, this.pageTransitionEvent(this));
    }

    pageTransitionEvent(me) {
        return function (event) {
            if (me.hasUpdateElement()) {
                event.preventDefault();
                return false;
            }
        };
    }
    // その他関数変更無し
}
```

そういえば関数のカリー化っていう手法で任意の引数を関数内で使えたよなっていう記事を読んだのを思い出して、上記のように実装。
無事に想定通りの動作をするようになりました。
関数をオブジェクトとして使えるのはやっぱり便利ですね。

# 参考文献
> 3歳娘「パパ、関数をカリー化して？」
https://qiita.com/Yametaro/items/99cc1c8ebcfc703b1410

>JavaScriptでコールバック関数にあらかじめ引数を渡したい！
https://qiita.com/Lewuathe/items/5827a9b429aa71c4f76e

未勉強な独り言：TypeScriptならこんなん気にせずできるんちゃう？知らんけど。
Laravelインストールはこうする


<h2>Laravel　インストール</h2>

Laravelインストールの記事をたくさん見てきましたが、私が一番わかりやすかったものをご紹介します。


◆composerでLaravelをインストール
<img width="379" alt="スクリーンショット 2019-10-09 10.46.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431197/09d384cb-ae1d-e75e-24ef-6032698288c5.png">

パスを通します。
<img width="417" alt="スクリーンショット 2019-10-09 10.51.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431197/45105f65-03de-b882-95dc-3deb102aaef5.png">

ファイルを再度読み込みましょう。
<img width="230" alt="スクリーンショット 2019-10-09 10.52.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431197/1cdd03a4-8a77-42cc-56c9-b62104e6e811.png">


◆プロジェクトの作成
<img width="537" alt="スクリーンショット 2019-10-09 10.54.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431197/f12f0d6b-73f4-2aa8-f233-9d5e85e9021d.png">

◆ローカル環境の起動
<img width="273" alt="スクリーンショット 2019-10-09 10.55.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431197/a0864c63-0623-3c21-756f-e1550e448622.png">

ここまできたら <http://127.0.0.1:8000> を開いてみましょう。
以下の画面が見れるはずです。

<img width="597" alt="スクリーンショット 2019-10-09 10.57.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431197/63936797-9cab-bb49-bcb9-2bc7b2d050e5.png">


以下のコマンドを打つと、インストールしたLaravelのバージョンが確認できます。
<img width="254" alt="スクリーンショット 2019-10-09 12.13.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431197/94049c15-d791-154c-0227-f8e34e7c7cad.png">

おそらく最新の<b>5.8.35</b>が表示されると思います。


以上になります。もし何か間違いや不足などあればコメント頂けると幸いです。

◆参考・引用サイト
https://coxcox.hatenablog.com/entry/2019/03/14/172143
macをCatalinaにしたら、XcodeのArchiveが出来なくなった

治った！
Xcodeを12.3にアップデートしたら治ったので・・・バグ？？？
あるいは、なんかキャッシュ？？？


タイトルの通りだが、
macをCatalinaにしたら、Xcodeの既存プロジェクトでアーカイブが出来なくなった。

正確には、
アーカイブはできるのだが、`iOS Apps`として認識されなくなった・・・
どうやっても、`Other Items`というとこに入って、AdHocが作れない、審査にも上げれない・・・
（まぁ、手作業でipaファイルを作ってしまう方法もあるけど、ここでは割愛。

Stack Overflowとか、他の方の記事で
`Buuild Settings`の`Skip Install`を`Yes`にするとイイぜ！って書いてたので試してみたけど失敗・・・

これはヤバいと思っていろいろ試してたら、ちゃんとアーカイブして`iOS Apps`になっているプロジェクトもあるのを発見。
成功と失敗の二つのプロジェクトの設定を比べて見ていたら、犯人は・・・

### 以下の手法で一時的には解決していたんですが、上記の現象がまた復活したので根本的な解決ではないようです・・・MacMini2018は失敗、MacBookProLate2016だと成功・・・なぞ・・・orz(2019/10/30)

~~`Buuild Settings`の`Info.plist File`だった・・・~~

~~Info.plistのパスを指定する項目だけど、そこが`{$SRC_ROOT}`を含んだ絶対パスにしてた事が原因でした・・・
`{$SRC_ROOT}`を削除して相対パスに変更して、アーカイブで無事に解決！！！~~

かなり焦ってハマったので、備忘録として・・・
（Appleさん、仕様を変えるならその前にワーニングとか出して教えてよ・・・orz
（自分が知らんかっただけだろうけど・・・
Rails6 のちょい足しな新機能を試す92（config.disable_sandbox 編）

# はじめに

Rails 6 に追加された新機能を試す第92段。 今回は、 `config.disable_sandbox` 編です。
Rails 6 では、 `rails console --sandbox` を実行したときに、エラーメッセージを表示して終了するオプション `config.disable_sandbox` が追加されました。
本番環境などで、 `rails console --sandbox` したときにトランザクションログが大きくなりすぎて、メモリが不足してサービスがダウンしてしまうことを防ぐ目的で導入されたようです。

Ruby 2.6.4, Rails 6.0.0 で確認しました。

```shell
$ rails --version
Rails 6.0.0
```

# プロジェクトを作る

```shell
$ rails new rails_sandbox
$ cd rails_sandbox
```

# config.disable_sandbox を設定する

今回は、 `config/environments/development.rb` で設定します。

```ruby:config/environments/development.rb
Rails.application.configure do
  ...
  config.disable_sandbox = true
end
```

# rails console を実行する

`--sandbox` オプションつきで、 `rails console` を実行してみます。

```shell
$ bin/rails c --sandbox
Running via Spring preloader in process 48
Error: Unable to start console in sandbox mode as sandbox mode is disabled (config.disable_sandbox is true).
```

エラーメッセージが表示されて実行できないことが確認できます。


# 試したソース

試したソースは以下にあります。
https://github.com/suketa/rails_sandbox/tree/try092_console_sandbox

# 参考情報

* [What is new in Rails 6.0](https://bogdanvlviv.com/posts/ruby/rails/what-is-new-in-rails-6_0.html)
* [Add config.disable_sandbox option to Rails console](https://github.com/rails/rails/pull/35723)
webbrowserモジュールで任意のブラウザを自由に呼び出し利用するためのメモ(Python)

#概要
python3 webBrowsrモジュールとは、非常に簡単にpythonからブラウザを呼び出すことのできるライブラリである。単にブラウザを開くだけであれば、[python から Web ブラウザを開く方法](https://qiita.com/hideshis/items/1f556847784434cd815e)のように書くだけで済むのだが、***任意のブラウザーを呼び出しても、pythonの実行を止めたくない***時にも使うことができる。今回はwebBrowsrモジュールでできそうなことをまとめてみる。

## 既定のブラウザでwebページを開く
```
import webbrowser
url = "amazon.co.jp"
webbrowser.open(url)
```
しかし、windowsで「既定のブラウザ」を設定していてもIEが起動してしまう。
そこで以下の方法で任意の既定ブラウザを利用できるようにする。

###環境変数を設定する。
環境変数"***%BROWSER%***"を作成し、起動したいブラウザのpathを登録することで、任意のブラウザから起動できるようになる。
>環境変数 BROWSER が存在する場合、これは os.pathsep で区切られたブラウザのリストとして解釈され、プラットフォームのデフォルトのブラウザリストに先立って順に試みられます。

[ドキュメント](https://docs.python.org/ja/3/library/webbrowser.html)より引用

## 任意のブラウザでwebページを開く
```
import webbrowser
url = "amazon.co.jp"
browser = webbrowser.get('"(chrome.exe までの絶対パス)" %s')
browser.open(url)
```
webbrowser.get()を利用することで任意のブラウザを実行することができる。ところが、この方法を使ってしまうと***ブラウザを閉じるまでpytohnの実行がとまる***

これは、webbrowserモジュールがシステムのコマンドラインからブラウザを呼び出すための実行パスを取得し、それをもとに生成したサブプロセスの終了を待っているためである。("subprocess.Popen("実行コマンド").wait()"が実行されているため)
## 任意のブラウザで開いてもpythonの実行を止めない
```
import webbrowser
url = "amazon.co.jp"
browser = webbrowser.get('"(chrome.exe までの絶対パス)" %s &')
browser.open(url)
```
そこで実行したいブラウザのパスの最後尾に"&"をつける。ライブラリ上ではバックグラウンドで実行すると解釈されて"subprocess.Popen("実行コマンド").poll()"が実行され、pythonは実行を続けることができる。

>リストの中の値に %s が含まれていれば、 %s を URL に置換したコマンドライン文字列と解釈されます

#一言
実は簡単なGUIを作った際に、ブラウザを呼び出したらGUIが止まってしまい、つまったのをこの方法で解決しました。ドキュメントをよく読めば分かったかもしれませんが、わかりづらく、
まとまった記事がなかったため、今回の記事にまとめさせていただきました。
xcodeの容量サイズがおかしい件

macをupgradeする際、容量が足りないと言われたので、xcodeを一旦、外部に移動させることにしました。

ただ、ここで、`exfat`でフォーマットしたHDD上にxcode.appをコピーすると、容量はmacのファイルシステム上と比較し、10倍に膨れ上がります。`14GB -> 149GB`

これに気づかずにハマりました。注意してください。

![xcode_exfat.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4151/cd8a84f4-c3dc-a39e-bb56-39a9c062690b.png)
Unity玉転がしチュートリアル 1-2.プレイヤーの移動

# この記事の対象者
* Unity入門したい人
* 最初の一歩が踏み出せない人

# OSとか環境とか

* Windows 10 Pro
* macOS Mojave
* Unity 2019.2.8f1
* Rider 2019.2.2

# 補足
* 公式動画にて利用しているのはMacなので、Windowsユーザーはある程度脳内変換して見る事
* 筆者はWindows、Macの両方の環境で確認。Ubuntuとかでは検証してない。
* 基本Unityは英語メニューで利用
* 間違いがあったらツッコミ大歓迎

# 公式のリンク
https://unity3d.com/jp/learn/tutorials/projects/roll-ball-tutorial/moving-player

## プレイヤーの移動

追加したSphereがキーボードで動く様に調整する

## 移動時の条件
・ゲームエリア全体を転がる
・壁にぶつかる
・常に接地している（宙に浮かない）
・アイテムに接触したらアイテムを取得する

→物理演算が必要
**Rigidbodyコンポーネント**をアタッチする必要がある

## アタッチする方法

1.  アタッチする対象のゲームオブジェクトを選択(今回はPlayerゲームオブジェクト)
2. **Component>Physics>Rigidbody**を選択

![rigidbody.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324639/d82f82d1-5596-2885-6ac6-804f755dd4d0.png)

上記のようにアタッチされる
アタッチした要素は並び替えが可能となるので、要素が増えたりしたら並び替え等でキレイキレイする

## キーボードの入力について

動きを制御するスクリプトをアタッチして実現する

スクリプトを格納するフォルダ「Scripts」を作成し、その中にスクリプトを格納するのが良い

追加方法は何個かあるのだが、今回は「Add Component」から追加する方法が有効
メニューよりNew Scriptという項目から追加
→スクリプトを別で用意しても良いが、**そのスクリプトをアタッチする手間が省けるので楽**
PlayerControllerという名前でスクリプトを追加

![NewScript.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324639/0de3d324-d075-8b03-787d-8f4599b8bed3.png)



これでこのPlayerオブジェクトにスクリプトがアタッチされる

## スクリプトの記述

基本スクリプトファイルをダブルクリックして紐付いたエディタが起動する

※筆者はRiderを使ってコーディングするので、Riderが起動するが、こだわりがなければVisualStudio2019 Communityあたりが起動する

PlayerController.csの記述方法等については動画参照の事ですが何点か補足

- 動画でも説明されているが、**公式のドキュメントを読むのは基本

　Unityに限った事ではないので、なんか文字沢山書いてあるなーと思わないで
　公式のドキュメントはちゃんと読みましょう！
　何なら公式ドキュメントの読み方も超丁寧に動画にしてくれている
　**Just Do It！**

- ライフサイクル
 
https://docs.unity3d.com/ja/2019.1/Manual/ExecutionOrder.html
を参照すれば良さそう

出来上がったものがこちら！

```csharp:PlayController.cs

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public float speed;
    public Rigidbody rb;
    // See also:https://docs.unity3d.com/ja/2019.1/Manual/ExecutionOrder.html

    private void Start()
    {
        rb = GetComponent<Rigidbody>();
    }
    
    private void FixedUpdate()
    {
        float moveHorizontal = Input.GetAxis("Horizontal");
        float moveVertical = Input.GetAxis("Vertical");
        
        Vector3 movement = new Vector3(moveHorizontal,0.0f,moveVertical);
        rb.AddForce(movement * speed);
    }

}
```


Publicで定義した変数はUnityのエディタ内で直接値を編集出来るのが特徴的なので覚えておく事

![public.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324639/46958481-40b7-454f-b472-640d22c69bb9.png)


これでボールの制御が出来るようになるので大勝利
Regexの基礎文法

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている[箕牧和廣](https://qiita.com/mimaki_kazuhiro)です。
今回はRegexについて書いていこうと思います。

プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

#Regexとは
Regexとは「Regular Expression」、日本語訳にすると「正規表現」という意味になります。
「aから始まる単語」、「数字のみの行」など細かい条件を指定し、テキストから検索する文字列の表現方法です。

#正規表現の文法
「apple」のように単語や文字そのもので検索する一般的な検索方法をリテラルと言います。
一方、正規表現ではメタ文字という特殊な文法を用いることで、より複雑なパターンの検索ができます。

#メタ文字

###.(ドット)
ドットは任意の１文字にマッチさせることができます。
例１：`a.p`とすると「app」や「arp」がマッチ。
例２：`a..le`とすると「apple」がマッチ。
`.`自体を検索したい場合は`.`の前に`\`をつけてエスケープします。

###文字種の限定
| 記号 |                  機能 　　　            　|
|:----|----------------------------------------:|
| \d  |            0-9の数字１つを表す              |
| \D  |          \d 以外の 1 文字を指す            |
| \w  |      a-z、A-Z、0-9、_ の内の 1 文字を指す     |
| \W  |            \w 以外の 1 文字を指す          |
| \s  |           スペース、タブ、改行などを指す        |
| \S  |           \s 以外の 1 文字を指す           |

###量指定子
例えば「word」を検索したい場合、`\w\w\w\w`のように同じ文字を何度も書く必要があります。
量指定子を使えば、`\w\w\w\w`は`\w{4}`とスッキリ書けます。

| 量指定子       |       機能 |
|:-----------------|------------------:|
| {n}             |              n個連続する |
| {min,max}           |            min以上、max以下の個数連続する |
| {min,}             |              min以上の個数連続する |
| ?               |                {0,1}と同義 |
| +             |             {1,}と同義 |
| *          |           {0,}と同義 |

###アンカー
アンカーを使えば行の先頭にある単語のみや、末尾の文字のみといったマッチしてほしい位置を指定できます。

| 量指定子       |       機能 |
|:-----------------|------------------:|
| ^             |              行の先頭 |
| $           |            行の末尾 |
| \bで挟む             |              単語の境界 |

###選択肢
`abc|123`という風に間に`|`を入れると「または」の意味になります。
この場合は「abc」と「123」を検索できます。

###文字クラス
`[]`で囲むと`[]`内にある文字のうちどれか１文字を検索できます。
`[abc]`とすると「a」「b」「c」のどれか1つにマッチします。

###文字クラス内で使えるメタ文字
文字クラスの`[`の直後に`^`を置くと否定の意味になります。
[^ab]とすると「a」「b」以外を表せます。

`-`で文字コードの範囲を指定できます。
[a-z]とすると「a」「b」「c」・・・「y」「z」のどれか１文字を検索できます。

###改行とタブ
改行コードは Windows や macOS などのシステムによって異なるため、要注意です。

| タブと改行コード       |       説明 |
|:-----------------|------------------:|
| \t             |              タブ |
| \r\n           |            改行(Windows) |
| \r             |             改行(v9までのmacOS) |
| \n              |                改行(Unix,v10以降のmacOS) |

###キャプチャ
置換で利用したい部分を`()`で囲んでおくと、囲った順に`$1`、`$2`・・・で置換の際に文字列を取り出して検索できます。
`()`で囲んだパターンにマッチする文字列を正規表現中で使うことも可能です。
例えば、`(\d),\1`とすると\dと\1は同じものを指し、「１,１」や「5,5」などがマッチします。
OutsystemsのPushwooshでハマったこと 

#はじめに
ある日、Servicecenterにてモバイルジェネレートが急に失敗するようになった。

少しだけハマったので、ここに記します。


#想定読者
モバイルジェネレート時にpushwooshでエラーがでた方(マニアック)

OutsystemのPushwooshはこちらですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130275/38767c2b-602b-37d2-bb25-23bedf13c857.png)


#起きたこと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130275/4d4acdff-a8f2-b2b1-ace9-c7dbedee35eb.png)


■実際に起きたエラー
```
Error: Error generating application. At least one Cordova plugin used in the build requires an AndroidX library, which is not currently compatible with MABS. Check your plugins configuration.
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130275/b7d76b44-fd45-9b47-8c69-996bc54d802a.png)

AndroidX Library周りでエラーがおきましたが、詳細なエラーはこちらでは追えないのでOutsystemsSupportに相談

■頂いた回答
![トリミング後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130275/75584c7a-602a-1923-f050-d9dc9a340022.png)

要するに、MABS(Outsystemsのモバイルビルド)のバージョンとPushwooshのバージョンの互換性がなかったみたいです。

今Pushwooshのバージョンが3.01なのでMABS5との互換性がなかったんですね。
でもなんで急に互換性のエラーがでたのかは謎。。
MABS5にビルドしにいくようになったのかな。

###■対処法(その1)
Pushwooshのバージョン4.3をForgeからダウンロードしてPublishしました。



#起きたこと(その2)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130275/4d4acdff-a8f2-b2b1-ace9-c7dbedee35eb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130275/af9ba5bd-3c4c-a03f-38a6-d0a9333a6422.png)


。。。なんかまた失敗してますな。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130275/2af1aed5-af04-7098-17f8-1b0d30455723.png)


今度はpushwoosh-cordova-pluginで問題が起きてました。

ログを追ってみると、

```
Failed to install 'pushwoosh-cordova-plugin': undefined
Error: Failed to install Pushwoosh plugin. Reason: Configuration zip file not found.
```

なんかzipがないよって言われてます。

たしかにプッシュ通知の設定ではzipファイルをアプリに入れてくださいって書いてありました。
しかしこの設定を加えてないけど、アプリのプッシュ通知は元気に動いていました。
https://success.outsystems.com/Documentation/Development_FAQs/How_to_Use_Push_Notifications_with_Pushwoosh


また、サポートに聞いてみたら以下の回答を頂きました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130275/001b940c-6652-31b4-27bd-fa5128870d43.png)

まぁ、Googleさんの方でこちらの設定が必須になったっぽいです。


###■対処法(その2)

####google-service.zipの作成

Firebaseのコンソール画面でAndroidのアプリを追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130275/b4857d63-25d3-13ae-d3c1-db668a685223.png)




Androidパッケージ名とニックネームを入力してアプリを登録。
署名証明書は省略しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130275/4b818b9a-a330-405c-2d6f-847815404a01.png)

こちらを入力すると、google-service.jsonのファイルをダウンロードできるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130275/6fbae8e9-a9bc-fcce-f06c-fa208e0c91c6.png)


③と④は今回省略しました。

ダウンロードしたgoogle-service.jsonのファイルをzip化して、Outsystemsの対象のアプリのResources配下に配置。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130275/f2e4c7c6-bd25-d0fb-5e7d-7c371e07e843.png)


こんな感じで解決しました。


#終わりに
モバイルジェネレート周りはIOSとAndroidでちょっと仕様が違うのでやっかい。。
音声ファイルを発話区間で分割するシェルスクリプト

## はじめに
語学学習の教材が発話毎に区切られてなかったり、長い音声を発話区間で区切って分析したい時があります。
こうした時、Julius付属のAdintoolを使うと、発話区間毎に音声を分割出来るので、やり方を紹介します。

## 環境
macOS 10.14.6
Julius4.5
Sox ?

## 前提ライブラリ
Juliusとsoxを必要とします。
まず、次の手順でJuliusをインストールします。
[Releases · julius-speech/julius · GitHub](https://github.com/julius-speech/julius/releases)

```sh
tar xvzf julius-4.5
cd julius-4.5
./configure
make
sudo make install
```

次に、brewを使ってSoXをインストールします。

```sh
brew install sox
```

## 発話区間で分割
まず、音声をwavに変換します。
下はm4a(MacにCDから音楽を取り込んだ際、デフォルトで変換される形式)をwavに変換する例です。

```sh
#!/bin/sh

src=$1 # 入力元ディレクトリ
out=$2 # 出力先ディレクトリ


# 区切り文字にスペースが含まれないようにする
IFS_BACKUP=$IFS
IFS=$'\n'

for srcfile in `\find $1 -maxdepth 1 -type f`;do
	rawfilename=`basename $srcfile .m4a`
	rawfilepath="./.tmp/"$rawfilename".wav"
	echo $rawfilepath
  # wavに変換
	afconvert -f WAVE -d LEI24 $srcfile $rawfilepath
	outfilepath=$out"/"$rawfilename".wav"
	echo $outfilepath
  # ビットレートとチャンネルとサンプリングレートを変更
	sox $rawfilepath -b 16 $outfilepath channels 1 rate 16k
done

IFS=$IFS_BACKUP
```

wavに変換後、発話区間で切り出します。

```sh
#!/bin/sh

src=$1 # 入力元ディレクトリ
out=$2 # 出力先ディレクトリ

# 区切り文字にスペースが含まれないようにする
IFS_BACKUP=$IFS
IFS=$'\n'

for srcfile in `\find $1 -maxdepth 1 -type f`;do
	outfilename=`basename $srcfile .wav`
	echo $out"/"$outfilename
  # 発話区間で切り出し
	echo $srcfile | adintool -in file -out file -filename $out"/"$outfilename
done

IFS=$IFS_BACKUP
```

これで発話区間ごとに音声を切り出すことができました。

なお、今回作成したスクリプトは↓に載せています。
[GitHub - welchi/duo-sentence-divider](https://github.com/welchi/duo-sentence-divider)

## 参考文献
[SoX - Sound eXchange | HomePage](http://sox.sourceforge.net/)
[Julius最新版](https://julius.osdn.jp/index.php?q=newjulius.html)
[Macで音声ファイルを変換する（m4a -> wav編） - 窓を作っては壊していた人のブログ](https://teitoku-window.hatenablog.com/entry/2019/04/15/002632)
[パス文字列からファイル名などを抜き出す - Qiita](https://qiita.com/ktr_type23/items/94747a4b27e8a630ce48)
[AWS CDK]thisがエラーになる

`new s3.Bucket`使用としたら`this`がエラー(TS2345)になった。

```typescript:cdk-stack.ts
import * as cdk from '@aws-cdk/core';
import * as s3 from '@aws-cdk/aws-s3';

export class CdkStack extends cdk.Stack {
    constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
        super(scope, id, props);

        // this ok
        const serviceName: string = this.node.tryGetContext("serviceName");

        // this error
        const originBucket = new s3.Bucket(this, `${serviceName}BucketId`, {
            bucketName: `${serviceName}-bucket`
        });
    };
}
```

## 解決策

package.json内でaws-cdkのバージョンが混合していると発生するエラーらしいのでバージョンを揃える

```json:package.json
  "devDependencies": {
    "@aws-cdk/core": "^1.11.0",
    "@aws-cdk/aws-s3": "^1.12.0",
    "aws-cdk": "^1.11.0",
    "@types/node": "^12.7.11"
  }
```

↓

```json:package.json
  "devDependencies": {
    "@aws-cdk/core": "^1.12.0",
    "@aws-cdk/aws-s3": "^1.12.0",
    "aws-cdk": "^1.12.0",
    "@types/node": "^12.7.11"
  }
```

## 参考

https://github.com/aws/aws-cdk/issues/542
Windows イメージの修復方法

# システムイメージの修復
## システムイメージのチェックを実行して、破損していた場合は、Windows Updateから入手して修復する。
```
Dism /Image:C: /offline /Cleanup-Image /RestoreHealth
```
```
Dism /online /cleanup-image /restorehealth
```

## オフラインで修復する(ソース指定)
```
DISM /Online /Cleanup-Image /RestoreHealth /source:WIM:D:\Sources\Install.wim:1 /LimitAccess
```
※D:\Sources\Install.wimはWindows イメージファイルの場所。環境に応じて変更する。

## システムファイルの整合性違反(不正に置き換えられていないか)確認し、可能なら復元する。
```
sfc /scannow
```

# ファイルシステムの修復
## 読み取り専用モード(修復が必要か確認する)
```
chkdsk c:
```
※ドライブ指定なしでもOK

## ファイルシステムを修復する
```
chkdsk /f c:
```

## 不良セクタを特定し、不良クラスタから読み込み可能なデータは回収する
```
chkdsk /r
```

## インデックスに登録されている不良クラスタをチェックし直す
```
chkdsk /b
```
[自分用メモ] UDPに必要なメモ

## はじめに
いつか自分が忘れる気がするのでその時の為のメモ

## ネットワークの通信速度について
ボトルネックは色々あるが、ネットワークは基本的に遅い(詳しくは参考記事を読んで)。

## 内容
### http2
http2のコネクション上などを活用するリアルタイム性のあるTCPの場合、3wayハンドシェイクをしといて、コネクションを維持する。ここまではまぁboot処理なので許せる。

で、パケットを送信して、ちゃんと届いたら届いたってパケットをもらって、そうしたらそのパケットの送信が完了する。もし届いてなかったら再度そのパケットを送信する。

### UDP
UDPの場合3wayハンドシェイクもしないでいきなりパケットを送信できる。（この部分のメリットは個人的にはhttp2のコネクションが使いやすい現在だとメリットにはならないかなと）
で、ちゃんと届いたよってレスポンスを省いて片道切符にしている。
単純にパケットが往復しなくて良いのでパケットの送信完了までにかかる時間がだいたい倍ぐらい早い(ルーターやパケット受信完了したパケットを作って送り出す処理もあるけどそこは置いとく)。

TCPの場合は道中でパケットロスを3回した場合は、+1回の4回送信するので大まかに4倍 + 待機時間ぐらいがかかる。パケット受信したよってメッセージが届く待機時間もあるので。
パケット到達の信頼性を犠牲にする代わりにこのメリットがあり、そこがデメリットでもある。

### ゲーセンのネットワーク越しの格闘ゲーム等で30fps or 60fpsを達成する
参考記事に書いてある内容が正しければ富山から大阪でパケット送信の片道にかかる時間は10ms以上。仮にこれを20msと過程する。
60fpsを達成するには20ms * 60で1200msかかる。1秒を超えてしまう。tcpで往復の場合、パケットロスをしない前提だとタンジュに二倍しても2400msだ。到底60fpsには届かない。また、これに加えて受信したパケットに基づいての計算処理もある。そうすると現実的に30fpsにして、20ms * 30 = 600ms。0.6秒である。これなら非同期処理を上手く組み合わせればいけそう。

また、個体自体は60fpsでシュミレーションしといて、udpで常に個体間の同期を取る実装とかにしてもやっていてラグが少なく気持ちいい気がする。そこはゲームの要件や設計次第。

### UDPの使い方
UDPはWebRTCや動画ストリーミング等でも使われる。
で、実際にUDPを使う場合は送られて来る側はパケットを受け止める為のサーバーを起動しておかないといけない。で、特定の端末にパケットを送るためには、いくつかの手順を踏まないといけない。
IPとportの交換
NATというものがあり(現在のNATは大体naptで実装されているらしい)、これはルーター側にインストールされている。これは自分たちの端末とipとポートを結びつける仕事をする。
例えば、端末Aと端末Bが216.58.197.14のアドレスが割り振られているルーターの下にいるとする。そうすると、216.58.197.14にパケットが送られてもどの端末に振ればいいかわからない。なので、端末毎に216.58.197.14 + ポート番号が割り振られる。この仕事をNATがしている。

なので、STUNサーバーを用意し、自身がグローバルからみたらどんなIPで何番のポートが割り振られるのか問い合わせて、UDPで通信対象に対して知らせないといけない。知らせたら通信対象はこの人のこのポートに今後UDPでパケット投げればいいんだね！って伝わる。
これでUDP通信が利用できる。

### NATの問題
しかし、NATの実装の中にこんな設定がある。リクエストの度にその端末に割り振るポートを変える設定だ。それがもしされている場合、このままだと以前割り振られていたポートに対して相手はパケットを送り続けてしまう。これはまずい。
これを解決するためにはいくつかの方法があるが、その中でメジャーな手法としてはTURNサーバーを用意することだ。
TURNサーバーのNATは毎回割り振られない設定にする。
TURNサーバーという奴が送信元と送信先をTCPコネクションで繋ぎっぱなしにして、UDPが端末Aから届いたら繋いであるTCPコネクションで端末Bに配信するようにする。

様は、NATの設定がされていなかったら、TURNは出てこない。されていたらTURNサーバーの出番だ。
しかし、TURNサーバーが出てくるってことはかなりマズイ。どうまずいかというと、TCPを使っているのでUDPの片道の利点が消える所だ。結局往復するという。ならはじめからtcpでやればいいじゃないかと。しかも一度TURNをパケットが経由するから追加でかなり遅い。

結論だけいうと以外とこの設定がされていないNATのシェアが多いらしい。(この調査は確かどこかのドキュメントに書いてあったが忘れた
なので、快適に使える人は使えて、TURN使う場合は、残念でした〜って感じです。なのでゲーセンでこの手の個体を置く場合はネットワークの設定やら設計から関わったり調子する必要があるぽい。

## 結論
面白かった。ゲーセンのネットワーク越しのハイパフォーマンスな格闘ゲームとかなんかその手の奴作ってみたい感ある。

## 参考記事
https://www.slideshare.net/yhonjo/tcpudp-81497235
https://qiita.com/okyk/items/a405f827e23cb9ef3bde
https://qiita.com/voluntas/items/fd5d633a10272720978d
プロキシ接続環境でWindows Updateなどが行えない時の対処法

# はじめに
Windows設定からプロキシを設定した場合、Widoews Updateなどに接続できない場合あった。
コマンドプロンプトからWinhttpのプロキシ構成をすると解決した。

## Winhttp 設定
```
netsh winhttp set proxy proxy-server =<プロキシ サーバー> bypass-list=<バイパス リスト>
```
>実行例
>> ``` 
netsh winhttp set proxy proxy-server="XXX.XXX.com:8080"
```

### IEのプロキシ設定読み込む場合
```
netsh winhttp import proxy source=ie
```

### Winhttp 設定確認コマンド
```
netsh winhttp show proxy
```

### Winhttp 既定(直接アクセス)へリセットコマンド
```
netsh winhttp reset proxy
```

# 参考URL
https://support.microsoft.com/ja-jp/help/2894304
Windows Subsystem for Linux上のUbuntuでapt-get removeがエラーになるときの対処法

# 対処法
対処法といっても半ば強制的にremoveする方法。

```
sudo mv /var/lib/dpkg/info/{packagename}.* /tmp/
sudo dpkg --remove --force-remove-reinstreq {packagename}
sudo apt-get remove {packagename}
sudo apt-get autoremove && sudo apt-get autoclean
```
macOS Catalina で NFS が動かない問題に対応する

## 原因
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">It looks like I may be the first to try and export nfs shares on macOS 10.15 Catalina. It’s borked. Work around: prefix your shared dir with /System/Volumes/Data/<br><br>i.e. change /etc/exports to<br>/System/Volumes/Data/usr/local -alldirs -mapall=501:20 192.168.99.100</p>&mdash; Matt Brenneke (@mbrennek) <a href="https://twitter.com/mbrennek/status/1138606465600696320?ref_src=twsrc%5Etfw">June 12, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

- NFS パスの先頭に `/System/Volumes/Data/` をつけることで回避できる


## 対応手順
### `/etc/exports` を編集する

要 root

```/etc/exports_変更例.diff
- "/Users/user/hoge/fuga" localhost -alldirs -mapall=501:20
+ "/System/Volumes/Data/Users/user/hoge/fuga" localhost -alldirs -mapall=501:20
```

- パスの先頭に `/System/Volumes/Data` を追加した形
- `nfsd checkexports` でエラーがないか確認できる

### 変更を反映

```sh
sudo nfsd restart
```

- `showmount -e` でエクスポートしているディレクトリ一覧が確認できる
    - 何も出てこないと間違っている可能性がある


### Docker や Vagrant の NFS 設定を更新

- NFS の設定パスの先頭に `/System/Volumes/Data/` を追加
  - 下記は手元の `docker-compose.yml` の例
- 変更後 docker-compose を再読み込み

```docker-compose.yml.diff
      driver: local
      driver_opts:
        type: nfs
        o: addr=host.docker.internal,actimeo=1
-       device: ":${PWD}/app/hoge"
+       device: ":/System/Volumes/Data${PWD}/app/hoge"
```
UbuntuでPDF編集

## 概要
* UbuntuでPDF編集を行うには Xournal が便利。(良く名前忘れる)。

## インストール
```
$ sudo apt install xournal
```

## 使い方
普通のペイントソフトみたいな感覚で使える
PDFエクスポートには少し癖があり、普通にPDFエクスポートを行うと劣化したりする。その場合はLegacy PDF Exportを利用する。
HTML CSS勉強するときにオススメな教材

##はじめに
こんにちは。
現在デザイナーをやりながらフロントエンドエンジニアを目指して
勉強中のあくしおです。

アウトプットするって言ったのにかなり久しぶりの投稿です。。。

気持ちを切り替えて今日はHTML CSSを勉強するときにおすすめの教材を紹介していきたいと思います。

私のように**遠回り**して欲しくないので書きます。

##基礎編
#####対象者：
・HTML CSSってなにそれ。
・名前は聞いたことあるよって人

#####オススメ教材：
[Progate](https://prog-8.com/)
・めっちゃ分かりやすいです。無料プランでもいいですが有料会員になって
　サッと2週くらいやるといいと思います。
・本とかだとモチベ上がらない人とかは特におすすめ。

おすすめサイト：
[Webliker](https://webliker.info/)
・凄く丁寧に説明してくれてる。
　こちらも初学者の方にかなりオススメ

[ドットインストール](https://dotinstall.com)
・動画形式で一緒に基礎を学びたい方向け



　

上記教材をやれば基礎の基礎は身につくと思います。

##次のステップ
#####対象者：基礎は学んだよ！って人
Udemyの[Build Responsive Real World Websites with HTML5 and CSS3](https://www.udemy.com/design-and-develop-a-killer-website-with-html5-and-css3/)コース

こちらはUdemyのHTML CSSコースの中でもベストセラーの教材となっており僕自身もこの教材をやって大変満足しております。

実際に作るサイトもオシャレなのでテンションも上がります。


上記の事が終わったらあとはひたすら自分でサイトを作ってみるしかないと思います。
何も作るものが思いつかない人は既存のサイトの模写コーディングがオススメです。

「模写コーディング おすすめ」とかで検索したらたくさん出てくるのではないでしょうか。

実際のコーディング作業に移った時に手が止まってしまうということはあると思いますがググりながら一つずつ潰していけば必ずできるようになると思います。


##まとめ
結局のところ基礎の基礎を勉強したら調べながら自分で手を動かすがオススメ。
もしこの記事がいまいち勉強方法がわからないという方の参考になれば幸いです。


Qiita自体書き慣れていないので間違い等あれば指摘していただけると大変助かります。
またこの次のステップも需要があれば書きたいと思います。
位置情報研究 ~緯度経度情報から地名を得るアプリの開発過程~

# 位置情報とは
- GPS(Global Positioning System)を用いて，人工衛星からの信号をデバイスが受け取り，その位置を計算している．
    - 最近は，精度が非常に向上していて，数十mの単位のずれのみで位置を計算できるようだ．

# 今回使うWEB API
- Yahoo のYOLPを用いる．

そのために，この記事を作りました．
現在まだ試していないので，まだ何も書けません．
その都度更新したいと思います．

# それでは
Pryでpbcopy的なことをする

## 経緯
pryって便利ですよねえ。
と言いつつ「pryのコピーってどうするの・・・？」とずっと思ってました。
まあ、もちろん普通のコピペのやり方であれば無難に出来るんですけど長文の結果が出てきたときにコピーするの大変じゃないですか・・・。
pbcopyどこなの・・・という気持ちを抑えながら(´ε｀ )
なので、とりあえず簡易的にコピペできるコマンドを書きました！

## やりたいこと
- 最後に実行したコマンドをコピー
- 最後に実行したコマンドの結果をコピー
- 最後に実行したコマンドと結果をコピー

## コマンド
- ということで、下記コマンドを `.pryrc` にぺぺっと貼ってください。
- それで、pryを立ち上げてaliasに設定したコマンドを実行するとうまくいくと思います。

```rb
def pbcopy(str)
  IO.popen('pbcopy', 'r+') {|io| io.puts str }
  _pry_.output.puts text.green("--- Copy to ClipBoard ---")
  _pry_.output.puts str
end

Pry.config.commands.command "copy-history", "History copy to clipboard" do |n|
  pbcopy _pry_.input_ring[n ? n.to_i : -1]
end

Pry.config.commands.command "copy-result", "Last result copy to clipboard" do
  pbcopy _pry_.last_result
end

Pry.config.commands.command "copy", "Copy to clipboard" do |str|
  unless str
    str = "#{_pry_.input_ring[-1]}#=> #{_pry_.last_result}\n"
  end
  pbcopy str
end

Pry.config.commands.alias_command 'co', 'copy'
Pry.config.commands.alias_command 'ch', 'copy-history'
Pry.config.commands.alias_command 'cr', 'copy-result'
```

## 実行結果
```pry
pry(main)> 1+1+1
=> 3
pry(main)> ch
--- Copy to ClipBoard ---
1+1+1
# ペーストすると 1+1+1 がコピーされていることが分かる

pry(main)> 1+1+1
=> 3
pry(main)> cr
--- Copy to ClipBoard ---
3
# ペーストすると 3 がコピーされていることが分かる

pry(main)> 1+1+1
=> 3
pry(main)> co
--- Copy to ClipBoard ---
1+1+1
#=> 3

# ペーストすると 
# 1+1+1
# #=> 3
# がコピーされていることが分かる
```

## ちなみに

`_pry_.input_ring` の中身はこうなっているらしいです。bufferから値を取得してるのかな。

```pry
pry(main)> 1+1+1
=> 3
pry(main)> 2+2+2
=> 6
pry(main)> 3+3+3
=> 9
pry(main)> _pry_.input_ring
=> #<Pry::Ring:0x00007fe7b36b0308 
@buffer=[nil, "1+1+1\n", "2+2+2\n", "3+3+3\n", "_pry_.input_ring\n"], 
@count=5, 
@max_size=100, 
@mutex=#<Thread::Mutex:0x00007fe7b36b02e0>>
```

一応、chをこう使うこともできます。引数を与えてあげるとindexに基づいた値を取得してくれる。
最新の値は `-1` から始まって `-1` ずつ古くなっていきます。
（Enter押すと `""` 空文字がBufferに入っていく）
 
```pry
# 上記の状態から
pry(main)> ch -2
--- Copy to ClipBoard ---
3+3+3
```

## Pry#input_array is deprecated
`input_array` を使ってたんですけど推奨されてないようなので `input_ring` を使用しています。

```
warning: method Pry#input_array is deprecated. Use Pry#input_ring instead
```

pryのwikiは[こちら](https://github.com/pry/pry/wiki)です。

## まとめ
これでめちゃくちゃ長い値も簡単にコピーできるようになって嬉しい・・・！
Goでその年の日数を数える

うるう年だったら366, それ以外だったら365になるやつ。
うるう年判定を実装してもいいのだけど、t.YearDay()というメソッドがあったので、12月31日がYearDayで何日目か調べるという技がありそう。

```go
package main

import (
	"fmt"
	"time"
)

func main() {
	for y := 2010; y < 2021; y++ {
		fmt.Println(y, CountYearDay(y))
	}
}

func CountYearDay(year int) int {
	lastday := time.Date(year, 12, 31, 0, 0, 0, 0, time.UTC)
	return lastday.YearDay()
}
```

実行結果

```
2010 365
2011 365
2012 366
2013 365
2014 365
2015 365
2016 366
2017 365
2018 365
2019 365
2020 366
```
Cannot inline bytecode built with JVM target 1.8 into bytecode that is being built with JVM target 1.6. Please specify proper ‘-jvm-target’ option

AndroidStudioでの勉強中、以下のエラーが出て困ったので忘れないようにまとめ。

```
Cannot inline bytecode built with JVM target 1.8 into bytecode that is being built with JVM target 1.6. Please specify proper ‘-jvm-target’ option
```
##設定変更
メニューバーより、「Android Studio」→「Preferences」で表示される設定画面の
「Kotlin Compiler」にあるTarget JVM version を1.8に
<img width="1156" alt="スクリーンショット 2019-10-09 10.34.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363095/8499d78a-c7ad-3486-9533-b6147f03d226.png">

……ただ、この方法だとうまく行かない。

##build.gradleファイル変更
build.gradle(Module: app)のandroid部分に以下を追記

```
    kotlinOptions {
        jvmTarget = '1.8'
    }
```

追加したら、右上に表示される「Sync Now」を押下。
<img width="1458" alt="スクリーンショット 2019-10-09 10.49.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363095/c30f1569-731d-127b-30c3-906d1b155a81.png">

こっちならできた！


###参考
https://android.benigumo.com/20190731/cannot-inline-bytecode-built-with-jvm-target-1-8-into-bytecode-that-is-being-built-with-jvm-target-1-6-please-specify-proper-jvm-target-option/
BigQueryはじめました： 日付のタイムゾーン調整

## 前提

- 使ってるデータがRDSからのもので、RDS内はもちろん、日本時間ではない。
- BigQueryへ移行の際、タイムゾーン修正なしなので、当然、日本時間じゃないままのデータを扱っている。
- Redashでの操作がメインでセッションのタイムゾーン設定なしでやっている。

## SQL備忘録

MySQLだと割と、これで調整していました：

```
DATE_FORMAT(date + interval 9 hour,'%Y%m%d')
```

```
date + interval 9 hour
```

BigQueryでは、この書き方もできる：

```
DATETIME_ADD(DATETIME(date), INTERVAL 9 HOUR)
```

が、他にもついでに日付の形式を変えたい時特に便利なやり方がある。

```
FORMAT_TIMESTAMP('%Y%m%d', offer_date ,'Asia/Tokyo')
```

→　時差が何時間とか覚えてなくていいのでズボラな自分にはこっちのほうがFitする。
常磐 BATCH「お前たちの“.\venv\Scripts\activate”って、醜くないか?」

チラ裏ではありますが。

こういうバッチファイルを作って PATH を通しておくと venv をより直感的に扱えるようになるんじゃないかなあという提案です。

```sh:venv.bat
@echo off

IF "%~1" == "" (
    set env_name=venv
) ELSE (
    set env_name=%~1
)

IF NOT EXIST "./%env_name%/Scripts/activate" (
    python -m venv %env_name%
    call ./%env_name%/Scripts/activate
    python -m pip install pip --upgrade
    pip install setuptools --upgrade
) ELSE (
    call ./%env_name%/Scripts/activate
)

```

## 使い方

説明するまでもないですが。

**作業するディレクトリで**`venv`と実行すると、バッチファイルが venv を呼び出して仮想環境を作成します。 一緒に pip と setuptools の更新も行ってくれます。

すでに仮想環境が存在する場合単にそれに入ります。

`venv envname`のように引数を与えるとその名前で仮想環境を作成します。

## 余談

見ての通り、Python のバージョンの指定などはできないので、それを指定する必要がある場合は作成までは手作業で行う必要があるかな、と。 ~~本体バージョンの管理は環境を分けたい理由のひとつなのにそれでいいのか?~~

ふつうバッチファイルでは`setlocal`して`pushd "%~dp0"`して呼び出し元を汚染しないようにしますが、それを逆手に取ってこれらを記述しないことで呼び出し元に対する処理を記述できるってことなんでしょうかね。(バッチわからないマン)

## 我が魔王のお言葉

「みんな瞬間瞬間を必死にコーディングしてるんだ! デコボコなのは当然だろ! それを醜いなんて言うな!」

~~リファクタリングしろ~~
Simple HTML DOM Parserで読み込むと改行が削除されてしまう対応

PHPでhtmlのdom操作は``Simple HTML DOM Parser``が便利だなと思って使ってみましたが、
file_get_htmlで読み込むと改行コードが勝手に削除されてしまってハマったのでメモです。

## 試してみたこと

### file_get_htmlのオプションを指定する

file_get_htmlで読み込む際のオプション指定で``$stripRN``をfalseにするといいという記述を見つけたのでやってみた

```
$html = file_get_html($file, false, null, -1, -1, true, true, DEFAULT_TARGET_CHARSET, false);
```

str_get_htmlの場合はこのよう

```
$html = str_get_html($str, true, true, DEFAULT_TARGET_CHARSET, false);
```

→
が結果は変わらずだった。

### MAX_FILE_SIZEを増やしてみる

読み込むHTMLのデータ量が大きすぎると読み込みに失敗するそうです。
default600KBに設定されてるので、simple_html_dom.phpを直接開いて``MAX_FILE_SIZE``の値を増やしてみた

→
が結果は変わらずだった。

### file_get_htmlの$stripRNオプションを直接書き換える

simple_html_dom.phpを直接編集してfile_get_html関数の$stripRNのdefault値をfalseにしてみた

![スクリーンショット 2019-10-09 10.43.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/6e1858e0-4f61-15ac-b623-32dad5fd2d24.png)

→
すると無事改行が削除されていたのが改善された


推奨できる内容かは分かりませんが、最終手段としてのメモとして。。
これで改善されたということはオプションの指定の方法が間違っていただけかも。。
Laravelのミューテタはfillableに設定できるか

タイトル通り。

結論としては使えます。

※Laravel：6.0.3

### サンプル

```php
class User extends Model
{
    protected $fillable = [
        'name',
        'age'
    ]
}
```

```php
>>> App\User::create(["name" => "hoge", "age" => 99])
=> App\User {
     id: 1,
     name: "hoge",
     age: 99,
     updated_at: "2019-10-09 10:20:33",
     created_at: "2019-10-09 10:20:33",
   }
```

### ミューテタを追加

```php
class User extends Model
{
    protected $fillable = [
        'name',
        'age',
        'birthday'
    ]

    public function setBirthdayAttribute($value)                                                                                      
    {                                                                                                                                 
        $this->attributes['age'] = CarbonImmutable::parse($value)->age;                                                      
    } 
}
```

birthdayの方で作ってみる

```php
>>> App\User::create(["name" => "fuga", "birthday" => "2000-04-01"])
=> App\User {
     id: 2,
     name: "fuga",
     age: 19,
     updated_at: "2019-10-09 10:35:48",
     created_at: "2019-10-09 10:35:48",
   }
```

fillableに残っているのでageもそのまま使える

```php
>>> App\User::create(["name" => "piyo", "age" => 50])
=> App\User {
     id: 3,
     name: "piyo",
     age: 50,
     updated_at: "2019-10-09 10:36:01",
     created_at: "2019-10-09 10:36:01",
   }
```

birthdayで必ず作りたいならfillableからageを外してしまえばokです。
SQL JOINの概略

![eah_sql_blog1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208182/d36dc0ee-28c2-cd00-cbbc-c1a9f9943133.jpeg)

いつも忘れるのでメモ

よく使うのが、AとBを比較して、どちらかにしか存在しないレコードを抽出は
LEFT JOIN or RIGHT JOIN

抽出条件に、比較先のレコードをNULLにすると、一致しないレコードを抽出できる
JavaScriptで自販機を作る方法

JavaScriptで自動販売機のブログラムを作りたいのですが、以下をできるようなプログラムを作りたいです。
1.お金を投入
2.商品を選択
3.商品とお釣りを受け取る。
まだ、JavaScriptを始めたばかりなので分かる方いましたら、教えていただきたいです。
かみ砕いてみたC#(ラムダ式)

ラクダ式？って何？
最初聞いた時はちんぷんかんぷんでした。


現在の認識的には。。

```C#
int sample(int a)
{
return a+5;
}
```

これをラムダ式だと一行で

```C#
a=>a+5
```

と左辺に引数、右辺には戻り値を計算する式が入る
今回は引数が一つなので左辺の()は省略してます。

複数系


```C#
int sample(int a,int b)
{
return a+b;
}
```

これもラムダ式だと一行で

```C#
(a,b)=>a+b
```

引数が二つ以上の場合には引数を「　,　」で繋いで()で囲む

##補足１

int以外の戻り値を持つメソッドの場合

```C#
bool add(int b)
{
   return b >=0;
}
```

引数の値が0以上なら[true]、そうでなければ[false]を返すメソッド

```C#
b => b >= 0
```

と戻り値を返すメソッドを簡潔に書く事が出来る認識です。
見慣れたら呼び出しも楽なんでしょうな。。

ただ企業さんによって使ってはいけないとされてる場合もあると。。

便利ではありますが。。
Inkscape のコマンドラインでsvg を png にする

# 概要

SVG を PNG にしたいときに、 `svg2png` や `convert` などでうまくいけばよいが、
それらがなくて `inkspace` があるときの方法

# 結論

`sample.svg` を `sample.png` にする。
サイズは、幅 `128` 高さ `128`

オプションはこのようなかんじ。
詳しくは　`man inkscape`

- GUI なしで起動する `-z`
- 出力ファイルを指定する `-e, --export-png=FILENAME` 
- 幅を指定 `-w`
- 高さを指定 `-h`

```
inkscape -z -e sample.png -w 128 -h 128 sample.svg
```
モノリシック型IoTスキルアップのススメ


アウトプット強化週間！(3)

今日は打って変わってIoTな世界の話。

<hr>

ススメとかタイトルコールしつつ実際はおススメじゃない盛り付けの歴史。

![iot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/fa7dd99b-a705-cab0-1f84-0dd45c26405b.png)

#ごちゃごちゃー！！

Arduino、ラズパイ、ESPxxとかとか次々マイコンボードが出てくるけど買った後に何やるか思いつかなくて押入れで閉まっておいたのを引っ張り出して・・みたいな枕詞で始まる記事が散見するような気がする。

プログラミング習得もそうだけど、何でも選択できる場合にこれ！ってフォーカスしてモチベーションを変換するのって難しいですよね。むしろ子供用のIoT学習マイコンの方が制限がある分、こういう遊び方も出来るんじゃないかなとふと気付く(これもような気がする、か)

なので僕がやってきた巨大サイロのような（もはやスマート性が欠如している）IoTデバイスの積み上げと学習履歴を何かのヒントになればと、書いてみる。

#### スタート地点

出先からサーバーにアクセスしたいのでWOL使おう！が、家のケーブルモデムが一定期間後にMAC忘れる問題が発覚

#### WOLルーターが欲しいが、高い。ESP8266買ってきて作ろう

Lチカなど誰もが通る道からHTTPサーバーとWOLパケットを飛ばす方法を学んだ

https://github.com/koenieee/WakeOnLan-ESP8266

#### ペット買って来た

監視カメラつけたい。パソコンを使うのは大げさなんで暇そうな先のWOLくんに付けるか。OVxxx(カメラモジュール)を読み込んでクライアントに返すを学んだ

https://github.com/binzume/ov528cam

#### カメラ固定位置だとうまく見えない

サーボーモーターの使い方を学んだ

(今見たら元記事消えた・・まあ簡単だから参考コード無くてもいっか。)

#### 今度は水槽の中が暑いかどうかを見たい

温度センサー付けたい。温度センサーとI2Cの使い方を学んだ

https://www.denshi.club/cookbook/sensor/temp/21-wire.html

#### 温度見えたけど暑すぎたら死んじゃうかもしれない

コンセントから扇風機回したい。ソリッドステートリレーの使い方を学習

http://akizukidenshi.com/catalog/g/gK-00203/

#### 家族用に帰宅時間とか伝言メモ出したい

LCDの使い方

https://n.mtng.org/ele/arduino/i2c.html

#### メモだけじゃ気付かないかもだから喋らせたい

テキストをしゃべるAPIとDACの使い方

https://github.com/kghrlabo/esp32_text_to_speech

#### スマートスピーカみたいにしたい

Google Cloud Speech Recognitionとかは無料上限があるのでESPとかマイコン系がうっかり電源オフり忘れてぶん回るとだだ課金が起きるので貧乏人は使用回数上限だけのDialogflow一択です！<br>
Dialogflowってフローありきなので音声突っ込んで認識した日本語だけ頂くというGoogleさんの意図と違う邪悪な使い方をしています。
　
### しかし、悪事は必ず罰されるなのか、認識に成功しwavを流し込むコード作ってるあたりで無事ESP32が壊れました！

Chromeで実装すると

https://github.com/yasutakatou/voice

このコード量で音声認識してwikiになげられるのでめんどくなってその後再トライしてない。

壊れたので買いなおして扇風機回すところまで復活運用してたけど、今年の夏が暑すぎで一台の扇風機じゃもたないようになったのでさらに二台目建造と初代からAPI受けて連動電源オン＆オフ機能を・・モノリスは積みあがるよどこまでも・・
[CSS] marginに値を4つ指定する。

CSSでmarginやpaddingに4つ値を指定すると、記述した順に[上][右][下][左]のマージンになります。

```.CSS
p.sample5 {background-color: #f8dce0; margin: 10px 20px 30px 40px;}
```

HTMLソース

```.html
<p class="sample5"> 上10px、右20px、下30px、左40px </p>
```
【Xcode】ProvisioningProfilesの読み込み時にXcodeがクラッシュする件

iPhone11ProMaxを買って意気揚々とProvisioningProfilesを更新したのですが
ダブルクリックしてみるとXcodeがクラッシュする...。
そして、ProvisioningProfilesは読み込まれないまま。

結論として、Xcode上で

<b>[Project名] -> ターゲットの指定 -> [Signing & Certificates] -> [Provisioning Profiles]のプルダウン選択 -> [Import Profile...]</b>

から新しく作ったProvisioningProfilesを選択することで読み込みが出来ました！

誰かのお役に立てば。
引っ掛け問題-java

引っ掛かった数だけ更新

```java:sample
	        public class Sample {
	        public static void main(String args) {
	        int i = 10;
	        double d = 3.14;
	        boolean b = true;
	        System.out.print(i + " " + d + " " + b);
	    }
	}
```
10 3.14 trueが表示されるかと思いきや実行時に起動エラー。
エラーメッセージ：エディターにはメイン型が含まれていません。

mainメソッドの引数の表記が正しくない []

```java:sample
	        public static void main(String args) //正しくない
	        public static void main(String[] args) //正しい
```
文法的には正しいのでコンパイルは通ってしまう。
RPA・自動化の進め方・設計①

#考え方として
　大事なことは
　①手動でやっている作業を細かなプロセスに落とし込む
　②手動の内容をそのまま再現するのではなく、結果が同じになる代替手段も含め簡素な方法を検討する。
　③1つの作業をすべて置き換えることも大事だが、自動化が簡単にでき、それが作業者にとって幸せなことならすべてを自動化しなくても最初は十分。
  ④結果的に手動がたくさん残っている状況でも、それを支援する部分が実装できれば、それも十分改善の1つ

#例1 各種業務に忙殺されてもルーティンをこなす支援
　OutlookのカレンダーやGoogleカレンダーに定期的な作業の実施を落とし込んで置き、ポップアップするようにする。なんだそんなことって思うけど、意外と大事。

#例2 メール添付のファイルを確実に保存しておく方法
　①OutlookやGmailの振り分けで、そのサブジェクトや、送信者のものを振り分けるだけで、ファイルの所在ははっきりするので、それがまず第一歩
　②そのうえで、ファイルサーバにファイルをアップするようであれば、そのスクリプトを書く。

#例3　ダウンロードと加工の処理を1回の作業で完結させるプロセス
　【ダウンロードの手作業】⇒【バッチ実行のディレクトリに移動】⇒【バッチ実行】⇒【元ファイルの保存】を順番にやらないと駄目なことってありますね。
　こんな時に1回の処理で出来たらって思うことあると思うんです。そんな時には、時間のバッファを利用することで、1回の作業でやるというのも方法論です。
　①ダウンロードを始める
　②ダウンロードを始めた直後に、どのくらいで終わるかを見越して、一定時間が経過後に、ディレクトリへの移動、その一定時間後に、バッチが実行されるタイムラグを設けて実行する設定をしてしまう。
　⇒これだけで1回の作業で終われる。
　③元ファイルの保存は、急ぐことではないので、自分が作業にかかわらない時間に、自動実行してくれるように常にタスクスケジューラ等でだんどっておく。
Laravel Telescopeをアンインストールする


config/app.phpから`TelescopeServiceProvider`を削除

```php:app.php

App\Providers\BroadcastServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\TelescopeServiceProvider::class,//←これ
App\Providers\RouteServiceProvider::class,

```

composerの依存関係からも削除する場合
`composer remove laravel/telescope` を実行する

削除せずに無効にしたい場合

```json:composer.json

"extra": {
        "laravel": {
            "dont-discover": ["laravel/telescope"]
       }
},

```

`composer dump`で再ロード
識別式のルール-java

###識別子
プログラミング言語において、パッケージ、クラス、インターフェイス、メソッド、フィールドや変数などに付ける名前のこと。言語の種類によって命名規則が異なる。

識別子は**数字で始めることはできない**
使うことができる記号は**$と_のみ**
長さの制限は無し

```java:sample
		int $$$ = 100; //OK
		int no_32 = 32; //OK
		int _Max = 5; //OK
		int 12s = 12; //エラー
		int var-1 = 1; //エラー
		int if = 1; //エラー
		int 数字 = 100; //漢字・ひらがなも使えるが、推奨されない
```
・使用できる文字 **AからZ、aからz、0から9、_、$**
(例) animal, Max, No_1
・大文字と小文字は区別される
(例) animal と　Animalは別の変数
・予約語は使用できない
(例) if,classなどの予約語は使用できない


>**典型的な予約語・キーワード**
・流れ制御を表す単語（if、while など）
・プログラムの構成要素を表す単語（function、const など）
・組み込み関数（open、readなど）
・組み込みの型（int、stringなど）
・他の言語などと混同して、誤用される可能性のある語（Javaのgoto、constなど）
・将来キーワードとして利用するかも知れない語（JavaScriptのlet、super、C++11のexport (以前は使われていた)）
過去にキーワードだったため意味が無くなった後も残してあるもの
bashのコマンド実行結果を変数に格納する

bash内でコマンドの実行結果を変数に格納して色々処理したかった

####dateコマンドの実行結果を変数に格納する

```com_date.sh
#!/bin/bash
com_date=$(date)
echo ${com_date}
```

ちなみにこんな感じで `com_date = $(date)`　=の間にスペースを打つとエラーになる。

実行

```
$ sh com_date.sh
#=>2019年 10月 9日 水曜日 09:44:15 JST
```

psqlとかの実行結果も格納できる

```sh
#!/bin/bash
update_hoge=$(psql -h ${hoge_HOST} -p 5555 -U ${hege_USER} -d DBhoge -c "\
    UPDATE hogeSET hoge= '$string' WHERE hoge= 'hoge';\
    ")
echo ${update_hoge}
```

おわり
Railsの「Yay! You’re on Rails!」の画面がどこで記述されているか知っているか？

完全にあおりタイトルでごめんなさい。

#### 結論

ここにあります。
「Yay! You’re on Rails!」で全文検索したら出てきました。
僕にとっては意外な場所でした。

```
/Users/hoge/.rbenv/versions/2.6.3/lib/ruby/gems/2.6.0/gems/railties-5.2.3/lib/rails/templates/rails/welcome/index.html.erb
```
Cordova カメラプラグインをchromeで使う方法

# メモ
cordovaをchromeで確認をする時にカメラを使う必要があったが、カメラが使えなかったので、プラグインの中身を少しいじった。

# 内容
以下のようなエラーがでた

```
Uncaught TypeError: Failed to execute 'createObjectURL' on 'URL': No function was found that matched the signature provided.
```
調べると``createObjectURL``は使えないということだったので、直す。

``platforms/browser/platform_www/plugins/cordova-plugin-camera/src/brower``のディレクトリ内に``CameraProxy.js``があるので105行目あたりを直す

```CameraProxy.js
video.src = window.URL.createObjectURL(localMediaStream);
```
以下のように直す

```CameraProxy.js
video.srcObject = localMediaStream;
```

これで使えるようになると思います。
Ruby、Rails を学ぶ上でのおすすめの本まとめ

# これは何？
Ruby、Rails に関して何によってどう学んできましたか？というのをよく聞かれるので、まとめた。
あくまで個人の経験に基づく感想です。

(書籍へのリンクはアフィリエイトではありません)

# 対象
とりあえず Ruby でちょっとしたスクリプトは書けるし、Rails も軽く触ったことはあるよ、という方。
(全くRuby触ったことない人向けではないと思います)

# 本

## Rubyの言語仕様を学ぶ
### 効能
* Ruby っぽい書き方ってどんな書き方なんだろう？を学べる(map 使うとか)。
* Rails を読む上でのおまじないが減る。
    * なぜ attr_accessor を書くとセッター/ゲッターが生えるのかとか、モデルがActiveRecord を継承していることの意味とかがわかるようになり不安が減る。

### 紹介
* [Effective Ruby](https://www.amazon.co.jp/dp/B00SF6JN4K/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
    *  リファレンス的な本ではなく、もっと現実的に使われる文脈を意識して書かれているように感じた。読みやすかった。
    * 写経しやすいのが良い。書いて身につけることができる。
* [メタプログラミングRuby第2版](https://www.amazon.co.jp/%E3%83%A1%E3%82%BF%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0Ruby-%E7%AC%AC2%E7%89%88-Paolo-Perrotta/dp/4873117437)
  * メタプログラミングという切り口で Ruby の言語仕様を教えてくれる本だと思った。
  * クラス定義の話(継承ツリーとか特異クラスとかinclude/extendとかの話)はこの本が一番分かりやすかった。
  * 「ブロックがクロージャである」という表現を直感的に理解できるようになった。

## 設計力を高める

### 効能
* 以下のような疑問に対する自分なりの意見を持てるようになる。
    * model/controller/view 以外にも app ディレクトリ以下に service とか作ることがあるっぽいけど、どこに何を書くのが美しいの？
    * controller/model が肥大化してしまってつらいんだけどどうすればいいの？
* 実装に関して戦略レベルで大きなヘマをすることが減る。したがってコードレビューで大きくちゃぶ台返しされることが減る。

### 注意事項
*  ちょっと読んでみて「難しくてほとんど全部よくわからん、」「言っている意味はわかるがこれを学んでなにか意味があるの？」となったら今読むべきではないと考えたほうが良いかもしれません。
    * 知識というか考え方を学ぶ本だと私は解釈しており、理解できていない状態で読んでもほとんど学びはないのではないか？となっている。
    * 具体的に開発を通じて悩んだ経験があると、「なるほどこういうふうに書けるのね！」となりやすいが、経験があまりないとピンとこないので記憶に残らない、ということもありそう。

### 紹介
* [リファクタリング:Rubyエディション](https://www.amazon.co.jp/%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0-Ruby%E3%82%A8%E3%83%87%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3-Jay-Fields/dp/4048678841)
    * 神本。~~しかし絶版っぽい？~~ 復刊したようだ！！(2020/09/15 update)
    * 写経しやすいのが良い。書いて身につけることができる。
    * リファクタリングの本なので、before の状態から after の状態に帰る方法としてどのような方法があるのかを学ぶことができる。
    * before の状態を見てその問題点を列挙する力、after の候補を列挙する力、after の候補から最も良いものを選び出す力、を身につけるとアウトプットの質が大幅に改善される。
* [Ruby によるデザインパターン](https://www.amazon.co.jp/Ruby%E3%81%AB%E3%82%88%E3%82%8B%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3-Russ-Olsen/dp/4894712857)
    * 絶版っぽい？
    * デザインパターンを Ruby で実装してみた、みたいなもの。
    * 『リファクタリング:Ruby』 でしっかり学んでいると、だいたい「まぁそうだよね」、となるかもしれない。
    * 「デザインパターンって言葉よく聞くけど何なのだろう？ちょっと学んでみたいな」みたいな人には特に向いているかと思う。
* [オブジェクト指向設計実践ガイド―Ｒｕｂｙでわかる進化しつづける柔軟なアプリケーションの育て方(サンディメッツ本)](https://www.kinokuniya.co.jp/f/dsg-01-9784774183619)
    * 絶版じゃない！！！
    * 上の２つの本で学んだことと被るところが多いが、かなりの良本。
    * 登場する具体例が自転車なので、自転車好きなら良いかも。個人的には特に興味も知識もないので、オブジェクトの例としてギアとかそういうの出てきてもピンとこなくてちょっとつらかった。
パッケージ製品のサーバリプレースに際するコミットについて

#これを書くに至ったきっかけ
 私が関わっているパッケージ製品のリプレースで少し思うところがあり、そのポイントを共有したいと思いました。

1. 情シス・エンドユーザ・ベンダーの3者打合せに入るにあたりパッケージ製品の単純リプレースの場合、エンドユーザを入れたミーティングは最後のセレモニー的に考え、情シスとは進め方について、ある程度コミットしていないと、時間だけが浪費する。

2. 並行稼働機関で、高価なRDBのDBサーバを効率よく回すためには、一時的なDBを持つ際の方法論は確立されておかないといけない。例えば、一時的に評価期間として使えるかどうかや、そもそも移行先のDBに2つのDBを持っても行けない訳ではない。

3. パッケージ製品で、それこそ1日リプレースが当たり前の状況の中で、スクラッチシステムの移行のようなリカバリや検証での懸念払しょくのためには、実績が十分にあるので、スクラッチシステムのようなリスクヘッジはそもそも要らないということを、きちんと説明することも重要で、それでも納得しない場合には、2段階、3段階のフェーズをBプランとして、即答できる心構えが必要。

4. AWSやAzureなどへの移行の場合は、その機能を十分に利用することが重要
　例えば
　　・リカバリテストなんて、AMIから戻すだけでIP切り替えるだけなので、その想定と問答くらいは即答できる。
　　・AWSの場合はオンプレからクラウドへの移行評価として、担当セールスにプレゼンして通ると、一定額のチケットを受け取れる場合があるので、そうしたものも利用する。
データ　yaml json



## yaml 

- 構造化したデータを表現するモノ

記事

https://magazine.rubyist.net/articles/0009/0009-YAML.html

```javascript:基本
require 'yaml'

yaml_data = <<-DATA
- RED
- GREEN
- BLU

DATA

YAML.load(yaml_data)
```

```javascript

# リテラル
yaml_data = <<-DATA
- RED
- GREEN
- BLU

DATA

p YAML.load(yaml_data)


# リテラル出力
➜  Desktop ruby sample.rb
["RED", "GREEN", "BLU"]
"\ndefault: &default\n  adapter: mysql2\n  host: 127.0.0.1\n  encoding: utf8\n  pool: 5\n  username: root\n  password:\n  reconnect: false\n\ndevelopment:\n  <<: *default\n  database: development\n\ntest:\n  <<: *default\n  database: test\n\n\n"


#yml形式

database = <<-DATA

default: &default
  adapter: mysql2
  host: 127.0.0.1
  encoding: utf8
  pool: 5
  username: root
  password:
  reconnect: false

development:
  <<: *default
  database: development

test:
  <<: *default
  database: test


DATA

p YAML.load(database)


#yml形式　出力

➜  Desktop ruby sample.rb
["RED", "GREEN", "BLU"]
{"default"=>{"adapter"=>"mysql2", "host"=>"127.0.0.1", "encoding"=>"utf8", "pool"=>5, "username"=>"root", "password"=>nil, "reconnect"=>false}, "development"=>{"adapter"=>"mysql2", "host"=>"127.0.0.1", "encoding"=>"utf8", "pool"=>5, "username"=>"root", "password"=>nil, "reconnect"=>false, "database"=>"development"}, "test"=>{"adapter"=>"mysql2", "host"=>"127.0.0.1", "encoding"=>"utf8", "pool"=>5, "username"=>"root", "password"=>nil, "reconnect"=>false, "database"=>"test"}}
```


## json

- json（JavaScript Object Notation）とは

javascriptのオブジェクト


- 記事
https://www.sejuku.net/blog/16196#json

```javascript

require 'json'

yaml_data = <<-DATA
["Red","Blue","Red"]

DATA

JSON.load(yaml_data)
```

```javascript
# json は基本はオブジェクト

example.json

{
    "ruby": {
      "rails":30000
    },
    "python": {
      "django":25000
    }
  }

require 'json'

File.open("example.json") do |file|
  hash = JSON.load(file)
  p hash
end


hash = JSON.parse('{"ruby":{"rails":30000},"python":{"django":25000}}')
p hash
{"ruby"=>{"rails"=>30000}, "python"=>{"django"=>25000}}

```


```javascript
# 文字列型のjsonもある

- parse

hash = JSON.parse('{"ruby":{"rails":30000},"python":{"django":25000}}')

p hash
{"ruby"=>{"rails"=>30000}, "python"=>{"django"=>25000}}

```


- json 作成


```javascript:generate
ハッシュ　→ jsonに

require 'json'
hash = JSON.generate({"ruby":{"rails":30000},"python":{"django":25000}})
p hash
```

```javascript:to_json
# ruby で用意してくれている

require 'json'
hash = {"ruby":{"rails":30000},"python":{"django":25000}}.to_json
p hash

```