OmniAICreator/Qiita-1.07M huggingface dataset:
[iPhoneユーザー必見]簡単になったアプリの整理方法

#はじめに
iPhoneが発売されてiPhoneは素晴らしい進歩をしてきました。しかし、変わらなかったものもあります。それは、**アプリの整理方法です**。

##こんな方に向けて記事を書きました。

-  iPhoneアプリを一気に編集してスッキリ**気持ちよくなりたい**

-  iPhoneアプリの配置を変えるのが**面倒くさい**

-  iPhoneアプリの整理方法がわからない

  こんな方に向けて記事を書いていきます。


##今までのアプリ整理方法
- iPhoneのアプリのアイコンを編集したい場合、アプリを長押しして、**プルプルモード**にして、
アプリ一個一個を選択して画面間を移動させたり
- たくさんのアプリを一気に移動したい場合は、一旦フォルダの中にアプリを詰めてそのフォルダーを画面間を移動させたり 
- 2つのフォルダー同士を一個にするために10分ぐらいかかった

皆さんいろいろ試行錯誤をされていると思います。



ですが、朗報です。**iOS11からAppleが新しいアプリ整理方法を実装しました！！！**

今回は、iOS11から新しくなったアプリの整理方法についてシェアしたいと思います。



#新しいアプリ整理方法

<img width="375" alt="IMG_2418.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240708/aa89a158-3652-ec6b-4de0-ce4a3a4af607.png">
- 今までの通りにプルプルモードにして編集できる状態にする。

<img width="375" alt=" .PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240708/253f7b31-475f-e19b-ad33-0379e51a4429.png">



- 移動させたいアプリを一つ浮遊させます

<img width="375" alt="IMG_2420.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240708/a652471f-ce7d-44f1-22e4-1152110e85f1.png">


- そのまま**ホールドさせた状態で他のアプリをタップする**
<img width="375" alt="IMG_2420.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240708/f5e00e3b-846d-c5ab-8468-d3ae4ad7b412.png">


- 最初に浮遊させたアプリに引き寄せられ一つのアプリを操作するように同時に動かすことができる
- 何個でもいける

<img width="375" alt="IMG_2426.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240708/65739dff-d8f7-5dea-0ddd-afc249aa5e3b.png">

- 離すと離した先の場所にそれぞれのアプリが展開される
- フォルダの中に展開することでアプリ整理を一気にできる
<img width="375" alt="IMG_2422.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240708/c6b9528f-7d5e-572f-7613-ac2983b97229.png">

**気持ちいい。**

フォルダーからアプリケーションを出す場合もこの Tips が使えます。

#おわりに
iPhone のアプリ整理は、長年の悩みでした。
ですがiOS11から直感的で新しいアプリの操作を行えるようになってこれからアプリの整理が楽しくなりそうです！
Appleにはこれからもユーザー視点でOSをアップデートして欲しいですね
また、新しいTipsがあればシェアさせていただきます！！コメントでこんなTipsあるよなんてものがあればコメントで教えて欲しいです:relaxed:
では良いAppleLifeを～～～
Windows Terminal Build(github.com/Microsoft/Terminal)



間もなく、Windows Terminalがリリースされます。ここでは自前でビルドしてWindows Terminalを使う方法を紹介します。今まであまりにも使いづらかったWindowsのターミナル環境を快適にしてくれることでしょう。

github : https://github.com/Microsoft/Terminal

blog : https://devblogs.microsoft.com/commandline/introducing-windows-terminal/


