OmniAICreator/Qiita-1.07M huggingface dataset:
ダークモード対応の罠

去年iOS 13の新機能で出たダークモードを自社アプリに対応したのですが、思わぬ挙動でバグが出てしまいそのTips共有です

# traitCollectionDidChangeの罠

ライト⇄ダークの色切り替え時に特定の処理を行いたい場合は
`func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?)`
を使って切り替え時の検知ができます

単純にライト/ダーク時に専用の配色を入れる(例 CGColorで色を入れる必要がある)場合は問題ないですが、それ以外の何か別の設定を入れる(例　ダークモードの時だけ〇〇する)みたいなケースだと問題がおきます

```Swift
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
        
    super.traitCollectionDidChange(previousTraitCollection)
        
    if UITraitCollection.current.userInterfaceStyle == .dark {
        // ダーク時だけしたい処理
    }
        
}
```

コントロールセンターのライト→ダークに切り替え時に `traitCollectionDidChange`
が呼ばれるのですが、 バックグラウンドに入った瞬間に`traitCollectionDidChange`が2回呼ばれます(ライト⇄ダーク切り替えなしに)

しかも、ただ2回呼ばれるのではなくバッググラウンドに入った時に、今端末がライト/ダークどっちの設定が入っているかを確認できる `UITraitCollection.current.userInterfaceStyle`がライトとダークそれぞれの状態で来ます

本来ダークモード設定の時だけしたい処理がバックグラウンド時にライトとダークそれぞれ来ることになり、端末設定がライトモードの時でもダークモード時にしたい処理をしてしまう、期待外れなことが起きてしまいます😇

この挙動がよくわからず・・・
ちなみに他のライフサイクルでの検知できるメソッドだとどうか？
同様の問題が起きてダメでした・・

例 

* viewWillLayoutSubviews
* viewDidLayoutSubviews　

など

# 回避策

個人的にあんまり納得いく修正方法ではありませんが、バッググラウンド時は特定の処理までしないようにしました
バックグラウンド上で設定を変えてもフォアグラウンドに戻った時呼ばれるので問題ないです

```Swift
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
        
    super.traitCollectionDidChange(previousTraitCollection)
    
    if UIApplication.shared.applicationState == .background {
        return
    }
    
    if UITraitCollection.current.userInterfaceStyle == .dark {
        // ダークの時のみしたい処理
    }
        
}
```

なぜ今回の問題になった挙動をするかいまいちわかってないのでうーんっていう気持ちで修正できました()


# おまけ　`traitCollectionDidChange`で色を入れるのは大丈夫なの？

大丈夫です
ライトモード時はライト、ダークモード時はダークの色を入れてくれます(最終的に)
試しにアセットカタログのファイルで以下の色を用意して
![スクリーンショット 2020-08-17 14.39.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80912/fccd0af4-e89d-4abe-2846-6fe46e6cf1fe.png)

* 色
* `UITraitCollection.current.userInterfaceStyle`

の要素をログで追って確認し、ライトモードでバッググラウンド時に入ってみて検証してみました

```
dark

Optional([1.0, 1.0, 1.0, 1.0])

light

Optional([0.0, 0.0, 0.0, 1.0])

```
２回呼ばれますが、
ライトモードだと`ダーク→ライト`の順番に呼ばれるので最終的にライトの色が入ります
同様にダークモードでも `ライト→ダーク`と呼ばれダークの色が入るので大丈夫です
SmartyファイルをTwigに変換する (EC-CUBE2 → EC-CUBE4 移行用)

## テンプレートを捨てたくない

- EC-CUBE3以降、テンプレートエンジンがSmartyからTwigになった
- EC-CUBE2でデフォルトのページを使ってた人は、EC-CUBE4でもそのままデフォルトのページを使えばいいと思う
- オリジナルのページを追加して使ってた人にとっては、それをEC-CUBE4に移行してからも持ち越して使いたいことがある ( = 私)
- それが手で書き移せるような分量ではない場合もある ( = 私)

## 自動変換ツール

### PHP Smarty to Twig Converter
#### [sankarsuda/to-twig](https://github.com/sankarsuda/to-twig)

> toTwig is an utility to convert smarty template engine to twig template engine.

- 個人制作 (インドのSankar Sudaさんありがとう‥‥)
- 7年前に作ったまま放置されている

### Converting Smarty templates to Twig
#### [OXID-eSales/smarty-to-twig-converter](https://github.com/OXID-eSales/smarty-to-twig-converter)

> Converting tool located at GitHub allows to convert existing Smarty template files to Twig syntax. The tool besides standard Smarty syntax is adjusted to handle custom OXID modifications and extensions.

- 上記のto-twigを企業がフォークして自社サービス向けにリファクター&改造した物らしい
- 今もメンテされていて、PHP7.4までバッチリ対応

- こちらをいじくって使っていこうと思います。

```bash
git clone https://github.com/OXID-eSales/smarty-to-twig-converter.git
cd smarty-to-twig-converter
```

## EC-CUBE2式のブラケットに対応させる
- 素のSmartyはブラケットに`{` `}`を使っていますが、EC-CUBE2はこの書式を`<!--{` `}-->`に変更して使っています (ちなみにOXIDでは`[{` `}]`みたいです)。
- コード内の、正規表現でブラケットをパターンマッチさせている部分をEC-CUBE2の書式に合わせて書き換えていきます。

```diff:app\toTwig\Converter\ConverterAbstract.php
    protected function getOpeningTagPattern(string $tagName): string
    {
-       return sprintf("#\[\{\s*%s\b\s*((?:(?!\[\{|\}\]).(?<!\[\{)(?<!\}\]))+)?\}\]#is", preg_quote($tagName, '#'));
+       return sprintf("#<!--\{\s*%s\b\s*((?:(?!<!--\{|\}-->).(?<!<!--\{)(?<!\}-->))+)?\}-->#is", preg_quote($tagName, '#'));
    }

    protected function getClosingTagPattern(string $tagName): string
    {
-       return sprintf("#\[\{\s*/%s\s*\}\]#i", preg_quote($tagName, '#'));
+       return sprintf("#<!--\{\s*/%s\s*\}-->#i", preg_quote($tagName, '#'));
    }

    private function convertFilters(string $string): string
    {
        return preg_replace_callback(
-           '/\|@?(?:\w+)(?:\:|\b)(?:"\s+"|\'\s+\'|[^\s}|])*/',
+           '/\|@?(?:\w+)(?:\:|\b)(?:"\s+"|\'\s+\'|[^}|])*/',
```
```diff:app\toTwig\Converter\VariableConverter.php
    public function convert(string $content): string
    {
-       $pattern = '/\[\{([^{}]+)?\}\]/';
+       $pattern = '/<!--\{([^{}]+)?\}-->/';
```
```diff:app\toTwig\Converter\CommentConverter.php
    public function convert(string $content): string
    {
-       $pattern = '#\[\{\*((?:(?!\[\{|\}\]).(?<!\[\{)(?<!\}\]))+)?\*\}\]#is';
+       $pattern = '#<!--\{\*((?:(?!<!--\{\*|\*\}-->).(?<!<!--\{\*)(?<!\*\}-->))+)?\*\}-->#is';
```

