OmniAICreator/Qiita-1.07M huggingface dataset:
[Python]Matplotlibによる極座標表示の散布図

# 極座標表示の散布図

add_subplotの引数にprojection='polar'を指定することで極座標にできる。

```
import numpy as np
import matplotlib.pyplot as plt

N = 100
r = np.random.rand(N)
theta = 2 * np.pi * np.random.rand(N)

fig = plt.figure(figsize=(8,8))
ax = fig.add_subplot(111, projection='polar')
ax.scatter(theta, r)
ax.set_title('Polar coordinates',fontsize=18)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100523/1b9645bd-d280-9a9d-7a78-e2a9d8f4cf7d.png)

# 点の大きさ

```
import numpy as np
import matplotlib.pyplot as plt

N = 100
r = np.random.rand(N)
theta = 2 * np.pi * np.random.rand(N)

fig = plt.figure(figsize=(8,8))
ax = fig.add_subplot(111, projection='polar')
ax.scatter(theta, r, s=100)
ax.set_title('Polar coordinates',fontsize=18)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100523/2a211535-2288-cc14-fa2c-6daf362b5ea8.png)

# 角度の範囲指定

```
import numpy as np
import matplotlib.pyplot as plt

N = 100
r = np.random.rand(N)
theta = 2 * np.pi * np.random.rand(N)


fig = plt.figure(figsize=(8,8))
ax = fig.add_subplot(111, projection='polar')
ax.scatter(theta, r)
ax.set_title('Polar coordinates',fontsize=18)
ax.set_thetamin(0)
ax.set_thetamax(180)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100523/f0651eb2-d73c-41d2-6d69-d09079cda63d.png)

# r方向の範囲指定

```
import numpy as np
import matplotlib.pyplot as plt

N = 100
r = np.random.rand(N)
theta = 2 * np.pi * np.random.rand(N)

fig = plt.figure(figsize=(8,8))
ax = fig.add_subplot(111, projection='polar')
ax.scatter(theta, r)
ax.set_title('Polar coordinates',fontsize=18)
ax.set_rmin(0)
ax.set_rmax(0.5)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100523/12621981-5ed7-6873-6d36-9e185cf9fce3.png)

参考URL https://matplotlib.org/3.3.1/gallery/pie_and_polar_charts/polar_scatter.html
【PHP】初心者が実務でnumber_format()にハマった話

#はじめに

PHPを扱い始めて1ヶ月程度の駆け出しエンジニアです。

本日の業務中に私個人の勝手な思い込みで必要以上にハマってしまいました。
反省もかねて自宅で色々と検証をしてみました。

コード検証はいつもお世話になっている[paiza.io](https://paiza.io/ja)を使用。

#number_format()とは

ざっくり説明すると
4ケタ以上の数字を3ケタ区切りの表記にフォーマットする関数です。

簡単な例

```php
<?php
$int = 10000;
echo number_format($int);
?>
```
<br>
出力結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588983/5ab39bf8-e87a-d67f-1b92-1dac7dbb57b3.png)


このように3ケタずつ区切りをつけることで
画面表示した際の見やすさを助ける役割があります。

ここ最近、経理部門が使うプログラムの改修作業をしていたので
ブラウザに出力する数値にはこのnumber_format()を使う、と頭に入れていました。


#勘違いでハマる
データベースから必要な数値を取り出す際にデータ型が全部int型なのは確認しておりました。
なので、データベースから取り出した数値同士で足し引き計算などを行い、それをブラウザに出力する時には

```php
<?php
$int1 = 10000;
$int2 = 50000;

$int_disp = $int1 + $int2;
echo number_format($int_disp);
?>

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588983/2594ee9b-7a4e-ded4-d2e5-2f0f2803c453.png)
素直にこうしておけば良かったところ...。

<br/>
何を血迷ったのか

```php
<?php
$int1 = 10000;
$int2 = 50000;

$int_disp = number_format($int1) + number_format($int2);
echo $int_disp;
?>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588983/d92cfdfa-e0c8-ce8a-6799-7daf418f9358.png)
**おい!!!! うまく表示されないやんけ!!!!**

てな感じで勝手に自爆しておりました。

#理由
データベースから取り出してきた値はint型なのですが
number_format()でフォーマットすることでstring型になります。
※当たり前のことです。。。

```php
<?php
$int1 = 10000;
echo gettype($int1)."\n";

$int2 = 50000;
$int2_disp = number_format($int2);
echo gettype($int2_disp);
?>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588983/b9b75aec-9212-0f83-b16e-28e9170fbd17.png)

厳密に言うと
ブラウザ上で表示はされていたのですが、計算結果の値がめちゃくちゃでした。
それを私は（計算式やデータベースに格納されるまでの流れを確認しなければ...!!）
と、見当違いの調査に時間を使い過ぎてしまいました。

恥ずかしい限りです。

変数の型に、もっと意識を向けないといけない、と痛感した1日でした。
4連休に入りますが、連休明けにロスを少しでもカバーできるようにしっかり学習しようと思います。

視野を広く持ち、落ち着いて業務できるように日々精進あるのみ。


#おまけ
number_format()にかけると、string型になるので
文字列の連結として、以下の文法は適用されます。
使いどころは全くないと思うので、オマケ。
（3ケタ区切りとは）

```php
<?php
$int1 = 10000;
$int2 = 50000;
$int_disp = number_format($int1).number_format($int2);
echo $int_disp;
?>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588983/21f8c888-06a4-f915-3c06-059ad2ae9546.png)
Visual Studio Community 2019 PreviewでC++20 Rangesの主要部分がサポートされた

まだプレビュー版なので開発には使えませんが、Visual Studioのプレビュー版（Microsoft Visual Studio Community 2019 Preview Version 16.8.0 Preview 3.0）でC++20のRanges主要機能がサポートされました。

コンセプトと合わせてとてもおもしろい機能だったので、興奮が冷めないうちにRangesとRange adaptorsについて学んだことを記録します。経験に基づく自己流の解釈なので間違っていたら教えてください。

コードの実行時はプロジェクトのプロパティで「C++言語標準」を`/std:c++latest`に設定します。

