OmniAICreator/Qiita-1.07M huggingface dataset:
AWS アカウント取得後の設定内容 無料アカウントの場合

**ルートアカウントの保護**
--

AWS IAMベストプラクティス
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/best-practices.html

1. MFAの有効化
---
![image.png](https://qiita-image-store.s3.amazonaws.com/0/319276/e466b069-6b69-6300-e32e-ac82babf4ac2.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/319276/44e56c62-c119-da35-1cc2-d4004d576742.png)

Google Authenticator を用いてQRコードを読み取り。
コードを２つ入力すれば設定完了

2. 管理用IAMユーザの作成
-
![image.png](https://qiita-image-store.s3.amazonaws.com/0/319276/b45e4953-c45e-52d2-52f0-4ee2a4a07603.png)

**ユーザを追加**を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/319276/854c983b-9b92-f60a-0847-5550cd687229.png)

各種項目に入力
![image.png](https://qiita-image-store.s3.amazonaws.com/0/319276/fdfceda7-79e0-d439-fa6c-4bc850c344ba.png)

**AdministratorAccess**をアタッチ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/319276/21ee9d3e-38e9-d36a-3b62-25d17cd90066.png)

**Key/Value**を追記（任意）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/319276/f27506da-6d44-13e7-28a0-a84003def355.png)

作成完了

3. IAMパスワードポリシーの適用
-
IAMトップページ。IAMパスワードポリシーの適用をクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/319276/3034451b-436e-1a75-5279-088892352cef.png)

必要なポリシーをチェック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/319276/9fcda152-0a7f-a2ca-b711-5f41c6603df7.png)

オプション詳細はawsの公式で。
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_passwo
rds_account-policy.html

4. 請求書情報に対するIAMユーザのアクセス
-
* アカウント画面
https://console.aws.amazon.com/billing/home#/account

* **アクティブ化**をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/319276/4b088cea-5297-baf3-d29b-b688125c2bd5.png)

5. 請求書アラートを設定
-
![image.png](https://qiita-image-store.s3.amazonaws.com/0/319276/7fe3e877-39f0-7f0b-0daa-cce0d1d951b8.png)

* cloudwatchで設定　※バージニア州で設定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/319276/6ed85c31-e469-13c1-811d-268492804e64.png)


6. CloudTrailの設定
-
通常は証跡を保存するため設定するが、S３に保存すると料金が発生するためスキップ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/319276/7a39d95e-5fb9-5f56-0d09-da5df436f704.png)


7.コストエクスプローラの有効化
-
2019年時点では初期設定で有効になってました。

8. 通貨設定
-
分かりやすくするために、日本円を設定。
*アカウント設定
https://console.aws.amazon.com/billing/home#/account

