OmniAICreator/Qiita-1.07M huggingface dataset:
DDDで値オブジェクトを生成するときってその場でnewで良いの？

#疑問
[エンティティ][]なり[集約ルート][]なりを生成する場合には[ファクトリ][]から生成するべきというのはわかったんですけど、値オブジェクトの生成については[DDD本](https://www.shoeisha.co.jp/book/detail/9784798121963)には記述が見つけられなかったんですよ(あったらごめんなさい)。
[IDDD本](https://www.shoeisha.co.jp/book/detail/9784798131610)では値オブジェクトのコンストラクタの実装についての記述はあったんですが使用しているコードが見つけられなくて。
なので値オブジェクトの生成に関して自分なりの考察を投稿してみます。

#値オブジェクトの生成手法一覧(自分が思いつく限り)

|  | 手法 | メリット | デメリット |
|:-:|:-:|:-:|:-:|
| 1 | その場でnew(コンストラクタ使用) | 単純 | 不変条件チェックでNGならコンストラクタで例外 |
| 2 | [staticファクトリーメソッド][]  | 呼び出しが楽。不変条件のチェックが出来る | [依存性を注入][依存性の注入]しづらい |
| 3 | [集約ルート][]のように[ファクトリ][]用意 | 不変条件のチェックが出来る。いろいろ[注入][依存性の注入]できる | 一個一個の値オブジェクトに対して作成するのはつらい。使うときにファクトリの[注入][依存性の注入]が必要 |

以下、それぞれについて記載します。

#その場でnew(コンストラクタ使用)
良くない気がします。
値オブジェクトの不変条件のチェックをどこでやるかっていう話にもなるとは思うんですけど、不変条件を値オブジェクト内に閉じ込めようと思うとコンストラクタでチェックをしないといけなくなります。そこで違反していた場合、違反していることを伝えるためには例外を投げるしか方法がなくなるんですよね。(C#とか想定)
あとはファクトリメソッドパターンを適用しようとか事前条件を加えたいとか考えると柔軟性に欠ける気がします。

#[staticファクトリーメソッド][]
自分的にはベターな手法です。
事前条件や不変条件を修正しやすいですし、戻り値をboolと値オブジェクトの[タプル](https://docs.microsoft.com/ja-jp/dotnet/csharp/tuples)で返すようなメソッドを用意すれば事前条件や不変条件の違反を伝える術が例外に頼らなくて済みます。
もしアプリ起動中ずっと生存していて良いのならシングルトンパターンで記述しても良いですし。

staticメソッドのデメリットとしてクラス名が変更した時全直しが必要ですけど、値オブジェクトの名前なんてそうそう変わるはずないですよね？(願望)
あとは値オブジェクトに[依存性を注入][依存性の注入]する必要が出た場合、注入するためには使用元のクラスで注入してからstaticファクトリーメソッドの引数として渡さないといけないところですかね。

```C#:staticファクトリーメソッドだとDIするとき大変
// 値オブジェクト.
public class xxxValueObject
{
    private IyyyService yyyService { get; }
    public int Value { get; }

    // staticファクトリーメソッド.必要なら値チェックしてから生成.
    public static xxxValueObject Create(IyyyService _yyyService, int _value)
        => new xxxValueObject(_yyyService, _value);

    private xxxValueObject(IyyyService _yyyService, int _value)
    {
        yyyService = _yyyService;
        Value = _value;
    }

    public int ここでやらなければならないこと => yyyService.なんかやる(Value);

    // 以下、等価性担保
    ...
}

// 使用するクラス.
public class zzzModel
{
    private IyyyService yyyService { get; }

    // コンストラクタインジェクション.
    public zzzModel(IyyyService _yyyService)
    {
        yyyService = _yyyService;
    }
    
    // 使用する場所.
    public void hogehoge()
    {
        var vo = xxxValueObject.Create(yyyService, 10);
        // vo.ここでやらなければならないこと を呼んでなんかやる.
        // vo.ここでやらなければならないこと を使わないときでも注入必要.
        ...
    }
}
```

けど値オブジェクトに[注入][依存性の注入]することってあるんですかね？設計を見直した方が良い気がします。


#[集約ルート][]のように[ファクトリ][]用意
これはやりすぎな気がします。
1つの値オブジェクトにつき、ファクトリのインターフェースとファクトリの実装クラスが必要になっちゃいます。
値オブジェクトファクトリみたいにひとつにまとめるのもなんか違う気がします。(値オブジェクトのサービスロケータになってしまう)
使用するときも使用先でファクトリを注入しないと使えません。

#所感
結局は場合によりけりなんでしょうけど。
他にも生成の方法やテクニックがありましたらご教示頂きたいです。


[依存性の注入]:https://little-hands.hatenablog.com/entry/2018/05/27/dependency-injection
[エンティティ]:https://codezine.jp/article/detail/10038
[集約ルート]:https://codezine.jp/article/detail/10776
[ファクトリ]:https://codezine.jp/article/detail/10903
[staticファクトリーメソッド]:http://4geek.net/about-static-factory-method-in-java/
10. おうちハックしやすそうなAPI家電やクラウドを整理する（クラウド経由）

# コンセプト

- クラウド経由のみをまとめる
 - 赤外線NG
 - シリアル通信NG
 - 直接APIがあるものについては下記にまとめたいと思います。
  - https://qiita.com/Sugimura-Laboratory/items/8229cda4c5ac9dfb0226
- 分解無し（公式に，蓋開ける紹介などあれば許容範囲）
- 追加ハードウェア設計必要無し
- 操作する側をコントローラ，操作される側やデータを提供する側をデバイスと表現します
 - コントローラはまとめない
- ファームウェア書き換えが必要なデバイスはまとめない
- **MIoTは適当に作ってみました。部品になるIoT製品（Modulable IoT devices）という意味です。**
- IoTと言っても，専用アプリでしか動かないものには興味がありません。
 - 型番が太字の物はテスト済みです。
いまだに専用アプリでしか動かない製品づくりをしている会社は坂村健先生の記事をお読みください！
- IoT時代に必要なのはAPIのオープン化
 - https://10mtv.jp/pc/content/detail.php?movie_id=1668


# 通信集約方式の紹介

おうちハックの皆さんを見ていると，下記のようなサービスを連携して作ってることが多いようですね。

- E-mail
- Firebase, Google Drive, Google Assistant
- AWS, Amazon Alexa
- Microsoft Azure
- IFTTT
    - LINE bot, LINE Things, LINE wave- 参考, https://engineering.linecorp.com/ja/blog/line-things-developer-trial/
- Slack
    - 2022年9月1日(木)から無料プランのデータ保存が最大90日になった
- Discord
- myThings (Yahoo!)
    - アプリの提供を2019年1月31日に終了
- Twitter API
- ECHONET Lite WebAPI

# デバイスの紹介

## スマートスピーカー
- Google Home (Google Assistant?)
- Amazon Echo (Alexa)
- LINE 
    - 2022年10月31日 「CLOVA」販売終了、2023年3月30日「CLOVA Assistant」提供終了

## フィットネストラッカー

健康，スポーツ，美容系のロギング利用に。

- Fitbit
    - 2021年1月14日 Googleが買収（Fitbit by Googleへ）
- Jawbone
    - 2017年7月6日 破産手続き開始
- Healbe Gobe2
- Garmin
- AppleWatch（Health Care Kit）

## 他
- Netatmo
- MESH (Sony)
- 東芝REGZA (E-mail)
    - E-mailで録画予約ができるみたい。Yahoo! mail経由で動作確認できてる模様。POP Before SMTP(25)やPOP(110)など少し古いのでセキュアなポートではだめかも？
- BOCCO (ユカイ工房)
    - http://www.bocco.me/about/boccoxmythings/
- Nature Remo
    - Nature Remo Cloud API


# デバイスではないが，クラウドのAPIでおうちハックに使えそうなやつ

- OpenWeatherMapの気象API
- 気象庁の気象API
- Yahoo YOLP の気象API
    - URL
- Gガイド.テレビ王国のEPGデータ
    - https://tv.so-net.ne.jp/rss/schedulesByCurrentTime.action?group=10&stationAreaId=23
- gooラボ ひらがな化API
    - https://labs.goo.ne.jp/api/jp/hiragana-translation/
- Ambient（グラフ，可視化）
- Todoist（タスク管理）
    - https://todoist.com/?lang=ja


ここでまとめなくても，下記にいろいろご紹介されているみたいですね。

- API list 100+
    - http://smsurf.app-rox.com/api/
- 日本の全エンジニアに捧ぐ！現在公開されているAPI一覧【2013年版】
    - https://www.find-job.net/startup/api-2013

# まだよくわかっていないもの。
- Homebridge、HomeKit（Apple）
- WeMo
- Zapier (IFTTTみたいなやつらしい)
    - https://zapier.com
- IKEAのスマートライティング、Tradfri
    - LANのAPIっぽい
casTableでGroup Byを使う

[SAS Viya](https://www.sas.com/ja_jp/software/viya.html)はAIプラットフォームになります。Webブラウザ上で機械学習の設計、実行ができるStudioという環境も用意されていますが、開発者はプログラミングコードで開発することも可能です。プログラミング言語はJava/Python/R/SASが選べます。

機械学習を用いる際に専用のテーブル（casTable）を用いますが、今回はそのテーブルオブジェクト（Python版）で情報をグルーピング（Group By）する方法を紹介します。

## テーブルの作り方

テーブルはCSV、HTML、他のデータベースなどから作れます。

```py
out = sess.upload('Jupyter_Saved_Work/Data/iris.csv')
```

ファイルをアップロードした後、casTableとして取得します。

```
tbl = out.casTable
```

## グルーピングする

グルーピングには `set_param` メソッドを使います。

```py
tbl.set_param('groupby', ['Name'])
```

または groupby メソッドも使えます。

```py
tbl = tbl.groupby(['Name'])
```

こうするとテーブル情報にも追加されます。

```
CASTable(
  'IRIS', 
  caslib='CASUSER(demo@sas.com)', 
  groupby=['Name'])
  [['SepalLength', 'SepalWidth', 'PetalLength', 'PetalWidth', 'Name']]
```

そしてグルーピングした後のデータの取りだし方（通常はsum/max/min/averageなどになるかと思います）を指定します。

```py
tbl.Summary(subset=['min', 'max'])
```

そうするとグルーピング対象の Name ごとにデータが表示されます。デフォルトではNameごとにテーブルが分かれます。

| Column | Min | Max
|----|----|----|
| Iris-setosa | SepalLength | 4.3 | 5.8
| Iris-setosa | SepalWidth | 2.3 | 4.4
| Iris-setosa | PetalLength | 1.0 | 1.9
| Iris-setosa | PetalWidth | 0.1 | 0.6

| Column | Min | Max
|----|----|----|
| Iris-versicolor | SepalLength | 4.9 | 7.0
| Iris-versicolor | SepalWidth | 2.0 | 3.4
| Iris-versicolor | PetalLength | 3.0 | 5.1
| Iris-versicolor | PetalWidth | 1.0 | 1.8

すべて連結する場合には以下のように `concat_bygroups` を使います。

```py
tbl.summary(subset=['min', 'max']).concat_bygroups()
```

| | Column | Min | Max
|-----|-----|-----|-----|
| Iris-setosa | SepalLength | 4.3 | 5.8
| Iris-setosa | SepalWidth | 2.3 | 4.4
| Iris-setosa | PetalLength | 1.0 | 1.9
| Iris-setosa | PetalWidth | 0.1 | 0.6
| Iris-versicolor | SepalLength | 4.9 | 7.0
| Iris-versicolor | SepalWidth | 2.0 | 3.4
| Iris-versicolor | PetalLength | 3.0 | 5.1
| Iris-versicolor | PetalWidth | 1.0 | 1.8
| Iris-virginica | SepalLength | 4.9 | 7.9
| Iris-virginica | SepalWidth | 2.2 | 3.8
| Iris-virginica | PetalLength | 4.5 | 6.9
| Iris-virginica | PetalWidth | 1.4 | 2.5

## グルーピングを解除する

グルーピングを止める場合は del_param を使ってください。

```py
tbl.del_param('groupby')
```

----

グルーピングを行うことで大量のデータであっても素早く確認できるようになります。ぜひ活用してください。

[SAS for Developers | SAS](https://developer.sas.com/home.html)
casTableを条件を指定して取得する

[SAS Viya](https://www.sas.com/ja_jp/software/viya.html)はAIプラットフォームになります。Webブラウザ上で機械学習の設計、実行ができるStudioという環境も用意されていますが、開発者はプログラミングコードで開発することも可能です。プログラミング言語はJava/Python/R/SASが選べます。

機械学習を用いる際に専用のテーブル（casTable）を用いますが、今回はそのテーブルオブジェクト（Python版）で情報を絞って取得する方法を紹介します。

## テーブルの作り方

テーブルはCSV、HTML、他のデータベースなどから作れます。

```py
out = sess.upload('Jupyter_Saved_Work/Data/iris.csv')
```

ファイルをアップロードした後、casTableとして取得します。

```
tbl = out.casTable
```

## 絞り込み条件をPythonで書く

casTableではSQLではなく、Pythonのコードを使ってデータの絞り込みを行えます。

```py
tbl2 = tbl[tbl.SepalLength > 6.0]
```

複数条件の場合は & で繋ぎます。

```py
tbl2 = tbl[(tbl.SepalLength > 6.0) & (tbl.PetalLength < 5.0)]
```

## casTableの基底プロパティとぶつかった場合

例えばNameというプロパティはcasTableオブジェクトの基底プロパティです。この場合は `['Name']` といった形で指定します。

```py
tbl2 = tbl[tbl['Name'] != 'Iris-setosa']
```

もし tbl.Name として指定すると以下のようなエラーが出ます。

```py
tbl2 = tbl[tbl.Name != 'Iris-setosa']
```

エラーメッセージです。

```
KeyError                                  Traceback (most recent call last)

<ipython-input-31-035de5eb5d01> in <module>()
----> 1 tbl2 = tbl[tbl.Name != 'Iris-setosa']


/opt/sasinside/anaconda3/lib/python3.6/site-packages/swat/cas/table.py in __getitem__(self, key)
   7578 
   7579         # Everything else
-> 7580         raise KeyError(key)
   7581 
   7582     def groupby(self, by, axis=0, level=None, as_index=True, sort=True,


KeyError: True
```
----

WHERE句を書かず、SQLを意識せずにデータの絞り込みや閲覧ができるのは便利ではないでしょうか。Pythonコードとの親和性も高いので、プログラマブルにデータ探索が実現できます。

[SAS for Developers | SAS](https://developer.sas.com/home.html)
casTableに任意のカラムを追加する

[SAS Viya](https://www.sas.com/ja_jp/software/viya.html)はAIプラットフォームになります。Webブラウザ上で機械学習の設計、実行ができるStudioという環境も用意されていますが、開発者はプログラミングコードで開発することも可能です。プログラミング言語はJava/Python/R/SASが選べます。

機械学習を用いる際に専用のテーブル（casTable）を用いますが、今回はそのテーブルオブジェクト（Python版）で任意のカラムを追加する方法を紹介します。

## テーブルの作り方

テーブルはCSV、HTML、他のデータベースなどから作れます。

```py
out = sess.upload('Jupyter_Saved_Work/Data/iris.csv')
```

ファイルをアップロードした後、casTableとして取得します。

```
tbl = out.casTable
```

## カラムの追加方法

例えばカラム同士の計算結果を追加したい、レポート用に特定の文字列を出したいなど、様々な用途が考えられます。これは tbl にキーを追加するだけです。例えば以下は文字列として指定しているので、同じ文字が表示されます。

```py
tbl['newColumn'] = 'SepalLength * 2'
```

計算を伴う場合は以下のようにtblを使います。

```py
tbl['newColumn2'] = tbl.SepalLength * 2
```

## 情報を確認する

これでテーブルを見るとカラムが追加されているのが分かります。

```py
tbl.head()
```

| SepalLength | SepalWidth | PetalLength | PetalWidth | Name | newColumn | newColumn2
|---|---|---|---|---|---|---|---
| 0 | 5.1 | 3.5 | 1.4 | 0.2 | Iris-setosa | SepalLength * 2 | 10.2
| 1 | 4.9 | 3.0 | 1.4 | 0.2 | Iris-setosa | SepalLength * 2 | 9.8
| 2 | 4.7 | 3.2 | 1.3 | 0.2 | Iris-setosa | SepalLength * 2 | 9.4
| 3 | 4.6 | 3.1 | 1.5 | 0.2 | Iris-setosa | SepalLength * 2 | 9.2
| 4 | 5.0 | 3.6 | 1.4 | 0.2 | Iris-setosa | SepalLength * 2 | 10.0

----

テーブル拡張がPythonのコードで書けるのでとても簡単に使えるでしょう。ぜひご利用ください。

[SAS for Developers | SAS](https://developer.sas.com/home.html)
jupyter notebookで自作ライブラリをテストする方法 autoreload

# autoreload

pythonではimportした後にもう一度importしなおしても、同名の場合はキャッシュを利用するため、import先が変更されていても適用されない。
他人のライブラリであれば、それでむしろ問題がないが、自作ライブラリの場合、それを補修しながら使うのが普通なので、ありがたくない。
そこで、importを再度するためのライブラリもpythonないにも用意されているが、多少面倒くさい。

この面倒くささを省いてくれるのが **autoreload**
https://ipython.org/ipython-doc/3/config/extensions/autoreload.html
にあるように、autoreloadを使うと、関数を呼ぶたびにライブラリの読み込みが入るため、ライブラリのファイルを保存するだけで、勝手に反映される。設定も色々ある。

# 使い方
とりあえず使いたい人向け

```
%load_ext autoreload
%autoreload 1
%aimport 自作ライブラリ
```


## %autoreload
```python
%load_ext autoreload #autoreloadを読み込む
%autoreload <option>
```

|   option   |  機能 | 
|:-----------------:|:------------------:|
| なし  |  全てのモジュールがこの瞬間、再読み込みされる（ただし、%aimportで除かれたものを除く）
| 0     | autoreloadを無効化|  
| 1 | %aimportで明示されたモジュールを実行前に全て再読み込みする |  
| 2 | 全てのモジュールが実行前に、再読み込みされる（ただし、%aimportで除かれたものを除く） 

## %aimport

```python
# fooモジュールを明示的に再読み込みする（autoreloadのoption=1に影響）
%aimport foo
```


```python
#fooモジュールを明示的に再読み込みさせない（autoreloadのoption=なし,1,2に影響）
%aimport -foo
```

# 注意点
クラスのコンストラクタを変更した場合はうまく変更されない模様。

そんなときは

```python
%autoreload
```
すればよい
Nodebrewを使ってみる

###### node.jsのVersionを管理するNodebrewをインストールします。

**iTerm2 はHomebrewでインストール済み*

1.Nodebrewのインストール

``` command:iTerm
curl -L git.io/nodebrew | perl - setup
```

2.PATHの設定

``` command:iTerm
vi .bash_profile

export PATH=$HOME/.nodebrew/current/bin:$PATH
```

3.node.jsの各バージョンをインストール

``` command:iTerm
nodebrew install-binary stable
nodebrew install-binary latest
nodebrew ls
```

4.（参考）各バージョンのアンインストール

``` command:iTerm
nodebrew uninstall <version>
```

5.npmの動作確認

``` command:iTerm
nodebrew use v13.10.0
npm -v
```

6.npmによるパッケージのインストール　（検討中）

``` command:iTerm
#npm install -g grunt-cli
npm install -g gulp

#npm install -g webpack
npm install -g parcel-bundler
```
Symfony + Webpack Encore 0.21.0 (Webpack 4) で Asset Versioning & Hot Module Replacement

Webpack Encore が 0.21.0 になり、Webpack 4 に対応しました。生成したファイルの埋め込みは `asset()` ではなく専用の関数を使うことで、バージョニングや SplitChunks で分割されたファイルにも対応するようになりました。

参考

- [Encore 0.21.0: Webpack 4 Support, Copy Files Support, WebpackEncoreBundle](https://symfony.com/blog/encore-0-21-0-webpack-4-support-copy-files-support-webpackencorebundle)
- [Encore Installation (without Symfony Flex)](https://symfony.com/doc/current/frontend/encore/installation-no-flex.html)
- [Encore: Setting up your Project](https://symfony.com/doc/current/frontend/encore/simple-example.html)

## 手順

### アセットビルド設定

Webpack Encore は 0.21.0 以降をインストールする。(依存関係により Webpack 4 がインストールされる。)

    $ yarn add --dev @symfony/webpack-encore@^0.21.0

必要なローダーをインストールする。

    $ yarn add --dev node-sass sass-loader typescript ts-loader

webpack.config.js を設定する。(例)

    const Encore = require('@symfony/webpack-encore');
    Encore
        .setOutputPath('web/build/')
        .setPublicPath('/build')
        .setManifestKeyPrefix('build/')
        .addEntry('app', ['./assets/js/app.ts', './assets/css/app.scss'])
        .enableTypeScriptLoader()
        .enableSassLoader()
        .enableSourceMaps(!Encore.isProduction())
        .enableVersioning(Encore.isProduction())
        .enableSingleRuntimeChunk()
        .splitEntryChunks()
    ;
    module.exports = Encore.getWebpackConfig();

packages.json に追記

    {
        "scripts": {
            "build": "encore"
        }
    }

ビルドする

    $ yarn encore dev

プロダクションビルド

    $ yarn encore production

HMR

    $ yarn encore dev-server --hot

### HTMLに埋め込む

Webpack Encore Bundle をインストールする。

    $ composer require symfony/webpack-encore-bundle

app/AppKernel.php にバンドルを追加し、有効化する。

    class AppKernel extends Kernel
    {
        public function registerBundles()
        {
            $bundles = array(
                (略)
                new Symfony\WebpackEncoreBundle\WebpackEncoreBundle(),
            );
        }
    }

app/config/config.yml に Webpack でビルドされたパスを指定してあげる。

    webpack_encore:
        output_path: '%kernel.project_dir%/web/build'

Twig テンプレートに以下のように記述することで、ビルドされたファイル名が自動的に入ります。

    {% block stylesheets %}
       {{ encore_entry_link_tags('app') }}
    {% endblock %}

    {% block javascripts %}
        {{ encore_entry_script_tags('app') }}
    {% endblock %}
jsdoでblockly その9



#概要

jsdoでblocklyやってみた。
blocklyでobelisk積んでみた。

#写真

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/4d9aa98a-b56a-f337-b258-77c274d56b7c.png)

#スクリプト

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/254aabf0-3a62-64c6-1941-fb6e95c0755f.png)

#サンプルコード

```
var canvas = document.getElementById('canvas-demo');
var point = new obelisk.Point(200, 200);
var pixelView = new obelisk.PixelView(canvas, point);

var kame = function(pixelView) {
    this.pixelView = pixelView;
};
kame.prototype.say = function(text) {
    var cond = text.split(',');
    var p3d = new obelisk.Point3D(30 * cond[0], 30 * cond[1], (32 + 1) * cond[2]);
    var cubeDms = new obelisk.CubeDimension(30, 30, 32);
    var cubeColor = new obelisk.CubeColor().getByHorizontalColor(obelisk.ColorPattern.getRandomComfortableColor());
    var cube = new obelisk.Cube(cubeDms, cubeColor, false);
    this.pixelView.renderObject(cube, p3d);
};
var k0 = new kame(pixelView);
var demoWorkspace = Blockly.inject(document.getElementById('blocklyDiv'), {
    path: 'http://jeromeetienne.github.io/blockly-threex/apps/frame-edit/../../', 
    toolbox: document.getElementById('toolbox')
});
Blockly.Xml.domToWorkspace(Blockly.getMainWorkspace(), document.getElementById('startBlocks'));
function showCode() {
    Blockly.JavaScript.INFINITE_LOOP_TRAP = null;
    var code = Blockly.JavaScript.workspaceToCode(demoWorkspace);
    alert(code);
}
function runCode() {
    var code = Blockly.JavaScript.workspaceToCode(demoWorkspace);
    run(code);
}
function showXml() {
    var xml = Blockly.Xml.workspaceToDom(Blockly.getMainWorkspace());
    var code = Blockly.Xml.domToPrettyText(xml);
    var out = document.getElementById('output');
    alert(code);
    out.value = code;
}
window.run = function run(generatedCode) {
	commands = [];
	eval(generatedCode)
	setTimeout(function callback() {
		var command	= commands.shift()
		eval(command)
		if (commands.length === 0) return
		setTimeout(callback, stepDelay * 1000)
	}, 0)
}
var updateFcts = []
var commands;
var stepDelay = 0.5
var Turtle = {}
window.Turtle = Turtle
Turtle._say	= function(text) {
     k0.say(text);
}
Turtle.say = function(text) {
	commands.push('Turtle._say("' + text + '");');
}	


```

#成果物

http://jsdo.it/ohisama1/mNFJ

以上。
JavaScriptの関数の引数

#はじめに
JacaScriptの関数の引数が自由すぎて、よくわからなくなったので
整理するために書きました。

##普通に使う
関数が想定しているであろう値を渡す。

```javascript
function add(a, b){
    return a + b;
}

console.log(add(3, 5));         // 8
```

普通に行けます。

##型違い
型の指定がないので、こんなこともできてしまいます。

```javascript
function add(a, b){
    return a + b;
}

console.log(add('3', 5));       // 35
```
3+5ではなく3という文字と5という数字を連結させてしまい、結果35が出力されます。

##呼び出し側の引数が多い
引数を多く渡しても大丈夫です。

```javascript
function add(a, b){
    return a + b;
}

console.log(add(3, 5, 7, 9));   // 8 
```
ちなみに、引数は全てargumentsに保管されるため、a,bだけでは参照できなかった値も取得できます。

```javascript
function args(a, b){
    console.log('a ' + a);  // 3
    console.log('b ' + b);  // 5

    for(let i = 0, len = arguments.length; i < len; i++){
        console.log('arguments ' + arguments[i]); // 3, 5, 7, 9
    }
}
args(3, 5, 7, 9); 

```

##引数が足りない場合
呼び出し側の引数が足りない状態でも関数を呼べます。

```javascript
function add(a, b){
    console.log(b);             // undefined　　　　　　　　　　　　　　　　　　　　　　　　
    return a + b;
}

console.log(add(3));            // Nan
```
足りない引数は「undefined」となるようです。

また、引数にデフォルトの値を設定しておくと、足りない場合にはデフォルトの値を入れることもできます。

```javascript
function add2(a=0, b=0){
    console.log(b);             // 0
    return a + b;
}

console.log(add2(3))             // 3
```


##複数の値を可変長引数でまとめて受け取る
引数の前に「...」をつけると可変長の引数とすることが出来ます。

```javascript
function sum(...nums){
    let ret = 0;
    nums.forEach(value => ret = ret + value);
    return ret;
}
```
argumentsと違い、Arrayオブジェクトとして扱えます。

##名前つき引数を使用する
引数をオブジェクトリテラルで渡すことによって、受け渡し先が明確になります。
また、引数の順番も自由に変更できます。

```javascript
function show({name = '設定されていません', age = 0}){
    console.log('名前　' + name);   // 名前　Lowell
    console.log('年齢　' + age);    // 年齢　34
}

show({age : 34, name : 'Lowell'});
```

#まとめ
かなり自由度が高いため、気をつけてコーディングしないと思わぬバグを生み出しそうです。
VSCode の Markdown で数式を表示して PDF 化する

# インストール
以下の拡張機能をインストールします。

* [Markdown+Math](https://marketplace.visualstudio.com/items?itemName=goessner.mdmath)  
Markdown のプレビューで数式を表示できるようにする
* [Markdown PDF](https://marketplace.visualstudio.com/items?itemName=yzane.markdown-pdf)  
Markdown を PDF で出力できるようにする

# 数式をPDFで出力できるようにする
Markdown PDF では数式を出力することができません。
今回は Markdown PDF のテンプレートファイルを書き換えて対応しました。

Markdown+Math が数式の表示に KaTeX を使っているため、Markdown PDF でも KaTeX を使うようにします。
コマンドパレットで `> Extensions: Open Extensions Folder` すると拡張機能フォルダを開くことができます。

```javascript:markdown-pdf-x.x.x/template/template.html
<!DOCTYPE html>
<html>
<head>
<title>{{{title}}}</title>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
{{{style}}}
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/katex.min.css" integrity="sha384-9eLZqc9ds8eNjO3TmqPeYcDj8n+Qfa4nuSiGYa6DjLNcv9BtN69ZIulL9+8CqC9Y" crossorigin="anonymous">
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/katex.min.js" integrity="sha384-K3vbOmF2BtaVai+Qk37uypf7VrgBubhQreNQe9aGsz9lB63dIFiQVlJbr92dw2Lx" crossorigin="anonymous"></script>
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/contrib/auto-render.min.js" integrity="sha384-kmZOZB5ObwgQnS/DuDg6TScgOiWWBiVt0plIRkZCmE6rDZGrEOQeHM5PcHi+nyqe" crossorigin="anonymous"></script>
<script>
  document.addEventListener("DOMContentLoaded", () => {
    renderMathInElement(document.body, {
      delimiters: [
        { left: "$$", right: "$$", display: true },
        { left: "$", right: "$", display: false },
      ]
    });
  });
</script>
</head>
<body>
{{{content}}}
</body>
</html>
```

# PDF に変換する

あとは普通に `> Markdown PDF: Export` するだけで、数式も含んだ PDF に変換することができます。
一度 html を経由するので、png や jpeg でエクスポートしても数式が変換されます。

# 最後に

テンプレートファイルを書き換えるのがちょっと無理矢理感があります。
もっといい方法があればぜひ教えてください。
AWS リージョン一覧

すぐ忘れるので

| コード | 名前 |
|:--|--:|
| us-east-1 | 米国東部（バージニア北部） |
| us-east-2| 米国東部 (オハイオ) |
| us-west-1 |米国西部 (北カリフォルニア) |
| us-west-2 |米国西部 (オレゴン) |
| ca-central-1 |カナダ (中部) |
| eu-central-1 |欧州 (フランクフルト) |
| eu-west-1 |欧州 (アイルランド) |
| eu-west-2 |欧州 (ロンドン) |
| eu-west-3 |EU (パリ) |
| ap-northeast-1 |アジアパシフィック (東京) |
| ap-northeast-2 |アジアパシフィック (ソウル) |
| ap-northeast-3 |アジアパシフィック (大阪: ローカル) |
| ap-southeast-1 |アジアパシフィック (シンガポール) |
| ap-southeast-2 |アジアパシフィック (シドニー) |
| ap-south-1 |アジアパシフィック (ムンバイ) |
| sa-east-1 |南米 (サンパウロ) |
エンジニアに一番おすすめなmacOSでのメモアプリQuiverについて

# はじめに
エンジニアをはじめ、これからエンジニアになりたいという人におすすめしたいアプリがあります。
僕はプログラミングの勉強やコードレビューで指摘された点をメモを取って定期的に見返すようにしています。
これには以下の効果があります。

- 構造化することで全体を俯瞰的に捉えることができる
- メモをとる段階で読むだけよりも記憶に定着しやすい
- 見返したときにさらに記憶に定着する

[![Image from Gyazo](https://i.gyazo.com/44ca80f5fef5226bb0957c602f2993b4.png)](https://gyazo.com/44ca80f5fef5226bb0957c602f2993b4)

人間忘れる生き物なのでメモをこまめに取って定期的に見返していきましょう。

以前インターンしていたときに、社員の方に「ミスをすることは仕方ないけど、一度したミスや指摘されたコードレビューは2回目に指摘されないようにしよう。」と言われたのがしっかりとメモを取り始めたきっかけでした。
他人の時間を奪わないというのは仕事でとても大切です。

今回は`気軽にメモができて気軽に見返せる`という部分にフォーカスしてアプリをおすすめします。

# Quiver

[![Image from Gyazo](https://i.gyazo.com/d5f307437c56fd347ea432cfb5382f77.png)](https://gyazo.com/d5f307437c56fd347ea432cfb5382f77)

http://happenapps.com/

製品版は1200円ですが、トライアル版でも十分使えます。
僕はトライアル版でずっと使っています。
日本語のチュートリアルもありますがおすすめする理由を僕なりにまとめます。

[Quiverをはじめよう](https://github.com/HappenApps/Quiver/wiki/Quiver%E3%82%92%E3%81%AF%E3%81%98%E3%82%81%E3%82%88%E3%81%86)

# こんなことができます
こちらが実際に僕が使っているQuiverの画面です。
[![Image from Gyazo](https://i.gyazo.com/ed8ef94ec050f87d78b8eb3b6970be87.jpg)](https://gyazo.com/ed8ef94ec050f87d78b8eb3b6970be87)
Paneで3つに区切られていて(編集とプレビューで1つのまとまり)左からフォルダを選択して、その右でメモを選択し、その右で編集をするとプレビューが表示されます。
普段は一番左のPaneは非表示にしているのでメモを選択してササッと編集して、すぐにプレビューで確認できます。

## 動きが軽い
以前はmemoフォルダを作ってさらに用途別にフォルダを作り、Atomで開発用のリポジトリと一緒に読み込んでメモしていたのですが動作が遅かったり、別フォルダのメモを見たくなったときにいちいち読み込んだりしてタブを複数開く原因になっていました。
しかし、Quiverではクリックひとつでメモを行き来できて、動作も軽いのでメモに対する心理的な敷居が下がりました。
またタブという概念がないため自分が編集しているファイルのみに集中できるのが強みです。

## 5種類のセル
Quiverには5種類のセルがあります。

- テキストセル
- コードセル
- Markdownセル
- LaTeXセル
- ダイアグラムセル

コードもMarkdownも数式もシーケンス図も綺麗に書けます。
コードのシンタックスハイライトが効いて見やすくなるのでエンジニアには特にこの点でおすすめです。

## 画像やファイルへのリンク
`Format > Insert Image`からノート内部に画像を保存して参照することができますので、ネット上から画像が消えても大丈夫です。
また、他のノートへのリンクを作成したり、URLを自動検出してリンクにできます。

## クラウド管理
`Preferences > Sync`からクラウド上での管理も設定できます。

## エクスポート
HTML、Markdown、PDFでのエクスポートが可能なのでGithubやQiitaなどMarkdownを使用する場合には、最初はノートでメモ程度に書いておいてあとでエクスポートして投稿するということが可能です。

## 全文検索
右上の虫眼鏡マークから気軽に全文検索できます。
ノートの量が膨大になってくるとどこに何があるかわかりづらくなりますが、検索が早いので無駄なことを覚えておかずにすぐに検索に頼ることができます。

## テーマ
メモアプリでテーマを変えられるものは少ないと思います。
Quiverには多くはありませんがサードパーティのテーマがあります。
[こちら](https://github.com/HappenApps/Quiver/wiki/Themes)からビルトイン以外のテーマをダウンロードすることができます。
他に探して見たのですが、いいものが見つかりませんでした。
色々試しましたが、最適解は下の方にある`Jetbrains darkula`です。（見やすい黒背景にシンタックスハイライトの配色もよく、カーソルが青色で見やすい。）
JSON形式でダウンロードしてから`Preferences > Themes`から`Load Theme...`してください。

# 終わりに
Better Touch ToolでCmd + Shift + QにQuiverを割り当てることでコードを書くこととメモを取ることを思考を切らさずにできますので、ぜひお試しください。

- Quiverをダウンロード
- ThemeをJetbrains darkulaにする
- Cmd + Shift + QにQuiverを割り当てる

これで最強のメモマスター！！！！


最近Qiitaの記事の質について議論する声がありますが、公開するまでもない自分用のメモはこうして管理することができるという参考の一つになれば幸いです。
UbuntuにCUDAをインストールする方法

前回、UbuntuにNVIDIAドライバをインストールしたので、今回はCUDAをインストールしてみました。



#前準備

```
~$ sudo apt update
~$ sudo apt upgrade
```


#CUDAのインストール

```
~$ sudo dpkg -i cuda-repo-ubuntu1704-9-0-local_9.0.176-1_amd64.deb
~$ sudo apt-key add /var/cuda-repo-9-0-local/7fa2af80.pub
~$ sudo apt-get update
~$ sudo apt-get install cuda
~$ sudo apt-get install nvidia-384
~$ sudo reboot
```
#PATHの設定
~/.bashrcの末尾に以下を追加する。

```
export PATH=/usr/local/cuda-9.0/bin:${PATH}
export LD_LIBRARY_PATH=usr/local/cuda-9.0/lib64:${LD_LIBRARY_PATH}
```
#PATHの確認

```

~$ echo $PATH    # /usr/local/cuda-9.0/bin'
~$ echo $LD_LIBRARY_PATH  # '/usr/local/cuda-9.0/lib64'
~$ which nvcc    # '/usr/local/cuda-9.0/bin/nvcc'
~$ nvidia-smi    # nvidiaのGPUの情報が表示される
```
JavascriptでHTML要素の長押しを検知して何かする


WebサイトやUI作成時に使えるようメモ。JavascriptのバージョンはES2015。


#1　サンプル
上矢印を長押ししている間、数値を１ずつカウントアップ、下矢印は同様にカウントダウン。
<p data-height="265" data-theme-id="0" data-slug-hash="wQmyaO" data-default-tab="js,result" data-user="snst-lab" data-pen-title="wQmyaO" class="codepen">See the Pen <a href="https://codepen.io/snst-lab/pen/wQmyaO/">wQmyaO</a> by snst.lab (<a href="https://codepen.io/snst-lab">@snst-lab</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>


#2　関数の定義
```javascript

/**
* @function HTMLElement.prototype.hold　要素の長押しを検知し、何かする
*/
if(!HTMLElement.prototype.hold){
    Object.defineProperty(HTMLElement.prototype, 'hold', {
        configurable: true,
        enumerable: false,
        writable: true,
        /**
        * @function callback　長押し判定後に行われる何かの処理
        * @int holdtime 長押し判定時間のしきい値(ミリ秒)
        */
        value: function(callback,holdtime) {
            this.addEventListener('mousedown', function (event) {
                event.preventDefault();
                callback(); //event.preventDefaultでクリック等のイベントが解除されてしまうので、要素初タッチ時にも処理を行うようcallbackを設置しておく。
                let time = 0;
                const interval = setInterval(function(){
                  time += 100;
                  if(time > holdtime){
                    callback();
                  }
                },100);
                this.addEventListener('mouseup', function (event) {
                  event.preventDefault();
                  clearInterval(interval);
                });
            });
        }
    });
}

```
スマホやタブレットのタッチにも反応させる場合は、上記のイベントリスナでmousedown→touchstart、mouseup→touchendとしたものをvalue()メソッド内に追加する。

#3　使い方
###HTML
```html
<div class='number'>100</div>
<div class='arrow up'></div>
<div class='arrow down'></div>
```


###Javascript

```javascript
const number = document.querySelector('.number');
const up = document.querySelector('.up');
const down  = document.querySelector('.down');

//上矢印を長押ししている間、数値をカウントアップ
up.hold(()=>{number.textContent = +number.textContent+1;},1000);
//下矢印を長押ししている間、数値をカウントダウン
down.hold(()=>{number.textContent = +number.textContent-1;},1000);
```
UbuntuにcuDNNをインストール


メモとして残しておきます。



**cuDNN**とは

NVIDIAが公開しているDeep Learning用のライブラリである。このライブラリを使うとCaffeやChainerなどのDeep Learning用のソフトウェアの速度が向上する。 



#cuDNNのインストール


以下のリンクからダウンロード

*アクセスするにはメンバー登録が必要である

cuDNN  https://developer.nvidia.com/rdp/cudnn-download

具体的にはdebパッケージ３つをダウンロード
・runtime library
・developer library
・code samples and user guide

CUDA https://developer.nvidia.com/cuda-80-ga2-download-archive


```
~$ sudo dpkg -i libcudnn7_7.4.1.5-1+cuda9.0_amd64.deb
~$ sudo dpkg -i libcudnn7-dev_7.4.1.5-1+cuda9.0_amd64.deb
~$ sudo dpkg -i libcudnn7-doc_7.4.1.5-1+cuda9.0_amd64.deb
```
 
cuDNNのライブラリをCUDAがインストールされているディレクトリにコピーする。


```
~$ tar xvf cudnn-9.0-linux-x64-v7.4.15.tgr
~$ sudo cp -a cuda/include/cudnn.h /usr/local/cuda/include/
~$ sudo cp -a cuda/lib64/libcudnn* /usr/local/cuda/lib64/
~$ sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*
~$ cp -r /usr/src/cudnn_samples_v7/ $HOME
~$ cd $HOME/cudnn_samples_v7/mnistCUDNN
~$ make clean && make
```

これだとエラーが出たので以下のコマンドを実行


```
~$ sudo apt install gcc-6
~$ sudo apt install g++-6

~$ sudo ln -s /usr/bin/gcc-6 /usr/local/cuda/bin/gcc
~$ sudo ln -s /usr/bin/g++-6 /usr/local/cuda/bin/g++
~$ cd $HOME/cudnn_samples_v7/mnistCUDNN
~$ make clean && make
./mnistCUDNN
```


+αとしてcudaのversionアップの方法である

```
~$ sudo apt-key add /var/cuda-repo-9-2-local/7fa2af80.pub
~$ sudo apt-get update
~$ sudo apt-get install cuda
```

*/usr/local/にインストールしたcudaがあります。

~/.bashrc の内容を現在のversionに書き換え

```
~$ sudo vim ~/.bashrc
~$ source ~/.bashrc
```
Dart の BuildRunner を使ってみよう  その1

何回かに分けて、 Dart の BuildRunner を、見ていきます。

BuidRunnerを使う事によって、ビルド時にアレコレ操作できるようになります。

例えば、Vue.dartなどの、アノテーションを利用した言語の拡張
https://github.com/kirbyfan64/vuedart

```dart
@VueComponent(template: '<p>{{uppercaseName}}</p>')
class ShowName extends VueComponentBase {
  ShowName(context): super(context);

  @prop
  String name;

  @computed
  String get uppercaseName => name.toUpperCase();
}
```


例えば、sass_builder のように、 scss から css を生成したり
https://github.com/dart-league/sass_builder.git

```dart

```

そう行った事ができるようになります。

# はじめに

Dart Advent 2018 の 1日目の記事です。

1日目ということで、 最初に実行するのは、Dart関連のコマンドはビルドかなと
思い、「Dartのビルドシステム について解説」をする事にしました。

まぁ、 よーく考えたら、pub コマンドだったかな..
とも、思いましたが


# 解説する事

build_runner について解説します。
https://github.com/dart-lang/build


しかし、 annotation など、少し複雑な事をしようとすると、
build package だけを理解しても難しいです。


package:analyzer
package:source_span
package:source_maps

といった、ものの理解も必要です。

これらについて解説していきます。


# 1回目 は、 package:build の使い方
https://github.com/dart-lang/build

1回目では、 build runner 向けのコードを書いて、走らせるまでを、
紹介していきます。

build_runnerが走ると、変換処理が走ります。

- 変換対象のファイルを指定する
- 変換対象のファイルを呼び出して、アレコレ処理する

この2つを実際に試してみます。

https://github.com/kyorohiro/dart.test.build_runner/tree/master/hello


```dart:lib/builder.dart
import 'package:build/build.dart';
import 'dart:async';

Builder helloBuilder(BuilderOptions options) {
  return new HelloBuilder();
}

class HelloBuilder implements Builder {
  // 変換する
  // 今回は、ログ表示するだけ
  FutureOr<void> build(BuildStep buildStep) async {
    print(">> ${buildStep.inputId}");
  }

  // 対象のファイルを指定する
  Map<String, List<String>> get buildExtensions {
    return {".dart": const [".g.dart"]};
  }
}
```

こんな感じで書けます。


また、　Builder の Factory がある場所を指定してあげます。

```yaml:build.yaml
builders:
  helloBuilder:
    import: "package:hello/builder.dart"
    builder_factories: ["helloBuilder"]
    build_extensions: {".dart": [".g.dart"]}
    build_to: source
    auto_apply: root_package

```


で、完成。
実際に使ってみましょう。

https://github.com/kyorohiro/dart.test.build_runner/tree/master/hello_test

pubspec.yaml の dependecies に 作成した物を追加して

```
dev_dependencies:
  hello:
    path: ../hello
  build_runner: any
```

以下のコマンドを叩くと、 ビルド対象の xxx.dart といったコードを一覧表示してくれます。

```
pub run build_runner clean
pub run build_runner build
```

終わり。


# 次回

package:analyzer について解説します。
その５くらいで、 annotation を利用して、アレコレできるようになる予定です。
Minecraft Forge エラー: この文字は、エンコーディングMS932にマップできません

とある日、Minecraft Forgeの1.2.5でModdingをして完成したのでリコンパイルを実行すると

```
エラー: この文字は、エンコーディングMS932にマップできません
```

というエラーが出てしまいました。これは文字コードの設定を間違えると起きてしまうエラーです。

Minecraft 1.6.4以前のみの対処法です。

##対処法
Javaはコンパイル時にファイルの文字コードを設定するオプションがあるので使います。
javaファイルはUTF-8でエンコードされている前提です。

まずはmcpディレクトリのconfフォルダを開いてください。
その中に「mcp.cfg」というファイルがあります。
ファイルをテキストエディタで開くと下の方に

```mcp.cfg
CmdRecomp     = %s -Xlint:-options -deprecation -g -source 1.6 -target 1.6 -classpath "{classpath}" -sourcepath {sourcepath} -d {outpath} {pkgs}
```

という行があると思います。その部分をこのように書き換えてください

```mcp.cfg
CmdRecomp     = %s -encoding UTF-8 -Xlint:-options -deprecation -g -source 1.6 -target 1.6 -classpath "{classpath}" -sourcepath {sourcepath} -d {outpath} {pkgs}
```

-encoding UTF-8を書き加えました。
保存してもう一度リコンパイルするとエラーが消えてるはずです。
Google Sheetsで株価を扱う

ポートフォリオ管理を自動化したいと思って調べてみました。

テンセント100株を香港ドルから円に変換して表示

```
=GoogleFinance("HKG:0700") * 100 * GoogleFinance("currency:hkdjpy")
```

日本株はGoogleFinanceで取ってこれないみたいなので、野村のページを使うことにしました。（優先株も見れるのがよい）

たとえば、伊藤園優先株(TYO:25935)100株

```
=ImportXml("http://quote.nomura.co.jp/nomura/cgi-bin/parser.pl?QCODE=25935&TEMPLATE=nomura_tp_kabu_01", "//span[@class='stock_summary-number'][1]" ) * 100
```
【Unity】Version 1.ショットガンから球を発射

<font color="Magenta">Version 1. ショットガンから球を発射。</font>
Assetsストアから「Survival Shooter Tutorial」素材を使ってお勉強中！

環境メモ
⭐️Mac OS Mojave バージョン10.14
⭐️Unity 2018.2.15f1

<script async src="https://twitter.com/nonnonkapibara/status/1065776198347710464" charset="utf-8"></script>

実際に動かした動画はこちら↓↓
https://twitter.com/nonnonkapibara/status/1065776198347710464

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Version 1. ショットガンから球を発射🐭<br>Assetsストアから⭐️「Survival Shooter Tutorial」⭐️素材を使ってお勉強中！<br>（●＾o＾●）ｖ<a href="https://twitter.com/hashtag/Unity?src=hash&amp;ref_src=twsrc%5Etfw">#Unity</a> <a href="https://twitter.com/hashtag/unity3d?src=hash&amp;ref_src=twsrc%5Etfw">#unity3d</a> <a href="https://twitter.com/hashtag/VR?src=hash&amp;ref_src=twsrc%5Etfw">#VR</a> <a href="https://t.co/kaJSb6YVTd">pic.twitter.com/kaJSb6YVTd</a></p>&mdash; non (@nonnonkapibara) <a href="https://twitter.com/nonnonkapibara/status/1065776198347710464?ref_src=twsrc%5Etfw">2018年11月23日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


#<font color="Magenta">Qiitaの容量オーバーで画像が貼り付けられなくなりました。（errorとなる）</font>

続きは、こちらに記載してます↓
[かぴばらさんの覚書ブログ nonkapibara](https://nonkapibara.hatenablog.com/entry/2018/11/23/101808)
sympyで「連立微分方程式(Simultaneous differential equation)」をやってみた

何かいい方法があれば教えて下さい。
#①やさしい連立微分方程式＞1.1 具体的に解いてみよう
http://hb3.seikyou.ne.jp/home/E-Yama/renDE.pdf

```fullscript.py
from sympy import *
var('C1 C2')
t = symbols('t')
x1, x2 = symbols('x1, x2', cls=Function)
eq = (Eq(x1(t).diff(t),4*x1(t)-2*x2(t)), Eq(x2(t).diff(t),x1(t)+x2(t)))
ans=dsolve(eq)
f=ans[0].rhs.subs( C1,-C1/2).subs( C2,-C2)
g=ans[1].rhs.subs( C1,-C1/2).subs( C2,-C2)
print("#x1=",f)
print("#x2=",g)
#x1= C1*exp(2*t) + 2*C2*exp(3*t)
#x2= C1*exp(2*t) + C2*exp(3*t)
# in dsolve raise NotImplementedError
NotImplementedError
```

#②線形代数II/連立線形微分方程式＞1階連立線形微分方程式
https://dora.bk.tsukuba.ac.jp/~takeuchi/?%E7%B7%9A%E5%BD%A2%E4%BB%A3%E6%95%B0II%2F%E9%80%A3%E7%AB%8B%E7%B7%9A%E5%BD%A2%E5%BE%AE%E5%88%86%E6%96%B9%E7%A8%8B%E5%BC%8F

```fullscript.py
from sympy import *
var('a b c d')
t = symbols('t')
x1, x2 = symbols('x1, x2', cls=Function)
eq = (Eq(x1(t).diff(t),a*x1(t)+b*x2(t)), Eq(x2(t).diff(t),c*x1(t)+d*x2(t)))
ans=dsolve(eq)
print(ans)
# TypeError: cannot determine truth value of Relational
```

```fullscript.py
from sympy import *
var('a b c d')
t = symbols('t')
x1, x2 = symbols('x1, x2', cls=Function)
var('C1 C2')
a=3
b=1
c=1
d=3
eq = (Eq(x1(t).diff(t),a*x1(t)+b*x2(t)), Eq(x2(t).diff(t),c*x1(t)+d*x2(t)))
ans=dsolve(eq)
# print(ans)
f=ans[0].rhs
g=ans[1].rhs
dict=solve([Eq(f.subs(t,0),6), Eq(g.subs(t,0),2)], [C1, C2])
f=f.subs( [ ( C1, dict[C1] ), ( C2, dict[C2] ) ] )
g=g.subs( [ ( C1, dict[C1] ), ( C2, dict[C2] ) ] )
print("#f=",f)
print("#g=",g)
#f= 4*exp(4*t) + 2*exp(2*t)
#g= 4*exp(4*t) - 2*exp(2*t)
```

#③線形代数II/連立線形微分方程式＞2階連立線形微分方程式
https://dora.bk.tsukuba.ac.jp/~takeuchi/?%E7%B7%9A%E5%BD%A2%E4%BB%A3%E6%95%B0II%2F%E9%80%A3%E7%AB%8B%E7%B7%9A%E5%BD%A2%E5%BE%AE%E5%88%86%E6%96%B9%E7%A8%8B%E5%BC%8F

```fullscript.py
from sympy import *
var('a b c d')
t = symbols('t')
k = symbols('k')
m = symbols('m')
x1, x2 = symbols('x1, x2', cls=Function)
var('C1 C2')
eq = (Eq(m*diff(x1(t),t,2),-k*x1(t)-k*(x1(t)-x2(t))),Eq(m*diff(x2(t),t,2),-k*x2(t)-k*(x2(t)-x1(t))) )
ans=dsolve(eq)
print(ans)
# sympy.polys.polyerrors.PolynomialError: only univariate polynomials are allowed
```
Vue.jsのコンポーネントがわからなかったからこう理解した

## Abstract

Vue.jsの[公式ドキュメント](https://jp.vuejs.org/v2/guide/index.html)は非常にわかりやすいのですが、それでもコンポーネントの理解ができなかったので自分なりにこう理解したというメモです。

そしてこの記事を書いている時には理解ができているので
なんでこんな事で悩んだんだろうという気持ちです。

## 公式の説明

[公式ドキュメント](https://jp.vuejs.org/v2/guide/index.html)より

```html
<div id="app-7">
  <ol>
    <!-- 
      各 todo-item の内容を表す todo オブジェクトを与えます。
      これにより内容は動的に変化します。
      また後述する "key" を各コンポーネントに提供する必要があります。
    -->
    <todo-item v-for="item in groceryList" v-bind:todo="item"></todo-item>
  </ol>
</div>
```

```js
Vue.component('todo-item', {
  props: ['todo'],
  template: '<li>{{ todo.text }}</li>'
})

var app7 = new Vue({
  el: '#app-7',
  data: {
    groceryList: [
      { id: 0, text: 'Vegetables' },
      { id: 1, text: 'Cheese' },
      { id: 2, text: 'Whatever else humans are supposed to eat' }
    ]
  }
})

```

## 何がわからなかったか

```html
    <todo-item v-for="item in groceryList" v-bind:todo="item"></todo-item>
```
この一文です。

```html
v-for:item in groceryList
```
これを書けばループになるので

```html
v-bind:todo="item"
```
は不要なのではと思ったのです。
今考えるとほんと何なのか。

## こう考えた
こういう流れで分解されているのではと考えました


### 1
最初の状態

```html
<div id="app-7">
  <ol>
    <todo-item v-bind:todo="item" v-for="item in groceryList"></todo-item>
  </ol>
</div>
```

### 2
まずtodo-itemが指定したtemplateの中身に置換される

```html
<div id="app-7">
  <ol>
    // v-bind:todo="item" v-for="item in groceryList"
    <li>{{ todo.text }}</li>
  </ol>
</div>
```

### 3
残ったプロパティのループが上にきて
その下にtodoにitemをバインドする
ループも閉じられている

```html
<div id="app-7">
  <ol>
    // v-for="item in groceryList"
    // v-bind:todo="item"
    <li>{{ todo.text }}</li>
    // end for
  </ol>
</div>
```

### 4
完成

```html
<div id="app">
  <ol>
    <li>Vegetables</li>
    <li>Cheese</li>
    <li>Whatever else humans are supposed to eat</li>
  </ol>
</div>
```

## 理解できた気がする

この先さらにこのポーネントを活用していく事になると思いますが
この度の考え方を利用して、精進していこうと思います。
最速で最小構成のLaTeX環境をVSCodeに構築する

# はじめに
僕の研究室では毎週のミーティングで前週の進捗報告をLaTeXで作成して提出しています。
理系なら少なくとも卒論などで触るでしょう。
最近エディタをAtomからVSCodeに変えたのですが、LaTeX環境をVSCode上に構築するのに手こずったので「明日進捗報告しなきゃいけないのに！」とか「家で卒論書きたい！」という人のために記事にします。
目指すのはVSCodeでtexファイルを編集するとコンパイルが行われ、別タブ内で最新のPDFが表示される状態です。
# 前提
- macOS(おそらくWindowsでも変わらずできますので安心して下さい。)
- VSCodeがインストールされている
- upLaTeXを使う(理由については[こちら](http://zrbabbler.sp.land.to/uplatex.html)を参照)
    - テンプレートが古い場合、platexで無いと動かないので[こちら](https://qiita.com/keisukesato-ac/items/e0de3ada8960a6b69a69#_reference-8c4c9c8ee0fae8769c14)の記事を参考に進めてください。

# 手順
## 1.TeX Liveのインストール
https://texwiki.texjp.org/?TeX%20Live#w628bee6
OSに合ったTeX Liveをインストールして下さい。
## 2.VSCodeの拡張機能インストール
拡張機能の「LaTeX」を検索してインストールして下さい。
## 3.setting.jsonに追記
setting.jsonを開き以下を追記して下さい。

```setting.json
  "latex-workshop.latex.tools": [{
      "name": "ptex2pdf (uplatex)",
      "command": "ptex2pdf",
      "args": [
        "-l",
        "-u",
        "-ot",
        "-kanji=utf8 -synctex=1",
        "%DOC%"
      ]
    },
  ],
  "latex-workshop.latex.recipes": [
    {
      "name": "ptex2pdf (uplatex) *2",
      "tools": [
        "ptex2pdf (uplatex)",
        "ptex2pdf (uplatex)"
      ]
    },
  ],
  "latex-workshop.synctex.afterBuild.enabled": true,
  "latex-workshop.view.pdf.viewer": "tab"
```
これで環境は整いました。
# 使い方
## テンプレート
```report.tex
\documentclass[uplatex]{jsarticle}
\usepackage[dvipdfmx]{graphicx}
\title{進捗報告}
\author{テスト}
\date{11月 23日}
\begin{document}
\maketitle
\begin{itemize}
  \item 進捗
  \begin{itemize}
    \item 起床した
    \item 朝ごはんを食べた
    \item 歯磨きをした
    \item 歯医者に行った
    \item お昼ご飯を食べた
    \item 研究室に出社した
    \item データを取った
  \end{itemize}
  % \item 今後の予定
  %   \begin{itemize}
  %   \item 実験の方針を決める
  %   \end{itemize}
\end{itemize}
\end{document}
```
`documentclass`に`uplatex`を指定する必要があります。
## コンパイル
texファイルからpdfファイルへのコンパイルは保存するだけで自動で行ってくれます。
試しに上のテンプレートを保存してみて下さい。
同じフォルダに他のファイルができたと思います。その中にpdfファイルがあります。
ただ、pdfファイルをVSCodeで直接開くとtexファイルが閉じられるので右上の虫眼鏡マークから開いて下さい。
[![Image from Gyazo](https://i.gyazo.com/1a1648b83dcc8ae2a245e3468ab88b13.gif)](https://gyazo.com/1a1648b83dcc8ae2a245e3468ab88b13)
別のタブでPDFが開かれるはずです。
これでtexファイルを変更して保存するたびにPDFが同期して最新のものにコンパイルして表示されるようになりました。
お疲れ様でした。
BitchXの使い方

ZRouterの連絡網がirc(#zouter)なのでircクライアントを物色してみて、依存が少なかったのでBitchXをZRouterでビルドできるようにしてみたので、使い方のメモです。

![スクリーンショット（2018-11-23 19.24.39）.png](https://qiita-image-store.s3.amazonaws.com/0/104066/1905f9d6-367a-85e5-3f20-c73d4f62d489.png)

起動

```
# /usr/local/bin/BitchX <nicname>
```

いくつかのサーバに接続を試します。

チャンネルに入る

```
/join <channel>
```

チャンネルの参加者の一覧

```
/who
```

AWAYステータスオフ

```
/away
```

終了する

```
/quit
```

プライベートメッセージを送る

```
/msg <nic name> <message>
```

上スクロールを^xキーに設定

```
/bind ^x SCROLL_FORWARD
```

下スクロールを^eキーに設定

```
/bind ^e SCROLL_BACKWARD
```

プライベートメッセージを受けるとLEDが点灯して、ledoffコマンドで消せるようにしてみました。

```
ON ^msg "% *" {
exec gpioctl 8 0
echo [$0] $1
}

alias ledoff {exec gpioctl 8 1}
```

tmux上で起動する場合は以下を設定

```
# TERM=xterm
```

設定をrcファイルに書いて読み込ませるときには/を抜いて書きます。

tmux上で起動して抜ける場合は^b+dです。何もせずウインドを閉じても大丈夫です。

復帰のときは

```
# /usr/local/bin/tmux a
```

ちなみにBitchX+tmuxはちょっと重いみたいだったので、MT7620で動かしています。BitchXはおそらく日本語は使えません。

これまでMacのircクライアントを使っていたのですが、Macを起動していて接続中しかメッセージが見れず、時間帯が違う人と連絡するには不便なため、BitchX+tmuxで常時接続環境を作ってみました。

irssiというクライアントはglibの依存があり、weechatはcurlの依存があり、いろいろなライブラリが必要になり、断念しました。

今さらBitchXという気もしますが、IPv6対応もされていて結構使えるような気がします。

参考

https://www.electricmonk.nl/docs/bitchx_tutorial/bitchx_tutorial.html

https://wiki.troulite.fr/index.php/BitchX.html
Dockerの気持ちをまとめてみる

#前置き
Dockerは使い捨て出来るくらい気軽に仮想環境を作れるツールです。Qiitaも含めて様々なサイトにチュートリアルはあります。
しかし、いきなりDockerfile作成から入っていたり、とりあえず環境を作れるコードを公開しているだけだったりで、Dockerの理解に役立つ記事というか、Dockerの挙動が理解しやすい記事を見つけられなかったので、書いています。

#対象
将来の自分
Dockerを使ってみたいけど、そもそもなんだかわからない人
Dockerを使ってみたけど、何が便利だかわかっていない人

#イメージとコンテナ
イメージはクラスでコンテナはインスタンスのようなイメージです。
docker hubからイメージ（設計図）を取ってきて、コンテナをcreateして、コンテナを起動して、（いろいろして、）コンテナを停止して、コンテナを削除するのがdockerコンテナの一生です。
このイメージを作るときにdocker hubから取ってきたものそのままじゃなくて、少し編集することができます。その時につかうのがDockerfile。

- 起動しているコンテナ一覧取得

```docker container ls
```
これでcontainerID, image, command, created, status, ports, namesが得られる。
containerID: コンテナごとに一意に与えられている番号.```docker start (containerID)```でコンテナを起動できる
image: このコンテナを作るのに使ったイメージ名
names: コンテナの名前

- イメージ一覧取得
- 
```docker images
```
repository・tag・imageID・created・sizeが得られる。
repositoryを無事作れたことの確認につかうことが多い
C#でLINE Messaging APIを使用する（参考URL集）

タイトルのとおりです。
個人的なメモとして書いていますので、くだらない記事を読んだと怒らないようお願いします。

#どんなメッセージが送れるか
https://developers.line.biz/ja/docs/messaging-api/message-types/

#.NET版のAPI
https://github.com/pierre3/LineMessagingApi

#テンプレートプロジェクト（.NET Core）
node.jsからyoコマンドでテンプレートプロジェクトを作成する
https://qiita.com/kenakamu/items/e0b194a82e4141b30c95

#テンプレートプロジェクト（.NET Framework）
マーケットプレイスに公開されている
https://marketplace.visualstudio.com/items?itemName=pierre3.LINEBotCSharpTemplate

#実装サンプル
https://github.com/pierre3/LineMessagingApi/tree/master/WebAppSample
エンジニア三大美徳 良い怠惰 「有給休暇を消化したいからチームを育てる」

# 悪い勤勉

- 自分で何でもやってしまうあるある
- 真面目すぎて視野狭窄でチーム全体もプロジェクト全体も見えていない
- 自動化とかしないから、いつまでも人為ミスがなくならない NO!

# 良い怠惰

- 人にとにかく親切に教える、情報共有する
- 戦略的にストーリーをスケジューリングする
- 緊急対応などが起こらないように慎重にメンテナンス作業を進める

# 全ては有給休暇消化のため！

- 休みがなければ人間ではない
- 細胞レベルで楽しいと思えなければエンジニアリングではない
- 趣味でゲームなどやれなければ生きている価値がない


# Next?

[三大美徳 yumainaura - Google Search](https://www.google.co.jp/search?q=%E4%B8%89%E5%A4%A7%E7%BE%8E%E5%BE%B3+yumainaura&oq=%E4%B8%89%E5%A4%A7%E7%BE%8E%E5%BE%B3+yumainaura&aqs=chrome..69i57.3302j0j7&sourceid=chrome&ie=UTF-8)

# 良い怠惰エンジニアの素晴らしいイメージ画像

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/b3bde39e-ec3b-0d6b-c604-9076457af9c5.png)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ポップアップは好き？嫌い？

# UI UX デザインの話

エンジニアの方、聞こえてますかーーー！

# 大嫌い。

モダンモダンなMediumでさえTwitter連携でポップアップする仕様に変わった時代に僕らはどうやって生きていけばよいのか。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/f731d204-e29a-f24a-5dae-7e3016b219ee.png)

# なぜ嫌いか説明できる？

- 理屈っぽく説明できる？
- 「なんか嫌だから」で済ませてない？

# 嫌いな理由は

- ユーザーの注意力を著しく損なうから、絶望的に、それはもう
- 注意力が奪われたユーザーは、アプリケーションでおこなおうとしたアクションに戻るまで数秒から十数秒もかかるだろう
- 単にポップアップが表示された時間の問題ではない、ユーザー「人間」の「脳の意識状態」に波紋を投げかけて変えてしまう

# 秒の価値

- たとえば2秒3秒の「ユーザーの注意力のロス」でも、これはインターフェイスや人間の脳視点で見ると、永遠にも近い時間
- これが繰り返されるとユーザーはアプリケーションで何一つできなくなる
- 本質ではなくノイズに99%の時間が割かれるアプリケーションなんて人間の幸福にはまったく不要


# NExT?

注意力を損なう大文字小文字。

[ui ux yumainaura - Google Search](https://www.google.co.jp/search?ei=wfT1W6HQAoT-8gXyxr2YBg&q=ui+ux+yumainaura&oq=ui+ux+yumainaura&gs_l=psy-ab.3...646.1824..1873...0.0..0.160.809.6j2......0....1..gws-wiz.......0j0i22i30j33i160.i4xRGzRsPLA)









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
エンジニアの三大美徳 良い傲慢 「お前どうせ知らないだろうし俺様が教えてやるよ」

# 悪い謙虚

- 「どうせ知ってるでしょ」と思って他のエンジニアに情報共有しない、あえて言わない
- 意外に言ってみると「知らなかった、役立ちました」と言われることが多い
- 実際にペアプロで雑談して「ぽろ」っとこぼれた話が役立つことが多い
  -  ( `git checkout - ` で元のブランチに戻れるよとか )
  -  どんどんこぼそう
 
# 良い傲慢

- 「お前どうせ知らないだろ」と思って情報共有する
  - 言い方自体は傲慢じゃなくて良い
- 「知らない可能性もあるだろ」と思って、念押しで言ってみる
  - 意外に「役立ちました！あざっす！」案件も多い
  - 失礼にならないように「これってこれこれですよね」と相手が知ってる前提で語ってみる
  - むしろ相手が教えてくれることだってあるだろう、意外な知見
- 短くて数秒で生涯役に立つ知識が得られたり、送れたりするので爆コスパ！

# Next?

[三大美徳 yumainaura - Google Search](https://www.google.co.jp/search?q=%E4%B8%89%E5%A4%A7%E7%BE%8E%E5%BE%B3+yumainaura&oq=%E4%B8%89%E5%A4%A7%E7%BE%8E%E5%BE%B3+yumainaura&aqs=chrome..69i57.3302j0j7&sourceid=chrome&ie=UTF-8)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ScrapBox のサービス設計が優れすぎていて爆発！投稿ボタンも下書きボタンもない！ (UI/UX/デザイン設計)

# 新規カード作成

お気づきだろうか。
「投稿ボタン」も「下書きボタン」もないことに。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/4103caf1-368c-75c8-48f9-b4a8b69eff83.png)

# ユーザーアクションの革命

- ユーザーには「保存」アクションがない。
- ユーザーには「投稿」アクションがない。
- アクションは「入力」だけ！

これがどれだけ素晴らしいことか分かるだろうか。

# 画面遷移が爆速でシームレス

カード一覧に戻ると、そのまま入力内容が保存されいるのが分かる。しかも「遷移」を意識させない爆速な作り。

つまりユーザーには「ページ切り替え」というアクションも、半分存在しない。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/03d6b36a-089a-6686-5bcf-c8173f1489a9.png)

# シームレスな入力、シームレスな移動、ストリーム！

これは最近僕がMediumやSlackを使っていて、これからのモダンなサービスはこうあってほしい！ と思っていた理想形に近い。

色々なアクション、情報の区切りを曖昧にしていって、粒の単位がストリームになるよなイメージ。

# 結論

- これからのサービスアプリケーションの課題は「境界線」を曖昧にすることだ！
- Mediumでもタイトルと本文の区切りが曖昧だが、もっともっと押し進めてほしい。
- ScrapBox進んでるね！

# Next?

[yumainaura scrapbox - Google Search](https://www.google.co.jp/search?q=yumainaura+scrapbox&oq=yumainaura+scrapbox&aqs=chrome.0.69i59j69i60l3j69i64l2.3488j0j7&sourceid=chrome&ie=UTF-8)

# Others?

[エンジニアのアウトプット？Scrapboxで決まりでしょ！ - Qiita](https://qiita.com/Tommy_/items/f881c1658dfe02f65b69)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
VSCode コマンドラインでextensionのインポート/エクスポート

# エクスポート

```
code --list-extensions > ext.txt
```

# インポート

* 以下のシェルスクリプトを作成して実行

```import.sh
#!/bin/bash

while read line
do
  # echo `code --uninstall-extension $line`
  echo `code --install-extension $line`
done < ext.txt
```

### 追記(2020/12/27)

`--install-extension`に対して`--force`オプションを追加できるようです。

```
Use '--force' option to update to latest version or provide '@<version>' to install a specific version
```

# 参考

* [command-line#_working-with-extensions](https://code.visualstudio.com/docs/editor/command-line#_working-with-extensions)
php-master-changes 2018-11-22

今日は ext/mysqlnd の以前に revert した認証機能の入れ直し、7.1 系開発バージョン更新のための修正があった！

# 2018-11-22
## nikic: Re-commit MySQL 8 cached SHA auth support
- https://github.com/php/php-src/commit/4f06e67ad2201390ed35a9ea6288a00c0b04782b
- ext/mysqlnd で、MySQL 8 のキャッシュ付き SHA 認証サポートの再コミット
- [以前](https://qiita.com/sj-i/items/68682287c0b1bf9f1926#nikic-revert-all-mysql-auth-related-changes)に [revert した修正](https://github.com/php/php-src/commit/03740ef7dffcc80530a89ebde3ccf5464f7f18e6)の入れ直し
- [OpenSSL サポートがない場合のフォールバック](https://github.com/php/php-src/commit/03740ef7dffcc80530a89ebde3ccf5464f7f18e6#r31369823)を修正した
- ext/hash への依存がハードコードされている問題があるため、ext/hash が必須である master へは入れ直した状態
- 本当は 7.3 にも入れられるといいんだけどなー、みたいなことを [PR:3671](https://github.com/php/php-src/pull/3671) で言ってる

## sgolemon: Prep for 7.1.26
- https://github.com/php/php-src/commit/0b3cbd665ee18f6ff462f4c188d4b82c5f68e477
- [7.1~]
- 7.1 系の開発バージョンを 7.1.26 へ