OmniAICreator/Qiita-1.07M huggingface dataset:
【忘備録】Dynamics365の導入

# Dynamics365の導入
30日間無料で使用できるoffice365(以降「O365」)の登録からDynamics365(以降「D365」)の導入までの忘備録

## O365試用版の登録
[O365](https://products.office.com/ja-jp/business/office-365-enterprise-e3-business-software "Office365")から「無料試用版」を選択
![office365試用版登録.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382781/45704bb3-ea53-9212-2ff6-492bfb7081e1.png)

必要事項を記入し、「次へ」を選択て登録を進める
![O365必要事項記入.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382781/fe5628a5-de33-a155-4aa5-cfcfefe1128a.png)

登録後、O365が使用可能となる。
![office365ホーム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382781/aed34618-9126-e02d-420a-2b5d31a0fb98.png)

## D365の無料試用の開始
O365より「管理」アプリを選択し、Microsoft 365 管理センターを開く
![MS365管理センター.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382781/39542caa-e449-843e-8f9b-0662b7f76afd.png)

サイドメニューから「課金情報＞サービスを購入する」を選択し、「Dynamics 365 Customer Engagement プラン Enterprise Edition」の無料試用を開始する
![D365無料試用の開始.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382781/5c1c9267-2a88-bc42-3f7c-d6aea2dbec49.png)

無料試用開始後、サイドメニューから「ユーザー＞アクティブなユーザー」を選択し、サブスクリプションをユーザーに割り当てる。
![サブスクリプション割当.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382781/fc091db3-cf75-636d-1e17-e04f9c0c02af.png)

しばらくして、Microsoft 365 管理センターに「Dynamics365」のメニューが追加される。
サイドメニューより「管理センター＞Dynamics365」を選択し、D365インスタンス作成画面へ遷移する。
※サイドメニューにすべてのメニューが表示されていない場合は、「すべてを表示」を選択し、すべてのメニューを表示する。
![dynamics365インスタンス作成へ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382781/25361090-b78a-0ce7-1e6b-e39068fb2d04.png)

「これらのすべて」にチェックを入れ、「セットアップの完了」ボタンを押すと、D365インスタンスの作成が開始する。
![Dynamics365インスタンス作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382781/258c4013-a26c-3202-170a-e793a3d68e6d.png)

下記画面が表示されたら、D365インスタンスの作成が完了となる。
![Dynamics365インスタンス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382781/1adf4165-aabd-cb9f-b7f2-2fe42be4407e.png)
ネストされた子モデル用のコントローラを作ることで子のコントローラをすっきりさせる

# 概要
* 親子でネストされたリソースがあるとき、子のレコードを作成、編集する時のコントローラは、親子のコントローラと子のコントローラそれぞれ作った方がよさそう。

# 背景
親子の関係を有するモデルがある時、親のviewで子のデータだけを更新したいということありますよね。例えば、団体が主催するイベントを管理するアプリがあるとき、団体のページからイベントを管理（作成・編集）したいし、イベント独自の詳細ページでも管理もしたい、という場合です。

関係をmodelとviewで表すと以下のようなかんじです。

```organization.rb
class Organization < ActiveRecord
  has_many :events
```

団体のページにあるイベントのフォーム

```views/organizations/show.html.slim
= @organization.name
// ここにeventのフォームを追加する
```

イベント独自の詳細ページのフォーム

```views/events/edit.html.slim
= form_with model: @event
// ここにｅｖｅｎｔのフォームを追加する
```


ここで問題となるのは、どのページから遷移してきたかによってリダイレクト先をコントローラーで判断させなくてはならないことです。
具体的には、団体のページから遷移してきた場合は、フォームを更新後、団体のページに戻したい。一方、イベントのページから遷移してきた場合はイベントのページに戻したい。
もし、これを `events_controller.rb` の条件分岐で頑張るとしたらいかのようになります。


```events_controller.rb
def update
  @event = Event.find(params[:id])
  @event.assign_attributes(event_params)
  if @event.valid?
    if request.referer == organization_url(@organization)
      redirect_to @organization
    else 
      redirect_to @event
  end
end
```

`request.referer == organization_url(@organization)` の条件分岐がそれです。うーん、・・・なんか見るからにつらそう。

これをすっきり書きたいというのが今回のモチベーションです。

# 結論
* ネストされたendpoint ( `/organizations/:organization_id/events/:id` ) と 団体ページからのフォーム用のコントローラ `organization_events_controller` と を用意する。

## ネストされたendpoint
まず、ネストされたendpointを `routes.rb` で用意します。

```routes.rb
Rails.application.routes.draw do
  resources :organizations do
    resources :events, controller: 'organization_events'
  end
  resources :events
end
```

`, controller: 'organization_events'` のようにリソースにアクセスしたときのコントローラの向き先を団体ページからのフォームから遷移した場合のコントローラをつくるところがポイント。
（これがないと、 `events_controller.rb` に遷移してしまいます！）


## 団体ページからのフォーム用のコントローラ
上記で追加した、ネストされたendpointに基づいたフォーム用のコントローラは以下のようにかきます。

```controllers/organization_events_controller.rb
def update
  @event = Event.find(params[:id])
  @event.assign_attributes(event_params)
  if @event.valid?
    redirect_to @organization
  end
end
```

なお、 結果的に`event_controller.rb` も条件分岐がなくなり、以下のようにすっきりします。

```controllers/events_controller.rb
def update
  @event = Event.find(params[:id])
  @event.assign_attributes(event_params)
  if @event.valid?
    redirect_to @event
  end
end
```

ちなみに、団体ページでイベントデータを編集する場合は以下の通りです。 `model: [:organization, @event] ` polymorphic_path をつかうところがポイント・・・かな。


```views/organizations/show.html.slim
= @organization.name
= form_with model: [:organization, @event] do |f|
  = f.text_field :name 
```

## 利点、欠点
* 利点
    * コントローラがすっきりする
* 欠点
    * 記述が重複する。たとえば、event_params （event用の `params.require(:event).permit(:name)` など ）は重複します。

個人的には、cotntrollerの記述は、ロジックが単純なら重複しても良いと思うので、欠点は気にならなかったので、コントローラがすっきりする利点をとりました。

以上。
PowerAppsで、画像一覧表示からアイテムから、詳細表示画面を表示させる（表示フォームと画像）

[PowerAppsで、SharePointに投稿した画像を一覧表示する画面をつくる（ギャラリー）](https://qiita.com/hisssa0102/items/50ffad66dbcff3468414)で、過去に投稿一覧を表示できる画面を作った。選択したアイテムの詳細を表示する画面を作る。

1. スクリーンを作成し、遷移する設定を作る。
2. アイテムの詳細を表示するよう設定する
3. サムネイルを表示するよう設定する

#スクリーンを作成し、遷移する設定を作る。

新しい画面からスクリーンを新規作成する(今回だと、Screen4)。
一覧表示の画面に戻り、ギャラリー内の右向き一番矢印を選択する。一番上の枠しか選択できないので注意。そのあと、OnSelect=Navigate(Screen4)と設定。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/f43f0ace-23f6-b0b7-6cd8-68762e73aa52.png" width=50%>

#アイテムの詳細を表示するよう設定する。
Screen4に移動して、挿入→フォーム→[ディスプレイ]
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/adb267cd-ddde-4d7b-a7d3-71de5770137b.png" width=50%>

データソースに、写真のアップロード先であるライブラリ（今回はドキュメント）を指定。それから、Itemに、移動元であるGallery2.Selectedを設定。スクリーン内にアイテムのプロパティが表示される。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/31de0179-9101-f7b8-0fe4-a39650098043.png" width=50%>

この画面に表示したい情報だけに絞りたい。フィールドの編集を選択して編集。
追加したければ、[フィールドの追加]
削除したければ、属性の右にある[...]から削除。
表示順を変えたい場合は、属性の右にある[...]から上へ移動、下へ移動でOK
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/b97f19ed-72c5-ffc7-d337-04e9118c4d8d.png" width=50%>

ここで画像を表示できればいいのだけど、サムネイルだとダメだった。なので別の方法を使った。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/c1c67e4e-e0b4-ce81-ff1f-44d64e8b3763.png" width=50%>

#サムネイルを表示するよう設定する
挿入→メディア→画像、を選択。
Image=Gallery2.Selected.サムネイル.Largeと設定。
これでフォームで選択しているアイテムの画像が表示されるようになる。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/b8a90c39-95be-caf2-0db2-9868abfa70f3.png" width=50%>

さっきのフォームの、Itemに指定したものと基本的に同じ。
画像なので、サムネイルを使った。
Largeとしているけど、SmallでもMediumでも可。無駄なトラフィック使いたくないならSmallでいいかも

#体裁整える

見出し用のラベルつけて、元の画面に戻るアイコンと関数を入れて、今日の範囲はできあがり！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/fe64e1ef-339a-2953-a316-2daca4100938.png" width=50%>


#まとめ＆このあと
画像が表示されずにはまった…。今回はこの方法でやったけど、別のスマートな方法がないか調べてみる。
また、当初意図していた、「画像にドロップダウンの選択とコメントつけて投稿する」アプリ自体はいったん動くものになった。


というところで、今度はこの画像投稿に対し、Before-Afterで比較したい。ここからAfterの投稿にどう実装するか、ちょっと頭ひねってみます。
任意の文字列を円周上に埋め尽くしたい

要は[Red Hot Chili Peppersのロゴ](https://www.google.com/search?q=red+hot+chili+pepper+logo&tbm=isch)のテキストみたいなやつを同じテキストをリピートさせてやりたい。

探してみたところこのあたりが引っかかった:

* https://css-tricks.com/set-text-on-a-circle/
* https://stackoverflow.com/questions/23811276/wrapping-a-text-around-a-circular-element

なるほど。どうにもシンプルにやる方法はなさそう。

しかし、SVGのtext要素はPathに沿って並べることができることはわかった。
https://developer.mozilla.org/ja/docs/Web/SVG/Element/text

SVGは現状だいたいのブラウザで対応しているっぽいしいけそう。
https://caniuse.com/#search=svg

円を描くPathを動的に生成できれば楽に自動化できそうだ。すでに書いているひとがいた。
https://tyru.github.io/svg-circle-misc-algorithm/

拝借してゴニョったところできた。やったね。

```vue
<template>
  <svg
    xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink"
    :viewBox="viewBox"
    :style="{ maxWidth: boxSize + 'px' }"
  >
    <title v-text="text" />
    <defs>
      <path
        id="textcircle"
        :d="circlePath"
      />
    </defs>
    <text :font-size="fontSize">
      <textPath xlink:href="#textcircle" v-text="repeatedAroundText" />
    </text>
  </svg>
</template>

<script>
/*
 * thanks: https://tyru.github.io/svg-circle-misc-algorithm/
 */

const SEGMENTS = 8
const ANGLE = 2 * Math.PI / SEGMENTS
const HALF_ANGLE_RATIO = Math.tan(ANGLE / 2)

function range(from, to) {
  const length = to - from
  return Array.from({ length: length + 1 }, (v, k) => k + from)
}

function drawCirclePath(center, radius) {
  const anchorX = theta => radius * Math.cos(theta)
  const anchorY = theta => radius * Math.sin(theta)
  const controlX = theta => anchorX(theta) + radius * HALF_ANGLE_RATIO * Math.cos(theta - Math.PI / 2)
  const controlY = theta => anchorY(theta) + radius * HALF_ANGLE_RATIO * Math.sin(theta - Math.PI / 2)
  return [
    ['M', center + radius, center],
    ...range(1, SEGMENTS).map((index) => {
      const theta = index * ANGLE
      return ['Q', controlX(theta) + center, controlY(theta) + center, anchorX(theta) + center, anchorY(theta) + center]
    })
  ]
}

export default {
  props: {
    text: {
      type: String,
      default: ''
    },
    fontSize: {
      type: Number,
      default: 12
    },
    boxSize: {
      type: Number,
      default: 800
    }
  },
  data() {
    return {}
  },
  computed: {
    centerPosition() {
      return Math.floor(this.boxSize / 2)
    },
    radius() {
      return Math.floor(this.boxSize / 2) - this.fontSize * 2
    },
    viewBox() {
      return [0, 0, this.boxSize, this.boxSize].join(' ')
    },
    repeatedAroundText() {
      const repeatCount = Math.ceil((this.radius * 2 * Math.PI) / this.fontSize / this.text.length)
      return this.text.repeat(repeatCount)
    },
    circlePath() {
      const circlePath = drawCirclePath(this.centerPosition, this.radius)
      return circlePath.map(path => path[0] + path.slice(1).join(',')).join(' ')
    }
  }
}
</script>
```

SVGそのものの描画コストはSVGのソースも小さいし問題ないと信じてる。
このへんのDOM生成が重くなってもNuxt.jsでSSRしてやったりすればよさそう。

ちょっと気になる記事があったけど、等幅配置の際の問題のようなのでこれには影響なさそう。
https://qiita.com/MKLemma/items/c38cd2587a1451a95e3e

もちろん、別のブラウザ依存の問題がないとも言えないので、その後は要調査。
PHP7.0.0以降でMySQLを操作する際に注意すると良か事

#概要
「基礎からのPHP 改訂版」で学習している際に
MySQLのバージョンの違いによって、
PHPスクリプトでMySQLを操作する際に
注意するべき点が有ったとですよ。

それを同じパターンで躓いた方に
教えたいとですばい。

#開発環境
MacOS Mojave
PHP 7.1.23
Apache 2.4.39
MySQL 8.0.15

※「基礎からのPHP 改訂版」で使用されているのは
PHP 5.3.8
MySQL 5.5.16

#接続
参考書内だと、PHPスクリプトで
MySQLに接続する構文は
以下のように紹介されていたとですよ。

```php:MySQLに接続する
mysql_connect(サーバ名,ユーザ名,パスワード)
```

このままだと僕の開発環境では
接続に失敗するとです。

そこで[公式マニュアル](https://www.php.net/manual/ja/function.mysql-connect.php)を確認したところ、
>この拡張モジュールは PHP 5.5.0 で非推奨になり、PHP 7.0.0 で削除されました。

と書いてあったばい。
割と大分前に廃止された構文みたいですね。

その代わりとなる構文が以下の通りになるとですよ。

```php:PHP7.0.0以降
mysqli_connect(サーバ名,ユーザ名,パスワード,データベース)
```

mysqlに「i」が付きましたね。


接続を切断する際の

```php
mysql_close(リンクID)
```

も、同様に下記の通りに置き換わるばい。

```php
mysqli_close(リンクID)
```

#クエリ発行
参考書内のクエリを発行する構文は
下記の通りだったとですよ。

```php:SQL文を発行する関数
mysql_query(SQL文)
```

こちらに対しては、接続より
もう一捻り必要になるとですよ。

```php:PHP7.0.0以降
mysqli_query(リンクID,SQL文)
```

「i」をつけるのに加えて、
引数にリンクIDも必要になっているとですよ。

#結論
やはりここら辺でも
バージョンの違いによって、
構文の違いが出てきているとですね。

これはPHPやMySQL開発者の
創意工夫がものすごい早さで進んでおり、
昔からあった言語でも
どんどん開発が進み、発展している事を示している
じゃないとですかね。

素晴らしか！

#参考文献
基礎からのMySQL 改訂版
[PHP公式マニュアル](https://www.php.net/manual/ja/book.mysqli.php)

#蛇足
エセ博多弁でお送りしていますが、
これは偉大なるドリフトドライバー
「野村　謙」さんをリスペクトしてのものです。

自動車ドリフトを
チンピラの暴走行為から
スポーツに昇華させた第一人者です。

残念ながら選手は引退してしまいましたが、
面白いキャラクターでまだまだ活躍されていますよ。

興味あれば、ぜひYoutubeの
「VIDEO OPTION」チャンネルから
彼の勇姿を見てみて下さいね。
【備忘録】dbdeployerの設定

# 
複数のmysqlバージョンを入れる時はだいたいの記事を見ているとMySQL SandBOXで入れることが多いと思います。
今回は、そのMySQLsandboxの後継と言われている？dbdeployerを使用しました。
あまり、情報なかったので、載せてみます。

# 環境
OS:CentOS6
dbdeployer: version=1.8.0  (https://github.com/datacharmer/dbdeployer)

# 構築手順
1. dbdeployerの設定
2. mysqlの設定
3. インスタンスの作成
4. インスタンスの接続

# dbdeployerの設定

```console
$ tar xzvf dbdeployer-1.8.0.linux.tar.gz 
$ chmod +x dbdeployer-1.8.0.linux

```

#  mysqlの設定

バージョン毎に行う

```console
$ mkdir -p $HOME/opt/mysql
$ dbdeployer unpack (file名：mysqlのダウンロードしてきたtar.gzファイル名)
```
# インスタンスの作成
シングルインスタンス作成の場合

```console
$　dbdeployer deploy single (mysqlのversion)
```
マルチインスタンス作成の場合
今回は使用していないため不明

# インスタンスが作成されているか確認

```console
dbdeployer sandboxes
```

# インスタンスの接続(mysqlに入る)

```console
$ $HOME/sandboxes/(起動したバージョンのフォルダを指定)/use
```

# 参考
[次世代MySQL Sandbox! dbdeployerの使用方法について](https://www.s-style.co.jp/blog/2018/06/1894/)
[第74回　さまざまなMySQLのバージョンを試す](http://gihyo.jp/dev/serial/01/mysql-road-construction-news/0074)
Active Data Guard PL/SQL Redirectを試す（Oracle Database 19c)

昨日はActive Data Guard環境で、更新系DMLをプライマリ・インスタンスにリダイレクトして実行する機能について[検証](https://qiita.com/plusultra/items/c5dfb1399eafcd5ba200)しました。この記事では、DMLと同様にPL/SQLブロックをリダイレクトする機能について検証を行いました。

マニュアル[Oracle Data Guard Concepts and Administration](https://docs.oracle.com/en/database/oracle/oracle-database/19/sbydb/managing-oracle-data-guard-physical-standby-databases.html#GUID-143121BA-3F4C-4953-B0E7-68BE9EE700C9) には以下のように記述されています。

> 10.2.2.2 Running Top-level PL/SQL Operations on Active Data Guard Standby Databases
> PL/SQL blocks that you run on Active Data Guard standby databases can be redirected to and run on the primary database, if they do not contain bind variables.
>
> To redirect PL/SQL operations that are run on a standby to the primary, configure automatic redirection using the following command on the standby database:
>
> ALTER SESSION ENABLE ADG_REDIRECT_PLSQL;
> You can configure automatic redirection for PL/SQL operations only at the session level.

これを読むとトップ・レベルのPL/SQL操作は、ALTER SESSION ENABLE ADG_REDIRECT_PLSQL文でリダイレクトできるように読めます。先日検証を行った ALTER SESSION ENABLE ADG_REDIRECT_DMLと何が異なるのかを確認します。

```
SQL> ALTER SESSION ENABLE ADG_REDIRECT_DML;

Session altered.

SQL> BEGIN
  2    INSERT INTO data1 VALUES (100, 'standby1');
  3  END;
  4  /

PL/SQL procedure successfully completed.
```

単純なPL/SQLブロックの実行では、ADG_REDIRECT_DMLでも動作するようです。次にプライマリ・インスタンスで、データを更新するPROCEDUREを作成してスタンバイ・インスタンスで実行してみました。

- プライマリ・インスタンス

```
SQL> CREATE OR REPLACE PROCEDURE insdata1(p1 NUMBER, p2 NUMBER, p3 VARCHAR2) AS
BEGIN
   IF p1 = 10 THEN
       INSERT INTO data1 VALUES (p2, p3);
   END IF;
END;
/

Procedure created.
```

- スタンバイ・インスタンス
 
```
SQL> ALTER SESSION ENABLE ADG_REDIRECT_DML;

Session altered.

SQL> EXEC insdata1(10, 200, 'standby2');

PL/SQL procedure successfully completed.

SQL> SELECT * FROM data1;

        C1 C2
---------- ----------
       100 standby1
        20 standby2
```

ストアド・プロシージャの実行でもALTER SESSION ENABLE ADG_REDIRECT_DML文のみで実行できました。次に、EXECUTE IMMEDIATE文を実行してみました。

```
SQL> ALTER SESSION ENABLE ADG_REDIRECT_DML;

Session altered.

SQL> BEGIN
  2    EXECUTE IMMEDIATE 'DROP TABLE data1';
  3  END;
  4  /
BEGIN
*
ERROR at line 1:
ORA-16397: statement redirection from Oracle Active Data Guard standby database
to primary database failed
ORA-06512: at line 2
```

ここで初めてリダイレクト・エラー「ORA-16397」が発生しました。ALTER SESSION ENABLE ADG_REDIRECT_PLSQL文を実行して再実行します。

```
SQL> ALTER SESSION ENABLE ADG_REDIRECT_PLSQL;

Session altered.

SQL> BEGIN
  2    EXECUTE IMMEDIATE 'DROP TABLE data1';
  3  END;
  4  /

PL/SQL procedure successfully completed.
```

上記のように、EXECUTE IMMEDIATE文の実行にはALTER SESSION ENABLE ADG_REDIRECT_PLSQL文の実行が必要でした。PL/SQLブロックの操作と、ALTER SESSION文の関係をもう少し詳しくマニュアル化して欲しいと思います。
M5StackでEthernetが使えない問題

#(2019.5/5現在)対処方法

恐らく一時的に使えないだけでで今後改善されるはず。

追記　esp32パッケージ、1.0.2にするとcliant.hでコンパイルエラー
ひとまず1.0.1に落とす必要がありそう

![20190505_211723.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149571/56409563-65e6-6da8-544f-06bf54a7b3de.jpeg)

>現象環境
ArduinoIDE(Arduino1.8.9)
ボードのパッケージ(esp32 1.0.1)

[w5500のLANModule](https://www.switch-science.com/catalog/3994/)を接続。
M5Stackの[サンプルコード](https://github.com/m5stack/M5Stack)(Module/ws5500/WebServer.ino)を使用するとコンパイルが通らない。


```
cannot declare variable ‘server’ to be of abstract type ‘Ethernet2.h’
```
抽象型を宣言できないぞと怒られます。
サンプルコードのコメント通りにServer.hを変更しようにもそこには何もない。

```
/*
  Web Server
  Need to install Ethernet2 arduino library
  If new arduino esp32 or make error, need go to c:\Program Files (x86)\Arduino\hardware\espressif\arduino-esp32\cores\esp32\Server.h 
  Change virtual void begin(uint16_t port = 0) = 0; to virtual void begin() = 0;
  Other example can see https://github.com/adafruit/Ethernet2
 */
```

結果
ここにありました。
>C:\Users\\(UserName)\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.1\cores\esp32\Server.h

virtual void begin(uint16_t port = 0) = 0;
から
virtual void begin() = 0;
に書き換えます。

##以下詳細
###原因
ESP32のArduino開発環境にはボードマネージャからインストールできるようになったため。(M5Stackの中身)
今まではGitHubからZipを落としてget.exeを実行する必要がありました。

この変更で\Arduino\hardware以下が移動している。
これにEthernet2ライブラリが対応できていないのが現状です。

しかしArduinoでは大本の[Ethanet](https://github.com/arduino-libraries/Ethernet)が動くようになったので[Ethernet2](https://github.com/adafruit/Ethernet2)は更新停止...でもM5Stackは2を使ったまま。
はて、どこにプルリクすればいいのやら。

折角モジュールとして販売しているのにArduinoIDEで使えないのでは勿体ない
もしかすると、このまま更新されることない可能性もあるため書いた次第です。

###経緯
MakerFairKyotoで昨日入手できたので試してみたら動かない...
はて、ESP32インストールをコケたかなと思い、最新環境にしても変わらず躓いてました。

そもそもESP32ならばWiFi付いてるじゃん。という話ですが。

人が多く長距離でUDPを使うとき、どうしても有線が必要になる...
そこをArduinoレオナルド辺りでやっていましたが、UIがあるとセッティングが楽なのでちょっと検証してみた次第。

こういう側面もあるので今後PoE対応モジュールとかが出るといいなぁと思うのですが...
crc32 unsigned 

-demo https://codepen.io/gnjo/pen/NVWdLd?editors=1010
-zeropadding tohex unsigned

```js

let fn={}
fn.crcTable=(function(){
  var c,crcTable = [];
  for(var n =0; n < 256; n++){
    c = n;
    for(var k =0; k < 8; k++){
      c = ((c&1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));
    }
    crcTable[n] = c;
  }
  return crcTable;
})();//early gen
fn.crc32 = function(str,hex=true) {
  var crcTable = fn.crcTable,pad=( (d,l)=>('000000000000000000'+d).slice(-1*l))
  ,crc = 0 ^ (-1)
  ;
  for (var i = 0; i < str.length; i++ ) crc = (crc >>> 8) ^ crcTable[(crc ^ str.charCodeAt(i)) & 0xFF]
  ;
  crc = (crc ^ (-1)) >>> 0
  ;
  return (hex)?pad(crc.toString(16),8):crc
}

/*
fn.crc32('xyz')
*/
```
:last-childより*セレクタに優先されてしまうスタイルが一部あります

cssのセレクタの優先順位について質問です。

とある小要素<p>に指定した

p:last-child {
font-size: 5em;
color: red;
margin-top:10%;
}

が、

同じCSSファイルの先頭に記述した

{
font-size: 1.5em;
color:blue;
margin:0;
}
に色だけが*セレクタを優先してしまい、ブルーで表示されてしまいます。このとき、フォントサイズやマージンは:last-childのものに期待どおり上書きされます。
疑似要素はcolorだけが何か特別な優先順位をもっているのでしょうか？
他に絡んでくるようなセレクタの記述はないのですが…。

アドバイスいただければ幸いです。
Tabled variant (tANS)　Remark

この記事は、<a href="http://creativecommons.org/licenses/by-sa/3.0/">クリエイティブ・コモンズ・表示・継承ライセンス3.0</a>のもとで公表されたウィキペディアの項目<a href="https://en.wikipedia.org/wiki/Asymmetric_numeral_systems">「Asymmetric_numeral_systems」</a>を素材として二次利用しています。

https://en.wikipedia.org/wiki/Asymmetric_numeral_systems

- [前回] introduction
- [前回] Entropy coding
- [前回] Basic concepts of ANS
- [前回] Uniform binary variant(uABS)
- [前回]Range variants(rANS) and streaming
- Tabled variant(tANS)
- Remark

# tANS

tANS variant は、x\in [L,2L-1]$に対して、乗算を必要としない有限状態マシンに基づいたtableを用いる（renormalizationを含む）全体の振る舞いである。

最終的には、decoding loopのステップは以下のように表現できる。

> t = decodingTable(x); 
> x = t.newX + readBits(t.nbBits); //state transition
> writeSymbol(t.symbol); //decoded symbol

encoding loopのステップは以下のように表現される。

> s = ReadSymbol();
> nbBits = (x + ns[s]) >> r;  // # of bits for renormalization
> writeBits(x, nbBits);  // send the least significant bits to bitstream
> x = encodingTable[start[s] + (x >> nbBits)];

特定のtANS codingは、それぞれ  synbolが$[L,2L-1]$の位置に配置されることが決定される、ｓｐれらの実装の数値は、与えられた頻度の割合に応じる。例えば、"abcacdac"を、Pr(a)=3/8, Pr(b)=1/8, Pr(c)=2/8, Pr(d)=2/8 の密度分布でアサインする場合を考える。もしシンボルが2のべき乗の範囲にアサインされるならば、それはハフマン符号と同じものが得られる。例えば、a->0,b->100,c->101,d->11 prefix codeが、"aaaabcdd" symbol assignmentのtANSでもまた与えられる。

## 訳者コメント
つまり、こちらはテーブルを利用することによって、乗算とかfloor演算とかを省けるようにしたバージョンですね。

# Remark

ハフマン符号化では、tANSの密度分布を変化させる事が比較的コストとなっており、そのために静的な状況で主に使われていた、一般的には例えばいくつかのLempel-Ziv schemeと共に（ZSTD,LZFSE)。この場合、ファイルはいくつかのブロックに分割され、それぞれのsymbol 出現は独立してカウントされ、ブロックヘッダーに、tANSの密度分布で静的に使うために、概算値（量子化した値）が書き込まれていた。

対照的に、rANSはrange codingのより高速な置き換えになりうる（CRAM,LZNA,Draco,AV1)。掛け算を必要とするが、メモリ効率が良く、動的に適切な密度分布の推定を行う事ができる。

ANSの符号化、復号化は、それぞれ反対方向の処理となる、それはsymbolsのstackを作る。これによる不便性は一般的に、復号化を順番に処理しようとしたときには符号化する際に逆方向に処理されることにある。マルコフモデルのように文脈が独立しているならば、符号化器は復号よりも遅い見通しのコンテキストを必要としている。適応性の観点でいえば、符号化器は、でこーたが利用しバッファに保存する推定される確率を発見する前方向で処理するべきである。それによて、バッファに保持された確率を逆方向に用いる事ができる。

符号化の最終ステージは、でコードの開始に必要とされる、それは、圧縮されたファイルに保持するために必要になるためである。このコストはencoderの初期状態に関する情報を保持するために必要とされる。例えば、最初が"10000"で開始する代わりに、"1*****"状態から開始した場合、"*"は更なる状態のbitを保持しており、最終的にでコードしたときにそれと関連付けられるはずである。言い換えるならば、この状態は正しい状態で符号化が開始された場合のチェックサムとして利用する事でき、でコード処理の最終状態が正しくなったかどうかを判断することができる。
AngularでUnixTimestampをフォーマットするPipe

AngularのPipeでUnixTimestampを日本の日付フォーマットに変換するシンプルなPipeを作成する

以下のコマンドでPipeを作成します。Cli便利ですね。

```
ng g pipe ConvertTimeStampToDate
```
内容はこんな感じ。いたってシンプルです。
 1. Dateオブジェクトを作る
 2. それぞれyearやmonthやhourやminute(0埋めする)を切り出して文字列で返す

```typescript
import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
  name: 'convertTimeStampToDate'
})
export class ConvertTimeStampToDatePipe implements PipeTransform {

  transform(timeStamp: number): string {
    const formatedDate = new Date(timeStamp * 1000);

    /** 月 */
    const month = formatedDate.getMonth() + 1;

    /** 日を0埋め */
    const day = ('0' + formatedDate.getMinutes()).slice(-2);

    return formatedDate.getFullYear() + '年' + month + '月' + formatedDate.getDate() + '日' + formatedDate.getHours() + ':' + day;
  }

}

```

### 入出力結果
入力

```html

{{timestampValue | convertTimeStampToDate}}
```

```
1556694104(=timestampValueの値)
```

出力

```
2019年5月1日16:01
```
golang 開発環境構築 at Mac OS

#Homebrewを用いてインストール


```bash
brew install go
```

##$GOPATH, $GOROOT, $PATHの設定

```bash
cat << 'EOS' >> ~/.bash_profile
export GOPATH=$HOME/go
export GOROOT="$(brew --prefix golang)/libexec"
export PATH=$PATH:$HOME/go/bin
EOS

source ~/.bash_profile
```

上記で設定したGOPATH以下が、go開発の作業ディレクトリとなります。

`go help gopath`
というコマンドを入力すると、

```
Here's an example directory layout:

    GOPATH=/home/user/go

    /home/user/go/
        src/
            foo/
                bar/               (go code in package bar)
                    x.go
                quux/              (go code in package main)
                    y.go
        bin/
            quux                   (installed command)
        pkg/
            linux_amd64/
                foo/
                    bar.a          (installed package object)

```

というように、 GOPATH以下に、
`/src, /bin, /pkg` 
のディレクトリを作成する必要があります。

自分が作業するディレクトリは基本的に、
`$GOPATH/src/`
以下で、ここに、自分が書いた.goファイルを配置します。

例えば、

```
src
    ├── github.com
    ├── golang.org
    └── helloProject
      └── hello.go
```

のような感じです。

プロジェクトをgitで管理する場合は、
`src/github.com/{username}/`
のような感じで作業した方がいいと思います。

##依存パッケージ管理ツールdepのインストール

`go get -u github.com/golang/dep/cmd/dep`

プロジェクト内でimportされているモジュールをよろしく管理してくれます。

以下の記事を参考にしました。
https://qiita.com/mas_noppo/items/ddf8f26e13cce7799e39


##最後に
これでgolangの開発環境が大方整いました。
golangで開発をするのがとても楽しみです！！！


参考にした公式ドキュメント
https://golang.org/doc/install
Numpyの操作方法まとめ

# Numpyの使用方法をまとめておく
参考：**Pythonデータサイエンスハンドブック**
[配列の作成] https://qiita.com/yiija/items/ede9c31988be98845e27
[スライス] https://qiita.com/yiija/items/0fbf01b8430e6ef75e84
[結合と分割] https://qiita.com/yiija/items/fc468bb35a02c06603f8
Pythonで平方根

#初めに
このプログラムは無駄です
numpy.sqrtかmath.sqrtを使った方が効率的です
ただこれhttps://qiita.com/ruuuuuuuty/items/e5d760a80f9ce5db860f
見て電車内で暇だし書くかってノリでPythonにしました
やってみたら死ぬほど書き替えるのが簡単でなんでやったんだろうって感じです
#コード

```python
def sqrt1(a):
    left = 0.0
    right = a
    mid = 0.0
    for i in range(1000):
        mid = (left + right) / 2
        if(mid * mid - a < 0):left = mid
        else:right = mid
    return right
```

```python
def sqrt2(a):
    b = a
    for i in range(1000):
        b = (b * b + a) / (2 * b)
    return b

```
クリックを押すタイミング毎にclassをつけたり消したりする

# JavaScriptについて学び

本日端午の節句。Qiitaを始めてみました。

 ___HTML___

```HTML
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>JavaScript Click Event</title>
</head>
<body>
  <div class="wrapper">
    <div id="target" class="parallelogram">
    </div>
  </div>
  <script src="js/main.js"></script>
</body>
</html>
```

 ***main.js***

```html
<script>
'use strict';

const target = document.getElementById('target');
// document.getElementById('target')を定数（const）にtargetとして代入

target.addEventListener('click', function() {
  target.classList.toggle('circle');

});

</script>

```

***style.css***

```css
.wrapper {
      padding-top: 600px;
      position: relative;
    }

    .parallelogram {

      width: 100px;
      height: 100px;
      background: #43676b;
      /* 御召茶 */
      cursor: pointer;
      transition: 0.8s;
      position: absolute;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%) skew(20deg);
    }


    .circle {
      border-radius: 50%;
      background: #aa4c8f;
      /* 梅紫 */
      transform: translate(-50%, -50%) rotate(360deg);
    }
```
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">クリックするたびにtoggleで平行四辺形を正円に変化。<br>ちなみに平行四辺形は御召茶、正円は梅紫という色の名前です。<br>和色大辞典さん、いつもありがとうございます。<a href="https://t.co/UIXHwL8hG5">https://t.co/UIXHwL8hG5</a> <a href="https://t.co/30RQPZEz1B">pic.twitter.com/30RQPZEz1B</a></p>&mdash; Herb Collage (@herbcollage) <a href="https://twitter.com/herbcollage/status/1125011250688061441?ref_src=twsrc%5Etfw">2019年5月5日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
composer scripts から起動した phpunit でも色付きで出力させる

laravel での開発などで、composer からインストールした phpunit を使うには、

- `vendor/bin/phpunit` といった具合で直に呼び出す
- composer の scripts に登録する（`composer phpunit`みたいにつかう）

のいずれかの方法になると思いますが、

- 前者は地味にタイプ量が多い（まぁ気になるほどでは無いですが…）
- 後者はなぜか --colors オプションを付けても色付きで出力されない

というなんとも微妙な状況。
個人的には、**compose scripts に登録しつつ --colors オプションも有効にしたい！**

…ということで調べてみました。

## composer scripts から起動した phpunit でも --colors オプションを使う方法

composer.json に書くときにちょっと工夫すればOKでした。
具体的には、 --colors オプションを、 --colors=always とするだけでした。

```json-doc:composer.json
{
    ...
    "scripts": {
        "phpunit": [
            "vendor/bin/phpunit --colors=always"
        ]
    }
    ...
}
```

これであとはいつもどおり、

```
composer phpunit
```

としてあげれば色付きで出力してもらえます。

![Screen Shot 2019-05-05 at 20.30.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25724/5dbceb70-a306-46ff-c112-b87a2f3c0e5a.png)

ちなみに、composer run scripts で色付きにする場合、composer.json にコマンドを書く際に '--ansi' オプションを付ければ良いらしいのですが、phpunit でそれをやろうとすると何故か怒られてしまい、代わりに --colors=always を使えば良いみたいです。

## 参考

- [Keep color output when running scripts on composer
](https://stackoverflow.com/questions/27024298/keep-color-output-when-running-scripts-on-composer)
Numpy~stack and split~

# 配列の結合と分割
1. 結合
    - concatenate
    - vstack
    - hstack
2. 分割
    - split
    - vsplit
    - hsplit
#例

```
import numpy as np
x1 = np.array([1,2,3])
x2 = np.array([4,5,6])

np.concatenate([x1, x2])
# concatenateは鎖状につなぐの意味
# array([1, 2, 3, 4, 5, 6])

np.vstack([x1, x2])
# 縦につなげることが可能
# array([[1, 2, 3],
#        [4, 5, 6]])

np.hstack([x1, x2])
# 横につなげる
# array([1, 2, 3, 4, 5, 6])

## 分割

x = np.arange(10)
# array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

x1, x2, x3 = np.split(x, [1, 2])

# x1: array([0])
# x2: array([1])
# x3: array([2, 3, 4, 5, 6, 7, 8, 9])

y = np.eye(4)
# array([[1., 0., 0., 0.],
#        [0., 1., 0., 0.],
#        [0., 0., 1., 0.],
#        [0., 0., 0., 1.]])
np.vsplit(y, [2])
#[array([[1., 0., 0., 0.],
#        [0., 1., 0., 0.]]), 
# array([[0., 0., 1., 0.],
#        [0., 0., 0., 1.]])]
np.hsplit(y,[2])
# [array([[1., 0.],
#        [0., 1.],
#        [0., 0.],
#        [0., 0.]]), 
# array([[0., 0.],
#        [0., 0.],
#        [1., 0.],
#        [0., 1.]])]
```
Deeplerning基礎知識おさらい活動 その1

#目的
現在、Deeplearningの応用研究を大学で行なっています。実際に前処理やモデル構築などをしていく中で基礎的な知識を同時並行でおさらいしたいという思いがありchainerやDeeplearningについての基礎的知識をアウトプットしていきます！！
今回はパーセプトロン、ニューラルネット、活性化関数についてです!!
#パーセプトロンについて
まず簡単に今後活性化関数を説明していく上でも重要となるパーセプトロン(単層パーセプトロン)についてザッと説明していきます。
パーセプトロンとは以下の式のように表すことができる入出力を持つアルゴリズムです。

a = b + w1 * x1 + w2 * x2

a が0以下なら y = 0
a が0より大きければ y = 1(この状態をよく発火という)

x:入力
w:重み
b:バイアス
y:出力

パーセプトロンは重みとバイアスを調整を調整することによってAND演算やOR演算を実装することができ2層のパーセプトロンならXOR演算(非線形領域)も実装できます。

#活性化関数とは
活性化関数とは入力を出力に変換する関数(どのように発火するかを決める関数)です。

a = b + w1 * x1 + w2 * x2

y = h(a)

式で表すと上記のh()にあたる部分が 活性化関数です。

###ステップ関数
パーセプトロンにおいては出力が0か1になる「ステップ関数」が活性化関数として使用されます。
![スクリーンショット 2019-05-05 17.41.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284340/c564d7f9-07ea-4e28-6f8a-c4da72f49fb0.png)
                
このステップ関数以外の活性化関数を使用することでニューラルネットワークを構築することができます。

###シグモイド関数
![スクリーンショット 2019-05-05 18.17.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284340/9a50f3b8-cdb4-da9d-3c2e-e21825632bbc.png)
シグモイド関数はニューラルネットワークでよく用いられる活性化関数です。

h(x) = 1/(1+exp(-x))

上記の式で表すことができます。

#非線形関数
グラフを見てもわかるようにパーセプトロンは0か1の二値、ニューラルネットは連続的な実数値が流れていることがわかると思います。
共通点としては重要な入力値でなければ小さい値(0に近い)、重要であれば大きな値(1に近い)を返すこと。また、お互い非線形関数であることです。
ニューラルネットでは活性化関数は非線形関数を用いなくてはなりません。
これは線形関数を用いると層を深くすることができなくなり、単層のパーセプトロンと同等のものになってしまうからです。
以下に式でその様子を示します。

h(x) = cx を活性化関数とする。

この場合、この活性化関数は線形ですね。

ではこれに層を加えた出力を見てみましょう。

y = h(h(h(x)))
  = c * c * c * x
  = c3 * x

a = c3 とすると

y = a * x

結局、線形の関数になってしまうのです。
このことから層を深くするニューラルネットでは活性化関数に非線形関数を用いる必要があります。

#まとめ
活性化関数とは入力を出力に変換する関数ということが分かりました。
その中でも線形なものと非線形なものがあり、ニューラルネットでは出力を非線形にすることで層を深くし、より精度の高い結果を出力することが可能になります。
これからも基礎的な事項についてまとめていきますね!!
QtでiOS

QtでiOSアプリを作るとき、色々面倒だったので、調べたことをメモっておきます。QtのiOSは日本語情報少ないですね。
使ったバージョンは、Qt 5.11、5.12、Xcode 10あたり。

#QtでiPad専用アプリを作るとき。
.proファイルに、下記を書きます。

```
ios {
    #1:iPhone 2:iPad 1,2:universal
    QMAKE_APPLE_TARGETED_DEVICE_FAMILY = 2
}
```
3以降もあるみたいだけど、とりあえず使う予定もなかったので詳しく調べていない。

#Qtでiosのアイコンを設定する。
XCodeでアイコンを登録した～.xcassetsを作ります。
次に、.proファイルに下記を書きます。

```
ios {
    QMAKE_ASSET_CATALOGS += ios/Images.xcassets
}
```
#QMLでiPhoneXのノッチ部分にも描画するとき
普通にWindowを使ってもフルスクリーンになりません。
そのままだとリジェクトされるので、下記の手順でフルスクリーンにします。

- スプラッシュスクリーン用のxibファイルをXcodeで真面目に作ります。
- Info.plistに以下の設定を書きます。

```Info.plist
	<key>UILaunchStoryboardName</key>
		<string>スプラッシュスクリーン用のStoryboardのファイル名、拡張子なしで。</string>
```
- Window QMLのflagsに Qt.MaximizeUsingFullscreenGeometryHint を設定する。
- iPhoneXのセーフエリアに配慮してオブジェクトを配置する。 <br>
上下44ptはボタン類置いちゃダメだよ！回転にも対応するんだよ。

#iPhoneXでノッチ部分に暗い色で描画してしまい、ステータスが見えなくなったとき。
これはQtと関係ない、Info.plistの設定ネタですが…。
QtでiOSアプリを作るには、Xcode経由じゃなくてInfo.plistを直接いじることが多いと思うので、書いておきます。
ノッチ部分に暗い色で描画してしまいステータスが見えなくなったときは、ステータスバーのスタイルをLIGHTに変更するといいです。

```Info.plist
	<key>UIViewControllerBasedStatusBarAppearance</key>
		<false/>
	<key>UIStatusBarStyle</key>
		<string>UIStatusBarStyleLightContent</string>
```

あーiOSはめんどくさい。
AtCoder ABC113 C - ID(300点)

#問題概要

$N$ 個の県と $M$ 個の都市がある。
市 $i$ は $Y_i$ 年の誕生し、 $P_i$ 県に属している。なお同じ年に生まれた市は存在しない。

市 $i$ が 県 $P_i$ に属する市の中で $x$ 番目に誕生した市のとき、市 $i$ の認識番号の上 $6$ 桁は $P_i$、下 $6$ 桁は $x$ となるような認識番号をそれぞれの市 $i$ に振り分ける。

全ての市の認識番号を求めよ。

#制約条件

- $1≤N≤10^5$ 
- $1≤M≤10^5$
- $1≤P_i≤N$
- $1≤Y_i≤10^9$
- $Y_i$ は全て異なる
- 入力は全て整数

#考えたこと

問題文をパット見でいいかんじにソートしたらよさそうと思った。

ではどうソートするかなのだが、認識番号は「所属する県」と「生まれた年」で構成される。所属する県はすでにわかっているが、その県の中でどれだけ古い県かは明らかになっていない。
よって年でソートして古い順に所属する県を数え上げていく。

あとは初めの市 $i$ の順番にソートしなおして出力。

考察よりも実装がめんどくさいなという問題。

多次元配列のソートのやり方は以下の記事を参照したらよい。
[【C#】２次元配列（ジャグ配列・多次元配列）のソート](http://fantom1x.blog130.fc2.com/blog-entry-232.html?sp#JaggedArray_sort_linq)

```.cs
Array.Sort(array, (a, b) => a[1] - b[1]);  //昇順(index=1)
```

文字列を左詰めで出力する方法も忘れていたので調べた。以下の記事に詳しく書いてある。
- [書式指定文字列 (Format Strings)](https://so-zou.jp/software/tech/programming/c-sharp/grammar/type/string/format-strings.htm)
- [C#のstring.Formatで桁数や書式を指定する](https://araramistudio.jimdo.com/2018/08/17/c-%E3%81%AEstring-format%E3%81%A7%E6%A1%81%E6%95%B0%E3%82%84%E6%9B%B8%E5%BC%8F%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%99%E3%82%8B/)


```.cs
String.Format("{0:D6}", i) //iは数字
```


#解答
```c.cs
using System;
using System.Linq;

class Program
{
    static void Main(string[] args) {
        int[] s = Console.ReadLine().Split().Select(int.Parse).ToArray();
        int n = s[0];
        int m = s[1];
        int[][] l = new int[m][];
        for (int i = 0; i < m; i ++) {
            l[i] = new int[4];
            int[] a = Console.ReadLine().Split().Select(int.Parse).ToArray();
            l[i][0] = i;
            l[i][1] = a[0];
            l[i][2] = a[1];
        }
        Array.Sort(l, (a, b) => a[2] - b[2]);
        int[] c = new int[n];
        for(int i = 0; i < m; i ++) {
            c[l[i][1]-1] ++;
            l[i][3] = c[l[i][1]-1];
        }
        Array.Sort(l, (a, b) => a[0] - b[0]);
        for(int i = 0; i < m; i ++) {
            Console.WriteLine(String.Format("{0:D6}", l[i][1]) + String.Format("{0:D6}", l[i][3]));
        }
    }
}
```
プログラミング学習記録78〜詳解JavaScript 基礎文法編〜

##今日やったこと
- ドットインストール「はじめてのJavaScript」復習
- ドットインストール「詳解JavaScript 基礎文法編」

基礎文法編に入る前に一度復習してみました。

０〜４までの数字からランダムに1つ選んで、当たりハズレを割り当てるところ以外は、特に難しいところはないですね。

<br>

Progateで基礎の基礎は学んでいたので、問題なく理解できました。

変数を決めるときに、-（ハイフン）を使ってしまうミスはやりがちなので、気をつけないとダメだなと思いました。
_（アンダーバー）は使ってもいいみたいですね。

console.log(typeof null)とすると、nullの調べることができ、objectと表示されるのは知りませんでした。

これはJavaScriptの有名なバグで、nullの型は実際にはobjectではないようです。

for文の繰り返しの中で飛ばしたい条件を加えたい時はcontinue、途中で終わらせたい時はbreakします。

この辺に関してはProgateでは触れられていなかったので、ざっと触れることができてよかったです。

明日はオブジェクト編に取り組んでいきたいと思います。

おわり
React-nativeのよくあるエラーを解消するスクリプト

#概要
React-nativeでエラーが出た時にググると必ず出てくる鉄板の対処方法をまとめたスクリプトを書いた．

リセットしたくなったらこれで一発．

#スクリプト
```:reset.sh
#!/bin/bash

watchman watch-del-all &&
 rm -rf node_modules/ &&
 rm -rf ios/build &&
 npm cache clean --force &&
 npm install &&
 rm -rf $TMPDIR/react-* &&
 rm -rf $TMPDIR/haste-* &&
 rm -rf $TMPDIR/metro-* &&
 rm -rf ~/Library/Developer/Xcode/DerivedData/ 
```

#実行方法
作業ディレクトリで以下のコマンドを実行

```
sh reset.sh
```

#何をしているか
###watchmanのデータを削除
    watchman watch-del-all

###ノードのパッケージ削除
    rm -rf node_modules/
###iOSビルドファイル削除
    rm -rf ios/build
###npmのキャッシュを削除
    npm cache clean --force
###パッケージの再インストール
    npm install
###React-nativeの一時データ削除
```
rm -rf $TMPDIR/react-* 
rm -rf $TMPDIR/haste-* 
rm -rf $TMPDIR/metro-* 
```
###Xcodeの一時データ削除
    rm -rf ~/Library/Developer/Xcode/DerivedData/

#その他のエラー対処方法
パッケージがReact-nativeのバージョンによって使えたり使えなかったりすることが原因のことがよくあるので，パッケージのバージョンを変えたり，React-nativeのバージョンを変えてみるとうまくいくことが多い．

####蛇足：作業ディレクトリ内のパッケージ確認方法
    npm list --depth=0

#Happy Hacking!
Numpy~スライス~

# スライスに関するまとめ
```
import numpy as np
x = np.arange(10)
# array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

# 配列のスライスへは以下を指定してアクセスする
# x[start:stop:step]

x[:5]
# array([0, 1, 2, 3, 4])

x[::2]
# 2つおきに表示
# array([0, 2, 4, 6, 8])

x[1::2]
# 1から始まる2つおきの要素
# array([1, 3, 5, 7, 9])

x[::-1]
# 逆順
# array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])

x[5::-1]
# インデックス5から逆順
# array([5, 4, 3, 2, 1, 0])

## 2次元配列

y = np.random.randint(1,10,(3,4))
# array([[4, 2, 2, 9],
#        [1, 7, 5, 3],
#        [5, 2, 1, 6]])

y[:2, :3]
# array([[4, 2, 2],
#        [1, 7, 5]])

y[:2, ::2]
# カット + くりぬき
# array([[4, 2],
#        [1, 5]])

y[::-1, ::-1]
# ひっくり返す
# array([[6, 1, 2, 5],
#        [3, 5, 7, 1],
#        [9, 2, 2, 4]])

y[:, 1]
# 1列目を取り出す
# array([2, 7, 2])

y[1, :]
# 1行目を取り出す
# array([1, 7, 5, 3])

x[:, np.newaxis]
# 列ベクトルの作成
# array([[0],
#        [1],
#        [2],
#        [3],
#        [4],
#        [5],
#        [6],
#        [7],
#        [8],
#        [9]])
```
Numpy操作まとめ

# Numpyの操作方法をまとめておく
```
import numpy as np

# 型を指定して配列を作成
np.array([1,2,3,4], dtype='float32')
np.array([range(i, i+3) for i in [2, 4, 6]])

# 値を指定して配列を作る
np.zeros((2, 3), dtype='int')
np.ones((3, 5),dtype=float)
np.full((3,5), 3.14)

# 範囲を指定した配列
np.arange(0, 20, 2)
np.linspace(0, 20, 5)

# 0 から 1の範囲内のランダムな値で配列を作る
np.random.random((3,3))
# 0 から 10の整数の範囲内のランダムな値で配列を作る
np.random.randint(0, 10, (3, 3))

# 単位行列
np.eye(3)

# メモリから値を取得
np.empty(3)

```
[WIP]scopeを使った、データーベース検索機能テンプレートの作成

データーベースから検索した条件を、ビューに表示したい時・・・

```products_controller.rb
class ProductsController < ApplicationController
  def index
    parent = Category.find(1)
    child = Category.where( parent_id: parent.id )
    grandchild = Category.where( parent_id: child.ids )
    @ladies = Product.where(category_id: grandchild ).order(created_at: :DESC).limit(4)
  end
end
```
こんな感じに長くなってしまう時があります。
しかも

```products_controller.rb
parent = Category.find(1)
parent = Category.find(3)
parent = Category.find(5)
```

と条件が増えると`controller`の可読性が下がり、他の開発者がわかりずらい時があります。
こんな時は・・・検索条件を`model`に作成します。
[scope](https://qiita.com/ozin/items/24d1b220a002004a6351)の使い方の詳細はこちらを参考にしてください。


今回私がやりたかった事は、
productsテーブルの中にある商品をカテゴリごとに表示する事。

```product.rb
class Product < ApplicationRecord
  scope :recent_category, lambda { |count|
    parent = Category.find(count)
    child = Category.where( parent_id: parent.id )
    grandchild = Category.where( parent_id: child.ids )
    where(category_id: grandchild ).order(created_at: :DESC).limit(4)
  }

  scope :recent_brand, lambda { |count|
    where(brand_id: count ).order(created_at: :DESC).limit(4)
  }
end
```
今回カテゴリーは[自己結合](https://www.c-and-d.org/model_self_relation/)で作成しているため、productsテーブルの`category_id`は孫idとなっています。
`where(category_id: 親id )`ではデータを取得できません。
なので、まず親idから孫ids(複数あるのでsをつけています)を取得する必要があります。

```product.rb
parent = Category.find(count)
child = Category.where( parent_id: parent.id )
grandchild = Category.where( parent_id: child.ids )
```
この方法で孫idsを取得しました。
今回（　）の部分がカテゴリーによって値が変わるため、引数として値を渡しています。

```product.rb
scope :recent_category, lambda { |引数|
 parent = Category.find(引数)
}
```
controllerで、scopeの変数を記述して値を渡してあげれば・・・

```products_controller.rb
class ProductsController < ApplicationController
  def index
    @ladies = Product.recent_category(1)
    @mens = Product.recent_category(2)
    @babys = Product.recent_category(3)
    @goods = Product.recent_category(4)

    @Vuittons = Product.recent_brand(44)
    @chanerls = Product.recent_brand(42)
    @nikes = Product.recent_brand(143)
    @syupus = Product.recent_brand(125)
  end
end
```
検索条件のテンプレートを作成する事ができ、あら、スッキリーなcontrollerの出来上がり！

⚠️初心者為色々と間違っている箇所があるかと思います。
お気がつきになられましたら、コメントいただけますと勉学の励みになります。
何卒よろしくお願いいたします。
CentOS と VSCode で Golang リモート開発環境

## Install Golang in CentOS server
1. `wget -O go.tgz https://dl.google.com/go/go*.*.*.linux-amd64.tar.gz`
    1. `sudo tar -C /usr/local -xzf go.tgz`
    2. `rm go.tgz`
    
2. `ls .bash_profile`
   - `vim .bash_profile`
        1. `export PATH=$PATH:/usr/local/go/bin:/$HOME/go/bin`
        2. `export GOPATH=/$HOME/go`
   - `source .bash_profile`
   - test: `go version`
   
3. `mkdir -p $GOPATH/src/`

## Install rmate in CentOS server
- `sudo wget -O /usr/local/bin/rmate https://raw.github.com/aurora/rmate/master/rmate` 
- `sudo chmod a+x /usr/local/bin/rmate`


## Remote Edit in Local machine
- Install VSCode
- Enable "Remote VSCode" in Extensions
- TO Use:
    1. cmd+P: >remote start server
    2. ssh -R 52698:localhost:52698 hostname(centos server)
    3. rmate "filename"
    4. edit, save
    5. when u finished: cmd+P: >remote stop server
正の平方根を求めるアルゴリズム

# はじめに
$\sqrt{a}$を求めます。基本的な考え方としては、関数$f\left(x\right) = x^2 - a $と$x$軸との正の共有点の$x$座標が$\sqrt{a}$であることを利用して、計算します。

# １．平均を取って近似していく方法
関数 $f\left(x\right)$と$x$軸の交点を含む範囲の左端を$left$、右端を$right$とします。このとき、$left < \sqrt{a} < right$です。
$f\left(\frac{left + right}{2}\right) < 0$ のとき、$\frac{left + right}{2} < \sqrt{a} < right$ ・・・①
$f\left(\frac{left + right}{2}\right) > 0$ のとき、$left < \sqrt{a} < \frac{left + right}{2}$・・・②
①のとき、$left = \frac{left + right}{2}$ とすると、$left < \sqrt{a} < right$
②のとき、$right = \frac{left + right}{2}$ とすると、$left < \sqrt{a} < right$
この操作を繰り返すことで近似していきます。今回は結果の値として$right$を返します。

```cpp:sqrt1.cpp

double sqrt1(double a) {
    double left = 0.0;
    double right = a;
    double mid = 0.0;
    for(int i = 0; i < 1000; i++) {
        mid = (left + right) / 2;
        if(mid * mid - a < 0) left = mid;
        else right = mid;
    }
    return right;
}
```

# 2. 微分を用いて近似していく方法
$\sqrt{a} < b$ を満たす実数$b$を考えたとき、点$(b,\, f\left(b\right))$における関数$f\left(x\right)$の接線を$l$とします。この接線$l$は、$f'\left(x\right) = 2x$より、
$l: y = 2b(x - b) + b^2 - a = 2bx - (b^2 + a)$
と表されます。ここで、接線$l$と$x$軸との交点の$x$座標は、$2bx - (b^2 + a) = 0$より、$x = \frac{b^2 + a}{2b}$となります。ここで、$\lim_{b \to \sqrt{a}}{x} = \frac{2a}{2\sqrt{a}} = \sqrt{a}$であり、また、$x < b$であることから、$b = x = \frac{b^2 + a}{2b}$として操作を繰り返していけば、$b$が$\sqrt{a}$に近づくことがわかります。

```cpp:sqrt2.cpp

double sqrt2(double a) {
    double b = a;
    for(int i = 0; i < 1000; i++) {
        b = (b * b + a) / (2 * b);
    }
    return b;
}
```

# おまけ
## 計算量について
この2つの方法は、どちらの方が先に$\sqrt{a}$に近づくのか、求めたい精度の有効桁数を$N$として求めてみましょう。
まず、1番目の方法は、$a × 10^{N-1}$個の数の中から1つを選ぶ二分探索と同じですので、計算量は$O(\log(a×10^{N-1})) → O(N)$です。
それに対して、2番目の方法は簡単には分かりません。そこで、以下のコードを実行しました。

```cpp:sqrt3.cpp
#include <cstdio>
#include <unistd.h>

double sqrt3(double a) {
    double b = a;
    for(int i = 0; i < 10; i++) {
        b = (b * b + a) / (2 * b);
        printf("step:%d val:%.20f\n", i + 1, b);
        usleep(100000);
    }
    return b;
}

int main() {
    sprt3(2.0);
    return 0;
}
```

すると、以下のような実行結果が得られました。

```
step:1 val:1.50000000000000000000
step:2 val:1.41666666666666674068
step:3 val:1.41421568627450988664
step:4 val:1.41421356237468986983
step:5 val:1.41421356237309492343
step:6 val:1.41421356237309492343
step:7 val:1.41421356237309492343
step:8 val:1.41421356237309492343
step:9 val:1.41421356237309492343
step:10 val:1.41421356237309492343
```
この結果をまとめると、
$N=1$のとき、$step=1$
$N=2,3$のとき、$step=2$
$N=4,5,6$のとき、$step=3$
$N=7〜12$のとき、$step=4$
…と続いていくことから、$O(\log N)$であると推測できます。

もちろん1番目の場合は$a$の値(というより$right$を初期化する際の値)によって、2番目の場合は$b$を初期化する際の値によって計算に必要な時間は変化します。そのため一概には言えませんが、一般的に2番目の方法の方が優れたアルゴリズムであると考えられるでしょう。

# 追記
2番目の方法がニュートン法であることに後から気付きました。とても有名なアルゴリズムです。何で気付かなかったんだろ。ちなみに1番目の方法も二分法ってやつです。これまた有名なアルゴリズムです。
Rails Tutorial（2周目）-1-

#はじめに
本日からrailtutorialの2周目を開始したので、その中で自分が学んだことをQiitaにまとめて行こうと思います。
学んだことすべてを書くというよりは、学んだ中でも特に重要と感じたことや、すぐに忘れてしまいそうなことに絞ってまとめようと思います。

前回一周目をしたのが、一ヶ月半ほど前なので忘れていることなども多く、また一周目は軽くやった程度だったので、2周目はじっくりアウトプットしつつやっていければいいかなと考えています。
またそれだけではつまらないので、2周目では機能を拡張していきたいと考えています。

#gemのバージョン指定について

```
gem 'uglifier', '>= 1.3.0'
```
uglifierのバージョンが1.3.0以上であれば最新のgemがアップデートされる。
gemのバージョンの下限を指定しているイメージで、おそらくどんどん最新版に更新されてしまう。

```
gem 'coffee-rails', '~> 4.0.0'
```
4.0.0から4.1までのバージョンにアップデートする。
前者よりもバージョンの幅は狭くメジャーバージョンのリリースはインストールされない。

```
gem 'rails',        '5.1.6'
```
しかし、ちょっとしたマイナーアップグレードでもトラブルを起こす可能性があるため、上のように固定することのほうが多い

#MVCアーキテクチャについて
RailsはMVCアーキテクチャを採用している
M=model, V=view, C=controllerの意。
modelはデータベースと情報をやりとりしているオブジェクト
viewはHTMLなどのブラウザの画面に表示されるファイル
controllerはwebサーバとのやりとりをする

webサーバー↔ルーティング↔コントローラ↔モデル
　　　　　　　　　　　　　　　　　　　　↔ビュー

#Gitｂの設定
```
git config --global user.name "Your Name"
$ git config --global user.email your.email@example.com
```
コンピュータ一台につき一回セットアップする

```
git init
```
これでリポジトリの初期化を行う

```
git add -A
```
ステージングする（待機用リポジトリに置く）

```
git commit -m ""
```
コミットする（ステージングエリアで控えている変更をローカルリポジトリに反映する）

```
git checkout -f
```
前回のコミットでチャックアウトすると、作業ツリーでの変更でコミットされていないミスを前回のコミットで上書きできる

#Githubの設定
```
ssh-keygen
```
で公開鍵の作成

```
$ cat ~/.ssh/id_rsa.pub
```
で公開鍵を参照する

```
$ git remote add origin URL
$ git push -u origin --all
```
で追加したインデックスをgithubに作成

`$ git checkout -b modify-README`
でトピックブランチの作成

`$ git checkout master
$ git merge modify-README`
でブランチを抜けて、masterブランチにブランチでの変更をマージする

`$ git branch -d modify-README`
これでブランチの削除
ブランチの時点でコミットまで行われているため、あとはプッシュしてリモートリポジトリに変更を支持するのみ。
【メモ】GitとGithubの使い方忘備録

はじめまして。これからエンジニアを目指す者です。
完全に個人的なメモ代わりですが、GitとGitHubの使い方に関して走り書きしたいと思います。

１．初期化
git init

２．ステージングエリアへの追加
git add ファイル名

３．ローカルリポジトリにコミット
git commit -v
※-vで前回コミット時との差を確認できる

４．リモートリポジトリ（GitHub）にプッシュ
git remote add origin [GitHubのgit名]
git push -u origin master
#プログラミング 学習でチュートリアルをやるときはこまめにシステムチェックを走らせてみよう ( #django の例 )

# あっ！
- いろいろコミットや変更したあとに全然動かなくなった！全部やり直し！ とかいう事態を防ごう。
- こまめに動作成功のたびに git のコミットを積んだりして、着実に一歩ずつ前に進もう。
# 問題ない場合
```
$ ./manage.py check
System check identified no issues (0 silenced).
```
# 問題ありの場合
```
$ ./manage.py check
Traceback (most recent call last):
  File "./manage.py", line 21, in <module>
    main()
  File "./manage.py", line 17, in main
    execute_from_command_line(sys.argv)
  File "/Users/yuma/.pyenv/versions/3.6.0/lib/python3.6/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
    utility.execute()
  File "/Users/yuma/.pyenv/versions/3.6.0/lib/python3.6/site-packages/django/core/management/__init__.py", line 357, in execute
    django.setup()
  File "/Users/yuma/.pyenv/versions/3.6.0/lib/python3.6/site-packages/django/__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/Users/yuma/.pyenv/versions/3.6.0/lib/python3.6/site-packages/django/apps/registry.py", line 114, in populate
    app_config.import_models()
  File "/Users/yuma/.pyenv/versions/3.6.0/lib/python3.6/site-packages/django/apps/config.py", line 211, in import_models
    self.models_module = import_module(models_module_name)
  File "/Users/yuma/.pyenv/versions/3.6.0/lib/python3.6/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 978, in _gcd_import
  File "<frozen importlib._bootstrap>", line 961, in _find_and_load
  File "<frozen importlib._bootstrap>", line 950, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 655, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 678, in exec_module
  File "<frozen importlib._bootstrap>", line 205, in _call_with_frames_removed
  File "/Users/yuma/.ghq/github.com/YumaInaura/django-rest-framework-tutorial/snippets/models.py", line 10, in <module>
    class Snippet(models.Model):
NameError: name 'models' is not defined
```
# NOTE

- rails なら rails console をマメに叩くとかだろうか
- テストもまだ作っていないぐらいの段階の話。

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
量子コンピューティングを試してみた



AI Academyの[量子コンピューター入門編](https://aiacademy.jp/texts/#quantum)に沿っていろいろと試してみた。
※なので、今回使ったのはQiskitではなく、blueqat


``` python
# 準備
from blueqat import Circuit

# Xゲートを0番目の量子につなぐ
# Xゲート：反転
Circuit().x[0].run()
```

>array([0.+0.j, 1.+0.j])

反転したので、|1>になっている。


``` python

# H：アダマールゲート：重ね合わせの状態を作る
Circuit().h[0].run()
```

>array([0.70710678+0.j, 0.70710678+0.j])


``` python
# 測定
# Circuit().m[:].run(shots=100)
print(Circuit().x[0].m[:].run(shots=100))
print(Circuit().y[0].m[:].run(shots=100))
print(Circuit().z[0].m[:].run(shots=100))
print(Circuit().h[0].m[:].run(shots=100))
```

>Counter({'1': 100})
Counter({'1': 100})
Counter({'0': 100})
Counter({'1': 58, '0': 42})

重ね合わせると、0,1が半々ぐらいになっている。

ちなみにいくつか調べてみるとblueqatで結果表示でlast_resultを使うってあったりするが、
https://qiita.com/gyu-don/items/9db7a585a126ffd1b994 によると
last_resultみたいな使い方はやめたとのこと。

``` python
# 2量子ビット
# CXゲート：制御ビットが1の時だけ、標的ビットを反転
Circuit().cx[0,1].m[:].run(shots=1)
```
>Counter({'00': 1})


``` python
# CXゲートのその他パターン
c1 = Circuit(2).x[0]
print("{} -> {}".format(c1.m[:].run(shots=1), c1.cx[0,1].m[:].run(shots=1)))

c2 = Circuit(2).x[0].x[1]
print("{} -> {}".format(c2.m[:].run(shots=1), c2.cx[0,1].m[:].run(shots=1)))

c3 = Circuit(2).x[1]
print("{} -> {}".format(c3.m[:].run(shots=1), c3.cx[0,1].m[:].run(shots=1)))
```

>Counter({'10': 1}) -> Counter({'11': 1})
Counter({'11': 1}) -> Counter({'10': 1})
Counter({'01': 1}) -> Counter({'01': 1})

制御ビット(0番ビット)が1の場合だけ、標的ビット(1番ビット)が反転しているのがわかる


``` python
# CCXゲート：制御ビットが両方1の時、標的ビットを反転する
# 真面目に書くと長くなるが、これ用の関数が用意されているのでそれを使えばOK
print(Circuit().x[:2].ccx[0,1,2].m[:].run(shots=1))
print(Circuit().x[:1].ccx[0,1,2].m[:].run(shots=1))
print(Circuit().x[0].ccx[0,1,2].m[:].run(shots=1))
print(Circuit().x[1].ccx[0,1,2].m[:].run(shots=1))
print(Circuit().x[0].x[1].ccx[0,1,2].m[:].run(shots=1))
print(Circuit().x[0].x[1].x[2].ccx[0,1,2].m[:].run(shots=1))
```

>Counter({'111': 1})
Counter({'100': 1})
Counter({'100': 1})
Counter({'010': 1})
Counter({'111': 1})
Counter({'110': 1})

制御ビット(0番,1番ビット)の両方が1の場合だけ、標的ビット(2番ビット)が反転しているのがわかる


# 所感
Xゲートはわかりやすい。YゲートやZゲートは意味はわかるんだが、ちゃんと理解できているとも思えない。それでも、前になんとなくしかわからなかったゲート型のやつがなんとなくわかったような気がする。
とはいえ、これをどうやって使えばいいのかどうかが全然わからない。


あと、アニーリングも試してみたいんだけど、その前に数理モデルをたしなんでみないとそもそも定式化ができないんだよな。
あと、同じようなものをQiskitでも試してみたい。

今回作ったものは以下に。
https://github.com/RyoNakamae/quantum/blob/master/quantum.ipynb