OmniAICreator/Qiita-1.07M huggingface dataset:
とうとうXMindに手を出した。クセになりそうだぞ。

## XMindとは？

一言でいうと電子版マインドマップ。それ以上でもそれ以下でもなく、素晴らしいツール（だということに今回気づいた）。

## なぜXMindを使うのか？

普段の思考整理では「紙とペン」を使ってマインドマップを書くのだが、前々から電子版のマインドマップを導入できないか考えていた。

ルーズリーフのA4ノートとペンを持ち歩くのは苦ではないが、「Macで作業しているところにノートも広げる」のがなかなか非スマートな感じがしていたのだ。（理解しづらい感覚で申し訳、スルーしてください）

しかし「なんか使いにくそう」とか、「手で書いた方が早いだろう」という感情に負けて手を出せずにいた。

今回は、思い切って試しに使ってみた[『XMind』](http://jp.xmind.net/download/)がなかなか使いやすく、手書きには無いメリットも感じる事ができた（しかも無料）。正直、もっと早く使い始めてればよかったなと後悔しつつメモ作成。誰かの参考になるのか、ならないのかは知らないが、ショートカットキーのメモとして投稿するぞ。



## 手書きのいいところ（電子版への抵抗感）

### ・手書きは、とにかく自由

当たり前だが、手書きだと好きな場所に文字を書き、フリーハンドで線を引くことができる。マインドをマップにすることに集中できる。

### ・電子版は、操作が難しい

ツールごとに操作方法が異なるため、ちょっとした学習コスト?がかかる。

またどんな操作ができるのか、不明である。これに関しては「まず使ってみなさい」と言いたくなる部分だが、この度、使ってみることに挑戦したのでまとめのメモを書いてみた次第。



## XMindのいいところ

### ・手書きよりもタイピングの方が早い

正直、手書きよりもタイピングの方がスピーディーに書くことができる。

ペンで文章を書く機会が極端に少ないので、漢字もパッと思い浮かばない上、「雑に」そして「ひらがなに」なりがちだった点が解消しそう。

### ・レイアウトは自由

使ってみて気づくが、マインドマップを書くにあたりXMindでも「やりたいことは全てできる」という感触（マインドマップのツールなので当たり前だ。）、なんだデキるじゃん的な。

むしろ、手書きよりも「キレイ」に「自動」でレイアウトしてくれるので、手書きの際にバランスを意識する必要がなくなり、よりマインドをマップにすることに集中できて捗る印象。（あえてイレギュラーな書き方をしたい場合には向いてない?が、やり方はあるはず、と願う。）

### ・後から編集ができる

当たり前だが文章から罫線まで、後から編集が可能。

特に罫線に関しては「階層」の編集ができるので、適当に羅列したキーワードやキーワード群を、自在に組み替えて思考を『整理』することができる。階層のバランスはツールが自動でとってくれるので、これまた捗る。

### ・他人に展開しやすい

電子ファイルなのでそのまま共有する事ができるし、何より汚い字を晒すことなく「思考」を共有できる点が◎。加えて、未来の自分にとってもデータ化されているのは嬉しいはず。

### ・メモが邪魔にならない

手書きした場合、「紙資料」が増えてしまいがちだが、電子版の場合はそれがない。クラウドにでも保存しておけばどこからでも確認することは可能。


### ・ショートカットを使いこなせば操作もスマートになる

一番のハードルになっていた点はショートカットキーの習得で回避することにした。前述の通り「やりたいことは全てできる」ので、あとはその操作に「慣れ」るだけ。

まだ慣れていないので、一通りショートカットキーをまとめておくことにした（後述）。

## 「使える」ショートカットたち

| キー                                     | 操作                                                         |
| :-------------------------------------- | :----------------------------------------------------------- |
| 「Enter」                               | 同階層にトピック追加。（枝を増やす）                         |
| 「Tab」                                 | 選択中のトピック直下にトピック追加。（階層を掘り下げるサブトピックを追加）     |
| 「Command + Enter」                     | 選択中のトピック直上にトピック追加。（上位階層の親トピックを追加）       |
| 複数トピック選択後「Command + ] 」  | 要約の追加。（選択範囲を中括弧で選択）                       |
| 「F2」or<br />「スペース」                                | トピックの編集。<br />※編集ではなく書換えを行う場合はカーソルを当ててそのまま入力するのがおすすめ |
| 「Command + Option + スクロール上下」 | 拡大、縮小（トラックパッドのピンチイン、アウトでもOK）       |
|「Command + Option + A 」|選択中のトピック直下のトピックを選択。（子トピックを選択し、まとめて移動できるようになる）|
|「Command + Shift + A 」|選択中のトピックど同階層のトピックを選択。（姉妹トピックを選択し、まとめて移動できるようになる）|
|「Option + Enter」|吹き出し追加|
|「Command + B 」|選択中のトピック配下を点線で囲む。|
|「Command + L 」|選択中のトピックから、矢印を出す。|
※トピックをダブルクリックして編集モードにすることもできるが、「選択＋書く」だけで入力はできるので。細かくてゴメンね。

## まとめ

一言でいうと、とにかくXMindを使ってみるべき。

普段からマインドマップを書く習慣がある人も無い人も、と言いたいところだが、とにかくマインドマップを使ってみるべき、という点にも触れておこう。思考の整理にとても有効なツールなので是非。

また、XMindのようなツールを使うときは、併せてショートカットキーも覚えながら（使うことを前提に）使うのがおすすめ。イケてるツールはスマートに使いこなせてこそ。

