OmniAICreator/Qiita-1.07M huggingface dataset:
1からAlexaスキル開発入門してみる！第一幕　〜スキルの種類編〜

さて、これからAlexaスキルに関するいろいろな情報をまとめていきます。

基本的に、この情報はAlexaスキル開発公式チュートリアルを元にしています。
https://developer.amazon.com/ja-JP/alexa/alexa-skills-kit/courses/cake-walk

これをわかりやすくかみ砕いて、いろいろ書く予定なのでよろしくお願いします。。

第一幕は、「スキルの種類編」です。

Alexaスキルといっても、いろいろな種類があります。
その種類をまとめていきます。

Alexaスキルは多きく分けて、プリビルドスキルとカスタムスキルの２つの種類の分類することができます。

#プリビルドスキルとは？

プリビルドスキルとは、あらかじめスキルの雛形が作ってあるスキルのことを言います。

複雑なプログラミングなどをせずに簡単にAlexaスキルを実装することができます。

プリビルドスキルには以下の４つの種類があります。

- スマートホーム
- フラッシュブリーフィング
- ビデオ
- 音楽

##スマートホームとは？
スマートホームとは、名前の通りスマートホーム関連の機器を操作できるようにするためのスキルです。

スマートホームスキルAPIというのをスキル内で利用することで、スマートTVや対応している電球などをアレクサから操作できるようになります。

スキルに対して、
「アレクサ、リビングの照明をつけて」
「アレクサ、エアコンをつけて」
「アレクサ、玄関のカメラを見せて」
というリクエストを送信できるようになります。

##フラッシュブリーフィングとは？

フラッシュブリーフィングとは、ニュースやポッドキャストなど短いコンテンツを提供するコンテンツを再生できます。

テキストの読み上げだけでなく、オーディオコンテンツを再生することも可能です。

フラッシュブリーフィングスキルAPIを利用しています。

アレクサに対して、
「アレクサ、フレッシュニュースを聞かせて」
「アレクサ、ニュースを教えて」
といったリクエストを送信できるようになります。

##ビデオスキル
ユーザーにビデオスキルAPIを利用して、ビデオコンテンツを提供することができます。
コンテンツの提供だけでなく、ビデオに関連する操作を行うことも可能です。

「アレクサ、『七人の侍』を再生して」
「アレクサ、テレビのチャンネルを４に変えて」
といったリクエストを送信できるようになります。

##音楽スキル
※2020/03/24時点で、米国のみでサポートされ日本ではサポートされていません。

利用者に対して、音楽やラジオなどのオーディオコンテンツを提供できます。

例えば、
「アレクサ、何か音楽をかけて」
「アレクサ、ジャズをかけて」

といったリクエストを送信できるようになります。

#カスタムスキルとは？
カスタムスキルとは、開発者がなんでも自由に作れる種類のスキルです。

ほとんどのAlexaスキルはカスタムスキルとなっています。

#まとめ
最後に、それぞれの関係図をまとめてみます。

```
- プリビルドスキル
  -スマートホーム
  -フラッシュブリーフィング
  -音楽スキル
  -ビデオスキル
-カスタムスキル
```

ただ、ある意味プリビルドスキルとはカスタムスキルの一種と考えることも可能ですが、今回はわかりやすく以上の関係図としました。
タグページの動作がまたおかしくなってる

地味に、タグページのブラウザバック動作が[また](https://qiita.com/rana_kualu/items/01799dce98ea36e01718)おかしくなっている。

・[タグページ](https://qiita.com/tags/qiita)を表示
・`＞`を選んで2ページ、3ページ、4ページと進む
・ブラウザバックすると、URLは変わるのに表示内容が変わらずにそのまま。

[マイページ](https://qiita.com/rana_kualu)は正常にブラウザバックする。
[Contribution](https://qiita.com/rana_kualu/contributions)や[コメントページ](https://qiita.com/rana_kualu/comments)、[新着一覧](https://qiita.com/items)などは元よりページ遷移型なので正常にブラウザバックする。


一応日本最大の技術サイトでありながら、この有様はいったい何なんですかね？
なんつうか、チーフデザイナー的な人物とテスト管理者的な人物を採用すべきでしょう。
あとリーガルアドバイザーもね。
正式に雇うまでいかなくても、ちょっと食事代出すだけで自発的にやってくれそうな人はいっぱいいると思うのですが。
IAMでユーザー作成

今回は学習用の作業ユーザーをIAM(Identity and Access Management)を使って作る。

#作業ユーザー作成
AWSマネジメントコンソールで「IAM」を検索。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/7ec9a03e-7f9a-e928-2d77-e428d0cb68d4.png)
IAM画面の左側のメニューからユーザーを選択し、ユーザー追加を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/285c4204-26bd-7859-ad26-e2e6d5facfd7.png)
ユーザー名、アクセスの種類、パスワードを設定。
パスワードのリセットは複数ユーザーが使う場合にしか使わないので、チェックを外す。
「次のステップ：アクセス権限」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/e52e9ca4-630d-a8eb-a861-1ba56649c9d1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/fb94cc7e-9f53-00b8-ad8b-40448306c9e8.png)
ユーザーの権限を設定する。今回はAWSがある程度設定してくれている権限のテンプレートを使う。
しばらく学習でいろいろ触りたいので、強めの権限を設定。
「次のステップ：タグ」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/28d307b4-084b-8ce4-2b83-07442774ffa7.png)
タグは何もせず次へ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/98d85c9e-77a0-0c48-d242-509a34c04c32.png)
確認画面で確認して、ユーザー作成を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/a6539ef7-8e35-80d6-9c03-a8f8dc879104.png)
ユーザーの追加が完了したので、URLにアクセスしてサインインしてみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/c301b8f0-cb82-7655-d621-dc0132ae4761.png)
#サインイン
追加したユーザーでサインインしてみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/af60ab90-01dd-73fb-6bc7-0daa563e250e.png)
サインイン成功！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/c6a2369b-356b-1187-e0ef-f433f5a8fcd1.png)
Vue.js + JavaScript 双方向データバインディング

#はじめに

初めましての方は初めまして。
豚野郎です。

最近Vue.jsを勉強し始めた為、投稿してみました。
始めて行きます。

#双方向データバインディングとは何か？


双方向データバインディングのお話をしていきます。


難しい説明をしようとすると自分もわからないので、自分が理解している範囲だと
・データを更新すればUIが更新
・UIを更新すればデータが更新
以上の2点が特徴です。

例を出すと、下記のように入力したと同時に画面にも文字が出てきます。

<img width="127" alt="スクリーンショット 2020-03-26 23.19.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497869/0e336aac-5b4c-1ed6-b0e6-85fa8e16914b.png">

##解説
```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>双方向データバインディング</title>
</head>
<body>
    <!-- データからUIに反映 -->
    <div id="app">
        <p>{{ message }}</p>        
    <!-- UIからデータに反映 -->
    <p><input type="text" v-model="message"></p>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script src="js/main.js"></script>
</body>
</html>
```

{{ message }}部分に入力された文字が表示されます。
テキストボックスでv-modelを使うと、
input要素やselect要素に入力した値を使うことができます。

次がJSです。

```js/main.js
(function() {
    'use strict';

    new Vue({
        el: '#app',

        // モデルにデータを保持
        data: {
            message: ''
        }
    })
})();
```

Vueインスタンス(new Vue)を作成すればVue.jsは動きます。
elはelementsの略で、今回idを指定しました。
dataには先ほどv-modelで指定したmessageを書いていきます。


もし最初からデータを保持させたい場合(例.ばなな)、下記を追記します。

```
        // モデルにデータを保持
        data: {
            message: 'ばなな'
        }
```

<img width="122" alt="スクリーンショット 2020-03-26 23.58.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497869/8416122c-0d5d-e60c-b2c3-c562ced538f7.png">


以上です。
ありがとうございました。


###最後に
Markdownの書き方がわからなかった為、下記を参考にさせて頂きました。
https://qiita.com/shizuma/items/8616bbe3ebe8ab0b6ca1
感謝です。
NeuralNetworkを１から実装