![](https://raw.githubusercontent.com/mba-hack/images/master/windows-terminal-preview-03.png)


## VS2017の場合

VS2017でやれば普通に簡単にできると思います。ただ、VS2019の場合は、`OpenConsole.sln`を開いて修正するだけでは難しいみたいです。

```sh
$ git clone https://github.com/Microsoft/Terminal
$ cd Terminal
$ git submodule update --init --recursive;
$ scoop install nuget
$ nuget restore OpenConsole.sln;

# VS2017でOpenConsole.slnを開きます

# Windowsの設定で - Upgrade & Security - For Developers, modify App sources to Developer mode(開発者モード)にする

# ソリューションエクスプローラーの`ソリューション"openconsole"47プロジェクト`を右クリックして、ソリューションの配置を行う
# ただし、これは、最新がWindows Universal Runtime version 1.0.0.17763なので、`Windows Insider Program`に登録して、プレビュー版のWindows Buildが必要
```

> Right click on CascadiaPackage(under Solution/Terminal), select Deploy Solution to install, then you'll find Windows Terminal (Preview) in start menu.

guide : https://github.com/microsoft/Terminal/issues/489

この記述は、ソリューションエクスプローラーの`ソリューション"openconsole"47プロジェクト`を右クリックして、ソリューションの配置を行うことを言います。これによってスタートメニューに`Windows Terminal (Preview)`が表示されます。

ただし、これは、最新がWindows Universal Runtime version 1.0.0.17763なので、`Windows Insider Program`に登録して、プレビュー版のWindows Buildを試す必要があります。

https://github.com/microsoft/Terminal/issues/489#issuecomment-490137756

```sh
Windows 1903 (build >= 10.0.18362.0)
```

![](https://raw.githubusercontent.com/mba-hack/images/master/windows-terminal-preview-02.png)

## VS2019の場合

追記 : VS2019でbuildするPRが取り込まれた模様

https://github.com/microsoft/Terminal/pull/449/commits/ebb1c620dd3d9604b5164a89dd68a6c77922f7d7

私の場合は、こちらの手順でやりました。ただし、WindowsTerminal.exeが動かない模様。なので、VS2017でやるのが正解です。

`p:TargetPlatformVersion=10.0.17763.0`の箇所はご自身がインストールしてるバージョンを指定します。

```sh
$ pwsh
$ git clone https://github.com/microsoft/Terminal.git
$ cd Terminal
$ git submodule init
$ git submodule update
$ nuget restore OpenConsole.sln
$ msbuild /p:Configuration=Release /p:Platform=x64 /p:PlatformToolset=v142 /p:TargetPlatformVersion=10.0.17763.0 /p:PreferredToolArchitecture=x64 OpenConsole.sln
```

![](https://raw.githubusercontent.com/mba-hack/images/master/microsoft-terminal-build-201905-vs2019.png)

`C2220 error` : Open property of corresponding sub-project, navigate to C/C++ panel, change Treat Warnings As Errors option to No(/WX-);
x64, Debug, Releases;

`C481 error` : ファイルをutf-8で保存します。

> Other errors: Other errors are encoding error of CJK characters, just modify corresponding file encoding to UTF-8 BOM(Notepad++ is recommended);

## 公式

```sh
$ git clone https://github.com/Microsoft/Terminal
$ cd Terminal
$ git submodule update --init --recursive
$ scoop install nuget
$ nuget OpenConsole.sln
# visual studioでOpenConsole.slnを開く、必要なものをインストール
$ msbuild OpenConsole.sln
```

[Windows Terminal Setting](https://qiita.com/syui/items/3236495744a16d982464)
Amazon Linuxでcatapult-service-bootstrapを起動するためのライブラリインストールメモ

Amazon Linux 2でも同様です。

symbol-testnet-bootstrap、symbol-bootstrapを起動するためにも使えます。

## 最初

```bash
sudo yum update -y
```

## Docker
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/docker-basics.html

```
sudo yum install docker
sudo service docker start
sudo usermod -a -G docker ec2-user
(ログインしなおす)
docker info
```

## Docker Compose
https://docs.docker.com/compose/install/

```
sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
```

## Git

```
sudo yum install git
```

## JQ

※必須ではない。

```
sudo yum install jq
```


## Node

※必須ではない。

https://github.com/nvm-sh/nvm#install--update-script

```bash
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
```

再ログイン

```bash
nvm install 10
nvm use 10
```

10の部分は、使いたいバージョンを指定

## スワップ

```bash
sudo su -
dd if=/dev/zero of=tmpswap bs=1024 count=1M
chmod 600 tmpswap
mkswap tmpswap
swapon tmpswap
exit
```

1GBのスワップを作成します
jarファイルにまとめたJavaプロジェクトの中で、log4jの設定ファイルを読み込む方法メモ

# 概要
log4jを用いてログ出力をしているプログラムをjarファイルにまとめたところ、log4jの設定ファイルであるlog4j.xmlがうまく読み込まれなくなりました。

プロジェクトの構成は、こんな感じです。

```
├ src
  └ foo 
     └ foo.java <= メインのプログラム
└ resources
  └ log4j.xml <= log4jの設定ファイル
```
# 失敗例
メインのプログラムのコンストラクタの中で、以下のように設定ファイルを読み込みました。

```java:foo.java
import org.apache.log4j.xml.DOMConfigurator;

public class foo {
    public foo () {
        DOMConfigurator.configure("log4j.xml");
    }
}
```
ファイル名`log4j.xml`を指定することで、Eclipse上でテストしたときはうまく読み込まれるものの、このプロジェクトをjarファイル化して動かしたときには、ファイルが見つからない旨のエラーが出て失敗します。
# 失敗した原因
プロジェクトをjarファイルにしてほかのプログラムから呼び出したときに、そのプログラムの起動ディレクトリにファイル`log4j.xml`がないか探してしまうため、うまく見つからなかったようです。

そのため、ファイル名のみを指定するのではなく、ファイルまでの絶対パスを指定するようにします。

# 解決策
コンストラクタを以下のように書き換えることで絶対パス指定ができるようになり、jarファイルにプロジェクトをまとめてもうまく設定ファイルが読み込まれるようになります。

```java:foo.java
	public foo () {
		ClassLoader loader = Thread.currentThread().getContextClassLoader();
		DOMConfigurator.configure(loader.getResource("log4j.xml"));
	}

```
Vagrant上からGit commitしても草が生えないとき

## はじめに

VS code Remote Developmentを利用してVagrantにssh接続し、そこからgitにコミットしていたのですが、全く進捗の草が生えていませんでした（泣） 

## 対処法

理由はとても単純で、Vagrantの時刻設定がUTCになっていたからでした（自分のコミットが全て未来に飛んでました。）。

シアトルに住んでるので、PDTに変えたいと思います。以下のコマンドで終了です。

```shell
# Check
$ timedatectl
# Check timezone
$ timedatectl list-timezones
# Set timezone
$ sudo timedatectl set-timezone America/Vancouver
```
GWの努力が実りました（2019年）

# 対象者

Salesforce認定アドミニストレーター取得済(Salesforce認定上級アドミニストレーター取得の前提条件)またはTrailheadの使い方になれている方を対象とする。

# GWの成果

<img src= "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31622/9aaa23e8-e513-5dce-a6b5-123469003973.png" width= 20%> <img src= "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31622/db32dbce-5f4e-57f1-865e-b6daa10bc215.png" width= 20%>

- [x] Salesforce 認定 Platform アプリケーションビルダーを取得した。
- [x] Salesforce 認定上級アドミニストレーターを取得した。
- [x] Trailheadでのバッジ数を30個増加させた。※GW前は70個増やす目標を立てましたが、目標達成できず。

# 背景

2019年のGWは**稀に訪れる10日間の連休**だったので、旅行したい気分があった。GWの4ヶ月前から旅行サイトなどで日本の国外または国内の観光地などを見て旅行を検討していた。しかし、担当しているプロジェクトのリリース日がユーザーへの影響がかなり大きいことを理由にユーザーがシステムを長く使用しないGWにリリースすると計画が変更された。そういうわけで、旅行したい気分がなくなり、なにしようかを考えたとき、GW中は**Salesforce認定上級アドミニストレーター資格**の学習してGWあけは資格取得しようというところに辿り着いた。

# 教材

私が学習したときの教材などを紹介する。

1. [Prepare for Your Salesforce Advanced Administrator Credential](https://trailhead.salesforce.com/ja/users/strailhead/trailmixes/prepare-for-your-salesforce-advanced-administrator-credential)
2. [Prepare for Your Salesforce Platform App Builder Credential
](https://trailhead.salesforce.com/ja/users/strailhead/trailmixes/prepare-for-your-salesforce-platform-app-builder-credential)
3. [Salesforceのヘルプドキュメント](https://help.salesforce.com/articleView?id=salesforce_help_map.htm&type=5)

# 学習時間

私の場合、GW10日間の平均で**3時間/1日**

# Platform App Builderも受験した理由

深く考えていなかった。
Trailheadの学習や受験ガイドを見たときに同じ系統であることや企業別資格取得者数のデータを分析してチャレンジした。

# 目指すのは

2020年中にSalesforce **アプリケーションアーキテクト**を目指します。

<a href="https://cl.ly/c38168" target="_blank"><img src="https://d2ddoduugvun08.cloudfront.net/items/0e1Z0T3Y2E3O1I1q463O/%5Bdbedf556fcf75d0b4f2a8376dd31599e%5D_Image+2019-05-05+at+7.48.32+AM.png" style="display: block;height: auto;width: 100%;"/></a>

# 2019年5月時点で取得済の資格

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31622/ad58a46e-c9f3-6224-9f55-35911800726a.png" width=15%> <img src= "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31622/9aaa23e8-e513-5dce-a6b5-123469003973.png" width= 15%> <img src= "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31622/db32dbce-5f4e-57f1-865e-b6daa10bc215.png" width= 15%>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31622/7d1a9fe6-0585-2dec-e198-d94713ac1608.png" width=15%> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31622/7963cdff-a57a-1caf-36b1-bf13792dfbcc.png" width=15%> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31622/64fc679b-eef8-e0ad-89bc-1effbdc687e8.png" width=15%>
flutter web少し触ってみた

自分の環境ではflutter_webのGetting Startedの通りに進まなかったので、
ドキュメントの`flutter packages pub global activate webdev`の部分を`pub global activate webdev`に変えて進めた。自分のやりかたはpubを使うのでdartが必要。

flutterのバージョンは下記の通り

```
Flutter 1.5.4-hotfix.2 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 7a4c33425d (8 days ago) • 2019-04-29 11:05:24 -0700
Engine • revision 52c7a1e849
Tools • Dart 2.3.0 (build 2.3.0-dev.0.5 a1668566e5)
```

下記はexamplesのhello_worldのfontSizeとcolorを変えたもの

```dart
import 'package:flutter_web/material.dart';

void main() {
  runApp(
    new Text(
      'Hello World',
      textDirection: TextDirection.ltr,
      style: TextStyle(fontSize: 32.0, color: Colors.black),
    ),
  );
}
```

上記の画面のスクショ
![スクリーンショット 2019-05-08 7.46.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117867/d9c07c39-a786-36bb-5b18-427835bfa6d1.png)

下のgifはexamplesに入ってたgalleryを動かしてみたもの
![flutter_web_gallery.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117867/06a1d79e-49d6-1958-907a-0c75a134eb3f.gif)

## 追記
[fluttter_webのexampleを動かすところまで](https://qiita.com/hiko1129/items/efc20792016a22a7c88a)を書きました。
[flutter webのアプリをfirebase hostingで公開する](https://qiita.com/hiko1129/items/b55835968820d6e37d27)も書きました。


## 参考
[flutter_web](https://github.com/flutter/flutter_web)
[webdev](https://pub.dev/packages/webdev)
Qiitaのメールアドレス認証に失敗する

# 【概要】
 - 初投稿テスト

### 【起こったこと】
- 「設定」→「メールアドレスと通知」から認証用メールを送信
- メール内の認証リンクをクリックしても「無効な認証キーです」と表示され、認証に失敗

### 【解決】
- ユーザー登録直後に送信された認証用メールのリンクで認証を試行→成功

### 【原因？】
- 24時間経つまでは一番古い認証キーが有効になっている説
expoでJest使ってテストしようとするとunexpected tokenでしばかれる

https://github.com/expo/expo/issues/2595

jest.config.jsに

```js
module.exports = {
  preset: 'jest-expo',
  transform: {
    '\\.js$': '<rootDir>/node_modules/react-native/jest/preprocessor.js'
  }
};
```

こいつをねじこむといいらしい。(jest-expoは入ってる前提で)

**追記:**

```js
module.exports = {
  preset: 'jest-expo',
  transform: {
    '\\.js$': '<rootDir>/node_modules/react-native/jest/preprocessor.js',
    '\\.tsx$': '<rootDir>/node_modules/react-native/jest/preprocessor.js'
  }
};
```
割と当然だけどTypeScriptでtsxとかの拡張子使ってる時にとかしないとエラーが出る
Swift：ワークスペースの切り替えを監視する

# 導入
macOSでワークスペース（デスクトップ）が切り替わったタイミングで処理を発火できます．

# 実装
```swift:Appdelegate.swift
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

    func applicationDidFinishLaunching(_ aNotification: Notification) {	
        NSWorkspace.shared.notificationCenter.addObserver(self,
                                                          selector: #selector(changedActiveSpace(_:)),
                                                          name: NSWorkspace.activeSpaceDidChangeNotification,
                                                          object: nil)
    }
    
    @objc func changedActiveSpace(_ notification: NSNotification) {
        Swift.print("切り替わった")
    }
    
}
```
`NSWorkspace.activeSpaceDidChangeNotification`を使えばいいだけ
あれは何だ！OCamlか！F#か！いや、F*だ！

#はじめに
世の中にはいろいろなプログラマがいるし、プログラマが使うプログラミング言語も同じく多く存在する。C#は神の言語だという人やRustの更新情報をいつもチェックしている人など、周りを見るとプログラミング言語宗教に染まってしまった人は結構いるはずだ。しかし、プロジェクトが変われば使う言語も変わるし、いろいろな言語を知っていることは損ではない。そんな中、言語を探していく内によく分からないし使い方も分からない言語を見つけることもあるはずだ。その言語に触れていく内に芽生える恋にも似た偏執を感じたら最後。それはさながら、映画鑑賞が趣味の人間がA級からB級に堕ち、5分以内にサメかゾンビが出てこないと満足できない身体になるように戻れなくなってしまう。そう、私のように。というわけで、人が知らないような言語を紹介してみようと思う。それは、開発段階かもしれないし、開発が終わった言語かもしれない。ここでは、それらをB級言語と呼ぼうと思う。そして願わくば、それらがA級言語と呼ばれるようになった時に、最初はこうだったのにと思えると面白いかもしれない。

#F*って何よ？
タイトルにもあるが今回はF*(Fスター)を紹介しようと思う。感のいい人はタイトルで気づいただろうが関数型言語だ。そして、Micro SoftのF#なら知ってるという人がほとんどだろうと思う。現に、「F* programming」と検索してもトップはF#になってしまうことがある。なんてことだ！ちなみにF#について知りたければ「[F# を知ってほしい](https://qiita.com/cannorin/items/59d79cc9a3b64c761cd4)」を見るといい。ついでだが、この記事ではF#とF*を詳しく比べる気はまったく無い。ジョーズとB級サメ映画を比較しても虚しくなるだけといえば分かるだろう。それでは本題に戻そう。F*はF#と同じMicrosoft Researchで開発されている。現状では、F*単体では実行はできないが、プログラムを検証し、OCamlやF#にエクストラクトして、その言語のコンパイラによってコンパイルすることで実行を行うことになる。ここで重要となるのは検証を行うことである。話が長くなりそうなのでこれは次のセクションに持ち越そう。

#プログラムの検証
さて、[サイト](http://fstar-ja.metasepi.org/)の翻訳に従えば「検証」というワードを使っているが、「証明」といった方が分かりやすいかもしれない。既にCoqやAgdaやといった証明支援システムを知っているならなお良い。本題だが、プログラムの品質保証行う上で、「プログラムが正しい」とはどう言えるのだろう。例えば、「この関数は返り値をNULLとしない」、「このリストは常に3番目を参照できる(リスト長が3以上)」とはどう言えばいいだろうか。まぁ、この程度であれば数回テストをすれば問題なさそうだが、もっと難しい問題となった場合はという話だ。ここで、定理証明支援というものが登場する。難しいことは言わないし、そもそもこの分野は難しすぎて私の口からおいそれと言えないのだが、定理証明では、普遍的な諸々の性質から結論に得ることでプログラムの正しさを導き出す。つまり、これを半自動的にやってくれるのがF*で、大雑把に言えばF#にCoqを足したらF*になったようなものだろう。

#環境を作る※必要なら
環境を作るのは簡単だ。[ホームページ](https://www.fstar-lang.org/#introduction)から自分のOSに合ったバイナリをダウンロードしてパスを通せばいい。そう、F*単体の環境を作るのは簡単だ。だが、前述したようにF*は単体では実行できないため、F#やOCamlにエクストラクトしてから実行する必要がある。Windowsを使っていてOCamlの環境を作ろうなんてするのは骨が折れる。Visual Studioを使ってF#の環境を整えるのがいいだろう。もし、環境を作りたくないというなら、[online F* editor](https://www.fstar-lang.org/run.php)を使うといい。解説もあるし、私がいちいちコードを書いて解説する必要もなくなる。

#最後に
雑な記事書いてごめんなさい。

#参考
[F*: A Higher-Order Effectful Language Designed for Program Verification](https://www.fstar-lang.org/)
[F - Metasepi](http://fstar-ja.metasepi.org/)
画像処理100本ノックC言語で挑戦してみる　イントロダクション

#挑戦の動機
今、大学３年生の前期でパターン認識の講義をとっています。
講義ではまず画像処理の基本をC言語で実装して、画像の基本操作に慣れるところから始めています。
恥ずかしながら、僕は2年のアルゴリズムの講義をあまり真面目にやらなかったのでC言語に不慣れなところもあり、今少し苦戦しています。
そこで丁度いい練習問題を発見したので挑戦してみようと思います。
100本ノックの記事ではpythonとC++での実装方法しか載っていませんが、自分なりになんとか頑張ってC言語での実装を試みようと思います。

#画像の用意
100本ノックの記事で提供されている画像はjpg形式ですが、C言語で直接ピクセルの値をいじりたいので今回はppm形式に変換して、その画像を用いようと思います。

###練習で用いる画像(jpg形式)
![imori.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333871/ce29f5ee-0ef7-e6f6-84ea-a88da3199ca3.jpeg)

###jpg->ppm変換に用いたサイト
https://jinaconvert.com/jp/convert-to-ppm.php

#謝辞
画像処理100本ノックを公開してくださったyoyoyo_様（https://qiita.com/yoyoyo_）
ありがとうございます。
###画像処理100本ノック
https://qiita.com/yoyoyo_/items/2ef53f47f87dcf5d1e14

#目標
技術、実装力があまりないのと、C言語でどこまで実装可能なのか全く見当がつかないので100問完答できるかわかりませんが、精一杯頑張ります。
また、3年生は実験やら課題やらでなかなかまとまった時間が取れないので１問ずつ、まったり投稿していこうと思います！

#画像処理100本ノック　実践編リンク集
[画像処理100本ノックC言語で挑戦してみる　下準備](https://qiita.com/HirosuguTakeshita/items/c9e1ed839e8b17759a2a)
[画像処理100本ノックC言語で挑戦してみる　＃1](https://qiita.com/HirosuguTakeshita/items/7faf698086d09d124706)
[画像処理100本ノックC言語で挑戦してみる　＃2](https://qiita.com/HirosuguTakeshita/items/e15dc477a700207ff740)
[画像処理100本ノックC言語で挑戦してみる　＃3](https://qiita.com/HirosuguTakeshita/items/90845c48582a036fc0cd)
[画像処理100本ノックC言語で挑戦してみる　＃4](https://qiita.com/HirosuguTakeshita/items/be100039478a905a5721)
Unityのボタンのマテリアルを変更する

https://docs.unity3d.com/ja/2017.4/ScriptReference/Renderer-material.html

　上のリンクでは

```
using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour
{
    Material m_Material;

    void Start()
    {
        //Fetch the Material from the Renderer of the GameObject
        m_Material = GetComponent<Renderer>().material;
        print("Materials " + Resources.FindObjectsOfTypeAll(typeof(Material)).Length);
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            //Output the amount of materials before GameObject is destroyed
            print("Materials " + Resources.FindObjectsOfTypeAll(typeof(Material)).Length);
            //Destroy GameObject
            Destroy(gameObject);
        }
    }

    void OnMouseOver()
    {
        // Change the Color of the GameObject when the mouse hovers over it
        m_Material.color = Color.red;
    }

    void OnMouseExit()
    {
        //Change the Color back to white when the mouse exits the GameObject
        m_Material.color = Color.white;
    }

    void OnDestroy()
    {
        //Destroy the instance
        Destroy(m_Material);
        //Output the amount of materials to show if the instance was deleted
        print("Materials " + Resources.FindObjectsOfTypeAll(typeof(Material)).Length);
    }
}
```

　のようにして変更していますが、同様のことをすると

```
MissingComponentException: There is no 'Renderer' attached to the "xxx" game object, but a script is trying to access it.
You probably need to add a Renderer to the game object "xxx". Or your script needs to check if the component is attached before using it.
UnityEngine.Renderer.set_material 
```

　と怒られます。canvas上のボタンの場合は

```
GetComponent<Renderer>()
↓
GetComponent<Image>()
```

で解決します
【Inkscape】オブジェクトの形でマスクする方法

環境メモ
⭐️Mac OS Mojave バージョン10.14
⭐️Mac Book

1.マスクする対象の画像や絵を一番下に配置する
<img width="650" alt="スクリーンショット 2019-05-06 19.27.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/807bd42c-37dc-c038-32a5-a0412f209f73.png">

2.切り抜くオブジェクトを一番上に配置する。（透明度も指定できる）
<img width="997" alt="スクリーンショット 2019-05-06 19.29.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/cdce0c5b-e974-b8fd-81e2-88f38f310b5f.png">

4.下の絵と上のオブジェクトの両方を選択する
<img width="639" alt="スクリーンショット 2019-05-06 19.30.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/dae706a8-4ab8-e7fa-d5b1-56ce8be65b4f.png">

5.「オブジェクト」ー「マスク」ー「設定」を選択する
<img width="791" alt="スクリーンショット 2019-05-06 19.31.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/c6ab13c4-1aa7-c624-3732-12a64eb7d807.png">

6.完成！！
<img width="661" alt="スクリーンショット 2019-05-06 19.31.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/463249e3-5702-a0ce-baf1-0c76c8e5f9e1.png">


<br>
<br>
↓↓Google Play 無料Free
CherryCocktailGlassチェリーカクテルグラス〜無料簡単ミニゲームFree games
[![googleStoreLink.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/0687ddf4-3146-65bd-7ca5-45b6f70fb153.png)](https://play.google.com/store/apps/details?id=com.non.CherryCocktailGrass)

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">⭐️Androidアプリ⭐️リリース<br>🍒CherryCocktailGlass🍒<br>Blenderで絵を描いてUnityで作成したミニゲームリリースしました😍<br>🍷カクテル🍷グラス🍷に<br>🍒チェリー🍒をのせるシンプルなゲームです。<br>✨（●＾o＾●）✨<br>【Android】<br>Google Play 無料Free<a href="https://t.co/I70R9QEDuq">https://t.co/I70R9QEDuq</a><a href="https://twitter.com/hashtag/CherryCocktailGlass?src=hash&amp;ref_src=twsrc%5Etfw">#CherryCocktailGlass</a> <a href="https://t.co/g8kCM9QVhL">pic.twitter.com/g8kCM9QVhL</a></p>&mdash; non (@nonnonkapibara) <a href="https://twitter.com/nonnonkapibara/status/1121818121323433984?ref_src=twsrc%5Etfw">April 26, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
JavaScript１ヶ月半くらいの独学初心者がGW中にプロダクトを作った話

初めまして。zer0_256(ゼロ)と申します。
現在、大学2年で情報系に通っています。3月頃からJavaScriptを独学で始めて１ヶ月くらいで基礎の基礎をやってこのGW中にプロダクトを作ったので記録としての残しておこうと思います。

##参考までに筆者のレベル
HTML/CSS:レスポンシブは苦手。自作サイトを作成済み。夏にサイト模写をやるつもり
JavaScript:　ドットインストール ＆Progateで勉強。以前ジャンケンゲームを作った。
Processing:初めて触ったプログラミング言語。グラフィック系は肌に合わずに軽く挫折
C言語:現在大学で履修中。まだ簡単な条件分岐までしかやっていないのでコメント不可。
ざっくりですがこんな感じです。今後はPHPやJavaScriptライブラリをやる予定。

#何作ったのか
4月の中旬くらいにとある勉強会に参加して、そこで好奇心でプロダクトを作って楽しそうにLTをされていた方が居たので自分も思い切って作ってみようかなと火がついたのがスタートでした。

ちなみにプログラミング自体は昨年の9月から大学の講義でProcessingとHTML/CSSをやったのが初めてです。大学進学前からプログラミングは知っていましたが独学をしたことはありませんでした。この話はまたおいおいしていきたいと思います。

- チャットアプリ 
- To doアプリ

作ったのはこの二つです。好奇心が勝ちチャットアプリ から作っていきましたが、あとからとあるサイトを見ていたらTodoアプリの方が楽ということを知りました笑
ということもあり、GW中はほぼチャットアプリに苦しめられることばかりでした。
もうしばらくはmessageという英単語見たくないですね。。。ｗｗ

##使ったもの
- ドットインストール

バックエンドの知識はないに等しいのでFirebaseを使いました。
そこでまずはドットインストールで仕組みを理解。

[ドットインストール](https://dotinstall.com/lessons/basic_firebase)
なんですが、コレを終わらせるだけでも一苦労でした。
始めたのは4/13で、4月中に終わらせる予定がかなり遅くなり終わったのが5/1でした。
大学の方が忙しくなったのもありますが、一番の理由は**細切れの時間でやるとインプットが遅くなって忘れて見返して時間を食ってしまうことでした。**
ほかのレッスンと違ってコンテンツの中身が目まぐるしく変わるような印象を受けたのでまとまった時間が取れないと厳しいなと感じました。

##問題発生
ドットインストールを終えたのですが、このレッスンをご存知の方ならわかるとは思うんですが、基礎の基礎すぎて送信時間を実装したり、アイコンを設置したりする方法って検索しないと出ないんですよね。
しかも、今回私はjQueryすらなしでJavaScriptオンリーで実装していたので参考文献と呼べるものが少なかったです。Vueとかは検索すると引っかかるものが多かったです。

参考になるサイトはいくつか見つけたのですが、コードを読む力も必要とされ、独学の私にはかなりハードルが高かったです。（今の印象です。）
最初は送信時間の実装やアイコン、自分を右に表示、他の相手を左に表示といったこともやりたかったのですが今回は力不足ということもあり、断念しています。

もう少しコードやFirebaseに慣れてきたところで再挑戦していきたいと思っています。
（スクショはデザインがひどいので割愛します。LTするときには見せますよ！笑）

##Todoアプリ
モデルは[Todolist](https://todoist.com/?lang=ja)というアプリです。ご存知の方も多いと思います。
ありがたいことに先人の方がQiitaで素晴らしいものがあったので紹介させていただきます。
[参考にさせていただいたQiita](https://qiita.com/C3REVE/items/01cb6b9fd70f622ba622)
このQiitaではHTML/CSS/JavaScriptの復習からアプリ作成に入っていけるので初心者の方にはオススメです。
そして基礎の基礎部分ですが出来上がったのがこちら。
<img width="681" alt="スクリーンショット 2019-05-08 1.02.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372171/5287a517-e843-76bf-d9c9-5506f644f015.png">

右のボタンをクリックすると左のメイン部分が出てきてタスクを入れることができます。
日付だったりとかカテゴリ分けといったコンテンツを作ってより実用的なものを目指していくつもりです。

##GWを通して得たこと
- **忍耐力がついた**

GW中はもくもく会に少し参加しただけでほぼ一人で開発してました。大学の同期でJavaScriptをやっている人はいないですし、（実は後期にやりますｗ）チャットアプリを作っている人は周りにはいなかったので常に一人で画面に向き合っていました。
確かに一人で質問できる人がいない環境も辛いですが、向き合ってみることで自分の実力や検索力やコードを読む力を得ることができたと思います。

- **実際に動いているアプリケーションのすごさに気づいた**

チャットアプリならLINEなど。Todoアプリも様々なアプリケーションが世の中にリリースされています。それを作っている人はすごいなーと思ったと同時に世に出ているアプリケーションのレベルの高さを知りました。今まで何気なく使っていたものですが開発者の気持ちが少しだけわかった気がします。

- **実際にプロダクトを作ってアウトプットすることは最強（でもめっちゃキツイ）**

ドットインストールや他のサービスや本などで理解してコードを書いていても自分で使ってみなきゃ本当のコードではない気がします。
知識として持っていても実際の現場やプロダクトでいかに使える武器が多いか。そのプロダクトや現場に適応することが重要だと再確認できました。
プロダクトを作ってLTやブログやQiitaにアウトプットすることによって、未来に自分や誰かが困ったときに助けになると思います。（自分も実際今回それを実感しました〜）
確かにキツイですが、「そのプロダクトを作ってみたい！という好奇心で突破できるような気がします。私は今回断念しましたが、断念したことによってこれを糧に半年後くらいには自分つけたい機能が実装できるように勉強していこうと思うことができました。

アウトプットすることによって作品は自分の財産になりますし、ポートフォリオとして使うこともできるし、いいことが多いです。
確かにキツイですが、自分の好きなものを作ることによってプロダクトをもっと作りたい！と思う方が勝ると自分は思いました。

また、プロダクトを作ったり、チャットアプリの方で進捗があったらまた投稿させていただきます。


##参考サイト
今回作る上で参考にしたサイトを少しご紹介します。

[firebase](https://blog.katsubemakito.net/firebase/firestore_realtime_1)

ここまでお読みいただきありがとうございました。
Amazon S3 が2020年9月30日以降パス形式のサポートを終了するが AWS SDK for .NET 利用者は大丈夫か?

# Amazon S3 が2020年9月30日以降パス形式のサポートを終了するが AWS SDK for .NET 利用者は大丈夫か?

結論: 大丈夫.

ソースコードを見るに、自ら好き好んで ForcePathStyle を true にしない限りは、バケット名が仮想ホスト形式に適合している限り、仮想ホスト形式を使うようになっています.
[aws-sdk-net/AmazonS3PostMarshallHandler.cs at master · aws/aws-sdk-net](https://github.com/aws/aws-sdk-net/blob/master/sdk/src/Services/S3/Custom/Internal/AmazonS3PostMarshallHandler.cs#L130)

参考: [【注意喚起】 2020年9月30日以降、パス形式での S3 API リクエストは受け付けられなくなります。](https://dev.classmethod.jp/cloud/aws/s3-no-longer-support-path-style-requests/)

追記: アナウンスの原文に、最新の SDK を使えば大丈夫って書いてありましたね.

> Customers using the AWS SDK can upgrade to the most recent version of the SDK to ensure their applications are using the virtual-hosted style request format.
Unity の Terrain を FBX でエクスポート

<p><img src="https://dl.dropbox.com/s/duprs2eo9zflfhk/TerrainFbxExporter_Logo_1200x630.png" /></p>



<!--
https://qiita.com/sator_imaging/items/9f0d73b089c21101a8e7
-->



昨年来使わなくなった、Unity の ``Terrain`` を FBX で書き出すエクスポーター。


ペイントしたテクスチャは UE4 と同じく、頂点カラー RGBA それぞれのチャンネルをマスクに貼り分けが出来るように計画。ただ、頂点カラーマスクに対応する為にはシェーダーを自前で用意する必要があり…。

今回はそこまでする必要もなかったので、テクスチャエクスポート機能は見送りに。


植えた Tree の位置・向き・幅・高さの書き出しは、内部で持ってるデータ的には ``Transform`` と同じ（多分）だけど、``GameObject`` が無い分テレインに植えたままの方が軽そうだったので、エクスポートして重くすることも無いだろーと未実装。


<!--more-->


Terrain エンジン刷新しました、という触れ込みの Unity 2018 シリーズでも公式 FBX エクスポーターがテレインの書き出しに対応していないようなので、``.obj`` とか他のツールで上手く書き出せない、一度 ``.fbx`` 以外を通すのは面倒だ、という場合には。


互換性がありそうに思えた古めのバージョンの ``.fbx`` フォーマットを使ったけど、Substance Painter では逆に読めなかったので、DCCツールによっては ``.fbx`` フォーマットのバージョンを上げる必要あり。Blender ではアスキー形式からバイナリ形式に。

- [FBX Converter Archives | Autodesk Developer Network](https://www.autodesk.com/developer-network/platform-technologies/fbx-converter-archives)




## こちらから



- [Terrain FBX Exporter - Asset Store](https://t.co/9rFnIOYX6Q?amp=1)
   <iframe
      class="embed-card embed-webcard"
      scrolling="no"  frameborder="0"
      style="
         display: block;  border: none;
         margin: 10px 0px;
         width: 100%; height: 155px;
         max-width: 500px;
      "
      src="https://hatenablog-parts.com/embed?url=https://t.co/9rFnIOYX6Q?amp=1">
   </iframe>
PyCharmからGitHubへの連携

タイトル通り、PyCharmからGitHubへの連携（Push）の方法のメモ


1. VCS→バージョン管理へのインポート→GitHubでプロジェクトを共有
<img width="1439" alt="スクリーンショット 2019-05-08 1.56.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363095/427ab6b6-721e-1f76-9801-9558ceadc8c1.png">

２. 「GitHubにログイン」「GitHubでプロジェクトを共有」ダイアログが出るので、必要な情報を記入
<img width="488" alt="スクリーンショット 2019-05-08 1.53.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363095/53dd64c7-ae2a-2fad-1a29-94cd006efd7e.png">
<img width="277" alt="スクリーンショット 2019-05-08 1.58.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363095/fd12997a-89af-acae-22c3-136e5f24f5db.png">


３. コミットしたいファイルを選択して「追加」を押下
<img width="422" alt="スクリーンショット 2019-05-08 1.59.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363095/73e255bd-aa23-56f1-9dcb-e089cbd9ebc2.png">


4.　Pushされていることを確認！
<img width="1037" alt="スクリーンショット 2019-05-08 2.03.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363095/5ab79098-fb27-6f3d-5b7b-54c852d77ca4.png">


5.　二回目以降のPush
コミットしてから…
<img width="298" alt="スクリーンショット 2019-05-30 4.06.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363095/c8559d4f-ba5b-13de-1000-8ec15f1dc79b.png">
Push！
<img width="593" alt="スクリーンショット 2019-05-30 4.05.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363095/bb3a07a9-c5d9-91ce-f646-049ce9a2f882.png">

PyCharmすごいっすね〜。
特にアドオンとか入れてなくてもすぐにできました。
これだけの機能があって無料で使えるのは嬉しい！
あとはもう少し日本語化してくれれば…。
PyCharmだけじゃなくて、Python界隈はやっぱ英語わかんないとやりづらいですね。
Pandas DataFrame で append すると遅い 


- いつも DataFrameにpd.Series を append していたのですが、遅くて遅くて困っていました。
Goggle で検索しようとすると、"pandas dataframe append very slow"というキーワードが候補に出てきました。
- 作戦として、dictionary を作って、from_dict(my_dic, orinet="index")とする方法があるようで、こちらの方が早い。
- 下記のコードの場合、append では5.7秒、from_dict では 0.02秒でした。圧倒的な差。

```check_df_append_time.py
import pandas as pd
import numpy as np
import time

N=10000

def gen_df1(N):
    df = pd.DataFrame(index=[], columns=["X","Y"])
    for i in range(0, N):
        df = df.append(pd.Series([np.random.randn(),np.random.randn()], index=df.columns),
                         ignore_index=True)
    return df

t1 = time.time()
df1 = gen_df1(N)
print(df1.describe())
elapsed_time = time.time() - t1
print(f"elapsed time {elapsed_time} [s]")

def gen_df2(N):
    temp_dict = {}
    for i in range(0,N):
        temp_dict[i] = [np.random.randn(), np.random.randn()]
    df = pd.DataFrame.from_dict(temp_dict, orient='index')
    return df

t1 = time.time()
df2 = gen_df2(N)
print(df2.describe())
elapsed_time = time.time() - t1
print(f"elapsed time {elapsed_time} [s]")
```
- 参考にしたサイト
 - [andasのDataFrameのappendの高速化](https://takazawa.github.io/hobby/pandas_append_fast/)
 - [pandas.DataFrameに１行ずつ書き足す早い方法を調べた](https://qiita.com/studio_haneya/items/35951c56decd212ba41e)
golangでGoogleとOAuth2.0で彼女を作る

# 趣旨
素人おじさんですが、
golangでGoogleのOAuth2.0を使ってユーザー情報を取得する方法を学びました。

## 背景

- Google提供のLibraryをちゃんと使いたい
    - Libraryちゃんと使ったサンプルがあまり見当たらず
- 説明を省略しないで動くソースを示してほしい
    - 公式サイトも途中で「以下省略」

素人の私は迷子・・・試行錯誤をした後なんとか完成したので、その過程を紹介。

# 事前に必要なこと
## ライブラリ
GoogleのAPI用ライブラリをGet :heart: 
`go get -u google.golang.org/api/oauth2/v2`

## Google Developer Console
Google Developer ConsoleからAPIのCredentialsをGet :heart: 
https://console.developers.google.com/apis/

CredentialsのAuthorised redirect URIsに、本件で使うリダイレクト用URLを登録
`http://localhost:5001/loginr`

# ソース

### こんな子たちをimport :love_hotel: 

```
import (
	"net/http"
	"log"
  "fmt"
  "context"
  "golang.org/x/oauth2"
  "golang.org/x/oauth2/google"
  oauthapi "google.golang.org/api/oauth2/v2"
)
```

### まずはログインページ
あなたのページからGoogleログインページへ遷移URLするためのURLを作るよ

```
var conf = &oauth2.Config{
  ClientID:     "Your Client ID", //あなたのやつ
  ClientSecret: "Your Client Secret", //あなたのやつ
  Scopes:       []string{oauthapi.UserinfoEmailScope},
  Endpoint: google.Endpoint,
  RedirectURL : "http://localhost:5001/loginr",
}

//URLを作れるよ。 yourStateUUIDは本来はCSRF対策用UUIDを入れる。
conf.AuthCodeURL("yourStateUUID", oauth2.AccessTypeOffline)
```
このURLをてきとーなところのaタグに入れれば、Googleのログインページに遷移できるよ。

だいたいこんなURLができるはず
```
https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=Your+Client+ID&redirect_uri=http%3A%2F%2Flocalhost%3A5001%2Floginr&response_type=code&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email&state=yourStateUUIDroot@233cc47a021e
```


### リダイレクトページ
Googleが認証した後、Googleはあなたのサイト（指定したリダイレクトURL）にアクセスコード付きでリダイレクトしてくれるよ。
サーバー側では、そのアクセスコードを読み取ってGoogleにつないで、ユーザー情報をGet。


```

func LoginRHandler(w http.ResponseWriter, r *http.Request) {
  //パラメータからアクセスコードを読み取り
  code := r.URL.Query()["code"]
  if code == nil ||  len(code) == 0 {
    fmt.Fprint(w,"Invalid Parameter")
  }
  //いろいろライブラリが頑張って
  ctx := context.Background()
  tok, err := conf.Exchange(ctx, code[0])
  if err != nil {
  fmt.Fprintf(w,"OAuth Error:%v", err)
  }
  //APIクライアントができて
  client := conf.Client(ctx, tok)
  //Userinfo APIをGetしてDoして
  svr, err := oauthapi.New(client)
  ui, err := svr.Userinfo.Get().Do()
  if err != nil {
    fmt.Fprintf(w,"OAuth Error:%v", err)
  } else {
    //メールアドレス取得！
    fmt.Fprintf(w, "Your are logined as : %s",  ui.Email)
  }
}
```

同じような形で、いろいろなGoogle APIを呼べると思う。
GetしてDo

### 最後に
全ソースはこちら
https://play.golang.org/p/ghQ0_5bdBQ4

# おことわり
現代文明には疎いおじさんが書いています。
私の若い頃はパンチカードが主流だったので、キータもギットも素人です。粗相がありましても多めに見て頂きやさしくご指摘頂けますと幸いです。
深層学習の一般物体認識を実装したFPGAが民生品に採用された - Lovot　という名の家庭用ロボット -

先に
[CPUかGPUか専用回路か](https://qiita.com/nonbiri15/items/bbc97f92cb108646bc0b)
の記事を書いた。

[FPGAボード　Ultra96について調査中](https://qiita.com/nonbiri15/items/a9ae1a48610da06c7edc)
の記事も書いた。


最近(2019年12月)に、一般物体認識を実装したFPGAが民生品に採用された記事を見かけた。

[レグラスのAIカメラシステムが GROOVE Xの『LOVOTTM[らぼっと]』に採用](http://www.reglus.co.jp/181218.pdf)


![](https://lovot.life/common/images/technology/photo_01.jpg)

そのロボットの名前は[Lovot](https://lovot.life/)という
https://lovot.life/technology/
で深層学習でFPGAを使っていることを述べている。


東京近郊に在住の場合には、
以下の体験会に申し込んで、それらがどのように使われているのかを知ることができる。

https://lovot.life/trial/

追記：

以下の店舗で、実際にふれあうことができます。
[新宿高島屋　ロボティクススタジオ](https://www.takashimaya.co.jp/shinjuku/robotics/)
[大阪高島屋　ロボティクススタジオ](https://www.takashimaya.co.jp/osaka/robotics/)
名古屋高島屋　ロボティクススタジオ



参考

YouTube [Zynq UltraScale+ MPSoC 採用 レグラス社インテリジェントカメラ](https://www.youtube.com/watch?v=QDSDiE8vRFM)

[ロボットベンチャーGROOVE ＸのLOVOT大解剖：分解写真編、内部のハードウエアはどうなっているか](
https://xtech.nikkei.com/atcl/nxt/mag/rob/18/012600001/00050/)

[LOVOTの内部構造をGROOVE Xが大公開　可愛さはこうして作られた　頭脳に2つのCPUとFPGA　気になる出荷台数は?](
https://robotstart.info/2020/02/06/lovot-internal-structure.html)
unittest の雰囲気チートシート

## 概要

- unittest の雰囲気チートシート
- 雰囲気チートシートとはだいたいの考え方だけを思い出させるためのもの（今考えた）
- 詳細とか関数一覧とかはドキュメントとかほかの人の記事を見れば載っているのでそちらに譲る

## 雰囲気

凄くありがちなこの関数をテストしたいとします。

```sample.py
def my_add(a, b):
    return a + b

```
二つの引数の和を返す関数です。

そしてこれをテストするモジュールを作ります。
本当は `test` ディレクトリを別に作った方が親切なのですが、パスを通すのが面倒なので同階層に作ります。
お決まりの構成のあの unittest を書きます。

```test_sample.py
import sample
import unittest


class TestMyAdd(unittest.TestCase):
    def test_check_correct_result(self):
        result = sample.my_add(1, 2)
        self.assertEqual(result, 3)

if __name__ == '__main__':
    unittest.main()

```

 関数ひとつに対してテストクラスを一つ作り、必要なテストメソッドを実装します。
 `setUp()` という名前のメソッドを定義すればこのクラスが呼び出されたときに最初に呼び出されるので、前準備がいる場合はここに書きます。
 `tearDown()` という名前のメソッドをメソッドを定義すれば最後にこのメソッドが呼び出されるので、後片付けしたい場合はここに書きます。

実行したらどうなるでしょうか。こうなりますよね。

```
$ python test_sample.py
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK
```

ここで実装を間違えていて

```sample.py
def my_add(a, b):
    return a - b

```

なんて書いてしまっていた日には下のように教えてくれるわけです。

```
$ python test_sample.py
F
======================================================================
FAIL: test_check_correct_result (__main__.TestMyAdd)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "test_sample.py", line 8, in test_check_correct_result
    self.assertEqual(result, 3)
AssertionError: -1 != 3

----------------------------------------------------------------------
Ran 1 test in 0.001s

FAILED (failures=1)
```

ちなみに `.` が OK を表し、想定した結果になっていない `AssertionError` の場合は `F` が表示されます。
「合ってる / 合ってない」以前に想定しないエラーが発生した場合は `E` が出てきます。
わかりやすいですね。

いい感じに結果を出力しれくれるのは `unittest.main()` の働きです。
テストメソッドを単体で呼び出してもこういう親切な表示はされません。
また、だいたいテストはまとめて実行されるので `if __name__ == '__main__':` 節の中に入れておくのがよいですよね。

## まとめ
- 今は現場で pytest を使っているので unittest は使ってないです。
【図解】 Reactがブラウザに表示されるまでの流れとファイル間の関係

今回は、題名にあるようにReactのややこしい部分について簡単に図解をしました。
<b>ざっくり</b>理解することを目的に書きました！
だから、<b>初心者の方や、「React勉強したけど、なんだかもやもやする」「React久しぶりで、忘れちゃった！」という方向け</b>になっています。
-
ここで、僕がReactを学ぶことになった経緯やReactって何？ということについて少し書きたいと思います。
<b>（図だけ見たいねん、という方は飛ばしてください）</b>

僕は、現在大学３年生で、約1年前から大学内の施設でWebページ作成のアルバイトをしています。
アルバイトの方では、jsを使わずに開発をしているのですが、
今度学科の友達とハッカソンに出るにあたってフロントのことを任されてしまったので、笑
昨日から本腰を入れてjs周りを勉強し始めました。

JavaScriptに関しては、以前少し触れていたので、Reactから勉強することにしました。
（Reactとは、JavaScriptのライブラリのうちの1つです。元は、Facebook社が開発したものでしたが、効率的に見た目を開発できるということで人気になり、現在は、AirbnbやNetflixなどでも利用されています）

![IMG_8715.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352950/7339ff5b-e04e-193f-1bdf-2c9d8b8c4295.jpeg)

Reactは本当に構造がスッキリしていて、慣れたら早く簡単に記述できるようになると思います。この図を参考にして<b>今自分がどこのファイルのことを学んでいて、そこで何が行われているのか</b>を確認しながら勉強すれば、比較的容易に取得できると思うので、ぜひ参考にしてみてください！

--------
読んでいただきありがとうございました。
やはりアウトプットをするという意識を持つといいことが多いですね。
まとめることで自分の知識も定着するし、周りの人とも共有できる！
習慣化していきたい！！！
FirestoreのCollectionに対してIN句を投げたい

# はじめに

CollectionからMySQLのIN句のように複数条件どれかに一致するDocumentを全て取得してくる方法について試してみたのでその内容の記事となります。

QueryについてはwhereFieldは割と使用しているのですが、複数条件に一致するDocument全て取得したい場合どうやるっけ？と気になり試してみた次第です！

# 使用ライブラリ
今回の検証では[Pring](https://github.com/1amageek/Pring)を使用しております。
現在はdeprecatedとなっており[Ballcap-iOS](https://github.com/1amageek/Ballcap-iOS)で行わなかったのは、なるべく早く動作確認したかったため使い慣れているという点でPringで検証しました。

# データ作成


シンプルにnameのFieldをもつUserModelを定義してます。
このnameに対して複数条件どれかに一致するもの全てを取得してみようと思います。

```swift
@objcMembers
class User: Object {
    dynamic var name: String?
}
```

検証用のデータをFirestoreに保存

```swift
let userA: User = User(id: "1")
userA.name = "A"
userA.save()

let userB: User = User(id: "2")
userB.name = "B"
userB.save()


let userC: User = User(id: "3")
userC.name = "C"
userC.save()


let userD: User = User(id: "4")
userD.name = "D"
userD.save()
```

この段階でFirebaseのコンソール上でuserCollection以下に4つのDocumentが保存されていることが確認できます。
<img width="1136" alt="スクリーンショット 2019-05-08 0.13.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75593/6f7487f0-0054-d153-c740-41b6df81dd91.png">

#  Firestoreに対しIN句をかける

```swift
let option: Options = Options()
option.predicate = NSPredicate(format: "name IN %@", ["A", "D"])
User.query.dataSource(options: option).get().onCompleted { (_, users) in
    for user in users {
        print("user:\(user)")
    }
}
```

以下XcodeのLog

```
user:User {
  id: 1
  createdAt: FIRTimestamp: seconds=1557242226 nanoseconds=587824821>
  updatedAt: FIRTimestamp: seconds=1557242226 nanoseconds=587824821>
  name: Optional("A")
}
user:User {
  id: 4
  createdAt: FIRTimestamp: seconds=1557242226 nanoseconds=592360973>
  updatedAt: FIRTimestamp: seconds=1557242226 nanoseconds=592360973>
  name: Optional("D")
}
```

# 参考
[FirebaseFirestore Framework Document]( Reference[https://firebase.google.com/docs/reference/swift/firebasefirestore/api/reference/Classes/Query?hl=JA#filterusing:)

[NSPredicate](https://developer.apple.com/documentation/foundation/nspredicate)

[NSPredicate 全構文解説](https://qiita.com/yusuga/items/8fd531ebd8f5e72bb97b#in)
GKE で予め作成しておいたマネージド証明書を使って https 通信を設定する


```yaml
apiVersion: networking.gke.io/v1beta1
kind: ManagedCertificate
metadata:
  name: example-certificate
spec:
  domains:
    - example.com
```

のように `kind: ManagedCertificate` を使うと k8s が GCP の Managed Certificate (Let's encrypt を使って証明書を発行して自動更新してくれるサービス)を作ってくれる。

ref. https://cloud.google.com/kubernetes-engine/docs/how-to/managed-certs

しかし、このやり方だとGCPのマネージドSSL証明書を k8s が作成することになり気持ち悪かった(個人の見解です)ので、予めマネージドSSL証明書をTerraformで作成して設定するようにしたメモ。

## やり方

GCP で Managed Certificate を作っておく。terraform だとこんな感じ。

```
provider "google-beta" {
  project = "<project-name>"
}

resource "google_compute_managed_ssl_certificate" "api-cert" {
  provider = "google-beta"

  name = "api-cert"

  managed {
    domains = ["api.sslcert.tf-test.club"]
  }
}
```

あとは k8s で kind: Ingress の `ingress.gcp.kubernetes.io/pre-shared-cert` にあらかじめて作っておいた cert を指定する。

```yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: api-ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: "api-ip"
    ingress.gcp.kubernetes.io/pre-shared-cert: "api-cert"
spec:
  backend:
    serviceName: api
    servicePort: 80
```
「ValueError: Object arrays cannot be loaded when allow_pickle=False」というエラーについて

# エラーについて
よくあるIMDB のデータセット読み込み時に、突然エラーが発生した。
比較的最近のエラーのようなので記録しておきます。

```python
(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)
```

↑ここでエラー発生↓


```bash
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/keras/datasets/imdb.py", line 86, in load_data
    x_train, labels_train = f['x_train'], f['y_train']
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/numpy/lib/npyio.py", line 262, in __getitem__
    pickle_kwargs=self.pickle_kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/numpy/lib/format.py", line 692, in read_array
    raise ValueError("Object arrays cannot be loaded when "
ValueError: Object arrays cannot be loaded when allow_pickle=False
```

おおむねこんな感じのエラーが出る

# 解決法

numpyをダウングレードする。

```python
# アンインストール
pip uninstall numpy

# ダウングレードしてインストール
pip install numpy==1.16.2

# インポート
import numpy as np
```

また、もしGoogle ML engineのNotebook使いの場合は以下のようにpip3で行う。

```python
!pip3 uninstall numpy -y

!pip3 install numpy==1.16.2
import numpy as np
```

このあと、カーネルの再起動/ランタイムの再起動をしておくように。
Kernel -> Restart Karnelです。


# 参考
[The Keras examples should load data with allow_pickle=True](https://github.com/tensorflow/tensorflow/issues/28102)
Ubuntu 16.04でnormanキーボードレイアウト

(2019/05/08 追記)

setxkbmapを使う等の情報しか見当たらなかったので書いておきます。

実はシンプルでした。

![Screenshot from 2019-05-08 00-08-35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294073/202110bd-def3-0985-3553-2575eb50204c.png)

入力メソッドの設定で英語キーボードをNormanレイアウトで先頭に持ってきて、Mozcも含めてレイアウトをNormanにするだけ。
ただしログイン後一度super+spaceで切り替えしないと最初はqwertyになっている。

----

ちなみにWindowsは、AutoHotKeyを使って切替にしました。
レイアウトはhttps://github.com/uehr/Key-Layouts/blob/master/norman.ahk のを借りました。`@::vkBAsc028`の部分はv1.1.30の場合`@::vkBA`に変える必要がありますが使ってません。

借りたのを元にやや変更したのを https://gist.github.com/Yoshinobu-Ishizaki/0a85bb29c171987eb7d79f0ff6d9d9c7 に置きました。
記号類も含めて変わるようにしてます。
Ctrlキーとかとの組合せ部分はコメントアウトしてあります。Ctrl-NとかもNormanにして一刻も早く慣れるため。

~~Macはまだ試してません。~~
https://normanlayout.info/ からダウンロードしてインストールした後、一度再起動してシステム環境設定→キーボード→入力ソースで、Normanを追加すればOKでした（うちのMacは古くてEl Capitanですが）。
Cmd+spaceでNormanレイアウトを選ぶと、その後は「英数」、「かな」キーにてNormanレイアウトなローマ字日本語入力と切り替えられました（Google日本語入力の場合）。
エックスサーバーで 500 Internal Serverがよく出現する。対処方法は？

#エックスサーバーで 500 Internal Serverがよく出現する

特にエラーがないサイトなのに、500 Internal Serverがよく出現する理由と、最も安易な方法で、軽減する方法を紹介します。

##原因
500 Server Error ではありますが、サーバーのCPU等のリソースの利用のしすぎです。

##1.コードを極力軽量化する。
メモリは食っても構いません。出来る限りCPU時間を短くするようにコーディングします。

##2.簡単な対処法 サーバーキャッシュをすべてのファイルでONにする

コントロールパネルからも設定できますが・・・

```.htaccess
SetEnvIf Request_URI ".*" Ngx_Cache_NoCacheMode=off
SetEnvIf Request_URI ".*" Ngx_Cache_AllCacheMode
```
この設定を行なって、すべてのファイルを、nginxに1～2分間キャッシュさせるようにしましょう。

ただし、サイトによってはこの設定を行なうと、問題が起きる場合があります。

##3.不要なbot避けをする
2019年4月現在

```.htaccess
SetEnvIf User-Agent "AhrefsBot" jogai
SetEnvIf User-Agent "Baiduspider" jogai
SetEnvIf User-Agent "Baiduspider+" jogai
SetEnvIf User-Agent "BaiduMobaider" jogai
SetEnvIf User-Agent "DeuSu" jogai
SetEnvIf User-Agent "Dataprovider" jogai
SetEnvIf User-Agent "HaosouSpider" jogai
SetEnvIf User-Agent "MJ12bot" jogai
SetEnvIf User-Agent "proximic" jogai
SetEnvIf User-Agent "SeznamBot" jogai
SetEnvIf User-Agent "YandexBot" jogai
SetEnvIf User-Agent "SemrushBot" jogai
SetEnvIf User-Agent "AhrefsBot" jogai
SetEnvIf User-Agent "Linguee" jogai
SetEnvIf User-Agent "proximic" jogai
SetEnvIf User-Agent "BLEXBot" jogai
SetEnvIf User-Agent "GrapeshotCrawler" jogai
SetEnvIf User-Agent "Mappy" jogai
SetEnvIf User-Agent "MJ12bot" jogai
SetEnvIf User-Agent "MegaIndex" jogai
SetEnvIf User-Agent "bidswitchbot" jogai
SetEnvIf User-Agent "SMTBot" jogai
SetEnvIf User-Agent "ltx71" jogai
SetEnvIf User-Agent "integralads" jogai
SetEnvIf User-Agent "jet-bot" jogai
SetEnvIf User-Agent "trendictionbot" jogai
order Allow,Deny
Allow from all
Deny from env=jogai
```
##4.bingのクローラーの時間を調整する
全時間帯にアクセスが平均化するように設定すると、最も良いです。
https://www.bing.com/toolbox/webmaster

なお、googleのクローラーは調整できません。

##5.phpに移植する
phpですと、全く違ったリソースで管理されているので、手間はかかるものの、最もスマートに対処することができます。

#しかし、この制限は厳しいかな？
エックスサーバー上にある程度多人数のWebチャットCGIを設置するのはほぼ不可能でしょう。
getting started: Python で Web UI (with Flask)

## 背景

* Web 系の実装を少しくらいは自分でできるように、
前回は [SQLite3](https://qiita.com/nobilearn/items/7904d695824d04aeff3a) の使い方を勉強した。

* 今回は、UI 部分を Flask を使って実装します。

---

## 構成

1. トップページ (index)
1. 情報閲覧ページ (view DB)

---

### Flask service の起動 + index の定義

~~~python
from __future__ import absolute_import, division, print_function, unicode_literals

import sys
import os
import sqlite3
from flask import Flask, render_template, request

app = Flask( __name__)

@app.route( '/')
def index() :

    return  "{}".format( sqlite3.__path__)

def main( argv) :

    host_ip     = argv[1]
    host_port   = int( argv[2])

    app.run(    host    = host_ip,
                port    = host_port )

if __name__ == "__main__" :

    if len( sys.argv) < 3 :
        print( "USAGE: {:s} [ip] [port]".format( sys.argv[0]))
        sys.exit( 1)

    main( sys.argv)
~~~

---

### view DB

* 前回作った example.sqlite3 を使います。

~~~python
@app.route( '/view')
def view() :

    ''' SQLite3 '''
    s3f = 'example.sqlite3'

    if not os.path.exists( s3f) :
        print( "SQL file not found.")

    con = sqlite3.connect( s3f)
    c   = con.cursor()

    c.execute( "select * from logs")
    data    = c.fetchall()

    con.close()

    return  render_template( "view.html", result = data)
~~~

#### templates/view.html

~~~html
<html>
  <body>
    <table border="1" cellspacing="0" cellpadding="4">
      {% for line in result %}
      <tr>
        {% for item in line %}
          <td align="right"> {{ item }} </td>
        {% endfor %}
      </tr>
      {% endfor %}
    </table>
    <br/>

    <a href="/">Go TOP</a>
  </body>
</html>
~~~

---

## おわり
Unityで画像を丸く切り抜いて枠をつける方法

## Unityで画像を丸く切り抜いて枠をつける方法
丸くしたい対象がSpriteだとします。
そのSpriteの親オブジェクトにSprite Maskとして円形の画像を配置して子のSpriteを丸くします。

これだけだとフチがギザギザしてしまうので、枠のために輪っか状のpng画像を用意して、Sprite MaskをつけたオブジェクトにSpriteとして輪っか状のpng画像を配置します。

参考になれば幸いです。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
ある技術屋の述懐

あれは……そう、最初は SCSI ハードディスクの読み取りスループットを計測するだけの、簡単な仕事だった。

ブロックのサイズを変えて、 OS のキャッシュに収まらないように、ひたすら読み取りを繰り返しては時間を測るだけだったね。

簡単に予想がつくように、ブロックを長くするほどスループットが良くなるという結果が得られたよ。 OS の制限内最大の 512 KiB ブロックが最良だった。

そこから何を間違ったのか、あるいは最初から間違いだったのか。そのスループットを VOD サーバーに使う話になっていたよ。 SCSI ハードディスクを複数接続して、アプリケーション レベルでストライピングをかけて、複数の端末に MPEG ビデオを流そうって話だ。

そこからはいろいろと大変だった。非同期 I/O がないのに複数のディスクに並列アクセスしようっていうんだ。どうやって実現するか、そこは頭をひねったね。

結局ユニットごとにスレッドを貼り付けて、非同期 I/O に見せかけることにしたよ。全く無茶にも程があるだろう。

どうにかこうにか非同期 I/O のようなことができるようになった頃、今度は展示会でデモンストレーションをするという話が降ってきた。複数の MPEG ストリームを扱えるように、ディスク上の論理構造を適当にでっち上げることになったね。それは実行中のデータ追加も削除も考慮しない間に合わせに過ぎなかったが、ビットレートに基づいたブロックの先読みは実現していた。

実際、デモンストレーションはうまく行ったのだろう。いつの間にか商品化の話に膨らんでいたよ。データ管理機能すら実装していなかったのにね。

そのプロジェクトからは結局途中で離れてしまったので、その後どうなったのかは知らないが、ビジネスとして成功したという報道を目にしたことは一度もなかった。

これは、日本がまだそんなことに挑戦していた頃の昔話である。
【GAS】Googleカレンダーでポモドーロ・テクニック

#内容
スマートウォッチの通知機能でポモドーロするために作りました。
事前処理としてカレンダー側でポモドーロ用のカレンダーを作るのと通知の設定で5分前30分前を加えてください。
GAS側はポモドーロカレンダー取得→昨日のカレンダー削除→今日のカレンダー製作を日付タイマーで夜中に実行させます。
#GAS
```javascript
function makePomodoro() {
  const id = 'ポモドーロカレンダーID'
  const calendar = CalendarApp.getCalendarById(id)
  const today = new Date;
  const y = today.getYear();
  const m = today.getMonth();
  const d = today.getDate();
  const yesterday = new Date(y, m, d - 1);
  
  //昨日のポモドーロの削除。消さなくても良いが見た目が悪くなるので
  calendar.getEventsForDay(yesterday).map(function(e) {
    e.deleteEvent()
  })
  
  const start = 7
  const end = 22
  for(var t = start; t <= end; t++) {
    calendar.createEvent('Pomodoro', new Date(y, m, d, t, 0), new Date(y, m, d, t, 29));
    calendar.createEvent('Pomodoro', new Date(y, m, d, t, 30), new Date(y, m, d, t, 59));
  }
}
```
#コメント
GoogleカレンダーIDはGoogleカレンダー設定→対象のカレンダーの”カレンダーの統合”の部分にあるカレンダーIDです。（＠マークを含む）
#参考資料
Calendar Service | Apps Script | Google Developers
https://developers.google.com/apps-script/reference/calendar/
公式のリファレンス。必読。
[AWS]DeepArchiveに放り込んだら料金を見とけ！

# ざっくりいうと
awsのDeep Archiveを見つけて「もうＨＤＤなんて卒業だ！」と大量に大きいファイルのアップロードを仕掛けたら謎の料金請求が止まらず焦って調べたら、マルチパートアップロードが途中で止まった場合、アップロード途中のデータ分がS3料金で請求されるとわかった話。
対策もあるので、以下をご覧ください。

# ことのはじめ
2019年のGWは10連休でした。
普通の連休ではできないようなことができましたね！
私は…バックアップ体制の見直しをしました。
…って個人のファイルなんですけど。でも重要でしょ？

これまでは500GBの外付けハードディスクに保存してました。
でも…もう7年以上（！）使ってましたし、なんともセキュリティ確保のために毎度暗号化するのも面倒だなぁと思ってました。
もう少しGlacierの料金が下がらないかなぁ…と思っていたら！！

https://aws.amazon.com/jp/blogs/news/new-amazon-s3-storage-class-glacier-deep-archive/

これいいじゃない！
$0.00099 per GB-Month
0.00099USD/GBって、1TB使っても$0.99って月100円！
バックアップのためにＨＤＤ買うなんてもうやめた！っていう料金に喜んで手を出しました。

# 大量にデータをアップロード
HDDに入っていた200GBぐらいのデータを昼夜問わず複数のセッションで一気に上げました。
途中で失敗しても、再度やり直せばいいんでしょ？ぐらいの気持ちで。
で、実際に何回か失敗したんですけど、まぁ平成の内にやり切ったわけですわ。
でもここに落とし穴が…

# 安いはずなのに…
令和になって、毎日のように請求料金を見ていたわけです。
すると…
```
Amazon Simple Storage Service USW2-TimedStorage-GDA-Staging $0.06
```
はぁ？
```
$0.021 per GB-Month of storage used in GlacierStagingStorage 2.955 GB-Mo
```
開始5日で3GB弱ってことは実際のところ18GBぐらいがどこかにあるってか？
GlacierStagingStorage？ステージングストレージって何？
何これ！レートこれ高いだろ！高すぎ！

ネットでこれ！ということがググってもなかなか出てこない。
で、いろいろ詮索しているうちに…

[マルチパートアップロードの概要](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/mpuoverview.html#mpu-abort-incomplete-mpu-lifecycle-config)

ここにたどり着きました。

```マルチパートアップロードと料金
マルチパートアップロードを開始すると、
アップロードを完了または中止するまで
すべてのパートが AmazonS3 によって保持されます。
```

はぁ

```バケットライフサイクルポリシーを使用した完了しないマルチパートアップロードの中止
マルチパートアップロードを開始したら、パートをアップロードし始めます。
（中略）
マルチパートアップロードの完了リクエストが正常に送信されなかった場合、
Amazon S3 はパートを組み立てず、オブジェクトを作成しません。 
したがって、パートは Amazon S3 に残るため、
Amazon S3 に保存されたパートに対して支払いが発生します。
ベストプラクティスとして、ストレージコストを最小限に抑えるため、
ライフサイクルルールを設定することをお勧めします 
```

つまり…

- アップロードに失敗したらS3に残骸が残りっぱなしになるからね
- それがいやならライフサイクルに設定しなさいよ

そういうこと？？
残骸を確認するすべは請求を見て「-Staging」というキーワードが含まれているか確認するしかないという…（S3の実態ファイルとして見えない）
[ここをみてもわかるけど](https://console.aws.amazon.com/billing/home#/reports/usage)たどり着けるかどうか…

そういうわけでライフサイクルに設定した。
![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219000/b7844663-17dc-a64a-c464-7f6536b2d781.png)

#終わりに
やっぱり新サービスを使ったら料金を確認しないと何が起きているかわからない。
私はこれに3日使いました。
救われた方はイイネ！してね。

ではでは。