OmniAICreator/Qiita-1.07M huggingface dataset:
メモ欄


# VS Codeでのビルドスクリプトの書き方
http://gabekore.org/vscode-c-windows
http://gabekore.org/vscode-c-mac
http://qiita.com/dockurage/items/49e7295e7ff7458e26cd


# 典型的なキュレーションサイトのナリなのに案外面白いものを紹介してて草
http://plus.appgiga.jp/masatolan/2016/08/18/57162/
http://plus.appgiga.jp/masatolan/2017/02/10/57537/
http://plus.appgiga.jp/masatolan/2017/01/26/57509/
http://plus.appgiga.jp/masatolan/2017/01/11/57484/
http://plus.appgiga.jp/masatolan/2016/10/31/57359/

# C#のミニマムなHTTPサーバ（リスナ）
http://qiita.com/wakaba260/items/ebd0136cfb71388dbde2
http://www.atmarkit.co.jp/fdotnet/dotnettips/695httplistener/httplistener.html
https://github.com/1iveowl/Simple-Http-Listener-PCL
https://codehosting.net/blog/BlogEngine/post/Simple-C-Web-Server

# Hyper-V と各種仮想化
http://app-review.poox.xyz/archives/1449

# WebVIEW
## UWP
https://docs.microsoft.com/ja-jp/windows/uwp/controls-and-patterns/web-view
http://wakiama.hatenadiary.jp/entry/2016/02/20/120728

#Android
6.0では動いたが？
https://forums.xamarin.com/discussion/2829/webview-and-isolatedstorage-api
```
string appRootPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
new Uri("file://" + appRootPath + "/your/file.html" )
```
https://teratail.com/questions/35714
http://sonic.blue/it/744
https://xamarinhelp.com/webview-rendering-engine-configuration/
http://mattsudev.hatenablog.com/entry/2015/07/13/183934

#アイコン
http://blog.yamamoworks.net/entry/2016/07/03/Xamarin_Forms_IconFont
New Relic を Amazon Linux に入れる方法

https://docs.newrelic.com/docs/servers/new-relic-servers-linux/installation-configuration/install-redhat-centos-new-relic-servers

で最新のコマンドをみつつ、

```
rpm -Uvh https://yum.newrelic.com/pub/newrelic/el5/x86_64/newrelic-repo-5-3.noarch.rpm
yum install newrelic-sysmond
nrsysmond-config --set license_key=YOUR_LICENSE_KEY
# /etc/newrelic/nrsysmond.cfg で hostname とか変える
/etc/init.d/newrelic-sysmond start
```
Zynq > BOOT.binの解析 > G. imagetabの比較

### 7 (PetaLinux)

```txt:動作環境
PetaLinux 2014.4
Vivado v2014.4
MicroZed
```

2014年頃のメモより。

|  | zynq-boot |	XSDK (v2014.4) | PetaLinux (v2014.4) |
|:-:|:-:|:-:|:-:|
| Version | 16842752 | 16908288	| 16908288 |
| ImageCount | 3 | 3 | 2 |
| PartitionOffset | 0x260 | 0x320 | 0x320 |
| ImageOffset | 0x240 | 0x240 | 0x240 |
 
Versionについてはendianなどの変換が必要なのか今のところわからない。
PartitionOffsetが変わるので、これによりパーティションデータの読込み場所が変わる。
Zynq > BOOT.binの解析 > F. .elfファイルの構造

```txt:動作環境
PetaLinux 2014.4
Vivado v2014.4
MicroZed
```

2014年頃のメモより。