#NeuralNetworkを１から実装
今日は昨日の続きで、NeuralNetworkを自力で作ってみました。
[昨日の記事はこちら](https://qiita.com/AoHina/items/137fc52f8f6f084cf6be)

##流れ
昨日の記事にも書いたように、ロジスティック回帰を何個もくっつけたようなものっていうイメージです。
これまでの実装したものをさらに何層にもします。

そして、NeuralNetworkで一番？重要なのは活性化関数です。

NeuralNetworkは人の神経細胞を模しているので、ある基準値を超える数値を与えられたときに発火するようにします。その役割を活性化関数が担っています。

##コード
[day4.py](https://github.com/HinataAoki/Everyday-AI-life/blob/master/day4.py)
バイアスは結果としてよかったものを設定してあります。

##疑問点
1. 今回のように層が決まっていれば、微分の式も書くことができますし、計算できますが、sklearnやほかのライブラリに入っているNeuralNetworkはどういう感じで、入力された数に合わせて、層を作っているのか
2. バイアスをランダムにするとうまくいくときもあれば、うまくいかないときもあった。これをほぼ100%うまくいくようにするには、どのようにすればいいのか

1に関しては数学的な手法がありそうだなーって勝手に思ってます。
2に関してはそれこそ世界中の人が探していることだと思うし、人間なら判断出来て、AIには判断できないこともあると思うので、理論から学んでいくと、こういうことにも興味を持てて、理論からやってよかったなーって思います。もっと調べてみます。

##4日目も終了！
明日はもう少し精度を上げれるようにするか、さっき書いた疑問のどちらかを解決できたらいいなと思います。
あと、もっと見返したときに、どんな手順で実装したかをわかりやすく書きます。
VScodeエディタ上でファイルのコミットごとの変更差分を見る

## VScodeでファイルのコミット毎の変更差分を見る
version 1.43で追加された機能。
直近のアップデートではデフォルトでオフになっているので設定ファイルで有効にしてあげる必要があります。※insider editionではデフォルトでオンになっています。

## 機能説明
機能としては以下のようになります。
<img width="450" alt="スクリーンショット 2020-03-26 23.45.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243100/e76d96a9-201e-759f-2d16-ab71f57184aa.png">

エクスプローラーのTIMELINEと言うヘッダーの中身が今回追加されたtimeline機能です。
内容はコミットメッセージとコミットユーザー、コミットした日になります。
timelineにあるコミットを選択するとコミット毎の差分が見れます。
画像は`add vue component`のコミットメッセージのコミットを選択しています。
左のプレビューが`add fragment template`のコミット時の`register_post.html`ファイルの内容で、右が`add vue component`のファイルです。
<img width="1301" alt="スクリーンショット 2020-03-26 23.47.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243100/0a2528c6-6f96-da9e-aef1-7659c5a6e487.png">

### 設定方法
1. `cmd + shift + P`
2. **Preferences: Open Settings(JSON)**

```settings.json
"timeline.showView": true
```

### 感想
普段自分はgitをCLIでしか操作していないので手軽にエディタ上で確認できてすごい捗ってます。特に誰がコミットしたファイルなのか見れて、手軽に開発者同士で会話できるのがいいと思いました。あと、どれくらいコミット期間がなかったかも見れるので、そのファイルのメンテナンス具合とかも把握できて、特にキャッチアップ期間には有効なのではないかと思いました。
【今日のアブストラクト】The large learning rate phase of deep learning: the catapult mechanism【論文 DeepL 翻訳】

1 日 1 回 論文の Abstract を DeepL 翻訳の力を借りて読んでいきます.

この記事は自分用のメモみたいなものです.
ほぼ [DeepL](https://www.deepl.com/home) 翻訳でお送りします.
間違いがあれば指摘していだだけると嬉しいです.

翻訳元
[The large learning rate phase of deep learning: the catapult mechanism](https://arxiv.org/abs/2003.02218)

# Abstract

### 訳文

初期学習率の選択は, ディープネットワークの性能に大きな影響を与える可能性がある. 本研究では, 解答可能な学習ダイナミクスを持つニューラルネットワークを提示し, その予測を実際の深層学習環境で実証的に確認する. その結果, 学習速度が小さい場合と大きい場合では, ネットワークの挙動が大きく異なることがわかった. この $2$ つの領域は相転移によって分離されている. 学習率が小さい段階では, 無限に広いニューラルネットワークの既存の理論を用いて学習を理解することができる. 大きな学習率では, モデルは勾配降下ダイナミクスがより平坦な最小値に収束することを含む, 質的に異なる現象を捉えている. 我々のモデルの重要な予測の一つは, 大規模で安定した学習率の狭い範囲である. 我々は, 現実的なディープラーニングの設定において, 我々のモデルの予測と学習ダイナミクスの間に良い一致が見られることを発見した. さらに, このような環境での最適な性能は, 大規模な学習率の段階で発見されることが多いことがわかった. 我々の結果は, 異なる学習率で学習されたモデルの特徴に光を当てるものであると信じている. 特に, 既存のワイドニューラルネットワーク理論と, 非線形で大きな学習率の訓練ダイナミクスとの間のギャップを埋めるものである.

### 原文

The choice of initial learning rate can have a profound effect on the performance of deep networks. We present a class of neural networks with solvable training dynamics, and confirm their predictions empirically in practical deep learning settings. The networks exhibit sharply distinct behaviors at small and large learning rates. The two regimes are separated by a phase transition. In the small learning rate phase, training can be understood using the existing theory of infinitely wide neural networks. At large learning rates the model captures qualitatively distinct phenomena, including the convergence of gradient descent dynamics to flatter minima. One key prediction of our model is a narrow range of large, stable learning rates. We find good agreement between our model's predictions and training dynamics in realistic deep learning settings. Furthermore, we find that the optimal performance in such settings is often found in the large learning rate phase. We believe our results shed light on characteristics of models trained at different learning rates. In particular, they fill a gap between existing wide neural network theory, and the nonlinear, large learning rate, training dynamics relevant to practice.
DjangoのGeoIp2操作方法

# DjangoでのGeoIp2の設定から使い方

## はじめに

1. Django1.9以上

2. GeoIp2-databaseのダウンロードをMAXMIND公式サイトから入手する必要がある。
ユーザー登録を行うことで無償ファイルをダウンロードすることができる。

>[MAXMIND公式サイト](https://www.maxmind.com/en/home "maxmind")

## 設定
### django-geoip2-extrasのインストール

``` python
# cmd
pip install django-geoip2-extras
```

### setting.pyを編集
####GeoIP2Middlewareを追加する

```python
# setting.py

MIDDLEWARE = [
    ~
    'django.contrib.sessions.middleware.SessionMiddleware',

    # SessionMiddlewareの後にGeoIP2Middlewareを追加する
    'geoip2_extras.middleware.GeoIP2Middleware',
    ~
]
```
#### GEOIP_PATHを設定する

```python
# setting.py

GEOIP_PATH = os.path.join('mmdbを配置しているパス')
```

## 使い方
```python

# geoip2をインポート
from django.contrib.gis import geoip2

# インスタンス化
geo_ip2 = geoip2.GeoIP2()

# 引数にはドメイン名またはipアドレスを設定する
geo_ip2.city(query)
geo_ip2.country(query)
geo_ip2.country_code(query)
geo_ip2.country_name(query)

```
## 参考サイト
>[django-geoip2-extras 1.2(PyPI)](https://pypi.org/project/django-geoip2-extras/ "django-geoip2-extras 1.2(PyPI)")
>[GeoIP2(Django公式ドキュメント)](https://docs.djangoproject.com/en/3.0/ref/contrib/gis/geoip2/ "GeoIP2(Django公式ドキュメント)")
社内勉強会の取り組み

弊社は2年前から「研修会」という名の社内勉強会を行っています。
社内勉強会自体はずっと前から有志によって行われていました。
しかし2年前からは「業務」として実施するようにしました。
業務としてなので勉強会中は「業務時間」として見なされますし、定時後の場合残業代もつきます。

##2019年度に実施した研修会
2019年度は以下の5つの研修会を実施しました。

* ビジネスプラン検証
* Rust言語
* Deep Learning
* ビジネス英語
* 論文技術

ビジネスプラン検証は、あるビジネスのアイデアがあった時にそれが有用であるかどうかを検証するプロセスを身につけるという目的の研修会です。
Rust言語は言うまでもなくプログラミング言語のRustですが、受講者はRustの知識が全くない状態から簡単なアプリケーションを作成し、発表を行うというところまで出来ました。
Deep LearningはPCを使ったハンズオン形式で実際に実装を行うというものです。
ビジネス英語は社外の英会話スクールにてネイティブの講師のレッスンを受けるというものです。もちろんレッスン代は会社の費用です。
論文技術は実際にシンポジウムなどに何度も論文を採択されている社員が講師になって、審査を通りやすい論文のテクニックの講義を行い、受講者が書いた文章をその場で添削するという実践的な内容でした。

##勉強会実施のハードル
研修会にはそれぞれ担当者（講師）がおり、受講者の選出や実施日程の調整などはその担当者が行うようにしていました。
前年度もそのようにしていたのですが、講師が忙しかったりまだ時間があると思っていたら時間がなくなったりと予定の実施回数を実施できなかった勉強会がいくつもありました。
そこで今年度は毎月（実施してもしなくても）報告のメールを出してもらうようにし、実施状況を常に意識してもらうようにしました。
また、その報告メールは全ての担当者が見ることになり、他の勉強会の実施状況を知ることでもし自分の担当している勉強会の実施状況が芳しくない場合は「あせり」となってより効果があったように思います。
そのおかげか今年度の勉強会はすべてのタイトルで予定回数を実施できました。

##勉強会は楽しい
IT系の多くの会社ではこのように社内勉強会を実施しているところは少なくないと思います。
弊社での今年度の勉強会はうまくいったと思っていますが、来年度はわかりません。
そして勉強会は何も社内だけでなく、最近は社外でも活発に行われています。
どちらの勉強会も参加することで多くの学びがありますし、学びがあることで成長します。
最後に強調したいのは、***成長することは楽しい***ということです。
そう思えれば勉強会に参加することも楽しく思え、続けることができるのだと思います。
[GAS]GSuite API を実行する際の勘所

## 要旨

企業の情シスとして GSuite の管理者してます。社員からの「パスワード忘れたお」メールがうざいので、GAS から API 叩いてリセットする仕組みを作りました。その際にはまったことを記します。

## スクリプト

```js:resetPassword
function resetPassword(id, pw){
  let userKey = id;                            // hoge@company.org
  let data = {
    "password": pw,                            // 仮パスワード
    "changePasswordAtNextLogin": true,         // ログイン後にパスワードの変更を強制
  }

  let res = AdminDirectory.Users.update(JSON.stringify(data),userKey);
  Logger.log(res);
}

```

## はまったこと

### API アクセスキーとかいるのいらないの？

結果的には不要でした。G Suite の管理コンソールにて Directory API の呼び出しを有効にすれば OK。

[**Enabling Google Advanced Services**]
(https://developers.google.com/apps-script/guides/services/advanced?hl=ja#enabling_advanced_services)
(https://developers.google.com/apps-script/guides/services/advanced?hl=ja#enabling_advanced_services)

自ドメインの Google Drive 上の GAS スクリプトから API 経由で自ドメインのリソースを操作するのは無条件に許可されます。

### GAS のマニュアルどれ読めばいいの？

まずはこちらを読みましょう。私はここにたどり着くのに 1 時間迷いました。

[**G Suite Developer > Admin SDK > Directory API > GAS**]
(https://developers.google.com/admin-sdk/directory/v1/quickstart/apps-script?hl=ja)
(https://developers.google.com/admin-sdk/directory/v1/quickstart/apps-script?hl=ja)

次いでユーザー操作 API の仕様を確認しましょう。

[**G Suite Admin SDK > Directory API > Users**]
(https://developers.google.com/admin-sdk/directory/v1/reference/users?hl=ja)
(https://developers.google.com/admin-sdk/directory/v1/reference/users?hl=ja)

今回作成したパスワード上書きスクリプトは、update メソッドを使います。

[**G Suite Admin SDK > Directory API > Users.update**]
(https://developers.google.com/admin-sdk/directory/v1/reference/users/update?hl=ja)
(https://developers.google.com/admin-sdk/directory/v1/reference/users/update?hl=ja)

これらのドキュメントを読んでも、GAS の関数として call する場合「第一引数に何を指定すればよいか」といった基本的な説明が見当たりませんでした。(userKey, data) の順で指定するも Parse Error、data にエントリーすると引数が一致しません、などなど。

試行錯誤の結果、(data, userKey)という直感に反した順序であることが判明。ひどい。

### まとめ

GSuite API に関する日本語の記事は案外見つからないので、情シスな方々のお役に立てれば幸いです。
rotationでオブジェクトがランダムに傾く方法

##勝手に倒れるオブジェクト

**rotation**を利用して、オブジェクトがランダムに傾くのをキーで操作する方法を紹介します。

![dqz4d-ebqdc.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609200/ae7451b9-3ee2-5635-082a-cfaca5cf9d34.gif)

z軸を使って回転します。

Unityでは**Quaternionで回転数を決めている**ので、先に宣言。
new Vector3のzの値に**Random.Range**を使って1-4までの乱数を返します。
これにより、ランダムで傾きます。

```php
    void Update()
    {
        
        Quaternion quaternion = this.transform.rotation;
        float rot_z = quaternion.eulerAngles.z;


        transform.Rotate(new Vector3(0, 0, Random.Range(1,4)));
  　}

```

##キーで傾きを制限
この傾きをキーを使って戻したり、するためには下記のコードを追加。
zの値は乱数の最大値よりも大きな値を設定します。

```php
     void Update()
    {
        

        Quaternion quaternion = this.transform.rotation;
        float rot_z = quaternion.eulerAngles.z;


        transform.Rotate(new Vector3(0, 0, Random.Range(1,4)));
     

        if (Input.GetKey(KeyCode.RightArrow))
        {

            transform.Rotate(new Vector3(0, 0, -6));

        }

        if (Input.GetKey(KeyCode.LeftArrow))
        {

            transform.Rotate(new Vector3(0, 0, 6));

        }

    }
```

##下重心にする
しかし、上記のスクリプトをただオブジェクトにアタッチした場合、こうなります。
![movie1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609200/aad10b89-e631-307d-79eb-2634a7b5d738.gif)

なので、今回は重心を下にしてplaneにCapsulの面が触れながら傾きたかったので、
**空のGameObjectを作成**します。
そしてpositionを重心を置きたい位置に合わせます。
今回はここ。
<img width="847" alt="スクリーンショット 2020-03-26 19.01.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609200/53e1de84-83b0-fe3b-a649-7f6d80c070f0.png">
そして、
###空のGameObjectを親にして、Capsuleを子にします。
スクリプトをアタッチするのは**空のGameObjectの方**です。
<img width="213" alt="スクリーンショット 2020-03-26 18.56.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609200/fc0f79eb-e541-c741-de2a-c58ed68b5c52.png">

すると、このように傾きます。
人間を傾ける時なんかは足がついていないといけないので、この方法が利用できるかなと思います。
![dqz4d-ebqdc.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609200/2a236368-f996-747e-f855-5f0322be9dc4.gif)
某タイヤメーカーカタログの騒音評価指標について

# はじめに
6万km走った純正タイヤからブリヂストンREGNOに変えたところ、静かだし走り出しが軽いしで高いタイヤってこんなに良いものなんだなあと感動しました。ところで一体音は何dB減ったのだろうと気になってカタログを見てみたら、こんな騒音評価指標が使われていました。 
[REGNO GR-XII 製品特徴](https://tire.bridgestone.co.jp/regno/gr-x2/index.html)

音圧差での騒音エネルギー低減率の換算式は、
$$騒音エネルギー低減率(\%)= \left( \frac{1}{10^{\frac{音圧差}{10}}} - 1 \right) \times 100$$

人間の感覚は対数的であることが知られています(ウェーバー・フェヒナーの法則)。音も例外ではないため、リニアスケールからログスケールへ変換したいところです。

# 騒音低減量 デシベル
音が何とかdB減ったというときは、比べている2つの音の音圧比または音の強さの比の常用対数をとります。

```math
\begin{align} 騒音低減量(\rm{dB}) &= 10 \log (音の強さの比) \\
 &= 20 \log (音圧比) \end{align}
```

logの前が10だったり20だったりするのは以下の関係式が成り立つからです。
$$音の強さ(\rm{W/m^2}) = \frac{(実効音圧(Pa))^2}{(密度(kg/m^3))(音速(m))}$$
一部の音楽プレイヤーは音量がdB表記なので馴染み深い方も多いのではないでしょうか。  

# リニアスケールからログスケールへ変換
騒音エネルギー低減率(%) を見慣れたデジベル表記に変換します。
$$音圧差 = -10 \log \left( 1 - \frac{騒音エネルギー低減率(\%)}{100} \right)$$  
音圧差というネーミングですが、これは実際には音圧比(dB)のようです。紛らわしいですね。
音圧差と書いてあったのでもっと面倒な変換が必要なのかなとも思いましたが、何のことはなくただ対数を取ればいいだけでした。  
  
騒音エネルギー低減率(%)とデシベルの対応をグラフで見てみます。
![騒音低減量.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455608/ee423e8f-09df-fe1a-b935-c19f4bebc5fb.png)

20%音が減ったとか書いてあるとおお、すごいなと思いますが(実際すごい)、耳で聞いてみるとそんなに差は感じないと思います。
私が感動したのは古いタイヤかつ下位グレードからの交換だからで、GR-XIとGR-XIIの違いは判断が難しいレベルかもしれません。あくまでもカタログスペック上はです。
インターン(IT企業)でのチーム開発経験から学んだ事を社会人になる前に振り返る

#はじめに
今春から、社会に出てエンジニアとして働きます。
就職活動では、大手IT企業2社でインターンの経験をしました。
社会人になる前に、インターンでの経験から学んだ事を思い出し、社会人生活で活かしていきたいと思います。
IT企業のインターン経験前などの学生の役に立つことができればと思います。

#知らない技術に対して
###知らないことや、できない事があっても落胆せずに、積極的に学んでほしい
大手企業でのインターンであった為、配属された部署を選ぶ事はできず、配属先では全く興味のないIT技術での開発でした。
社員から言われたテーマは、「できる限りみんなの知らない事を身に着けてもらう」。求められたのは、知識を身に着け、その知識を知恵を使って活用する事。また、知らない事に関して、考える事も必要であるが、誰かが知っている事は、聞いてしまっても良いと話してくださいました。

###社会に出ると「学ぶために学ぶ」という事ができる機会が減る
しかし、学ばなければ成長できない。いかに日常を効率的に過ごして、新しい知識を導入する時間を増やせるかが大切だとインターンの際に話してくれました。学生の頃は、授業で学ぶ事ができたり、学ぶ事も研究の一部だったので、社会人は大変だと感じました。ITは、日進月歩で新しい技術やサービスが生まれていくため、今はトレンドな技術も、また新しい技術にとって代わる事も多いので、学び続けていきたいと思います。

#チームでの開発
###課題の共有や、お互いの状況の伝達が重要
学生時代は研究活動で実験やコーディングを1人でしています。授業でチーム開発経験はありますが、気の知れた同期とのチームなので意思疎通がしやすいです。インターンでは、そこで知り合った人と人間関係を構築しながら、開発を進めました。
アプリ開発のゴールに向かって作業を分担した後、課題の共有や、お互いの状況の伝達が重要となり、意識のズレなどをなくしていく事を意識しました。
###完璧にこだわりすぎない意識
周りと強調して進めていく意識と共に、完璧にこだわりすぎない意識を持つ事も心がけました。時間も限られたなかでの開発であった為、ある程度の完成度で見切りをつける状況もありました。

#1日のはじまりの前に
###物事を始める前に、目標・時間・達成できなかった場合にどうすべきか決める
毎日、各個人でその日のタスクを事前に共有し、自分が何をしているのか周囲に伝えてから、作業に取り掛かりました。また、その1日の中でも、物事(タスク)を始める前に、目標(ゴール)と、時間と、達成できなかった場合にどうすべきかの3項目を決めながら取り組む努力をしていました。これは、モチベーションアップだけでなく、どのような状況なのかを周りに判断してもらう事にも繋がります。開発中では、進捗に問題があるかどうかを簡潔に伝えられるようにする事が求められました。
###個人的に大変だったこと
達成できなかった場合にどうするべきかを考えながら作業に取り組む事は、とても大変でした。問題を解決する為に、調べて試してみる。できなかった場合に、別の方法をまた考えるではなく、試しながら次の事を考える事が仕事として重要と教えられました。トラブルシューティングの際に、多くの選択肢を持ち、素早く切り替えられるかという事を学びました。

#プログラミングについて
プログラミングでは、これまで触った事がない言語での開発であったため、調べながらの開発でした。その際に、どのような機能かしっかり理解しないまま、コピー&ペーストしてしまった時、開発者として指摘されました。
また、モダンなコードでは型やフォーマットなど強く意識せずとも書けるが、それが障害になることもある。だからこそ、その部分を意識できる人が貴重になると教えてもらいました。

#人へのお願いの仕方
インターンに参加した学生だけでの開発では、発表日に間に合わなそうとなった際に、社員の方にも手伝っていただきました。その際の仕事のお願いの仕方を学びました。
何をやってほしいのか、いつまでにやってほしいのかを明確に伝える事を学びました。
曖昧な締め切り日であると、作業に取り掛かってもらえません。また、こちらが相手が忙しそうだから、長い期間を提示するという事もしないでいいと感じました。自分の希望を伝えてから、その時間では難しいというコミュニケーションをすればいいという事です。
また、曖昧な指示だと、自分のイメージと違うものができる場合があります。思った通りにいかない場合は、指示した側の責任という事を学びました。

#さいごに
このインターンの経験を通して、自身の技術力の低さ、コミュニケーション能力の低さを痛感しました。コンフォートゾーンの外に出て、ラーニングゾーンの領域で、興味の無かった分野で知らない言語での開発は、その期間中はとてもストレスでしたが、大きく成長することができたと思います。一週間後から新社会人になりますが、コンフォートゾーンの外で学び続ける姿勢を大切に、そして身体も大切に過ごしていきたいと思います。
Amazon Auroraを使用してみた。


<h1>Auroraの特長について</h1>

・高性能：標準的なMySQLデータベースと比べて約5倍
　　　　　標準的なPostgreSQLデータベースと比べて最大で約3倍高速
・他データベースと同等のセキュリティ、可用性、信頼性を、10分の1のコストで実現

・RDSを使用した完全マネージド型サービスのため管理タスクが自動化されている

・ストレージシステムは分散型で耐障害性と自己修復機能を備えており、データベースインスタンスごとに最大64TBまで自動スケール可能

・最大15個のリードレプリカ、ポイントインタイムリカバリ、AmazonS3への継続的なバックアップ、3つのアベイラビリティーゾーン(AZ)間でのレプリケーションにより、優れたパフォーマンスと可用性を実現

<h1>基本構造</h1>

・3つのAZにデータを保持することで可用性が向上

![AuroraArch001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272157/be1a2ee3-142d-cdd0-9f08-75d78c58f81f.png)

<h1>試しに作成する</h1>
エディション：MySQL
バージョン：Aurora(MySQL)-5.6.10a
データベースロケーション：リージョン別
データベースの機能：1つのライターと複数のリーダー
テンプレート：開発/テスト
DB クラスター識別子：任意
マスターユーザー名：任意
マスターパスワード：任意(8文字以上)
メモリ最適化クラス
DBインスタンスサイズ：db.r5.large(16Git)
可用性と耐久性：本番ではマルチAZ配置がほとんど
接続：対象のVPCに紐付ける
データベース認証：パスワード認証
追加設定：CloudWatchの監視設定、自動プロビジョニング設定、セキュリティグループの紐付けなどが可能
　　　　　今回はデフォルト(メインはAuroraのため)

作成すると以下のように3つのインスタンスが作成されます。
<img width="1078" alt="スクリーンショット 2020-03-26 22.43.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272157/fe972f23-003e-4a0d-6efe-048156d03570.png">
Ubuntu 16.04/18.04 LTS + windows10で CPU利用率100%

# 概要
ATcoderのビルド環境として、Ubuntu 18.04 LTSをwindows10上で動作させていましたが、ある日突然動作しなくなりました。正確には、VScodeからRemote WSLを利用していたのですが、terminalが反応せず、CPU利用率が100%になってしまいました。タスクマネージャーを確認すると「init」[bash]などのよく分からないタスクが並んでいました。

# 原因
再起動、各ソフトのダウングレードなど実行しましたが、結局はwindows updateによる影響でした。windows updateによって仮想マシンが許可されない状況となってしまっていました。この設定を変えるだけで解決しました。

# 解決方法
解決方法は以下のサイトに書かれていました(https://teckangaroo.com/enable-windows-10-virtual-machine-platform/)。 英語なので日本語で以下に手順を書いておきます。
手順は以下の通りです。

1. コントロールパネルを開く
2. プログラムをクリック<br><img width="521" alt="コメント 2020-03-26 225629.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272711/7c8fefd5-ff5f-8f78-dcbf-8035345f8eb8.png">
3. 「Windowsの機能の有効化または無効化」をクリック<img width="585" alt="コメント 2020-03-26 225629_2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272711/4adb77e5-13f3-a6ce-7dd5-9ce5e9a54ffe.png">

4. 「仮想マシン プラットフォーム」に☑を入れて「OK」<img width="341" alt="コメント 2020-03-26 225521.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272711/23df8b1f-9a2e-a7c1-873d-1733e48e279f.png">

以上で完了です。

# 所感
プラットフォーム自体起動できなければ、セキュリティだと気付いたと思いますが、仮想マシンも起動できてしまい、かつコマンドも一定時間実行できるのでここが問題だとは思わなかった。
【TypeScript】Next.jsでqueryパラメータを取得する方法

#getInitialPropsの引数に({ query }: { query: any })を渡す

以下のようなイメージです。

```
Page.getInitialProps = async ({ query }: { query: any }) => {
  console.log(query);
  return query;
};
```

URLが 「/page?id=hogehoge」だった場合は　{ id: 'ZNDhKYaXyAnEcG2vqhUA' }　を返します。
【Automation Anywhere A2019】一度指定したウィンドウ型変数でウィンドウタイトルだけを微調整したい場合

# 概要
Automation Anywhere A2019で使える[変数](https://qiita.com/RPAbot/items/efdd03462e35dad35012)のひとつに、「ウィンドウ型」があります。これは、ウィンドウを特定する情報を格納しておく変数で、実行可能ファイルとウィンドウタイトルの情報が保持されます。

アクションには、詳細のオプションでウィンドウ型変数を指定できるものがあり (たとえばIfアクションの条件指定)、ウィンドウ一覧のドロップダウンリストからウィンドウをひとつ選択すると、ウィンドウタイトルと実行可能ファイルの情報が格納されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/c3189cec-5c8f-fb63-d26c-fed4ec2c3d7f.png)

この時、実行可能ファイルのフィールドはテキストとして編集できませんが、ウィンドウタイトルの部分は自由に編集できます。アスタリスク/ワイルドカード「*」を指定すると、前方、後方に任意の文字列が来るような場合 (ファイル名やユーザー名が表示されていて都度変更になる可能性がある場合)に便利です。

その後、アクションを保存して、また戻ってくると、今度は変数に`$window-1$`が指定された状態となっています。この変数`$window-1$`は先のウィンドウ指定時に自動的に作成され情報が格納されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/e01032a1-6182-e925-d67f-f0ce8c16e91a.png)

それでは、この`$window-1$`の中身を編集したい場合はどうすればいいでしょうか？

# 方法1: 再びウィンドウ一覧のドロップダウンリストからウィンドウをひとつ選択する
ふたたび「ウィンドウ」タブをクリックしてウィンドウ一覧のドロップダウンリストからウィンドウを指定することもできます。しかし、そうすると実行可能ファイルの情報も一緒に更新されてしまいます。また、今この瞬間に表示されていないウィンドウについて編集したい場合は困ってしまいます。

# 方法2: 変数パネルから変数を編集する
もうひとつの方法は、変数自体を変数パネルから直接編集する方法です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/48aff3f0-7ab2-7a0f-4a98-7ebba923004e.png)

変数のアクションメニューから「変数を編集」メニューをクリックします。
この画面の中で、ウィンドウタイトルフィールドが編集可能なので、このフィールドを編集して「適用」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/58ddabae-953e-530d-2aa5-7e56a5e6d11e.png)


これらの方法でウィンドウ型変数を自在にアップデートできます！
試してみてください。
Zoom基本操作

# 【前提】
・ミーティング主催者が、自身のZoomアカウントを登録している事
・ミーティング主催者・参加者が、zoom.usをインストールしている事

# 【基本操作】※zoom.us操作
##「主催者：ミーティングを設定」→「参加者：ミーティング参加」という大きい流れで進める
### ■主催者：ミーティングを設定
#### ●ミーティングをスケジューリング(サインイン要)
##### ・「ミーティング画面選択」-「+ボタン」-「ミーティングをスケジューリング」へ遷移
日付、ミーティングID、パスワード(任意設定)等を選択
#### ●ミーティング開始(サインイン要)
##### ・ミーティング主催者が、「ホーム」画面から、「開始」押下。主催者はミーティング参加状態になる。
##### ・下記いずれかの方法で、ミーティングに招待する。
######参加予定者へURLを連携する場合
→ "他のユーザーを招待"を押下→ "URLのコピー"を押下→ URLをミーティング参加予定者へ連携
######参加予定者へミーティングIDを連携する場合
→ ミーティングID、パスワード(設定有りの場合)をミーティング参加予定者へ連携
### ■参加者：ミーティング参加(サインイン不要)
##### ・ミーティング参加者が、「ホーム」画面から、「参加」押下
######主催者からURLが連携された場合
→ URLでアクセスし、ミーティングに参加
######主催者からミーティングIDが連携された場合
→ zoom.usからミーティングID、パスワード(設定有りの場合)を入力し、ミーティングに参加
##ミーティング時の便利操作
### ■画面共有
##### ・自分の画面を共有したい側が、「画面を共有」ボタン押下
### ■リモート操作
##### ・画面共有状態で、リモート操作する側が画面上部の「オプションを表示」メニューから「リモート制御のリクエスト」押下
→ リモート操作される側が「承認」押下
※許可が上手くいかない時は、Macの場合、「システム環境設定」-「セキュリティとプライバシー」-「アクセシビリティ」のzoom.usにチェックを入れる
[備忘録] G検定合格フロー2020#1



JDLA Deep Learning for GENERAL 2020#1を受験し合格しました。

【　合　格　】

総受験者数　 6,298名
合格者数     4,198名

一緒に受験した皆様お疲れ様でした。
今回は、合格までに取り組んだ学習期間/内容や参考資料等まとめます。
参考になれば幸いです。
※ここではG検定自体の概要は話しません。

#なんで受験したか
1. AIの知識があることを示す資格として最適だと考えた
2. AIの汎用的な用語を習得する為(バーニーおじさんのルールとか初めて知った)
3. 力試し!

# 私のスペック
私立大学院の情報系を卒業
主に画像処理が研究対象
AIも多少
物体検出:YOLO,R-CNN等
※実装経験はなし

社会人1年目(もうすぐ2年目)
職業:SE
3か月程度AIの案件にアサイン
~~最近は...~~

# 学習期間
2週間程度
総時間:約20時間

1週目:[人工知能は人間を超えるか](https://www.amazon.co.jp/%E4%BA%BA%E5%B7%A5%E7%9F%A5%E8%83%BD%E3%81%AF%E4%BA%BA%E9%96%93%E3%82%92%E8%B6%85%E3%81%88%E3%82%8B%E3%81%8B-%E8%A7%92%E5%B7%9D%EF%BC%A5%EF%BC%B0%EF%BC%B5%EF%BC%A2%E9%81%B8%E6%9B%B8-%E6%9D%BE%E5%B0%BE-%E8%B1%8A-ebook/dp/B00UAAK07S)読破:6時間

2週目:[徹底攻略 ディープラーニングG検定 ジェネラリスト 問題集 徹底攻略シリーズ](https://www.amazon.co.jp/gp/product/B07NDVCN99/ref=ppx_yo_dt_b_d_asin_title_o06?ie=UTF8&psc=1)で手を動かしながらの学習:12時間
試験前日に有給を使い模擬試験をしました。

その他参考URL調査:2時間
[人工知能とは ⑪ ディープラーニングG検定試験対策](https://www.fsz.co.jp/?knowledge=12148)
[JDLA Deep Learning for GENRAL 2017（G検定）推薦図書まとめ](https://qiita.com/m2u/items/548bd59634bbf403cccf)
[【G検定】まとめノート（人物編）](https://qiita.com/ryotuxtuki/items/61079d900a85f6c618e5)
こちらのサイトは試験当日ブックマークで待機させていました。

# 所感
・**圧倒的な問題数**
問題数がとにかく多い。1問に使える時間が少ない為、分からない場合に効率的に検索する必要あり。
チートシートなどを用意すると良い。
私はCNNの畳み込みフィルタの計算をexcelで用意しておきました。

・**時事問題が難問**
今回の試験では自動運転レベルに関する問題が多く出題されました。
全く分からず調べまくるが検索がヒットせず時間を浪費。
分からないなら後回しにする覚悟も大切だと認識。
もう少し普段から最新のITニュースを調べたいと思います。

・**受講料が高い**
就活や仕事で有利になるような資格ではないのでもう少し安価でも良いかと思います。

# 受けようか悩んでいる方へ
**結論：オススメです！**
AIの基礎的な用語はおおよそ把握できます。
合格すると名刺にマークも付けられます。
さらに、【合格者コミュニティ「CDLE」】の招待がきます！
同じ価値観を持つ人たちと出会う良いきっかけになると思います。
私も最近のはやり病が収まれば参加しようと思います。

ご閲覧ありがとうございました。
TecoGANをやってみた

# TecoGANとは

TecoGAN(TEmporally COherent GAN)は、動画向けの超解像アルゴリズム。
名前の通り教師なし学習の一種のGANを動画に適用したもの。

元ネタの論文は以下。

https://arxiv.org/pdf/1811.09393.pdf

TecoGANを簡単に試せるOSSがGitHub上で公開されているので実際にやってみた。

# インストール

## CUDA

[公式サイト](https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&target_distro=Ubuntu&target_version=1804&target_type=debnetwork)からCUDAをダウンロードしてインストール。

## TecoGAN

リポジトリをクローン。

```shell
git clone https://github.com/thunil/TecoGAN
```

仮想環境を作成。

```shell
cd TecoGAN
python -m venv venv
```

仮想環境をアクティベートして依存ライブラリをインストール。

```shell
source venv/bin/activate
pip install --ignore-installed --upgrade tensorflow-gpu
pip install -r requirements.txt
```

# 動作確認

## 学習済モデルのダウンロード

TecoGAN modelをダウンロードする。
`runGan.py`の引数に`0`を渡すと自動的にダウンロードが始まる。

```shell
python3 runGan.py 0
```

ダウンロードには10分以上かかる。しばしご歓談ください。

## 画像処理

ダウンロードが完了したら、サンプルの画像（カレンダー）をTecoGANで処理してみる。
`runGan.py`の引数に`1`を渡すと自動的に処理が始まる。

```shell
python3 runGan.py 1 
```

実行結果を以下に示す。左が処理前の画像、右が処理後の画像。

||TecoGAN処理前|TecoGAN処理後|
|---|---|---|
|画像|<img width="500px" alt="処理前" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/a5e25fe2-d78b-6491-59fd-2f4882189365.png">|<img width="500px" alt="処理後" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/7a4e029b-f769-7f83-8822-4e3bc98b0fd0.png">|
|サイズ|180x144px|720x576px<br/>（元の4倍）|
出典：https://github.com/thunil/TecoGAN

## 画質評価

画質を評価する。
`runGan.py`の引数に`2`を渡すと自動的に処理が始まる。

```shell
python3 runGan.py 2
```

実行結果は以下の通り。

```c
,PSNR_00,SSIM_00,LPIPS_00,tOF_00,tLP100_00
0,22.838514,0.77990526,0.15833299,0.1028823,0.6481819
1,22.918787,0.78221714,0.16730282,0.10047257,0.07571839
（略）
36,23.433603,0.7989261,0.14277494,,
,Avg_PSNR,Avg_SSIM,Avg_LPIPS,Avg_tOF,Avg_tLP100
0,23.221691,0.7908746,0.15114386,0.1334446,0.16479945
,FolderAvg_PSNR,FolderAvg_SSIM,FolderAvg_LPIPS,FolderAvg_tOF,FolderAvg_tLP100
0,23.221691234691722,0.790874584301098,0.15114386017258102,0.13344460063510472,0.16479945182800293
,FrameAvg_PSNR,FrameAvg_SSIM,FrameAvg_LPIPS,FrameAvg_tOF,FrameAvg_tLP100
0,23.221691234691722,0.790874584301098,0.15114386017258102,0.13344460063510472,0.16479945182800293
```

PSNR、SSIMなどは画像評価指標。定義は、 https://dftalk.jp/?p=18111 などを参考すること。

2行目から5行目までの0~36番の数値は画像毎の画像評価指標である。
特に傾向はなく、ほぼ一定。

- Avgはすべての画像の平均値。
- FolderAvgは画像の格納されているフォルダごとの平均値。複数のフォルダを指定できる。
- FrameAvgはおそらく画像のフレーム単位の平均値か。

# 考察

- カレンダー以外の別の画像でも試してみたが、元の画像が小さく画質が悪いほど効果的であった。例えば元の画像が640x360px程度でそこそこ画質が良い場合は、PSNR~12、SSIM~0.5程度となりカレンダーの場合より劣化した。
- TecoGAN処理後の画像を拡大すると、エッジは濃く、ベタ塗りは若干劣化しつつ解像度は上がっていることがわかる。

TecoGAN処理後
<img width="1000px" alt="処理後" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/7a4e029b-f769-7f83-8822-4e3bc98b0fd0.png">

# 参考サイト

- https://wells12.com/tecogan-super-resolution/
AtCoder　生活　7日目

[前回]
(https://qiita.com/flandrescarlet237/items/3d37f2a70568a15861a2)

#7日目

今日は、ABC044からABC048のB問題を解きました

##ABC044_B
[美しい文字列]
(https://atcoder.jp/contests/abc044/tasks/abc044_b)

```c++

#include <bits/stdc++.h>
using namespace std;

int main(){
	string w;
  	cin >> w;
  	bool res = true;
  	sort(begin(w),end(w));
  	if(w.size()%2 == 1) {
      	res = false;
      	cout << "No" << endl;
    }
  	else{	
    	for(int i =0;i < w.size();i++){
          	if(w[i-1] == w[i] && w[i] != w[i+1]){
              	if((i+1)%2 != 0){
                  	cout << "No" << endl;
                    res = false;
                    break;
             	}
            }
            else if(w[i-1] != w[i] && w[i] != w[i+1]){
              		cout << "No" << endl;
                  	res = false;
                  	break;
       		}
     	}
    }
  	if(res) cout << "Yes" << endl;
}

```

初めて自力で解けました！

##ABC045_B
[3人でカードゲームイージー]
(https://atcoder.jp/contests/abc045/tasks/abc045_b)

```c++

#include <bits/stdc++.h>
using namespace std;

int main(){
	string A,B,C;
  	cin >> A >> B >> C;
	int turn = 'a';
	bool res =true;
  	while(res){
    	if(turn == 'a'){
        	if(A.size() ==0){
            	cout << 'A' << endl;
              	res = false;
            }
          	else{ 
             	turn=A[0];
              	A.erase(0,1);
            }
        }
      	if(turn == 'b'){
        	if(B.size() ==0){
            	cout << 'B' << endl;
              	res = false;
            }
          	else{ 
             	turn=B[0];
              	B.erase(0,1);
            }
        }
      	if(turn == 'c'){
        	if(C.size() ==0){
            	cout << 'C' << endl;
              	res = false;
            }
          	else{ 
             	turn=C[0];
              	C.erase(0,1);
            }
        }
    }
  	
}

```
結構悩みましたが、なんとかなりました。


##ABC046_B
[AtCoDeerくんとボール色塗り]
(https://atcoder.jp/contests/abc046/tasks/abc046_b)

```c++

#include <bits/stdc++.h>
using namespace std;

int main(){
	int N,K;
  	cin >> N >> K;
  	int total = K;
  	for(int i =0; i< (N-1);i++){
    	total *= (K-1);
    }
  	cout << total << endl;
}

```
A問題のようでした。

##ABC047_B
[すぬけ君の塗り絵 2 イージー]
(https://atcoder.jp/contests/abc047/tasks/abc047_b)

```c++

#include <bits/stdc++.h>
using namespace std;
 
int main(){
  int W, H, N;
  cin >> W >> H >> N;
  int min_x = 0, min_y = 0, max_x = W, max_y = H;
  for (int i=0; i<N; i++){
    int x, y, a;
    cin >> x >> y >> a;
    if (a==1) min_x = max(min_x, x);
    if (a==2) max_x = min(max_x, x);
    if (a==3) min_y = max(min_y, y);
    if (a==4) max_y = min(max_y, y);
  }
  cout << (max(0, max_x - min_x) * max(0, max_y - min_y)) << endl;
}

```
一番解こうとしたときに解りませんでした
##ABC048_B
[Between a and b ...]
(https://atcoder.jp/contests/abc048/tasks/abc048_b)

```c++

#include<bits/stdc++.h>
using namespace std;

int main(){
	int64_t a,b,x;
  	cin >> a >> b >> x;
  	if(a == 0)cout << b/x +1 <<endl;
  	else cout << b/x - (a-1)/x <<endl;
      
}
```

int64_tについて学びました。それ以外の箇所は特に問題ありませんでした。

明日もB問題を解いていこうと思います。
InputFieldで日本語を入力する際にOnValueChangedが一気に呼ばれる問題をUniRxで対応してみた

##環境
Unity2019.3.3f1

##どんなことが起こったか
InputFieldに日本語を打つと以下のgifの様に`OnValueChanged`が呼ばれてしまう。
![oneFrame.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149716/b3df56b6-f2f8-7680-f1d5-4c3d5d5406bd.gif)

##対策
同一フレームに発火されたイベントの最後だけを通したいので`ThrottleFrame`を使用すれば想定通りの挙動になった。

```C#
m_InputField.OnValueChangedAsObservable().ThrottleFrame(1)
```
![fix.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149716/d9078824-16bb-099f-f8dc-1cc025c2a056.gif)





####参考
https://qiita.com/toRisouP/items/3cf1c9be3c37e7609a2f
[AWS] 一括請求の場合、無料利用枠はアカウントではなく一括請求で1つなので注意

AWSの[無料利用枠](https://aws.amazon.com/jp/free/)は、各サービスごとに設定された課金されない利用量のことです。

お試しで少し使ってみるのに助かる設定枠ですが、対象のAWSアカウントが[一括請求対象](https://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/consolidated-billing.html)になっている場合は注意が必要です。

分かりやすいもので[Code Commitの場合](https://aws.amazon.com/jp/codecommit/pricing/)、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/6ab99d01-d1a0-dc2f-f130-817cb42fe1c7.png)

マネージドgitリポジトリが無料で使えるのはうれしい、と使ってみて請求明細を見ると・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/61e3a3c1-3d48-dfed-fda2-d448740a1e18.png)

5名まで無料じゃなかったのか、、、となってしまいます。

1名でも課金された理由について、[無料利用枠に関するよくある質問](https://aws.amazon.com/jp/free/free-tier-faqs/)を見ると、"一括請求の場合も無料利用枠は1つのみ"という記載があります。つまり、一括請求対象のどこかのアカウントで既に無料枠が消費されていると、課金が発生してしまうということです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/a3824d1f-fc4c-ab00-4d8a-8f098b9d7055.png)

一括請求対象になっているアカウントで無料枠程度の増減が問題になることは少ないと思いますが、利用の際は注意して下さい。

# 参考資料

- [AWS クラウド無料利用枠](https://aws.amazon.com/jp/free/)
- [AWS 無料利用枠に関するよくある質問](https://aws.amazon.com/jp/free/free-tier-faqs/)
- [組織の一括請求](https://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/consolidated-billing.html)
Pythonで毎日AtCoder #17

### はじめに
[前回](https://qiita.com/taxfree_python/items/b6a32ca2928eebd10df0)
今日から類題を解きます。

### #17
**考えたこと**
[ABC064-A](https://atcoder.jp/contests/abc064/tasks/abc064_a)
倍数判定するだけ

```python
r, g, b =map(str,input().split())

n = int(r+g+b)
if n % 4 == 0:
    print('YES')
else:
    print('NO')
```
[ABC088-A](https://atcoder.jp/contests/abc088/tasks/abc088_a)
nを500で割った余りを1円玉で払えるかを考えています

```python
n = int(input())
a = int(input())

m = n % 500
if m <= a:
    print('Yes')
else:
    print('No')
```

[ABC082-A](https://atcoder.jp/contests/abc082/tasks/abc082_a)
math.ceilで切り上げ処理を行っています

```python
import math
a, b = map(int,input().split())
print(math.ceil((a+b)/2))
```


### まとめ
明日からは一度に解く問題の量を増やしたい。
では、また
[CSS]フォントの太さをさらに太くする

# [CSS]フォントの太さをさらに太くする

文字の太さは、CSSの`font-weight`プロパティで変更することができます。
タイトルなどには、太字を使った方が強調されて、また、本文とのメリハリもつくので、全体的に整って見えます。

本記事では、`font-weight`プロパティ以外に、さらに文字を太くしてみたいと思います。
これは軽く思いついたネタなだけなので簡単に行きたいと思います。

# 方法
今回は`text-stroke`プロパティを使います。`text-stroke`プロパティは文字の縁取りをするもので調べるとかなり縁取りの仕方などがサイトに載っています。


```
// HTML
<div class="container">
    <span class="text">Hello World.</span>
</div>

// CSS
.container {
  width:  100%;
  height:  100%;
  display:  flex;
  justify-content:  center;
  align-items: center;
}
.text {
  font-size:  2rem;
  font-family: Arial;
  font-weight: bold;
  color: black;
  -webkit-text-stroke: 2px black;
}
```
今回は文字と縁取りをあえて同じ色にすることによって文字を少し太くしています。あんまり変わらないかもしれないですし、すごく役に立つネタでもなんでもないですが、使い方として面白いかと思いました。以上です。

# 補足
こんなことだってできます。文字をただ縁取る以外の使い方も面白いですね。
![スクリーンショット 2020-03-26 22.38.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405522/f9e0133e-d9ae-f22e-666b-28d785e73807.png)
【ExcelVBA】配列の添え字の下限値を変える

# はじめに

Excelの高速化テクニックの1つに、シートに対する読み書きの回数を減らすために「二次元配列を使ってシートに対する読み込み/書き込みを行う」というものがあります。
この時、例えば`UsedRange`などを使ってシートの内容を取得して、その結果をVariant型の変数に代入すると、添え字が1から始まる配列（二次元配列）となっています。

Javaなど他の言語では配列の添え字は0から始まるのが一般的なので、配列の添え字の下限値をコントロールする方法を少し調べてみました。

# 配列の宣言時に添え字の下限値を指定する方法

* 配列の宣言時に、`Dim 配列名(添え字下限値 TO 添え字上限値)`と書くことで、添え字の下限値を指定できます。
* この方法が最もよく知られているオーソドックスな方法だと思います。

```vb:Module1.bas
Option Explicit
​
' 配列の添え字の下限値/上限値の確認
Sub TestLowerBound()
    Dim ary(1 To 5) As Integer
    Dim ary2D(1 To 4, 1 To 5) As Integer
    
    Debug.Print "【一次元配列】添え字の下限値：" & LBound(ary)
    Debug.Print "【二次元配列】添え字の下限値（一次元目）：" & LBound(ary2D, 1)
    Debug.Print "【二次元配列】添え字の下限値（二次元目）：" & LBound(ary2D, 2)
End Sub
```

```text:実行結果
【一次元配列】添え字の下限値：1
【二次元配列】添え字の下限値（一次元目）：1
【二次元配列】添え字の下限値（二次元目）：1
```


# Option Baseステートメントを使う方法

* モジュールの先頭で[Option Base ステートメント](https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/option-base-statement)を使うと、そのモジュール内で宣言した配列の添え字の下限値を指定した値に変更できます。
* 変更されるのはあくまでも「デフォルト値」となるため、明示的に下限値を指定した場合にはデフォルト値は採用されません。
 * `Dim ary(0 TO 5) AS Integer`と書いた場合、配列の添え字の下限値は0となります。

```vb:Module2.bas
Option Explicit
Option Base 1
​
' 配列の添え字の下限値/上限値の確認
Sub TestLowerBound2()
    Dim ary(5) As Integer
    Dim ary2D(4, 5) As Integer
    
    Debug.Print "【一次元配列】添え字の下限値：" & LBound(ary)
    Debug.Print "【二次元配列】添え字の下限値（一次元目）：" & LBound(ary2D, 1)
    Debug.Print "【二次元配列】添え字の下限値（二次元目）：" & LBound(ary2D, 2)
End Sub
```

```text:実行結果
【一次元配列】添え字の下限値：1
【二次元配列】添え字の下限値（一次元目）：1
【二次元配列】添え字の下限値（二次元目）：1
```


# まとめ

* Option Baseステートメントはあまり知られていない方法なので、VBAに慣れていない人にコードを引き継いだ後に不具合を生みそうです。
 * 一方で、「若干ではあるもののコードがスッキリする」「添え字の下限値の指定し忘れを防げる」という効果が期待できます。
* Javaなどでも「配列の添え字は0から始まる」というのが普通だったので、最初は「添え字が1から始まる」というのが不思議に感じたのですが、これは「セルの番地（〇行目×列）と合わせるための措置」ではないかと思われます。
* C#からInterop経由でExcelを操作する際にも、配列の添え字の下限値を1にする必要があります。
 * [【C#】Microsoft.Office.Interop.Excelで使える二次元配列を作る](https://qiita.com/nkojima/items/6903e2312ebb7327f6fd)
cdで入りたいファイルの場所がわからない時

#【結論】①Finderで該当ファイルを表示→②ファイルをターミナルへドラッグ＆ドロップ（ファイルの場所が自動的に表示される。例：/Users/lancai/es6_sample）→③頭にcdつける
![cdドラッグ＆ドロップ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584233/7cf170a2-2079-36a8-f892-f6a1d482c00b.png)

以上！
Raspberry Pi 4B に Ubuntu Server 19.10 構築メモ(Raspberry Pi Imagerによるインストール編)

# はじめに
Raspberry Pi 4B に Ubuntu Server 19.10 を構築したときの備忘録です。
全容を記載するとかなり長いので、Raspberry Pi Imager という公式ツールを使用した
インストール方法について記載します。

# 環境 及び 用意するもの
作業端末：Windows10
Raspberry Pi 4B 1GB ※1GBは日本未発売です。
Raspberry Pi Imager 
MicroSDカードリーダー

## Raspberry Pi の起動に必要なもの
MicroSDカード ※ 8GB以上
USB-Type C対応電源
必要に応じて MicroHDMIケーブルなど

# Raspberry Pi Imager を使用して、MicroSDカードにインストール
Raspberry Pi Imager を使用して、MicroSDカードに Ubuntu Serverをインストールします。
ダウンロードサイト
[https://www.raspberrypi.org/downloads/]

先ず始めに Raspberry Pi Imager を Windows10の作業端末に インストールします。
次に MicroSDカードをMicroSDカードリーダーに差し込み、Windows10の作業端末に接続します。
MicroSDカードリーダーが Windows10に認識できていることを確認できたら、
Raspberry Pi Imager を起動します。

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606116/f1848b38-8358-b457-49ab-9fd099f6c987.jpeg)

「CHOOSE OS」を選択して、Ubuntu を選び 「Ubuntu 19.10.1」を選択します。

![無題3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606116/8156f29b-7769-e582-c947-c304600f5c5c.jpeg)

次に「CHOOSE SD CARD」を選択して、先程接続したMicroSDカードリーダーに差し込んだ
MicroSDカードを選択します。

![IMG_4236.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606116/f2279791-eb1d-3856-caab-2bacc02e27f4.jpeg)

「WRITE」を選択して、MicroSDカードへの書き込みを開始します。

![IMG_4225.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606116/d7ac7596-f07b-9c33-7fee-64dfa20f9a1f.jpeg)

書き込みが完了すると、最初の画面に戻ります。

![IMG_4226.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606116/0e6cc7bb-8d42-4c4e-d9ae-e17eae3f6381.jpeg)

# Raspberry Pi の起動と初回ログイン

Windows10の作業端末に接続された MicroSDカードリーダーを切り離し
MicroSDカードを Raspberry Pi に差し込んで、起動します。
起動後、IPアドレスの割り振り状態を確認します。

Ubuntu 19.10 の場合、Raspbianのようにデスクトップ環境は、始めからインストールされていません。
SSH接続が可能なので、Teraterm を使用して Raspberry Piに割り振られたIPアドレスに接続します。

ログインアカウントは、以下の通りです。
ubuntu/ubuntu

ログイン後、即パスワード変更を求められるので、
先程ログインしたパスワードを入力後、変更後のパスワードを2回入力します。

コマンドプロンプトが表示されれば、ログイン完了です。
なお、初期構築手順は別途記載します。
[RxSwift] RxSwiftとは

#RxSwiftとは
コードが新しいデータに反応、順次的に分離された方式で処理される、非同期プログラム開発が簡素化できる、データの変化に対応しやすい。
`observable` `asynchronous` `functional` `via schedulers`

##RxSwiftの基礎
Rxの3つの構成要素についてみてみる
Observables、Operators、Schedulers

###1.Observables
- Observable<T> クラスはRxの基盤
- `T`タイプのデータを渡す、イベントを非同期に生成
    - 他のクラスでemit(放出？)する値を購読できるようにする
- ObservableTypeのProtocol(Observable<T>)はシンプルで、以下の３つのイベントのみemitし、observersはこの３つのみ受信できる
    - next：最新/次のデータを渡すイベント
    - completed：成功的にイベントを終了させるイベント。追加イベント生成しない
    - error：Observableがエラー発生。追加イベント生成しない

####Finite Observable Sequences (有限の観測可能なシーケンス)
例えば、ファイルをダウンロードするコードをイメージ
流れは
1. ファイルのダウンロードが始まって、データを監視する
2. 続けてファイルをダウンロードする
3. (エラーの場合)ネットワークが切れたらエラーになって停止する
4. (成功した場合)問題なくダウンロードが成功する

```swift
API.download(file: "https://www...")
 	.subscribe(onNext: { data in
 		... append data to temporary file
 	},
 	onError: { error in 
 		... display error to user
 	},
 	onCompleted: {
 		... use downloaded file
 	})
```
- `API.download`はダウンロードするデータ`Observable<Data>`インスタンスをreturn
- `onNext`クロージャで`next`イベントを受け取ることができる。
- `onError`クロージャでは`error`イベントが受け取れる。
- 最終的には`onCompleted`クロージャで`completed`イベントを受け取る

####Infinite Observable Sequences(無限の観測可能なシーケンス)
ダウンロードのように自然に終了するものとは異なって、無限なsequenceがある。例えばUIイベントなどは無限に観測できる。
例えば、デバイスの横/縦モードに反応するコードをイメージ
流れは
1. `UIDeviceOrientationDidChange` observerを追加
2. 方向転換が管理できるcallback methodが必要
3. UIDeviceの現在の方向を確認して、画面に表示する
4. 方向転換ができるデバイスが存在する以上、自然に終了することはない
5. 無限なsequenceなので一応初期値が必要

```swift
UIDevice.rx.orientation
 	.subscribe(onNext: { current in
 		switch current {
 			case .landscape:
 				... re-arrange UI for landscape
 			case .portrait:
 				... re-arrange UI for portrait
 		}
 	})
```
- ここでは、`onError``onCompleted`は発生しないはずなので、記述も不要

###2. Operators
- `ObservableType`と`Observable`クラスはより複雑な論理を実現するためにたくさんのメソッドが含まれている。それらを`Operator`を呼ぶ
- `Operator`は非同期入力を受けて出力のみ生成するだけで、複数の`Operator`を併せて使うことができる
    - `Observable`に、より入ってきたのを処理して放出？する役割

コードを見た方が分かりやすいかも

```swift
UIDevice.rx.orientation
  .filter { value in
    return value != .landscape
  }
  .map { _ in
    return "Only Portrait"
  }
  .subscribe(onNext: { string in
    showAlert(string)
  })
```

- 上記でみると分かるように `filter`は`.landscape`ではないものだけ、return
- `.portrait`の場合は`map`に入るはずで、`map`ではStringに変換してreturn
- 最後に`subscribe`では結果としてstringをshowAlertメソッドで表示している

このように複数の`Operator`を使って、いろんなことができる。

###3.Schedulers
- SchedulersはRxではdispatch queueと同じだが、もっと使いやすくて強力
- RxSwiftではいろんなスクジューラーが既に定義されている。99％の状況で使えるので、開発者が自分だけのスケジューラーを生成することはない
 ![DOqRvva.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94703/b15af424-ec5f-8fc4-3684-be6ef7442526.png)

###RxCocoa
RxSwiftは一般的なRx APIで、Cocoaとか特定のUIKitクラスについて何の情報も持たない。RxCocoaはRxSwiftと一緒に使われながら、UIKitやCocoaフレームワーク基盤開発をサポートする全てのクラスを持っているらしい。
Java言語で学ぶデザインパターン入門のPrototypeパターンまとめ

お久しぶりです。白々です。
先日エンジニアの先輩にデザインパターンをご存知でない！？という冷静なツッコミを頂き、その後結城浩さんが書かれた「Java言語で学ぶデザインパターン入門」を渡されたので勉強することにしました。
ただ、本を一読しても覚えられないので覚書として記事にしようと思いました。
今回で6回目です。
完走できるように頑張ります。
また、「Java言語で学ぶデザインパターン入門」には、サンプルプログラムも有りますが、著作権の都合上省かせて頂きます。御了承ください。

前回は、「Singletonパターン」に関しての記事を作成しました。
前回の記事は、以下です。
https://qiita.com/sirajirasajiki/items/532d33fd823e52ab0d1a

今回は、「Prototypeパターン」に関して記載したいと思います。
また、「Java言語で学ぶデザインパターン入門」には、サンプルプログラムも有りますが、著作権の都合上省かせて頂きます。御了承ください。

#第6章 Prototypeパターン-コピーしてインスタンスを作る
「Java言語で学ぶデザインパターン入門」には、
>インスタンスから別のインスタンスを作り出す「Prototypeパターン」

という記述がありました。
このPrototypeパターンは、既存のインスタンスを複製して新しいインスタンスを作ります。

###Prototypeパターンの使い所
このパターンを使うときは、以下のような時に使います。
1. オブジェクトの種類が多すぎる
2. クラスから新しくインスタンスを生成するのが難しい場合
3. フレームワークと生成するインスタンスを分けたい場合

2は、インスタンスを生成が難しい場合というのは、ユーザーがペイントアプリなどで作成した絵のインスタンスや、ユーザーがモデリングツールなどで作成したモデルのインスタンスなど、クラスから新しくインスタンスを生成できない時を示します。


##Prototypeパターンを使う時の注意事項
- インスタンスの複製を行うクラスのソースには、クラスの名前を書かない
    - 理由： インスタンスの複製クラスと名前が書かれたクラスに密接な関係ができてしまうから

##Prototypeを使った例
今回は、「Java言語で学ぶデザインパターン入門」で記載されていた、文字列を文字で囲んだり、文字列を特定の文字で下線を書いて表示する物を考えます。
文字を文字で囲むクラスと文字列を特定の文字で下線を書くクラスをManagerというクラスで管理する物とします。

###クラス図
![prototype.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521126/4e83adc8-2c8b-c46f-73c2-53e788ebd664.png)

このクラス図は、PlantUMLというもので記載しています。
私が、書いたPlantUMLのコードは以下のGitHubに記載がありますのでReadMeを読んでお使いください。
singleton.txtです。
https://github.com/sirajirasajiki/design_pattern_uml/tree/master/prototype
PlantUMLのインストール方法と使い方に関しては、後述のappendixに記載しています。

###クラス図を元にPythonで実装
以下に実装したコードを公開しています。Python 3.7で実装しました。
https://github.com/sirajirasajiki/design_pattern_python/tree/master/Prototype
#まとめ
既存のインスタンスから別のインスタンスを作成するPrototypeパターンについて学びました。

#第6章感想
個人的には、Prototypeパターンは、複雑な計算をいくつかのパターンでする時とかに使ったりするのかなと思いました。
例えば、数値計算をするクラスがあったとして、そのクラスを継承したインスタンスXがあるとします。
インスタンスXが持っている値をAの場合とBの場合の両方で計算したい時に、2回計算させるのは面倒なのでコピーした方が楽なので、この考え方は便利だと思いました。

~~後日良さそうな例を作って、Pythonで実装しようと思います。~~
例が思いつかなかったので、本に記載されている例を使ってPythonで作成しました。


#最後に
何か間違っているところがあれば、ご指摘していただけると嬉しいです！

#appendix
ツクールMVをubuntuにインストールしようとした話（未完）

ツクールMVがUbuntuで動くとのことで導入しようとしたら詰まってる状況を実況。
備忘録なので当てにしないで
読みにくいのはMarkdown初めて書くのとやる気ないから。ごめんね。
#ことの発端
Windows10に飽きたのでubuntuに変えたけどせっかくだからツクってみようとRPGツクールMVを入れてみようとしたわけさ。

#いきなり失敗
とりあえずSteam版なら動くだろうとSteamの導入→インストールしようとしたらうっかり「互換ツール使用を強制」にチェック入れっぱなしだったのでWindows版がインストールされたのに気づかなかった。
→次の失敗に続く

##そしてこうした
とりあえずネット上探してドキュメントとか導入例探してみるも全く無い。運営も「Debianで動く！」→「Ubuntuで動く！」→「SteamOSで動く！」とフォーラムとかでも書き方がまちまちで具体的な話ゼロだったのでとりあえず運営にメールしてみた。

##運営の回答
Steam版を入れろ、と。
ここで最初の失敗に気づく。
あとはSteamOS用の対応策しか書かれてなくて詰む。
というかSteamOSとか使ってるやついるんかいな......

##気を取り直して入れ......られない
とりあえずSteamにて「互換ツール使用の強制」を外して再インストールするも起動しない。詰む。

ArchLinuxユーザーの友に聞いて、インストールされたディレクトリにあるそれっぽいシェルスクリプトをターミナルで実行してみてログ見よう、とアドバイスをいただく。

やってみたら
>error while loading shared libraries: libcrypto.so.1.0.0: cannot open shared object file: No such file or directory

と出てきて結局動かない。詰む。

ここでエラー文でいろいろ調べてみるとどうやらOpenSSLのライブラリが影響してるっぽい。
どうせプロダクトキーの認証とかにつかっとるんやろ？と思いつつUbuntuにインストールされているか確認。
入ってる。

>OpenSSL> version
>OpenSSL 1.1.1b  26 Feb 2019
>OpenSSL> 

謎。入ってるけどバージョン新しいぽいしよくわからん。libのなかにシンボリックリンクでも入れるんか？

ここでまた詰む。←いまここ
Laravel Paginate



##ページネーションメソッドを使ってページャの実装

```HogeController.php
	use App\Models\Hoge; #Hogeモデルがある前提

    $hoges = Hoge::paginate(5);
    return view('hoge.index', ['hoges' => $hoges]);
```

```style.scss
  .page ul li{
    display: inline;
  }
```

```hoge/index.blade.php
  @foreach($hoges as $hoge)
    <tr>
      <td>{{ $hoge->id }}</td>
      <td>{{ $hoge->name }}</td>
      <td>{{ $hoge->email }}</td>
      <td>{{ $hoge->age }}</td>
    </tr>
  @endforeach

<div class="page">
    {{ $hoges->links() }}
</div>
```

1.コントローラでpaginateメソッドを使って表示件数を指定
2.viewでlinksメソッドでページャを表示

##orderByを使ってソート

```
#上記の例にorderByメソッドを追加するだけ
Hoge::orderBy('age', 'desc')->paginate(5);
```
##参考URL

https://blog.hiroyuki90.com/articles/laravel-pagination/
Win10 の日本語環境だと spago で PureScript をビルドできなかった問題

## 環境

OS : Windows 10 Pro (64 bit)
OS環境 : **日本語** (not utf-8 な環境なら発症する模様)
PureScript : 0.13.6
spago : 0.14.0
shell : Git Bash (VSCode の integrated terminal)


当然だが PureScript も spago も npm でインストールした。

## 症状

[純粋関数型スクリプト言語PureScriptのはじめかた
](https://qiita.com/hiruberuto/items/2316b58162cfec150460)

を参考にして環境を構築していたところでつまづいた。

`spago init` は通るけど `spago build` で以下のエラーが出る。

```
$ spago build
[info] Installing 4 dependencies.
[info] Searching for packages cache metadata..
[info] Recent packages cache metadata found, using it..
[info] Copying from global cache: "psci-support"
[info] Copying from global cache: "console"
[info] Copying from global cache: "effect"
[info] Copying from global cache: "prelude"
[info] Installation complete.
spago.exe: fd:5: hGetContents: invalid argument (invalid byte sequence)
```

無効な引数を渡すなって怒られてる。
（いやワシ環境構築段階やからマジで何もしてへんし…）

```
$ spago
```

とだけ叩くとオプションのリストが出てくるので、動いてはいる。

```
$ chcp.com 65001
```

と叩いて shell の文字コードを UTF-8 に指定しても、同じ結果になる。

## 対応

[GitHub PR : ver 0.14.0 の spago が UTF-8 環境に対応できていない様子](https://github.com/purescript/spago/pull/595)。

偉い人がエンコード問題を fix した spago.exe を配布してくれていた。
（上記プルリクの末尾を参照）

[0.14 with fix to Windows 10](https://github.com/gibranrosa/spago/releases/tag/0.14-windows10-fix)

spago.zip を DL して Unzip して npm global module にある spago.exe を差し替える。

もいっかいビルドする。

```
$ spago build
[info] Installing 4 dependencies.
[info] Searching for packages cache metadata..
[info] Recent packages cache metadata found, using it..
~~~ 中略 ~~~
Compiling Main
Compiling PSCI.Support
Compiling Test.Main
[info] Build succeeded.
```

やったぜ。

他の人から「動いたよサンキュー！神！」てな報告もあるので、次のリリースでは修正されるんじゃないでしょうか。

# 新しいMacBook Air 2020 が欲しいなぁ～

すみませんでした。

### 雑な余談

なんか「プログラミング勉強するかなぁ」という話をしたら、 PureScript をガン推しされたのでやることになりました。
作りたいもの…テキストパーサとかですかね…
あとはこう、 EPUB3.0 を吐く何かとか…

Git 講座の記事。あー。はい。
ですよね。ええと。
頑張ります…（スクショの撮影と整理を…