![image.png](https://qiita-image-store.s3.amazonaws.com/0/319276/41f99ed3-8be0-6812-739d-81b634129a27.png)

まとめ
-
とりあえず特筆すべきものをあげました。まだまだ詳細ありますが、
その時はAWSの公式でご確認を。
ec-cubeの管理画面のディレクトリ名の変更

ec-cube3.0系のについてになります。

3.0系ですと
app/config/eccube/path.yml内にある

13行目
admin_route: 〇〇〇〇
user_data_route: user_data

admin_route: 〇〇〇〇
↓
admin_route: 任意のも
に変更しました。
Bladeの構文をざっくりと

Laravel標準のテンプレートエンジンであるbladeについてざっくりと構文紹介

# 値の表示

## HTMLエスケープを行う

```
{{ $value }}
```

## HTMLエスケープを行わない

```
{!! $value !!}
```
どちらも波括弧内が評価されてから表示される

# 制御文

## if

```
@if(condition1)
...
@elseif(condition2)

@else

@endif
```

## unless
`@if`と逆の働きをする

```
@unless(condition)
...
@else

@endunless
```

## isset
$variableが定義されていた場合にtrueとなる.

```
@isset($variable)
...
@else

@endisset
```

## empty
$variableが空文字列, null, 0などの時にtrueとなる

```
@empty($variable)
...
@else

@endempty
```

注）issetとemptyは内部的にPHPのisset, emptyが使われる。両者の使い方は非常に癖があるので（特にempty)、[PHP isset, empty, is_null の違い早見表](https://qiita.com/shinichi-takii/items/00aed26f96cf6bb3fe62)が参考になる。

## for

```
@for(initialize; condition; increment)
...
@endfor
```

## foreach

```
@foreach($array as $variable)
...
@endforeach
```

## foreach-else
$arrayから取り出す値が無くなったら`@empty`の処理を実行して終了する。

```
@forelse($array as $variable)
...
@empty
...
@endforelse
```


## while

```
@while(condition)
...
@endwhile
```

## break, continue

```
@break
@continue
```

## php
PHPのコードを直接書ける。やたらめったら使うものではない。

```
@php
...
@endphp
```



# $loopについて
`@foreach`などの繰り返しディレクティブの中では$loopという特殊変数が利用できる。このオブジェクトはループに関する情報を保持している。

|プロパティ名|   意味   |
|:--------:|:-------:|
|index|ループの現在のインデックス（0スタート）
|iteration|現在の繰り返し回数（1スタート）
|remaining|残りループ回数
|first|最初の繰り返しならtrue
|last|最後の繰り返しならtrue
|depth|ループのネスト数
|parent|ネストしている場合、上位にあるループの$loop

以下サンプル

```html
@foreach($data as $d)
    @if($loop->first)
        <h3>list</h3>
    @endif
    no.{{$loop->iteration}}: {{$d}}<br>
@endforeach
```
vue.js router を 使い 動的に title や meta タグを変更

追記、

まとめ直した。

https://qiita.com/ma7ma7pipipi/items/42761f7592a1359e9952

ちゃんと google chrome の console でタイトルタグを見ると変更されているので安心してね。

```

    //     //現在のURLを置き換える

        //現在の url に ユーザー名などを含めたい場合は、 replace 時に metaTitleとして渡しておく。

    //     this.$router.replace({
    //     path: location.pathname + "?page=" + e.data.current_page + "&y=" + window.scrollY + "&metaTitle=" + this.title,
    // });



createPageTitle : function(to){

            if(to.query.metaTitle){

                // タイトルを設定
                this.headTitle = to.query.metaTitle;
                var setTitle = to.meta.title + ' | ' + this.title;
                document.title = setTitle;


            } else {

                // タイトルを設定
                if(to.meta.title){

                    this.headTitle = to.meta.title;

                    var setTitle = to.meta.title + ' | ' + this.title;
                    document.title = setTitle;
                } else {
                    this.headTitle = '';
                    document.title = this.title;
                }


            }


            // メタタグdescription設定
            if(to.meta.desc){
                document.querySelector("meta[name='description']").setAttribute('content', to.meta.desc)
            } else {
                document.querySelector("meta[name='description']").setAttribute('content', this.desc)
            }
        },





```






以下の方法だと router.replace した場合にタイトルがうごかない。



https://qiita.com/livejam_db/items/a9d8a8cbead668bad18e
を試してみたが、ajaxを使うとうまく動かなかった。

基本的にページタイトルは固定。
ユーザー名位しかajaxで変更しないので、
routes にまとめておいて、axios使った場合のみ動的に変更すりゃええがね。

コピペじゃ動かないので参考にしてちょ。





先にmetaタグ用意しとくんだがね

```vue.blade.php

<title>サンプルApp</title>
<meta name="description" content="説明">

```

app.jsは以下のようにするんだがね


```app.js

//title と desc を設定しておく
var routes = [
    { path: '/', component: Top },
    { path: '/search', component: Search , meta: { title: 'ユーザー検索', desc : 'ユーザーを検索します。画面です'} },
    { path: '/profile', component: Profile , meta: { requiresAuth: true }},
];



//メイン
app = new Vue({
el: '#app',

data: {

    //初期 title と 初期 desc
    title: 'へるぴーはママの味',
    desc:'laravel5.7 と vue.js 2.x で作ったサンプルサイトです。',


//メソッド
methods: {

    createPageTitle : function(to){

        // タイトルを設定
        if(to.meta.title){
            var setTitle = to.meta.title + ' | ' + this.title;
            document.title = setTitle;
        } else {
            document.title = this.title;
        }

        // メタタグdescription設定
        if(to.meta.desc){
            document.querySelector("meta[name='description']").setAttribute('content', to.meta.desc)
        } else {
            document.querySelector("meta[name='description']").setAttribute('content', this.desc)
        }
},

watch: {
    //ページ移動するたびに　タイトルを整形していく
    '$route' (to, from) {
        this.createPageTitle(to);
},

```

AXIOSで 動的に変更するには。

```hoge.vue

axios.post('/user/view/', dataform).then(e => {
    this.data = e.data;
    document.title = this.data.name + " さんのプロフィール | " + this.$root.title;//ユーザーネーム さんのプロフィール | へるぴーはママの味

    }).catch((error) => {
        // console.log("エラー");
    });

```
Suicaの利用履歴をZaimに一括登録する方法

日頃、コンビニでの買い物や、定期外などでは利便性の面からAplle Watchに登録しているSuicaを利用しています。またZaimに毎日の出費などを記録して、お金を管理しています。

Zaimのアプリにはレシートの画像などから記入ができる便利機能などがあるのですが、その中にモバイルSuicaと連携して、最新の100件を自動的に入力してくれるとても便利な機能があります。

それを知らずに変に車輪の再開発 (先日知った言葉をこれ見よがしに使わせてください) をしようとしていまっていたので危ないところでした。

#　ZaimにSuicaの利用履歴を登録する方法

## Zaimにログインする
まずはじめにZaimに[ログインする](https://auth.zaim.net/)
ログイン後は「設定」から「金融機関と連携」を選択する

![Zaim___800_万_DL_の無料オンライン家計簿.png](https://qiita-image-store.s3.amazonaws.com/0/234233/6a6a18be-081f-d462-18d2-b6e94a9faefc.png)


「金融機関との連携を追加」という項目があるので、「電子マネー」から「モバイルSuica」などを選択する

![Zaim___金融機関.png](https://qiita-image-store.s3.amazonaws.com/0/234233/7d52996a-fd52-0cdc-5718-20ab56eba8ea.png)


「連携させたい金融機関を選んでください」という読んで字のごとく連携させたい項目を選択します。
今回はモバイルSuicaを連携させたいので、選択します。
![Zaim___800_万_DL_の無料オンライン家計簿.png](https://qiita-image-store.s3.amazonaws.com/0/234233/d66b9d48-b26e-a37c-edbc-42d46cbdffff.png)

モバイルSuicaを登録した際の「メールアドレス」や「パスワード」またいつからのデータを取得した以下の「データ取得開始日」を選択します。
![Zaim___800_万_DL_の無料オンライン家計簿.png](https://qiita-image-store.s3.amazonaws.com/0/234233/dfeadda1-7b63-5404-1ccc-27c618a67e5c.png)


すると「金融機関」という項目の場所で「登録済みの金融機関」の中に「モバイルSuica」が出てきて「接続状況」が処理中となると思います。１分前後で接続済みとなるので、その後Zaimの記録を確認すると、データが反映されたのが確認することができるかと思います。
ElectronでのjsGridの使いはじめ

# 参考リンク
  * Electron [https://electronjs.org/](https://electronjs.org/)
  * Electron document [Writing Your First Electron App](https://electronjs.org/docs/tutorial/first-app)
  * jsGrid [http://js-grid.com](http://js-grid.com)
  * jsGrid [Getting Started - How to start using jsGrid](http://js-grid.com/getting-started/)

# Electronで空っぽのウィンドウを作成
これは上記リンク（Writing Your First Electron App）で簡単にできます。
1. ディレクトリ作成
2. npm init
3. package.jsonのscriptにstartでelectronを追加
4. index.htmlを（とりあえずは）適当に書く
5. "Writing Your First Electron App"内にあるようにJSに記述
6. npm startで起動

# jsGridの埋め込み
これも上記リンク（Getting Started）の通りに進めます。
ダウンロードの場合、css2本とjs1本をindex.htmlに埋め込みます。
とりあえずはサンプルコードをまるっとコピペします。

これでindex.htmlをブラウザで表示するとグリッドを確認できます。
一方、Electronの方はそのままでは表示されません。

# ElectronでjQueryを有効にする方法

jsGridのためにjQueryを読み込んでいる直後に以下を追加します。

```html
<script>window.$ = window.jQuery = require('./jquery-3.0.0.min.js');</script>
```

jQueryのバージョンは適宜変えて。以上で表示されるはず、です。
atcoder ABC108

Cは数学的な問題であり、解法が浮かばなかった。Dはやっていない
https://atcoder.jp/contests/abc108

#C問題
#方針
a+b=Kの倍数
c+b=Kの倍数
a+c=Kの倍数
より、
2*a= Kの倍数
2*b= Kの倍数
2*c= Kの倍数
が導かれる、よって、Kが奇数の時、a,b,c,もKの倍数である必要があるため、1からNについてKの倍数をカウントすれば良い。Kが偶数の時、a,b,cはk/2の倍数である必要があるため、1からNについてK/2の倍数をカウントすれば良い。
AWS上のCentOS7にWindows10からRDP接続 


参考サイトはこちら => https://qiita.com/SkyLaptor/items/56c9b5f5784f19cac225
95%このサイトの通りにしました。このサイトと差異のあるところは(※1)をつけてます。

## 環境 (※1)
サーバー     : CentOS7 on AWS ( AMI = ami-8e8847f1)
クライアント : Windows10 Home

# サーバー設定
### 1) パッケージのアップデート (※1)
```
# yum update
```
アップデートせずに2)を実行するとパッケージのコンフリクトエラーが発生しました。

### 2) GUI インストール
```
# yum groups install "GNOME Desktop"
```

### 3) XRDP インストール
```
# yum install epel-release
# yum install xrdp tigervnc-server
# rpm -qa | grep xrdp
# rpm -qa | grep tigervnc-server
# cp /etc/xrdp/xrdp.ini /etc/xrdp/xrdp.ini.original
# vi /etc/xrdp/xrdp.ini

```
### 4) XRDP設定

```/etc/xrdp/crdp.ini
max_bpp=32
# 上記の箇所を修正
max_bpp=24
```

### 5) XRDPの通信を許可(ファイアフォール設定)
```
# firewall-cmd --permanent --zone=public --add-port=3389/tcp
# firewall-cmd --reload
```
### 6) XRDPの起動と起動設定
```
# systemctl start xrdp
# systemctl enable xrdp
```
### 7) セキュリティグループの設定 (※1)
EC2の管理画面からセキュリティグループの設定をします。
以下のようにRDPを追加します。
![RDPセキュリティグループ設定.jpg](https://qiita-image-store.s3.amazonaws.com/0/139714/5bb4b88c-c211-1380-59d3-5e87d06e9196.jpeg)


以上でサーバーの設定は終了です。
あとはEC2のインスタンス管理画面からパブリックIPを確認してRDP接続すればOKです。
ストロングパラメーターとは？[備忘録]

<h2>ストロングパラメーターとは？</h2>
ストロングパラメーターとは何でしょうか？
「ストロング」と言う英単語から強い何か？？ってことが予想できますが、ストロングパラメーターとは
簡単に**「web上で流れてきた不正なデータを受け取らない」**ように設定する機能のことです。

データーベースの更新の際、不要な情報を避けて安全に更新してくれます。

<h2>コントローラーアクションに実装</h2>

ストロングパラメーターが使用される部分は主にユーザー新規登録やユーザーログイン時などです。

実装場所はコントローラーアクションになります。

```ruby:users_controller.rb
private
  def user_params
    params.require(:user).permit(:name, :email)
  end
```

requireとpermitとはそれぞれ「必要とする」と「許可する」と言う意味です。
上記の場合、userはnameとemail情報のみ許可するけど、上記以外の例えばpassword情報は
許可せずブロックするよって意味です。

OK:userはnameとemail情報は許可します。
NG:userは上記以外の情報は許可しません。(passwordなど)

<h2>実装しないとエラーになる</h2>
ストロングパラメーターはRails4から追加されました。それ以前はMassAssignmentを使用してましたが
脆弱性があったためストロングパラメーターになったと言うことです。

もし、ストロングパラメーターが実装していなければ、不正な値でも何でもかんでも受け入れてしまい
管理者情報が乗っ取られてしまう危険があるのです。

ストロングパラメーターを実装し、危険を回避しましょう！

今回はここまでにします。
Raspberry Pi 3 Model B でI2Cデバイス(BME680)を使う(C言語)

この記事は、[Raspberry Pi 3 Model B でI2Cデバイス(BME680)を使う(コマンドライン)](https://qiita.com/nyoki/items/a678642c9a94c833129e)の続きです。

# 前提条件(環境)と準備したもの
- Raspberry Pi 3 Model B
- Raspbien 9.6(Strech)
- 上記にSSH接続する端末
- CJMCU-680(BME680を搭載したブレークアウトボード)
- BME680 sensor API(公式ドライバ) Version 3.5.9

# 自分がやりたいこと
- ラズパイとCJMCU-680をI2C接続し、C言語を利用して必要なデータを取得する

# この記事で扱わないこと
- I2Cの説明
- SPI接続全般
- C言語の説明

# 利用方法
https://github.com/nyoki/bme680_i2c
こちらのREADMEを参照

# 補足など
公式ドライバは、I2Cで通信を行うための実装を含んでおらず、個別のプラットフォームに対応するようにドライバ利用者が実装する必要がある。
(マイコンとかラズパイとかその他のハードウェアに対応するものを準備していたらキリがないでしょうし・・・)
よって、このソースコードは Raspberry Pi 3 Model B + Raspbien 9.6(Strech)以外での動作を保証していません。
Go言語に触ったことがないので、とりあえず触ってみた

# Go言語って何？
・2009年にGoogleによって開発されたオープンソースプロジェクトのプログラミング言語
・Go言語のマスコット「[Gopher](https://blog.golang.org/gopher)」が、とてもかわいい
・並行処理が得意
・静的型付け言語
・高速なコンパイル言語
・[型推論](https://qiita.com/kmizu/items/2ace816340e8553bd278)

# Go言語を採用している有名サービス
・Go
・Docker
・Kubernetes
※一部抜粋です。他にもいろいろあるそうですが、私が有名と思ったものをピックアップしました

# Go言語のメリット・デメリット
### メリット
・処理が高速
・複雑なシステムの構築に最適
・並行処理・並列処理が可能

### デメリット
・Genericsがない
・継承をサポートしない
・例外処理がない

　[参考にさせていただきました！](https://type.jp/et/feature/9445)

# Go言語を動かしてみる
## ダウンロード
[Go言語公式ダウンロードサイト](https://golang.org/dl/)からダウンロードすれば、
Go言語を動かすことができます

ダウンロードしたり環境構築がめんどうな方であれば、Webブラウザ上で手軽に触ることもできます。
「[The Go Playground](https://golang.org/#)」

brewでインストールすることもできます

```terminal
brew install go --cross-compile-common
```
※[Homebrewインストールしてない方はこちら](https://qiita.com/_daisuke/items/d3b2477d15ed2611a058)
※勝手ながら掲載させていただきました

## Hello Go!
ダウンロードが完了したら、Go言語を動かすために必要なファイルをまとめるために、ディレクトリを作成します

```terminal
cd
mkdir golang
cd golang
```

Hello Go!を表示するためのファイルを作成

```terminal
touch hello-world.go
```

「Hello Go!」と表示するコードを書く

```hello-world.go
package main

import (
    "fmt"
)

func main() {
    fmt.Print("Hello Go!\n")
}
```

実行する

```terminal
go run hello-world.go
```

「Hello Go!」と表示されたら完了です！

コンパイル言語なので、コンパイルする！
```go build```でコンパイルができる。

```terminal
go build hello-world.go
```

ビルドファイルを実行する！

```
./hello-world
```

# まとめ
並列処理・並行処理を自分でコーディングしてみないと実際わからない部分が多いので、チャットアプリ作成でGo言語使ってみたいと思います。

※参考にさせていただいた記事があります。
※参考リンクを削除してほしい場合は言っていただけたらすぐ対応致しますので、よろしくお願いします！
ファイル名として無効な文字を削除（Python）

Webスクレイピングでデータ取得していたときに、エラーが発生したのでメモ
Windowsではファイル名として無効文字`\/:*?"<>|`があるのでそれを削除する
# re.sub(pattern, repl, string)
文字列置換には`replace()`があるが、正規表現で処理できないので`re.sub()`を用いる
使い方は、`re.sub('置換対象文字','置換文字','入力文字列')`

```python:re.sub
import re
string='\gbahsd:njs?<>|"asd/as*'

print(re.sub(r'[\\/:*?"<>|]+','',string)
```
```python:output
'gbahsdnjsasdas'
```
以上
【転職して痛感…】配列とオブジェクトの大切さ_オブジェクト編

## どうしてこの記事を書こうと思ったのか
**フロントとサーバーサイドを任されるも、いかにデータの受け渡しの流れを理解し、データを正確に表示させるか**

に悩まされる1週間だったので復習がてら記事にしていました。

新年1月からWebエンジニアに転職をし、約1週間が経ちました。
任された仕事で使う言語は「Vue.js」と「Node.js」。
どちらもJavaScriptではありますが、ちょっとした癖をもった言語だと思います。
上記の通り、**「いかにデータの受け渡しの流れを理解し、データを正確に表示させるか」**という点で詰まることが多く、独学では壁に遭遇しなかっただけで、ちゃんと理解しないとですね。

ちなみに[配列編](https://qiita.com/watsuyo_2/items/621e1fa4b02d4fcaeed4)もありますのでご覧になってください。

# オブジェクトとは?
簡単に言うと「**名前と値**」の集合です。

## 配列とオブジェクトの違い
* 配列: keyと値(Value)を結びつけるようなデータ構造
* オブジェクト(連想配列): 文字列[key]と値(Value)を結びつけるデータ構造

## オブジェクトの作成方法
オブジェクトには配列同様、「newする方法」と「リテラルで作る方法」の２パターン存在します。

## 例1:newする方法

```js
// 新しいオブジェクトを作成
const obj = new Object();

// オブジェクトに値を格納
// obj[key] = value;
obj['Google'] = 'Pixel';
obj['Samsung'] = 'GALAXY';
obj['Apple'] = 'iPhone';

console.log(obj);

// {"Google":"Pixel","Samsung":"GALAXY","Apple":"iPhone"}
```
[例1デモ](https://jsfiddle.net/watsuyo_2/ebspw9La/15/)
上記の例で配列との違いを挙げたように、[]内のkeyが文字列になっています。

## 例2:リテラルで作る方法

```js
// リテラルでオブジェクト作成
const obj = {
	Google: 'Pixel', 
  Samsung: 'GALAXY', 
  Apple: 'iPhone'
 };

console.log(obj);

// {"Google":"Pixel","Samsung":"GALAXY","Apple":"iPhone"}
```
[例2デモ](https://jsfiddle.net/watsuyo_2/9pqLxw6v/13/)

# プロパティとメソッド
## 例3:ピリオド記法によるプロパティへのアクセス

```js
const obj = []; // 例1のnew Object()と同様

obj.x = 9;
obj.y = 8;

console.log(obj.x);
console.log(obj.y);
/* 
9
8
*/
```
[例3デモ](https://jsfiddle.net/watsuyo_2/fdr35z16/3/)

## 例4:メソッドを使用したプロパティへのアクセス

```js
const obj = {
	x: 9,
  y: 8,
  
  print: function () {
  	console.log(this.x);
    console.log(this.y);
    console.log(obj);
  }
};

obj.print();

/* 
9
8 
{"x":9,"y":8}
*/
```
[例4デモ](https://jsfiddle.net/watsuyo_2/Lxs3f1vr/20/)


例4で出てきた「**this.**」はメソッド内から、プロパティ内のデータにアクセスするために使用します。
JavaScriptのthisに関しては[【ES6 JavaScript】アロー関数とthisについて初心者エンジニアがまとめてみた](https://qiita.com/watsuyo_2/items/64b43ff5536706e82196)で記事にしてみましたので、ご確認ください。
laravel request 使わず validate


これであかんやんが出ます。

```

use Validator;

        $data = [
            'title' => 'タイトル',
            'body' => ''
        ];

        $valid = Validator::make($data,[
            'title' => 'required|max:255',
            'body' => 'required|min:11',
        ]);



        $nikki = new Nikki;
        $nikki->title = $data['title'];
        $nikki->body = $data['body'];

        if ($valid->fails()) {
            pr("あかんやん");
            die;
        } else {
            $res = $nikki->save();
        }


```
IntelliJ IDEAに等幅フォントを設定(Ricty)

## 概要
文字幅が同じでないとずれてズレて見た目がよくないので、等幅フォントを設定する。

## Rictyインストール
既にインストールされているフォントでも等幅フォントはありそうですが、googleで検索すると「`プログラミング用フォント Ricty`」なるものがったので設定してみる。

```bash:ターミナル
# Homebrewを使ってインストール
$ brew tap sanemat/font
$ brew install ricty
Updating Homebrew...

  ...

***************************************************
To install Ricty:
  $ cp -f /usr/local/opt/ricty/share/fonts/Ricty*.ttf ~/Library/Fonts/
  $ fc-cache -vf
***************************************************

# コメントに従ってfontをインストールする
$ cp -f /usr/local/opt/ricty/share/fonts/Ricty*.ttf ~/Library/Fonts/
$ fc-cache -vf
/usr/share/fonts: skipping, no such directory

   ...

fc-cache: succeeded
```

## IntelliJ IDEAのフォント設定
IntelliJ IDEAのデフォルトのフォント設定を開く。
※ `Preference... -> Editor -> Font`
![font.png](https://qiita-image-store.s3.amazonaws.com/0/142279/994e978d-f3a9-8497-4d62-020c5444cdcb.png)

比較のために、下記文字列を記入し、幅を比較してみる。

```
kakikukekosasisuseso
かきくけこさしすせそ
```

先程インストールしたフォント「`Ricty`」を指定する。
※ 「`Show only monospaced fonts`」を選択すると、等幅フォントだけが表示される。
![test.png](https://qiita-image-store.s3.amazonaws.com/0/142279/f508e5b4-b872-e9ce-e8c2-49c1d5affaaf.png)

以上

## 参考サイト
- [プログラミング用フォント Ricty](https://www.rs.tus.ac.jp/yyusa/ricty.html)
- [IntelliJ IDEAにフォントRictyを導入してプログラムやMarkdownの文字幅を揃える](https://dev.classmethod.jp/tool/intellij-idea-font-setting-with-ricty)
- [プログラミング用フォントRictyをMacにインストールする](https://qiita.com/segur/items/50ae2697212a7bdb7c7f)
Firewallと親和性の高いTFTPサーバを作った

## Firewallと親和性の高いTFTPサーバを作った

TFTP プロトコルは、最初のクライアント→サーバの「書込/読込要求」のみ 69/udp へ通信で、その後のデータのやり取りのパケットは、highポート間通信となっている。

![TFTP シーケンス](http://rocketeer.dip.jp/sanaki/free/free155c.png)

今回、[.NET4で作り直したtftpサーバ](http://rocketeer.dip.jp/sanaki/free/free155.htm)は、dataportをserverポートと同一にする事で、データ交換のパケットも 69/udpで通信する事もできる。

元々、VB6&VC6++(ATL-COM)で作っていたものを、.NET2 で作り直した事を忘れて .NET4 で作り直した。

## sTFTPnet のインストール

1. [.NET4で作り直したtftpサーバ](http://rocketeer.dip.jp/sanaki/free/free155.htm)からダウンロードする。
2. lzh形式を解凍する。
3. 実行する。
4. 以上

## sTFTPnet の使い方

通常は、CUI なプログラムで動作させることができる

CUI プログラムなので、コマンドプロンプトで引数無しに実行すれば usageがでる。

<pre>C:\&gt;sTFTPnet.exe
sTFTPnet.exe ver 3.0.0.0
                            created by active@window.goukaku.com

      Compiled ver.v4.0.30319
           Run ver.v4.0.30319(Win64)
sTFTPnet.exe [options]
  -Path &lt;&lt;publicpath&gt;&gt;
  -ServerHost &lt;&lt;serverbind&gt;&gt;
  -ServerPort &lt;&lt;serverport&gt;&gt;(Default=69/udp)
  -DataPort &lt;&lt;dataPort&gt;&gt; (0: efemeral(default)
  -Timeout &lt;&lt;sec&gt;&gt;(&gt;3)(Default=30)
  -Registry
  -Install
  -Uninstall
  -Service</pre>

必須のオプションは、「-path」で指定する公開ディレクトリ。

- ServerHost の既定値は「0.0.0.0」と「0::0」(IPv4/v6 の任意のアドレス)で待機するようになる
- ServerPort の既定値は「69」
- DataPort の既定値は「0」。エフェメラルポートなので、任意の highポート
- Timeout は通信での相手の返事待ち時間。既定値は30秒

## 通常の使い方

とりあえず「-path」だけ指定すれば、一般的な TFTPサーバ(データはhigh⇔highで通信する)のようにふるまう。

一応「ServerPort」は69以外にできるけど、一般的な TFTPクライアントが接続先として69以外を指定できないので、あまり意味はないかもしれない。

「Timeout」の既定値の「30秒」は少し長すぎるかもしれないので、そう思ったら指定してくれ

## Firewallと親和性を高める

「-dataport 69」とすると、データ通信も 69/udp で通信するようになるので、Firewall と親和性が高くなると思う。

つまり、high⇔low(69/udp) は開いている可能性はそれなりにあるが、high⇔high間は、ほとんど開いていないだろう。
このモードの場合は、Firewallでhigh⇔low(69/udp)だけ開ければ TFTP が使えるようになる。

![こんな感じで、high⇔69/udpが開いているだけで通信できるようになる](http://rocketeer.dip.jp/sanaki/free/free155b.png)

## Firewallと親和性を高める2

「dataport」を「0」と「ServerPort」以外にすると、データ通信は、そのポート固定となるので、
「serverPort」と「dataPort」の通信をFirewallで開けてあげれば、Firewall越しに通信できる。

### Firewallと親和性を高める2(イメージ)

この図で「highB」を「69」以外で固定するイメージ
![TFTP シーケンス](http://rocketeer.dip.jp/sanaki/free/free155c.png)

## レジストリ

「-Registry」で、設定をレジストリ「HKLM\Software\sTFTPnet」から読むようにできる。

または、NT サービスとして動作する場合は、レジストリからのみ設定は読まれる

## NTサービスとして動作させる

高い権限で以下を実行すると、NT サービスとして登録される。

`sTFTPnet.exe -install`

NTサービスとして動作する場合、設定はレジストリ「HKLM\Software\sTFTPnet」から読まれる。
同梱しているstftp.regを参考にレジストリに設定を記述すること

- 手動
- アカウントは「Network Service」

なので、以下は「Network Service」でアクセス出来るように権限変更が必要

- sTFTPnet.exe 本体
- 公開ディレクトリ
- 設定が保存されているレジストリ「HKLM\Software\sTFTPnet」以下

## NTサービスとして動作する際のログ

イベントログ(Application)に出力する

## GUI ラッパー

GUI ラッパー「sTFTPnetGUI.exe」も同梱した。

![sTFTPnetGUI.exeの画面](http://rocketeer.dip.jp/sanaki/free/free155d.png)

## 使用条件

当然ですけど、悪用厳禁ですよ。
Herokuへデプロイする方法[備忘録]

<h2>はじめに</h2>

オリジナルアプリを完成させた後は多くの人に自分のアプリを体験して貰いたいですよね。
そこで、これまでローカル環境でしか稼働していなかったアプリを本番環境で稼働させてみます！

僕はプログラミング初心者で、この作業に詰まりましたので備忘録のために記事にします。笑

アプリを本稼働させる作業には本来、自身でサーバーを構築し環境を作る必要があります。
しかし、初心者にはかなり難易度が高いので、本番稼働してくれるサービスを利用しましょう。

今回はHerokuと言うクラウドサービスを使いましょう！

<h2>Herokuを利用する</h2>

まずはアカウント登録をします。

https://jp.heroku.com/
(heroku公式サイト)

登録を終えたら、自身のパソコンでHerokuを遠隔操作できるようにheroku toolbaltをインストールします。


```ruby:tarminal
$brew install heroku/brew/heroku
```

続いて、Herokuへログインします。

```ruby:tarminal
$heroku login
```
ログインの際に、登録情報を問われるので書き込みます。

```ruby:tarminal
heroku: Enter your login credentials
Email: 登録したアドレス 
Password: 登録したパスワード
Logged in as example@example.com
```

<h2>デプロイする</h2>

環境が整ったところでデプロイの準備をしましょう！

①Gemfileに以下を追記します。

```ruby:Gemfile
group :production do
  gem 'pg'
end
```
②gemfileに以下に訂正します。

gem "mysql2"に「group: :development」を追記。

```ruby:Gemfile

gem "mysql2", group: :development
```
③本番環境のデーターベースをPostgreSQLに変更する。

```ruby:config/database.yml

production:
<<: *default
adapter: postgresql
encoding: unicode
pool: 5
```

<h2>Herokuへpushする</h2>

デプロイの準備が終われば、後はHerokuへpushするだけです。

①自分のherokuにアプリケーションを作成する。

```ruby:tarminal
$heroku create
```
＊gitでリポジトリを持っていない人は準備してください。

```ruby:tarminal
$git push heroku master
```
②データベースにテーブルを作成

```ruby:tarminal
$git push heroku master
```

```ruby:tarminal
$ heroku run rails db:migrate
```

③本番稼働しちゃいましょう！

```ruby:tarminal
$ heroku open
```

正常に反映されれば、これで完了です！
世界中のユーザーにアプリを利用してもらえます！

今回はここまでにします！
【python】0,None,numpy.nanの比較

# はじめに
地味に気をつけていないと判定で思わぬミスがあるので、pythonでの0,None,numpy.nanの扱いについてまとめました。


# 比較まとめ
|             |   0           |   None        |   numpy.nan     |
|:-----------:|:-------------:|:-------------:|:------------:|
|    type()   |  class <'int'> | class <'NoneType'> | class <'float'>|
|    bool()   |      False    |     False          | True          |
|    他の数値との演算 | 0で割るとZeroDivisionError    |    TypeError   |numpy.nan |
|    is None   |      False    |     True      | False         |
|  numpy.isnan() |    False    |     False     | True          |
|  自分との比較  |       True    |      True     | False         |


# それぞれの判定方法

## None
is Noneを使う。

```test.py
# NoneだったらFalse, それ以外ならTrueを返す
f = lambda x: True if x is not None else False

f(0)
# -> True
f(numpy.nan)
# -> True
f(None)
# -> False
```

## numpy.nan
math.isnan(), numpy.isnan()を使う、または自分自身と比較する。

```test.py
numpy.isnan(0)
# -> False
numpy.isnan(None)
# -> TypeError(Noneが数値でないため)
numpy.isnan(numpy.nan)
# -> True

# 自分自身との比較
0 == 0
# -> True
None == None
# -> True
numpy.nan == numpy.nan
# -> False
```

## 0,None,np.nanを判定する

```test.py
def judge(data):
    if data is None:
        print('None')
    elif isinstance(data, int):
        print('0 or other number')
    else:
        # 非数
        print('Not A Number')
```

# そもそもNone, numpy.nanって何？

## None
> 型 NoneType の唯一の値です。None は、関数にデフォルト引数が渡されなかったときなどに、値の非存在を表すのに頻繁に用いられます。
[python公式Doc](https://docs.python.jp/3/library/constants.html)

存在しないことを示すための定数。
存在しないからNoneに対する演算はError。

## numpy.nan
> IEEE 754 floating point representation of Not a Number (NaN).
[scipy公式ドキュメント](https://docs.scipy.org/doc/numpy-1.15.1/reference/constants.html?highlight=nan#numpy.nan)

数ではない浮動小数点を表す数(非数)。
自分自身との比較でFalseを返すのは非数としての特性。

# まとめ
地味に判定で引っかかることがあるので、まとめました。
もっとスマートに判定する方法がありそうな気がします。
何かありましたらコメントをお願いします。
php-master-changes 2019-01-13

今日は AppVeyor 用の PHP SDK のバージョンを更新があった！

# 2019-01-13
## weltling: Update SDK version for AppVeyor
- https://github.com/php/php-src/commit/8f66ca8189fb603d69f6ff486341c4afa7ac93c1
- [7.2~]
- AppVeyor 用の PHP SDK のバージョンを更新
vue.js で json localstorage を使う

# ローカルストレージを使おうぜ

**SessionStorage**へ持っている値は、ウィンドウを閉じるまで有効となります。また別タブや別ウィンドウ間での共有はしていません。

**LocalStorage**へ持っている値は、ウィンドウを閉じたあとでも有効となっています。Cookieのように有効期限はありません。別タブや別ウィンドウ間での共有はできます。(Cookieに似ている動きです。)

ということなので、 localStorage 使いましょう。


https://jp.vuejs.org/v2/cookbook/client-side-storage.html

```

<div id="app">
    <h2>Cats</h2>
    <div v-for="(cat, key) in cats">
        <p>
            <span class="cat">@{{ cat }}</span>
            <button @click="removeCat(key)">Remove</button>
        </p>
    </div>

    <p>
        <input v-model="newCat">
        <button @click="addCat">Add Cat</button>
    </p>

</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.18.0/axios.min.js"></script>

<script src="https://cdn.jsdelivr.net/npm/heyui"></script>

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/heyui/themes/index.css">
<script>


    const app = new Vue({
        el: '#app',
        data: {
            cats: [],
            newCat: null
        },
        mounted() {

            //json がぶっ壊れている可能性があるので、その場合は local storage を削除
            if (localStorage.getItem('cats')) {
                try {
                    this.cats = JSON.parse(localStorage.getItem('cats'));
                } catch(e) {
                    localStorage.removeItem('cats');
                }
            }
        },
        methods: {
            addCat() {
                // 入力内容が空だったら何もしない
                if (!this.newCat) {
                    return;
                }

                //猫を追加
                this.cats.push(this.newCat);

                //テキストフィールドを空に
                this.newCat = '';

                //猫を保存
                this.saveCats();
            },
            removeCat(key) {

                //指定されたキー猫を削除して保存しなおす
                this.cats.splice(key, 1);
                this.saveCats();
            },
            saveCats() {

                //this.cats の値を保存
                const parsed = JSON.stringify(this.cats);
                localStorage.setItem('cats', parsed);
            }
        }
    })




</script>




```

CDN読み込んであるので、コピペで動きます。
いろんなライブラリがあるけど、別に使うメリットなさそうなので
これでいきましょう。
node.js、express、ejsでHello Worldするコード

###記載の動機
node.jsでコーディングをするようになったが、必須で記述する部分などを覚えきれないので防備録として記述しました。

###前提
・node.jsがインストールされていること　[node.js 公式サイト](https://nodejs.org/ja/)
・Windows7 64bitのPCで実行


###コードとコマンド
```:cmd
app> npm init
app> npm install express ejs --save
```

```:directory
app
|-/views
   |-landing.ejs
|-/node_modules　**自動で生成される
|-app.js
|-package.json　**自動で生成される
|-package-lock.json　**自動で生成される
```

```javascript:app.js
var express = require("express");
var app = express();

//viewエンジンをejsであることを設定
app.set("view engine", "ejs");

app.get('/', function(req, res){
    const message = "Hello World!";
    res.render("landing", {message: message});
});

app.listen(3000, () => console.log('app listening on port 3000!'))
```

```html:landing.ejs
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>Page Title</title>
</head>
<body>
    <h1>Landing page</h1>
    <!-- コードから渡されたデータを表示-->
    <p><%= message %></p>
</body>
</html>
```

```:起動~cmd
app> node app.js
```
ブラウザで以下にアクセスする。
http://localhost:3000/
atcoder ABC109 

C,D共に基礎的な問題だった。
https://atcoder.jp/contests/abc109

#C問題
#方針
全ての都市と都市をDの倍数でいかなければならないため、初期場所Xとそれぞれの都市との距離を配列で記録し、その配列について、最大公約数を求めれば良い。最大公約数はユークリッド互除法で求める。

#ユークリッド互除法
実装は以下の通り

```java
static long gcd(long a,long b){
		if(b == 0){
			return a;
		}else{
			return gcd(b, a%b);
		}
}


```
#D問題
#方針
マスが持つコイン数をできるだけ偶数化したいということで、マスについて、左端から見ていき、マスの持つコイン数が奇数だあったら、右もしくは下にコインを送るという操作をすることで、偶数枚持つマス目が最大になる。
Twitter幸福論。Twitterは最強の人間社会の縮図だ。相手が欲しいものをプレゼントすることで、人間関係がうまくいくかもしれないな。例えば、ファーストビューにピンで留められたツイートにリプライしてみるのはどうかな。

Twitter幸福論。Twitterは最強の人間社会の縮図だ。相手が欲しいものをプレゼントすることで、人間関係がうまくいくかもしれないな。例えば、ファーストビューにピンで留められたツイートにリプライしてみるのはどうかな。

![image](https://user-images.githubusercontent.com/13635059/51094573-996b1600-17f1-11e9-9e2a-2a3f0ea89a35.png)

# エンジニア目線で見ると？

ファーストビューの話だと思ってください :)

# Twitterのピン機能に注目してみよう。他の人にリプライするなら、まずはピンのツイートからはいかが。

Twitter上級者の皆様方ならもう既に実践しているかもしれないけど、ピンで留められているツイートは、そのユーザが1番注目して欲しいツイートだ。

だからまず、どこにツイートするかと言ったら、品されているツイートがいいんじゃないかなと思う。これにはいくつかの良い点があると思う。

それは、たとえばひとつは、相手のユーザのTwitterアカウントが、とても賑わっている感じに見えること。

# あと根本的な話として、その人が1番注目して欲しいものに自分も注目してメッセージをすると言うこと。

そして、ピンされているツイートと言うのは、特に他の人もよく見る場所なので、1つのアカウントの中で、1番使われている場所だと考えてよい。

# これを自分自身がアピールして目立つ方法だと考えるか

それとも、相手目線で、1番注目してほしいものに注目すること、プレゼントだと考えるかは、人間を性善説で考えるか性悪説で考えるかの違いみたいに、単に解釈の問題かもしれない。

だけどこれがどちらの解釈であっても、結果的に良い働きをするのではないかと思っている

自分のニーズと相手のニーズが一致するのは、自分も他の人も1番幸福になる方法だ。

# これはTwitterだけではなく現実世界にも当てはめられると思う。

誕生日プレゼントを送るときであっても、相手が欲しいプレゼントを選ぶと言うようなこと。

相手が欲しいものをプレゼントして、相手が注目して欲しいことに注目してメッセージを送る。

# これがTwitterではやりやすいので、やはりTwitterは最強の人間社会の縮図というか、ブースト加速装置なのかもしれないな。

そう、Twitterこそが今、Facebookより他のSNSよりも、何より人間社会の現実を反映させているような気がして、Twitterと言うソーシャルサービスは12年ぐらいかけてここまで成長したんだなぁと、しみじみ感じている、最近ヘビーユーザーの僕です。

続きはウェブで。

---

https://twitter.com/yumainaura

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









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
firebaseのauth認証が通らない（not authorized to run this operation）

## 事象
ログイン認証を行うために以下のコードを埋め込んだが、`user`がどうしても`Null`になってしまう。

```javascript:app.js
  created: function() {
    firebase.auth().onAuthStateChanged(user => {
      console.log(user);
      if (user) {
        this.isLogin = true;
        this.userData = user;
      } else {
        this.isLogin = false;
        this.userData = null;
      }
    });
  },
```

safariのコンソールを見てみたら、以下エラーが出ていた。

`Error: This domain (****.firebaseapp.com) is not authorized to run this operation. Add it to the OAuth redirect domains list in the Firebase console -> Auth section -> Sign in method tab.`

## 原因
`index.html > config` が、別のプロジェクトのものであった。
firebaseのプロジェクトの何度か作り直していたため、前のプロジェクトのままだったよう。

```html:index.html
<script>
  // Initialize Firebase
  var config = {
    apiKey: "****",
    authDomain: "****.firebaseapp.com",
    databaseURL: "https://****.firebaseio.com",
    projectId: "****",
    storageBucket: "****.appspot.com",
    messagingSenderId: "****"
  };
  firebase.initializeApp(config);
</script>
```
正規表現の名前付きグループに同じ名前は使えない - Python

`(?P<name>)`のような*名前付きグループ*は同じグループ名が使えない


**「名前が一意な場合のみ、名前が付けれる」**

<br>

teratailで質問してみたところ、 *同じ名前は使えない* ということがわかった。

[Python - [正規表現]名前付きグループに同じ名前は使えないのでしょうか- Python｜teratail](https://teratail.com/questions/168673)

> 無理です。
> > グループ名は有効な Python 識別子でなければならず、グループ名は 1 個の正規表現内で一意でなければなりません。（[Python 3.6.5リファレンス](https://docs.python.jp/3/library/re.html#regular-expression-syntax)より）

なので、以下のように`hoge`というグループ名を2つ定義しようとするとエラーになる

```
>>> re.compile(r'(?:"(?P<hoge>\w+)"|(?P<hoge>\w+))')
...
re.error: redefinition of group name 'hoge' as group 2; was group 1 at position 23

redefinition of group name 'hoge' as group 2; was group 1 at position 23
```


## 参考文献

- [python regex: duplicate names in named groups - Stack Overflow](https://stackoverflow.com/questions/44460642/python-regex-duplicate-names-in-named-groups)
【Unity】Windows 10で起動時に応答なしになるとき

# Unity Editorを起動した瞬間応答なし

ある日、PCを起動してUnityを起動したところ、Unity Editorをロード中に固まってしまう事象が発生しました。
そのときにやった対処法をまとめてみます。

# 環境
- Windows 10
- Unity 2018.2.X

# やったこと
1. Unityのバージョンアップ（効果なし）
2. Windows 10の更新プログラム（効果なし）
3. PC自体をオフライン環境にしてUnityを起動（効果なし）
4. セキュリティソフトを停止させた状態で起動（効果なし）
5. Unity自体を一度アンインストールした後に再度インストールからの起動（効果なし）
6. 最近インストールしたソフトウェアを削除

# 1. Unityのバージョンアップ（効果なし）

最新バージョンを使用していないならば、公式サイトから最新版を取得しましょう。
[Unity Store](https://store.unity.com/ja)

# 2. Windows 10の更新プログラム（効果なし）

設定→更新とセキュリティ→Windows Update で更新プログラムのチェックを行いましょう。
もし、更新プログラムがあればインストールしましょう。
「最新の状態です」と表示されていればOKです。

![windows update.PNG](https://qiita-image-store.s3.amazonaws.com/0/233011/f75b5bbe-8b68-50e3-f702-b37364916c5b.png)

# 3. PC自体をオフライン環境にしてUnityを起動（効果なし）

Wi-FiをOFFにしてUnityを起動します。
LANケーブルを刺しているならば、抜いて起動しましょう。

# 4. セキュリティソフトを停止させた状態で起動（効果なし）

自分の場合は、セキュリティソフト = Windows Defenderでした。
下記のページが非常に分かりやすかったです。
[Windows 10 の Windows Defender を無効に、または削除する方法](https://support.kaspersky.co.jp/common/windows/13341#block0)

# 5. Unity自体を一度アンインストールした後に再度インストールからの起動（効果なし）

Unityをアンインストールして、Unity関連のキャッシュファイルを片っ端から削除しました。
そして、再度インストールしました。

# 6. 最近インストールしたソフトウェアを削除

アプリと機能で、最近インストールしたソフトウェアを上から削除していきました。
自分の場合は、「Duet Display」というiPadを外部ディスプレイとして使用できるソフトウェアでした。
これで起動するようになりました。

# 終わりに

この事象の解決で、貴重な休日が1日なくなりました。
治らなさすぎて、買ったPCが1ヶ月でぶっ壊れたのかと思いました。

# 参考文献
[WindowsでUnityEditorがうまく起動しない – ユニティ・テクノロジーズ・ジャパン合同会社](https://helpdesk.unity3d.co.jp/hc/ja/articles/219447788-Windows%E3%81%A7UnityEditor%E3%81%8C%E3%81%86%E3%81%BE%E3%81%8F%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%AA%E3%81%84)
[Grin]暗号通貨Grinのウォレットをインストールしてみた

GrinのGitHubに記載している方法でウォレットをインストールします。
https://github.com/mimblewimble/grin/blob/master/doc/build.md

■事前準備
ウォレットをコンパイルする前にこれらのソフトをインストールします。
　・rust 1.31+
　　sudo apt-get install rust でインストールするとコンパイルで躓いたので、↓のコマンドでインストールすることをお勧めします。
　(rustup- i.e. curl https://sh.rustup.rs -sSf | sh; source $HOME/.cargo/env) 
   ※ すでにインストールされている場合は、「rustup update」で更新してください。
　・clang
　・ncurses and libs (ncurses, ncursesw5)
　・zlib libs (zlib1g-dev or zlib-devel)
　・pkg-config
　・libssl-dev
　・linux-headers (reported needed on Alpine linux)
　・llvm

rust以外は↓のコマンドで一括でインストールが可能です。
apt install build-essential cmake git libgit2-dev clang libncurses5-dev libncursesw5-dev zlib1g-dev pkg-config libssl-dev llvm

■ウォレットをBuildします
まずはGitHubからファイルを落としてきます。
git clone https://github.com/mimblewimble/grin.git

grinファイルに移って、buildします
cd grin
cargo build --release
sparkで集計する際に、pathのparamをStringで扱う方法

下記を付ければOK

```.set("spark.sql.sources.partitionColumnTypeInference.enabled", "false")```

付けないと、型推測されて、String以外の形式になることがある。

実際あったのが、

```
s3://hogehoge/hoge1=1234-12-32_XXX/…
```
のようなpathをsparkで取り込んだ際に、hoge1の型がdate型になり、中身の値がnullになってしまった。つらい

特にエラーも吐かないので大変でした。
npmでwebpack環境構築やってみる #1

# 目的
webpackの理解を深めること。
業務でwebpackは導入されているが自身の理解が浅く、環境修正やそのレビューに積極的に参加できない情けない感じを拭い去りたい！

##　やってみる人のスキル感
- gulpでSassやejs、babelなどの環境構築経験有り
- 実業務でnpm webpack環境にて制作を行なっている

##　やってみる人の環境
- Mac 10.13.6
- nodeインストール済 (node 10.6.0 / npm 6.5.0)
- 作業ディレクトリ作成済

##　参照した記事
https://ics.media/entry/12140

## 1. webpackをインストール
`npm i -D webpack webpack-cli`

cliのインストールも必要とのこと。
とりあえずこれで環境は整ったらしい。

## 2. jsモジュールを作成
```javascript:src/js/index.js
import {hello} from './hello';
hello();
```

```javascript:src/js/hello.js
export function hello() {
  console.log('hellllllllooo!!');
}
```

## 3-1. ビルド
`npx webpack`
上記を実行するとdist配下に`main.js`が吐き出されるらしいがエラー発生。

**エラー内容**


```
Insufficient number of arguments or no entry found.
Alternatively, run 'webpack(-cli) --help' for usage info.

WARNING in configuration
The 'mode' option has not been set, webpack will fallback to 'production' for this value. Set 'mode' option to 'development' or 'production' to enable defaults for each environment.
You can also set it to 'none' to disable any default behavior. Learn more: https://webpack.js.org/concepts/mode/

ERROR in Entry module not found: Error: Can't resolve './src' in '/Users/xxNamexx/xx任意のディポジトリxx'
```

## 3-2検証
下記実行するもいずれも`command not found`が返ってきてしまう。
`webpack --help`
`webpack-cli --help`

試しに`package.json`の`scripts`に下記を追記して、
`"webpack": "webpack"`
下記をドーン！！
`npm run webpack`

**はい、先ほどと同様のエラーきました。**

ということで素直にエラーメッセージについてググるとindex.jsの置き場所がいけなかったらしい。

**参考記事**
[2018年度版、React、webpack、Babelのセットアップ手順をアップデートしてみた](https://qiita.com/gipcompany/items/63641286921cbe223c94)

ということで、`index.js`と`hello.js`をsrc直下に配置してどーん。
`npx webpack`
(`npx`は`npm`が対象ver以上であればなんもしなくても使えた)

### dist配下にmain.jsが生成されました。

とりあえず基本的な設定は以上。

src直下にindex.jsを置きたくないのでその辺の設定は次回記事で検証したいと思います。

##　感想
- 「あ、gulp環境なら構築できます」症候群から抜け出すため、引き続き頑張ります。
- 今回は本当に小さな一歩だけどやるのとやらないのでは全然違うなと感じました。
- 既存記事が多いテーマでも自身でアウトプットすると理解が深まるので、同様のスキル感の方にはおすすめです。
boto3でrun_job_flowを使ってEMR起動したときにコンソールに表示する方法

見つけるのに数時間かかったのと、
忘れそうなので備忘録

VisibleToAllUsersを設定に付ければいいよ

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/emr.html#EMR.Client.run_job_flow
Array.dropFirst() .dropLast()はArraysliceを返してくるから元の配列と型が合わなくなる話

掲題のとおりです。
最初こんなことをやりたかったんですが、できないです。

```swift
let str = "eabcd"
var Message = Array(str)

Message = Message.dropFirst()
```
こんなエラーになります。
辛いですね。

>  error: cannot assign value of type 'ArraySlice<Character>' to type '[Character]'

回避方法はいくつかあって、型変換してやってもいいですが、
配列の一文字目消したい！というだけの目的であれば、removeFirst()を使うといいみたいです。

```swift
let str = "eabcd"
var Message = Array(str) //["e","a","b","c","d"]

Message = Message.removeFirst() //["a","b","c","d"]
```

# Arraysliceとは
Arraysliceがイマイチよくわかってないですが、
Array型を一時的に切り取ったもの、というイメージのよう。
別にArray型でもよくね？と思うものの、
https://developer.apple.com/documentation/swift/arrayslice
> The ArraySlice type makes it fast and efficient for you to perform operations on sections of a larger array. Instead of copying over the elements of a slice to new storage, an ArraySlice instance presents a view onto the storage of a larger array. And because ArraySlice presents the same interface as Array, you can generally perform the same operations on a slice as you could on the original array.

>　（拙訳）Arrayslice型は大きい配列をもっと高速かつ効率的に扱いたいアナタにピッタリ！
新しいストレージに丸々元の配列の要素コピーすんじゃなくて、
ArraySliceインスタンスが大きい配列への参照（view）を提供してくれる。
さらにarraySliceは配列と同じインターフェースを持ってるので、基本的にはもとの配列と同じように扱うことができる。

Arraysliceだとストレージ食わない？のか？

# 2019/12/04追記
急にArrayslice理解しました。
Array型に対して、その一部への参照というか、ポインタというかを返してくれるのがArraysliceなんですね。

つまりdropFirst(n)/dropLast(n)は、先頭からn文字/末尾からn文字の参照を返してくれるメソッドであり、当初僕がやろうとしてたことは完全にメソッドの誤用でした。
AzureWebAppのProductionスロットとStagingスロットでAzureAD認証を共用する

#はじめに
AzureWebAppでstagingスロットを作成し、stagingにデプロイして動作確認してからproductionスロットとスワップするという運用を行うことがあると思います。その際、AzureAD認証を利用しているとproductionとstagingで応答URLが異なるためstagingの認証が通らないことがあります。その問題に対する対応策を記載します。

#本記事では説明しない内容
AzureWebAppでstagingスロットを作成して運用する方法
AzureAD認証の仕組み
OpenIdConnectの仕組み

#前提条件
開発言語:C#
フレームワーク：ASP.NET MVC
Webサーバー:IIS

#対応方法

### 1.応答URLの登録
AADアプリケーションの応答URLにproductionとstagingの両方の応答URLを登録します。（2つ登録する）

### 2.Startup.Authの設定

Startup.Auth内で応答URLをWeb.configから読んで設定するようにします。

```C#:Startup.Auth.cs

public partial class Startup
{
    private static string clientId = ConfigrationManager.AppSettings["ida:ClientId"];
    private static string aadInstance = ConfigrationManager.AppSettings["ida:AADInstance"];
    private static string tenantId = ConfigrationManager.AppSettings["ida:TenantId"];
    private static string postLogoutRedirectUri = ConfigrationManager.AppSettings["ida:PostLogoutRedirectUri"];
    private static string authority = aadInstance + tenantId;
    private static string redirectUri = ConfigrationManager.AppSettings["ida:RedirectUri"]; //これを追加

    public void ConfigureAuth(IAppBuilder app)
    {
        app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

        app.UseCookieAuthentication(new CookieAuthenticationOptions());

        app.UseOpenIdConnectAuthentication(
            new OpenIdConnectAuthenticationOptions
            {
                ClientId = clientId,
                Authority = authority,
                RedirectUri = redirectUri,  //オプションに追加することで応答URLを指定できる
                PostLogoutRedirectUri = postLogoutRedirectUri,
            });
    }
}

```

### 3.WebAppのアプリケーション設定
アプリケーション設定にproductionとstagingそれぞれに応答URLをスロット固有の設定として登録します。
WebAppのアプリケーション設定を開き、「ida:RedirectUri」パラメータで応答URLを設定します。
（ここに設定することでアプリのWeb.configの設定が上書きされる。）

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/240371/3858764a-62b8-dd74-00b3-e49447cbeb4f.png)

「スロットの設定」のチェックボックスにチェックを付けます。
このチェックがついているとスロット固有の設定として扱われ、スワップしたときに一緒にスワップされなくなります。
これがないと設定ごとスワップされてしまうので注意してください。


### 以上で設定完了です。
これで一つのAADアプリケーションでstagingとproductionどちらも認証できるようになり、stagingで動作確認してスワップするという運用ができるようになります。
そわそわさんのカフェインは？ Twitterランドの敷地内でアカウント自体に言及、引用リツイートができない件。かゆいところに手が届かないサービスは、裏側に隠された、エンジニアリング的な仕組みのせいかもしれないよ。

そわそわさんのカフェインは？ Twitterランドの敷地内でアカウント自体に言及、引用リツイートができない件。かゆいところに手が届かないサービスは、裏側に隠された、エンジニアリング的な仕組みのせいかもしれないよ。


# これじゃない、これは単にリプライを送るだけ
![image](https://user-images.githubusercontent.com/13635059/51093937-c9afb600-17eb-11e9-9461-835937bb91d9.png)

￼


# これじゃない、これは外部リソース扱い、Twitterランドから一歩足を踏み出してしまっている
![image](https://user-images.githubusercontent.com/13635059/51093939-cc121000-17eb-11e9-9b0f-76f041a3464b.png)

￼


# Twitterは皆さんご存知の通り、ツイートという単位を持っていて、そのツイートを、ユーザがたくさん持っていると言う扱いだ。

エンジニアの用語で言うとハズメニーと言う。

# Has many とは

「たくさん持つ」という意味。

メニーさんの羊？

![image](https://user-images.githubusercontent.com/13635059/51093946-d0d6c400-17eb-11e9-8f94-bd613665289b.png)


￼

# ユーザがツイートを持っている。だけど、ユーザ本体に対してツイートすることができない。

それはきっと、Twitterがあくまで「ツイート」という単位で全てを管理しているからなのだ。


# だけど、ユーザーのプロフィールとかに対して引用リツイートをしたいと言うことがあるんだよなぁ。


そわそわさんと言うTwitterのユーザの人がいる。その人のプロフィールが「コーヒーを飲むとそわそわしますと」というものだった。

# 僕は、それはカフェインのせいですよ!と叫んでツッコミたくなった

だけどできなかった。

# なので仕方なく、そわそわさんとの他のやり取り、リプライのついでに、そのことを話した。

うう‥何を言っているか分かるだろうか。

# 感想

なぜこの機能がないの！？

というのは、エンジニアリング的な、裏側に隠された仕組みのせいかもしれないね。


---

https://twitter.com/yumainaura

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









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Projucerで作ったアプリでiPhone Xの画面サイズをめいっぱい使う

必要なことはたった2つ。

* iPhone Xの画面サイズのPNGファイルを用意してProjucerのプロジェクトに追加する。Binary Resourceはオフ、Xcode Resourceはオン。例としてファイル名をLaunchImage.pngとする。
* ProjucerのExportersでXcode (iOS)のCustom Plistに下記のように記述。

```
<plist>
  <dict>
    <key>UILaunchStoryboardName</key>
    <string>LaunchImage</string>
  </dict>
</plist>
```
iPhone家計簿アプリを妻が利用している。食費と娯楽費と観光費はどう分けたら良いの？アプリケーションの対応は？

iPhone家計簿アプリを妻が利用している。食費と娯楽費と観光費はどう分けたら良いの？アプリケーションの対応は？


# だけど現実世界にそもそも明確な分類が存在しない場合は、アプリケーションでも対応できない。

結論。

# Story

家計簿アプリでの旅行中のお菓子の分類はどうしたらいいんだろう。自分でも気持ちで決めるしかないね。娯楽費なのか、おやつ代なのか、食費なのかとか。

![image](https://user-images.githubusercontent.com/13635059/51093739-f9f65500-17e9-11e9-95c7-722fa5137088.png)

# 妻がもみじの天ぷらを買いました。大阪の箕面と言う観光地の名物のお土産です。
￼
妻はレシーピと言う家計簿のアプリを使っていて、もみじの天ぷらは一体どのカテゴリに入れたらいいのかと言う質問を夫は受けました。

# そこで僕はiPhoneに音声入力をしながら妻の質問に答えたいと思います。

でももう妻はそんな事はどうでもよくなっているかもしれません。

これは僕も実は悩んだことがあるんですけれど、そもそも家計簿で何が何の費用かと言うのは人間が決めていることなので、必ずしも境界線が明らかでは無いのです。

# 海外でも生活必需品かの判別は、物そのものではなくて、買った個数やシチュエーションやテイクアウトしたかどうかによって税金が決まると聞きます。

例えばもみじの天ぷらであっても、世界中にこれしか食べ物が存在しなくて、生きる食べに買うのであれば食費かもしれません。だけど人にあげるのであればお土産でしょうし、おやつに食べるのであればおやつ代かも。観光旅行中に食べているので娯楽費かもしれませんね。

# これはもう、自分がどう思うかで決めなければいけない境界線というのが絶対にあるのです。

家計簿をつける時にカテゴリ分けに迷ったときは、自分がどう思うかというのかで決めるのがいいかもしれませんね。

ところでこんな話をしながら歩いていると、妻がボリボリと箕面の天ぷらを食べながらふんふんと鼻で話を聞いてきたので、僕はしばらく妻と離れて、箕面の冷たい谷の水の流れを見つめていましたとさ。

￼
![image](https://user-images.githubusercontent.com/13635059/51093743-ff539f80-17e9-11e9-9cf0-f95fec692b8d.png)


---

https://twitter.com/yumainaura

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











<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
iPhoneの音声入力ならエンジニアのアウトプット学習をしながら観光旅行だってできる。

iPhoneの音声入力ならエンジニアのアウトプット学習をしながら観光旅行だってできる。

# iPhoneで音声入力をするときのコツは、むしろ文字を見ないことかもしれない。スマホゾンビにならず観光旅行だってできるぜ。

文字を見てしまうと、その文字に惑わされて、目がチカチカしてしまうから。

後はiPhoneの文字入力の特徴として、たくさんの文章をいちどに入力した方が精度が上がるので、実は1回1回の変換ミスとかは気にせずに、最後まで長い文章を喋りきったほうがいいのです。

![image](https://user-images.githubusercontent.com/13635059/51093665-4c834180-17e9-11e9-821d-e3e2db679cbf.png)

# 吉田
￼
ほら今だって、吉田と入力された文字をiPhoneが、自動的に修正してくれましたよ。いちどテキストになってしまったらもうわからないですけどね。失礼失礼こりゃまた失礼。エヘヘ。

# 景色

あと1ついいところが分かりました。今、大阪美濃地方妻と観光中なのですが、iPhoneのディスプレイを見ずに音声入力をしていると、きれいな景色を見ながら入力をすることだってできます。

これが仮にフリック入力だったりしたら、観光しながらスマホゾンビになってしまって、いろんなきれいな景色を見逃してしまうことでしょう。

![image](https://user-images.githubusercontent.com/13635059/51093670-586f0380-17e9-11e9-9b20-9b9c4fbee57a.png)

# 観光最高


まぁ、そもそも観光中二スマートフォンなんか触るなと言う話もあるかもしれませんが、僕にとっては今、本当にアウトプット作業と言うのが楽しくて仕方ないので、観光しながらiPhoneで音声入力アウトプットすると言うのは本当に良い体験になっているみたいです。

ということで、まだいい感じの夕焼けの中、iPhone音声入力はiPhoneのディスプレイを見ずに入力する方法もあるよと言うヒントをお知らせしました。

￼
![image](https://user-images.githubusercontent.com/13635059/51093689-8a806580-17e9-11e9-90ff-fdcbd2c89032.png)

---

https://twitter.com/yumainaura

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









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
「’characters’ is deprecated: Please use String or Substring directly」が出てワーニング

> ’characters’ is deprecated: Please use String or Substring directly

Swiftで、こんなワーニングが出た。
やろうとしたことは、String型の定数を一文字ずつのCharacter型配列にしたかった。

```swift
let string = "hoge"
let characters = Array(string.characters)
```
Swift4.0以降？なのか、charactersが持っていたメソッドを、
String自体が持つようになったらしい。

```swift
let string = "hoge"
let characters = Array(string)
```
.countとかでも同様。
Bitriseでnodejsを実行する

## やりたいこと
Bitriseでnodejsプログラムを動作させたい

## 前提

nodejsプロジェクトをGithubなどにpush済み

## 手順

### Add App

まずはアプリ作成からスタート

### Create New App
ACCOUNT, Owner, Repository, Branchは自分で適切なものを設定する。

### Validating repository
VALIDATIONが実行されるが、ここは失敗してOK

失敗後、 **Restart scanning without validation** を選ぶ

<img width="1273" alt="スクリーンショット 2019-01-14 10.01.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/52227/35f30102-2e8a-bbd4-c281-e23e4aeffe33.png">


### Project build configuration
Project build configurationで手動でビルド環境を選べるので、 **OTHER/MANUAL** を選ぶ

<img width="1309" alt="スクリーンショット 2019-01-14 10.16.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/52227/b91b1956-3a81-709c-2b91-8942472ae8b0.png">

**Android & Docker, on Ubuntu16.04** を選ぶ

<img width="774" alt="スクリーンショット 2019-01-14 10.17.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/52227/e483f7ac-e422-75d7-ead7-bbd71cc644e0.png">

Webhook setupはお好みで、今回はSkipしておく

We've kicked off your first test build for you!は押すか、画面右上の FINISH を押してCreate画面を終了させる。

### Workflowの設定
Open Workflow Editorをひらく

WorkFlowでは
Git Clone repository
Script
以外は不要なので消す

<img width="765" alt="スクリーンショット 2019-01-14 10.23.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/52227/29214cb6-78e8-402f-3a12-3fb940882a23.png">

ちなみに、Ubuntu16.04環境にはすでにnpm/nodejsがインストール済み

npm 6.4.1
node v8.15.0

あとはScriptに実行させたいnodejsプログラムを起動させるだけでOK

```
#!/usr/bin/env bash
# fail if any commands fails
set -e
# debug log
set -x

# ディレクトリ確認
ls -la

# バージョン確認
npm -v
node -v

# 必要なければ消していい
sudo apt-get update -y

# npmインストール
sudo npm i

# スクリプト実行
sudo node index.js
```

Workflowを保存を忘れないように！

あとはBuildを開始させるだけ
アプリケーションのファーストビューは本当に大事。LINEでリラックマの生首に邪魔されて、今日の予定をファーストビューに再び投稿した夫。

アプリケーションのファーストビューは本当に大事。LINEでリラックマの生首に邪魔されて、今日の予定をファーストビューに再び投稿した夫。

￼
![image](https://user-images.githubusercontent.com/13635059/51093594-a0d9f180-17e8-11e9-9f32-0b6a29783fa2.png)


#  箕面の温泉物語、スパガーデンに行く予定です。

そこで妻がLINEで今日のスケジュールを送ってくれたのですが、LINEで連絡しているとこれがすぐに下のほうに流れていってしまいます。

#  そこで夫は、妻が送ってくれた予定をコピーアンドペーストして、また1番下に貼り付け直しました.

これが何が起こっているかと言うと、湯沢ほんとにファーストビューの大事さを知っているので、独自利用的に、ファーストビューに1番重要な情報を持ってきているわけです。

もちろんLINEにはノート機能などピン度目するような機能もあるのですが、それはファーストビューにすでに大事な情報を表示する機能ではありません。

つまりLINEにはファーストビューを守るピン機能のようなものは存在しないわけです。なのでユーザの独自利用が必要になるわけですね。

画像を見てもらえると分かる通り、特にスマートフォンに置いて、画面の半分以上が予定のテキストで埋められており、ユーザにとって世界の半分は、その予定表であるわけです。それがログが流れて失われてしまうと言う事は、世界の半分が流れて失われてしまうということであるわけですね。

# ファーストビューとそれ以外では切実に、ユーザにとって重要さの違いがあります。

よく、ワンクリックでいける場所に重要なものを表示しなさいと言いますが、それが1スクロールで行ける場所でさえなく、ファーストビルと言うのはユーザの注意を引く圧倒的な画面の幅を占めています。

# あなたももしかしたら意図せず気づかずファーストビューに重要な情報を置くためのユーザアクションを起こしている自分に気づくかもしれませんよ。

ファーストビューはとても大事。ユーザにとって本当に大事。それを意識していようと意識していないときであっても。自分自身のアプリケーションの利用ライフでそれを実感していけるといいですね。








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Github issue / PR と Qiita 比較。新規ポストのステップ数が実は8倍以上も違う件。

Github issue / PR と Qiita 比較。新規ポストのステップ数が実は8倍以上も違う件。

# Github

Command or Control + Enter

1ステップ

# Qiita


投稿ボタンにカーソルを合わせる or フォーカスする
押す
同意のチェックにフォーカスを合わせる
同意のチェックを入れる
Twitter共有のチェックにフォーカスを合わせる (任意だけど)
Twitter共有のチェックを入れる (任意だけど)
最終投稿投稿ボタンにカーソルを合わせる or フォーカスする
最終投稿ボタンを押す

8ステップ

![image](https://user-images.githubusercontent.com/13635059/51093528-d0d4c500-17e7-11e9-9a58-c4f8deb439b7.png)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->