OmniAICreator/Qiita-1.07M huggingface dataset:
Anaconda仮想環境の作り方（conda-forge、Jupyter notebook）

[Pystanのインストール（anaconda環境）](https://qiita.com/Gyutan/items/c7d3c341efe09454a5e1)
のAnacondの仮想環境作成部分だけを独立させたものです。


### インストール環境
Win10 pro 64 bit
Anaconda環境 (conda4.7)

### リポジトリconda-forgeの追加

anacondaでは、conda とpipのインストールが混在すると環境が壊れることがあります。
[condaとpip：混ぜるな危険](http://onoz000.hatenablog.com/entry/2018/02/11/142347)
[Jupyter Notebookが起動しないと思ったらAnaconda環境が壊れていた](https://insilico-notebook.com/conda-broken/)
ですので、できるだけcondaだけでインストールしたほうが良いです。
conda-forgeは、github上のコミュニティ主体のパッケージコレクションで、たくさんのパッケージを公開しており、condaのdefaultsでは見つからないパッケージをダウンロードすることが可能です。
condaのパッケージ参照リポジトリにconda-forgeをリポジトリ先に加えることがおすすめです。
[condaが探すリポジトリ先を変更する方法(conda-forgeの追加)](https://qiita.com/yuomori/items/9fcbbdf07afd16b6365c)
以下参照記事のコピー

----------------
condaが探すリポジトリ先を確認します

```
conda config --get channels
--add channels 'defaults'   # lowest priority
```
defaultsを探しにいっていることがわかります。
そこで、探す先に`conda-forge`を追加します。

```
$conda config --append channels conda-forge
```
`conda-forge`が追加されたことを確認します。

```
$conda config --get channels
--add channels 'conda-forge'   # lowest priority
--add channels 'defaults'   # highest priority
```
---------------------------

###conda仮想環境へのパッケージのインストール

anaconda promptまたは、WindowsでしたらPowershellを開いて

conda create -n 仮想環境名 python=バージョン （必要ならばその他のモジュール）
例えば

```
conda create -n stan python=3.6　jupyter pandas
```
と入力します。

-ｎ　の後は自由に名前を付けることができます。今回はstanとしています。
今回はpythonは3.6としています。
これでpython=3.6が入った仮想環境ができます。
同時にインストールしたいパッケージも併記すると、インストールしてくれます。

```
conda activate stan
```
と入力しstanの仮想環境に入ります。

```
そうすると
(base)C:\Users\username>　だったものが
(stan)C:\Users\username> に変わります。
```
ここでパッケージのインストールを行います。

```
conda install Cython Numpy pystan
```


###jupyter notebookでの仮想環境の切り替え

[Condaで作ってる仮想環境の切り替えをJupyter上で簡単に行う方法](https://qiita.com/yoppe/items/38005f415a5b8b884c7d)
[Anacondaの仮想環境をJupyter notebookに反映させる方法](https://qiita.com/yuj/items/b9e82aeb0e4b2ffd34b9)

jupyter notebookからcondaで作成した仮想環境を簡単に使えるように設定します。
まず仮想環境のstanから抜けます

```
conda deactivate 
(base)C:\Users\username>　になります。
```
そこで、以下のコマンドを入力します。（以下、上記参照のコピー）

```
pip install environment_kernels
jupyter notebook --generate-config
```

~/.jupyter/jupyter_notebook_config.py
という設定ファイルが生成されていると思います。
このファイルをテキストエディターなどで開いて、以下の設定を書き込みます。

```
c.NotebookApp.kernel_spec_manager_class='environment_kernels.EnvironmentKernelSpecManager'
c.EnvironmentKernelSpecManager.env_dirs=['仮想環境が生成されているパス']
```
私の場合：　'仮想環境が生成されているパス'=　'C:\Users\Username\Anaconda3\envs'
これでJupyterでPystanが使える環境ができるはずです。

###使い方

Powershellまたは、Anaconda promptを開いて

```
(base) PS C:\Users\username> cd C:\Users\username\stan
（開きたいDirectryここでは例としてstanとしておきます。)

(base) PS C:\Users\username\stan> jupyter notebook
```
Jupyterが立ち上がりjupyterファイルを指定（または新しく作成）します。

Jupyter->Kernel->change kernelを開いて,使いたい仮想環境を選択します。
![jupyter kernel.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165987/41b3736a-dc9a-052d-e849-cca7ba40888e.jpeg)
Reduxの基礎のキソ【図でイメージ】

# アウトプット背景
- Reduxを勉強中、React だけでもstateを使えば状態を管理できるのに、なぜRedux（＝別ライブラリ）が必要なのかわからなくなった背景があったので、アウトプット。
- 今回は概念が中心（追って追記予定）

#Reduxとは
- Redux とは、フロントエンドにおける状態管理に特化したライブラリ。

#Reduxを必要とする場面
- 状態管理が複雑な場面
 -  小規模なアプリケーションであればもちろん一つの state でも十分に管理することができる。
 -  しかし、大きなアプリケーションになると、コンポーネントツリーは肥大化し、状態管理が複雑になる。

#### 状態管理が複雑になると？
1. バグのきっかけ
 - 親コンポーネントで状態を一限管理しようとすると、大きな state になってしまい、「状態の更新や取得」が複雑になりバグのきっかけとなる。
2. 単純に管理が面倒
 - バケツリレーがいたるところで起こってしまうのも管理が大変になり問題にもなる。
3. 情報の伝達が困難
 - それぞれのコンポーネントで独自の state を持ってしまうと、他のコンポーネントにその状態を知らせるのが難しくなり複雑化してしまう。

![複雑なコンポーネント.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563702/df0f934a-198f-2c05-264d-90c512cc82c4.png)

https://css-tricks.com/learning-react-redux/

# Reduxを使うことで状態を分離
- Reduxを使うことで状態管理にかかる部分をコンポーネントのツリーから分離することが可能。
- また、複雑なバケツリレーから解放（完全に解放されるわけではないが負荷は減る）やコンポネート間の状態のやりとりが可能となる。
![Readuxの流れ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563702/dc05d63f-0c4d-0b15-6793-d45c2ac839e2.png)
from https://css-tricks.com/learning-react-redux/

# Redux の特徴
- 概念：redux は flux という概念に基づいて設計
- flux の2つの特徴
 1.  「一方向に状態が流れる」というという特徴を持っている。
 2. また、「値を直接変更しない」という関数型の特徴も併せ持っている。

# Redux の登場人物

<img width="838" alt="スクリーンショット 2020-02-11 19.22.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563702/e5df2cda-22ca-4bab-b412-a010722bb980.png">



### Store
- Storeはアプリケーションの状態(state)を保持している場所。
- コードで直接的に記述する部分はほとんどない
- Redux の状態そのものは Store と呼ばれるオブジェクト。この中に各 Reducer に対応した State がネストして入っている。
- StoreはReducer を介してしか変更できない
- StoreはstateにgetStateメソッドを通していつでもアクセス可能。

```Javascript:Javascript
console.log(store.getState())
```

### Action type
- Reducer や middlwareがどの処理を行うかを判断するために使用。
- 直接値を変更できないのでこのような方法が取られる。定数や typescript であれば enum で定義されることが多いらしい。（自分自身Typescript・enumはまだ勉強範囲外なのでメモとして記載）

```Javascript:Javascript
const ACTION_TYPE = "ACTION_TYPE";
```
### ActionCreator
- Actionを作成するメソッド。
- FluxのActionCreatorとは異なり、Actionを作るのみを行いStoreへのdispatchは行わない。

### Action
- ActionはStoreに向かって「何をする」という情報を持ったオブジェクト（関数）。
- Actionをdispatch（＝ Redux に通知）を検知すると，「Stateの番人（＝Reducer）」が更新しReduxのフローが実行
- Actionはtypeプロパティを必ず持つ必要がある。

```Javascript:Javascript
{
    type: "アクションの種類を識別できる文字列またはシンボル",
    payload: "アクションの実行に必要なデータ（引数）",
}
```

### Reducer
- payload と直前の state を受け取って次の state を返す関数。
- Reducer は Store に登録された関数
- Redux における関数は Reducer を介さないと更新できない仕組みになっている。
- どのように状態を更新するかは Action type で条件分岐をするのが一般的。

```Javascript:Javascript
{
const reducer = (state = initState, { type, payload }) => {
  switch (type) {
    case ACTION_TYPE:
      return newState(payload);
    default:
      return state;
  }
};
```

# 次回以降
- 概念をが中心で記載したので、次は具体的な処理内容も追記していく。
- React-reduxについても追記予定
Rails チュートリアル11章で躓いたポイント（未解決）

# はじめまして

私は現在、職業訓練校で主にJava,C言語を学んでいますが、独学でRailsを学習中です。

今回は、タイトル通りRailsチュートリアルにて躓いたポイントを投稿しようと思います。

※2/11現在　問題は解決していません。

# 11章　本番環境でメールが送信できない！

[11章リンク](https://railstutorial.jp/chapters/account_activation?version=5.1#cha-account_activation)

development環境におけるアカウント有効化はおそらく進みテストもエラーなくクリアすることができました。


11.4 本番環境でのメール送信の項で問題が発生しました。

## リスト11.41: Railsのproduction環境でSendGridを使う設定
~~~ruby
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.delivery_method = :smtp
  host = '<your heroku app>.herokuapp.com'
  config.action_mailer.default_url_options = { host: host }
  ActionMailer::Base.smtp_settings = {
    :address        => 'smtp.sendgrid.net',
    :port           => '587',
    :authentication => :plain,
    :user_name      => ENV['SENDGRID_USERNAME'],
    :password       => ENV['SENDGRID_PASSWORD'],
    :domain         => 'heroku.com',
    :enable_starttls_auto => true
  }
~~~
上記リストを参考に、
　　

~~~ruby
  host = '<your heroku app>.herokuapp.com'
~~~
こちらの項目を https:から始まる自分のアプリのアドレスに変更
　　
　　
git & heroku にpush

```
$ git push
$ git heroku push
$ heroku run rails db:migrate
```
　
いざ、本番環境でユーザー登録！
※メールアドレスは切り抜いています。

![sign op.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565703/78537d30-1c72-31a2-2ffb-ac375297302a.png)

  
すると
  
![era.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565703/8ed60c06-63ce-a5af-3a3f-8462c45cb485.png)

エラーしてしまいました。
  
# 試したこと
コードの見直しを行いおかしな箇所を探しましたが、これといったものは見つからず、
同じように躓いた人がいないか検索しました。

- 参考になった記事
 - [[Rails]HerokuのアドオンSendGridでメールが届かないときの対処法](https://qiita.com/yuta-ushijima/items/f43ef5e0b59c2510ff52)
 - [Ruby on Rails チュートリアル 第11章 アカウント有効化(AcctionMailer Activation)やSendGridの使い方など](https://qiita.com/bitcoinjpnnet/items/3a544d9183f4008f6aa2#114-%E6%9C%AC%E7%95%AA%E7%92%B0%E5%A2%83%E3%81%A7%E3%81%AE%E3%83%A1%E3%83%BC%E3%83%AB%E9%80%81%E4%BF%A1)


## とりあえずログ確認してみる

herokuのログを確認すると、

```
$ heroku logs
```
　　
COMMITはできていることが確認できました。
更にログをたどると
　　

```
2020-02-11T05:46:41.907827+00:00 app[web.1]: Welcome to the Sample App! Click on the link below to activate your account:
2020-02-11T05:46:41.907828+00:00 app[web.1]: </p>
2020-02-11T05:46:41.907828+00:00 app[web.1]: 
2020-02-11T05:46:41.907829+00:00 app[web.1]: <a href="https://<アプリ名>.herokuapp.com/account_activations/ZbXtAXTWMPdPgdpu4EjcAQ/edit?email=<送信先アドレス>">Activate</a>
2020-02-11T05:46:41.907829+00:00 app[web.1]: </body>
2020-02-11T05:46:41.907829+00:00 app[web.1]: </html>
```

Activateリンクがあるのでそちらをクリック。
  

![ok.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565703/17a2517b-d0ae-ae85-58eb-2be3182500cb.png)

認証はクリアできました。


## なぜメールが送れないのか※予想

　　
<strong>どうやらherokuからSendGridを登録すると凍結されるらしい</strong>
  
herokuからSendGrid ページにアクセスするも

![スクリーンショット 2020-02-11 15.10.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565703/5de354c5-9af2-97b5-6357-754e54f6dfc3.png)

拒否されるのでおそらく凍結なのではと考えている。

  
SendGridユーザー登録して凍結解除の問い合わせしようと思います。

　　

　　
凍結解除で問題が解決されることを祈りつつ終わりとさせていただきます。
　　
　　
つたない文章ですがなにかの参考になれば幸いです。
AndroidでFirebaseを使ったログインの際にINVALID_CERT_HASHが起きる場合の対処法

Google Playアプリ署名が有効になっていると、自分のアプリ署名が削除され、アプリリリース後にGoogle Playが付与したアプリ署名が使われる。

<img width="964" alt="スクリーンショット 2020-02-11 19.14.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33011/b8c0f9e0-1f78-daa7-aeab-48f71a6fe240.png">


そのため、Firebaseログインを利用する場合、自分が署名した際のSHA-1フィンガープリントではなく、Google Playが署名した際のSHA-1フィンガープリントをFirebaseの設定で登録する必要がある。

<img width="967" alt="スクリーンショット 2020-02-11 19.12.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33011/eff29a9d-c57a-6db8-2e5f-245cde7205bc.png">


上記の手順を行っていない場合、Firebaseを使ったログインの際、下記のコードで例外が起きる。


```
firebaseAuth
        .startActivityForSignInWithProvider(MainActivity.this, provider.build())
        .addOnSuccessListener(
                new OnSuccessListener<AuthResult>() {
                    @Override
                    public void onSuccess(AuthResult authResult) {
                    }
                })
        .addOnFailureListener(
                new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        // ここで例外が起きる
                        e.printStackTrace();
                    }
                });


```

エラーメッセージに書かれている`INVALID_CERT_HASH `は、Play Storeが施したアプリ署名のSHA-1フィンガープリントとFirebaseに登録されたSHA-1フィンガープリントが一致しない場合に起きる。

```
E/FirebaseAuth: [GetAuthDomainTask] Error getting project config. Failed with INVALID_CERT_HASH 400
```

```
E/IdpSignInActivity: Web sign-in failed, finishing
```

スタックトレースの直前に書かれている`There was an error while trying to get your package certificate hash`は「パッケージの証明書の署名が間違っているとき」に起きるエラーで、`INVALID_CERT_HASH`と同じ意味になる。

```
com.google.firebase.auth.FirebaseAuthException: There was an error while trying to get your package certificate hash.
    at com.google.firebase.auth.api.internal.zzdv.zza(com.google.firebase:firebase-auth@@19.2.0:37)
    at com.google.firebase.auth.internal.zzal.onReceive(com.google.firebase:firebase-auth@@19.2.0:32)
    at androidx.localbroadcastmanager.content.LocalBroadcastManager.executePendingBroadcasts(LocalBroadcastManager.java:313)
    at androidx.localbroadcastmanager.content.LocalBroadcastManager$1.handleMessage(LocalBroadcastManager.java:121)
    at android.os.Handler.dispatchMessage(Handler.java:107)
    at android.os.Looper.loop(Looper.java:214)
    at android.app.ActivityThread.main(ActivityThread.java:7356)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
```

### 参考リンク

下記のリンクにはもう少し詳しい説明が書いてある。

[Authorization issue with Firebase when publish app to Play Store](https://medium.com/@johanesriandy/authorization-issue-with-firebase-when-publish-app-to-play-store-7a3e1ec03de8)
【メモ】Windows10 + Apache + PHP 

#Windows10 + Apache + PHP 設定
これまで縁の無かったPHPに初挑戦。忘れないように環境構築・設定のメモを作成。

##PC環境：
・Windows 10 Pro 1903 x64
・PHP 7.4.2（VC15 x64 Thread Safe）
・Microsoft Visual C++再頒布パッケージ（Visual Studio 2019）
・Apache 2.4.41 Win64

##PHPのセットアップ
@uriuri7610 さんの「WindowsでPHP/Apache環境構築（ダウンロード～画面を起動するまで）」を参考に設定。記事の最終更新から1年以上経過していたが、PHP / Apache とも最新版で手順通りに設定できた。

セットアップの手順は
・[PHP公式サイト][php]よりPHPをダウンロード、セットアップ
・[マイクロソフトサポートサイト][ms-support]よりMicrosoft Visual C++ 再頒布可能パッケージをダウンロード、セットアップ
・[Apache公式サイト][apache]よりApacheをダウンロード、セットアップ

[php]:https://php.net/
[ms-support]:https://support.microsoft.com/ja-jp/help/2977003/the-latest-supported-visual-c-downloads
[apache]:https://www.apachelounge.com/download/

参考URL:
https://qiita.com/uriuri7610/items/df6a05ed27b65fde499c
pythonでバブルソートを実装してみた

pythonとアルゴリズムの勉強かねがね、バブルソートを実装してみました。

1.ランダムなリストを作成する
例:
[1,3,0,4,2]

2.操作対象リストの右端の値と隣の値を比較して、右側が小さければ値を入れ替え
　左端に到達するまで比較を繰り返す
例:
[1,3,0,4,2]→(4と2を比較して2が小さいので入れ替えする)→[1,3,0,2,4]
[1,3,0,2,4]→(0と2を比較して0が小さいので入れ替えなし)→[1,3,0,2,4]
[1,3,0,2,4]→(3と0を比較して0が小さいので入れ替えする)→[1,0,3,2,4]
[1,0,3,2,4]→(1と0を比較して0が小さいので入れ替えする)→[0,1,3,2,4]

3.左端まで比較が終わると、左端の値がリスト内で一番小さい値になるので
　左端の値を操作済みリストに移行して、操作対象のリストから除外する

-操作済リストの中身がラスト1個になるまで2.と3.を繰り返す-

…という処理をバブルソートと呼ぶらしいです。

(4.ラスト1個は比較せず操作済リストに移行する)

```bubble_sort.py

import random

# 準備する値の数を入力
numbers = 10

# チェック済の値を格納するリストの作成
pop_list = []

# 乱数の作成
num_list = list(range(numbers))
random.shuffle(num_list)

def _num_checker(num_list, pop_list):
    # 一番右の値を取り出し(_a)、隣の値(_b)と比較する
    # 左端まで大小比較を行う
    for i in range(-1,len(num_list)*-1, -1):
        _a = num_list[i]
        _b = num_list[i-1]

        # 右の値が左の値より小さかったら値を入れ替える
        if _a < _b:
            num_list[i] = _b
            num_list[i-1] = _a

    # 一番左の値を移動済リストに送る
    pop_list.append(num_list[0])
    num_list.remove(num_list[0])

    return num_list, pop_list

# メイン処理
print("START : ",num_list)
for i in range(len(num_list)):
    num_list, pop_list = _num_checker(num_list, pop_list)
print("GOAL  : ",pop_list)

```
【Laravel】Homestead環境のMySQLにホストOSのSequel Proから接続できない場合

# 環境
- Vagrant 2.2.7
- Laravel Homestead 9.2.0
- PHP 7.4.1
- Laravel Framework 6.14.0
- MySQL 5.7.28
- Sequel Pro 1.1.2

# 結論
rootユーザだと接続できない設定になっているようです。
homesteadユーザを使いましょう。

**Sequel Pro 接続情報例**

|  項目  |  値  |  備考  |
| ---- | ---- | ---- |
|  ホスト  |  homestead.test or 192.168.10.10  | Homestead.yamlのip |
|  ユーザ名  |  homestead  | .envのDB_USERNAME |
|  パスワード  |  secret  | .envのDB_PASSWORD |
|  データベース  |  homestead  | .envのDB_DATABASE |



# 根拠
homesteadは%指定なのでホストマシンからのアクセスが許可されていますが、rootには同様の設定が無いため弾かれているものだと思われます。
0.0.0.0に関しては私は詳しくないため、コメントにて情報をいただけると助かります。

```sql

mysql> select user,host from mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| homestead        | %         |
| homestead        | 0.0.0.0   |
| root             | 0.0.0.0   |
| debian-sys-maint | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
7 rows in set (0.00 sec)
```
はじめてのVue.js

はじめてこういう記事を書くのでお手柔らかにお願いします！！！


今回はVue.jsを使ってHelloWorldの出力までしていきましょう！！
今後回数を重ねてもっと深堀りしていく記事を書いていきますのでよろしくお願いします！


#1. Vue.jsを使ってみよう！

Vue.jsを使うにあたって、scriptタグでライブラリを読み込みます。

```html
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
```

これでVue.jsを使用することができるようになったので、次に進みます！

#2. インスタンスを作ろう！
Vueは、Vue関数でVueインスタンスを作成することによって起動されます、これを実行するためには？
JavaScriptの特性として、**new**演算子を使えばインスタンスを作ることができますのでやってみましょう！

インスタンスが分からないという方はこちら見れば理解できるかも・・・？→https://wa3.i-3-i.info/word1118.html

````js
var vm = new Vue({
  
})
````

これで準備ができました！

#3.データを作ろう！
先ほどのインスタンス、あれを作る時に引数にオプションを渡すことでデータを定義することができます！

ここでは試しにお決まりの、Hello World!が入ったHelloWorldって名前のデータを定義してみましょう！

````js
var vm = new Vue({
  data:{ HelloWorld: 'Hello World!'}
})
````

こちら**data**オプションというものを使って、インスタンスの中のデータを定義しました！
ほぼ主要のオプションだと思うので是非覚えてください！
`data: {プロパティ名: 値}`

#4.HTMLテンプレートを作ってみよう！
では早速先ほどHelloWorldに格納したHello World!を表示するための準備をしましょう！
その為には、HTMLテンプレートを作る必要があります。
Vue.jsでは({{ }}) ←を使ってインスタンスのデータを参照することができます。
では実際にやってみましょう！

```index.html
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="utf-8">
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>

<body>
    <div id="test">
        <p>{{HelloWorld}}</p>
    </div>
    <script>
        var vm = new Vue({
            data: {
                HelloWorld: 'Hello world!'
            }
        });
    </script>
</body>
```

これでひとまずHTMLテンプレートの作成は終了です。
次にテンプレートとインスタンスを紐付けしていく方法を紹介します！

#5.テンプレートとインスタンスを紐付けよう！
先ほどの順序でやったのに、あれ？HelloWorld!表示されないんだけど・・・ってなったと思います。
それは何故かというとテンプレートとインスタンスがくっついてなかったからなんです！バグやミスではありません！

そもそも、Vueの処理って、Vインスタンスを作ってどの要素と繋げるか（このことをマウントと呼ぶ）をしないと始まりません。
このマウントするためのオプションが**el**(elementの略)で指定した要素がマウントの対象になるわけです。
**el**を使ってHelloWorld!を表示させていきましょう～


```js

var vm = new Vue({
            el: '#test',
            data: {
                HelloWorld: 'Hello world!'
            }
        });
```

このようにしたらブラウザを更新して確認してみてください！
HelloWorld!と表示されているはずです。

またこの**el**オプションはCSS、セレクタ、DOM要素を指定することができます。今回はidのtestを持つ要素を指定しました！

#6.最後に

ここまでお疲れさまでした！
拙いかもしれませんが、できる限り分かりやすいように書いてみました！
こうして自分でアウトプットすることで頭に残る感覚がありますね・・・！
これを機にこれからもQiitaの執筆をしていきたいと思います´▽｀

ここまで読んでいただきありがとうございました！:relaxed:
TwitterAPI 利用申請の手順



TwitterのAPIを利用するためには、事前の申請が必要です。
英語のサイト上で色々と入力が必要なので、手順をまとめました。

#目的
TwitterAPIを利用してrubyからツイートするために、利用申請を行うこと。

#手順１　Developerにアクセスする
以下サイトにアクセスして下さい。
[ツイッターデベロッパー](https://developer.twitter.com/en.html)


#手順２　ツイッターにサインインする
画面右上の「Sign in」ボタンからサインインして下さい。
[![Image from Gyazo](https://i.gyazo.com/b5975b55a0cb7c3312aab167abefe95a.png)](https://gyazo.com/b5975b55a0cb7c3312aab167abefe95a)

#手順３　Applyページにアクセスする
サインインが完了したら、同じく画面右上の「Apply」ボタンをクリックして下さい。
[![Image from Gyazo](https://i.gyazo.com/3b288cc8d81bc5404dcf785c44928ad6.png)](https://gyazo.com/3b288cc8d81bc5404dcf785c44928ad6)

#手順4 Apply for a developer account　をクリックする
[![Image from Gyazo](https://i.gyazo.com/6fc96ae099168334e86796c01a4a4b98.png)](https://gyazo.com/6fc96ae099168334e86796c01a4a4b98)

#手順5 デベロッパーツールの利用目的を選択する。
「Making a bot」にチェックを入れ、「Next」をクリックする。
[![Image from Gyazo](https://i.gyazo.com/2aca03e170fa0bc14163e7824c52d5a4.png)](https://gyazo.com/2aca03e170fa0bc14163e7824c52d5a4)

#手順6 本人確認を行う
以下のような画面が表示されるので、アカウント名等に誤りが無いか確認してください。
[![Image from Gyazo](https://i.gyazo.com/57c42ae3b67158ae0d75d4dd0e9bcfb0.png)](https://gyazo.com/57c42ae3b67158ae0d75d4dd0e9bcfb0)

ページ下部では、メールアドレスを確認後、居住国と名前(ニックネームで可)を入力し、「Next」をクリックする。
[![Image from Gyazo](https://i.gyazo.com/d4d31c9fd3aaa603e95410a6d66fb0c8.png)](https://gyazo.com/d4d31c9fd3aaa603e95410a6d66fb0c8)

#手順7 TwitterAPIの利用目的等を入力する
英語200文字以上でAPiの利用目的を入力してください。
Google翻訳に突っ込んだだけの文章ですが、よければコピペしてください。

    I am studying programing.
    I have never used the API, so I want to try making a bot.
    In the future, I want to create a web application that can get information about tweets that users have searched for. 

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

その他の項目についても以下のように入力していきます。
自動ツイート等の利用予定については、以下のような文章で問題ありません。
全ての項目の入力が完了しましたら、「Next」ボタンを押してください。

    I do automatic tweeting as a practice for using Twitter api.
    However, there are no plans to use it thereafter.
[![Image from Gyazo](https://i.gyazo.com/209e8db65f5f80177de3717883b61449.png)](https://gyazo.com/209e8db65f5f80177de3717883b61449)

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

#手順8 登録内容に誤りが無いか確認する。
[![Image from Gyazo](https://i.gyazo.com/42aa319ba82d01533ecf1c2377eea4bb.png)](https://gyazo.com/42aa319ba82d01533ecf1c2377eea4bb)

#手順9 ポリシー等を読んで、問題なければチェックを入れて送信ボタンを押す
[![Image from Gyazo](https://i.gyazo.com/2ace690afb000922d95358a65ba0265b.png)](https://gyazo.com/2ace690afb000922d95358a65ba0265b)

#10 完了確認

以下のような画面が表示されれば申請完了です。
[![Image from Gyazo](https://i.gyazo.com/3014bea46275a6636473c078ff15b85e.png)](https://gyazo.com/3014bea46275a6636473c078ff15b85e)

この後、実際にRubyでbotを作成するには、デベロッパー上でappを作成する必要があります。
その手順については、[次の記事](https://qiita.com/n-ike/items/2aefe4d65d6e89f846a7)に記載してあります。
ケモインフォマティクスで学ぶRの関数

# はじめに

[ケモインフォマティクスで学ぶRの反復処理](https://qiita.com/yukiya285/items/4d87b2ecb38153e9787a)に引き続き、リピドミクス（脂質の網羅解析）を題材として「関数」について解説していきます。
ケモインフォマティクスの実践例を中心に説明していきますので、基本を確認したいという人は以下の記事を読んでからこの記事を読んでみてください。

[製薬企業研究者がRにおける関数についてまとめてみた](https://qiita.com/yukiya285/items/97fe79b24bc47b1fef6c)


# 関数の作成と利用

関数というのは、一連の処理をひとまとめにしたもので、`function(引数){処理}`と記述することができます。
一度関数を作成したら、あとは関数名を呼び出すだけで、関数内に記述されている処理を実行できます。
戻り値（返り値）は、`return`を使って書くことができます。

```r
exact.mass <- function(Cn, Un){
  return (12 * Cn + 1.00783 * (2 * Cn - 2 * Un) + 15.99491 * 2)
}

exact.mass(16, 0)
exact.mass(18, 2)
```


# 変数のスコープ

関数を利用する時には、「変数のスコープ」に注意する必要があります。
変数のスコープというのは、変数がどの範囲で使えるかということで、関数内だけでしか使えない場合（ローカル変数）もあれば、関数の外でも使える場合（グローバル変数）もあります。

```{r}
abbreviation <- function(a, b){
  Cn <- a
  Un <- b
  return (paste0("FA ", Cn, ":", Un))
}

Cn <- 16
Un <- 0

abbreviation(18, 2) # "FA 18:2"

print(Cn) # 16
print(Un) # 0
```

上の例では、関数`abbreviation`内で出てくる変数`Cn`と`Un`はいずれもローカル変数で、関数の外で定義されている`Cn`と`Un`とは別物です。
なので、関数を呼び出しても、変数`Cn`と`Un`の値は更新されません。

ここで、関数を呼び出すことで、変数`Cn`と`Un`の値も更新したい場合は、`<<-`を使って、関数内の`Cn`と`Un`がローカル変数ではなくグローバル変数であることを示す必要があります。

```{r}
abbreviation <- function(a, b){
  Cn <<- a
  Un <<- b
  return (paste0("FA ", Cn, ":", Un))
}

Cn = 16
Un = 0

abbreviation(18, 2) # "FA 18:2"

print(Cn) # 18
print(Un) # 2
```

上の例では、`Cn`と`Un`がグローバル変数として扱われているので、関数呼び出し時に`Cn`と`Un`の値も更新されます。


# まとめ

ここでは、Rの関数について、ケモインフォマティクスで使える実践的な知識を中心に解説しました。
もう一度要点をおさらいしておきましょう。

- 関数はひとかたまりの処理をまとめて記述したもので、一度作っておけば、あとは呼び出すだけで処理を実行できます。
- 関数内で変数を扱う時には、変数のスコープに注意する必要があります。


# 参考資料・リンク

[プログラミング言語Rとは？統計分析に強い？](https://pharma-engineer.com/basic-programming/r-summary/)
特殊メソッド

```py:
class Word(object):
    def __init__(self, text):
        self.text = text
    
    def __str__(self):
        return 'texttxet'
    
    def __len__(self):
        return len(self.text)
    
    def __add__(self, word):
        return self.text.lower() + word.text.lower()
    
    def __eq__(self, word):
        return self.text.lower == word.text.lower()

w = Word('aaaaaaaaaa')
w2 = Word('bbbbbbbbbbbbb')

print(w)
print(len(w))
print(w + w2)
print(w == w2)
```

```:実行結果
texttxet
10
aaaaaaaaaabbbbbbbbbbbbb
False
```
【ふくだ学習録】アプリ制作part3【30日目】

# ふくだ学習録とは？
ふくだが学習したことの備忘録。
目に見える形で残すことによってやる気を出す個人的な作戦です。
他人に見せるように書いているわけではないので、すごく読みにくいです。

### 読了した本
[データベースエンジニア養成読本 [DBを自由自在に活用するための知識とノウハウ満載!]](https://www.amazon.co.jp/dp/4774158062/ref=cm_sw_r_tw_dp_U_x_FPphEbQFPPQRM )
[ゼロから作るDeepLearning](https://www.amazon.co.jp/dp/4873117585/ref=cm_sw_r_tw_dp_U_x_y3UiEbF3P6EG7)
[PHPフレームワーク CakePHP 3入門](https://www.amazon.co.jp/dp/4798048577/ref=cm_sw_r_tw_dp_U_x_.YIjEbS1K4JY2)
[SQLアンチパターン](https://www.amazon.co.jp/dp/4873115892/ref=cm_sw_r_tw_dp_U_x_XlokEbJQK2N7P )
[Docker入門](https://www.amazon.co.jp/dp/480071091X/ref=cm_sw_r_tw_dp_U_x_xVlmEbN8ZTHZK)


### 今読んでいる本

なし

# アプリ制作

### TypeScriptの環境構築
`tsconfig.json`に記載する。

[TypeScript環境構築](https://qiita.com/teradonburi/items/06980b8670339ea424c4#typescript%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89)



### 型定義ファイルがない時の対処法
大きく分けて３種類の対応方法がある。

**①@types からインストールする**
npm installをする際に、@typesを付与しておくことで、型定義ファイルが提供されている場合はそれを利用することができる。

```console
# npm
npm install --save @types/foobar

# yarn
yarn add @types/foobar
```

**②型定義ファイル( d.ts )を自作する**
`src/@types`ディレクトリを作成し、`foobar.d.ts`を`@types`下に作成します。
tsconfigのデフォルト設定が、@typesディレクトリ以下を参照しに行くようになっている。

```json
{
  "compilerOptions": {
    "typeRoots" : [".d.tsを入れるディレクトリのパス"]
  }
}
```

**③requireでモジュール読み込み**
requireで読み込むと型定義がanyに自動的になる。そのため、型定義ファイルが見つからないことによるエラーはなくなる。

```ts
const foobar = require('foobar')
```


下記の記事がわかりやすく記載してくれていた！
[TypeScript で型定義ファイル( d.ts )がないときの対処法](https://qiita.com/Nossa/items/726cc3e67527e896ed1e)

### TypeScript + Eslint + pretterの導入
下記記事を参考に設定。すごいわかりやすかった！

[VSCodeでESLint+@typescript-eslint+Prettierを導入する（v2.0.0修正版）](https://qiita.com/madono/items/a134e904e891c5cb1d20)


### recomposeでtypescript
型はこれ参考にする。

[TypeScriptでrecomposeを使う](https://qiita.com/IgnorantCoder/items/2ec853c85e74cf8d71cd)


# 今日の一言
とりあえずDocker上で、Next+typescript+reduxの環境構築はできた！今日はもう満足！
どんなデータ構成にするか考えて、明日から実装に進みたい！TypeScript偉大！


この記事超有能！！量が半端ないし充実しすぎ！！

[TypeScript練習帳（入門）](https://qiita.com/teradonburi/items/06980b8670339ea424c4)
[関数型(Function Types)](https://qiita.com/teradonburi/items/06980b8670339ea424c4#%E9%96%A2%E6%95%B0%E5%9E%8Bfunction-types)まで読んだけどこれはバイブルやわ。
ABC049C - 白昼夢を簡単に導く方法が知りたい（Golang）

##はじめに
[ABC049C - 白昼夢](https://atcoder.jp/contests/abs/tasks/arc065_a)を検索文字列の特性上、文字列をリバースして導く方法で解きました。
解きかたは模範解答とされている手法なのでさておき、
こちらをGoで実現しようとしたとき検索能力の低さゆえ、Goに以下の機能が見つけられず手作りとなってしまったので、改良したいと思いメモです。

- 文字列のリバース
- 開始〜終了桁数を指定した文字列の抜き出し（例：abcを1文字目から2文字目で抜き出して「b」を求める）

##提出コード
```golang
package main

import (
  "fmt"
)

func main() {
  var s string
  annwer := "YES"
  divide := [4]string{"dream", "dreamer", "erase", "eraser"}
  fmt.Scanf("%s", &s)
  
  // リバース
  for i :=0; i < len(divide); i++ {
    divide[i] = getReverse(divide[i])
  }
  reverse := getReverse(s)
  
  // 後ろから一致するものを抜き出す
  j := 0 // 開始位置
  for j < len(reverse) {
    annwer = "NO"
    for i := 0; i < 4; i++ {
      
      // 比較する文字列を必要な範囲で抜き出す
      var str string
      for k := j; k < j + len(divide[i]); k++ {
        if k >= len(reverse) {
          continue
        }
        str += string(reverse[k])
      }
      // 比較
      if str == divide[i] {
        // 一致した分開始位置をずらす
        j += len(divide[i])
        annwer = "YES"
        break
      }
    }
    // ここにNOで来た時点でアウトなので終わり
    if annwer == "NO" {
      break
    }
  }
  fmt.Println(annwer)
}

func getReverse(s string) string {
  rs := []rune(s) // 今回マルチバイト文字ではないが想定してrune
  for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
    rs[i], rs[j] = rs[j], rs[i]
  }
  return string(rs)
}
```
コード長：1263 Byte
実行時間：174 ms
メモリ：3912 KB

##その他１（追記）
コメントでアドバイスいただいた正規表現にて実現した場合、とてもスッキリしています。
アルゴリズム理解のため、パッケージはあまり使いたくない気持ちでAtCorderをやっていますが、このスッキリ感には負ける…。

```golang
package main
 
import (
  "fmt"
  "regexp"
)
 
func main() {
  var s string
  divide := `^(dream|dreamer|erase|eraser)*$`
  
  fmt.Scanf("%s", &s)
 
  if regexp.MustCompile(divide).Match([]byte(s)) {
    fmt.Println("YES")
  } else {
    fmt.Println("NO")
  }
}
```
コード長：279 Byte
実行時間：	164 ms
メモリ：2820 KB	

##その他２
stringsパッケージのReplaceで一致したら""と置換してしまい、最後0文字になったらYESという方法
※AtCorderの白昼夢で検索するとよくヒットしますので割愛。

##おわりに
提出コードを書いたときは、冗長すぎておかしくなりそうでした。
正規表現のアドバイスをくださった@superrino130さん、ありがとうございました！！
以下は引き続き捜索中です。あまりニッチではないパッケージで実現可能でしたら教えていただけると嬉しいです。

- 文字列のリバース
- 開始〜終了桁数を指定した文字列の抜き出し（例：abcを1文字目から2文字目で抜き出して「b」を求める）
MotherBoardのIPMIがASPEEDのチップセットだった時のX-Windowsドライバ


ちょっと特殊なMotherBoardで、ASPEEDのチップセットがIPKVMとして利用できるグラフィックボードを載せている時、
```
blacklist=ast
```
を使ってインストールするのですが、X-Windows使えないなーと諦めていましたが

```
https://www.aspeedtech.com/support.php
```
のドライバーで、xorg-*rpmをゲットしてインストールするとグラボが使える（やったー


という俺得メモでした
DockerでRailsの環境構築


docker-composeでrails環境を構築します。データベースはpostgresqlを使用します。

## Setup
以下のような構成からスタートします。

```
./
|- docker-compose.yml
|- rails-app/
  |- Dockerfile
```

### Dockerfileの作成

```dockerfile:Dockerfile
FROM ruby:2.5.0

RUN apt-get update && apt-get install -y build-essential libpq-dev postgresql-client vim less
RUN gem install rails -v '5.2.1'
RUN mkdir /app
WORKDIR /app
```

railsのバージョンは5.2.1を指定しています。
マウント先のディレクトリとしてappディレクトリを作成しておきます。

### docker-compose.ymlの作成

```docker-compose.yml
version: "3"

services:
  rails-app:
    build: rails-app
    ports:
      - "3001:3001"
    environment:
      - "DATABASE_HOST=db"
      - "DATABASE_PORT=5432"
      - "DATABASE_USER=postgres"
      - "DATABASE_PASSWORD=<パスワード>"
    links:
      - db
    volumes:
      - "./rails-app:/app"
    stdin_open: true

  db:
    image: postgres:10.1
    ports:
      - "5432:5432"
    environment:
      - "POSTGRES_USER=postgres"
      - "POSTGRES_PASSWORD=<パスワード>"
```

ポートは3001番を指定していますが、3000番でもOKです。


### コンテナの起動

```bash
docker-compose build
docker-compose up -d
```

コンテナにログインします。

```bash
docker-compose exec rails-app bash
```

以降はコンテナ内で操作を行います。


## Railsプロジェクトの作成

```bash
cd /app
rails new . -d postgresql -BT
```

`-B`でbundle installをスキップし、`-T`でテストファイルの作成をスキップしています。
Gemfileにtherubyracerを追加します。

```ruby:Gemfile
gem 'therubyracer', platforms: :ruby
```

この状態でbundle installします。

```
bundle install —-path vendor/bundle
```

これでプロジェクトが作成されました。


## データベースの設定

`config/database.yml`を編集します。

- defaultにhost, port, username, passwordを追加
- データベース名を rails_app_development に変更


```diff:config/database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  # For details on connection pooling, see Rails configuration guide
  # http://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
+ host: <%= ENV.fetch("DATABASE_HOST") { "localhost" } %>
+ port: <%= ENV.fetch("DATABASE_PORT") { 5432 } %>
+ username: <%= ENV.fetch("DATABASE_USER") { "root" } %>
+ password: <%= ENV.fetch("DATABASE_PASSWORD") { "password" } %>


development:
  <<: *default
- database: app_development
+ database: rails_app_development
```

データベースを作成します。

```bash
bundle exec rails db:create
```


## 起動
IPアドレスとポートを指定してサーバを起動します。

```bash
rails s -b 0.0.0.0 -p 3001
```

ブラウザで`http://localhost:3001/`を開いて、正しく起動できているか確認します。
<img width="1440" alt="スクリーンショット 2020-02-11 18.49.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145075/c3a8cf56-7d9e-a1a5-5d06-1189c6b9e2e6.png">


ホストPCとdockerコンテナ間でプロジェクトディレクトリを共有しているので(./rails-app:/app)、編集はホストPCで(vscode等で！)、実行は環境構築したコンテナで、という開発ができます。
幸せになりましょう。
【自由研究】数理モデルを構築して個別株の予測をしてみた

個別株の予測をしてみようと思い、結果を自分用備忘録として以下まとめます。

統計的な手法としては、古き良き重回帰分析でサクッと。
今回使用する説明変数は、前日の終値をベースに、
・移動平均線(５日移動平均線、25移動平均線、50日移動平均線)
・ボリンジャーバンド(±2σ,±1σ)
・一目均衡表(基準線、転換線、先行スパン1、先行スパン2、遅行線)
を使用しました。

対象株は、RIZAPグループ(2928)です。理由は特にありません。。。
学習対象期間は上場した2006年から2018年までで、
テスト対象期間は2019年にしました。

以下、結果です。

![graph1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407666/d700af91-d732-056e-ad86-431a93d2b404.png)

前日の終値を元に、翌日の終値を計算しています。
株価の動きはほぼ完璧に捉えられていると思います。
まぁ重回帰分析の特徴を踏まえると当たり前ですかね。


![graph2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407666/b076ac06-593b-50d8-1ddf-f22e1e194475.png)


しかし、予測値はほぼ株価を過大評価です。(赤線はy=X)
まだまだ、改善点はありそうです。



終値だけでなく、高値、安値、始値を用いてチャート化しようかな？
ソースコードはこちらから↓ご連絡ください。
https://coconala.com/services/999047
SORACOM LTE-M Button for EnterpriseとAlibaba Cloud Function Computeを連携する

#概要
2020年2月4日開催の[SORACOM UG Tokyo #14](https://soracomug-tokyo.connpass.com/event/158831/) LT枠にてお話しした
「日中間の架け橋ボタン」で発表させていただいた内容の関連記事です。

初めての参加で初めての発表にも関わらず、皆さんニコニコして聞いてくれました。感謝です。

LT資料は[こちら](https://www.slideshare.net/YuriYoshii/soracom-ug14lt1)です。
[![thumbnail](https://image.slidesharecdn.com/soracom-ug-14-lt1-200211094340/95/soracom-ug14lt1-1-638.jpg?cb=1581414304)](https://www.slideshare.net/YuriYoshii/soracom-ug14lt1)

#今回記載すること
おそらくはじめてしろボタンとAlibaba Cloudを連携させた気がするので、
その記録として、しろボタンとFaaSの[FunctionCompute](https://jp.alibabacloud.com/product/function-compute)の
連携方法について記載します。
ただ、メインはFunction Computeの作成方法になってしまいました…
SORACOM Beamの設定は他にも[記事](https://dev.soracom.io/jp/design_patterns/soracom_aws/)がたくさんありますので、割愛させていただきます。(リンクは一例です)

#手順
手順はたったの2ステップ！
- HTTPトリガーでFunction Computeの関数を作成する
- SORACOM Beamの転送先に上記で作成したURLを登録する
です。

###HTTPトリガーでFunction Computeの関数を作成する
FaaSでURL作れるんだ！API Gatewayいらないんだ！と思われた方のために、
どこでURLが生成されるか、簡単に手順を記載したいと思います。

####Function Computeでサービスを作成する
Alibaba Cloudコンソールにログインして、
Function Computeのサービスを作成します。
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438345/cb4dc71f-49ff-d3eb-8696-bd15532e28d8.png)

####Function Computeで関数を作成する
サービスを作成したら、関数を作成します。ここでHTTP関数を選択します。
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438345/e7103ac5-6559-c6e0-8ada-2b6edee5292a.png)

####関数の設定をする
関数に名前を付けたり、言語を選択したりします。

![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438345/91a49aa2-6a8a-b771-afa2-d59f7bb4cf4f.png)
ついでにHTTPトリガー名をつけたり、承認方法(anonymousかfunction)、
リクエストメソッドを選択します。私はGETとPOSTにしました。
![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438345/5a28ad11-180d-413f-243d-e9c3b28cae38.png)

####コードを書く
関数の設定が終わったら、下記のようにサンプルコードと共にエディタが現れます。
頑張ってコードを書きます。今回の場合は、ボタンが緑点灯するように
ステータスコード200を戻り値として書くのがポイントでした。
![5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438345/68c8351e-011e-a6a0-282c-dea6940e4a92.png)

そして、どこにURLがあるのか？というと
ここです。エディタ部分の下にあるので、赤枠の部分をコピーして
SORACOM Beamの転送先に設定します。
![6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438345/be276a7b-94da-cb3b-2496-d1559606c982.png)

####ボタンを押して実行されるか確認する
ボタンをぽちっと押して、緑点灯になるか、
Function Computeに記載した想定通りの動きになるか確認します。

#まとめ
以上、ほぼFunction Computeの設定方法紹介になってしまいましたが、
しろボタンとAlibaba Cloud Function Computeとの連携方法でした。
すごくシンプルで簡単ですよね！

LT資料にあった、Function ComputeでCENにVPCをアタッチする部分や、
Ping結果をDataVに表示させる部分は長くなりそうなので別記事としたいと思います。

最後まで読んでいただき、ありがとうございました！
#PowerApps のコントロールはグローバル？

前回の「[JPPUG758 #4 Power Apps Q&A補足](https://qiita.com/yamad365/items/e1a58f5ffe5f093c46ce)」の補足です。あるいは、Power Apps におけるコントロールはグローバル変数的な扱いなのか？について、です。


結論、グローバル扱いなんですけどね。

# コントロールの名前は一意
コントロール名は、そのアプリの中で一意（＝ユニーク）になるよう制御されます。

Screen 内で一意ではありません。
アプリ全体で一意です。

実際に、Screen をまたいで同じコントロール名を設定するとエラーになります。同じコントロール名が利用されないようにガードされます。

<blockquote class="twitter-tweet"><p lang="ca" dir="ltr"><a href="https://twitter.com/hashtag/PowerApps?src=hash&amp;ref_src=twsrc%5Etfw">#PowerApps</a> Controls -&gt; Global values. <a href="https://t.co/xQlSDNxOHY">pic.twitter.com/xQlSDNxOHY</a></p>&mdash; やま (Yama) (@yamad365) <a href="https://twitter.com/yamad365/status/1227153883044073472?ref_src=twsrc%5Etfw">February 11, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

コントロールをコピー＆ペーストした際に、コントロール名が「[コピー元の名称]_1」みたいに、数値が自動的に付与されます。この動作は、同一コントロール名が発生しないように処理されている、と推測できますね。

# コントロールはグローバル
コントロール名がアプリで一意である必要は把握できました。では、その他プロパティはグローバル変数のようにScreenを跨いでも利用可能でしょうか？

<blockquote class="twitter-tweet"><p lang="ca" dir="ltr"><a href="https://twitter.com/hashtag/PowerApps?src=hash&amp;ref_src=twsrc%5Etfw">#PowerApps</a> Controls -&gt; Global values. <a href="https://t.co/keQcHp9Pb8">pic.twitter.com/keQcHp9Pb8</a></p>&mdash; やま (Yama) (@yamad365) <a href="https://twitter.com/yamad365/status/1227155547582943232?ref_src=twsrc%5Etfw">February 11, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

はい、利用可能ですね。
上記の動画では「SettingsScreen」に配置した「lblSettingTitle」コントロールの[Text]、および[Color]プロパティを「Screen1」に追加したラベルコントロールから参照しています。

これにより、コントロールはグローバル変数のようにScreenをまたいで利用可能なモノである、と確認できました。

# 活用法
コントロールがグローバル扱いである、という特性を活かして「アプリ全体の設定値を保持するScreen」を作成しておくテクニックがあります。前述のようにアプリの全Screenで表示する文字列や色などを設定用Screenで作成しておいて、利用される各々のScreenはそのコントロールを参照すればよいのです。

例えば、名称や色の変更が発生した場合、その設定用Screenに置いてあるコントロールのプロパティ等を修正するだけで、参照しているコントロールは全て対応完了になります。修正量、極小化されます。

もちろん、[コンポーネント](https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/create-component)を利用しても良いのですが・・・。
コンポーネント機能は、いまだプレビューなのですよ(;^ω^)

# まとめ
- Power Apps のコントロールはグローバル扱い
  - アプリ全体でコントロール名は一意になる
  - Screen をまたいで参照できる
- 設定用 Screen などを用意して、アプリ全体設定を保持するテクニックもあるよ！

この件も JPPUG758 の現場で質問もらって、その場で回答したんです。が、実際に Power Apps の画面を操作しながら動作等を説明する時間が確保できなかったんです。そのため、記事として補足した次第。

それでは、皆さま。素晴らしい Power Platform Life を！
Slack boltをTypescriptで作成時、log4jsで作成したログファイルにログを書き出す

#これはなに

Slack bolt公式リファレンスのログ拡張方法がTypescriptに対応していなかったため備忘もかねて作成しました。
https://slack.dev/bolt/ja-jp/concepts#logging

こちらにサンプルも記載しましたのでよかったらご確認にどうぞ。
https://github.com/attumkwg/slackboltlogbytypescript

またこの記事に記載のソースコードは以下Yuta Ohigashi様の記事とリポジトリを参考に作成しています。
[Bolt + jsx-slack + TypeScript を使って Slack App をつくる](https://qiita.com/phigasui/items/63c066e06a1708628ba7)
https://github.com/phigasui/slack_app_boilerplate

#内容

対応方法は単純で@slack/logger内に存在するConsoleLoggerを拡張してやるだけです。

```typescript
import dotenv from 'dotenv'
import { App } from '@slack/bolt'
import Log4js from 'log4js'
import { LogLevel, ConsoleLogger } from '@slack/logger'

dotenv.config()

Log4js.configure('./src/log/log4js.json')

const systemLogger = Log4js.getLogger('system')

// @slack/loggerにConsoleLoggerというclassが存在するのでそれを拡張する
class CustomLogger extends ConsoleLogger {
  debug(...msg: any[]): void {
    systemLogger.debug(JSON.stringify(msg))
  }
  info(...msg: any[]): void {
    systemLogger.info(JSON.stringify(msg))
  }
  warn(...msg: any[]): void {
    systemLogger.warn(JSON.stringify(msg))
  }
  error(...msg: any[]): void {
    systemLogger.error(JSON.stringify(msg))
  }
}

const customLogger = new CustomLogger()
customLogger.setLevel(LogLevel.DEBUG)

const app = new App({
  token: process.env.SLACK_BOT_TOKEN,
  signingSecret: process.env.SLACK_SIGNING_SECRET,
  logger: customLogger
})

```

```json:log4js.json
{
    "appenders": {
        "ConsoleLogAppender": {
            "type": "console"
        },
        "SystemLogAppender": {
            "type": "dateFile",
            "filename": "./log/system.log",
            "pattern": ".yyyy-MM-dd",
            "daysToKeep": 7
        }
    },
    "categories": {
        "default": {
            "appenders": ["ConsoleLogAppender"],
            "level": "all"
        },
        "system": {
            "appenders": ["SystemLogAppender"],
            "level": "debug"
        }
    }
}
```

こうしてやることでsystem.logに下記のようなslack appの通信ログが記録されるようになります。

```system.log
[2020-02-11T18:12:22.340] [DEBUG] system - ["apiCall('views.open') start"]
[2020-02-11T18:12:22.340] [DEBUG] system - ["will perform http request"]
[2020-02-11T18:12:22.711] [DEBUG] system - ["http response received"]
```
【Rails】error prohibited this user from being saved:のエラーメッセージがi18nで日本語化されない

#日本語化されない
下記のURLをもとにエラーメッセージを作成。
https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ja.yml
template:
body: 次の項目を確認してください
header:
one: "%{modelにエラーが発生しました"
other: "%{model}に%{count}個のエラーが発生しました 

しかしerror prohibited this user from being saved:のエラーメッセージだけが日本語化されない。

<img width="667" alt="3fa1148b8a5369418ce366ab9e0515a3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/bae5605b-65fa-d67a-a0a7-ae783693da96.png">

#結論
エラーメッセージ部分を下記のように変更する。
` <%= t("errors.template.header", model: User.model_name.human, count: user.errors.count) %>`

#解決方法
最初、下記のようにエラーメッセージを書いていた。
`<%= pluralize(user.errors.count,"error") %> prohibited this user from being saved:`

下記のURL参照し書き直してみる。
http://artisan.hatenablog.com/entry/20110126/1296005216
`<%=t "activerecord.errors.template.header.other", :model => Order.model_name.human, :count => @account.errors.count %>`
otherという表示になる。

下記のURLを参照し、` <%= t("errors.template.header", model: User.model_name.human, count: user.errors.count) %>`と変更してみると適用できた。新しいバージョンで変更された？
https://qiita.com/yshr04hrk/items/cb7b81c104321f660661
「t("activerecord.models.user")と同じ
User.model_name.human #=> "ユーザ"」

https://github.com/svenfuchs/rails-i18n/issues/118
「@kuroda I agree with @jrochkind, dynamic_form gem does not work for me.
Instead, this worked for me:
<%= t('errors.template.header', :model => Model.model_name.human, :count => model.errors.count) %>」
【dlib】AttributeError: module 'dlib' has no attribute ... とエラーがでたら

## エラー概要
先日、dlibを使って顔特徴点を検出しようとしたらこんなエラーに遭遇しました

```
Traceback (most recent call last):
  File "dlib.py", line 33, in <module>
    detector = dlib.get_frontal_face_detector()
AttributeError: module 'dlib' has no attribute 'get_frontal_face_detector'
```

dlibをimportはできているのできちんと環境構築はできているようでしたが、実際dlibを使おうとするとなるとAttributeErrorが吐かれていました。


## 解決方法
いろいろ調べてみると[こちらのstackoverflow](https://stackoverflow.com/questions/39518871/attributeerror-module-object-has-no-attribute-get-frontal-face-detector)に解決方法が書かれていました。

> Rename your file from dlib.py to something else, say dlib_project.py.

どうやらファイル名が`dlib.py`となっていることが問題だったようです。
試しに`getFacialLandmarks.py`とファイル名を変更したら無事に動きました。
ライブラリ名と同じファイル名はつけないほうがいいみたいですね…
AWS CLIでECRにログインする時はget-loginではなくget-login-passwordを使おう

## aws ecr get-login は非推奨に
コマンドリファレンスに記載されています。

> **Note:** This command is deprecated. Use get-login-password instead. 

**AWS CLI Command Reference - get-login**
https://docs.aws.amazon.com/cli/latest/reference/ecr/get-login.html

`aws ecr get-login` コマンドの出力結果は以下のようになります。

```shell-session
$ aws ecr get-login --no-include-email
docker login -u AWS -p <password> https://<aws_account_id>.dkr.ecr.<region>.amazonaws.com
```
docker login コマンド全体が標準出力されるため便利ではあるのですが
そのまま実行してしまうと、パスワードがシェルのhistoryやログファイルに
残ってしまうというリスクがあります。

## aws ecr get-login-password を使う
**AWS CLI Command Reference - get-login-password**
https://docs.aws.amazon.com/cli/latest/reference/ecr/get-login-password.html

`aws ecr get-login-password` コマンドはログイン用の**パスワードのみ**が標準出力されます。

```shell-session
$ aws ecr get-login-password
<password>
```
docker login コマンドは `--password-stdin` というオプションが利用可能で
パスワードを標準入力から読み込ませることができます。
以下のように `aws ecr get-login-password` の結果を渡すことで、
履歴やログにパスワードを残さず済みます。

```shell-session
$ aws ecr get-login-password | docker login --username AWS --password-stdin https://<aws_account_id>.dkr.ecr.<region>.amazonaws.com
Login Succeeded
```
**Provide a password using STDIN**
https://docs.docker.com/engine/reference/commandline/login/#provide-a-password-using-stdin

## 利用可能なAWS CLIのバージョン
get-login-password コマンドは AWS CLI Version 1.17.10 以降、
または2020/2/10にGAとなった Version 2で利用することができます。

注意点としては AWS CLI Version 2では get-loginコマンドは**削除されている**ため利用できません。
Version 1.17.10 以降では 下位互換性のため、引き続き利用可能です。

>  The older aws ecr get-login command is still available in the AWS CLI version 1 for backward compatibility.

**Breaking Changes – Migrating from AWS CLI version 1 to version 2**
AWS CLI version 2 replaces ecr get-login with ecr get-login-password
https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration.html#cliv2-migration-ecr-get-login

以上です。
参考になれば幸いです。
Fastlaneのframeitでunexpected token at {....っていうエラーが出る件

Fastlaneを最新版にしてframeitでApp Store用のスクショを作ろうとしたら変なエラーがでた。

<img width="685" alt="スクリーンショット 2020-02-11 18.17.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60457/9e42e31f-8cb8-2ffe-d3be-8d1dce973f79.png">
なんか文字列がjsonにパースできないらしい。吐き出されてた文字列をコピーしてJson validatorにかけると以下の場所がおかしいことがわかる。
<img width="235" alt="スクリーンショット 2020-02-11 18.21.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60457/46aae9bf-44c8-b934-dfeb-b146062b9441.png">
Fastlaneのほうではちょうど１週間前にissueが作られていた。

[frameit is broken for me in release 2.141.0 #15972](https://github.com/fastlane/fastlane/issues/15972)

# 回避方法(2/11時点)

fastlaneを2.138.0に戻す。
(順番に各バージョンに戻して動作確認したところ2.139.0からこのエラーが起きる。)

Gemfileを以下の通り修正

```
source "https://rubygems.org"

gem "fastlane", "2.138.0" # version指定を追加
```
で、以下のコマンドで指定したバージョンにfastlaneを巻き戻す。

```
sudo bundle install
```
したらエラーが出なくなった。
Swiftで高階関数(Higher Order Function)を活用してスッキリ＆カッコ良いコードを書く

# はじめに
Swiftでプログラミングをしていても、UI周り部分の実装がメインとなり、GenericsやHigher Order Functionをあまり活用できていないように思います。
他の言語扱う中でも、必ずと言っていいほど、GenericsやHigher Order Functionは出てきますし、どうせなら、カッコ良いコード書きたいので、
Swift言語を使って復習していきます。

# 名前リストを挨拶リストに変換

```swift
let nameList: [String] = ["Yamada", "Tanaka", "Nakano"]
```

名前リストから、 `敬称`と`挨拶`をつけたリストを作り出すには、 `map` を使ってシンプルに書くと、

```swift
let morningMrList = nameList.map { "Mr. \($0) Good morning!" }
```

のようになります。`map` を使っているので、十分スッキリ書けていると思います。

ただ、敬称を `Ms.` に変更したい、 挨拶を、`Good evening!` に変更したい場合に

```swift
let morningMsList = nameList.map { "Ms. \($0) Good morning!" }
let eveningMrList = nameList.map { "Mr. \($0) Good evening!" }
```

ベタ書きため再利用性がない事に気づきます。

この問題を解決するために、最初に考えられるのは、map処理の中で `敬称` と `挨拶` を分離する。

```swift

let morningMrList2 = nameList.map { "Mr. \($0)" }.map {"\($0) Good morning!"}
```

処理が別れたので再利用性が高くなりそうです。

次に、名前リスト毎に文字列加工処理(敬称＋挨拶)をmapでベタ書きするのは再利用できないので、
名前リストと文字列加工処理をパラメータとして受け取る関数を用意します。

関数をパラメータとして受け取る高階関数となります。

```swift
func _map<String>(_ list: [String], f: (String) -> String) -> [String] {
    return list.map { f($0) }
}

// 名前リストを挨拶リストに変換
func _mrMorningF (_ list: [String]) -> [String] {
    return _map(list) { "Mr. \($0) Good morning!" }
}
let morningMrList3 = _mrMorningF(nameList)
```

ただ、このコードはベタ書きであり、スッキリしません。


以下では戻り値が関数の高階関数を使って改善していきます。


## 戻り値が関数の高階関数を使って改善

* 敬称、挨拶の文字列追加を分離
* 文字列加工の関数化

この2つが実現出来れば、名前リストから挨拶リストを生成するのに、毎回ベタ書きしなくてよくなります。

上のmapでは、戻りの型が配列でしたが、戻り値を関数に書き換えます。戻り値の型に束縛されないのでGenericsで書くことができます。

```swift
func map<A, B>(_ f: @escaping (A) -> B) -> ([A]) -> [B] {
    return { $0.map(f) }
}
```

戻り値は、引数に任意の型の配列(A)を受け取り、任意の型の配列(B)を返す関数となります。
Genericsを使っているので、汎用的な関数を用意出来たと思います。

アロー( `->` ) が連続すると、とたんに可読性が落ちますが、代わり玄人感はすごく増しますね。

このmapを使うと以下のような、敬称文字列追加、挨拶文字列追加を定義できます。

```swift
// 名前に、敬称のMrを追加する関数
let mrF: ([String]) -> [String] = map{ "Mr. \($0)" }

// 名前に、挨拶を追加する関数
let morningF: ([String]) -> [String] = map{ "\($0) Good morning!" }
```

nameList, nameList2のように別のリストでも、引数を変えるだけで済みます。

```swift
let morningMrList4 = morningF(mrF(nameList))
let morningMrList5 = morningF(mrF(name2List))
```

他の挨拶の関数も同様に書けます。

```swift
let msF: ([String]) -> [String] = map{ "Ms. \($0)" }
let afternoonF: ([String]) -> [String] = map{ "\($0) Good afternoon!" }
let eveningF: ([String]) -> [String] = map{ "\($0) Good evening!" }
```

これらを組み合わせれば名前から挨拶リストを作り出せるので、再利用可能です。

## 関数ネストを改善したい

関数がネストしているので少し見にくい気がします。

```swift
morningF(mrF(nameList))
```

これを解決するには、関数を合成する関数を用意すれば良いでしょう。本格的な高階関数ですね。

2つの関数を引数を受け取り、これらの関数を合成して関数を返却しています。

```swift
func compose<A, B, C>(_ f: @escaping((A) -> B), _ g: @escaping((B) -> C)) -> (A) -> C {
    return { a in g(f(a)) }
}
```

型に縛られない関数なので、Genericsで書くことが出来ます。

これを使うと、

```swift
let msMorningF = compose(msF, morningF)
```

使う側も関数がネストしていないので、スッキリ読みやすいです！

```swift
let morningMsList2 = msMorningF(name2List)
```

# まとめ

毎回、同じ処理を書く場合は、高階関数（特に、戻り値を関数）にすることを検討すると再利用性が高いコードにすることが
出来るケースがあることが理解できました。

Swiftの高階関数の記事は、 `map` `flatMap` `reduce`などの使い方を説明に閉じた記事が多いですが、
自身で高階関数を用意して使うことが本当の活用な気がします。

そして、Generics +高階関数の組み合わせは非常に強力ですね。

この記事にあたり、[Point Free](https://www.pointfree.co/) で勉強させてもらいましたが、海外サイトは良質な記事が多いので、英語頑張りたいです。
VBSをVisualStuioで編集＆デバッグする方法


#vbsをVisualStudio上で編集する
VisualStudioを起動し、メイクファイルプロジェクトを選択、プロジェクト名はなんでも
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201580/34fe4333-5976-0dbb-1b29-bcc86fca09c1.png)

メイクファイルプロジェクトの設定はデフォルトのまま
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201580/9fa7de0d-13a4-9864-9648-bc632f608f48.png)

ソース、ヘッダー、リソースファイルの削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201580/065638e3-5f9c-6d19-7cc6-3a732c84d8c1.png)

エクスプローラーでフォルダを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201580/d4273fff-08d7-03f1-5865-067170d010df.png)

既存のVBScriptファイルをここに置くか、新規作成でvbsを作成
(ここでは、既存のvbs(ChangeRegistry.vbs)を配置しました)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201580/cd2fdfb8-99c5-ae2b-beef-35d80347cc46.png)

上記 vbs を、ソリューションエクスプローラーの赤枠で囲ったところへドラッグ＆ドロップ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201580/68280fe8-a31d-a397-b53a-ee9fff1d2c16.png)

ドラッグ＆ドロップ後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201580/f080bfba-f679-4bdb-9b8d-b2c16f5787f8.png)

これで、コードの修正が可能。

#デバッグできるように、プロジェクトとWScript.exeを関連付け
プロパティを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201580/b8196df2-19e8-ff2f-1df1-713569eca7bf.png)

全般 – 構成の種類 – ユーティリティ　を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201580/60d86fa7-f0d9-5e97-5c58-d35e6be1a33e.png)

構成プロパティ -> デバッグ
コマンド WScript.exe
コマンド引数 XXXX.vbs  //X
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201580/f15830cc-1226-914b-372c-84d1f7dc7de3.png)

デバッグ実行
(デバッグなしで開始でもいいかも？この辺よくわかってないです・・・)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201580/963216bf-31c3-57e5-6215-ef10dd4b796b.png)

デバッガ―選択が出た場合、2019を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201580/dd3a42dc-fc22-5473-86ca-93ae1cd0739c.png)

デバッグは、F5でブレークポイントまで進む F11でステップ実行。
終わらせたい場合、■を押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201580/0d7241e2-40cb-7abe-addc-93fdde9f4fca.png)