## XMindの入手方法
[XMind公式サイト](http://jp.xmind.net/download/)より無料ダウンロードが可能なのでご参考まで。

## 編集履歴
2019/07/26：
ショートカット４項目（「Command + Option + A 」〜「Command + B 」）を追加。
[python]pandasのリファレンス

# pandasのリファレンス
pandasのDataFrameは、テーブル形式のデータ構造を持ちます。
備忘録として、以下に記載いたします。
※適宜編集していきます。追加希望の内容があれば編集要望をお願いいたします。
## 要素の抽出
ilocメソッドやlocメソッドで行と列の両方を指定すれば､ 特定の要素ひとつを抽出することも可能です｡

```
# 特定の要素を抽出
# ilocメソッドで[行のindex,列のindex]の順番に指定
df.iloc[1,0]
```
```
# 特定の要素を抽出
# locメソッドで[行のindex,列の名称]を順番に指定
df.loc[1,'名前']
```

## 行の追加
新たに行を追加したいときは､その行を表すDataFrameを生成し､**concatメソッド（concatenate: ｢結合する｣ の意味）**でDataFrameに追加をします｡ 結合したいDataFrameをリストに格納して渡し､行を追加したいときは**引数axisを0に指定します｡**

2つのDataFrameに関して列数が一致している必要がありますので､注意してください｡

```
# 追加したいDataFrameを定義
row = pd.DataFrame({'名前': ['渡辺'],
                    '年齢': [45],
                    '性別': '男'})
# 行の追加（行: axis=0, 列: axis=1）
df_2 = pd.concat([df,row], axis=0)
```


# 要約統計量（平均、標準偏差など）を取得
pandas.DataFrameおよびpandas.Seriesのメソッドdescribe()を使うと、各列ごとに平均や標準偏差、最大値、最小値、最頻値などの要約統計量を取得できる。
とりあえずデータの雰囲気をつかむのにとても便利。

- describe()の基本的な使い方
- 対象となる型を指定: 引数include, exclude
  - 文字列など数値以外の列を指定
  - すべての型の列を指定
  - 任意の型を選択・除外
- describe()の項目の意味と対応する個別メソッド
  - count: 要素の個数
  - unique: ユニークな（一意な）値の要素の個数
  - top: 最頻値（mode）
  - freq: 最頻値の頻度（出現回数）
  - mean: 算術平均
  - std: 標準偏差
  - min: 最小値
  - max: 最大値
  - 50%: 中央値（median）
  - 25%, 75%: 1/4分位数、3/4分位数   
- パーセンタイルの刻みを指定
- 数値列に対して頻度などを算出
- 数字の文字列に対して平均や標準偏差などを算出
- pandas.Seriesのdescribe()
- 日時（datetime64[ns]型）の場合
- 行に対してdescribe()を適用

```
import pandas as pd

df = pd.DataFrame({'a': [1, 2, 1, 3],
                   'b': [0.4, 1.1, 0.1, 0.8],
                   'c': ['X', 'Y', 'X', 'Z'],
                   'd': ['3', '5', '2', '1'],
                   'e': [True, True, False, True]})

print(df)
#    a    b  c  d      e
# 0  1  0.4  X  3   True
# 1  2  1.1  Y  5   True
# 2  1  0.1  X  2  False
# 3  3  0.8  Z  1   True

print(df.describe())
#               a         b
# count  4.000000  4.000000
# mean   1.750000  0.600000
# std    0.957427  0.439697
# min    1.000000  0.100000
# 25%    1.000000  0.325000
# 50%    1.500000  0.600000
# 75%    2.250000  0.875000
# max    3.000000  1.100000

print(type(df.describe()))
# <class 'pandas.core.frame.DataFrame'>
```
Nuxt.jsで.envファイルを扱う@nuxtjs/dotenv

## @nuxtjs/dotenvを使います
https://github.com/nuxt-community/dotenv-module

## .envファイル作成

下記コマンドでルート配下に`.env`を作成

```sh
touch .env
```

下記のように環境変数記述

```text:.env.dev
API=http://localhost:8000/api/
```

## nuxt.config.js設定


```js:nuxt.config.js
require('dotenv').config();
const {API} = process.env;

export default {
  env: {
    API
  },
}
```

## 動作確認

```js:/pages/index.vue
export default {
  created() {
    console.log(process.env.API)
  }
}
```
GCP アップデート (7/19-7/25 2019)

### AI Platform: [July 19, 2019](https://cloud.google.com/ml-engine/docs/release-notes#july_19_2019)
- ランタイム1.14がトレーニングとプレディクションで使えるようになったよ。
  - TF 1.14.0
  - [他](https://cloud.google.com/ml-engine/docs/runtime-version-list)
  - TPUでの学習は現状未サポート。
- ランタイム1.12でTF1.12.3をサポートするようになったよ。
  - [他](https://cloud.google.com/ml-engine/docs/runtime-version-list)

### BigQuery: [July 19, 2019](https://cloud.google.com/bigquery/docs/release-notes#july_19_2019)
- 定期的にクエリ実行できるスケジュールドクエリがGAになったよ。

### Compute: [July 25, 2019](https://cloud.google.com/compute/docs/release-notes#july_25_2019)
- 大きなメモリ載せたメモリ最適化マシンタイプがベータになったよ。
  - 208vCPU 5.8TBメモリ と 416vCPU 11.7TBメモリ。

### BigQuery: [July 25, 2019](https://cloud.google.com/bigquery/docs/release-notes#july_25_2019)
- Magnitude Simba ODBCドライバのバージョン上がったよ。
  - BigQUery Storage APIをサポート。
  - Linux ODBC tarボールが32と64bit両方含むようになったよ。

### ディスクレーマ
- アップデートの内容はあくまでも個人の理解していることを書いています。正しい内容はリリースノート等を確認下さい。
- リリース内容できるだけ拾うようにしているのですが、抜けていそうなリリースノートが追加するのでぜひ教えて下さい！(一覧[ここ](https://qiita.com/kenzkenz/items/ac18a359b803dbb6b490)で更新してます。)
make_ricty - Rictyフォントを生成する

* [Ricty](https://www.rs.tus.ac.jp/yyusa/ricty.html)フォントを生成するシェルスクリプト「make_ricty」を作り、GitHubで公開した。
  * https://github.com/seih/make_ricty
* Rictyフォントの生成に必要なファイルを取得し、通常の行間の「Ricty」と、行間の広い「Ricty M」と、さらに行間の広い「Ricty L」フォントを生成する。同時に字間 (xAvgCharWidth) とスタイル (fsSelection・macStyle) の情報を正す。
* 作成・公開した理由:
  * 配布されている「ricty_generator.sh」では、字間が広く、スタイル (標準・斜体・太字・太字斜体) が適正ではないフォントが生成されてしまう。
  * 「ricty_generator.sh」と一緒に配布されている「os2version_reviser.sh」でも、字間が補正されなかった。
  * 字間の補正についてはインターネット上で具体的な情報が公開されているが、スタイルの補正については具体的な情報を得ることができなかった。
  * 個人的に、行間の広いフォントが必要。
* 開発環境・実行環境: Ubuntu 18.04 LTS

```
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.2 LTS"
```

* シェル: Bash 4.4.20

```
$ bash --version
GNU bash, バージョン 4.4.20(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2016 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL バージョン 3 またはそれ以降 <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
```

  * 生成したフォントの使用環境: Windows 10 Pro 1903

```
> (Get-WmiObject -class Win32_OperatingSystem).Caption
Microsoft Windows 10 Pro

> [System.Environment]::OSVersion.version

Major  Minor  Build  Revision
-----  -----  -----  --------
10     0      18362  0
```

* 実行例 (help):

```
$ ./make_ricty help
make_ricty - Rictyフォントを生成する

Usage:
  make_ricty [command]

Description:
  Rictyフォントの生成に必要なファイルを取得し、通常の行間の「Ricty」と、
  行間の広い「Ricty M」と、さらに行間の広い「Ricty L」フォントを生成する。
  同時に字間 (xAvgCharWidth) とスタイル (fsSelection・macStyle) の情報を
  正す。
  commandを指定せず実行すると、すべての処理を適切な順番で実行する。
  commandを指定して実行すると、指定した処理だけを実行する。

Commands:
  clean: 取得したファイルや中間生成ファイルを削除する。
  correct_spacing_and_style: TTFの字間とスタイル情報を正す。
  generate_ricty: 3種類の行間のRictyフォントを生成する。
  get_inconsolata: Inconsolataフォントを取得する。
  get_migu-1m: Migu 1Mフォントを取得する。
  get_ricty_generator: ricty_generator.shを取得する。
  help: このヘルプを表示する。
  make_readme: README.txtファイルを生成する。
  move_ttf: TTFファイルをttfディレクトリに移動する。
```

* 必要なコマンド:
  * basename
  * cat
  * chmod
  * command
  * cp
  * echo
  * grep
  * ls
  * rm
  * sed
  * ttx (Ubuntuでは、fonttoolsパッケージに含まれる)
  * unzip
  * wget
* 参考:
  * [OS/2 - OS/2 and Windows metrics table specification - Typography | Microsoft Docs](https://docs.microsoft.com/en-us/typography/opentype/spec/os2#fsselection)
  * [head - Font header table specification - Typography | Microsoft Docs](https://docs.microsoft.com/en-us/typography/opentype/spec/head)
Discord.js でボットを作る ～下準備編～

# このページでやること
1. 実行環境(Node.js)のインストール
2. 開発環境(Visual Studio Code)のインストール

## ボットを作り始める準備
これからDiscord.jsを使ってボットを作っていきますが、今回はその準備です。
この記事ではNode.jsとVisual Studio Codeのインストールについて解説しています。

# Node.js のインストール
Node.jsはDiscord.jsを動かすために**必須**です。
先にインストールしておきましょう。

:::note warn
Discord.js v13 からは Node.js 16.6.0 以上、Discord.js v14 からは Node.js 16.9.0 以上が必要です。
:::

### Windows & Mac
ホームページにアクセスして最新版(またはLTS)をインストールしましょう。

https://nodejs.org/

### Linux
NodeSourceが提供するバイナリをインストールするのが一番シンプルだと思います。

https://github.com/nodesource/distributions?tab=readme-ov-file#table-of-contents

他にも、[nvm](https://github.com/nvm-sh/nvm)や[n](https://github.com/tj/n)、[fnm](https://github.com/Schniz/fnm)などのマネージャーを使う方法もあります。

<details><summary>(Androidについて)</summary>

あまりお勧めはしていませんが、Androidで開発することも可能です。
Androidでの開発にはTermuxが必要です。

https://f-droid.org/ja/packages/com.termux/

をインストールし、起動の上

```
pkg upgrade -y && pkg install nodejs -y
```

を実行してください。
</details>

# Visual Studio Code のインストール
JavaScriptはWindows標準のメモ帳などでも書くことができますが、プログラミング初学者にとって補完がないのは、大きなハードルになると思います。
複雑な言語だからこそ、初学者はコードエディターの恩恵を受けるべきだと思います。
形から入りましょう。

下のリンクからダウンロードすることができます。

https://code.visualstudio.com/download

:::note
筆者はVisual Studio Codeをお勧めしていますが、
[Sublime](https://www.sublimetext.com/)、[Neovim(上級者向け)](https://neovim.io/)など、他の選択肢もあります。
生涯使う好きなエディターを見つけましょう。
:::

<details><summary>(Androidについて)</summary>

筆者はスマートフォンでの開発をお勧めしていませんが、
2019年当初の私はQuickEditを推していました。

https://play.google.com/store/apps/details?id=com.rhmsoft.edit

ご参考までに。
</details>

# 終わりに
これで開発環境は整いました。次回は早速コードを書いていきます。
お疲れさまでした。

https://qiita.com/yuto0214w/items/1ecee25efca6b5b7445b
VScode ショートカットキー一覧（改訂予定）

当記事は、徐々に追加項目を増やす事と、Markdownでの表記の仕方を変更したりしていきます。
表形式の方が良いかもしれませんね。。。


`command + b`                    サイドバー表示、非表示 

`! + return`                            html 格子呼び出し

`command + x`                     行毎カット

`link:css`                                css設定

`command + click`               フォルダ未作成の段階で、cssとjsのリンク先をcommandキーと一緒にclickするとファイル作成してくれる

`command + / `                     選択した行を纏めてコメント表示・解除

`option + command + s`       全てのファイルをセーブ保存

`command + ,`                        設定画面表示

`shift + command + p`           コマンドパレット画面表示

`option + ↑ or ↓`               選択した行を移動（複数行指定も可）

`shift + option + ↓ or ↑`       選択した行の複製

`command + return`              下の行の挿入

`shift + command + return`      上の行の挿入

`option + 任意の別箇所をclick`     マルチカーソル

`command + shift + l`            同じ単語を一気にマルチカーソル化

`command + d`                    単語を選択、もう一回clickすると同単語をマルチカーソル化

`command + option + ↓ or ↑`      マルチカーソル

`command + f`                    検索窓表示

`command + g`                    次の検索結果に移動

`command + shift + g`            前の検索結果に移動

`option + command + f`           検索窓に置換入力欄表示

`command + z`                    前の入力に戻る


**Emmet記法例**
`ul>li*3`       ulタグの中liタグを３つ作ってくれる。


**その他**
コマンドパレットでminimapを入力すると表示・非表示選択できる。
Ubuntu 18.04 LTS > KiCadセットアップ | Flatpakというパッケージマネージャを教えていただいた

```txt:動作環境
Ubuntu 18.04 LTS
```

KiCadのセットアップをしてみた。

- [Ubuntu(16.04)にKiCADインストール](http://nekomemo2.site/?eid=1618)
    - by neko-memoさん

情報感謝です。

2019-07-24現在、KiCadはv5.1が利用可能のようです。
https://code.launchpad.net/~kicad-product-committers/kicad/+git/product-git

最初のコマンドを変更して、以下の実施にてセットアップ完了しました。

```
$sudo add-apt-repository ppa:js-reynaud/kicad-5.1

$sudo apt-get update

$sudo apt-get install kicad
```

kicadコマンドで起動できるようになりました。


### Flatpak
(2019-07-25 追記)

@manzyun さんの[コメント](https://qiita.com/7of9/items/9ebcce36c8f68bd536f3/#comment-bc0eb714e507fdfada29)にてFlatpakというパッケージマネージャを教えていただきました。

情報感謝です。
画像再構成研究の方向性

#はじめに

画像再構成の「研究」とは、何を目的に、何をするのか、今回はその話をしたいと思います。

端的に言えば、「手元にある観測データから、いかに短い計算時間で、いかに系統誤差(バイアス)が小さく、いかに統計誤差(バリアンス)が小さい画像を再構成するかを考えて、実装し、証明すること」です。

つまり、目的は「高画質化」と「計算時間削減」です。その他には「高付加価値化」があります。これは画質や計算時間とは異なる軸で特徴を出すことです。例えば、画像再構成というタスクと同時に別のタスク(例:エッジ検出、セグメンテーション)もこなすような同時再構成アルゴリズム(simultaneous reconstruction)の開発があります。

以下では、画像再構成研究の目的毎に、その動機と定石的なアプローチ(や考え方)をまとめます。


#高画質化

##バイアス低減

* 動機
    * もっと定量的な画像が欲しい！
    * バイアスが大きいと画像解析に支障がでる！

* アプローチ
    * システム方程式(順問題)の記述をより正確にする。
    * 不偏推定量が得られるアルゴリズムを開発する。


##ノイズ低減

* 動機
    * もっと見やすい(視覚的な印象の良い)画像が欲しい！
    * 信号とノイズをはっきりと区別したい！
    * ノイズが大きいと画像解析に支障がでる！

* アプローチ
    * 観測データの確率分布(尤度)をより正確にモデル化する。
    * ノイズ低減に資する先見情報を見出だし、それを利用するアルゴリズムを開発する。


##高解像度化

* 動機
    * もっと微細な構造が見たい！
* アプローチ
    * 解像度が低いことは、画像の局所的なバイアスが大きいことといえます。よって、アプローチは前述の「バイアス低減」と重複する。
    * 統計誤差が大きいと、細かい構造が見えにくいので、統計誤差を低減することで、解像度が上がった「感」が得られます。よって、アプローチは前述の「高解像度化」と重複する。
    * 高解像度化に資する先見情報を見出だし、それを利用するアルゴリズムを開発する。


##アーチファクト低減

* 動機
    * 装置特性上回避できないアーチファクトを低減したい！
    * 原因は不明だけどとにかくアーチファクトを低減したい！
    * アーチファクトがあると、画像解析に支障がでる！

* アプローチ
    * アーチファクトの幾何学的特徴を考慮して、それが選択的に抑制されるように、再構成問題(最適化問題)をデザインする。
        * 例えば、アーチファクトのない画像に対して確率が大きくなるような事前確率をデザインし、ＭＡＰ再構成に導入する。
    * 再現性のあるアーチファクトであれば、アプローチは前述の「バイアス低減」と重複する。


##情報量の減少に伴う画質低下の抑制

* 動機
    * 観測データサイズを小さくして計算時間を短くしたい！
    * データ測定時間を短くしたい！
    * 被写体にかかる負荷(例:放射線被曝)を減らしたい！
    * 装置を簡素化したい！

* アプローチ
    * 被写体に関する先見情報を見出だし、それを利用するアルゴリズムを開発する。
    * 情報量が減ることで、バイアスが増加するならば、アプローチは前述の「バイアス低減」と重複する。
    * 情報量が減ることで、解像度が低下するならば、アプローチは前述の「高解像度化」と重複する。
    * 情報量が減ることで、アーチファクトが発生するならば、アプローチは前述の「アーチファクト低減」と重複する。


#計算時間削減

* 動機
    * 検査のスループットを上げたい！
    * 再構成の前後に他の処理を追加したいけど、全体の計算時間は増やせない！
    * リアルタイムで画像を見たい！
* アプローチ
    * アルゴリズムを工夫
        * 最適化アルゴリズムに前処理行列を導入し、収束性を改善する。
            * ただし、前処理行列の計算コストが大きいと、本末転倒になる。
        * 最適化問題を双対問題に変換し、Raw-actionアプローチで解く。
            * ただし、観測データの要素数≦双対変数の要素数なので、メモリ容量的に実行不可能な場合もあり得る。
        * 観測データを分割(サブセット分割)し、演算量あたりの画像更新回数を増やして、収束性を改善する。
            * ただし、程度の問題であるが、解が振動し収束しない(リミットサイクル問題と呼ばれる)。リミットサイクルを回避する定石的な方法は、０に収束するが積分値は発散するステップサイズ(深層学習でいうところの学習率)を導入すること。
    * 実装を工夫
        * 並列演算(OpenMP、CUDA(GPU))
    * 事前処理としてデータ圧縮を導入
        * 観測データに冗長性がある場合、情報を損なうことなくデータサイズを小さくできる可能性がある。


#高付加価値化

高付加価値化は、高画質化や計算時間削減といった実用的な側面から離れ、基礎研究としての色合いが強いです。なぜなら、高付加価値化はオプションであって、それがなくても別に困らないからです。

しかし、高付加価値化によって、これまで全く考えられていなかった、または実現できるとは想像すらできなかった、固定観念をぶっ壊す革新的なアプリケーションが生まれる可能性があります。

* 動機
    * 様々です。

* アプローチ
    * 同時再構成アルゴリズム
        * 画像と同時に求めたい情報を変数に加えた最適化問題を定義し、(例えば交互最適化によって)両方の変数に関して解く。


#最後に

画像再構成の研究をする上で、ひとつ忘れてはいけないことがあります。それは、どんなアプローチも大小の副作用を伴うということです。

分かりやすいところでは、画質を改善するために再構成アルゴリズムを高度化すれば、程度に差はあれど、計算時間は増えます。他には、統計誤差を改善するために再構成アルゴリズムを高度化すれば、系統誤差は増える場合があります。

何か新しいアルゴリズムを考案しても、副作用があまりにも大きすぎると「良い研究」とは認められないように思います。したがって、副作用を最小化しつつ、いかに所望の作用(効果)を最大化するかが、研究者の腕の見せ所です。ただし、計算時間の増加に限っては、ハードウェア(ＣＰＵ、ＧＰＵ、メモリ)の進歩によって、放っておいてもある程度短縮されるので、数倍程度であれば目くじらをたてる必要はないかもしれません。

なお、画像処理(再構成画像に対するポストプロセッシング)による高画質化や、画像処理との組み合わせによる計算時間削減もアプローチとして存在し、事実重要です。画像再構成に手を加えるよりも実装は容易でしょうし、効果的な場合もあると思います。

したがって、費用対効果を考えて、複数の処理で構成される画像生成プロセスのどこに手を入れるか、ケースバイケースで適切な判断が求められます。

おわり
iptables ACCEPT ALL

# iptables ACCEPT ALL
## iptables

LocalForward も RemoteForward も出来なくなったからファイアウォールを切ってみました

### Backup

```
sudo iptables-save > secure
```

### insecure bad policy

```
echo '# Bad policy
*nat
-A INPUT -j ACCEPT
-A OUTPUT -j ACCEPT
COMMIT
*filter
-A INPUT -j ACCEPT
-A FORWARD -j ACCEPT
-A OUTPUT -j ACCEPT
COMMIT
' | sudo iptables-restore
sudo iptables -L
```

### Restore

```
sudo iptables-restore < secure
```

## Security

https://qiita.com/uichi/items/c34536b66101e9440cf2
二代目社長 アンビリバボー案件？

##ICT企業の二代目社長として、思いだした事を書き記します

毎年、新入社員が入社して、研修して、配属して行くのですが、
たまに、諸々の事情で、配属が滞る事があります。
SES（System Engineering Service）だと、ユーザーの都合もあります。

そうすると、私（社長）はイライラして、オフサイドして、勝手に案件を請けて、プロマネとして、新人を引き連れて現場に入ったりもします。

そういう事情で、短期でしたが、結構タイトな案件を請けた事があります。
私と新人のチームでも出来るロースキル案件です。
***エンジニアの業務として、甚だ疑問な内容だったりするので、（奇跡体験！）アンビリバボー案件とカテゴライズ***していました。
損益は…う…でも未来への投資なのだからそれでいい、打上げが楽しいからいい。

スケジュールがタイトなので、
作業する方の手を止めないように、休日には休ませるように、作業のセットアップは、夜間・早朝・休日に行いました。
なので、私自身、かなり疲弊して、ちょっと逆ギレていて、久しぶりに会った先代の社長に愚痴と失言を…
***「それは見積（お前）が悪い、作業している者は悪くない」バッサリ。***
***いい歳して父親に怒られて…でも当たり前の事ですね、ありがとうございました。***

そしてアンビリバボー案件…
真意（示範）よりも、周囲の誤解が先に立つので、最近は止めるようにしています。
『SLAM入門』の教材用プログラムLittleSLAMのROS2(ROS dashing)ラッパーを作った

## はじめに  
ROS2(ROS dashing)で『SLAM入門』のLittleSLAMを動かすラッパーを書きました。スキャンデータのみで動かせます。    

## ROS2とは
下記のスライドがわかりやすいです。
[次世代ロボット フレームワーク ROS2の紹介 - SWEST](https://swest.toppers.jp/SWEST20/program/pdfs/s2a_public.pdf)
[Getting Started with ROS 2 / DDS](https://speakerdeck.com/youtalk/dds)

ROS2のチュートリアルはこちらからどうぞ。
[ROS Japan ユーザグループ 講習会 ～ ROS 2 の紹介 ～](https://gbiggs.github.io/rosjp_ros2_intro/)
[Qiita ROS2導入&レクチャー](https://qiita.com/NeK/items/7ac0f4ec10d51dbca084)

## LittleSLAMとは  
LittleSLAMは『SLAM入門』の教材として作られた2D-SLAMのプログラムです。 
LittleSLAMはICP-スキャンマッチングによるLocal SLAMとグラフベースSLAMによるGlobal SLAMによって成り立っています。

スキャンマッチングに関しては以下のスライドを読めばわかると思います。
[Scan Matching  自己位置推定手法](https://web.wakayama-u.ac.jp/~nakajima/SelfDrivingSystem/assets/pdf/method_pmv_03.pdf)
[LiDAR-SLAM チュートリアル資料](https://www.slideshare.net/FujimotoKeisuke/lidarslam-99008083)

SLAMに関しては以下の解説論文に詳しく書いてあります。
[移動ロボットの環境認識 —地図構築と自己位置推定]
(https://www.jstage.jst.go.jp/article/isciesci/60/12/60_509/_pdf)  
[LittleSLAM](https://github.com/furo-org/LittleSLAM.git)のプログラムの詳細はリンク先と『SLAM入門』を参照ください。
## IO  
subscriber
- sensor_msgs::msg::LaserScan ("scan")
- odom (tfの"base_link"->"odom")(optional,with use_odom:=true)
（コマンドからパラメーターuse_odomを渡すのがまだできてないので、そのうちします…。[このリポジトリ](https://github.com/ros2/demos)や[このQ&A](https://answers.ros.org/question/327835/params-appear-broken-in-ros2/)を参考にすれば良いっぽい？）

publisher
- sensor_msgs::msg::PointCloud2 ("icp_map")
- nav_msgs::msg::Path ("path")
- nav_msgs::msg::PoseStamped ("current_pose")

## 結果
データはros.orgの[Introduction to Working With Laser Scanner Data](http://wiki.ros.org/laser_pipeline/Tutorials/IntroductionToWorkingWithLaserScannerData)にある以下のデータros2用に変換して使いました。

白い点が点群で、緑の線がセンサが通った経路です。  
![littleslam.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229952/6b92bfa5-15d5-5e7b-0941-7ec4f70a7dbe.png)

## コード置き場
Githubにあります。
 <a href="https://github.com/rsasaki0109/littleslam_ros2"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/rsasaki0109/littleslam_ros2.png" width="460px"></a> 


## 参考  
[友納 正裕,『SLAM入門』](https://www.ohmsha.co.jp/book/9784274221668/) 
[LittleSLAM](https://github.com/furo-org/LittleSLAM.git)
[little_slam](https://github.com/kiyoshiiriemon/little_slam) 
[rosjp_ros2_basics](https://github.com/gbiggs/rosjp_ros2_basics)
[test_repo](https://github.com/MarcTestier/test_repo)
[How to set up tfbuffer clock in ROS 2 so it works with sim time?](https://answers.ros.org/question/307682/how-to-set-up-tfbuffer-clock-in-ros-2-so-it-works-with-sim-time/)
[lookupTransform - builtin_interfaces/Time to tf2::TimePoint?](https://answers.ros.org/question/309953/lookuptransform-builtin_interfacestime-to-tf2timepoint/)
超初心者が機械学習を触ってみた(Kaggle使ってみたレポ)

#■目的説明
　超初心者の心の支えになるために機械学習ど素人の体験談を投稿。

#■動機
　機械学習なるものを触ってみたかった。
　が、自分で作れる気がしなかった
　簡単に出来ると聞いたものをやってみた

#■当方スペック
  うぶ毛が生えたど素人(VBAは書ける。Pythonは聞きかじった)

#■成果
##　・やれるようになったこと
　先人のコードをコピペして実行(所要時間：3分〜)
  *注意事項：
　　　・Kaggleのサイトは全部英語。
　　　・コードを実行するのはKaggleが持ってるマシン上でなので
　　　自分のPCのスペックは要求されないし、そもそも自PCがバグったり壊れることもない。

##　・やったことによるメリット
　とりあえずKaggleやったことあると言える
　とにかく時間かかるものだという雰囲気が分かる
　統計や機械学習の知識だけでは何も実装できないことに気づける

##　・手順
1.機械学習を使ったコンペで有名なKaggleのHPに行く (5秒)

  Kaggle(https://www.kaggle.com/)

2.ユーザ登録する(30秒)

一見さんではコードを実行とかできないので、渋々メールアドレスとパスワードを登録する
↓登録画面
<img width="374" alt="スクリーンショット 2019-06-11 16.16.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306738/b7ed0fef-6ca1-a4ff-181d-229b6877fae0.png">

3.適当な先人のコードを開く。(リンククリックなら5秒)

 　922 in 3 minutes(https://www.kaggle.com/dott1718/922-in-3-minutes)

　　*"タイタニック号における生存率"とかの有名なものを見たければ、
　　　Competitions配下で対象のコンペを選択して、
　　　配下の既存コード(Kernelsをクリック)を選べば見られる。
　　　が、見たところで初心者には分からないので素直に↑のリンクをクリックするべし。

4.右上にある青い"Copy and Edit"ボタンを押す(5秒+表示まで15秒)

　コードや、解析の元にしたデータをまるっと自分の作業領域にコピる。
　公開モード(=クリックしたら開ける状態)に設定されてるコードはコピペおっけーな決まりなので、
　趣味の範囲でコピる分には作者に了解取らなくて大丈夫

5.これまた右上にある青い"Commit"ボタンを押す

　Commitというのは、実行という意味。
　これで晴れてデータ解析プログラムを実行したことになる。

6.ポップアップ画でちょっと待つ(待ち時間はKaggleサイトの混み具合次第だが2.5分くらい)
<img width="763" alt="スクリーンショット 2019-06-11 16.57.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306738/e18a6024-d902-4987-e7ea-9c02f8002fc3.png">

以上が、先人のコードのKaggleでの実行方法。
これだけだと実行しただけなので何が得られたかよく分からん！となるので

6.Versionsタブを押す(5秒)　で、何か回転してる部分がチェックマークになるまで待つ。

7.Outputsタブを押す(5秒)
　ここに表示されているcsvファイルが自分の作った解析結果。
　（機械に学習させた情報を元にテストデータを解析した結果）

8.「submission.csv」を選択し、「Submit to Competison」をクリックする
　解析結果を、ランキングに載せて名前を残すためにやる。

9.自分の順位がランキングに乗る
以上。

#■感想
Kaggleは早く日本語対応してほしい
Status Bar優良記事まとめ[Swift]

#### 背景
**・[swift – 背景色のステータスバーを変更するiOS - コードログ](https://codeday.me/jp/qa/20190503/764694.html)**
→シンプルに**`statusBar`の背景**をいじるやり方
**・[【iOS】ステータスバーのカスタマイズ【Swift3.0】 - Qiita](https://qiita.com/fromage-blanc/items/8517ecdf86526ea5a7e1)**
→**背景色を自作のView**で貼り付けるやり方(`alpha`とか色々いじる場合はこれの方が便利かも・・)

#### 背景以外の色~~(`tintColor`的な?)~~(`UIStatusBarStyle`というらしい)
**・[ステータスバーの色が決まるロジック - Qiita](https://qiita.com/gomi_qiita/items/a1b6b4f6844002865aa9)**
**・[ステータスバーのスタイル(色)変更方法優先度 まとめ - Qiita](https://qiita.com/ux_design_tokyo/items/8e62977b7609e68755c7)**
**・[iOSのステータスバーを自在に扱う - Qiita](https://qiita.com/fuwamaki/items/f623dbfde233a8b4f0d0)**
→図解も交えているので**じっくり攻略したい人**向け

**・[SwiftでStatusBarの色を変えたり消したりする方法 - あぷすた](https://appstars.jp/archive/821)**
→`iOSの・・`と内容は似てるがシンプルにまとまっている
**・[ios - Change status bar alpha - Stack Overflow](https://stackoverflow.com/questions/42846036/change-status-bar-alpha)**
→`Snapchat`のように`alpha`をいじる方法
**・[UIStatusBarStyle - UIKit | Apple Developer Documentation](https://developer.apple.com/documentation/uikit/uistatusbarstyle)**
→`default(黒)`,`lightContent(白)`,`darkContent(黒)`の3つらしい


#### Navigation Bar と Status Bar
**・[[Swift3] ナビゲーションバーとステータスバーの色変更 | RE:ENGINES](https://re-engines.com/2017/10/06/swift3-%E3%83%8A%E3%83%93%E3%82%B2%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%90%E3%83%BC%E3%81%A8%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9%E3%83%90%E3%83%BC%E3%81%AE%E8%89%B2%E5%A4%89%E6%9B%B4/)**
→`Navigation Bar`と`Status Bar`の両方がまとまっている(`Status Bar`はアプリ全体での適用のみ)

#### 他UIとStatus Bar
**・[Swiftでスクロールに合わせてStatusBarの表示非表示を切り替える - Qiita](https://qiita.com/K_ichi/items/542b2434b3663a692d74)**
→`UIEdgeInsetsMake()`で初期位置を調節し`Status Bar`を非表示にする方法

# 関連記事
php-master-changes 2019-07-24

今日は VM の実装修正、Mac ビルドの修正、一部過去修正のリバート、get_class_vars() が未初期化の型付プロパティについて null を返すようにする修正、ドキュメントの更新（？）、CGI でのメモリリークの修正、不要コードを削除する修正があった！

# 2019-07-24
## dstogov: Fixed unspecialized executor
- https://github.com/php/php-src/commit/eaa90489730513a6deb10c7a249712dd1bf5bcc8
- [7.4~]
- VM の ZEND_FETCH_DIM_FUNC_ARG、ZEND_FETCH_OBJ_FUNC_ARG のオペコードハンドラへ USE_OPLINE を追加

## dstogov: Fixed CALL VM
- https://github.com/php/php-src/commit/8d51af9bc25a4ba8ab6d96cc4443cd9963719b96
- [7.4~]
- ZEND_VM_KIND_CALL 時に ZEND_VM_COLD が展開されなかったのを修正、かな

## nikic: Try to fix macos build
- https://github.com/php/php-src/commit/9e4603f7727b94409575886cda34fc2d2c4d6388
- [7.4~]
- 不使用変数警告を潰して Mac ビルドを修正しようとしてる、かな？
- また ZEND_VM_SPEC の扱いが微妙にカオスだったのを整理

## nikic: Avoid references in TMP var
- https://github.com/php/php-src/commit/1eb706179fbbf31b9cedb93509f7451040eb5edc
- [7.4~]
- TMP へ参照を突っ込むのを避けるよう修正
- これに伴い[昨年の修正](https://qiita.com/sj-i/items/c6a348c288039f198b24#laruence-fixed-bug-76752-crash-in-zend_coalesce_spec_tmp_handler---assertion-in-_get_zval_ptr_tmp-failed)で ZEND_COALESCE が TMPVAR の特化ハンドラを持つようになってたのを TMP|VAR でまた分けてる

## nikic: Revert "Drop free_filename field from zend_file_handle"
- https://github.com/php/php-src/commit/d9680272c78453a832ef02f914efa13c2545eb19
- [7.4~]
- [先日の修正](https://qiita.com/sj-i/items/45bd4c4c8d5811cbb33a#nikic-drop-free_filename-field-from-zend_file_handle)をリバート
- free_filename は wincache 拡張で使われていたので 7.4 では戻しとく、ということらしい

## nikic: Don't skip uninitialized typed props in get_class_vars()
- https://github.com/php/php-src/commit/a49d53baa2ad2fb6a951360f0083a883e7631370
- [7.4~]
- [get_class_vars()](https://php.net/manual/ja/function.get-class-vars.php) が未初期化の型付プロパティについて null を返すよう修正
- [#78319](https://bugs.php.net/bug.php?id=78319)

## derickr: Update NEWS for PHP 7.4.0beta1
- https://github.com/php/php-src/commit/5dae0eae6204c5213e2b24e6d491502ab68b4ce7
- [7.4~]
- うん？何やってるんだこれ
- [前日にやってる](https://qiita.com/sj-i/items/1ceec407dc374f950771#derickr-update-news-for-php-740beta1)と思うのだが、25 Jul 2019, PHP 7.4.0beta1 多くないか

## derickr: Update NEWS for 7.4.0beta2
- https://github.com/php/php-src/commit/126dd8e1eb3b5fbc2a0eb2a1e24519768dee2acc
- [7.4~]
- [前日にやってる](https://qiita.com/sj-i/items/1ceec407dc374f950771#derickr-update-news-for-740beta2)と思うのだが、25 Jul 2019, PHP 7.4.0beta1 多くないか

## devnexen: Fix bindpath mem leak in cgi
- https://github.com/php/php-src/commit/b05f3643338a1647604fbddf3607fc9826713e25
- [7.4~]
- sapi/cgi で、メモリリークを修正

## dstogov: Simplify TMP/VAR operand releasing
- https://github.com/php/php-src/commit/57d9b94dea7e634ec4775faa8f33ae03d9db5ef6
- TMP/VAR のオペランドの解放処理を単純化
- zend_get_zval_ptr() の引数 zend_free_op と should_free の削除

## dstogov: Avoid reloading
- https://github.com/php/php-src/commit/6191df75537b42e75c6ba4bd311fd962bb6952cd
- [7.4~]
- ビット NOT の命令 ZEND_BW_NOT の実装で、op1 の読み込み直しを避けるよう修正

## nikic: Remove php_openssl_cipher_get_version()
- https://github.com/php/php-src/commit/626bc0e7cc9c0ab3054de371ae5bbf33de4883e7
- [7.4~]
- ext/openssl で、不要な関数 php_openssl_cipher_get_version() を削除
C#メインの私がJavaを勉強するためのメモ

##final = sealed
###Classes
```java:sample.java
public final class MyFinalClass {...}
```

```c#:sample.cs
public sealed class MyFinalClass {...}
```

###Method
**Prevent overriding of a virtual method.**

```java:sample.java
public class MyClass
{
    public final void myFinalMethod() {...}
}
```

```c#:sample.cs
public class MyClass : MyBaseClass
{
    public sealed override void MyFinalMethod() {...}
}
```

###Variables
**To only allow a variable to be assigned once:**

```java:sample.java
public final double pi = 3.14; // essentially a constant
```

```c#:sample.cs
public readonly double pi = 3.14; // essentially a constant
```
(Python3)個人的にまとめておきたかったリスト関連の小技

AtcoderとかPaizaの問題を解く過程で知ったListの小ネタを備忘録代わりにまとめる。
新発見があれば追記する予定。

(2019/7/25 間違っている部分を修正。コメントありがとうございます。)

#内包表記
Pythonのリストといえばこれ。可読性が落ちる代わりに処理速度が上がる。
例えば標準入力で3つの数値を受け取る場合、

```python3:pori.py
#入力が"1 2 3"の時
a,b,c = [int(i) for i in input().split(" ")]
#1,2,3
```
これでまとめて数値として読み取れる。

##内包表記内に~~if文~~if節を組み込む場合
[6. 式 (expression) &#8212; Python 3.7.4 ドキュメント](https://docs.python.org/ja/3/reference/expressions.html?highlight=in%20%E6%BC%94%E7%AE%97%E5%AD%90#displays-for-lists-sets-and-dictionaries)

```python3:pori.py
#[1,2,3,5,6,7]から偶数だけ取り出す。
lst = [ i for i in [1,2,3,5,6,7] if i%2==0 ]
#[2, 6]

#[1,2,3,5,6,7]を偶数ならそのまま、奇数なら"hoge"にする。
lst = [ i if i%2==0 else "hoge" for i in [1,2,3,5,6,7] ]
#['hoge', 2, 'hoge', 'hoge', 6, 'hoge']

```

elseがある場合はifの位置が変わるため注意。
##入れ子にもできる

```python3:pori.py
#3*3の0の入ったリストを作成する
lst = [[ 0 for i in range(n) ] for i in range(n) ]
#[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
```
・・・読みづらい。

#スライス
*元のリストをそのまま*に、一部の要素を切り出したリストを作れる。

```python3:pori.py
lst=[0,1,2,3,4,5]
lst[1::]
# [1, 2, 3, 4, 5]
lst[:3:]
# [0, 1, 2]
lst[::2]
# [0, 2, 4]
```
表記法は　
>リスト[(始点):(終点):(ステップ数)]


#組み込み関数zip()で~~回転~~転置

[Pythonリスト型の二次元配列の行と列を入れ替える（転置）](https://note.nkmk.me/python-list-transpose/)

組み込み関数で2次元リストの転置ができるらしい。
[組み込み関数 &#8212; Python 3.7.4 ドキュメント](https://docs.python.org/ja/3/library/functions.html#zip)
>それぞれのイテラブルから要素を集めたイテレータを作ります。
>この関数はタプルのイテレータを返し、その i 番目のタプルは引数シーケンスまたはイテラブルそれぞれの i 番目の要素を含みます。

ということらしい。ただし帰ってくるのはタプルなので、リストとして用いたい場合は各要素をlist()メソッドで変換する必要がある。

```python3:pori.py
n=4
lst=[[ i for i in range(n) ] for i in range(n+1) ]
# [[0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]]
list(zip(*lst))
# [(0, 0, 0, 0, 0), (1, 1, 1, 1, 1), (2, 2, 2, 2, 2), (3, 3, 3, 3, 3)]
```

#max()、min()メソッドで数値の比較
当たり前だけど要素が２個しかなければただの比較になる。速いのかどうかは良くわからないけ１行で比較ができるのは楽。

```python3:pori.py
max(2,4)
# 4
min(2,4)
# 2
```

#負の要素数
基本的なことなのにいつも忘れてしまう。もちろんスライスでも負の数を指定できる。

```python3:pori.py
lst=[0,1,2,3,4,5]
lst[-1]
# 5
```
python で近似球を作ってみる

## 概要　
今回は，OPENGLで描画，実装されているコードを見つけたので，それをPythonに書き換えてみました．
この記事には，メモ程度に作っているので，ご理解お願いします．

##動作環境
この記事は以下の環境で動いています。

| 項目 | 値 |
|:-:|:-:|
| CPU | Core i5-8250U |
| RAM | 8GB |
| Ubuntu | 18.04 |
| python | 2.7 |
| ROS | melodic |



##近似球って？
近似球は言葉の通り，球体を近似したもの．
英語では，icosphereとか言われているらしい．
コンピュータ上で，球体を表現，描画するときに必要な手法．
グラフィックデザイナーとかの人たちは，作成した近似球にテクスチャを貼ることで，地球儀とかを表現することができるようになるっぽい．

##実際に作ってみる
具体的なスクリプトは，[こちら](http://www.songho.ca/opengl/gl_sphere.html)に書いてあるものを参考にしました．
これをpythonで実装します．他の方々がもっとスマートな方法でスクリプトを作成しているのですが，今回は，近似球の各頂点を明示的にわかるようなコードにしています．

```sphere.py
#!/usr/bin/env python3

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

radius=1.0
sectorCount=20
stackCount=20

xx=[]
yy=[]
zz=[]

lengInv=1.0/radius
sectorStep = 2* np.pi/ sectorCount;
stackStep = np.pi/ stackCount;

for i in range(int(stackCount)):
    stackAngle=(np.pi/2)-i*stackStep
    xy=radius*np.cos(stackAngle)
    z=radius*np.sin(stackAngle)

    for j in range(int(sectorCount)):
        sectorAngle = j * sectorStep
        x = xy * np.cos(sectorAngle)            
        y = xy * np.sin(sectorAngle) 

        xx.append(x)
        yy.append(y)
        zz.append(z)

#print("x",xx[1])
fig = plt.figure(figsize = (10,10))
ax = fig.add_subplot(111, projection='3d')

for i in range(len(xx)):
    ##ax.plot_surface(xx[i], yy[i], zz[i], rstride=4, cstride=4, color='b')
    #ax.plot_wireframe(xx[i], yy[i], zz[i],color="r")
    ax.scatter(xx[i], yy[i], zz[i], color="r", s=8.0)
    #ax.quiver(0, 0, 0,xx[i], yy[i], zz[i], color='royalblue',length=1.0, normalize=True, arrow_length_ratio=0.2)
plt.show()
```
`radius`,`sectorCount`,`stackCount`がパラメータになっています．
デフォでは単位近似球となっています．
pythonの描画ライブラリ，`matplotlib.pyplot`が必要です．
実行結果はこんな感じ．
![sphere.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467962/39737c52-b767-bd60-4171-3f5761cae3b0.png)


`#ax.quiver(0, 0, 0,xx[i], yy[i], zz[i], color='royalblue',length=1.0, normalize=True, arrow_length_ratio=0.2)`のコメントを外すと，中心から各頂点に向かう方向ベクトルを可視化することができます．
![sphere2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467962/83f76782-1c4e-3e37-5473-2f127393d5e4.png)

まぁまぁいい感じ？
中心から各頂点までの方向ベクトルを求めることができるので，この方向ベクトルをもとに，物体をランダムに回転させたいなぁと思っています．．．
【作成中】Raspberry Pi／Sambaによる外付けHDDのNAS化（GUIで設定）

#環境、使用ソフト

- Raspberry Pi 3 Model B+
- Raspbian GNU/Linux 10
- Samba ver.4.9.5-Debian
- Webmin ver.1.920

#インストール
###Sambaのインストール

```
$ sudo apt-get update
$ sudo apt-get install samba
```

###Webminのインストール
ブラウザベースのGUIツールで半分くらい日本語対応。
dpkgでインストール。

```
$ wget http://prdownloads.sourceforge.net/webadmin/webmin_1.830_all.deb
$ dpkg --install webmin_1.830_all.deb
```

#設定
ブラウザに下記アドレスを入力してRaspberry Piにアクセス。

- http://[サーバーのIPアドレス]:10000/

###Webminの日本語化

Webmin ⇒ Webmin設定 ⇒ 言語　の順にクリック、日本語に設定

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321914/be1bd800-1ceb-ca5d-ad58-3f3cb21a229b.png)

###外付けHDDのマウント
マウントポイントを作成し、パーミッションを変更。

```
$ sudo mkdir /mnt/hdd1
$ sudo chmod 777 /mnt/hdd1
```

fdiskで認識確認。

```
$ sudo fdisk -l
```

HDDのUUIDを確認。

```
$ sudo blkid /dev/sda1
```

`/etc/fstab`の末尾に下記を追記することで、再起動時に自動マウント。
マウント先は先ほど作成したフォルダ。
設定を間違えると起動しなくなることがあるのでバックアップを取っておく。


```
UUID="10F2379CF237854E" /mnt/hdd1 ntfs-3g defaults,nofail 0       0
```

#Sambaの設定
作成中

#転送速度の測定結果
![スクリーンショット 2019-07-25 01.52.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321914/91951db7-1fdf-c3c7-7835-a2a8a03fecf6.png)
Service Worker のキャッシュ制御

#Service Workerのキャッシュ制御
PWAでServiceWorkerを扱ったのですが、ふわっとしか触れられておらず、分かりづらかったので、ひとまずキャッシュの制御に関して実用レベルでやってみた実例の紹介です。

##Service Workerのおさらい
通常は、Webサイトを閲覧するときに、
閲覧者 = Browser <-> Web Server
という形で通信をしますが、Service Workerを使うと、
閲覧者 = Browser <-> **Service Worker** <-> Web Server
となり、すべての通信は、Service Workerを介して行われることになります。

##キャッシュを完全に制御できる！？
いろいろ Service Worker の機能がありますが、今まで、ブラウザ任せで「キャッシュされているのかどうか分からない」状態だったものが、明示的に

- これはキャッシュする
- これはキャッシュしない
- 今はキャッシュを読み込まない

などの制御ができるようになります。


#今回の仕様
- 初回のインストール時は特に何もしない
- リクエストがきたら、基本的にキャッシュ追加していく
- ただし、特定のドメインのファイルは明示的にキャッシュしない
- 特定のファイルを明示的にキャッシュする
- 全キャッシュを明示的に削除する

```javascript:sw.js
var CACHE_NAME  = "cache-name-here";

//キャッシュしないドメイン名のリスト
var noCacheList = [
	"www.google-analytics.com",
	"localhost"
];

//インストール時の処理
self.addEventListener('install', function(e) {
	//何もしない
	return;
});

//フェッチ時（何かしらの通信リクエスト）があったときの処理
self.addEventListener('fetch', function (e) {
	e.respondWith(
		caches.open(CACHE_NAME).then(function (cache) {
			return cache.match(e.request).then(function (response) {
				if (response) {
					// e.requestに対するキャッシュが見つかったのでそれを返却
					return response;
				} else {
					// キャッシュが見つからなかったので取得
					return fetch(e.request.clone()).then(function (response) {
						//キャッシュしないドメイン名のリストに含まれていないかを確認する
						var url = e.request.url;
						var flg = true;
						for(var cnt=0;cnt<noCacheList.length;cnt++){
							if(url.indexOf(noCacheList[cnt])!=-1){
								flg = false;
							}
						}
						if(flg){
							//キャッシュに追加する
							cache.put(e.request, response.clone());
						}else{
							//リストにあったのでキャッシュ追加はしない。
						}
						// 取得したリソースを返却
						return response;
					});
				}
			});
		})
	);
});

//メッセージ受信時の処理
self.addEventListener('message', function(e) {
	switch (e.data['command']) {
		case 'clearCacheAll':
			//全キャッシュをクリアする
			e.waitUntil(
				caches.keys().then(function(names) {
					for (let name of names){
						caches.delete(name);
					}
				})
			);
		break;
		case 'getCache':
			//URLリストのキャッシュを取得する
			e.waitUntil(
				caches.open(CACHE_NAME).then((cache) => {
					this.console.log(e.data['files']);
					// 指定されたリソースをキャッシュに追加する
					return cache.addAll(e.data['files']);
				})
			);
		break;
	}
});


```

呼び出し側のJavaScript

```javascript
//サービスワーカー登録
if ('serviceWorker' in navigator) {
	navigator.serviceWorker.register('sw.js')
	.then(
	function (registration) {
		if (typeof registration.update == 'function') {
			registration.update();
		}
	})
	.catch(function (error) {
		_c_("Error Log: " + error);
	});
}
```


```javascript
//メッセージ送信例：キャッシュ取得
var swctrl = navigator.serviceWorker.controller;
swctrl.postMessage({
	'command':'getCache',
	'files':['https://wwww.sample.data/abc.png','https://wwww.sample.data/def.png']
});
```

```javascript
//メッセージ送信例：全キャッシュ削除
var swctrl = navigator.serviceWorker.controller;
swctrl.postMessage({
	'command':'clearCacheAll'
});

```
【GASの2歩目】Gmailの下書き(draft)の作成

# はじめに
前回はさわりとしてメール送信をしました。
なので今回はメールの下書きをGASで作ってみます。
一番最初の記事を読んだ方にはつまらない内容になると思います。

ちなみにその記事　→　[【GASの0歩目】脱コピペ！！クラスとメソッドをやんわりと](https://qiita.com/MeJamoGssiper/items/62a72747736ec4f898a7)
# 実際に下書き(draft)を作ってみる
## createDraft メソッド


公式ドキュメントにはこんな感じで書かれていました。

```js
createDraft(recipient, subject, body)
```
createDraft(宛先,件名,本文)
要素は全てString（文字列）でいれていきます。



```js
function makeDraft() {
  var recipient = "aaa@gmail.com";
  var subject = "【GASコース】下書きの試し";
  var body = "本文がここに入ります。";
  
  //==========【おまけ】作成した時間も記録===========
  var now = new Date();
  body += "\n This time:" + now.toString();
  //=========================================
  
  GmailApp.createDraft(recipient,subject,body);
}
```

<details><summary>実行結果</summary><img width="1380" alt="ドラフトの作成G.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388345/a53ae129-dc2b-bcfd-2c86-2fc0fc1bc714.png"></details>


# 終わりに
特にこれといって説明はありません。
GASで下書きを作るメリットとしては、、、？？
Gmailで送信せずにGASで作ったメールの確認ができるぐらいではないでしょうか？

いろんなメソッドに触れてGASに慣れていこうと思います。
【メモ】Rで積分計算（検算）

# 標準正規分布の確率密度関数の積分を検証する
$\displaystyle\int_{-\infty}^{\infty} \frac{1}{\sqrt{(2\pi)}}e^{-x^2/2} dx = 1$
を検証します。

##Rで左辺を計算してみる

積分範囲は（$-\infty$から$\infty$と取るのは不可能なので、代わりに）$-100$から$+100$として計算してみます。

```R:
#被積分関数の定義
s <- function(x){
exp(-x^2/2)/sqrt(2*pi)
}
#積分の実行
integrate(s, lower = -100, upper = 100)
```
出力結果は

```R:
1 with absolute error < 3.2e-07
```
となります。積分結果は$1$であり、計算誤差は$3.2\times 10^{-7}$であるという結果です。
積分範囲は適当にカットオフしましたが、検算の意味では十分でしょう。$|x|>100$の領域でこの確率密度はほぼ0になるということです。

下記は実行時のスクショ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64610/5ff2ede0-886a-1658-720f-f6b97263f800.png)

##手計算で検証する
まず次の定積分$I$を用意します。
$$I=\int_{-\infty}^\infty e^{-x^2}dx$$
$I$を自乗し、$x=r\cos\theta,y=r\sin\theta$と置換します。$dxdy=rdrd\theta$より
$$I^2 = \int_{-\infty}^\infty dx\int_{-\infty}^\infty dy e^{-(x^2+y^2)}=\int_0^\infty dr re^{-r^2}\int_0^{2\pi}d\theta=\pi$$
となり$I=\sqrt{\pi}$が示せます。$I$の積分で、$x\to x/\sqrt{2}$と置換すれば、題記の積分が示せます。
より詳しくは「ガウス積分」で検索してみましょう。
Railsでdb:createすると謎のsyntax errorが出る

Railsのプロジェクトをデプロイする際に、Railsの仕様を知らなくてハマってしまった話。

#本番環境
- Rails5.2.3
- Mysql5.7
- EC2 (Amazon Linux AMI 2018.03.0.20190611 x86_64 HVM gp2)
- RDS (エンジンバージョン 5.7.22)

(どんなこと書けばいいかわからない、、、)

#エラーメッセージ
 ``bundle exec rails db:create RAILS_ENV="production"``すると下のようなエラーが出てしまう。

```bash
Caused by:
Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.`cxngxxxxxxxx`.`ap-northeast-1`.`rds`.`amazonaws`.`com` DEFAULT CHARACTER SET `' at line 1
```
```ruby:database.yml
default: &default
  encoding: utf8
  adapter: mysql2
  database: sochan-db
  pool: 5

production:
  <<: *default
  host: <%= ENV['DATABASE_URL'] %>
  port: 3306
  username: root
  password: <%= ENV['DATABASE_PASSWORD'] %>
```
```bash:.env
DATABASE_URL = "sochan-db.cxngxxxxxxxx.ap-northeast-1.rds.amazonaws.com"
DATABASE_PASSWORD = "hogehoge"
```

``database.yml``がおかしいのかなと思い見てみたけど、特に変なところはないような気がする。
そもそもRDSに繋がっているのかとhostが間違っていないか確認してみた。

```bash
[ec2-user@ip-xx-xxx]$ mysql -u root -p -h sochan-db.cxngxxxxxxxx.ap-northeast-1.rds.amazonaws.com
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 37
Server version: 5.7.22-log Source distribution

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```
繋がるなー
どこが、間違っているのかさっぱりわからない。
ymlファイルに**タブ**とか**#**が入ってたりするとうまく動かないことがあるらしいので、１行ずつ見ていったけど、特に変なところはなかった。

```bash
[ec2-user@ip-xx-xxx]$bundle exec unicorn_rails -c /var/www/rails/project/config/unicorn.conf.rb -D -E production
master failed to start, check stderr log for details
[ec2-user@ip-xx-xxx]$cat log/unicorn.log 
I, [2019-07-23T20:02:48.830017 #22402]  INFO -- : Refreshing Gem list
I, [2019-07-23T20:02:49.412202 #22402]  INFO -- : unlinking existing socket=/var/www/rails/project/tmp/sockets/.unicorn.sock
I, [2019-07-23T20:02:49.412355 #22402]  INFO -- : listening on addr=/var/www/rails/project/tmp/sockets/.unicorn.sock fd=9
E, [2019-07-23T20:02:49.470715 #22402] ERROR -- : Unknown database 'sochan-db.cxngxxxxxxxx.ap-northeast-1.rds.amazonaws.com' (ActiveRecord::NoDatabaseError)
```
unicornを起動しようとしても、databaseがないと言われる。でも、databaseが作れない。
hostとpasswordを直打ちにしてみても、同じエラーがでる。

#結論
エラーメッセージをよく見返すと、databaseの名前にhostが入っていた。
どうやら、 ``ENV['DATABASE_URL']``という環境変数はRailsの仕様で、database.ymlの内容に関わらず、優先されるらしい。
hostとpasswordを直打ちで試してみた際には、``.env``を消していなかったので、``database.yml``より優先されて読み込まれることで、databaseの名前がhostになるという現象が起こってしまった。

``ENV['DATABASE_URL']`` → ``ENV['DATABASE_HOST']``

に変えることにより無事解決。

#終わりに
**rails database_url**とかで検索すると普通に出てきたけど、そこが間違っていると思っていなかったので、うまく検索で見つけられなかった。
ここは、**絶対あってるってとこが間違ってました、、、**
カルーセルを使って複数画像をスライドさせる方法

友人たちと開発している、時間の使い方を管理するサービス「 [Owntime](https://owntime.io/signup) 」で使用したカルーセルの使い方をまとめました。

カルーセルを使うことで、ユーザーの目につきやすい箇所に複数の画像を表示することが出来ます。

今回は、jQueryの[Slick](https://kenwheeler.github.io/slick/)を使用しました。Vue.jsやReact.js、Angularの方が、モダンであることは、承知していますが、手っ取り早く実装したかったので、オワコンと言われているjQueryを使いました。

(jQueryで書かれているコードたちをモダンなJavaScriptに **書き換えてくれる** or **勉強のために書き換えてみたい** って人は、連絡ください！！)

出来上がりイメージ↓
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185039/107b3c14-77aa-6a18-de94-5aec4944f7e2.gif" width="35%"/>

## 対象読者
- プログラミング初学者の方
- 普段はバックエンドを触っているがフロントを触る必要がある方
- オワコンと言われているjQueryからまだまだ離れられない方

## 簡単に実装してみる
まずは、jqueryとslickの準備をします。

```sample.html
<head>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/slick-carousel@1/slick/slick.min.css">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/slick-carousel@1/slick/slick-theme.min.css">
 
    <script type="text/javascript" src="//code.jquery.com/jquery-1.11.0.min.js"></script>
    <script type="text/javascript" src="//code.jquery.com/jquery-migrate-1.2.1.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/slick-carousel@1/slick/slick.min.js"></script>
</head>
```

カルーセルを実装します。

```sample.html
<body>
    <style>
        .signup-slider {
            padding-inline-start: 0px;
            margin: 25px
        }
    </style>

    <div>
        <ul class="slider signup-slider">
            <li>
                <img src="path/to/image1.png" width="100%" alt="画像1">
            </li>
            <li>
                <img src="path/to/image2.png" width="100%" alt="画像2">
            </li>
            <li>
                <img src="path/to/image3.png" width="100%" alt="画像3">
            </li>
            <li>
                <img src="path/to/image4.png" width="100%" alt="画像4">
            </li>
            <li>
                <img src="path/to/image5.png" width="100%" alt="画像5">
            </li>
            <li>
                <img src="path/to/image6.png" width="100%" alt="画像6">
            </li>
        </ul>
    </div>

    <script>
        $('.slider').slick({
            dots: true,
            centerMode: true,
            centerPadding: '5px',
            slidesToShow: 1,
            autoplay: true,
            autoplaySpeed: 1000,
            responsive: [
                {
                    breakpoint: 320,
                    settings: {
                        arrows: false,
                        centerMode: true,
                    }
                }
            ]
        });
    </script>
</body>
```

他のオプションについては、[Slickの公式ページ](https://kenwheeler.github.io/slick/)を参考にしてください。

## おまけ
今回紹介したslickを、友人と[Owntime](https://owntime.io/signup)に実装しています。
毎日の時間の使い方を記録して、分析して、理想な時間の使い方に近づけるサポートをするサービスです。

ぜひ、一度使ってみてください！
PyQt 空のウインドウ

からっぽのウインドウ

```sample.py

#! /usr/bin/python3
# -*- coding: utf-8 -*-

import sys
from PyQt5 import QtWidgets

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    
    window = QtWidgets.QWidget()
    window.show()
    
    sys.exit(app.exec_())

```

カーネル停止対策
ちょいちょいカーネルが停止するのをふせぐ

```sample.py

#! /usr/bin/python3
# -*- coding: utf-8 -*-

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

class ああああ(QWidget):

    def __init__(self,parent=None):
        super(ああああ,self).__init__(parent)

    #カーネル停止対策１
    def quitApp(self):
        QtCore.QCoreApplication.instance().quit()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    
    #カーネル停止対策２
    app.aboutToQuit.connect(app.deleteLater)

    window = ああああ()
    window.show()
    sys.exit(app.exec_())

```
【GASの1歩目】Gmailでメール送信してみた


前回はクラスとメソッドのイメージ？と[公式ドキュメント](https://developers.google.com/apps-script/)の使い方をやんわりと説明しました。
なので今回はサクッとメールの送信をしてみます。

ちなみに前回の記事　→　[【GASの0歩目】脱コピペ！！クラスとメソッドをやんわりと](https://qiita.com/MeJamoGssiper/items/62a72747736ec4f898a7)
# 実際にGmailを送信してみる
## sendEmail メソッド
```js
function GmailToSomeone() {
  var address = 'XXX@gmail.com';
  var title = '【GASコース】Gmailを送ってみよう';
  var content = 'これからGASについて勉強していきます！！';
  
  GmailApp.sendEmail(address, title, content);
}
```
上記のコードでメールが送れますので試してみてください。

## option
sendEmailメソッドには上記の基本的な送信以外にもたくさんの機能がついているので試してみてください。
```js
GmailApp.sendEmail(
  "XXX@gmail",
  "件名",
  "本文",
  {
    cc: 'aaa@gmail.com',
    bcc:'bbb@gmail.com',
    from:'YYY@gmail.com',
    name:'鉄仮面小僧',
    replyTo:'デフォルトの返信先メールアドレス（変更可）'

  }
)
```
さらにHTMLやJavascriptを勉強すればメールの幅が広がりそうです。
（気になる方は「装飾メール」で検索してみてください）
# 終わりに
今回の内容は前回に比べてとても簡単でした。
少しずつ進めていきます。

良いGASライフを！！
firebase-adminからCloudStorageの署名付きURLの取得(getSignedUrl)ができるようにする設定

# CloudStorageにアップロードしたファイルにアクセスするURLが欲しい
`File#getSignedUrl`を使います。
https://cloud.google.com/nodejs/docs/reference/storage/2.5.x/File#getSignedUrl
でも設定足りてないとエラーになるよ、というお話。

----
# 話それるけど
`@google-cloud/storage`のAPIリファレンスはここに誘導されるけどなぜか開けない…
https://googleapis.dev/nodejs/storage/latest

----
# 話それるけど２
アップロードはこんな感じでできます

```js
const admin = require('firebase-admin');
admin.initializeApp();
const bucket = admin.storage().bucket();
(中略)
await bucket.upload(file, {
  destination: 'dir/image.png',
  gzip: true,
  metadata: {
    cacheControl: 'public, max-age=31536000',
    contentType: 'image/png',
  },
});
```

----
# getSignedUrl
デフォルトだとCloudStorage上のファイルはprivateなので読めない。（403エラー）
`getSignedUrl`で読めるURLを取得する。
失効時間指定もできる。

----
## getSignedUrlしてみる

```js
// 10分間だけ有効
const url = await bucket.file('dir/image.png').getSignedUrl({
  action: 'read',
  expires: moment().utc().add(10, 'minutes').format(),
});
```

----
# エラーになることがある その１

```sh
Error: A Forbidden error was returned while attempting to retrieve an access token for the Compute Engine built-in service account.
This may be because the Compute Engine instance does not have the correct permission scopes specified.
Identity and Access Management (IAM) API has not been used in project 566029xxxxxx before or it is disabled.
Enable it by visiting
 https://console.developers.google.com/apis/api/iam.googleapis.com/overview?project=566029xxxxxx
 then retry.
If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.
```

----
エラーメッセージに記載されたURLにアクセスし、指示の通りに`IAM API`を有効化しましょう。
<img width="756" alt="README_img_enable-IAM-API.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301/5630fdb2-3b18-ef73-3909-d28137e1c7bf.png">

----
# エラーになることがある その2

```sh
Error: A Forbidden error was returned while attempting to retrieve an access token for the Compute Engine built-in service account.
This may be because the Compute Engine instance does not have the correct permission scopes specified.
Permission iam.serviceAccounts.signBlob is required to perform this operation on service account
 projects/XXsome-projectXX/serviceAccounts/XXsome-projectXX@appspot.gserviceaccount.com.
```

----
ちょっと何言ってるかわかりません…
ググったらこういうことらしいです。

`<プロジェクト名>@appspot.gserviceaccount.com`(App Engine default service account)に`サービスアカウントトークン作成者`roleをつける

※`iam.serviceAccounts.signBlob`の権限をもつroleを新たに作ったほうがいいのかもしれませんが、`サービスアカウントトークン作成者`だけがこの権限を持っていたのでこれを付けることにしました。

<img width="1441" alt="README_img_add-IAM-ROLE.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301/29c1bbdc-6ff9-2d15-0952-3a7e5383a900.png">

----

# 以上で解決しました
コードの修正は必要ありませんでした。
めでたしめでたし。

参考: https://medium.com/@hiranya911/firebase-create-custom-tokens-without-service-account-credentials-d6049c2d2d85#772f