[ Visual Studio 2019 version 16.8 Preview 3 - Visual Studio 2019 Preview Release Notes](https://docs.microsoft.com/ja-jp/visualstudio/releases/2019/release-notes-preview#16.8.0-pre-3.0)

# Rangesとコンセプト

Rangesは次の`range`のような「コンセプト」を満たす型やそれらに与えられる機能の総称？です。`range`コンセプトの他にも`common_range`や`viewable_range`が存在します。

```cpp
template<class T>
concept range = requires(T& t) {
  ranges::begin(t);
  ranges::end(t);
};
```

参考：[https://en.cppreference.com/w/cpp/ranges/range](https://en.cppreference.com/w/cpp/ranges/range)。見やすさのために一部改変。

コンセプトはC++20から導入されたので聞き慣れない単語ですが、これまでメタ関数で複雑に記述していた型の制限をより分かりやすく記述するための方法です。例えば上記の`range`（`std::ranges::range`）は`ranges::begin(t)`と`ranges::end(t)`が適用できるあらゆる型です。

`range`にはSTLコンテナでは`std::vector`、`std::list`等が該当しており、`begin`と`end`を実装する自作のクラスや構造体も該当します。例えば`std::views::transform`は`range`から派生したコンセプト`viewable_range`に従う型に適用できるので以下のコードが書けます。

```cpp
#include <iostream>
#include <ranges>
#include <vector>

class test {
public:
	test() : v{ 0, 1, 2, 3 } {}
	auto begin() { return v.begin(); }
	auto end() { return v.end(); }
private:
	std::vector<int> v;
};

int main()
{
	test t;
	auto mul2 = [](int x) { return x * 2; };
	for (auto x : t | std::views::transform(mul2))
		std::cout << x << std::endl;
	// 0, 2, 4, 6
	return 0;
}

```

# Range adaptors

上のサンプルコードに`| std::views::transform(...)`という記述が登場しています。このときの呼び出しを順番に説明すると以下の通りです。

1. `std::views::transform`は`std::views`名前空間で定義された`_Transform_fn`型の変数。
1. `_Transform_fn`型は`_Copy_constructible_object`コンセプトを満たす型`_Fn`に対する`operator(_Fn _Fun)`を定義しており、`transform(...)`はこれを呼び出す。
1. 上記の`operator(_Fn _Fun)`は`_Transform_fn`型でprivate定義された`_Partial<_Fn>`型のオブジェクトを返す。
1. `_Partial<_Fn>`型は`_Pipe::_Base<_Partial<_Fn>>`型から派生しており、この`_Pipe::_Base<_Partial<_Fn>>`型が定義する右辺用の`|`演算子が呼び出される（`| std::views::transform(...)`の`|`）。
1. `_Partial<_Fn>`型は`transform_view`を返す`()`演算子を定義しており、上記の`|`演算子がこれを呼び出す。

`<ranges>`の中を行ったり来たりしますが、コンセプトという新機能を使った見事な仕組みです。
コードでわかる$this->入門

なんとなく`$this`や`->`を使ったり、`$this`や`->`ってなんだって思った駆け出しの方への記事です
かなり大雑把に説明していますが、これくらいの方が最初はイメージがつかみやすいと思います
他の素晴らしい記事の橋渡しになれば幸いです。

`$this`はオブジェクト自身を表す特別な変数で
`->`はオブジェクトのメソッドやプロパティにアクセスするために使うアロー演算子というものです。
実際にコードで見ていきましょう。

```php:example.php
<?php
//クラス
class Example {
    //プロパティ初期化
    public $int1 = 100;
    public $int2 = 200;
    //メソッド    
    function show()
    {
        //ローカル変数
        $int1 = 'int2';
        echo $this->int1;
        echo $this->int2;
        echo $this->$int1;
    }
}
//インスタンス化
$test = new Example();
//オブジェクトのメソッドを呼び出す
$test->show();
echo '------------';
//プロパティを変更する
$test->int1 -= 1;
//取得
echo $test->int1;
$test->show();
```

この実行結果は以下のようになります

```
100
200
200
----------
99
99
200
200
```
`$this->$int1`は`$this->int2`に変換されるのがミソ
プロパティもメソッドも`->`で呼び出すことができる
またメソッドチェーンという連結する書き方もできる
`$this->test()->example()`みたいな感じ
krpanoとeverpano



３Dショップを作る際に利用したい
https://krpano.com/plugins/userplugins/easyhtmllightbox/#top
https://krpano.com/plugins/userplugins/circlehotspots/#top
https://krpano.com/plugins/userplugins/easyhtmllightbox/#top
https://krpano.com/plugins/userplugins/fuzzysearch/#top
https://krpano.com/plugins/userplugins/htmlpage/#top
https://krpano.com/plugins/userplugins/stepbystepguide/#top
https://krpano.com/docu/localusage/#top
https://everpano.com/crash_course.php

ARにいくべきなんだけど、一旦モックとして作成する３Dショップにはこれらを使う予定
(Ruby on Rails6) 投稿データを新しい順に並び替える方法(ソート順序)

#まえがき
ここでは、投稿データを<strong>新しい順</strong>に並び替える方法を忘却録として記録します。
投稿順を実装できると、twitter や ブログサイトみたいですね。

#投稿データを新しい順に並び替える
ここでは

```rb:app/controllers/コントローラー名_controller.rb
class PostsController < ApplicationController
  def アクション名
    @コントローラー名 = データベース名.all
  end
・
・
end
```

例

```rb:app/controllers/コントローラー名_controller.rb
class PostsController < ApplicationController
  def index
    @posts = Post.all
  end
・
・
end
```

により、全ての投稿内容をViewで表示させたことを前提に記録しています。

##アクションコントローラーの変更
先ほどのアクションを記述します。

```rb:app/controllers/コントローラー名_controller.rb
class PostsController < ApplicationController
  def アクション名
    @コントローラー名 = データベース名.all
    @コントローラー名 = データベース名.all.order(created_at: :desc) ←これ
　　(例)
　　@posts = Post.all.order(created_at: :desc)
  end
・
・
end
```

###記述項目について
```rb:app/controllers/コントローラー名_controller.rb
    @コントローラー名 = データベース名.all.order(created_at: :desc)
    @posts = Post.all.order(created_at: :desc)
```

・<strong>order</strong>メソッドは、投稿データの順序(ソートの順序)を変更
・<strong>created_at</strong>属性は、データの制作日時
・<strong>desc</strong>は、並び替え(ソート)の降順

を表しています。
また、ここで気を付けたいのは @コントローラー名 = データベース名.all を削除せずに、下にoderメソッドの内容を記述することです。

##ブラウザでの確認

ここまでできたら、ブラウザ確認をしましょう。
※テキスト・タイトル1(古い)　→ 4(新しい)

```terminal:コマンド
    rails s
```
http://localhost:3000/

(oderメソッド前)
![rails6-oder-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262991/5ef62f09-eea8-6648-ece3-07106c2039fc.png)
↓
(oderメソッド後)
![rails6-oder-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262991/b10c6d32-ac29-36c6-f267-f5e2dcec5083.png)

以上で、実装できました。

#あとがき
ここまで読んでいただき、ありがとうございました。
無事に降順の設定ができてよかったです。
<strong>orderやdesc</strong>など覚える単語がありますね。

#参考リンク

<a href="https://www.amazon.co.jp/Ruby-Rails-%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-impress-gear/dp/4295008052" target="blank">RubyonRails6実践ガイド</a>


#Myリンク
また、Twitter・Portfolio のリンクがありますので、気になった方は
ぜひ繋がってください。プログラミング学習を共有できるフレンドが出来るととても嬉しいです。

<a href="https://twitter.com/0819_tateishi" target="blank">Twitter</a>
<a href="https://ayu-portfolio.herokuapp.com/" target="blank">Portfolio</a>
<a href="https://github.com/ayu0819" target="blank">Github</a>
yukicoder contest 266 参戦記

# yukicoder contest 266 参戦記

## [A 1229 ラグビーの得点パターン](https://yukicoder.me/problems/no/1229)

N≦100なので全探索で問題ないので、「コンバージョンはトライ後のキックなので必ずトライ数以下になることに注意してください」だけ注意して全探索すれば良い.

```python
N = int(input())

result = 0
for i in range(N // 5 + 1):
    for j in range(i + 1):
        for k in range(N // 3 + 1):
            if i * 5 + j * 2 + k * 3 == N:
                result += 1
print(result)
```

## [B 1230 Hall_and_me](https://yukicoder.me/problems/no/1230)

すべての確率を計算して最大値を取ればいい. ある宝箱にダイヤモンドが入っている確率を x とすると、STAY の場合は入ってた時に当たるので確率 x、CHANGE の場合は入ってなかった時に当たる(何故なら指定しなかったハズレの宝箱を開けてもらえるので、もし指定した宝箱に入っていなかったら CHANGE 先が確実に入っている宝箱になる)ので確率 1 - x となる.

```python
P, Q, R = map(int, input().split())

a = P / (P + Q + R)
b = Q / (P + Q + R)
c = R / (P + Q + R)

print(max(a, b, c, 1 - a, 1 - b, 1 - c))
```

## [C 1231 Make a Multiple of Ten](https://yukicoder.me/problems/no/1231)

DPの典型問題. それぞれのカードを取る取らないを、カードに書かれた整数の総和を10で割った余りをインデックス、取ったカードの枚数を値とし、取ったカードの枚数の最大値を取る DP をすれば良い.

```python
N, *A = map(int, open(0).read().split())

dp = [-1] * 10
dp[0] = 0
for a in A:
    t = [-1] * 10
    for i in range(10):
        if dp[i] == -1:
            continue
        if t[i] < dp[i]:
            t[i] = dp[i]
        n = (i + a) % 10
        if t[n] < dp[i] + 1:
            t[n] = dp[i] + 1
    dp = t
print(dp[0])
```

## [D 1232 2^x = x](https://yukicoder.me/problems/no/1232)

フェルマーの小定理より a<sup>p-1</sup> ≡ 1 (mod p) なので a<sup>(p-1)<sup>2</sup></sup>≡1 (mod p) なのだが、(p-1)<sup>2</sup> = p<sup>2</sup>-2p+1≡1 (mod p) なので (p-1)<sup>2</sup> が概ね答えになる. フェルマーの小定理にはaとpは互いに素という条件があるので、p=2だけはこの答えが使えないが、2の場合の答えはサンプルにある.

```python
N, *p = map(int, open(0).read().split())

for x in p:
    if x == 2:
        print(2)
    else:
        print((x - 1) * (x - 1))
```
勉強日誌13日目

来週からテレワークなので勉強時間に余裕ができるけど仕事その分忙しくなる！！

だけど早く目標に達するために頑張ろう
来年には年収倍目指したい！

正答率　65%（正答率65%）

nmcli device connect
nmcli device disconnect
インターフェースを接続、切断

none
どのネットワークにも接続していない

limited
ネットワークに接続しているが、インターネットにアクセスできない

nameserver
DNSサーバを指定する

nmtui
cursesベースのインターフェースを持つ・・・・

/etc/hosts
数字　　　localhost
数字　　　server

nmcli device wifi connect
Wi-fi　アクセスポイントに接続するためのデバイス作成

/etc/sysconfig/network
Red Hat系　ネットワーク　昨日の有効/無効
NETOWORKING=yes
HOSTNAME=CentOS
GATEWAY=///

domain
search
/etc/resolv.confで名前解決時に付加するドメイン名

nmcli device wifi list
nmcliコマンドでWi-fiアクセスポイントの表示

/etc/hostname
Debian系のディストリビューションでホスト名を設定

nmcli device show 
nmcliコマンドでインターフェースのアドレスなどの詳細情報を表示

正答率　62%　（60%）

tracepath6
IPv6で宛先アドレスまでの経路とPathMTUを確認するコマンド

ip addr add IP /サブネット.0 dev インターフェース

nc
標準入出力
TCP/UDPでのデータ送受信、簡易的なサーバになれる

-c 数字
ping/ping6コマンドの疎通確認用パケット送信回数

netstat -i
ネットワークインターフェースの統計情報

netstat -n
有効なネットワーク接続や開いているソケットを名前解決なしで

netstat
有効なネットワーク接続や開いているソケットを表示

route del default gw デフォルトゲートウェイ
削除

route
netstat -r
ルーティングテーブルの表示

route del default
デフォルトゲートウェイの削除

ping
ICMPを使ってリモートホストとの基本的なネットワークの接続確認を行う

ping6
IPV6で宛先アドレスに到達可能かを確認するコマンド

whois
ドメインの登録者の情報を問い合わせる

ip route add 宛先ネットワークアドレス/サブネットマスク　via ゲートウェイ

ifconfig
ネットワークインターフェースの情報(1コマンド)
Git のコマンドいろいろメモ

今までSVNを使っていて Git になって commit, push ってなんだという状態だったのでざっくり使うコマンドをメモする。
コマンドで記載しているがGUI操作が多いので間違ってたらごめんなさい。。。

##### リポジトリ作成
```
git init
git init ${repository_name}
```
##### リポジトリ取得（クローン）
```
git clone ${URL}
```
##### リポジトリ最新化
```
git pull
```
##### リポジトリ最新化（変更上書き）
```
git fetch origin
git reset --hard origin/master
```
##### ブランチ作成
```
git checkout master
git pull
git branch ${branch_name}
```
##### インデックス追加（コミット前処理）
```
git add -A
git add ${path}
```
インデックスは仮コミットみたいな感じかな。。。
##### インデックス確認
```
git status
```
##### インデックス削除
```
git reset
git reset ${path}
```
##### コミット（ローカルに、リモートはまだ）
```
git commit
git commit ${path}
git commit .
```
commit のみはインデックス追加したやつをコミット
. つけるとインデックス追加しなくてもコミットできるが新規ファイルがコミットされない
##### コミット取り消し
```
git reset --soft
git reset --hard
```
soft は変更ファイルのこる
hard は変更ファイル残らない
##### プッシュ（リモートにコミット）
```
git push
```
##### ブランチ->マスタ反映
```
git checkout master
git pull
git merge ${branch_name}
git push origin master
```
【初心者におすすめ】WEB開発で重宝しているWEBサービス＆拡張機能たち5選

# どうも7noteです。フロントエンジニアなら知っておきたいツールまとめ

どうも7noteです。
この記事は以下へ引っ越しました。

https://naruweb.com/tool/tools/
コメント機能に削除機能を追加したい

【概要】
----------------------------------------
<b>1.結論</b>

<b>2.どのように実装したのか</b>

<b>3.今後していきたいこと</b>



1.結論
----------------------------------------
❶commentコントローラーのdestroyアクションに、投稿したidを紐づけて削除できるようにする。

❷ネスト化したpathにlink_toで削除ボタン押下できるようにする。

<br>
2.どのように実装したのか
----------------------------------------
```ruby
<開発環境>
Ruby: 2.6.5
Rails: 6.0.3.3
```

```ruby:controllers/comments_controller.rb
  def destroy
    redirect_to root_path unless user_signed_in? || current_user.id == @time.user_id && current_user.id == comment.user_id #---(1)
    @comment = Comment.find(params[:time_id])
    if @comment.destroy　 #---(2)
      redirect_to time_path　#---(3)
    else
      redirect_to root_path　#---(4)
    end
  end
```
❶commentコントローラーのdestroyアクションに、投稿したidを紐づけて削除できるようにしました。
(1)ではログアウトしてる人や、自分以外の投稿者が自分の投稿のコメントを削除される(直接URLの入力して削除される)のを防ぐためです。
(2)は自分が投稿したコメントの削除を実行します。
(3)は成功すればコメント投稿画面に戻ります。
(4)はコメントの削除に失敗すればトップページに戻ります。

```ruby:view/time/show.html.erb
      <% if @comments %>#---(1)
        <% @comments.each do |comment| %>#---(2)
          <p>
           <%= comment.user.name %>：#---(3)
            <% if user_signed_in? && current_user.id == @time_report.user_id && current_user.id == comment.user_id %>
              <%= link_to '❌', time_report_comment_path(comment.id), method: :delete %> #---(4)
               <%= comment.content %> #---(5)
            <% end %>
           </p>
        <% end %>
      <% end %>
```
❷ネスト化したpathにlink_toで削除ボタン押下できるようにしました。
(1)は"もしコメントがあれば"ということで、インスタンス変数でtimeコントローラーから持ってきています。
(2)User➡︎commentsはhas_manyなのでたくさんあるコメントを持ってきています。
(3)その中でも紐づけられたコメントしたユーザー名だけ表示しています。
<b>(4)ルーティングでコメントをネスト化しているので自分で投稿した自分のコメントを自分で削除できるようにしています。</b>
(5)コメントの内容を表示しています。


<br>


3.今後していきたいこと
----------------------------------------
SPAを実装したいです。吹き出しマークをクリックしたら、非同期的（ページ遷移がなく）にコメントが表示され、そこで編集や削除ができるようなアプリケーションにしたいです。そのためにはNuxt.js/Vue.jsの知識が必要になってくるのでコツコツ勉強していきます。
<br>
【Excel家計簿】ピボットテーブル_便利機能(追記中)

使用しているExcelのバージョン：Excel2019

#元データに新たに追加した行を、ピボットテーブルに反映させたい (例1)
Q.元データ最後尾の行に新たに行を追加した。その後ピボットテーブル上で「更新」をクリックしたが、追加行のデータが反映されない。どうしたら反映される？
A.別途作業が必要。

1.該当のピボッドテーブルのシートで【分析】タブを選択し、【データソースの変更】をクリック。
2.「ピボッドテーブルのデータソースの変更」ダイアログボックスが表示されるので「テーブルまたは範囲を選択」で反映させたいデータの範囲を指定し【ＯＫ】をクリック。
参考：[Office Hack](https://office-hack.com/excel/pivot-table-range-change/)


#---　以下は未解決事項。解決方法を見つけたら、随時追記していく　---

#元データの行追加を自動でピボットテーブルに反映させたい
Q.(例1)で、都度作業をせず、元データに行を追加したら自動でピボットテーブルに反映させるにはどうすれば良い？

#ピボットテーブルで集計した値を別シートの表に反映させたい
Q.ピボットテーブルの「支出(家計)」の合計額を、別シート(「資産シート」)に反映させたい。「資産シート」の反映させたいセルで「=」をクリックした後ピボットテーブルの「支出(家計)」の合計額が記載されているセルをクリックすれば反映されると思ったのだが、反映されなかった。

#ピボットテーブル上で指定した条件のデータのみを抽出し、その合計額を計算したい
Q.カード払い分について、「カードを使用した日」を基準として家計簿に反映させているため、月ごとの「実際の支出」を計算する際に、カード払い分を除いた「現金支出&口座引落(カード使用分の引落含む)」分のみで計算する必要がある。「現金支出」「口座引落」の欄のみを足す計算をしたい場合、どのようにセルに記載すれば良いのか？（収支の計算が合っているかの確かめ算をするためにも、この値が必要）
MySQLのバックアップの自動化

#MySQLのバックアップを自動で取るために設定した手順です。
サーバはAWSです。

```
mkdir -pv /home/ec2-user/backup
```

バックアップ用のフォルダを作ります。

```
mkdir /home/ec2-user/cron
```
cron用のフォルダを作ります。

```
vim /home/ec2-user/cron/backup_mysql.sh
```
mysqldump を行うシェルスクリプトを作成し、下記の内容を書き込みます。

```
!/bin/sh
path='/home/ec2-user/backup'
db_name=("db_name_01")
date=`date +%y%m%d`
date_old=`date --date "7 days ago" +%y%m%d`
for i in ${db_name[@]}
do
  mysqldump --user=XXX --password=YYY --skip-lock-tables --no-create-db --single-transaction --databases ${i} > ${path}/${i}_${date}.sql
  chmod 700 ${path}/${i}_${date}.sql
  rm -f ${path}/${i}_${date_old}.sql
done
```
```
chmod 700 /home/ec2-user/cron/backup_mysql.sh
```
DBのパスワードを記載しているため、パーミッションを絞る。

```
/home/ec2-user/cron/backup_mysql.sh
```
動作確認。

```
ls -l /home/ec2-user/backup/
```
成功していれば、このようなファイルができてます。

```
crontab -e
2 3 * * * /home/ec2-user/cron/backup_mysql.sh
```
「crontab -e」で毎日03:02に実行する。

```
mysql -u user -p db_name < /home/ec2-user/backup/file_name.sql
```
リストアが必要になった場合はこちらです。

参考にしたサイト
[crontab（クロンタブ）でmysqldumpをデータベース毎に実行し毎日自動でバックアップ](https://humo-life.net/blog/mysql/164/)
Python python-docxライブラリとフリーソフト「縮小専用。」でフォルダ中の写真のサムネイルを貼り付けたdocxファイルを作成する

Python 3.8でpython-docxライブラリとフリーソフト「縮小専用。」を使用してあるフォルダのサブフォルダに含まれるJPEGファイルのサムネイルを貼り付けたdocxファイルを作成するサンプルコードです。

いつかの自分のためにpython-docx、subprocess等の参考として記載します。

# コード

```py
import docx
import subprocess
from pathlib import Path


rootpath = Path(r"<写真フォルダをまとめたフォルダのパス>")
shukusenpath = Path(r"<縮小専用。のパス>")
thumbdirname = "thumb"  # 縮小専用。で指定したサブフォルダの名前

for folderpath in rootpath.glob("*"):
    if not folderpath.is_dir():
        continue
    newfilepath = rootpath / (folderpath.stem + ".docx")
    if newfilepath.is_file():
        continue
    thumbpath = folderpath / thumbdirname

    # JPEGのみ貼り付け
    # 他の拡張子も貼り付ける場合はここを編集します。
    picpaths = list(folderpath.glob("*.jpg"))
    if len(picpaths) == 0:
        continue
    subprocess.run([shukusenpath, *picpaths])

    doc = docx.Document()
    for picpath in picpaths:
        thumbpicpath = thumbpath / picpath.name
        try:
            doc.add_picture(str(thumbpicpath))
            doc.add_paragraph()
            doc.add_page_break()
        except Exception:
            pass
    doc.save(newfilepath)

```

# メモ

- `python-docx`は`pip install python-docx`でインストールできます。
- `pathlib.Path`は`/`演算子でパスを結合できます。
- `subprocess`は第1引数に実行ファイルと引数のリストを与えることで実行ファイルを起動して終了を待ちます。
- リテラルと展開後のリストやジェネレータを要素とするリストを作成するには`[literal, *list, *generator]`のようにします。`*`はリストやジェネレータの展開です。
- `docx.Document.add_picture`に`pathlib.Path`を直接与えるとエラーが発生します。`str(pathlib.Path)`で文字列に変換することで回避できます。
- `pathlib.Path`では`stem`は括弧不要ですが、通常の用法で`is_dir()`は括弧必須です。`is_dir`はエラーにはなりませんが、メソッドそのものを返すので`if`に与えると常に真となります。

# 参考

- [python-docx](https://python-docx.readthedocs.io/en/latest/)
- [縮小専用。 - 窓の杜](https://forest.watch.impress.co.jp/library/software/shukusen/)
StringUtilsのisEmptyとisBlankの違い

StringUtilsでよく使う関数でisEmptyとisBlankがあるんだけど、違いをたまに忘れてしまうのでメモ。
isEmptyは空文字だけをtrueで返すようだ。

```java:qiita.java
package com.example.test;

import java.util.ArrayList;
import java.util.List;
import org.apache.commons.collections4.*;

import org.apache.commons.lang3.StringUtils;
import org.junit.Test;

public class BlankTest {

	@Test
	public void test() {
		System.out.println("空文字= " + StringUtils.isBlank(""));
		System.out.println("空白文字= " + StringUtils.isBlank(" "));
		System.out.println("全角空白文字= " + StringUtils.isBlank("　"));
		System.out.println("タブ空白文字= " + StringUtils.isBlank("\t"));
		System.out.println("空文字= " + StringUtils.isEmpty(""));
		System.out.println("空白文字=" + StringUtils.isEmpty(" "));
		System.out.println("全角空白文字=" + StringUtils.isEmpty("　"));
		System.out.println("タブ空白文字=" + StringUtils.isEmpty("\t"));				
	}

}
```
実行結果
空文字= true
空白文字= true
全角空白文字= true
タブ空白文字= true
空文字= true
空白文字=false
全角空白文字=false
タブ空白文字=false
VSを使わずC#をコンパイルする方法

###検証環境
・Windows10 64bit 1909 build 18363.1082
・DotnetFramework x64 v4.0.30319

###参考（というかほとんどパクリ…）
https://qiita.com/toshirot/items/dcf7809007730d835cfc

###手順
①下記のサンプルcsファイルを作成

```C#:test.cs
using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Reflection;
using System.Windows.Forms;
using System.Drawing;

class Neko : Form {

  [STAThread]
  public static void Main() {
    GeneratedCodeAttribute generatedCodeAttribute =　new　GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator","10.0.0.0);
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run( new Neko());
  }

  Neko(){
    Text = "Button Click Sample";
    ClientSize = new Size(200, 200);
    Button btn1 = new Button();
    TextBox txb1 = new TextBox();
    Label lb1 = new Label();
    btn1.Location = new Point(50, 50);
    txb1.Location = new Point(100,100);
    lb1.Location = new Point(150,150);
    
    btn1.Text = "Click!";
    btn1.Click += btn1_Click;
    
    lb1.Text = "test";
    
    Controls.AddRange(new Control[] { btn1 });
    Controls.AddRange(new Control[] { txb1 });
    Controls.AddRange(new Control[] { lb1 });
  }

  void btn1_Click(object sender, System.EventArgs e) {
    MessageBox.Show("こんにちはにゃー", "挨拶");
  }
}
```
②コマンドプロントを起動し下記コードを実行

```cmd:実行
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe D:\test\test.cs
```

③cmdのカレントディレクトリに"test.exe"が吐き出されるので実行する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/7c951859-317e-54c2-9737-9a13da33c140.png)
Swift のOptionalをUnwrapする５つの方法　４個目はお勧め

###1. Force Unwrapping  

```swift
optional!
```
###2. Check for ni value 

```swift
if optional != nil {
	optional!
}
```


###3. Optional Binding

```swift
if let safeOptional = optional{
	safeOptional
}
```

###4. Nil Coalescing Operator ??

```swift
optional ?? defaultValue
```

###5. Optional Chaining 

```swift
optional?.property
optional?.method()
個人プッシュメッセージ用のLINE BOTの作成の仕方 2020/9

LINE BOTの作り方は以前と変わっているため、タイトルに開発タイミングを記載。

# 本記事のゴール
1. LINE BOTを作成する
2. プッシュメッセージを送る。

![スクリーンショット 2020-09-18 11.59.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/78ac4b65-82d8-f0bb-263c-7e282b7cc472.png)

# 前提
Makefileの使い方がわかる
curl使ったことある。
LINEのアカウント持ってる。

# 1 LINE BOTを作成する。

LINE BOTの作成はLINE Developersで行う。

![スクリーンショット 2020-09-18 12.01.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/8ce9fb54-c9bb-2fd2-5593-27a6485a7eca.png)

ログイン

![スクリーンショット 2020-09-18 12.03.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/9f36de48-42e6-5141-22dc-e02298dcbb72.png)
LINEアカウントでログイン


ログインしたらまずはProviderを作成する。

作成すると以下のようにProviderの画面が表示できる。

![スクリーンショット 2020-09-18 12.17.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/11c2d714-5a98-c9eb-93c0-ff68043a75c3.png)

「Create a new channel」を押して「Messaging API」を選択
![スクリーンショット 2020-09-18 14.50.10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/835c597d-14ad-bc05-bfdf-9d183d383576.jpeg)

そうするとLINE BOTの設定画面になるのでいろいろ記載。

Channel icon : LINE BOTのアイコン
Channel name : LINE BOTの名前。LINEで表示される名前でもある。7日変えられないのでちゃんと決める。

他は適当に入力して最後に`Create`
これで新しくLINE BOTを作ることができたので、このBOTを友達として追加する。

LINE BOTを選択 > Messaging API > QR code

![スクリーンショット 2020-09-18 14.56.10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/14a3febf-78b2-7474-4e15-081c96940dff.jpeg)

このQR codeをスマホでスキャンすることで友達に追加することができる。

# 2 PUSHメッセージを送る。

[プッシュメッセージを送る ドキュメント](https://developers.line.biz/ja/reference/messaging-api/#send-push-message)

リクエストのやり方は公式ドキュメントに乗っている。

これを参考にMakefileを作って以下のように入力する。

```Makefile
CHANNEL_ACCESS_TOKEN=アクセストークン
TO=送信先

send:
	curl -v -X POST https://api.line.me/v2/bot/message/push \
	-H 'Content-Type: application/json' \
	-H 'Authorization: Bearer ${CHANNEL_ACCESS_TOKEN}' \
	-d '{ "to": "${TO}", "messages":[{ "type":"text", "text":"メッセージの内容" }] }'
```

ここで、アクセストークンとTOはそれぞれ以下にある。

先ほどQR codeを取得した画面の一番下にChannel access tokenがある。
LINE BOTを選択 > Messaging API > Channel access token
「issue」ボタンを押すと発行される。

TOに入力する自分のUserIDは
BOTを選択 > Basic settings > 一番下の「Your user ID」のところに書いてある。

これらをMakefileの変数にコピペして、

```
make send
```

で送ることでLINEにメッセージが届く。

# 料金について

[LINE公式アカウントの運用費用は？料金プランを解説！](https://www.linebiz.com/jp/column/technique/20200204/)より、
プッシュメッセージは1000件まで無料。

そして、Pushメッセージの送信数は
[LINE Official Account Manager](https://manager.line.biz/)で確認できる。

アカウントを選択し、分析のタブを選択するとメッセージ通数が表示される。
Amplifyのbundleサイズを5MB減らした

自分の運営しているサービス([VRCSnap!](https://vrcsnap.com/))のPageSpeed Insightsを久しぶりに測ったらモバイルのスコアが大変なことになってた

VRCSnapはこんな感じの、VRChat関連でアバターが写ってる画像ツイートを紹介するサービスです

Nuxt, Amplify(AppSync)環境で作ってます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482334/0a17ca65-0db0-8092-b092-ea00b4eeb19d.png)

それで肝心のスコアは・・・

![PSI_2020_09_18_before.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482334/1afd579c-f923-6f3d-2939-b024d17654bb.jpeg)

に、にじゅうなな・・・（PCは87でした）

で、twitterのwiget.jsの読み込みをbodyタグ内にしたり(body: tureを入れる)

```Javascript:nuxt.config.js
script: [
    { src: 'https://platform.twitter.com/widgets.js', body: true }
],
```

[@nuxtjs/device](https://www.npmjs.com/package/@nuxtjs/device)を入れてモバイルの時だけツイートの読み込み数を減らしして48まで上げることができました

![PSI_2020_09_18_after1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482334/44a9a189-9828-6b44-5a53-e052fd953cc0.jpeg)

後はwebpackを小さくするくらいかなと思ってbundleサイズを見てみると

![PSI_2020_09_18_webpack.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482334/6d6674b5-f801-2324-cdfd-eca513b8a844.jpeg)

aws-sdkと@aws-amplifyがめっちゃでかい

なんとかならんもんかと思って調べてみると、[Amplify公式に丁度いい記事](https://aws-amplify.github.io/amplify-js/api/)が

これまでamplify.jsは以下のようにしていたのですが、これだと上の画像のようにaws-sdkを全部インポートするのでかなり重い


```Javascript:amplify.js
import Amplify from 'aws-amplify';
import aws_exports from './aws-exports';

Amplify.configure(aws_exports);
```


そこで、使用するカテゴリだけインポートするようにする（今回の場合は@amplify/coreの他は@amplify/apiのみ）

```Javascript:amplify.js
import Amplify from '@aws-amplify/core';
import API from '@aws-amplify/api';
import aws_exports from './aws-exports';

Amplify.configure(aws_exports);

```

個別のコンポーネントでも、aws-amplifyからではなく@aws-amplify/apiからインポートする

```Javascript
import API, { graphqlOperation } from '@aws-amplify/api'
```

そうするとbundleサイズが5MBほど削減できました

![PSI_2020_09_18_webpack_after.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482334/318e4597-051e-9703-4f0f-b30f8211a8ed.jpeg)

PSIのスコアも63に

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482334/1a75194b-5f4d-8328-3525-da9a0a8ca4ef.png)

な、なんとか50を超えた・・・!

後はvue-awesome-swiper(カルーセル)が結構重かったりするので、色々整理します

こんな感じで、Amplifyが重い！って言う人の参考になれば幸いです
javax.batch.operations.JobStartExceptionとなったときの対応方法

- 環境
    - Windows 10 Pro 64bit バージョン1909
    - Payara Server 5.194
    - Eclipse Version 2020-03
    - openjdk version 11

# 事象 : バッチ処理が起動せずにエラーになる
デバックしても何がnullになっていて問題なのかよくわかんない。

```bash:ログ
javax.batch.operations.JobStartException: java.lang.NullPointerException  
    at com.ibm.jbatch.container.api.impl.JobOperatorImpl.start(JobOperatorImpl.java:92)  
...省略... 
Caused by: java.lang.NullPointerException: null  
    at com.ibm.jbatch.container.jobinstance.JobExecutionHelper.startJob(JobExecutionHelper.java:125)  
    at com.ibm.jbatch.container.impl.BatchKernelImpl.startJob(BatchKernelImpl.java:124)  
    at com.ibm.jbatch.container.api.impl.JobOperatorImpl.startInternal(JobOperatorImpl.java:123)  
    at com.ibm.jbatch.container.api.impl.JobOperatorImpl.start(JobOperatorImpl.java:88)  
    ... 161 common frames omitted 
```

# 原因 : Payaraがちゃんとクリーンできてないから
どうも`JobOperatorImpl`はPayara関連くさいということで対応したらなおった。
GlassFishでよくわからないエラーになるとおんなじような対応をしていたが、Payaraになっても・・・。

- 参考 : [JobOperatorImpl cannot be instantiated · Issue #1103 · payara/Payara · GitHub](https://github.com/payara/Payara/issues/1103)
- 参考 : [jakarta ee - NullPointerException running Batch job in WebLogic with managedScheduledExecutorService - Stack Overflow](https://stackoverflow.com/questions/49941734/nullpointerexception-running-batch-job-in-weblogic-with-managedscheduledexecutor)

## 対応 : Payara配下のディレクトリを削除する
```bash
# この３つのディレクトリを削除する。eclipseApps~ディレクトリはEclipseでないとない・・・と思う。
$ ls -la /c/apps/payara5/glassfish/domains/domain1/ | grep -e eclipse -e generated 
drwxr-xr-x 1 ponsuke 1049089   0  9月 18 17:41 eclipseApps/ 
drwxr-xr-x 1 ponsuke 1049089   0  9月 18 17:24 eclipseAppsTmp/ 
drwxr-xr-x 1 ponsuke 1049089   0  9月 18 17:26 generated/
```

1. 上記のディレクトリを削除する
2. EclipseでPayaraにデプロイしているアプリを削除
3. Payaraをクリーンする
4. プロジェクトをクリーンする
5. アプリをPayaraにデプロイして起動する
Honkitで画像とタイトルを中央揃えにする

## なにこれ
Honkit (開発が終了したgitbook v1がフォークされたもの)でドキュメントを作成しているときに、画像を差し込んだときに初期設定だと左揃えなことに気づいた。見た目が良くないので中央揃えにしたかったけど、若干手間取ったので備忘がてらメモ。

## まとめると
* book.jsonとstyles/website.cssを作って、cssの中に中央揃えにしたいclassにtext-align: centerを指定する

## 詳しく
Asciidocで画像を表示させたいとき、その前の行にタイトルを記入することができる。

```:Document.adoc
= 画像サンプル
:imagesdir: img

.寿司寿司寿司
image::sushi.png[width="300"]
```

(QiitaってAsciidocのシンタックスハイライトできないんだ……悲しい)

このように書くと、タイトル（と寿司）が左に偏ってしまう。

![スクリーンショット 2020-09-18 21.21.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144329/56c15813-2221-d1e4-9feb-cfe49e1a043a.png)

悲しい。そこで、ドキュメントのフォルダにbook.jsonとwebsite.cssを追加する。

```:フォルダ構成
img/
  sushi.png
styles/
  website.css
SUMMARY.adoc
Document.adoc
book.json
```

book.jsonは{}だけ書いてあればOK。

```json:book.json
{}
```

website.cssが中央揃えのための本体で、ここに設定を書いてあげる。

```css:website.css
.title {
    text-align: center;
}
.content{
    text-align: center;
}
```

本当はこれだけでいいと思ったんだけど、imagesタグの方にもalign centerを書いてあげなきゃいけない。

```:Document.adoc
= 画像サンプル
:imagesdir: img

.寿司寿司寿司
image::sushi.png[width="300", align="center"]
```

こうすることでやっと中央揃えできるようになった。

![スクリーンショット 2020-09-18 21.31.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144329/202a73ae-4bbd-d1f8-35b0-3c8defe04e6d.png)

寿司も見違えたように美しい。


## おわりに
Gitbook使おうと思ったら謎のホスティングサイトと化してるし、Asciidoc使えなくなってるしでほとほと困っていた。Honkit本当にありがとうございます。大変助かっています。
Git【ローカルでのリポジトリの名前変更】

個人アプリを制作していまして
各種コマンドをすぐ忘れてしまうので、備忘録的に残しておきます。

### ローカルでのブランチ名を変更する
	git branch -m 古いブランチ名 新しいブランチ名
### マスターにコミットする
```
git add .
git commit -m "コミット名"
```
[html,js]ヒストリーバック リンク書き方

####1つ前に戻る
```
<a href="javascript:history.back();>1つ前に戻る</a>
```

####2つ前に戻る
```
<a href="javascript:history.go(-2);><2つ前に戻る</a>
```

windowオブジェクトが持っているメソッド臭い。いろんな書き方があるようだ。
belongs_toで定義したインスタンスメソッドを使用した時に何が起こっているのか

#わからなかったこと
題名の通り、belongs_toで例えば以下のように定義した時にuserが何をしているのか中身がわからなかった。



```
class Tweet < ApplicationRecord
  belongs_to :user
end
（Tweetモデルでの記述）
```

これを理解しやすくすると以下のようにかける。。

```
class Tweet
  def user
　　・・・
  end
end
```

これをみると、userというのはTweetクラスののインスタンスメソッド。
何をしているメソッドかはrailsが用意してくれているため見えないが、上のような定義の場合tweetsテーブルのuser_idとusersテーブルのidとの同じ数字を結びつけて取得する役割をしているとメンターに教えてもらった。
具体的な使用例を下に書いた。

各テーブルは以下のように定義する。

tweetsテーブル

|id|・・・|user_id|
|:---|:---:|--:|
|1|・・・|2|
usersテーブル

|id|・・・|
|:---|:---:|--:|
|1|・・・|
|2|・・・|


#具体的なイメージ
上の段落で定義した条件を使った場合、①と②のコードは同じ結果を示す。

①アソシエーションを使用しない場合

```
tweet = Tweet.find(1)
User.find(tweet.user_id)
```
１行目：Tweetモデル(tweetsテーブル)から、idが1のレコード（行）を見つけてきて、変数tweetに代入している。
２行目：Userモデル(usersテーブル)から、idが2(tweetのuser_idカラムの数字)の行を見つけてきている。
つまり、usersテーブルのid2のレコードを取得している。

②belongs_toで結び付けている場合

```
tweet = Tweet.find(1)
tweet.user
```
１行目：上と同じ
２行目：tweet（tweetsテーブルのidが１であるレコード）にあるuser_idと同じ数字をusersテーブルのidから探してきて、そのidのレコード（行）を表示している。
つまり、usersテーブルのid2のレコードを取得している。
#結論
belong_toで定義したインスタンスメソッドを使用した時に、何が起きているのか具体的にわかった。
どちらも同じレコードを取得していた。2行目は.userを使った方がシンプルに使える。
複雑になっても基本のクラスとインスタンスの概念などを復習すると理解を助けられることがわかった。

間違いありましたら指摘をお願いいたします。
【Swift5】 iOSの音声合成(AVSpeechSynthesizer)の声を男性に変更する

## 概要
iOSでは標準で利用可能な音声合成(AVSpeechSynthesizer)が用意されている。
普通に利用する場合、女性の声が利用可能だが、声を男性に変更する方法をメモする。

AVSpeechSynthesizerの基本的な使い方については以下の記事を参照。
https://qiita.com/maKunugi/items/dc9da201a663c8773c8c

## 音声の変更

```swift
let voices = AVSpeechSynthesisVoice.speechVoices()
```

利用可能な声は、AVSpeechSynthesisVoiceクラスのspeechVoicesメソッドから取得が可能。

voiceの中身は下記のような内容。

```
name: Kyoko
gender(rawvalue): 0
lang: ja-JP
identifier: com.apple.ttsbundle.Kyoko-compact
```

speechVoicesメソッドから利用したい声を取得したら、AVSpeechUtteranceクラスにsetしてあげればOK。

```swift

let synthesizer = AVSpeechSynthesizer()
...
let utterance = AVSpeechUtterance(string:text)
utterance.pitchMultiplier = 1.0
utterance.voice = voice        
synthesizer.speak(utterance)
```


## 利用可能な日本語音声
手元の端末で確認できた日本語の音声はこちら。

```
- Otoya (Enhanced) #男性
ja-JP
com.apple.ttsbundle.Otoya-premium

- Hattori  #男性
ja-JP
com.apple.ttsbundle.siri_male_ja-JP_compact

- Kyoko #女性 (Default)
ja-JP
com.apple.ttsbundle.Kyoko-compact

- O-ren #女性
ja-JP
com.apple.ttsbundle.siri_female_ja-JP_compact


- Otoya #男性
ja-JP
com.apple.ttsbundle.Otoya-compact
```

上記の音声が確認できました。男性の声も２種類指定が可能なので、「Hattori」もしくは「Otoya」の音声を指定してあげれば男性の声で読み上げをすることが可能です。

## 注意事項

### 音声が端末で利用できるかの確認

何もしない場合はDefaultの女性の声(Kyoko)が読み上げに利用されます。
端末内にない存在しない音声を利用しようとするとクラッシュします。
そのため、端末で利用したい音声が存在しているかは必ず確認する必要があります。

```swift
var voice:AVSpeechSynthesisVoice? = voices.first{
    $0.identifier == "com.apple.ttsbundle.siri_male_ja-JP_compact"
}
if let voice = voice {
    ~~~~~
} else {
    ~~~~~
}
```

### ユーザが音声をダウンロードすることで利用可能な音声が増える
初期状態ではほとんどの端末がDefaultの音声しか利用ができない。(シミュレータは増やせない模様)
Siriの設定やアクセシビリティの設定等で音声の変更を行うと、追加の音声データを端末にダウンロードができる。その手順を踏んだ端末には上述したような複数の音声が利用可能になる。
そのため、必ず男性の声でなければならないといった制約のあるアプリを提供したい際は、男性の音声データが端末にダウンロードされている状態にするため、うまくユーザを誘導する必要がある。
【チュートリアル】Compoundに資産を供給するチュートリアル(途中まで)


#
## 参考リンク
* https://medium.com/compound-finance/supplying-assets-to-the-compound-protocol-ec2cf5df5aa#b40a

## 基本的な仕組み（資産供給者サイド）
* Compound financeの利用者（貸手）は、EtherやDAIをCompoundに供給することでcTokens（ERC20 Token）をCompound側から得る
* Compound marketにプールされた資産は、他のユーザーが借りることができる
* 貸手は借手が支払った利息をシェアする
* 貸手は手元にあるcTokenを使って、いつでも供給した資産を引き戻す（交換する）ことが可能

## Compoundに資産を供給する実装は２通り
1. Web3.jsのJSON RPCを利用する
2. ブロックチェーン上のプロキシスマートコントラクトを利用する

## Web3.jsを使って資産をCompoundに供給する

* cETHを獲得するメソッドとcDAIやcREPを獲得するメソッドに違いがある
	* Etherを直接送って、cEtherを獲得するpayable mint function
		* ここで注意すべきは、このfunctionを他のスマートコントラクトから呼び出すときは、cETHをredeemしてETHを受け取る為のコントラクトはpayableでなくてはいけない。

* cERC20 Tokensの手順はcEtherのそれとは異なる。
	* cERC20 Tokensをmintするには、まずunderlying token’s contractのapprove function を 呼び出す必要がある。
		* このapprovalは対応するcToken contract が一定額をsender addressから取得することを示している
		* 後にmint functionが呼ばれた際、cToken contractが指定されたunderlying token額をsender addressから取得する

## Compound contract address / Rinkeby
[Compound | Docs - Getting Started](https://compound.finance/docs#networks) 2020/09/17時点
cDAI: 0x6d7f0754ffeb405d23c51ce938289d4835be3b14
cETH: 0xd6801a1dffcd0a410336ef88def4320d6df1883e

[CEther.sol](https://github.com/compound-finance/compound-protocol/blob/master/contracts/CEther.sol)

## 必要なもの
* ETHが入っているEthereum wallet
* そのwalletにあるアドレスのprivate key
* Infrua API key　あるいは　Cloudflare ← Ethereum Networkに接続する為のもの

## compoundCEthContractのEthをCompoundにWeb3jsを使って供給するmethods
### 使うメソッド
* supplyRatePerBlock().call()
* mint().send()
* balanceOfUnderlying().call()
* exchangeRateCurrent()
### 手順
1. まずsupplyRatePerBlock()を呼ぶ
2. 取得できたsupplyRatePerBlockMantissa（ブロックごとの供給レート仮数）を[1e18（1刹那、極めて短い時間）](https://qiita.com/jajaja/items/4c093e19a4cf8e1cf312)で割る
3. するとinterestPerEthThisBlockが計算される
4. これで供給されたETHが増える比率がわかるのかな？！

(つづく)
[PHP]比較演算子を甘く設定して発生したエラー

##現象
\$valueというレコードからschool_rankというカラム(int)を抽出して有無を判定していたところschoolランクが0の時はfalseと認識してしまうので|| $value->school_rank == 0を追加した。

```
 if ( $value->school_rank || $value->school_rank == 0) {
  処理
}
```
が、この時甘く==をつけてしまったため、今度は\$value->school_rankがnullのときは0を扱われてしまった。

```
 if ( $value->school_rank || $value->school_rank === 0) {
  処理
}

```
教科書でも書いてるように===で厳しく判定しないと思わぬバグを生むなと実感した話
備忘録　SQL　始めるとき　Colud9

##SQLの勉強兼ねた備忘録です。

起動
>$ sudo service mysqld start

再起動
>$ sudo service mysqld restart

起動状態確認
>$ sudo service mysqld status

停止
>$ sudo service mysqld stop

データベースサーバへの接続
>$ mysql -u root

データベースサーバからの切断
>mysql> exit

文字化け対策の設定ファイルを作成
>sed -e "/utf8/d" -e "/client/d" -e "/^\[mysqld_safe\]$/i character-set-server=utf8\n\n[client]\ndefault-character-set=utf8" /etc/my.cnf |sudo tee /etc/my.cnf

文字化け対策ができているかの確認
>mysql> show variables like "chara%";

データベース作成
>sql> CREATE DATABASE bookstore;

データベースを削除(注意して使う)
>mysql> DROP DATABASE bookstore;

現在作成されている全てのデータベースの一覧を確認
>mysql> show databases;

操作するデータベースを選択
>mysql> USE bookstore;

テーブル一覧の確認
>mysql> show tables;

テーブルの設計内容を確認
>mysql> describe books;

テーブルを削除したい場合
>mysql> DROP TABLE bookstore.books;
Unityエンジンモジュール分析

UWA GOTはUWAが提供しているローカルパーフォマンス最適化ツールです。Overview分析モードは開発者が直観的にソースコード内の性能ボトルネックを特定することができます。しかし、エンジンモジュールのパフォーマンスも非常に重要であり、ロジックコードの検出のみが、体系的かつ完全にボトルネックを特定するという目的を達成できないことがわかっています。そのため、本ツールでUnityエンジンモジュールの診断機能を提供しました。

---
##詳細なエンジンモジュールパラメータ
現在、UWA GOT Onlineのレポートは、レンダリング、UI、パーティクル、アニメーション、および物理システムという6つの主流な重要なパラメータの測定モジュールをサポートしています。下図のように、レンダリングモジュールにおいて不透明度、半透明度、ビューのトリミングCPUおよびカメラの後処理などのCPUの消費時間、および特定のフレームの傾向および消費時間を確認できます。
![1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/462418f0-b5f4-27b5-65f2-a1c023437271.jpeg)
また、テスト領域をスケーリングし、スクリーンショットを使用して、特定のピークでのパフォーマンスをより直感的に特定することもできます。
![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/8dca4665-38d0-955f-77c6-a8997417df18.jpeg)
重要なパラメータについて、UWAの推奨値と関連な最適化意見を提供し、開発チームが問題の排除と改善をより的確に行うことができます。
![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/83f75e78-2a41-bebe-fac7-e7eb376cbe54.jpeg)

---
##正確なロジックコードスタック
スタック情報は、私たちが設定した性能のボトルの目であり、このバージョンの更新は、追加モジュールの重要なパラメータの検出に影響を与えず、代わりに、より詳細な追加関数のスタック情報を見ることができます。特定の調整用の状況を定義します。
![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/04674f31-e1e8-f9fb-b615-37ed12d3b8d2.jpeg)
特に、スタック情報の一覧表において、過去のデータとの比較可能な機能を提供します。これは、特定の重要なパラメータの変更傾向を確認し、開発チームも即時テスト結果検証することができます。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/7b4b10ec-fa53-2069-f7cd-b14a223e3bd1.png)

---
UWA Technologyは、モバイル/VRなど様々なゲーム開発者向け、**パフォーマンス分析**と**最適化ソリューション**及び**コンサルティングサービス**を提供している会社でございます。

UWA公式サイト：https://jp.uwa4d.com
UWA公式ブログ：https://blog.jp.uwa4d.com
WebpackとReact.jsとdotenvで.envの環境変数をbuildされるコード上でprocess.envとして使いたい

はじめに
react dotenvで検索すると「前提、create-react-appを使う」と指定されていて
「うわぁあああ」となったので書いてみた。

※本記事はReact.jsである必要はありません。react-create-app系記事へのプロパガンダです。

もっといい方法があれば教えて下さい。

## 結論

```js:webpack.config.js
const webpack = require('webpack');
const dotenv = require('dotenv');

module.exports = () => {
  const env = dotenv.config().parsed;

  return {
    // ---------- 全て省略 ----------
    plugins: [
      new webpack.DefinePlugin({
        'process.env': JSON.stringify(env)
      })
    ],
  };
};

```

## 前提
- create-react-appを使わずに構築
- webpackを使っている

## プラグインのインストール

今回はdotenvを採用
https://github.com/motdotla/dotenv

```bash
yarn add -D dotenv
```
### dotenvやdotenv-webpackと選択肢がある

下記の様に選択肢があり、dotenvはサーバー上でしか動かない、つまりビルドする時に.envファイルから取得してwebpackを介して環境変数を渡して上げなければならないので、dotenv-webpackなどを使う方法もありだと思います。

https://www.npmtrends.com/config-vs-dotenv-vs-dotenv-webpack-vs-rc

![スクリーンショット 2020-09-18 19.38.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206542/9cc9dcac-17e1-7f83-206c-3951fe15eef6.png)


## .env作成

package.jsonなどと同じ階層に.envファイルを作ってください。
rootに無いとdotenvでpathを指定しないといけなくなります。（逆に言えばpathさえ指定できればどこでもいい）

```.env:.env
SERVICE_URL="https://hogehoge.com"
API_URL="https://hoge-api.com"
NODE_ENV="development"
```

## webpack.config.jsの編集

1. `dotenv`で`.env`ファイルを読み込む
2. `dotenv.config().parsed `で設定値を取得
3. `webpack.DefinePlugin`を使って注入する
4. `JSON.stringify()`で変換して上げないと正しく値を渡せないので変換

>DefinePluginは、webpack.config.js内からモジュールに対し、設定値等の値を注入できるプラグインです。

```js:webpack.config.js
const webpack = require('webpack');
const dotenv = require('dotenv');

module.exports = () => {
  const env = dotenv.config().parsed;

  return {
    // ---------- 全て省略 ----------
    plugins: [
      new webpack.DefinePlugin({
        'process.env': JSON.stringify(env)
      })
    ],
  };
};

```

## process.envの取得方法

```tsx:home.tsx
import React from 'react';

const Home = (): JSX.Element => {
  console.log(process.env.NODE_ENV); // -> development
  return (
    <div>
      <p>this is Home</p>
    </div>
  );
};

export default Home;
```

## 参考
[Environment Variables : Webpack config using DefinePlugin](https://medium.com/@bhautikbharadava/environment-variables-webpack-config-using-defineplugin-1a7f38e2236e)
[Using environment variables in React](https://medium.com/@trekinbami/using-environment-variables-in-react-6b0a99d83cf5)
[Webpackを使ってJSでも.envしたい](https://qiita.com/mikakane/items/5ab96c4c7e187ab6c9f1)
論理演算の演算則ー「結合の法則」

応用情報技術者平成29年春期 午前1

論理和(∨)，論理積(∧)，排他的論理和(⊕)の結合法則の成立に関する記述として，適切な組合せはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/70f794da-77be-d4e7-e9e4-6a43f2cb6a64.png)


１、論理演算の演算則の一つに「結合の法則」があります。
(A・B)・C＝A・(B・C)
(A＋B)＋C＝A＋(B＋C)
排他的論理和(⊕)も論理和演算の一種ですので、論理和の場合と同様に結合の法則が成立する。



＜＜排他的論理和＞＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/77d907bf-9411-7a92-2896-260a79e59e06.png)

参照：
https://www.ap-siken.com/kakomon/29_haru/q1.html
mindの研究 その13

#概要

mindが謎なので調べてみた。
vistaに入れた。
sin波、書いてみた。

#写真

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/fb5b53d8-3db4-d36b-fab2-7afe35753066.jpeg)



#サンプルコード

```
メインとは
　xは　変数
　vは　小数変数
　ペンは　変数
　ターゲットは　変数
　メモ帳は　変数
　結果は　変数
　文字1は　文字列実体

　「Notepad」を　文字1に　入れ　０を　文字１に　一文字追加し　文字１の　アドレスを得て
　０をつみ
　"user32"と　"FindWindowA"で　ＡＰＩ呼出し２　結果に　入れ
　エラー？　ならば
　　エラー文字列を　一行表示し　終り
　つぎに
　結果を　メモ帳に　入れ
　メモ帳をつみ
　"user32"と　"GetDC"で　ＡＰＩ呼出し１　結果に　入れ
　エラー？　ならば
　　エラー文字列を　一行表示し　終り
　つぎに
　結果を　ターゲットに　入れ
　ターゲットを　数値表示し　改行する
　０をつみ
　２をつみ
　２５５をつみ
　"gdi32"と　"CreatePen"で　ＡＰＩ呼出し３　結果に　入れ
　エラー？　ならば　　エラー文字列を　一行表示し　終り
　つぎに
　結果を　ペンに　入れ
　ペンを　数値表示し　改行する
　ターゲットをつみ
　ペンをつみ
　"gdi32"と　"SelectObject"で　ＡＰＩ呼出し２　結果に　入れ
　エラー？　ならば
　　エラー文字列を　一行表示し　終り
　つぎに
　結果を　数値表示し　改行する
　vに　0.0fを　入れ
　５００を　回数指定し
　　xに　回数を　入れ
　　vに　0.03fを　f加え　vに　入れる
　　ターゲットをつみ
　　xをつみ
　　sin(v)に　200.0fを　f掛けて　200.0fを　f加える　整数化し
　　０をつみ
　　"gdi32"と　"MoveToEx"で　ＡＰＩ呼出し４　結果に　入れ
　　エラー？　ならば
　　　エラー文字列を　一行表示し　終り
　　つぎに
　　(結果を　数値表示し　改行する)
　　ターゲットをつみ
　　xをつみ
　　sin(v)に　200.0fを　f掛けて　202.0fを　f加える　整数化し
　　"gdi32"と　"LineTo"で　ＡＰＩ呼出し３　結果に　入れ
　　エラー？　ならば
　　　エラー文字列を　一行表示し　終り
　　つぎに
　　(結果を　数値表示し　改行する)
　繰り返す



```


以上。
ブログ　SEO時代の終焉


有名ブロガーがブログをやめようとしている。SEOはいつかオワコンとなるという噂は真実になりそうだ。そもそもブログというメディアには流入経路が必要なわけで、ただ書き続けるだけでは誰からも注目されない。

YoutubeというメディアにはYoutubeでしか成立しないフィールドがある。ブログにYoutubeから集客することにどれだけ価値があるのか。SEOでの集客が難しくなる時代、自分自身でブログに人を集める仕組みづくりが必要になったわけだ。

SEOは時代がかわり、そもそもグーグル検索というものが廃れていくのは時間の問題となっていた。2020年に大幅なアップデートがあり、人々の行動パターンも変わってきた。今まで通りの集客方法は通用しないことがわかっていたわけだ。

ブログとは出版されても誰からの目にもとならない本。SEOによって脚光を浴びてきたとしても、一過性に終わることは明らかだった。それがいつになるかの問題だけで、突然やってきてもなんら不思議ではなかった。<a href="https://premium-catfood.com/" >個人サイトの例</a>のような消えたサイトもいくつもある。

SEOではなく、WEBマーケティングに変革が求められたのだ。今まで通りのWEB集客から、2020年以降の新しいモデルの構築が必要になった。メディアの活用、運営サイトの方向性と運営方針。これから更に厳しくなる。まったくの新しいマーケティングが求められるのだ。
検索条件（get）を複数ページ持ち越す方法

開発中に以下のような遷移時にgetパラメターを持ち越せず苦戦。
①ページ内で検索（get）
②検索結果表示
③検索結果を並び替え(get)
調べてみるとページネーションの際などでも結構はまっている人がいるっぽい。
自分なりに解決した方法が以下。

##③の処理の際にurlのパラメターをhideで投げる。
```
<input type="hidden" name="condition" :value="setGetParams()">

 setGetParams() {
      return window.location.search
    },
```
##urldecodeでパラメータと並び替えの条件を合体させurl作成⇒リダイレクト
```
public function action_result()
  {
    $get = \Input::get();

//urlのパラメターが投げられていたら以下処理
    if(!empty($get['condition'])):
      $url = urldecode(\Uri::current().$get['condition']);
      $url = $url.'&order='.$get['order'];
      \Response::redirect($url);
    endif;

//パラメータが投げられていなければ通常の検索処理
    $data = Model_Data::search($get);
  ～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～
```

多少強引ですが以下で検索条件をページを跨いでも引き継げます。
iOS 14 UIDatePickerの以前と同じサイズ指定

iOS14 以降でUITextField の入力補助として UIDatePicker を使っている場合に
以前と同じサイズでピッカーを利用する例

```swift

    lazy var datePicker: UIDatePicker = {
        let datePicker: UIDatePicker = UIDatePicker()
        datePicker.datePickerMode = UIDatePicker.Mode.date
        datePicker.timeZone = NSTimeZone.local
        datePicker.locale = Locale.getPreferred()
        datePicker.date = Calendar.current.date(byAdding: .hour, value: 1, to: Date())!
        datePicker.minimumDate = Date()
        
        if #available(iOS 13.4, *) {
            datePicker.frame = CGRect(x: 0, y: 0, width: self.view.bounds.width, height: 250.0)
            datePicker.preferredDatePickerStyle = .wheels
        }
        return datePicker
    }()


    self.textField.inputView                = self.datePicker
```
NavigationControllerを使わずに横に遷移させる


## コード
``` Swift
 func tappedNextButton() {
        let nextvc = NextViewController()
        nextvc.modalPresentationStyle = .fullScreen
        let transition = CATransition()
        transition.duration = 0.23
        transition.type = CATransitionType.push
        transition.subtype = CATransitionSubtype.fromRight
        view.window!.layer.add(transition, forKey: kCATransition)
        self.present(nextvc, animated: false, completion: nil)
    }
```

presentをanimated: false にするのを忘れないようにしてください。
Storyboardを使っている場合でも動きました。
node-easymockでクエリパラメータに応じたjsonを返す方法

# 目的
[easymock](https://www.npmjs.com/package/easymock)ってどれくらいのアクティブユーザー数がいるかわかりませんが、自分の担当した案件では使っていたのでそのときのtipsをメモ。

やりたいことは以下のようなリクエストがあったとして、クエリパラメータに応じた場合分けで異なる形式のjsonを返すこと。
easymockでは、URLパスごとに静的なjsonファイルを準備するため、クエリパラメータでの出し分けがちょっと工夫が必要です。
クエリパラメータを見て条件分岐して、利用する静的jsonファイルを選択するイメージですが、easymockでは`if`のような条件分岐は使えないのでそれを代替する手段を記載します。

```http:リクエスト
GET /search?type=sales&year=2015
GET /search?type=engineer&year=2020
```

```json:レスポンス
# type=sales&year=2015の場合
[
  {
    "id": 150101
  }
]

# type=engineer&year=2020の場合
[
  {
    "id": 200201
  }
]
```

# 結論
利用するバージョン：0.2.28

```text:ディレクトリ構造
mock/
├ config.json
└ search_get.json
```


```json:config.json
{
  "variables": {
    "sales_2015": 150101,
    "engineer_2020": 200201
  }
}
```

```json:search_get.json
[
  {
    "id": #{#{type}_#{year}}
  }
]
```

# 解説
easymockには[予め設定できる変数](https://www.npmjs.com/package/easymock#variables)と、[クエリパラメータを格納する変数](https://www.npmjs.com/package/easymock#variables)があります。

今回はこれを組み合わせて同じjsonファイルだけを利用して、2つのクエリパラメータの組み合わせでレスポンスデータを変えています。

変数展開には`#{...}`が利用でき、かつこれを入れ子にできる点がポイント。

ドキュメントには、今回のケースにバッチリはまる使い方が載っていませんでしたが、テストコードを読むとそれっぽいことができることに気が付きました。

```coffeescript:node-easymock/test/mock.test.coffee
    it '#{name_#lang} should be replaced correctly with #lang = de -> #{name_de} => Patrick', (done) ->
      request 'get', '/with_variable_within_variable?lang=de', (res) ->
        res.statusCode.should.equal 200
        json = JSON.parse res.body
        json.should.have.property('name').and.equal 'Patrick'
        done()
```
↪ https://github.com/CyberAgent/node-easymock/blob/master/test/mock.test.coffee#L152-L157

```json:node-easymock/test/mock_data/with_variable_within_variable_get.json
{
  "name": "#{name_#{lang}}"
}
```
↪https://github.com/CyberAgent/node-easymock/blob/master/test/mock_data/with_variable_within_variable_get.json

```json:node-easymock/test/mock_data/config.json
{
  "variables" : {
    "server": "http://server.com",
    "name_de": "Patrick"
  },
  "routes": [
    "/groups/:groupid",
    "/groups/:groupid/show",
    "/groups/:groupid/users/:userid"
  ],
  "proxy": {
    "server": "http://real.com",
    "default": false,
    "calls": {
      "/proxy": true
    }
  }
}
```
↪https://github.com/CyberAgent/node-easymock/blob/master/test/mock_data/config.json