### .elfファイルのフォーマット
[Wikipedia](https://en.wikipedia.org/wiki/Executable_and_Linkable_Format)
[http://caspar.hazymoon.jp/](http://caspar.hazymoon.jp/OpenBSD/annex/elf.html)
[七誌の開発日記 > ELFの動的リンク(1) > ELFファイルの構造](http://7shi.hateblo.jp/entry/2013/05/25/103050)
[０から作るソフトウェア開発 > Tips　ELFフォーマットその１　ELFフォーマットについて](http://softwaretechnique.jp/OS_Development/Tips/ELF/elf01.html)
Macのメモ帳から内容をファイルに書き出す

Macのメモ帳はPDFにエクスポートする機能しか提供されてない、本体はsqliteでZNOTEBODYテーブルのZHTMLSTRINGカラムに本体が入ってる。本体はHTML。
ファイルとして書き出したいときのワンライナーを紹介しておく。
bash3.2で動作確認。どうでもいい話だがbash4だとfor in loopが入ってるらしいという気づきを得た

```bash
count=0; sqlite3 Library/Containers/com.apple.Notes/Data/Library/Notes/NotesV4.storedata 'select ZHTMLSTRING from ZNOTEBODY' | while read line; do echo $line > note$count; ((count++)); done
```
Zynq > BOOT.binの解析 > E. BOOT.binのダンプ (linux)

```txt:動作環境
PetaLinux 2014.4
Vivado v2014.4
MicroZed
```


以下のコマンドで16進数でデータダンプできる

```
$od -x -w16 -A x BOOT.bin | less
```

zynq-bootにて作成したboot.binファイルのダンプ。 確かに0x08A0などが0xFFで埋められている
![image.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/3aa60237-5336-3e22-8977-b3a282801e07.jpeg)

Petalinuxにて作成したBOOT.binファイルのダンプ。
![image.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/869a321d-4af8-bbf1-7b69-fb0ff69f9cc2.jpeg)

特定のアドレス(例 0x964近辺)をダンプするには以下のようにする

```
$ od -x -w16 -A x boot.bin -j 0x964 | head -n 2
```
Zynq > BOOT.binの解析 > D. BOOT.binのチェックサム

```txt:動作環境
PetaLinux 2014.4
Vivado v2014.4
MicroZed
```

2014年頃のメモより。

partinit[].Checksumは以下の処理で計算している

```c
/* last partition entry is all '0' */
for (i = 0; i <= imagetab.ImageCount; i++) {
    if (i != imagetab.ImageCount)
        partinit[i].Pads[1] += imagetab.ImageOffset;
    uint32_t checksum = 0, *pdata = (uint32_t *)&partinit[i];
    for (j = 0; j < 15; j++)
         checksum += *pdata++;
    partinit[i].CheckSum = ~checksum;
}
```
Zynq > BOOT.binの解析 > C. BOOT.binの構造

```txt:動作環境
PetaLinux 2014.4
Vivado v2014.4
MicroZed
```

2014年ころのメモより。

xbootgen.cを改変して実行することにより調べた。
 
- 0x0000から0x001F (  32バイト) : buffer (reserved for interrupts) : unsigned char[1024]
- 0x0020から0x009F (128バイト) : boot_rom_header : uint32_t[32]
- 0x00A0から0x089F (   8バイト x 256) : reginit
- **0x08A0から0x08BF (  32バイト) : align_file()関数により0xFFで埋めている**
- 0x08C0から0x08CF (  16バイト) : imagetab : ImageHeaderTable
- **0x08D0から0x08FF (  32バイト) : align_file()関数により一部を0xFFで埋めている**
- 0x0900から0x090F (  16バイト) : imagehead[0] : ImageHeaderTable
- 0x0910から0x0923 : nametemp.i[j]
- **0x0924から0x093F (  32バイト) : align_file()関数により一部を0xFFで埋めている**
- 0x0940から0x094F (  16バイト) : imagehead[1] : ImageHeaderTable
- 0x0950から0x0963 : nametemp.i[j]
- **0x0964から0x097F (  32バイト) : align_file()関数により一部を0xFFで埋めている**
- 0x0980から0x0A7F ( 64バイト x 4) : partinit : BootPartitionHeader[4] << 最大サイズ10の配列 (4: fsbl / zImage / ramdisk / devicetree.dtb)
- 0x0A80以降 : buffer (partition_data) // Now copy data from each elf file into target file というコメント有 

### reginit (8バイト)
```
struct {
uint32_t address;
uint32_t value;
} reginit = {0xffffffff, 0};
```

### ImageHeaderTable (16バイト)
```
typedef struct {
uint32_t Version;
uint32_t ImageCount;
uint32_t PartitionOffset;
uint32_t ImageOffset;
} ImageHeaderTable;
```

### BootPartitionHeader (64バイト)
```
typedef struct {
uint32_t ImageWordLen;
uint32_t DataWordLen;
uint32_t PartitionWordLen;
uint32_t LoadAddr;
uint32_t ExecAddr;
uint32_t PartitionStart;
uint32_t PartitionAttr;
uint32_t SectionCount;
uint32_t Pads[7];
uint32_t CheckSum;
} BootPartitionHeader;
```

### zynq_fsbl > image_mover.h > PartHeader (64バイト)
```
typedef struct StructPartHeader {
u32 ImageWordLen; /* 0x0 */
u32 DataWordLen; /* 0x4 */
u32 PartitionWordLen; /* 0x8 */
u32 LoadAddr; /* 0xC */
u32 ExecAddr; /* 0x10 */
u32 PartitionStart; /* 0x14 */
u32 PartitionAttr; /* 0x18 */
u32 SectionCount; /* 0x1C */
u32 CheckSumOffset; /* 0x20 */
u32 Pads1[1];
u32 ACOffset; /* 0x28 */
u32 Pads2[4];
u32 CheckSum; /* 0x3C */
}PartHeader;
```

PartHeader構造体はBootPartHeaderと同じサイズの構造ではあるが、Pads[7]の定義が (CheckSumOffset, Pads1[1], ACOffset, Pads2[4]) のように分けられている。
 
BOOT.binの情報付加に使用を考えていた場所の32バイトすべてが0xFFで埋まっているか(not usedか)を調べた。
usedの場合、領域を8バイトずつA,B,C,Dとし、そのどれが未使用領域であるかを記載している。

| |	zynq-boot | PetaLinux (v2014.4) | XSDK (v2014.4) | 左記３つの共通空き領域 (合計96バイト) |
|:-:|:-:|:-:|:-:|:-:|
| 0x8A0から32バイト | not used | not used | not used | ABCD |
| 0x8D0から32バイト | not used | used (未使用: BCD) | used (未使用: BCD) | BCD (0x8D8から24バイト) |
| 0x924から32バイト | used (未使用: ABC) | used (未使用: ABC) | used (未使用: ABC) | 	ABC (0x924から24バイト) |
| 0x964から32バイト | used (未使用: ABC) | used (未使用: ABCD) | used (未使用: BC)	| BC (0x96Cから16バイト) |
Zynq > BOOT.binの解析 > B. xbootgen.cの使い方

```txt:動作環境
PetaLinux 2014.2
Vivado v2014.2
MicroZed
```

以下でコンパイルできる (Linux)

```
gcc xbootgen.c -o xbootgen
```

以下でxbootgenを実行する。 .elfファイルはzynq-bootリポジトリ取得後、petalinuxの設定を読み込んで、`make bootbin.zedboard`した時に作られたもの。 (`make bootbin.zedboard`自体は途中でエラーとなった)

```
./xbootgen zynq_fsbl.elf zcomposite.elf
```

xbootgenでは実行時引数を上記の2つと固定にしている。2つない場合はエラーとなる。
Zynq > BOOT.binの解析 > A. xbootgen.c > 関連するtypedef

### 7 (PetaLinux)

```txt:動作環境
PetaLinux 2014.2
Vivado v2014.2
MicroZed
```

2014年のメモより。

[zynq-boot](https://github.com/cambridgehackers/zynq-boot) においてBOOT.binを作成するコードが公開されている。この中でxbootgen.cが実際書込みしている内容のようだ。
xbootgen.cにて使われるtypdef structを以下に記す。
 
### elf_header

```
typedef struct {
unsigned char e_ident[16];
uint16_t e_type;
#define ET_EXEC 2
uint16_t e_machine;
uint32_t e_version;
uint32_t e_entry;
uint32_t e_phoff;
uint32_t e_shoff;
uint32_t e_flags;
uint16_t e_ehsize;
uint16_t e_phentsize;
uint16_t e_phnum;
uint16_t e_shentsize;
uint16_t e_shnum;
uint16_t e_shstrndx;
} elf_header;
```

### program_header
```
typedef struct {
uint32_t p_type;
uint32_t p_offset;
uint32_t p_vaddr;
uint32_t p_paddr;
uint32_t p_filesz;
uint32_t p_memsz;
uint32_t p_flags;
uint32_t p_align;
} program_header;
```

### ImageHeaderTable
```
typedef struct {
uint32_t Version;
uint32_t ImageCount;
uint32_t PartitionOffset;
uint32_t ImageOffset;
} ImageHeaderTable;
```

### BootPartitionHeader
```
typedef struct {
uint32_t ImageWordLen;
uint32_t DataWordLen;
uint32_t PartitionWordLen;
uint32_t LoadAddr;
uint32_t ExecAddr;
uint32_t PartitionStart;
uint32_t PartitionAttr;
uint32_t SectionCount;
uint32_t Pads[7];
uint32_t CheckSum;
} BootPartitionHeader;
```

### ImageHeader
```
typedef struct {
uint32_t next;
uint32_t partition;
uint32_t count;
uint32_t name_length;
} ImageHeader;
```

以下、気になるコメント

```c
/* From TRM, Chapter 6: Boot and Configuration */
static ImageHeaderTable imagetab = {0x1010000};
static uint32_t boot_rom_header[32] = {
    0xaa995566, 0x584c4e58, 0, 0x1010000, };
```

以下の処理で実際のファイルを書込みしているので、write()文を追うことで構造がわかるはず。

```c
fdoutfile = create("boot.bin", 0666)
...
write(fdoutfile, ..., ...);
...
```
group by してからランダムにひとつずつ抽出する、PostgreSQL & MySQL

ある問題を考えているときに、とても学びといいますか気づきがあったので書きます。

(※) パフォーマンスについては、しらべていないので、使用する際は自己責任でお願いします。
(※) 間違っている、もっと良い方法があるなど、ご指摘いただけますと幸いです。



# 問題

```sql
mysql> select * from users;
+----+------+------+
| id | name | team |
+----+------+------+
|  1 | taro |    1 |
|  2 | yuki |    1 |
|  3 | kent |    1 |
|  4 | hoge |    2 |
|  5 | piyo |    2 |
|  6 | fuga |    2 |
|  7 | aaaa |    3 |
|  8 | bbbb |    3 |
+----+------+------+
```

チームからランダムに一人を選出するクエリを教えてください。

クエリを叩くたびに、ランダムに入れ替わるようにお願いします。


```sql:クエリイメージ
hoge=# -- query for random choice.
 id | name | team
----+------+------
  7 | yuki |    1
  9 | hoge |    2
 12 | aaaa |    3
(3 rows)

hoge=# -- query for random choice.
 id | name | team
----+------+------
  6 | taro |    1
  9 | hoge |    2
 12 | aaaa |    3
```

# 解答

PostgreSQL と MySQL では方言の違いがありますので、解答も異なります。

PostgreSQL では、`distinct on` が使えるので、比較的簡単です。

MySQL は難しすぎて、結局 [stackoverflow](http://stackoverflow.com/questions/12725363/group-by-value-rand) さんに教えていただきたました。そして、 **このクエリの書き方に、とても学びがありました。** 

### PostgreSQL

```sql:PostgreSQL解答
hoge=# select distinct on (team) * from users order by team, random();
 id | name | team
----+------+------
  7 | yuki |    1
  9 | hoge |    2
 12 | aaaa |    3
```

`order by` の `team` はなくてもイケそうな気がしますが、無いとだめです。

### MySQL

```mysql:MySQL解答
mysql> select u1.team, (
    ->   select u2.name
    ->   from users u2
    ->   where u2.team = u1.team
    ->   order by rand()
    ->   limit 1
    -> ) as name
    -> from users u1
    -> group by u1.team
    -> ;
+------+------+
| team | name |
+------+------+
|    1 | taro |
|    2 | hoge |
|    3 | aaaa |
+------+------+
```

ちょっと長いので、クエリだけ書いておきます。

```mysql:クエリ
select u1.team, (
  select u2.name
  from users u2
  where u2.team = u1.team
  order by rand()
  limit 1
) as name
from users u1
group by u1.team
;
```

(※) これは PostgreSQL でも動きます。


# 学んだこと

僕がこれまで使ってこなかったことと知らなかったことです。

**いままでつかってこなかったこと**

  - select 句での、相関サブクエリ

**知らなかったこと**

  - select 句で相関サブクエリをすると、`group by` 句で指定していないカラムも取得できる。（相関を持たせるカラムは group 指定しているカラムと一致している必要があります。）

ふつう、下のように

```mysql
mysql> select team, name
    -> from users
    -> group by team
    -> ;
ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'hoge.users.name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
```

group で指定してないカラムを書くと、エラーになります。でも、解答のように相関サブクエリだと通りました。すごいです。

**追記:**
コメントで捕捉説明をいただきました！ご確認ください。:bow:

以上。ありがとうございました。
[Material UI] Select Field の各 MenuItem にカスタムデータ属性をセットする方法

ニッチですが…
いわゆる data-* を設定したい時の方法です。

## dataSet の設定

html に設定するのと同じようにセット。

```
  render() {
    return (
      <div>
        <SelectField
          floatingLabelText="Frequency"
          value={this.state.value}
          onChange={this.handleChange}
        >
          <MenuItem value={1} primaryText="Never" data-v={example} />
          <MenuItem value={2} primaryText="Every Night" data-v={example} />
          <MenuItem value={3} primaryText="Weeknights" data-v={example} />
          <MenuItem value={4} primaryText="Weekends" data-v={example} />
          <MenuItem value={5} primaryText="Weekly" data-v={example} />
        </SelectField>
      </div>
    );
  }
```

## dataSet の取得

取得は event から親要素を辿っていくことになる。

```
  handleChange(event, index, value) {
    const dataSet = event.target.parentElement.parentElement.parentElement.dataset.id != undefined ? event.target.parentElement.parentElement.parentElement.dataset : event.target.parentElement.parentElement.dataset;

    console.log(dataSet.v)
  }
```

### event から dataSet を取得するさいの注意点

option 部分にはこのように padding が設定されており、 padding 部分をクリックされると event で渡される要素が一つ上の要素にズレる。

![Screen Shot 2017-02-22 at 11.15.41.png](https://qiita-image-store.s3.amazonaws.com/0/14517/10447566-0492-7045-ffe7-317eb92bd063.png)
Zynq > BOOT.binの解析 > 0. 関連資料 / Xilinx Tool Formats抜粋

```txt:動作環境
PetaLinux 2014.2
Vivado v2014.2
MicroZed
```

2014年のメモより。

### 関連資料

- [ug585 (日本語版)](http://japan.xilinx.com/support/documentation/user_guides/j_ug585-Zynq-7000-TRM.pdf) – Chapter 6が関係する 
  - 表6-5 : ブートヘッダーのパラメータ
     - 0x04C..0x09C : User Defined (84バイト)
  - 6.1.8 PL Programming Paths
     - JTAG Path / PCAP Path / ICAP Path
         - ICAP Path : Rarely used method to re-configure the PL
  - 6.3.9 Boot Header Search
     - ...**0x584C4E58**...
- [zynq-bootのpython実装](https://github.com/Xilinx/u-boot-xlnx/blob/master/tools/zynq-boot-bin.py) — アドレスの情報が参考になるかも ( image[waddr]=**0x584c4e58** # offset 0x24, XLNX )など
- [XAPP1159](https://www.xilinx.com/support/documentation/application_notes/xapp1159-partial-reconfig-hw-accelerator-zynq-7000.pdf) – PCAPを使ってのPartial Reconfiguration >> Partial ReconfigurationでなくFull Reconfigurationを行いたい
- [XAPP583 > Using a Microprocessor to Configure 7 Series FPGAs via Slave Serial or Slave SelectMAP Mode](https://www.xilinx.com/support/documentation/application_notes/xapp583-fpga-configuration.pdf)
    - ~~endian入替の図~~ Bit-Swapping / Slave Serial / Slave SelectMAP mode
    - Bit-Swappingは.bitと.binの違いではないようだ
- [7 Series FPGAs Configuration](https://www.xilinx.com/support/documentation/application_notes/xapp583-fpga-configuration.pdf)
    - XAPP583に「See **7 Series FPGAs Configuration User Guide** for the details of the bitstream composition.」という記載あり

(補足 2017/02/22)
リンク切れが見られる。
こちらが移行先のようだ。
https://github.com/mathworks/xilinx-uboot/blob/master/tools/zynq-boot-bin.py


### Xilinx Tool Formats

@xapp583 > Table 3: Xilinx Tool Formats

| File Extension | Description |
|:-:|:-:|
| .bit | Binary file containing header information that should not be downloaded to the FPGA |
| .rbt | ASCII file containing a text header and ASCII 1s and 0s |
| .bin | Binary file containing no header information |
| .mcs | ASCII PROM formats containing address as well as checksum information |
| .hex | ASCII PROM format only containing data |
fish + fzf でコマンド履歴を検索

fisherman 等を入れても良いのだが、あまり余計なものを入れたくなかったので。

```lua:~/.config/fish/config.fish
function fish_user_key_bindings
  bind \cr __fzf_history
end

function __fzf_history
  history | fzf-tmux -d40% +s +m --tiebreak=index --query=(commandline -b) \
    > /tmp/fzf
  and commandline (cat /tmp/fzf)
end
```
YYYYMMDD 形式の日付を出す

Ruby の場合は下記の通り。

```.ruby
Date.today.to_s(:number)      # Rails(ActiveSupport)
Date.today.strftime('%Y%m%d') # Ruby
```

シェルの場合は下記の通り。

```.sh
date +%Y%m%d
```


## 参考

http://api.rubyonrails.org/classes/DateTime.html#method-i-to_formatted_s
[Visual Studio Code][Windows] PlantUMLの環境を設定する（シンタックスハイライト+リアルタイムプレビュー）

最近、Atom から Visual Studio Code (以下 VS Codeと表記）に乗り換えたので、PlantUML環境の作成手順をメモしときます。

# 環境作成
## 1. エディタ本体の設定
### 1.1. VS Code をインストールする
公式ページか VS Code をインストールします。

[Visual Studio Code - Code Editing. Redefined](https://code.visualstudio.com/)

## 2. PlantUML環境の準備
※PlantUMLのバイナリは自前で準備する必要はありません（プラグインに同梱されているため）
=> 最新で任意の plantuml.jar を指定する機能が追加されました。

### 2.1. Javaのインストール
PlantUMLはJavaで動くのでランタイムをインストールします。

[java.com: あなたとJava](https://java.com/ja/)

### 2.2. Graphvizのインストール
PlantUMLはGraphvizというモジュールを使用して画像を生成しているため、こちらをインストールします。

[Download. | Graphviz - Graph Visualization Software](http://www.graphviz.org/download/)

Windowsの場合は[こちら](https://graphviz.gitlab.io/_pages/Download/Download_windows.html)からmsiをインストールすればよいです。

```
graphviz-2.38.msi
```

### 2.3. VS Code で PlantUML プラグインをインストール
VS Codeで PlantUML プラグインをインストールします。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/37721/5c6760a8-4289-ef3a-6460-fe12d5813906.png)

[qjebbs/vscode-plantuml: Preview & generate PlantUML diagrams in VSCode](https://github.com/qjebbs/vscode-plantuml)

PlantUMLはいくつかありますが、`jebbs` さんのプラグインがプレビュー機能とハイライト機能の全部入りなのでこれが良いと思います。

インストール後、一度 VS Code を再起動してください。その後、`Alt-D` でプレビュー画面が表示されます。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/37721/e45f4cba-2b11-f65f-6d77-1e059e0216d6.png)

※Atomでのプレビューとの機能比較(2017/02/22時点)
・~~マウスのホイールでの拡縮には未対応（VS Codeの機能として現状実現できないらしい）~~
    => 最新で対応されました。

・~~右クリックメニューからpng等での画像の保存ができない~~
　　~~=> プレビュー画面の画像をエディタの外にドラッグ＆ドロップで画像の保存自体は可能~~
　　=> 機能として画像への出力方法があったため、`2.4.` に追記しました。

### 2.4. 作成したUMLの画像などへのエクスポート

`F1` または `Ctrl + Shift + P` でコマンドパレットを開きます。

`PlantUML: Export Current Diagram` を入力/選択します（補完が効くので全て入力しなくてよいはずです）

![plantex1.png](https://qiita-image-store.s3.amazonaws.com/0/37721/97efe327-2a9f-705d-40d6-d37bea4be20e.png)

出力フォーマットを選べるようになるのでいずれかを選択します。

![plantex2.png](https://qiita-image-store.s3.amazonaws.com/0/37721/cc8ad71b-ee8c-c359-0219-ebe6658166e6.png)

保存後、UMLのファイルが有るディレクトリに `out/<UMLファイル名>/<UML名>.<選択拡張子>` のファイルが出力されているはずです。

# プラグインのコマンド説明

追記: コマンドとメッセージの日本語訳のコントリビュートをしたので現在は日本語化されてます。（訳がおかしかったら教えてください）

| コマンド | 説明 |
|:--|:--|
| Export Current Diagram  | カーソル位置のダイアグラムをエクスポート  |
| Export Current File Diagrams  | ファイル内のダイアグラムをエクスポート  |
| Export Workspace Diagrams  | ワークスペース内のダイアグラムをエクスポート  |
| Preview Current Diagram  | カーソル位置のダイアグラムをプレビュー  |
| Generate URL for Current Diagram  | カーソル位置のダイアグラムからURLを生成  |
| Generate URLs for Current File Diagrams  | ファイル内のダイアグラムからURLを生成  |

# PlantUMLの記述方法
## 1. ダイアグラムファイルの拡張子について
プラグインの仕様として拡張子が以下の場合にダイアグラムとして扱われます。

```
.wsd
.pu
.puml
.plantuml
.iuml
```

また、他の言語のコメントも `@startuml`, `@enduml` の区間はPlantUMLとして扱われ、`Alt+D` でプレビュー表示することが可能です。

## 2. 文法について
### 本家サイトのドキュメント
本家サイトでリファレンスのPDFが配布されていますので、そちらを参照するのがいいかと思います（日本語訳もあります）

PDF : [ダウンロードのページ](http://plantuml.com/download)
HTML: [UML図を描画するための単純なテキスト記述を使用したオープンソースのツール。](http://plantuml.com/)

### その他参考ページ
[PlantUML Cheat Sheet - Qiita](http://qiita.com/ogomr/items/0b5c4de7f38fd1482a48)
[PlantUML の使い方 | プログラマーズ雑記帳](http://yohshiy.blog.fc2.com/blog-entry-152.html)
CentOS7にphp7.1をインストールしたときのメモ

php5.4から7.1に更新するときパッケージ消し忘れてgdgdになったときのメモ

# インストール済みパッケージ一覧の確認

```
# rpm -qa | grep php
> php-mysql-5.4.16-42.el7.x86_64
> php-5.4.16-42.el7.x86_64
> php-pdo-5.4.16-42.el7.x86_64
> php-mbstring-5.4.16-42.el7.x86_64
> php-cli-5.4.16-42.el7.x86_64
> php-common-5.4.16-42.el7.x86_64
```

# パッケージ全部削除

```
# yum erase php-mysql-5.4.16-42.el7.x86_64 php-5.4.16-42.el7.x86_64 php-pdo-5.4.16-42.el7.x86_64 php-mbstring-5.4.16-42.el7.x86_64 php-cli-5.4.16-42.el7.x86_64 php-common-5.4.16-42.el7.x86_64
```

# remiリポジトリの有効化

```
# yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
```

# php7.1のインストール

```
# yum install --enablerepo=remi-php71 php php-cli php-common php-devel php-fpm php-gd php-mbstring php-mysqlnd php-pdo php-pear php-pecl-apcu php-soap php-xml php-xmlrpc
```

# 参考記事
http://qiita.com/pakiln/items/e3351ade2bb5aeb198dc
https://www.skyarch.net/blog/?p=10029
Power BI と Stream Analyticsでストリーム分析

[Announcing General Availability of Power BI Real-Time Streaming Datasets - Power BI Blog](https://powerbi.microsoft.com/en-us/blog/announcing-general-availability-of-power-bi-real-time-streaming-datasets/)

今年の1月にPower BIブログでストリームデータセットがGAされたというアナウンスがありました。もともとリアルタイム系の分析には別の製品を使おうとしていたのですが、PowerBIで手軽にできるならそれはそれでいいだろうと思いまして、やってみました。

というか、以下のビデオに感銘を受けまして、これはやらねばと気になりました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/78ef50dc-97d5-9767-311a-1f3c15e20341.png)

[Power BI and Azure Stream Analytics demo by Amir Netz](https://youtu.be/SGUpT-a99MA)

やばいですね。去年話題になったAdobeのロングヘアエヴァンジェリスト（彼はもともとアーティストのようですが）のパフォーマンスに匹敵するステージパフォーマンスで客をあおる姿にPowerBIの盛り上がりを感じましたww
（というかこれ２年前なんですね。）
詳しくは動画を見てください。英語わからなくても何をやっているかは一目瞭然です。

# Event Hub -> Stream Analytics -> Power BI
この３つをつなぐとリアルタイム監視ダッシュボードがすぐできます。
Stream Analyticsのページに非常に良い教材で、すんなり構築ができました。
[ソーシャル メディア分析: Azure Stream Analytics での Twitter センチメントのリアルタイム分析](https://docs.microsoft.com/ja-jp/azure/stream-analytics/stream-analytics-twitter-sentiment-analysis-trends)

## Event Hub

Event Hubを一つ作ります。コンシューマーグループというものを作成しなければならないようです。デフォルトのものでやろうとしてもうまくいきませんでしたので、素直に作りましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/afaa71e3-71a4-06b5-a117-54ce487fb7f0.png)

上記の解説ページにリンクのあるTwitterから検索結果を取得してEvent Hubになげるプログラムを立ち上げます。準備のためにTwitter APIのキーやEvent Hubの接続文字列などが必要なので、準備します。キーワードなどは好きなもの（日本語でも）を設定ファイルで指定できるので、好きなアイドルの名前でも入れてみましょう。F/Wにひっかかってうまくいかない場合は適切な接続に切り替えるとよいと思います。

## Stream Analytics

上記Event Hubを入力として受け取る、Stream Analyticsジョブを作成します。クエリーなどを書いて、各種加工が可能です。PowerBIに出力することを考えると、あまりここで加工する必要はないと思われるかもしれませんが、現状ストリームデータセットに対するPowerBIクエリーはかけないことになっており、なるべくここで加工しておいたほうが良いです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/ea76351e-ae45-c1f6-9157-e533ad97fc35.png)

入力にイベントハブを、出力にPowerBIをそれぞれ選択して終わりです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/51357466-e7ea-102f-b455-dc275000f175.png)

今回はサンプルそのままのクエリーです。右から左へ受け流しているだけですね。TUMBLINGWINDOWの設定で出力周期を選べますので、ツイートの頻度などから適当に設定します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/96693e14-da97-653f-4330-c9b1f965abbc.png)

## Power BI

上記までのパイプラインを作成してデータを流し込むと、PowerBI側に以下のようなデータセットが作成されます。これで、レポートや、ダッシュボードを作成できます。あとは普通のデータセットと同じですね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/96b5f9b6-a342-0438-253e-d5f08af83100.png)

試しに鉄道関連ツイートの集計してみました。普段は閑散としていますが、○○の時には大変なことになりますね。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/323a9449-f77b-dd4e-c4a1-be0af66dd0dd.png)
シェルスクリプトで、ファイル更新したらコマンド実行する

ファイルの更新を監視し、更新されたらコマンドを実行するスクリプト。

inotifywaitが必要。ubuntuであれば以下でインストール。

```bash:
apt-get install inotify-tools
```

スクリプトは以下。

```myinotify.sh
#!/bin/bash
set -eu

#ファイルの更新を監視し、更新されたらコマンドを実行する。

if [ $# -ne 2 ]; then
    exefile_basename=`basename $0`;
    echo -e "too few argument."
    echo -e "\tusage : ${exefile_basename} (target file or dir) (commmand)"
    echo -e "\t        ${exefile_basename} code.c 'make test'"
    exit 1
fi

repeat_num=0
while true; do
    repeat_num=$((${repeat_num}+1))

    #コマンドエラーが起きても本スクリプトは終了しない。
    eval "$2" && true

    echo; echo "--------------------";
    echo "wait #$repeat_num"
    #隠しファイル(ドットで始まるもの)等は対象外。
    inotifywait -r --exclude '/\.|^\.[^./]' $1
    sleep 0.5
done
```

使い方は以下。

```bash:
myinotify.sh ./code 'make; make test'
```


ディレクトリも対象にしているのでlsしたりしたときにも反応してしまう。
除きたいなら-eで監視するイベントを制限すれば良さそう。
wine A5M2.exe 起動覚書


結構面倒だったので、情報共有  

###試行錯誤  
楽をしたくて、wineパッケージ wineskin, EasyWineを試すが起動せず。結局、素のままwineを使用することにした。  

###install

wineのinstall. 前提homebrewを導入済みであること。  

cask とxquartzのinstall  

```
brew install caskroom/cask/brew-cask
brew cask install xquartz
```

wineのinstall

```
brew install --devel wine
```

###文字化け対策

文字化けするので、フォントをwineに導入（Migu1MとMigu1P）  

```
cp Downloads/migu-1p-20150712/*ttf .wine/drive_c/windows/Fonts/
```

wineにフォントを教える。  
.wine/user.regの最後に以下を追記  

```
[Software\\Wine\\Fonts\\Replacements] 1474815800 0
"MS Gothic"="Migu 1M"
"MS PGothic"="Migu 1M"
"MS Sans Serif"="Migu 1P"
"MS Shell Dlg"="Migu 1M"
"MS UI Gothic"="Migu 1P"
"Tahoma"="Migu 1P"
"\xff2d\xff33 \x30b4\x30b7\x30c3\x30af"="Migu 1M"
"\xff2d\xff33 \xff30\x30b4\x30b7\x30c3\x30af"="Migu 1P"
```

A5M2.exeを起動

```
$wine A5M2.exe &
```


以上
2017.02.21 GMO主催 エンジニアリングマネージャー勉強会


# SmartNewsでの取り組み
大きく分けて下記について話す
- EM（エンジニアリングマネージャー）
- 英語
- 採用

## EMについて
PMとEMを分けましょう、という流れ。

### SmartNewsの現状
日本　　　エンジニア 31/72人
アメリカ　エンジニア 5/13人


### やってること
- PMとロードマップのすり合わせ
- チームのヒューマンマネジメント
- 採用への積極関与

#### これからやりたいこと（smartnewsのエンジニアとは？）
エンジニアバリューの策定（WIP）

## 英語の重要性
組織的に日本語ネイティブではない人がいるので、必然的に英語でやらなくてはいけないことが増えた。
週報（週末に振り返りをやったもの）、ドキュメント（APIとか）、GitHubのやりとりをなるべく英語で。
PJの重要な話も頑張って英語で。

#### 問題点
英語にすると情報量が落ちがち（実感）
Slackでわざわざ-jpを付けた別チャンネルを用意したりしてるらしい。。
聞いているとすごい生産性が悪そうなイメージだった。


## 採用への積極的な関与
コミッティ（EM + PM + HR）発足
エンジニアが人事に積極的に関与していく（まずは採用周り→評価制度まで）

### 不透明な採用
- 面接した人が自分の知らないところで落ちている
- マネージャが面接していないチームに配属される
- 入社日に配属先が決まっていない
- 採用基準が不透明

### 透明な採用へ
- フローの作り直し（書類、面接アサイン、評価入力シートの見直し）
- 面接評価を他の面接官が閲覧可能にする
- 評価基準、選考基準を合わせる

### 採用コミッティ
- フロー改善全般
- 構造化面接（PBI）
- 国による面接基準の差異


# NIFTY IoTでの技術組織改善の取り組み

## 技術組織全体をメンタリングした話
### どうしたら楽しく技術でコミットできるのか
- 技術を活用・獲得してプロジェクト、プロダクトに寄与する
- 当事者意識大事！
- ゴールはあくまで事業、新しい価値を速く出す！

### どうにかした
- キャリアパスを策定、職務章程も現在策定中
- OSS（オープンソースソフトウェア）、R&D（研究開発）とプロジェクト、プロダクトに寄与している人をそれぞれ評価（どちらも大事だよねっていう組織的な見方）。
- スキルの可視化→スキルによる事業戦略
- QCD（Quality,Cost,Delivery）の高いチームに賞を送る（ご褒美あり）

結果、外注していた開発のほとんどを内製化→低総予算、高単価のチーム
運用ゼロを目指すチーム


# ペパポでのEMとは

1ON1、キャリアの相談
技術的課題はコードを書くことで解決へ

### プロダクト面
作業単位で孤立しがち


### チーム面
理想「管理なし」

### 投票思考
どっちに行きたいかを投票で選ぶ行動方針



# ピクシブ初のVP of Engineeringの取り組みとエンジニアリングマネージャ理想像

## VPoE（現場の開発リーダー）やEMをやって？って言われたら？
自分のミッションを定義 ＝ 周りのリレーションを定義

## 考えたこと
- 何が必要？
- 実際頑張ってるじゃん
- 課題もあるよね
- 解決必要？
- 自分何が出来る？

とにかく面談しまくった！

## 面談しまくってわかったこと
- 自分の中での危機意識
- ジョブタイトルのパワー
- 自分の場所は自分で作るしかない

## 力（技術的な）でどうにもならない事を解決していく
- 採用
- 評価制度
- チームビルディング
- ケア
- 育成

ここでいう力というのは力技で問題の解決ができる人（CTOなど）を指す。
EMはチームの力で解決することが求められるようなことを率先してやっていく。

### おすすめ本
- [駆け出しマネジャーの成長論](https://www.amazon.co.jp/dp/4121504933/ref=cm_sw_r_cp_ep_dp_x.oRyb1A3PKWM)
- [HIGH OUTPUT MANAGEMENT](https://www.amazon.co.jp/OUTPUT-MANAGEMENT-%E3%83%8F%E3%82%A4%E3%82%A2%E3%82%A6%E3%83%88%E3%83%97%E3%83%83%E3%83%88-%E3%83%9E%E3%83%8D%E3%82%B8%E3%83%A1%E3%83%B3%E3%83%88-%E4%BA%BA%E3%82%92%E8%82%B2%E3%81%A6-%E6%88%90%E6%9E%9C%E3%82%92%E6%9C%80%E5%A4%A7%E3%81%AB%E3%81%99%E3%82%8B%E3%83%9E%E3%83%8D%E3%82%B8%E3%83%A1%E3%83%B3%E3%83%88/dp/4822255018/ref=sr_1_1?ie=UTF8&qid=1487726770&sr=8-1&keywords=HIGH+OUTPUT)
分数の割り算をひっくり返す話

#算数嫌い
小学生の時、算数は嫌いでした。
「おおまかな数」になおす授業がありました。
"9845を大まかな数になおすといくつになる？"といった感じです。

僕は9800だと答えましたが違いました。
次に9900だと答えましたが違いました。
正解は10000でした。
理由は教えてもらえませんでした。
僕は算数が嫌いになりました

分数の割り算が出てきたとき
分母と分子をひっくり返す理由を誰も教えてくれませんでした
先生もお父さんもお母さんもです。
僕は算数が嫌いになりました

#今だからわかる？分数の割り算
大人になって考えると、結構簡単なものです。
ただ子供に説明するのは難しいのかな？とも思ったので
できるだけ簡単に書いてみます。
Qiitaの数式書く練習もかねて…

#問題
今回はこれでやります。

```math
\frac{1}{2}\div\frac{4}{5}
```

#これまでの解き方
ひっくり返してかけ算する。

```math
\frac{1}{2}\times\frac{5}{4}=\frac{5}{8}
```

どうしてこうなるのか。


#先に全部かいちゃう

```math
\frac{1}{2}\div\frac{4}{5}=\frac{\frac{1}{2}}{\frac{4}{5}}=\frac{\frac{1}{2}\times\frac{5}{4}}{\frac{4}{5}\times\frac{5}{4}}=\frac{\frac{1}{2}\times\frac{5}{4}}{\frac{20}{20}}=\frac{\frac{1}{2}\times\frac{5}{4}}{1}=\frac{1}{2}\times\frac{5}{4}=\frac{5}{8}
```
ここから説明。

#前置き
##わり算？
わり算は記号の左の数の中に記号の右の数がいくつあるか？を表した計算です。
この問題では $ \frac{1}{2} $ の中に $ \frac{4}{5} $ はいくつあるか？ということになります。

##分数だと分かりにくい…
でもこの考え方だと分数ではわかりにくい…
なんか難しそうだし、図にしてもわかるかなぁ

##簡単にします！
昔のかしこい人は考えました。
簡単に計算するためにどうしたらいいか。

#説明
##分数はわり算？
そもそも分数はわり算のことなのです
$ \frac{1}{2} $ は $ 1 \div 2 $ とおなじ
$ \frac{45}{78} $ は $ 45 \div 78 $ とおなじ

##いちばん簡単なわり算はなんだろう
できるだけ頭を使わず、式も簡単になるわり算は…


記号の右側が「1」、分数にしたとき分母が「1」になるわり算だ！
$ 123 \div 1 = 123 $
$ 456 \div 1 = 456 $
記号の左がそのまま答えになる！簡単！

##分数のわり算もこうできれば…でもどうやって？
かしこい人は考えました。
「そうだ！通分を使おう！」
分数の足し算引き算ではよく使いました。通分です。
分母をあわせるために、分母分子に同じ数をかけるアレです。

```math
\frac{1}{2}+\frac{2}{3} = \frac{1\times3}{2\times3}+\frac{2\times2}{3\times2} = \frac{3}{6}+\frac{4}{6}=\frac{7}{6}
```
こんなやつ。
これは
「分母と分子に同じ数をかけても答えは変わりませんよ」
ってことです。

通分を使ってどうするのか？
ここでさっきの話、「いちばん簡単なわり算」がでてきます。
そう、記号の右側が1になるわり算のことです。

##でも分数はどうやって1にするの？
普通の割り算では記号の左と右が同じ数なら、答えは必ず1になります
$ 5 \div 5 = 1 $
こんな風に…！
もちろん分数でも同じです。

##やってみよう
このままだとちょっと通分っぽくないので

```math
\frac{1}{2}\div\frac{4}{5}
```
こうします。

```math
\frac{\frac{1}{2}}{\frac{4}{5}}
```
わかるかな？$ \frac{1}{2} $が分子、$ \frac{4}{5} $が分母です。

この状態で分母を1にするためには何をかけたらいいか。
だいぶ近づいてきましたね。
そう、分母の$ \frac{4}{5} $をひっくり返した$ \frac{5}{4} $をかけるんですね。

```math
\frac{\frac{1}{2}\times\frac{5}{4}}{\frac{4}{5}\times\frac{5}{4}}
```
分母だけ計算するとこうなります

```math
\frac{\frac{1}{2}\times\frac{5}{4}}{\frac{20}{20}}
```
$ 20 \div 20 = 1 $ なので 

```math
\frac{\frac{1}{2}\times\frac{5}{4}}{1}
```
こうなって…

分母が1、つまりわり算の記号の右側が1の時、答えは左側(分子)
の数とおなじなので

```math
\frac{1}{2}\times\frac{5}{4} \div 1 = \frac{1}{2}\times\frac{5}{4}
```
こうなりました。

だいぶ長くなったけど、これで「ひっくり返してかけ算」するときとおなじになりました。



これで算数嫌いが減るといいなぁ
MySQLで英数字_以外を含むDBをDROPする時はバッククォートで囲む


Railsのアプリケーション名をtest-projectとかにして、`rails db:create`とかしてると、`test-project_development` みたいなDBが大量にできている。

毎プロジェクト、用済みになった時に`rails db:drop`していれば問題ないのだが、忘れたままrenameしたりして、どんどん溜まっていき、可視性が悪くなったので、localのMySQLの整備をしようとした。


```sql:mysql
DROP DATABASE test-project_development;

ERROR 1064 (42000): 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 '-project_development' at line 1
```

失敗した👻
ハイフンが使えないのを忘れていた。
英数字_以外を含むDB名の時はバッククォートで囲む。

```sql:mysql
DROP DATABASE `test-project_development`;

Query OK, 3 rows affected (0.06 sec)
```

めでたし🎉
DelphiでiOS/AndroidのOSバージョンや機種名、言語設定を取得するために、各プラットフォームのネイティブな機能を使う

Delphiで作ったスマホアプリで、iOS/Androidのバージョンやデバイス名を確認する方法を調べてみたら、プラットフォーム依存の箇所があって意外に手間取ったのでメモしておく。

## 実装例

以下の実装例では FMX のデフォルトのフォーム名 (TForm1) を用いている。

```Delphi
unit uOSVersionAndLocale;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
  FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo, FMX.Platform
{$IFDEF Android}
  ,Androidapi.JNI.Os
  ,Androidapi.Helpers
{$ENDIF}
{$IFDEF IOS}
  ,iOSapi.UIKit
  ,Posix.SysSysctl
  ,Posix.StdDef
{$ENDIF}
  ;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    ToolBar1: TToolBar;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
{$IFDEF IOS}
    function GetDeviceModelString: String;
{$ENDIF}
    { private 宣言 }
  public
    { public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

{$IFDEF IOS}
function TForm1.GetDeviceModelString: String;
var
  Size: size_t;
  DeviceModelBuffer: array of Byte;
begin
  sysctlbyname('hw.machine', nil, @Size, nil, 0);

  if Size > 0 then
  begin
    SetLength(DeviceModelBuffer, Size);
    sysctlbyname('hw.machine', @DeviceModelBuffer[0], @Size, nil, 0);
    Result := UTF8ToString(MarshaledAString(DeviceModelBuffer));
  end
  else
    Result := EmptyStr;
end;
{$ENDIF}


procedure TForm1.Button1Click(Sender: TObject);
var
  OSVersion: TOSVersion;
  OSLang: String;
  LocaleService: IFMXLocaleService;

  ModelName: String;
begin
  ModelName := 'unknown';
{$IFDEF Android}
  ModelName := JStringToString(TJBuild.JavaClass.MODEL);
{$ENDIF}
{$IFDEF IOS}
  ModelName := GetDeviceModelString;
{$ENDIF}

  Memo1.Lines.Add(Format('ModelName=%s', [ ModelName ] ));
  Memo1.Lines.Add(Format('OSName=%s', [OSVersion.Name]));
  Memo1.Lines.Add(Format('Platform=%d', [Ord(OSVersion.Platform)]));
  Memo1.Lines.Add(Format('Version=%d.%d', [OSVersion.Major,OSVersion.Minor]));

  OSLang := '';
  if TPlatformServices.Current.SupportsPlatformService(IFMXLocaleService, IInterface(LocaleService)) then
  begin
    OSLang := LocaleService.GetCurrentLangID();

    // Android は日本語環境で Locale = jp を返すので、これを ja に付け替える
    if (OSLang = 'jp') then OSLang := 'ja';
  end;
  Memo1.Lines.Add(Format('Lang=%s', [ OSLang ] ));

end;

end.
```


## 参考にしたページなど
条件付きコンパイル（Delphi）
http://docwiki.embarcadero.com/RADStudio/Seattle/ja/%E6%9D%A1%E4%BB%B6%E4%BB%98%E3%81%8D%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%EF%BC%88Delphi%EF%BC%89

Delphi XE7でOSのプラットフォームとバージョンを取得するには
http://www.gesource.jp/weblog/?p=6895

現在のロケール（en、 fr、ja など）を取得するには
http://www.gesource.jp/weblog/?p=7121

Delphi XE5でAndroidのシステム情報を取得する
http://www.gesource.jp/weblog/?p=6314

How to get the iOS device model?
https://plus.google.com/112344597455394727345/posts/ToHHsAh6XoW
Markdown > Link > csvからの変換ツール

Sublime TextにてcsvからMarkdown形式に変換する処理を試してみたことがある。
http://qiita.com/7of9/items/778393721d6902293c5e

[今日見た記事](http://qiita.com/gooddoog/items/f28c55996a8f6ea979de#%E7%B5%90%E8%AB%96%E3%81%93%E3%81%AE%E3%82%B5%E3%82%A4%E3%83%88%E3%82%92%E4%BD%BF%E3%81%84%E3%81%BE%E3%81%97%E3%82%87%E3%81%86)にて、同じ変換処理に対する良いオンラインツールが紹介されていた。
Tab区切り、コンマ区切り、セミコロン区切りが使える点が良いです。
【QuickSight】SPICEのスケジュールリフレッシュ

[QuickSight](https://quicksight.aws/)のSPICEを自動でリフレッシュする機能が搭載されたようなので、試してみました。

[[Amazon Web Services ブログ]SPICEデータのスケジュールリフレッシュがAmazon QuickSightに追加されました](https://aws.amazon.com/jp/blogs/news/scheduled-refresh-for-spice-data-sets-on-amazon-quicksight/)

* QuickSight にログインします<BR><BR>
* ［Manage data]をクリック
<img width="1272" alt="スクリーンショット_2017-02-22_9_39_14.png" src="https://qiita-image-store.s3.amazonaws.com/0/30557/855a32d4-0ef7-9e89-41fb-c9830f81b28d.png"><BR><BR>
* 設定したいData Setを選択
<img width="1087" alt="スクリーンショット_2017-02-22_9_41_18.png" src="https://qiita-image-store.s3.amazonaws.com/0/30557/4f27549a-78c9-f9fa-4fea-869524c5da52.png"><BR><BR>
* 新たに「Schedule Refresh」ボタンが表示されているのでクリック
<img width="598" alt="スクリーンショット_2017-02-22_9_42_19.png" src="https://qiita-image-store.s3.amazonaws.com/0/30557/a5bd130a-bd1e-0ea9-e1b1-d101ffb26b2a.png"><BR><BR>
* スケジュールリフレッシュが設定されていない場合はこのようなメッセージが表示されるので、「Create」をクリック
<img width="598" alt="スクリーンショット_2017-02-22_9_45_23.png" src="https://qiita-image-store.s3.amazonaws.com/0/30557/ba370974-90e6-240b-9514-7173f33d2300.png"><BR><BR>
* 実行時刻を入力して「Create」をクリック
<img width="647" alt="スクリーンショット_2017-02-22_9_46_49.png" src="https://qiita-image-store.s3.amazonaws.com/0/30557/d2e46965-fa8d-54e2-e663-16fb332dade5.png">
* この画面が表示されたら設定は完了されているので「Cancel」で戻ります
<img width="594" alt="スクリーンショット_2017-02-22_9_50_48.png" src="https://qiita-image-store.s3.amazonaws.com/0/30557/dbb42e28-11dd-05ce-0d22-0918cb2b46be.png">

「Repeats」は**Dayily**/**Weekely**/**Monthly**からの選択となるので、最短で1日1回のリフレッシュとなります。
Basic Operators - Assignment Operator


*代入演算子 Assignment operator, (a = b)* は初期化、もしくは a の値を b に変更する機能を持つ。

```swift
let b = 10
var a = 5
a = b
// a の値は 現在 10
```

もし代入演算子の右側が複数の値を持つ [タプル](http://qiita.com/divisionbox/items/2d7bcfad03e7ebc10bc4) だった場合、その値をそれぞれ定数・変数に割り当てられる。

```swift
let (x, y) = (1, 2)
// x の値は 1 に、 y の値は 2 になる。
```

Swift の代入演算子は値を返さない。そのため、if文で2つの値が同じであることを条件としたい場合、下記はエラーとなる。

```swift
if x = y {
     // x = y は値を返さないのでエラーになる。正しくは x == y であるべき。
}
```
Bourne Shell から Bash への移行ガイド

Bash (/bin/bash) にはあるけど、Bourne Shell (/bin/sh) にない便利な機能。

## \[\[ \]\]

\[ \] をより使いやすくする


- **エラーフリー** :  `[[ "" == "abc" ]]` _/ * 空白文字を比較してもエラーにならない */_
- **AND, OR** :  `&&` `||` _/* `-a` `-o` の置き換え */_
- **正規表現** : `[[ <文字列> =~ <正規表現> ]]`
  - <正規表現> を `'` や `"` で囲む必要はない
  - `BASH_REMATCH[1]` などで後方参照が可能


## (( ))

if文の数値比較条件式

- **変数** : `if (( x ))` _/* 0: False, default: True */_
- **同値比較** : `if (( x == x ))`  `if (( x != y ))`
- **大小比較** : `if (( XXX > x ))` `if (( x < XXX ))` `if (( X >= x ))` `if (( x <= X ))`
- **AND,OR,NOT** : `if (( x && y ))`, `if (( x || y ))`, `if (( ! x ))`

for文の条件式

- **繰り返し** : `for (( x=0 ; x<10 ; x++ ))`


## 変数宣言

- **数値** : `declare -i num=1+2`
- **配列** : `declare -a array=(Zero One Two)`
- **連想配列** : `declare -A assoc=([Jan]=1 [Feb]=2 [Mar]=3)`
- **定数** : `declare -r RO="Read-Only"`
- **環境変数** : `declare -x JAVA_HOME="/usr/local/java"`


## 配列

- **宣言** : `declare -a array=(Zero One Two)`
- **リスト** : `${array[@]}` _/* Zero One Two */_
- **リスト（逆順）** : `${!array[@]}` _/* Two One Zero */_
- **要素数** : `${#array[@]}` _/* 3 */_
- **先頭要素** : `${array[0]}` _/* Zero */_
- **追加（先頭）** : `array=(elem "${array[@]}")`
- **追加（最後）** : `array=("${array[@]}" elem)`
- **削除** : `unset array[1]` _/* Zero "" Two */_


## 連想配列

- **宣言** : `declare -A assoc=([Jan]=1 [Feb]=2 [Mar]=3)`
- **キーリスト** : `${assoc[*]}` _/* Jan Feb Mar (順序未定) */_


## () : サブシェル

サブシェルによるコマンド呼出し。`;`で区切って複数のコマンドを呼び出すことが可能。
サブシェルなので環境変数を設定しても、もとのシェルの環境変数は汚さない。

```bash
$ (export HEHE="hello, world"; echo $HEHE)
hello, world
$ echo $HEHE

$
```


## $( )

\` \`によるコマンド呼出しをより使い易くする

- **入れ子** : `$(echo $(ls))`

## <( ), >( ) : プロセス置換

プロセス置換。引数で、標準出力とか標準入力を指定できないコマンドを無理やりパイプみたいに繋げたい、という時。( )内は非同期実行のコマンドで置き換えられる。

- **<( ) : (標準出力) ⇒ 入力ファイル** : `cp <(ls) ls.txt`
- **>( ) : 出力ファイル ⇒ (標準入力)** : `cp ls.txt >(wc -l)`


## 参照渡し

`${!var-name}`とすれば、`${var-name}`に（値じゃなく）変数が
入っている場合に、その参照している値を取り出す。
配列を関数の引数にしたりできる。

```bash
function echo_array() {
   local array=(${!1})    # 配列を引数として受け取る
   echo ${array[@]}
}

declare -a var=("Zero" "One" "Two")
echo_array var[@]         # 配列を引数として関数を呼び出す
```


## trap

シグナルを受けた時の動作に加え、こんな時にもコマンドを起動できる。

- **EXIT** : シェルが終った時に起動する。
- **DEBUG** : 全てのコマンドの前に起動する。
- **ERR** : コマンドがエラーを返したら起動する。


## 整数リスト {1..10}

整数値のリストを簡単に作成できる。

- **{1..10}** : 1 2 3 4 5 6 7 8 9 10
- **{-2..2}** : -2 -1 0 1 2
- **{0..5} {10..15}** : 0 1 2 3 4 5 10 11 12 13 14 15


## プロンプト PS1

環境変数 `PS1` の文字列を評価してくれる。`$( )`によるコマンド呼出しも受け付けてくれる。
`$` の前に `\` でエスケープしておかないと最初の一回しか評価してくれないので注意。

- **現在時刻の表示** : `PS1="\[\e[30m\e[47m\]\W(\$(date +%H:%M))\$\[\e[0m\] "`
- **GIT ブランチの表示** : `PS1="\[\e[30m\e[47m\]\W[\$(git rev-parse --abbrev-ref HEAD 2> /dev/null || echo -)]$\[\e[0m\] "`
CoreOS で git add -p する

CoreOS 上で `git add -p` しようとしても、Perl が入ってないためこうなっちゃってつらい。

```
$ git add -p README.md
fatal: git was built without support for git-add--interactive (NO_PERL=YesPlease).
```

ので、`git add -p` ができるコンテナを作ってホスト上でも `git add -p` できるようにするラッパーコマンドを作ってみた。

```
#!/bin/bash
# Usage: ./gitaddp.sh file1 file2 file3
cat <<EOF > Dockerfile.gitaddp
FROM ubuntu
RUN apt-get update && apt-get install -y git vim
EOF
docker build -t gitaddp -f Dockerfile.gitaddp .
docker run -e EDITOR=vi --rm -ti -v $(pwd):/work --workdir /work gitaddp git add -p $@
#docker run --rm -ti gitaddp bash
rm Dockerfile.gitaddp
```

(alpine で apk add git しても git add -p できないようだったので ubuntu イメージを使用するようにした。)

こんな感じで普通にホスト上で `git add -p` が使えるようになって便利。

```
$ ./gitaddp.sh README.md            
Sending build context to Docker daemon 54.78 kB
Step 1 : FROM ubuntu
 ---> f49eec89601e
Step 2 : RUN apt-get update && apt-get install -y git
 ---> Using cache
 ---> 679f25d5ccf0
Successfully built 679f25d5ccf0
diff --git a/README.md b/README.md
index 3b18e51..7d9977a 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,2 @@
 hello world
+hello world 2
Stage this hunk [y,n,q,a,d,/,e,?]?
```

e を押すと vim で編集もできる。

docker コンテナでなんでもやろうとするのおもしろい。
Cognos SSO認証でCookieを使用するサンプル

##概要
Cognos BI&AnalyticsでのSSO認証と言えば、基本的にHTTP HeaderのREMOTE_USERなどの変数にユーザーIDを仕込み、LDAPネームスペースの外部IDマッピングで受け取る方法だと思います。
しかしながら環境によっては、Cookieの中にユーザーID情報を含めるので、これでCognosのSSO認証をやって欲しいという要件が出てくる事があります。認証ソースはLDAPです。

このような場合に、再利用しやすいカスタム認証プロバイダーのサンプルがCognos SDKで提供されているのですが、ご存知無い方も多いので、紹介しておきます。
関係ない方もちらっと読んでおいて頂いて、「Cookieで認証」という場面に遭遇したら、是非この記事を思い出してください。

##実装方法
Cognos SDKを導入すると、以下のフォルダにTrustedSignonSampleという、カスタム認証のサンプルが導入されます。
C:\Program Files\IBM\cognos\c10_64\sdk\java\AuthenticationProvider\TrustedSignonSample

中身はこんな構成です。
赤枠の「TrustedSignonSample.java」がカスタマイズの範囲です。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/47b6094b-1625-046c-f452-82401a1f6e24.png)

前提として、LDAPの認証を行うためのネームスペースがCognos Configurationで構成されていて、外部IDマッピングが指定されている事が必要です。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/928540e4-f21e-590c-1933-89320549fcbe.png)

「TrustedSignonSample.java」を開きます。
先のCognosConfigurationのLDAPのネームスペースの内容に合わせて、赤枠のsetNamespaceID、TrustedEnvVarを変更します。
また、getCookieValueにCookieの名称を指定します。
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/79dad384-6413-1fb1-a9f5-74ffdf87b548.png)

同フォルダのbuild.batを実行すると、CAM_AAA_TrustedSignonSample.jar が作成されるので、\<CognosInstallPath>/webapps/p2pd/WEB-INF/lib にコピーします。

カスタム認証のネームスペースを、以下のように作成します。
Javaクラス名は、TrustedSignonSample となります。
※Cognos Configurationを立ち上げるのは、Jarファイルをコピーした後になります。
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/47086cd0-e19e-18dc-66cf-72806d0c7709.png)

ゲートウェイ・ネームスペースにカスタム認証のネームスペースを指定します。
![006.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/8297f484-1be0-22cb-79f4-81de893afabd.png)

Cognos Configurationで、Cognosサービスを再起動します。

以上ですが、以下の「SetCookie.htm」はテスト用のサンプルとして使えます。
![007.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/c687e55d-5c2c-a946-900b-777193bae76a.png)

Cookie名称と値（ユーザーID）を指定して、<CognosInstallPath>/webcontent に配置してください。
![008.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/7046d711-0e84-205e-05da-f04f7fe37c4d.png)

http://\<hostname>/ibmcognos/setCookie.htm でアクセスして、Cookieを飛ばしてみて、CognosにSSOできるかテストを行う事ができます。
数学系のリンクや細かいメモ

数学を勉強していると記号やら理論やら色々出てくるので、それをまとめておくためのたんなるメモです。（なので随時更新予定）


## 過去に書いた記事

- [[数学] LU分解法をプログラムで書いてみた](http://qiita.com/edo_m18/items/1d67532bed4a083cddb3)
- [任意の数以上の最小の2のべき乗を求める](http://qiita.com/edo_m18/items/99087f5240f044e0622f)
- [[数学][JS] 最小二乗法を使ってトレンドラインを計算する](http://qiita.com/edo_m18/items/49015310b4135e379a80)
- [[数学] 3D空間にベジェ曲線を描く](http://qiita.com/edo_m18/items/643512f27c2b083b47ac)
- [[数学] テイラー展開や球面調和関数についてメモ](http://qiita.com/edo_m18/items/b5058581555a9823b8d6)
- [3次スプライン曲線の生成](http://qiita.com/edo_m18/items/f2f0c6bf9032b0ec12d4)
- [自然対数](http://qiita.com/edo_m18/items/687416c61863b4e690c7)
- [[Unity] 任意の無限遠の平面とベクトルとの交点を求める](http://qiita.com/edo_m18/items/c8808f318f5abfa8af1e)



## 記号

| 記号（大文字） | 記号（小文字） | 読み | 意味 |
|:----|:----|:-----|:----|
| Ρ | $\rho$ | ロー | 半径、密度 |
| $\Sigma$ | $\sigma$ | シグマ | 応力、標準偏差、数の和*（大文字）* |
| Τ | $\tau$ | タウ | 時定数、時間、トルク |
| $\Phi$ | $\phi$ | ファイ | 角度、関数、直径 |
| $\Psi$ | $\psi$ | プサイ | 角度、関係 |
| $\Xi$ | $\xi$ | クサイ | 変数 |
| M | $\mu$ | ミュー | 摩擦係数、$10^{-6}$（マイクロ） |
| N | $\nu$ | ニュー | 振動数 |

## Math関数の実装メモ

```js:frac
function frac(a)
{
    return a - ~~(a);
}
```

```js:mod
function mod(a, b)
{
    return frac(a / b) * b;
}
```

```js:smoothMin
function smoothMin(a, b, k)
{
    var h = Math.exp(-k * a) + Math.exp(-k * b);
    return -Math.log(h) / k;
}
```

**SmoothMin**のグラフ↓
https://www.desmos.com/calculator/plezbtedio
PreviewTextInputのポイント 

ぶっちゃけ, WPF (というかUWP) で text box の入力検証は「入力完了時」に ValidationRules 使ってエラー表示してやるのが筋だと思うんだが。
MFC や Windows.Form に慣れた人々 (だいたいは社内) は「数値以外入力できないようにして！」とぶーぶー言う。
じゃあ WPF で「入力できないようにする」方法はとgoogle検索すると出てくる解決策が text box の PreviewTextInput で e.Handled = true する方法。

ざっと数サイト見た感じ, このサンプルコードがバグっているので, どういうロジックを実装すべきかを備忘的に書いておく。

1. 入力された文字 (<code>e.Text</code>) をチェックする。←これはどこでも書いてある
1. 既存の文字と組み合わせてチェックする。←ここが無かったりバグってたり。
    1. <code>TextBox.Text + e.Text</code> は ダメ絶対
    1. TextBox で選択されている文字列 (<code>TextBox.SelectedText</code>) があれば, これを消して, そこに <code>e.Text</code> を入れた文字列を作る (<code>string.Replace(TextBox.SelectedText, e.Text)</code> でいけそう)
    1. TextBox で文字が選択されていなければ, 現在のキャレット位置に <code>e.Text</code> を挿入した文字列を作る (<code>string.Insert(TextBox.CaretIndex, e.Text)</code> でいける)

作った文字列の検証は <code>double.TryParse</code> 等お好きなので良い。

さらに注意が必要なのがマイナス値や小数点を許容する場合,
↑の既存文字と組み合わせて作った文字列 が "-" だけだったり "."  だけだったりしたら許容する
のを忘れないこと。

あと ".123" を "0.123" にする処理や, ".123" を "0.12" に丸める処理やらは PreviewTextInput じゃなくて Binding先でやろう。".123" の 真ん中の "2" を消したいユーザもいるんだから。




クリップボードからのペースト (PreviewTextInput は呼ばれない) の処理もお忘れ無く。
Laravelで自作コマンドを作るときのTips


# はじめに
最近LaravelでartisanのCommand作ってパッケージ化するというようなことがあったのでその際に得たTipsをまとめて見たいと思います。

# 継承元
今回は`make:controller`のように新しくファイルを作成するようなコマンドを作りたかったので`Illuminate/Console/GeneratorCommand`を継承して作りました。

`GeneratorCommand`はディレクトリ生成したり、ファイルの存在判定のメソッドが定義されていたりするのでここを継承すると楽にファイル操作関連のコマンドを作れます。

# テンプレート
ファイル生成するときはテンプレートがあると楽です。
`make:controller`などであれば`Illuminate/Routing/Console/stubs`以下にあるstubでコントローラーファイルの雛形を用意しておき、コマンド実行時にNamespaceやClassを`str_replace`で置き換えるみたいなことをやっています。
自作するときも生成したいファイルの雛形作っておけばある程度自由度高くできるので使いやすいなと思いました。

# ServiceProvider
普通にlaravelでコマンド作るときは`app/Console/Kernel`に追加しておけば勝手に登録してくれますがパッケージ化したい場合などはServiceProviderで登録するのがいいかと思います。

registerメソッドでこんな感じで登録します。

```php
/**
 * Register the application services.
 *
 * @return void
 */
public function register()
{
    $this->registerMakeHogeCommand();
}

/**
 * Register the make:hoge Command
 */
private function registerMakeHogeCommand()
{
    $this->app->singleton('command.make.hoge', function ($app) {
        return new MakeHogeCommand();
    });

    $this->commands('command.make.hoge');
}
```



`Illuminate/Foundation/Providers/ArtisanServiceProvider`とか見るとわかりやすいと思います。

# 設定ファイル
これは別にコマンドに限った話ではありませんがパッケージの設定ファイルだけlaravelのconfigに組み込みたいときはServiceProviderにこんな感じで書いて、

```php
/**
 * Bootstrap the application services.
 *
 * @return void
 */
public function boot()
{
    $this->publishes([
        __DIR__.'/config_path/make_hoge_config.php' => config_path('make_hoge_config.php'),
    ]);
}
```  


`php artisan vendor:publish`コマンドをたたいて貰えればlaravleのconfigに組み込めます。

# オプション
コマンドのオプションですがコマンドのsignatureプロパティに`{--option=default}`を付け足したりして指定できます。参考→https://readouble.com/laravel/5.3/ja/artisan.html
ショートカットで使いたい場合は`{--o|option=default}`で、単にオプションの指定があったかどうかboolで受け取りたい場合は`{--o|option}`みたいな感じです。
入力を配列で受け取りたい場合は`{--o|option=*}`で`php artisan -o option1 -o option2 command`みたいな感じで受け取れます。
他のパッケージのコードとか見てると`php artisan -o option1,option2 command`
で受け取って`,`でexplodeするみたいなやり方をしてるものもありました。


# まとめ
というわけで紹介みたいになってしまいましたがこんな感じです。
既存のコマンドとか見ると参考になると思います。
SQLAlchemyで多態的継承と多対多を組み合わせる

#背景
似た構成のテーブルがあり、多態性＝ポリモーフィズムを活用してDRYな構成にした。その各テーブルから同一の別テーブルに多対多のリレーションシップを持つ必要が出てきた。

#おさらい1
SQLAlchemyではテーブル構成により三種類のポリモーフィズムを利用できる。一つの基底クラスと二つの派生クラスがある場合を想定したテーブル数も記す。

- Single Table Inheritance(単一テーブル継承) 派生するテーブルを全て一枚のテーブルに収める。テーブル数は1。
- Joint Table Inheritance(結合テーブル継承と訳す？) 基底テーブルと派生テーブルが別になる。テーブル数は3。
- Concrete Table Inheritance(個別テーブル継承と訳す？)基底クラスをテーブルに持たず、派生クラスを各テーブルに持つ。テーブル数は2。

外部のデータベース等の関係で、今回はConcrete Table Inheritanceを採用した。

#おさらい2
SQLAlchemyでは多対多を中間テーブルを意識せずに扱える。
公式マニュアルにあるサンプルを引用。ブログ記事が複数のキーワードを持つパターン。

`post.keywords.append(Keyword('wendy'))`

#で、どうやる

似た構成のフォームがそれぞれ複数のタグを持つ場合を想定。テーブルとしてはタグ・各フォーム×2、中間テーブルの4つとなる。


```python

# -*- coding: utf-8 -*-
from sqlalchemy import *
from sqlalchemy.ext.declarative import *
from sqlalchemy.orm import *
from sqlalchemy_utils import *

base = declarative_base()

#中間テーブルはクラスにしなくて良い。
assoc = Table('assoc', base.metadata,
  Column('aform_id', Integer, ForeignKey('AForm.id')),
  Column('bform_id', Integer, ForeignKey('BForm.id')),
  Column('tag_id', Integer, ForeignKey('Tag.id'))
)

class Tag(base):
  __tablename__ = 'Tag'
  id = Column(Integer, primary_key = True)
  name = Column(String)
  #直接使わなくともこの定義がないとエラーになる。
  #backrefを指定する事で対向の[AB]Formのrelationship定義を省略出来る。
  aform = relationship('AForm', secondary = assoc, backref = 'atag')
  bform = relationship('BForm', secondary = assoc, backref = 'btag')

class Form(AbstractConcreteBase, base):
  id = Column(Integer, primary_key = True)
  amount = Column(Integer)

  @declared_attr
  def __tablename__(cls):
    return cls.__name__
  
  @declared_attr
  def __mapper_args__(cls):
    return {
      'polymorphic_identity': cls.__name__,
      'concrete':True
  }

  
class AForm(Form, base):
  pass

class BForm(Form, base):
  b_only = Column(String(10))


db_uri = 'sqlite:////tmp/m2m.sqlite'
engine = create_engine(db_uri, echo =True)

if database_exists(engine.url):
  drop_database(db_uri)
  create_database(engine.url)
base.metadata.create_all(bind = engine)

Session = sessionmaker(bind = engine)
session = Session()

#AFormにはatag、BFormにはbtagを定義しているので、呼び分ける必要がある。
a = AForm(amount = 100)
atag = Tag(name = 'booked')
a.atag.append(atag)
session.add(a)

f = BForm(amount = 200)
tag = Tag(name = 'canceled')
f.btag.append(tag)
session.add(f)
session.commit()

#以下で動的に呼び分けることも可能。
getattr(btag, f.__class__.__name__.lower()).append(f)

forms=session.query(AForm).all()
for f in forms:
  print(f)
  print(f.atag[0].name)
```

確かに中間テーブルを意識せずに操作はできているが、AFormにはatag、BFormにはbtagを定義しているので、呼び分ける必要がある。但しgetattrを利用して、オブジェクトのクラス名からメソッドの参照を生成し、メソッドチェーンに参加させる事は可能。

```python:再掲
getattr(tag, b.__class__.__name__.lower()).append(b)

```

分かりにくい！こう書けばええやん、という意見もあるだろう。コーディングの流儀と、派生クラスの数に依るだろう。

```python
if isinstance(f, AForm):
  tag.aform.append(f)
```
技術英語 > [Whatever you call it], its effect lasts only to the end of the line on which it appears.

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 1925 / 12833)

> The `#` character has many names: hash, sharp, pound, or the sinister-sounding octophorpe. **Whatever you call it**, its effect lasts only to the end of the line on which it appears.

意訳「`#`の呼び方は色々ある。どのように呼ぼうとも、その効果はそれ(#)が表れた行の最後尾までしか続かない」