## 変換 → 手動で調整
- 使い方は[マニュアル](https://github.com/OXID-eSales/smarty-to-twig-converter#installation)の通りです。

```bash
composer install
php toTwig convert --path=/path/to/dir --ext=.twig
```
- この自動変換は全く完璧ではありません。生成したTwigファイルをEC-CUBE4に持ってった後、間違いのない表示になるまで手直しし続けることになりました。
- それでも一から書き写すよりはずっと楽でした。終わり！
さくらレンタルサーバのメーリングリストでReply-To:を必ずメーリングリストのアドレスに上書きするようにする方法

## 解決したかったこと(Reply-To行の強制上書き)
メーリングリスト(以下「ML」と記載）の投稿元にYahoo!メールを使ってる人が多くて、Reply-To:が個人のメアドになってしまう。また、さくらレンタルサーバのデフォルト設定では、投稿元メールのReply-To:が設定済みだと　そのまま配信してしまうため、MLで配信されるReply-To:が投稿者メアドになってしまうということが問題になってた。

上記の問題を回避するため、以下の設定変更を行いました。

## 設定ファイルをダウンロード
ffftpなどのftpクライアントソフトを使って、
/home/さくらアカウント名/fml/spool/ml/ML名/cf
ファイルをダウンロードする。

例：さくらアカウント名が「hyogo」、ML名が「sawa」の場合は、 `/home/hyogo/fml/spool/ml/sawa/cf`
をダウンロードする。

[さくらのffftpでの接続方法説明ページ](https://help.sakura.ad.jp/206207161/)

## 設定ファイルの修正
テキストエディタ(さくらエディタ等)でcfファイルを以下の様に修正する。

`YOU CAN EDIT MANUALLY AFTER HERE.`
の下の行に
`&DEFINE_FIELD_FORCED('reply-to', $MAIL_LIST);`
を挿入し、ファイル保存する。

## 設定ファイルのアップロード
修正したcfファイルを、ftpクライアントソフトで「１．」と同じ場所にアップロードする。

## SSHでサーバにログイン
TeratermなどのSSHクライアントソフトで、さくらレンタルサーバにログインする。
[さくらのSSH接続方法説明ページ](https://help.sakura.ad.jp/206054152/)

## SSH上で以下のコマンドを実行する。
初回のみ必要（実行権限付与）

```
$ chmod u+x ~/fml/sbin/makefml
```
毎回必要（変更したcfファイルを読み込んで、config.phを作成する）

```
$ ~/fml/sbin/makefml update-config [ML名]
```

以上です。
アジャイルプラクティス を読んで

## アジャイルプラクティス 達人プログラマに学ぶ現場開発者の習慣
https://www.amazon.co.jp/dp/4274066940
この本、まだ半分ぐらいしか読んでいないのですが、いい言葉がたくさんあったのでメモしたところを書き出してみました。
(これまで結構いろんなアジャイルについての本を読みましたが、開発者視点で見たときにこれが一番わかりやすい本だなと感じています）

### 道を間違えたならどれだけ進んでいたとしても引き返せ (トルコのことわざ)
  - **開発がアジャイルであるということは、協調性を重んじる環境で、フィードバックに基づいた調整を行い続けること**である
- 始めるのに偉大である必要はない。だが、始めなければ偉大にはなれない。
- プロジェクトで仕事をする最大の目的は「**顧客の要求に応えること**」
    - 顧客にとっては誰がアイディアを出したかは関係ない
    - 成果こそが全て
        - だからこそ、感情は捨てて協力する
- 選んだ道が正しくても、座り込んでたら轢かれちまうぜ (ウィル・ロジャース)

###  設計について
- 自分でもよくわかっていない事を厳密にしても意味がない (フォン・ノイマン)
- 戦略的設計: 事前に行う前払い的な設計
    - この段階では詳細に決めすぎないことが大事
       - **河岸にいるわけでもないのに川を渡る方法を考えても意味がない**
    - 要件を定義することに集中する
        - 責務の分離に着目する
        - CRCカードなどを使ってクラスの定義を行う
            - 誰がどの範囲に関係する？がわかればいい
- 戦術的設計: メソッドやパラメータ、フィールドの詳細などを定義する段階
    - **優れた設計は正確であっても精密ではない**
    - 書いてあることは正しいが、変更されるかもしれない箇所や未決定部分の詳細に立ち入るような設計にしてはいけないということ
        - **設計とは目的や意図を示したもので、具体的な手順を示したものではない**
        - 逆に、具体的な手順を書くのは仕様書
    - ニーズに裏打ちされた技術を選ぶ
        - ニーズを特定した上で、採用候補の技術が問題を解決可能か検討する
        - 使うことが目的の技術を使ってはいけない
        - **最新技術を詰め合わせただけの何かはいらない**
            - それらしい理由を付けようとしていたら要注意

### 短いイテレーションでインクリメンタルにリリースする
- ビルド(毎日)
- イテレーション(デモなど。１週間〜１ヶ月)
- インクリメント（機能リリース。１ヶ月〜半年）
- 一年以上の見積もりが出たらそれはやり直し
    - **待ってるうちに市場が変化してしまう**
        - この辺は「LeanとDevOpsの科学」を読むと良い
            - https://www.amazon.co.jp/dp/4295004901

### ユーザーの声に耳を傾ける
- あらゆる不満に真実が潜んでいる
    - エラーが起こったときにできるだけ状況を出力する
    - ユーザーからのフィードバックが最も重要
        - 間違いを馬鹿にするような態度で対応してはいけない
正規化の方法(エンコード)と戻し方(デコード)

# 0. 概要
機械学習においてデータセットの前処理として最も使われているといわれても過言ではない技術に「正規化」がある。正規化を施すことで次元や尺度の異なる数字を同じ大きさで扱えるようになるため、様々な場所で用いられている。この正規化は数量を代表値で割るなどして無次元量化し、互いに比較できるようにすることに他ならない。今回はこの方法について共有する。

# 1. MIN-MAX正規化(0～1)
最も使われている、あるデータセットに含まれるある値を0～1で表現する正規化手法について説明する。

## 1.1. encode
あるデータセット$\mathbb{D}$に含まれる正規化したい値を$x$としたときの式は以下である。

``` math
x_{norm} = \dfrac{x - x_{min}}{x_{max} - x_{min} }
```

Pythonコードは以下である。

``` python
def min_max_encode(self, x, source_min, source_max):
  return (x - source_min) / ( source_max - source_min)
```

## 1.2. decode
次にデコードは以下のように行う。ここで、$x_{norm}$にはエンコードで変換した値が入る。

``` math
x = x_{norm}x_{max} - x_{norm}x_{min} + x_{min} 
```

式展開: 

```math
x_{norm} = \dfrac{x - x_{min}}{x_{max} - x_{min} }\\
x_{norm}x_{max} - x_{norm}x_{min} = x - x_{min} \\
x_{norm}x_{max} - x_{norm}x_{min} + x_{min} = x 
```


Pythonコードは以下である。

```python
def min_max_decode(self, x_norm, source_min, source_max):
  return (x_norm * source_max) - (x_norm * source_min) + source_min
```



# 2. 活性化関数向けの正規化(-1～+1)
深層学習などの活性化関数で`hard-tanh`等を使う場合は入力値も`-1 ~ +1`に変換を行うことがあるだろう。
この際の正規化についても触れておきたい。


## 2.1. encode
あるデータセット$\mathbb{D}$に含まれる正規化したい値を$x$としたときの式は以下である。

``` math
x_{norm} = \dfrac{x - x_{min}}{x_{max} - x_{min} } \cdot 2 - 1
```

Pythonコードは以下である。

``` python
def min_max_encode(self, x, source_min, source_max):
  return (((x - source_min) / ( source_max - source_min) ) * 2.0) - 1.0
```

## 2.2. decode
次にデコードは以下のように行う。ここで、$x_{norm}$にはエンコードで変換した値が入る。

``` math
x = \dfrac{x_{norm}x_{max} - x_{norm}x_{min} + x_{max} + x_{min}}{2}
```

式展開: 

```math
x_{norm} = \dfrac{x - x_{min}}{x_{max} - x_{min} } \cdot 2 - 1 \\
\dfrac{x_{norm} + 1}{2} = \dfrac{x - x_{min}}{x_{max} - x_{min} }\\
\dfrac{(x_{norm} + 1)(x_{max} - x_{min})}{2}=(x - x_{min})\\
\dfrac{x_{norm}x_{max} - x_{norm}x_{min} + x_{max} - x_{min}}{2}+x_{min}=x\\
\dfrac{x_{norm}x_{max} - x_{norm}x_{min} + x_{max} + x_{min}}{2} = x
```


Pythonコードは以下である。

```python
def min_max_decode(self, x_norm, source_min, source_max):
  return ((x_norm * source_max) - (x_norm * source_min) + source_max + source_min) * 0.5
```
[Android] Realmのデータ引っこ抜き

デザイナーなのにエンジニアさんが逃げちゃったのでエンジニアしてるし,せっかくなのでQitta書いてみた

## 環境
Mac Catalina 10.15.4
Android Studio 4.0.1

## 前提
adbコマンド打てない方は打てるようにしてください.
良い記事いっぱいあります.

## 方法 adbコマンド編

かなり面倒な構造になっているけどadbコマンドで直接コピーしたらpermissionなんとかっていうエラーでコピーできない仕様になってるみたいで、一度端末のsdcardに保存してからDesktopに保存してます

```
$ adb shell
```

```
$ run-as <package name>
```

```
sdcard/Download配下にrealmファイルをコピーしているよ
$ cp files/default.realm /sdcard/Download
```

```
Desktopに保存しているよ
$ adb pull /sdcard/Download/default.realm /Users/<user name>/Desktop/
```

## 方法 Realm Studio編

https://realm.io/jp/products/realm-studio/

先ほどコピーしたdefault.realmを表示するとデータの中身が見れます.
自然言語処理等のフィルタリングのために、日本語エロ単語(不適切な単語)を軽く集めました。(200単語くらい)

# 概要

(2020/08/18 22:53 追記.まだ少しですがSexualだけじゃなく、差別的/攻撃的表現も集め始めました)

SNSしかり何でも良いのですが、Wikipediaとかニュースみたいな書き言葉ではなく、話し言葉ベースのデータベースを扱う場合、不適切な単語が混ざってくる可能性が非常に高くなります。

これらの単語が出力結果に混ざってしまったりすると、ちょっと発表しにくい…みたいなことは多々あると思います。
わたしもそうなったのですが、意外とこの手の不適切表現辞書みたいなのが見つからなかったので、軽く集めてみました。

現在は所謂エロ系の単語しかありませんが、MeCabなり何なりで分かち書きして、これらの単語が入ってるか入ってないか判定するだけでもかなりマシになります。

収集の際に気をつけたのは、**健全な意味と不適切な意味両方を含む単語は入れないようにしたことです。**
要は、偽陽性エロ単語を減らすようにしました。(例えばローションという単語はHな意味もありますが、ボディローションなど美容系では普通に使われているので、含まれていません)

このため一部医療系単語と被るものなどは入っておりませんがご了承ください。

その代わりと言ってはなんですが、~~若者の持つエロサイト知識を動員して~~ 結構いろんなところから収集したので、割と最近のエロ用語にも対応していると思います。

# 公開場所
https://github.com/MosasoM/inappropriate-words-ja

※一応MITライセンスついてますが、ライセンスついてないと逆に使いにくいかなと思って付けてある程度です。

# 追記
utf-16対応して一部伏せ字になってるタイプのNGワードを含んだ別ファイルをさく

# おわりに
このエロ単語入っとらんやんけ！というのがあったら教えて下さい。
グロ版とか暴力/薬物版は今は必要ないので作ってないですが、必要にかられたら作ります。
品質の見える化_テストケース作成や処理設計のための資料_メモ_20200817

#品質の「見える」化

**１．品質の見える化を学ぶメリット**

　　現在の開発現場ではほとんどが品質を上げるためにきちんと管理されていますが
　　品質なんてどうでもいいから早く業務を終わらせようという考えの人がチームに
　　いるとすると、気の緩みで大ごとになりかねません。

　　そしてテストケース作成時の考え方としても品質を考えながら限られた時間の中で
　　作業することが求められます。
　　一方で品質管理や品質ってどんなものなのかを教えてから開発現場に新人エンジニアを
　　送る会社は多くはありません。
　　そんな品質ってどんなものかふわっとしているままいざ本番って怖くないでしょうか。

　　「君自分の会社でそんなこと教えてもらえなかったの？」と新人さんが言われてしまうのが
　　もったいないと思います。

　　一番のメリットはやはり実際の開発現場での考え方が身につくこと、
　　より品質を考えたテストケースの作成ができるようになることです。


**２．本当に大丈夫??**

　　本格的な開発現場において品質向上に取り組む場合、以前私が違う記事にて紹介した４段階での
　　大まかな評価ではおおざっぱすぎて正確な評価とは言えません。

　　いくらテストケースをたくさん作ったとしても「これですべてのバグを潰せているのか？
　　いや、まだまだテストしつくしていないのでは？」という不安から逃れられないのです。


　　**品質について安心するために必要なこと**

　　プログラムやクラスの使われ方には全部でどれだけのパターンがあって、テストで試したのは
　　そのうち何パターンか？(＝カバー率)


　　目に見えずに把握しにくい「品質」というものを、何となく高い/低いという表現で議論するのではなく、
　　数値として「**見える化**」することによって品質の根拠を数字などで表すことができると便利ですね。

　　このように品質に限らず、開発に関する把握しにくい様々な事柄を、主に数値の指標として
　　「見える化」したものを、**メトリクス**と呼びます。

　　テストによるカバー率も**テストカバレッジ**または**網羅率**と呼ばれるメトリクスの一つです。



**２．コードのカバレッジ**

　　理想としてはカバー率(要件仕様に対するカバー率)を算出したうえで１００％を目指すことが
　　望ましいのは確かです。

　　しかし実際の開発現場では機械的に計測することが難しいためこの方法はあまり用いられません。

　　その代わりによく用いられるのがコードカバレッジと呼ばれるもので、代表的なものとして
　　**命令網羅率**と**分岐網羅率**が知られています。

**カバレッジの数え方**

命令網羅率の数え方

　　①ソースコードの中の命令文をすべて数える
　　②テストケースを実行した場合に通る命令文を数える
　　③②の数を①の数で割る

分岐網羅率の数え方

　　①フローチャートの中の分岐記号だけに注目する
　　②すべての分岐記号について、流れ出ている各経路の隣に矢印を書く
　　③テストを実行した際に通過した経路の矢印に丸を付ける
　　④③により丸で囲まれた矢印の数を②で書いたすべての矢印の数で割る


**４．本課題を学んでみて**

　　＜筆者の所感＞

　　品質管理の大切さや、それを考えながら作業することなどは実際の現場に行くと親切に教えてくれる
　　人がいたり、一方でそんなこと知ってて常識でしょという人もいると思います。

　　自分が開発現場で実際にもっと品質が向上できるようなテスト仕様書を書いたりするために
　　今回の課題は必要だったなと感じます。

　　フローチャートなど処理的な設計書や基本設計書を作成する際にもこの資料に書いてあることは
　　応用が利くので実践してみようと考えています。


以上、間違っている知識などございましたらご指摘いただけると幸いです。
物体検出(Yolov3)で躓いたところの備忘録

#Windows10でYolov3の物体検出をしました
https://github.com/qqwweee/keras-yolo3
こちらのYolov3を使わせていただきました。
躓いたら書き加えていきます。
個人的な備忘録ですのであしからず。

#train用のファイルの列挙方法
拡張子なしのjpegをtxtで列挙する必要があるのですが、便利なやり方がありました。
http://savannahmonitor.blog10.fc2.com/blog-entry-42.html
こちらのサイトを参考にさせていただきました。
`for /f "delims=" %i in ('dir /b/a-d "パス"') do @(echo %~ni)`

少し書き加えればファイルへの出力もできそうです。

#学習させた結果が反映されない
yolo_video.pyのmodel_pathを変えていないのが原因でした。
classes_pathも書き換えましょう。

#
torch.bmmのスピード改善について

# 何をしたいか
- [[PyTorch] torch.bmmよりも速く、batchごとに内積を計算する方法があった話](https://qiita.com/shinochin/items/aa420e50d847453cc296)（結論では「別記事」として表記）の現状確認
- [`bmm` 5x slower on Maxwell](https://github.com/pytorch/pytorch/issues/889)が依然Openで、しかもtriagedタグまで付いているので自分で確認する。

# 結論

- torch.bmmが結構早くなった
- 特に、GPUで内積を計算するだけなら要素積+和で計算するより早い

### CPU
| 計算方法 | t(内積) | 別記事|
|:---:|:---:|:---:|
| 要素積+和  | 43.4 µs | 26.4 µs |
| torch.bmm  | 199 µs | 964 µs |

### GPU
| 計算方法  | t(内積)  | t(内積+微分)  |  t(微分) | 
|:---:|:---:|:---:|:---:|
| 要素積+和  | 18.7 µs |  262 µs |  243.3 µs |
| torch.bmm  | 17.9 µs |  336 µs |  318.1 µs |

### GPU(別記事)
| 計算方法  | t(内積)  |  t(内積+微分)  |  t(微分) |
|:---:|:---:|:---:|:---:|
| 要素積+和  |  25.9 µs  | 163 µs | 137.1 µs |
| torch.bmm  |  608 µs  | 1.13 ms  | 552 µs |


# 環境

- python: 3.7.2
- pytorch: 1.6.0

# 実行したスクリプト

- 以下はjupyter notebookにて実行

```python:準備
import torch
a = torch.randn(500, 500, dtype=torch.float, device='cpu')
b = torch.randn(500, 500, dtype=torch.float, device='cpu')

c = torch.randn(500, 500, dtype=torch.float, device='cuda')
d = torch.randn(500, 500, dtype=torch.float, device='cuda')

e = torch.randn(500, 500, dtype=torch.float, device='cuda', requires_grad=True)
f = torch.randn(500, 500, dtype=torch.float, device='cuda', requires_grad=True)
```

```python:同じ演算
# 下の２つの演算は同じです。
(a*b).sum(1, keepdim=True)
torch.bmm(a.unsqueeze(1), b.unsqueeze(2)).squeeze(2))
```

```python:cpuで演算（要素積+和）
%timeit (a*b).sum(1, keepdim=True)
43.4 µs ± 3.35 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
```

```python:cpuで演算（bmm）
%timeit torch.bmm(a.unsqueeze(1), b.unsqueeze(2)).squeeze(2)
199 µs ± 2.61 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
```

```python:gpuで演算（要素積+和）
%timeit (c*d).sum(1, keepdim=True)
18.7 µs ± 39.3 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
```

```python:gpuで演算（bmm）
%timeit torch.bmm(c.unsqueeze(1), d.unsqueeze(2)).squeeze(2)
17.9 µs ± 33.9 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
```

```python:gpuで演算+微分（要素積+和）
%timeit (e*f).sum(1, keepdim=True).sum().backward()
262 µs ± 840 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)
```

```python:gpuで演算+微分（bmm）
%timeit torch.bmm(e.unsqueeze(1), f.unsqueeze(2)).squeeze(2).sum().backward()
336 µs ± 270 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)
```

# コメント
- [ここ](https://discuss.pytorch.org/t/dot-product-batch-wise/9746/10)からソースコードを追いかけたかったが、masterと大幅に違って追いかけるのが大変だったので諦めた

# その他関連ページ
- [Dot product batch-wise](https://discuss.pytorch.org/t/dot-product-batch-wise/9746)
- [Support Batch Dot Product](https://github.com/pytorch/pytorch/issues/18027)
大きな数

### はじめに（Introduction）

暗号などで、よく__大きな数__という言葉を使います。
イメージが付きにくいので、ちょっとイメージを作ってみます。

---

### 256bit

このあとは10のべき乗で話を進めていくので、256bitを10のべき乗で表してみます。

$2^{256}=2^6\times(2^{10})^{25}=2^6\times(1024)^{25}>2^6\times(10^3)^{25}$

$2^6\times(10^3)^{25}=2^6\times10^{75}=64\times10^{75}=6.4\times10^{76}$

※：実際は $2^{256}\fallingdotseq 1.1\times10^{77}$

---

### 原子の数（Number of atoms）

高校の化学などで出てきますが、水素原子の数を考えてみます。
水素原子 $1\mathrm{g}$ に含まれる原子の数は、約 $6.02\times 10^{23}$ 個です。
日本人男子の平均体重（2007）は、$64.0\mathrm{kg}$ だそうです。
水素原子の個数を $6.4\times10^4$ 倍すると、約 $4.0\times 10^{28}$ 個となります。
地球の質量は、約 $6.0\times 10^{24}\mathrm{kg}$だそうです。（万有引力から求めるらしい）
水素原子の個数を $6.0\times10^{27}$ 倍すると、約 $3.6\times 10^{50}$ 個となります。

ここから先は、適当に行きます。（イメージが逆に付きづらいと思いまして・・・）
太陽の質量：$2\times10^{30}\mathrm{kg}$　⇒水素原子の個数倍⇒　$1\times10^{61}$ 個
銀河の質量： $2\times10^{42}\mathrm{kg}$　⇒水素原子の個数倍⇒　$1\times10^{73}$ 個
観測可能な宇宙の質量： $3\times10^{52}\mathrm{kg}$　⇒水素原子の個数倍⇒　$2\times10^{83}$ 個

---

### 比較

まとめると、以下のようになります。

地球の分子数$<2^{256}$

衝突は、地球の分子をランダムに２個選んだものが、同じである場合より難しいです。
ハッシュなどが、一様にランダムであればという前提が必要ですが、
体感的に発生すると思いますか？


---

### まとめ（Conclusion）

個人的には体感的に大丈夫な気がしますが、[誕生日のパラドックス](https://ja.wikipedia.org/wiki/%E8%AA%95%E7%94%9F%E6%97%A5%E3%81%AE%E3%83%91%E3%83%A9%E3%83%89%E3%83%83%E3%82%AF%E3%82%B9)などの問題がある為、
実際は体感よりも衝突が起こり得る可能性は高いかもしれません。


---

### 参照（References）

- アボガドロ定数 - Wikipedia<br>https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%9C%E3%82%AC%E3%83%89%E3%83%AD%E5%AE%9A%E6%95%B0

- 水素 - Wikipedia<br>https://ja.wikipedia.org/wiki/%E6%B0%B4%E7%B4%A0

- 体重 - 産業技術総合研究所<br>https://unit.aist.go.jp/riss/crm/exposurefactors/documents/factor/body/weight.pdf

- 地球質量 - Wikipedia<br>https://ja.wikipedia.org/wiki/%E5%9C%B0%E7%90%83%E8%B3%AA%E9%87%8F

- 質量の比較 - Wikipedia<br>https://ja.wikipedia.org/wiki/%E8%B3%AA%E9%87%8F%E3%81%AE%E6%AF%94%E8%BC%83

- 誕生日のパラドックス - Wikipedia<br>https://ja.wikipedia.org/wiki/%E8%AA%95%E7%94%9F%E6%97%A5%E3%81%AE%E3%83%91%E3%83%A9%E3%83%89%E3%83%83%E3%82%AF%E3%82%B9
aws sts get-caller-identityしたときにunknown output typeが表示されたはなし

## はじめに
`aws sts get-caller-identity`をしたら`unknown output type`が表示されて、ちょっとはまったので忘れないようにメモ。

## おきたこと
そもそも`aws sts get-caller-identity`をしようとしたら、間違えて`aws configure`をしてしまいました。（なぜかよくやっちゃう。）なので、いつも通りそのままEnter押していきます。

```
C:\>aws configure
AWS Access Key ID [******************ID]:
AWS Secret Access Key [*****************KEY]:
Default region name [ap-northeast-1]:
Default output format [JSON]:
```

そして、ようやくやりたかったコマンドを打ってみたらUnknown output typeと言われてしまいました。

```
C:\>aws sts get-caller-identity

Unknown output type: JSON

```

<b> JSON </b>であってるのにおかしいなと思いながら、とりあえずもう1回`aws configure`をして小文字の<b> json </b>に変更してみます。

```
C:\>aws configure
AWS Access Key ID [******************ID]:
AWS Secret Access Key [*****************KEY]:
Default region name [ap-northeast-1]:
Default output format [JSON]: json
```


できた。

```
C:\>aws sts get-caller-identity
{
    "UserId": "**********UserId",
    "Account": "*********Account",
    "Arn": "arn:aws:iam::**************:user/me"
}
```
## おわりに
なるほど。小文字なのか。
（じゃあなんでこの前`aws configure`したときは何も問題なかったんだろう…？）
Google Maps もダークモード対応しようね

## スタイルを適用する

`isDarkMode` のようなパラメータがあるわけではなく、自分で用意したスタイルを適用する形になります。
背景は黒、路線は青、文字は白などを個々に指定する必要があります。

指定方法としては [JSON ファイルで指定する方法](https://developers.google.com/maps/documentation/ios-sdk/styling#use_a_json_file) と [String で直接指定する方法](https://developers.google.com/maps/documentation/ios-sdk/styling#use_a_string_resource) がありますが本記事では前者について紹介します。
実装方法は大きく変わりませんが、可読性や Android との共通化の観点から JSON 形式で指定することをお勧めします。

## JSON で指定する

`style.json` などの JSON ファイルをローカルに用意し、Map の `mapStyle` に適用します。

```swift
// Map のインスタンス
let mapView = GMSMapView()

// ローカルファイルの URL を取得
if let styleURL = Bundle.main.url(forResource: "style", withExtension: "json") {
    // スタイルを適用
    mapView.mapStyle = try GMSMapStyle(contentsOfFileURL: styleURL)
}
```

### パラメータ

下記 3 つの要素を 1 セットとして、スタイル指定を配列で羅列していく形になります。

- featureType - 地理的な要素 (国境、施設、道 etc.)
- elementType - 地図上の要素 (線、文字)
- stylers - スタイル (色、明度、表示 / 非表示 etc.)

例えば **一般道の名前を白くする** という指定は以下のようになります。

```json:style.json
[
  {
    "featureType": "road.local",
    "elementType": "labels",
    "stylers": [
      {
        "color": "#FFFFFF"
      }
    ]
  }
]
```

各パラメータの詳細はこちらから。
https://developers.google.com/maps/documentation/ios-sdk/style-reference

## テンプレートあります

パラメータを 1 から全て指定する事は根気がいる作業です。
実際の現場でデザイナーさんに細かく指定してもらう事や確認してもらう事は困難でしょう。

というわけで、スタイルを生成するサイトが公式であります。
https://mapstyle.withgoogle.com

Dark, Night, Aubergine からデザイナーさんと相談して選ぶ or カスタマイズすれば、簡単にダークモード対応が完了します。

## 備考

Android エンジニアさんは [こちら](https://developers.google.com/maps/documentation/android-sdk/styling#pass_a_json_style_object_to_your_map) をどうぞ。
iOS と同様に対応できるので、本記事をご参考いただければ幸いです。
GoogleAppsScriptを使うとサーバレスでサイトを公開できる！

# GoogleAppsScriptを使うとサーバレスでサイトを公開できる！ 
GoogleAppsScriptを使うことで自分でサーバを用意することなく、自分で作成したHTML/CSSを公開することができます。
CDNで読み込むことでjQueryやVue.jsを使うこともできます。
今回はHTMLを0から公開する方法をこちらの記事にまとめました。

<a href="https://masa-enjoy.com/gas-website" target="_blank">GoogleAppsScriptの説明と簡単にWebサイトを作る方法</a>
【Windows/PHP】XAMPPのsendmailでローカル環境からメールを送信する（mb_send_mail()）

#概要
Windowsのローカル環境からメールを送るための設定メモです。
XAMPPを利用しており、その中にあるsendmailを使います。

今回はPHPの`mb_send_mail()`でメールを送るために設定します。

#メールサーバーの準備
メールサーバーを持ち合わせていないので、[mailtrap](https://mailtrap.io/)というサービスを利用します。
無料会員登録で簡単にメールの送受信テストが行えるサービスです。
**（メールサーバーを持っている場合は、そちらの情報を使えばOKです:ok_woman:）**


mailtrapについては以下も参考にして下さい。

- [開発環境からのメール送信テスト](https://qiita.com/e__ri/items/857b12e73080019e00b5#%E3%81%8A%E3%81%BE%E3%81%91%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%81%8B%E3%82%89%E3%81%AE%E3%83%A1%E3%83%BC%E3%83%AB%E9%80%81%E4%BF%A1%E3%83%86%E3%82%B9%E3%83%88)
- [mailtrapを利用してメール送信のテスト](https://qiita.com/denshin_ROKU/items/a9d79494dfff67b64259)

　
まず、mailtrapに登録するとSMTPサーバーの情報が与えられます。
今回はこちらを使って、ローカルからメールを送信できるようにします。
![image02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655954/d744fed0-0182-5f7b-4ae5-fa38c320c63b.png)

#sendmailの設定
XAMPPの中にsendmailのディレクトリがあります。
`C:/xampp/sendmail`

設定ファイル`sendmail.ini`があるので、コピーしてオリジナルを残しておきましょう。
設定ファイルを開いて、SMTPサーバーの情報を記述します。

mailtrapの場合はSMTPサーバーなので、下記の設定で利用が可能です。

```sendmail.ini
; configuration for fake sendmail

; if this file doesn't exist, sendmail.exe will look for the settings in
; the registry, under HKLM\Software\Sendmail

[sendmail]

; you must change mail.mydomain.com to your smtp server,
; or to IIS's "pickup" directory.  (generally C:\Inetpub\mailroot\Pickup)
; emails delivered via IIS's pickup directory cause sendmail to
; run quicker, but you won't get error messages back to the calling
; application.

smtp_server=smtp.mailtrap.io

; smtp port (normally 25)

smtp_port=465

; SMTPS (SSL) support
;   auto = use SSL for port 465, otherwise try to use TLS
;   ssl  = alway use SSL
;   tls  = always use TLS
;   none = never try to use SSL

smtp_ssl=TLS

; if your smtp server requires authentication, modify the following two lines

auth_username=メールサーバーのユーザー名(mailtrapで付与されたもの)
auth_password=メールサーバーのパスワード(mailtrapで付与されたもの)
:
:
```
　
設定ファイルに記述するのは下記の5か所です。
記述したら`sendmail.ini`を上書き保存します。

```ini
smtp_server=メールサーバーのホスト名（例：smtp.mailtrap.io）
smtp_port=使用するポート番号（例：465）
smtp_ssl=使用する暗号化プロトコル（例：TLS）
auth_username=メールサーバーのユーザー名
auth_password=メールサーバーのパスワード
```

#PHPの設定
次に、PHPにsendmailを指定する設定をします。
設定ファイル`C:/xampp/php/php.ini`を編集します。
（パスは環境によって異なります。コピーしてオリジナルを保存しておきましょう。）

php.iniの`sendmail_path`にsendmailの実行ファイルを指定します。
上書き保存して、Webサーバーを再起動させます。

```php.ini
; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").
; http://php.net/sendmail-path
;sendmail_path =
sendmail_path =""C:\xampp\sendmail\sendmail.exe" -t"
```
　
これで設定は完了です。

#参考
- [xamppのfake sendmailを使ってローカル開発環境からメールを送信する](https://helog.jp/xampp/fake-sendmail/)

#まとめ
以上の設定で、PHPで`mb_send_mail()`を使ってメールを送ることができます。
mailtrapは送信したメールが全てmailtrapの受信箱に入るので、指定の送信先では受信されません。

テストメールが自分の受信箱に溜まることがないのでとても便利です。
（送信先をミスっても相手には届かないので、開発中は安心）

これで心置きなくメールテストを行いたいと思います。以上！
WEB開発の会社に未経験で入社したエンジニアがプログラミングで困ったら

## お前誰よ
バックエンドやらフロントエンドやらアプリ開発やら色々やってきた三十路

## やるべきことがわからない
落ち着いてタスク分解しろ

### 例：チームで掲示板を作るという課題が出てきた
1. 掲示板の機能を分解して作業分担する
掲示板は、記事の取得、表示、新規作成、更新、削除など機能がある。まずは実装するべき最小機能を決める。要は仕様の確認、あるいは決定を行う
最小機能なのが味噌で、あれもやりたいこれもやりたいを取り込むと仕事が増えすぎて納期に間に合わないのはしょっちゅうなので、絶対に最小機能の策定からやること
実戦だとクライアントのやりたきことと、実際にできることの仕分け作業に当たる

2. 分担、分割された作業をさらに小さな単位に落とし込む
実際に自分が操作することを考えながら進めると楽
掲示板のスレッドの新規作成を任されたとして、
    - 新規作成ページが表示される
    - 入力できるタイトル項目がある
    - 入力できる概要項目がある
    - 作成ボタンがある
    - 作成ボタンを押すとリクエストがサーバに飛ぶ
    - サーバ側で新しいテーブルが作られる
    - 結果が帰ってくる
    - ホーム画面あるいは作ったスレッドに飛ばされる
    - 等々
    
    ここまでで自分の担当領域にページのデザイン作成やフロント、バックの作業の仕分けはどうなっているかなど疑問が出てくるので、都度確認すること。

3. 実際のコーディングに落としていく際の技術的問題点の洗い出し
    自分の実力で実装できない点がないか細分化したタスクを確認する。できるのかもわからない場合はタスクがまだ大きい。
    後に書くが、自力で調べてもできなさそうな場合はチームや上長に相談すること。その際あまり調べることに時間をかけすぎないこと。10 分以上悩んだら相談する方向に切り替える

4. コーディングする
    あとは書くだけ。

## 〇〇のやり方がわからない
### ググる
大抵のことはググったら解決する
わからなかったら質問を英語に切り替える。英語がわからない人でもブラウザの翻訳機能を使って無理にでも調べる
stackoverflow なら大抵の情報は乗っている

拾ってきた情報をコピペするか写経して動いたら、必ず動く原理を理解する。順番は逆でもいい。理解できないソースコードを自分が書いてしまうことは、いざというとき責任を持てないのでやってはいけない
また写経は勉強になるのでおすすめ。タイピング速度の向上にも繋がるし、打ち間違えで発生するエラーに強くなる。

### 人に聞く
10 分ググってわからなかったら人に聞くこと。ただし礼儀を持って質問すること
HRT 原則(謙虚、尊敬、信頼)を守ること。社内外問わず重要。むしろ社会人にとって重要
人に聞くときは、要点をまとめて、可能ならスクショなどと合わせて質問できると答える側は楽。答える側に立って質問を組み立てると、そのうち問題点が整理されて自力解決できたりするメリットもある

### エラーを読む
エラーが出ている場合はエラーに答えは書いてある。英語で。難しかったら翻訳にかければ原因は大抵わかる
それでもわからなかったらエラー文をコピペして検索するといい。ただしファイル名など固有の文言は削除する

## その他
### よくお世話になるページ
[qiita](https://qiita.com/)
[stackoverflow](https://stackoverflow.com/)
[MDN](https://developer.mozilla.org/ja/docs/Web)
mysql起動しなかった

mysql -u rootとターミナルで撃ちましたが、
 Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

と出てしまいました。

しかしそもそもmysqlをきちんと起動していなかっただけなのです。
mysql.server restartを押し、再度mysql -u rootを実行

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.21 Homebrew

と出てくれました。
LEDマトリクスパネルのPPMファイル生成（日本語RGB対応）

RGBマトリクスに、引数文字とRGBでppmファイルを生成します。
（python3はまだ調整できず）
nodejsと組み合わせれば、Webインターフェースでリアルタイムで文字表示できます。

#1.ライブラリインストール
 apt install fonts-takao-mincho
 apt install libjpeg-dev
 pip install Pillow


```perl:makePpm.pl

#encoding:UTF-8
#-*- codinf:utf-8 -*-

import sys
from PIL import ImageFont
from PIL import Image
from PIL import ImageDraw

args = sys.argv
inText = args[1].decode('utf-8')

rgb = args[2].split(",")
list = list(map(int,rgb))

viewText = []
viewText.append( ((u"    ") + inText ,tuple(list)))
text = tuple(viewText)

font = ImageFont.truetype("/usr/share/fonts/truetype/takao-mincho/TakaoMincho.ttf", 16)
all_text = ""
for text_color_pair in text:
    t = text_color_pair[0]
    all_text = all_text + t

width, ignore = font.getsize(all_text)

im = Image.new("RGB", (width + 30, 16), "black")
draw = ImageDraw.Draw(im)

x = 0;
for text_color_pair in text:
    t = text_color_pair[0]
    c = text_color_pair[1]
    #print("t=" + t + " " + str(c) + " " + str(x))
    draw.text((x, 0), t, c, font=font)
    x = x + font.getsize(t)[0]

im.save("/var/tmp/text.ppm")

```

#2.実行
python makePpm.pl 文字列 255,255,255

#3.その他
参考にしたサイト
https://digirakuda.org/contents/report/products/raspberrypi/electric-bulletin-board/
AWS EC2のMySQL起動できない！Buffer poolのメモリが足りない！

業務中にいつも使っているMySQLの障害が発生しまして、それを解決するため行った対応をメモしました。

## 問題

EC2上にMySQLのDBを作成して運用していて、最初は異常なく使ってきましたが、最近よく週一回の頻度で意図しないMySQL停止が起こされて、MySQLの再起動を行っても直らない現象がありました。

## 結論

InnoDBのBuffer poolのメモリが足りないことでした。
そのため、Swap領域を作ってあげて、MySQLを再起動して解決しました。

## エラー調査

### 1. statusを確認する。

```
systemctl status mysqld.service
```

下記のようなメッセージが出てきましたので、MySQLサービスは動いてないことを確定しました。

```
● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: failed (Result: start-limit) since Mon 2020-08-17 09:07:45 JST; 2s ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 3726 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS (code=exited, status=1/FAILURE)
  Process: 3704 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
 Main PID: 24323 (code=killed, signal=KILL)

systemd[1]: Failed to start MySQL Server.
systemd[1]: Unit mysqld.service entered failed state.
systemd[1]: mysqld.service failed.
systemd[1]: mysqld.service holdoff time over, scheduling restart.
systemd[1]: start request repeated too quickly for mysqld.service
systemd[1]: Failed to start MySQL Server.
systemd[1]: Unit mysqld.service entered failed state.
systemd[1]: mysqld.service failed.
```

### 2. mysqld.logの内容を確認する。

`my.cnf`にログの保存場所を記載しています。`my.cnf`の場所を忘れた場合、下記のコマンドで可能な場所を探してください。

```sh
mysql --help | grep my.cnf
                      order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf
```

`my.cnf`の中に、**log-error=/var/log/mysqld.log**という記述がありましたので、ログの場所を確認できます。

```mysqld.log
[Note] InnoDB: Initializing buffer pool, total size = 128M, instances = 1, chunk size = 128M
[ERROR] InnoDB: mmap(137428992 bytes) failed; errno 12
[ERROR] InnoDB: Cannot allocate memory for the buffer pool
[ERROR] InnoDB: Plugin initialization aborted with error Generic error
```

buffer poolのメモリの問題でして、容量が足りないではないかと思い、一旦容量を増やす方向で対応します。


## 解決方法

```
// 空ファイルの作成
# dd if=/dev/zero of=/swapfile bs=1M count=1024

// 作成したファイルをswap領域に設定
# mkswap /swapfile

// swap領域を有効にする
# swapon /swapfile

// メモリの確認
# free -m
      total        used        free      shared  buff/cache   available
Mem:    479         167          11           3         300         296
Swap   1023           0        1023

// MySQL再起動
# systemctl restart mysqld.service

// MySQL status確認
# systemctl status mysqld.service
```


## 他の方法

試してないですが、一応別の方法も記載しておきます。

MySQLの設定でbuffer_pool_sizeの変更は可能みたいですので、設定値を編集してみるのも良いかもしれません。
`my.cnf`に下記の記述を追加or編集してから、再起動します。

```
innodb_buffer_pool_size = 256M
```

MySQLにアクセスできる場合、下記のコマンドで設定値の確認ができます。

```sql
> SHOW VARIABLES LIKE 'innodb_buffer_pool_size'

Variable_name	         Value
innodb_buffer_pool_size	 134217728
```



## 最後

MySQLを再起動したら、`innodb_buffer_pool_size`を確認しました。

```sql

Variable_name	         Value
innodb_buffer_pool_size	 134217728
```

先ほどのエラログの内容

```mysqld.log
[ERROR] InnoDB: mmap(137428992 bytes) failed; errno 12
```

両方を再度確認してみたら、やはり容量が足りないことがわかりました。
swap領域を作成してあげましたので、これで一旦解決できていると思います。

作業メモは以上でした。
iosでプッシュ通知の証明書を.p12形式でexportしようとしたら.p12形式が選択できない問題について

備忘録

[この記事を参考にしました](https://ja.stackoverflow.com/questions/1729/ios%E3%81%A7%E3%83%97%E3%83%83%E3%82%B7%E3%83%A5%E9%80%9A%E7%9F%A5%E3%81%AE%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%92-p12%E5%BD%A2%E5%BC%8F%E3%81%A7export%E3%81%97%E3%82%88%E3%81%86%E3%81%A8%E3%81%97%E3%81%9F%E3%82%89-p12%E5%BD%A2%E5%BC%8F%E3%81%8C%E9%81%B8%E6%8A%9E%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84)

まとめると
キーチェーンアクセスのログインからではなく
分類の自分の証明書から選んで右クリックで.p12を使用できる

![スクリーンショット 2020-08-17 12.33.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/88f30bdf-47a0-eec6-c6b4-fe1c3ad7fe05.png)
【PHP】容量が大きくアップロードが中断される、タイムアウトする際の対処法

##はじめに
業務上でPHPファイルがインポートできなかった際に調べたサイト（ページ下部リンク参照）を参考にしています。
素人の備忘録程度の投稿なので、至らない点があると思いますがご了承ください:blush:
##①容量が大きくアップロードが中断される場合
容量が大きいファイルの場合、`php.ini`ファイルを書き換える必要があります。
アップロードされるファイルサイズの上限が決まっているので、php.iniファイル内の下記を修正します。

・memory_limit（使用できるメモリの上限設定）
・post_max_size（POSTされるデータの上限設定）
・upload_max_filesize（アップロードされるファイルサイズの上限設定）
<br>


```php.ini
memory_limit = 128M
post_max_size = 8M
upload_max_filesize = 2M
```
例えばこのような設定になっている場合

```php.ini
memory_limit = 128M
post_max_size = 128M
upload_max_filesize = 128M
```
全体的に値を大きくすることでファイル上限を上げ、アップロードできるようになります。

##②アップロードしようとするとタイムアウトする場合
容量の大きいファイルをアップロードするに伴い、アップロードに時間がかかるためタイムアウトしてしまう可能性があります。
その場合、`config.default.php`ファイルを書き換えることで問題を解消できます。
<br>

```config.default.php
$cfg[‘ExecTimeLimit’] = 300;
```
例えばこのような設定になっている場合、時間制限が300秒となります。

```config.default.php
$cfg[‘ExecTimeLimit’] = 0;
```
数字を0にすることで、時間が無制限になりタイムアウトしなくなります。
##参考にさせていただいたサイト
・[ファイル容量を大きくする方法](https://webkaru.net/mysql/phpmyadmin-upload-file-size/)

・[タイムアウトを防ぐ方法](https://ousia.so/blog/it/105.html)
Rails jsファイルの読み込みはなぜviewの一番下に記述するのか？

##今までなんとなくでjsファイルの読み込みをviewの一番下に記述してたが、なぜそうするのかが学べたので備忘録投稿



##scriptタグを記述する場所
scriptタグを記述する場所は以下の２つ
- `</body>`の直前
- `<head></head>`の中


##どっちに記述した方がいいの？
**通常は`</body>`の直前に記述するのがいい。**
理由としてはブラウザがHTML要素を読み込むとき、上から順々に読み込んでいく。そのときにjsのコードを読み込むのはHTMLに比べて時間がかかる。
つまり上に記述される`<head></head>`の中にすると、jsの読み込み時間がかかってしまい肝心なHTML要素が読み込まれずに、ブラウザに何も表示されなくなる時間が発生してしまう。


## つまり`</body>`の直前に記述すると、、、？
`<body></body>`の最後に記述することによって、HTML要素の解析を済ましてからjsファイルの読み込みをさせた方が、ユーザビリティが高い



##例外
`<body></body>`が表示されると同時にjsを実行させたり、jsでcssを操作する場合などは`<head></head>`の中に記述する必要がある。
ThinkPad x1 Carbon 2019にインストールしたUbuntu20.04で中央クリックの動作を無効にする

## 中央クリックの動作
貼り付けになっているのだけれど、すごくやっかいなのでやめたい

## 参考
https://www.virment.com/thinkpad-ubuntu-how-to-disable-middle-button-paste/

## xinputコマンドで入力デバイスの一覧を取得
- `TPPS/2 Elan TrackPoint` がトラックポイント部分のよう

```
yuta:~ $ export DISPLAY=:0
yuta:~ $ xinput 
⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ SYNA8004:00 06CB:CD8B Mouse               id=11   [slave  pointer  (2)]
⎜   ↳ SYNA8004:00 06CB:CD8B Touchpad            id=12   [slave  pointer  (2)]
⎜   ↳ TPPS/2 Elan TrackPoint                    id=15   [slave  pointer  (2)]
⎣ Virtual core keyboard                         id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Video Bus                                 id=7    [slave  keyboard (3)]
    ↳ Sleep Button                              id=8    [slave  keyboard (3)]
    ↳ Integrated Camera: Integrated C           id=9    [slave  keyboard (3)]
    ↳ Integrated Camera: Integrated I           id=10   [slave  keyboard (3)]
    ↳ sof-hda-dsp Headset Jack                  id=13   [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=14   [slave  keyboard (3)]
    ↳ ThinkPad Extra Buttons                    id=16   [slave  keyboard (3)]
yuta:~ $ 
```


## トラックポイント部分のキーマップを取得

```
yuta:~ $ xinput get-button-map "TPPS/2 Elan TrackPoint"
1 2 3 4 5 6 7 
```

## 無効化設定

```
yuta:~ $ xinput set-button-map "TPPS/2 Elan TrackPoint" 1 0 3 4 5 6 7
```

## 永続化設定

- `.bashrc`に追記

```
# Disable Center Click
xinput set-button-map "TPPS/2 Elan TrackPoint" 1 0 3 4 5 6 7
```
MacBookにbluetoothスピーカーを２台接続して、左右の音声を分けて再生

ASMRをスピーカーで再生して、部屋全体で聞いてみたいと思い調べてみました。

スピーカーはsonyのSRS-CB20を2台
パソコンはMacBook Pro 15-inch,2016(catalina10.15.6)を使いました


まずスピーカー二台をbluetoothでパソコンに接続しました。

Macの方でaudio midi設定を開く

+を押して、機器セットを作成を選択

sis-xb20というスピーカーが二つ表示されているので、出力2となっているチェックボックスを2つ選択。

右下のスピーカーを構成を選択

新しいウインドウの上の方に
ストリーム1には2個のチャンネル(1~2)があります
ストリーム2には2個のチャンネル(3~4)があります
とあるので
2つとものチェックボックを選択しておく


構成はどれでも良さそう。スピーカーを2台より増やしたい場合は4チャンネルサラウンドとかが良さそう

下の部分でどのスピーカーでどのチャンネルを鳴らすか設定。

適用する


簡単に左右でスピーカ分けられたか確認するために
https://www.youtube.com/watch?v=6CX2ggL6m-s
で確認した。


音の数が増えたら
https://www.youtube.com/watch?v=PqVCPE8_ntE
らへんで確認したら良さそう




最終的には
https://www.youtube.com/watch?v=8azKPNZQCpA&t=96s
等の動画で、部屋全体でASMRを楽しめそう



自分でサラウンドの動画をpremiereproで作るときは
https://www.youtube.com/watch?v=sPZetdqyrqg
https://www.youtube.com/watch?v=ykMmrW3zxgo
を参考にしたら良さそう


立体音響やサラウンド関係の用語の説明は
https://www.denon.jp/ja-jp/blog/3849/index.html
が良さそう

右のスピーカーは[スピーカーR] 右後ろのスピーカーは[スピーカーSR]
左のスピーカーはL 左後ろのスピーカーはSL

サラウンドライトやサラウンドレフトが後ろからの音声ということがわかった
CSV出力の0落ち対応

# はじめに
`001`などの先頭が0となっている数値をCSV出力しようとすると、0が省略され`1`と出力される問題の対応についてです。

# 対応

```ruby
'="001"'
```
固定値の場合はこれで問題ないが、変数だと式展開されないので以下のようにする。

```ruby
# ダブルクォートで囲むことに注意
%Q{="#{hoge}"}
```
Rubocop準拠すると、

```ruby
# ダブルクォートで囲むことに注意
%(="#{hoge}")
```
【UnityEditor拡張】Transportなどのプロパティ値を変更して反映する

# 概要

Unityのエディタ拡張などでオブジェクトの位置などを一括で設定したい！って場合のやり方を記載する。

# やり方

```C#
void SetPosition(Vector3 pos)
{
    var obj = GameObject.Find("Player");
    obj.transform.position = pos;
}
```

これでPlayerゲームオブジェクトの位置を設定できた。…わけではない。

これをエディタ上で実行してもSceneビュー上だと確かに位置は動いているが、
変更された形跡もないし保存もできない、なぜだか変更した値が反映されていないというおかしな状態になってしまう。

# 正しいやり方

一旦、値を設定する`transform`を`SerializedObject`に変換して値を変更する必要がある。

```C#
void SetPosition(Vector3 pos)
{
    var obj = GameObject.Find("Player");

    var serializedTransform = new SerializedObject(obj.transform);

    // オブジェクトの値を最新のものに更新
    serializedTransform.Update();

    // 位置を示すプロパティ名はm_LocalPosition
    // 型はVector3なので.vector3Valueに代入
    serializedTransform.FindProperty("m_LocalPosition").vector3Value = pos;
    
    // 変更した値を適用
    serializedTransform.ApplyModifiedProperties();
}
```

上記のようにして変更する。
すると、値はしっかりと変更され、Hierarchyビューでも変更を示すマークが付く。もちろんUndoも可能になる。

# プロパティ名の調べ方

プロパティ名は、以下のようにすると一覧が取得できる。

```C#
var iterator = serializedObject.GetIterator();
while (iterator.NextVisible(true)){
    Debug.Log (iterator.propertyPath);
}
```

下記のリンク先の丸パクリですみません……。

# 参考リンク

以下の記事を参考にさせていただきました。

* https://light11.hatenadiary.com/entry/2018/03/15/225709
* https://qiita.com/messhi/items/85f878453639352d7667


以上です。
MySQL⑤　抽出

#データを抽出する
####全てのデータを抽出する
select * from users;
####カラムを指定して抽出する
select id, name from users;
####条件をつける
< > <= >= = <> !=
is null, is not null
and or not


###float型の様な小数についてはうまく表すことができず多くのデータベースは小数を「それに最も近い数値」として保存するようになっています。
数値を整数に変換してから保存する。


####scoreが6.0以上
select * from users where score >= 6.0;

####score が3.0以上6.0以下
select * from users where score >= 3.0 and score <= 6.0;
select * from users where score between 3.0 and 6.0;

####name が AAA か BBB 
select * from users where name = 'taguchi' or name = 'fkoji';
select * from users where name in ('taguchi', 'fkoji');


#文字列が一致
select * from users where name = 'taguchi';
####特定の１文字から始まる　like '文字%'
select * from users where name like 't%';
####特定の１文字で終わる　like '%文字'
select * from users where name like '%a';
####特定の１文字を含む　like '%文字%'
select * from users where name like '%a%';
####大文字と小文字を区別する　ike binary '文字%';
select * from users where name like binary 'T%';

####文字数を指定する　like '______';
６文字
select * from users where name like '______';
####何文字目に特定の文字を含む　like '__文字%';
2文字目にaを含む
+select * from users where name like '_a%';


##並び替え､抽出件数の制限
####小さい順に並び替える。　select * from テーブル名 order by カラム名; 
select * from users order by score;

####大きい順に並び替える。　select * from テーブル名 order by カラム名 desc; 
select * from users where score is not null order by score desc;

####件数を制限する　limit 件数;
select * from users limit 3;

####次の 数件を表示したい limit 飛ばす件数 offset 表示する件数; 
select * from users limit 3 offset 3;

####組み合わせると 
select * from users order by score desc limit 3;
TikTok って本当に危険なの？って聞かれたので

# はじめに
いまは、２０２０年８月。
新型コロナで世界がたいへんなことになっている。
ニュースでは「コロナ禍」ってよく言われているけど
「[禍](https://kotobank.jp/word/禍-456274)」って普段使わない難しい言葉だよね〜。

さて、お盆ってこともあり親戚２〜３人で家飲み。
そこでの話題について、簡単に書こうと思う。
（プログラミング技術とは直接関係ないけど...）

書き始める前に、世間一般はどのように思っているのかを事前調査。
キーワード「tiktok なぜ」で１週間以内の記事検索でトップヒットしたのが以下の記事でした。
（まあ、多くの人はこんな風に感じているんでしょう）

- [なぜ？　中国アプリTikTokに米トランプ大統領が異例の圧力](https://www.itmedia.co.jp/business/articles/2008/12/news023.html) (ITmediaビジネス)


# TikTok って本当に危険なの？
って聞かれた。

そのときの自分の答えは「**危険**と思う」

セキュリティの専門家でもないので間違っているかもしれないけど(笑)

# 自分の理解（それほど、細かく書かないし説明しない）
- 「TikTok」だけじゃ危険じゃない
- 「TikTok」に「Huawei」と「スーパーコンピュータ」を混ぜると危険
  - TikTok は「[木馬](https://ja.wikipedia.org/wiki/トロイアの木馬)」
  - Huawei は「主要道路」（ワイヤレス通信の要所）
  - スーパーコンピュータは「大量のデータを扱うツール」
- TikTok にアップロードされる情報は暗号化されている
- 暗号化されているので、関係者外は内容をみることができない
- しかし暗号化された情報はだれでも見ることができる
   - 「だれでも」には当然「Huawei」が含まれる
- 当然、TikTok は暗号化された情報を受け取り、復号までできる

# どうなる？
先ほどの情報を組み合わせると「物理的な位置情報」と「ワイヤレス通信経路」が見えてくる。
他にもたくさん見えてくる！

これはもう
手札を見せてポーカーしているような物じゃないかな？

最後の勝負が始まったら、H社の機器を止めることが可能ってこと。
止まるだけじゃなく、他のネットワーク機器を攻撃を開始することだって可能。

すでに、指令を待っているソフトウェアが組み込まれている可能性だってある。


# さいごに
最後の勝負が始まらないことを願いますが
その判断は自分たちではなんともできない事柄。

始まったら必ず勝負に巻き込まれると思いませんか？
貴方はどっちを応援しますか？





<!-- eof -->
SQL　データ加工の基礎的な方法Ⅱ

◆サブクエリ
SELECT name 
FROM players
WHERE gols >(
SELECT goals
FROM players
WHERE name = "中田"
);

サブクエリで「中田の得点数を取得」
「中田の得点数を取得」より多い選手を取得している

◆AS
カラム名 AS "名前"　
カラム名に定義する名前を指定

複数のカラム名を接続する際には、
カラム名 AS "名前",カラム名 AS "名前"


◆テーブルを紐づける
テーブルを紐づけるためには外部キーと主キーを指定することで
紐づけることができる。

◆join

SELECT *
FROM テーブルA
JOIN テーブルB
ON テーブルA.カラム名 = テーブルB.カラム名;

◆全体実行順序の確認
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635497/9973d1ad-b712-5a49-7a64-f4387b9a61d2.png)

◆LEFT JOIN

SELECT *
FROM players
LEFT JOIN teams
ON テーブルA.カラム名 = テーブルB.カラム名;

◆複数テーブルのJOIN

SELECT *
FROM players
JOIN countries
ON テーブルA.カラム名 = テーブルB.カラム名;
LEFT JOIN teams
ON テーブルC.カラム名 = テーブルD.カラム名;
BlenderでglTF2.0エクスポートしたデータをthree.jsで透過表示

three.jsで3Dモデルを透過で表示したいメモ

##利用した3Dモデル
https://free3d.com/3d-model/male-base-mesh-6682.html
![NoName_2020-8-17_11-24-55_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/bdc49595-520a-0776-fdc6-48d8e7a2ccc7.png)


##Blenderで読み込んでglTF2.0でエクスポート

![NoName_2020-8-17_11-26-3_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/51358a02-8f29-c35f-d8a6-abe5d45e4813.png)


##GLTFLoaderで透過の設定を追加

``` js
//3Dオブジェクトの読み込み配置
let model = null;
let loader = new GLTFLoader();
loader.load('./assets/models/man.glb',
  function (gltf) {
    let OPACITY =  0.7// Meshに付与する透過度
    ,TRANSPARENT = true// Meshの透過を有効にするか
    ,DEPTH_TEST = false// Meshの陰面処理を有効にするか
    model = gltf.scene;

    model.children[0].material.opacity=OPACITY;
    model.children[0].material.transparent=TRANSPARENT;
    model.children[0].material.depthTest=DEPTH_TEST;;

    model.scale.set(10.0, 10.0, 10.0);
    model.position.set(0,-185,0);
    scene.add(gltf.scene);
  },
  function ( error ) {
      console.log( 'An error happened' );
      console.log( error );
  });
```

##サイト表示
![NoName_2020-8-17_11-21-44_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/f34fd5df-09dc-0a45-fddc-af14d35ede7e.png)


##参考サイト
three.js で Mesh をレントゲン透視みたいに表示してみた
https://pisuke-code.com/three-js-mesh-x-ray-effect/
もうWIPなんて使わないぜ

Githubのドラフト機能を使えばいちいち[WIP]をつけたり消したりしなくて良さげなのでそうしようって話です。

## やり方
プルリクを作る時にプルリク作るボタンの右側の三角押すと`Create draft pull request`と出るのでそっちを選ぶ。
![Screen Shot 2020-08-17 at 11.12.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312001/59b4f648-712e-05a5-f1fd-3204e282d763.png)

Draftから普通のプルリクにしたいときはReady for reviewをクリックする（諸事情により色々隠してます笑）
![Screen Shot 2020-08-17 at 11.13.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312001/c89f288c-b369-3a10-580a-7cdc2cb43254.png)

またDraftに戻したいときは右側のリストから`Convert to draft`をクリック
![Screen Shot 2020-08-17 at 11.17.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312001/d33023d9-27c1-5c78-14e2-e866b1187776.png)

プルリクのリストを見るとDraftはDraftって書いてあるし、リストの左側のマージするよみたいなマークが灰色になっているので分かりやすいかと思います（普通のプルリクの場合は緑色）。
![Screen Shot 2020-08-17 at 11.20.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312001/d4b863e2-71ad-c6a5-c238-42a2850f734a.png)

場合によっては必要な人もいるかもしれませんが、少なくとも自分はこんな感じでもうWIPはいらないやってなりました。
vue.js コンポーネント間のデータのやりとり

vueコンポーネント間でデータを送る方法は　親⇒子　と　子⇒親　の場合で異なる。

#親⇒子　propsでデータを受け取る
子コンポーネントの`export default{}` 内でpropsオプションでプロパティを用意する。

```vuejs:child.vue
<script>
export default {
    props: {
        x: {
            type: Number,
            default: 1
        },
    }
}
</script>
```

ここで`x`は数値型、初期値1で宣言しているが、
`props: ['x']`と変数だけ用意してもいい。

親コンポーネント側で子を呼び出す際に属性としてデータを渡すことができる。

```vuejs:parent.vue
<template>
  <Child :x="10"></Child>
</template>
```




#子⇒親 $emitでデータを送る
子コンポーネントでカスタムイベントである$emitを用意する。

```vuejs:child.vue
<template>
<div>
    <button @click="clickAction">x</button>
</div>
</template>

<script>
export default {
    props: {
        x: {
            type: Number,
            default: 1
        },
    },
    methods: {
        clickAction() {
            this.$emit("clicked", this.x + 100);
        }
    }
}
</script>
```

ここでは`<button>`を押した際のアクションとして$emitが発火される。

送られた値は、親コンポーネント側では$eventで受け取ることができる。

```vuejs:parent.vue
<template>
  <Child v-on:clicked="y = $event"></Child>
</template>
```

ここでは親の`y`という変数で受け取っている。
Androidエミュレータで指紋認証を実行する方法

F1(Mac の場合は Command+/)キーを押してExtended controlsウィンドウを開きます。
![Screenshot from 2020-08-17 10-57-52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658122/813459f1-4358-9272-e2a4-8852395231a3.png)

メニュー内の「Fingerprint」から指紋認証をエミュレータ上で実行することが出来ます。

## 指紋データの登録

設定→セキュリティ→指紋登録画面を開きます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658122/31cfdb2c-ecf0-629e-a517-58f53046924f.png" width=30%>

TOUCH THE SENSORをクリックしてFinger1の指紋を登録します。

## 指紋認証を実行する

あとは指紋認証を使用したいときに、事前に登録しておいたFinger1を指定してTOUCH THE SENSORをクリックするだけで指紋認証に通るようになります。登録してないFinger2などの選択すると指紋認証を失敗させることもできます。

![Peek 2020-08-17 11-20.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658122/91b6838d-d2dd-e8e1-2976-785ef9e0118a.gif)


参考:[Android Emulator 上でアプリを実行する](https://developer.android.com/studio/run/emulator?hl=ja&authuser=1)
【GCP・Azure】BIツールについて考えてみた

GoogleはLookerおしですが、他のクラウドサービスでは、BIツールはどうなってるのかを調べてみました。
といっても、Azureに関してのみですが、備忘録的に記載しておきました。

#power bi(micro soft の製品)
・power platform の製品群で、分析ツール、可視化できる。古くからある製品で分析といえばこれ！という感じ。
・昔はフリーであったが、今はフリーと有料版がある。データの最大容量がちがうなど。
※power bi　pro 

・SQL server visualise から切り出したサービス
・いろんなクラウドサービスのデータも扱える。他のクラウドのも可視化できる。
・クライアントにインストールするので、リッチに使える。
・office連携をうまくできる
・power bi の話題もおおい。
OTTERがSKIコンビネータ計算の麓あたりにいるぞ

SKIコンビネータ計算は、結合子論理(≒Combinatory Logic)のトピックの１つ。

■ I(Identity combinator) 
Ix = x

■ K(Constant (独Konstant) combinator) : 別名 Kestral (チョウゲンボウ)
Kxy = x

■ S(Substitution combinator) : 別名 Starling(ホシムクドリ)
Sxyz = xz(yz)

S,K,Iを使っていろいろな演算子を導出する。

例) SとKからIを導出する

I = SKK 
SKKx = Ix = x

[OTTER](https://www.kindaikagaku.co.jp/news/20180831.html)でやってみる。。。

<pre>

set(hyper_res).

list(sos).
n([S,K,K,x]). % | -n([S,K,S,x]).
end_of_list.

list(usable).
-n([S,x,y,z]) | n([x,z,(y*z)]).
-n([K,x,y]) | n([x]).
-n([S,x,y,z]) | -n([z]) | n([S,x,y,z],[I(z)]).
end_of_list.

list(passive).
-n([S,x,y,z],[I(z)]).
end_of_list.
</pre>

(ﾟ∀ﾟ) 

<pre>

---------------- PROOF ----------------

1 [] n([S,K,K,x]).
2 [] -n([S,x,y,z])|n([x,z,y*z]).
3 [] -n([K,x,y])|n([x]).
4 [] -n([S,x,y,z])| -n([z])|n([S,x,y,z],[I(z)]).
5 [] -n([S,x,y,z],[I(z)]).
6 [hyper,1,2] n([K,x,K*x]).
7 [hyper,6,3] n([x]).
8 [hyper,7,4,1] n([S,K,K,x],[I(x)]).
9 [binary,8.1,5.1] $F.

------------ end of proof -------------


Search stopped by max_proofs option.


Search stopped by max_proofs option.

============ end of search ============

-------------- statistics -------------
clauses given                  3
clauses generated              3
  hyper_res generated          3
demod & eval rewrites          0
clauses wt,lit,sk delete       0
tautologies deleted            0
clauses forward subsumed       0
  (subsumed by sos)            0
unit deletions                 0
factor simplifications         0
clauses kept                   3
new demodulators               0
empty clauses                  1
clauses back demodulated       0
clauses back subsumed          1
usable size                    5
sos size                       1
demodulators size              0
passive size                   1
hot size                       0
Kbytes malloced              976

</pre>

数式を書いてみる。。。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163445/845e33fa-ed50-df97-415e-c4dd3992ce1d.jpeg" width=50%> 

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163445/9a0c9b85-9a2a-c309-90f1-e1296b729187.jpeg" width=50%>