OmniAICreator/Qiita-1.07M huggingface dataset:
Emacs の標準 Buffer-menu をカラー化

# Buffer-menu をカラー化
今では多機能で色もついたバッファメニューがはじめからいくつか附属していますが、自分は未だに慣れているこれで、[Emacs Wiki にあるカラー化のパッチ](https://www.emacswiki.org/emacs/BufferMenuHighlighting)を使って愛用していました。
でも Emacs 23 (もしくは 24) で使えなくなってしまったので、それをベースに自分で作ってみました。

![画像サンプル](https://i.imgur.com/a23QHV0.png)

# ダウンロード
[こちらからどうぞ。](https://gist.github.com/s-fubuki/551f1ba58dc4bd202665a19d588ca40e)

# インストール

buffer-menu-color.el を load-path の通ったディレクトリに置きinit.el に以下の行を追加する。

```emacs-lisp:sample
(require 'buffer-menu-color)
```

`list-buffers` にリマップしてあるので、通常 `C-x C-b` で起動するようになります。
実体は同じものなので `list-buffers` でも色がつきます。
同様に `electric-buffer-list` でも色が付きますが、こちらは使っていないので問題が出るかどうかは不明です。

`,` でソートのトグル、 `tab`, `S-tab`, `S-SPC` 等のカーソル移動も追加してあります。

# カラーの変更
以下の設定だと dired 行が purple になります。 色名は `M-x list-colors-display` で判ります。
`(require 'buffer-menu-color)` よりも後に書いてくだい。

```emacs-lisp:sample
(set-face-foreground 'buff-menu-dired-face "purple")
```

# 対象の Emacs

> "GNU Emacs 25.3.1 (i686-w64-mingw32)
>  of 2017-09-18"

# Bug-Fix

- [トグルのバグ修正とダイクトジャンプの追加](https://qiita.com/s-fubuki/items/93ab797b6a05d797a116)(Sat Mar 31 09:48:55 2018)
- マウスでバッファ選択ができなくなっていたのを修正しました。(Mon Mar  5 11:28:14 2018)
Tinkercad > Download > レーザカット用にダウンロード > .SVGファイル | カットしてもらった

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
```

ブラウザ動作するAutoDeskのTinkercad。

### レーザカット用にダウンロード

デザインのメニューにおいて「Download」を選択すると「レーザーカット用にダウンロード」という表記がある。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/0cf089da-2b4c-4da3-7b21-488ac1faeab9.png)

> 2D ファイルにはレーザーカッターに最適な作業平面上のモデル断面が含まれています。

https://www.tinkercad.com/things/6UxzV4grw6q
のデザインに対してSVGファイルをダウンロードしてみた。

Ubuntuにて、Inkscapeを使ってSVGファイルを見てみた。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/40d11e08-2565-06e8-30dd-ac14ba6a0e21.png)
高さ方向をz軸とすると、z=0の断面をSVGファイルとするようだ。

### 利用案1

1. 2D画像からDelaunay triangulationを行う
2. STLファイルとして保存する
 - またはvert()とtri()の定義にしてmain.jsで実行できる形にする
 - [Tinkercad > Shape Generator > Icosahedron > vert()とtri()で形状定義](https://qiita.com/7of9/items/aeb42205f7c3ed90822a)
3. Tinkercadにインポートする
4. razorカット用にSVGファイルでダウンロードする
5. 近所の店に依頼する

手順1を行う技術は今のところ持っていない。
triangulationするとレーザーカットでばらばらになるのだろうか。その場合は三角形のパズルになってしまうのだろう。

### 利用案2

1. メートルギアを配置
2. razorカット用にSVGファイルでダウンロードする
3. 近所の店に依頼する

自分が使いたいサイズと数のギアを用意できそうだ。
コスト面ではギアの専門店で買う方が安いかもしれない。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/62aa9e46-ed54-0abc-d77f-d1e98249f41a.png)

SVGファイルで気づいたが、メートルギアは中心の穴が開いていないため自分で加工することになるのだろうか。
中心に穴があるUseful Gearや、さらに大きな穴があるCog Ring2などを使う方がいいだろうか。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/66864f43-0a62-ec51-91a3-43d97926a4dc.png)

- 上段: メートルギア (モジュール:1, 歯の数:18, ピッチ角:20)
- 中段: Useful Gear (ピッチ:2, Slop:0, # Of Teeth:20, 高さ:5, Bore Dia:3)
- 下段: Cog Ring2 (高さ:5, 直径:10)
 - 直径と半径の定義(mm)が間違っている? 実際の直径は20mmだ
- 左と中央: オブジェクトの下面がz=0
- 右: オブジェクトの中段がz=0
- すべてのオブジェクトの直径を20mmとしている


### カットしてもらった

~~近所の店は不定休で、試作をすぐにはできそうにない。~~

近所の店が開いていたのでカットしてもらった。

- ギア18個
    - 上記の９個 x 2
    - MDF材: 1000円 (作業込み)
    - アクリル材: 1000円 (作業込み)
    - 依頼から1時間後に受け取りできた
    
![DSC_0324.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/9bc8b4ce-d961-8f86-af0c-8a48e1967ca3.jpeg)


調べたコワーキングスペースの場合、電車賃、スペース使用料が1000円、レーザーカッター装置使用が500円、材料持ち込み、データ整形の作業が必要なので、上記の依頼の価格は高くない。
Tinkercad > デザインの公開手順 | UI > 左上の操作メニューが小さすぎてiPad mini4では閲覧性が良くない

ブラウザ動作するAutoDeskのTinkercad。

デザインを公開する手順が分かった。

1. 左上のTINKERCAD（カラフルな正方形)をクリックする
    - デザイン、Circuits、レッスンのメニューが左にある画面が表示される
2. 左メニューからデザインを選択する
3. 公開したいデザインを選択する
    - これを編集、3D プリントの注文、などのボタンがある画面が表示される
4. 右上のギアマークをクリックする
5. 可視性をpublicにする

上記の手順で以下を公開してみた。
https://www.tinkercad.com/things/6UxzV4grw6q

iPad mini4で閲覧してみた。
左上の操作メニューが小さすぎてiPad mini4では閲覧性が良くない。

PCではマウス操作で簡単にViewの変更ができる。
平行移動の機能はないようで、回転と拡大縮小は実行できる。

### 関連

- [Tinkercad > geometry > particle_Asteroid_180303.stl > Asteroidのオブジェクト | GitHubにあげてみた](https://qiita.com/7of9/items/2c6ba5c5de8077f22b4f)
Tinkercad > geometry > particle_Asteroid_180303.stl > Asteroidのオブジェクト | GitHubにあげてみた

ブラウザ動作するAutoDeskのTinkercad。

[Brandon Cole](https://www.tinkercad.com/users/2hKbKjgO7A3)によるAsteroidというオブジェクトがあるようだ。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/b4bec621-964c-1230-cb37-e6081b8ec044.png)

パラメータとして以下がある。

- 乱数器
- Coarseness
    - 大きい値ほど外形の凹凸が強調される
- 分割数



[GitHubにあげてみた](https://github.com/yasokada/Tinkercad_Asteroid_180303/blob/master/particle_Asteroid_180303.stl)。
( 関連: [gitWatch > 3D (STLファイル)を表示できるのか。すごい。](https://qiita.com/7of9/items/d107a886d9f83c5c86a5) )

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/86eafd42-f571-d3ec-9936-ed79e8a93ef7.png)

Tinkercad上と見た目は異なるが、人と形状情報を共有するツールとしては使えるかもしれない。
Tinkercad自体にも共有する機能はあるように思うが、今は分かっていない。

GitHubでは自動回転機能があるので、3D形状の見せ方としてはいいかもしれない。

iPad mini4でGitHubページを見たが、Viewの変更ができない。
elevation固定でyaw回転表示としてのみ閲覧可能のようだ。
babel7系 mocha5系のテストコマンド


## babel 7.0.0-beta.40 mocha5.0.1の組み合わせで使ったらエラーが出た

###環境
```json:package.json
{
  "scripts": {
    "test": "mocha --compilers js:babel-register"
...
  },
  "dependencies": {
    "@babel/core": "^7.0.0-beta.40",
    "@babel/runtime": "^7.0.0-beta.40"
  },
  "devDependencies": {
    "@babel/node": "^7.0.0-beta.40",
    "@babel/plugin-proposal-object-rest-spread": "^7.0.0-beta.40",
    "@babel/plugin-transform-async-to-generator": "^7.0.0-beta.40",
    "@babel/plugin-transform-runtime": "^7.0.0-beta.40",
    "@babel/preset-env": "^7.0.0-beta.40",
    "@babel/register": "^7.0.0-beta.40",
    "babel-register": "^6.26.0",
    "babel-loader": "^8.0.0-beta.0",
    "chai": "^4.1.2",
    "mocha": "^5.0.1",
    "webpack": "^3.11.0",
    "webpack-node-externals": "^1.6.0"
  }
...
}
```
```json:.babelrc
{
  "plugins": [
    ["@babel/plugin-transform-runtime", {
      "helpers": false,
      "polyfill": true,
      "regenerator": true,
      "moduleName": "@babel/runtime"
    }],
    ["@babel/plugin-proposal-object-rest-spread"],
    ["@babel/plugin-transform-async-to-generator"]
  ],
  "presets": ["@babel/preset-env"]
}

```

```sh
npm test

> myproject@1.0.0 test path/to/dir
> mocha --compilers js:babel-register

/path/to/dir/myproject/node_modules/@babel/plugin-transform-runtime/lib/index.js:17
  var helpers = options.helpers,
                        ^

TypeError: Cannot read property 'helpers' of undefined
```
## んーん動かない　でも書いてあるんだよなあ
<img width="1063" alt="スクリーンショット 2018-03-03 7.28.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/124117/0c004cb2-b0d0-5677-e183-e9abb5f1e067.png">

[Upgrade to Babel 7 (WIP)
](https://babeljs.io/blog/2017/03/01/upgrade-to-babel-7)

## mochaの方を見ることに。。
> --compilers is redundant; we've yet to encounter a real-world situation in which the solution couldn't be expressed using --require.
........
> Babel: --compilers js:babel-core/register becomes --require babel-core/register
........
> $ mocha --compilers coffee:coffee-script/register --recursive ./test
Then this is how you'd accomplish the same thing (** roughly means "recursive") in v4:

> $ mocha --require coffee-script/register "test/**/*.js"

^ 適当に抜粋してるので悪しからず。。
[mocha - compilers deprecation](https://github.com/mochajs/mocha/wiki/compilers-deprecation)

`--compilers`は冗長だからやめて`--require`で`register`君を指定してあげろとそれで`babel`の方は`--require babel-core/register`だぞと、

babelのベージと擦り合わせて`mocha --require babel-register`にしたが、変わらずエラー

まあ根本的な解決になるとは思ってなかったから想定内。

普通に他のbabelのライブラリ同様　`@babel/register`を指定してみたらできました。。

## 結論
```sh
$ node_modules/.bin/mocha --require @babel/register
```
ほとんどbabel7のものを使っていたけど、mochaの`babel-register`の部分も変えなきゃいけなかった、、
まあそりゃバージョン合わせようねってことだね
モザイクの消し方と、消せるモザイクの作り方。 [ python3 PIL tkinter ]

モザイクをかけるプログラムと、モザイクを消すプログラムをセットで作りました。

![Python　NULL.png](https://qiita-image-store.s3.amazonaws.com/0/240301/a9baf816-6eac-456d-e059-32e24931f644.png)

![python ロゴ 画像処理.png](https://qiita-image-store.s3.amazonaws.com/0/240301/9509eefa-a095-4b16-39a3-70108b4f735b.png)

 



![python bot.png](https://qiita-image-store.s3.amazonaws.com/0/240301/d1edc9fc-8cb0-8fc1-47a3-009a04a07906.png)

上のサンプル画像は画像の一部にモザイクがかかっていますが、モザイクはもとから外すことができるように作ってあります。そして画像が異なると、モザイクの模様も異なります。

　 

以下がモザイクを外すためのコードです。

```py
from PIL import Image
import os, tkinter.filedialog, tkinter.messagebox

root = tkinter.Tk()
root.withdraw()
fTyp = [("","*")]
iDir = os.path.abspath(os.path.dirname(__file__))
tkinter.messagebox.showinfo('','無修正にしたい画像を選んでください')
file = tkinter.filedialog.askopenfilename(filetypes = fTyp,initialdir = iDir)

im = Image.open(file)
size =im.size

for n in range(2):

    bun = []
    for y in range(size[1]):
        for x in range(size[0]):
            bun.append(im.getpixel((x, y))[0])
    for y in range(size[1]):
        for x in range(size[0]):
            bun.append(im.getpixel((x, y))[1])
    for y in range(size[1]):
        for x in range(size[0]):
            bun.append(im.getpixel((x, y))[2])

    j=0
    for y in range(size[1]):
        for x in range(size[0]):
            r = bun[j]
            g = bun[j+1]
            b = bun[j+2]
            j = j + 3
            im.putpixel((x, y),( r,g,b))

im.save("mosaic01.png")

tkinter.messagebox.showinfo('',"無修正にして保存しました")
```


![python null none.png](https://qiita-image-store.s3.amazonaws.com/0/240301/baca92ea-0787-3b77-a16c-f0f8f4356875.png)　![python PIL.png](https://qiita-image-store.s3.amazonaws.com/0/240301/5c821ae9-8f05-8d17-d267-6ff345d2d5c7.png)　　![python ツイッター.png](https://qiita-image-store.s3.amazonaws.com/0/240301/bb22c073-5263-75ee-816c-5db11684ad97.png)


※モザイクを外してみたい方はこれらの画像をコピーして使ってみてください。
※コピーした画像をパソコンに保存する際は「.png」で保存するといいかと思います。

 　

以下がモザイクをかけるコードです。

```py
from PIL import Image
import os, tkinter.filedialog, tkinter.messagebox

root = tkinter.Tk()
root.withdraw()
fTyp = [("","*")]
iDir = os.path.abspath(os.path.dirname(__file__))
tkinter.messagebox.showinfo('','修正したい画像を選んでください')
file = tkinter.filedialog.askopenfilename(filetypes = fTyp,initialdir = iDir)

im = Image.open(file)
size =im.size

for n in range(2):

    bun = []
    for y in range(size[1]):
        for x in range(size[0]):
            bun.append(im.getpixel((x, y))[0])
            bun.append(im.getpixel((x, y))[1])
            bun.append(im.getpixel((x, y))[2])

    j=0
    for y in range(size[1]):
        for x in range(size[0]):
            r = bun[j]
            g = bun[j + len(bun)//3]
            b = bun[j + len(bun)//3 * 2]
            im.putpixel((x, y), (r, g, b))
            j=j+1

im.save("mosaic01.png")

tkinter.messagebox.showinfo('',"修正して保存しました")
```
以上がモザイクを消す方法と作り方でした。

　

二階のテンソル https://twitter.com/nikainotensor
Arduino互換品がMacで認識されない問題の解決


##macOS SierraでArduino互換品を認識させる手順
(2018年3月3日時点, ver10.13.3)
1.　SIPを無効化
2.　CH34X USB-SERIAL DRIVERのインストール
3.　確認・完了


###SIPを無効化
El Capitan以降、SIP(System Integrity Protection)という機能が追加されました。
[El Capitanの「SIP」をもっと知る](https://news.mynavi.jp/article/osxhack-152/)

手作業でドライバなど拡張書類(kext)を追加・削除出来なくなった為、
まず、SIPを無効化。

Macを再起動し、Appleロゴが表示される前に、
Command + Rキーを押し、Macをリカバリモードで起動。

左上メニューから、ターミナル(ユーティリティ > ターミナル)を起動し、以下を入力。

```
csrutil enable --without kext
```

オプションに関してはこちら。
[SIPをもっと深く知ってみよう！　〜SIPは一体何を保護しているのか〜](https://qiita.com/whitefox_105/items/0b70f7a504dcb72788e6)

そして再起動。


###CH34X USB-SERIAL DRIVERのインストール
https://blog.sengotta.net/signed-mac-os-driver-for-winchiphead-ch340-serial-bridge/
こちらからダウンロードしてインストール、再起動。


###確認

```
$ ls -l /dev/tty.*
```

/dev/cu.wchusbserial1410
/dev/cu.wchusbserial14xx
などが表示されれば認識されています。

無事Arduino IDEでプログラムを書き込めるようになりました。
SIPについて知らなかったので勉強になりました。

参考元：[Arduino Nano not visible in Serial Ports (Mac OS)](https://arduino.stackexchange.com/questions/34775/arduino-nano-not-visible-in-serial-ports-mac-os)
Katexを使った数式表示用vueコンポーネントの作成例

## はじめに
Katexを使って数式を表示させるvueコンポーネントの作成例を示します。

## 条件
- Katex 0.9.0
- vuejs 2.9.3

## 結果

katexコンポーネントの作り方と使い方を示します。

### vueファイル

```vue:Katex.vue
<template>
  <span :id="name">
    <slot>...</slot>
  </span>
</template>

<script>
export default {
  props: ['name'],
  mounted() {
    const element = document.getElementById(this.name)
    katex.render(this.$slots.default[0].text, element)  //-----(1)
  }
}
</script>
```
(1)の行にてslotで受け取ったデータをkatexのrender関数に渡しています。`this.$slots.default[0].text`の部分はstackoverflow(*1)とVuejs公式サイト(*2)を参照しました。

### HTMLファイル
nameプロパティは数式の名前にしています。

```html
    <katex name="position-of-mass">\overrightarrow{p_1}</katex>
    <katex name="simple-matrix">
      \begin{pmatrix}
         a & b \\
         c & d
      \end{pmatrix}
    </katex>
```

ライブラリ(*3)も追加します。

```html
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.9.0/katex.min.css" integrity="sha384-TEMocfGvRuD1rIAacqrknm5BQZ7W7uWitoih+jMNFXQIbNl16bO8OZmylH/Vi/Ei" crossorigin="anonymous">
<script src="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.9.0/katex.min.js" integrity="sha384-jmxIlussZWB7qCuB+PgKG1uLjjxbVVIayPJwi6cG6Zb4YKq0JIw+OMnkkEC7kYCq" crossorigin="anonymous"></script>
```

### おわりに
Katexを使って数式を表示させるvueコンポーネントの作成例を示しました。

## 参照
3. stackoverflow https://stackoverflow.com/questions/42950967/how-to-reference-text-thats-in-slot-slot-in-vue-js
2. Vuejs API https://vuejs.org/v2/api/index.html#vm-slots
4. Katex https://github.com/Khan/KaTeX
Rails gem tips: 論理削除が有効なモデルで物理削除を行う(paranoia gem)


## 前提
ActiveRecordの論理削除を行う[paranoia](https://github.com/rubysherpas/paranoia) gemを使用していること

```ruby
class XXXModel < ApplicationRecord
  acts_as_paranoid # 論理削除有効

```

## 本題

物理削除を行いたい場合は really_destory! をコールする

```ruby

XXXModel.find(0).really_destroy!
```
try! Swift Tokyo 2018 (Day 2) 参加メモ

try! Swift Tokyo 2018 (Day 2)の参加メモ。(Day 1は[こちら](https://qiita.com/fukazayo/items/a0b023b5878eb24acdd4))

# try! Swift Tokyo 2018
https://www.tryswift.co/events/2018/tokyo/jp/

# セッション
## Expression Problem を解決する
- 同じUIでもプラットフォームが異なるとコードが再利用できない
- View Protocolを使うと、macOS/iOSで再利用可能なUIコードを書くことができる
- Final Tagless Approachで検索すると詳細情報を確認することができる

## Swift もくもく会 in Barcelona
- バルセロナでのもくもく会の紹介

## Swift によるアルゴリズムの可視化
- Playgroundを使ったベジエ曲線の描画デモを紹介

## Kitura で Codable ルーティング
- Swift 4で追加されたCodableを使うとJSONのEncode/Decodeが型安全かつ簡単にできる
- アプリにKituraKit、サーバーにKituraのCodable Routingを使うとJSON変換処理をKituraに隠蔽でき、また型定義もアプリ=サーバー間で共有できるようになる

## 超解像+CoreML+Swiftを使ってアプリの画像データ転送量削減に挑戦する
- 漫画の画像をwaifu2xで高解像度化してみたが、思ったより綺麗にならなかった
- DeNAで独自開発したSRCNNKitとCoreMLを使うと綺麗に高解像度化できるようになった
- SRCNNKitと機械学習トレーニング用のスクリプトはオープンソースとして公開済み(ただし、DeNAが作ったトレーニング結果(モデルファイル)は大人の事情で非公開)

## iOSでCharlesを導入する
- ネットワーク通信のデバッグに困っていたため、18年前にCharlesを開発した
- Charlesを使うとネットワークのどの部分で問題が発生したか簡単にデバッグできる
- iOS上で動作するCharles for iOSを開発した
- HTTPS通信のデバッグも簡単に実行でき、ログをMacと共有することもできる
- ただし、Charles for iOSはApple審査中でまだリリースできていない

### 業務メモ
- Charles for iOSに感動した、是非導入したい

## 拡張現実における体験設計
- ARの概要と導入事例を紹介
- ARを使ったアプリを開発するためのテクニックを紹介

## Swift エンジニアのための Kotlin 入門
- 同じ処理をSwiftとKotlinで書いた場合の違いを紹介
- KotlinはSwiftに似ている
  - map、filter、reduceは両方の言語に存在するが、reduceは若干挙動が異なる
- SwiftにあってKotlinに無いもの、またKotlinにあってSwiftに無いものがある
  - guardはSwiftのみ存在する
  - applyはKotlinのみ存在する、Kotlinから盗むべきもの
- ネイティブコードにコンパイルできるKotlin Nativeというコンパイラもあるが、まだαレベル
- Kotlinを学びたい場合は、EDU Toolsを使ってみると良い

## Swift5のOwnershipに備える
- Swift 5で追加予定のOwnershipを使うと、Swiftで高度なメモリ管理ができるようになる
- Ownershipはパフォーマンスチューニングが必要な部分で威力を発揮する
- 学習コストは高いが、オプトイン機能であるため使わないという選択もできる

## デジタル信号処理 in Swift
- Accelerate Frameworkを使ったビジュアライザーのデモを紹介

## Codableが導く型安全な世界
- CodableはJSON変換以外にも使える
- ProtocolとCodableを組み合わせるとデータ変換が型安全かつ簡単にできる
- ただし、Encoder/Decoderのコード量は多い

## iOS / Swift における対話型インターフェースの作成
- 音声認識を使うことで、ユーザーの負担を減らすことができる
- 音声認識のサービスはいろいろあるが、まだ勝者はいない
- iOSのSpeech Recognition APIは1時間1000リクエストの上限があるが無料で使える
- AmazonのLexは無料では1ヶ月5000リクエストの上限があるがクロスプラットフォームで使える

## UIImageView vs Metal
- UIImageViewに画像を設定して表示する処理をMetalを使って書き、GPUの挙動を見るデモの紹介
- 既にUIKitはMetal上に実装されている

## Swiftが動くDockerコンテナの各OSの性能比較
- Ubuntu 16.04と14.04でパフォーマンスはほぼ同じ
- Docker ImageのサイズはUbuntu 16.04の方が小さい

## 型とパフォーマンスで見るType-erasureの利点
- Type-erasureを使った型消去とパフォーマンスチューニングの紹介

## Make faces big by Vision and CoreGraphics
- Visionを使った顔認識とCore Graphicsによる顔のみの画像拡大のデモを紹介

## 開発者ツールと経験への時間投資
- 開発効率を上げるためのツールを紹介
- Swift/Objective-Cの両方で使えるKZPlaygroundの紹介
- ファイル変更を監視して再読込を行うKZFileWatchersの紹介
- ボイラープレートやFakeオブジェクトのコード自動生成を行うSourceryの紹介

### 業務メモ
- KZFileWatchers、Sourceryは現行プロジェクトに使えそう
Integer.valueOf と Auto boxing の罠

*思わず頭にきたのでメモ書き。*

あるメソッドがあります。このメソッドは `int` を受け取っていました。 
ある時、このメソッドが `Integer` を受け取るように改修が入りました。他はどこも `Integer` を使っていたからです。
引数の型を書き換えたところ、そのメソッドはコンパイルエラーの一つも出さずに受け入れました。

もうわかるな。`NullPointerException`だ。

# なにがあったの
`Integer.valueOf(int)`が使われていた。
引数は`Integer.valueOf(int)`へ流し込まれるにあたり、まず Auto Boxing による変換が挟まり、つまり `Integer.valueOf(Integer.intValue())` となった。

`Integer` は primitive ではないので `null` になりうる。
`null` に対してメソッド呼び出しをかけようとすれば当然 NPE で落ちる。
そして `Integer` と `int` は Auto Boxing で暗黙に相互変換されるため、コンパイラはエラーを吐かない。

~~Javaなんて嫌いだ。~~

# どうすればいいの
**Wrapper Class を使うな**。~~古事記~~ Effective Java にもそう書いてある。

そもそも Wrapper Class という連中はひどくクソッタレな仕様をしている。そもそもラップされている primitive たちと特性を合わせる気がさらさらないのだから笑うしかない。
~~primitive は mutable なのに Wrapper Class は immutable (`int`と`Integer`をそれぞれインクリメントして調べてみるといい！) ってどういうことだ。~~しかもそれらを暗黙に相互変換だって？ 冗談じゃない。
（fix: ややこしいがmutableではなかったので訂正。インクリメントの挙動違いはスタック周り、って最近そういう話がよく出るなあ……）

しかし、現実には Wrapper Class でないと Generics 周りでめんどくさい思いをするハメになる。
**特に Optional が使えないのは致命的だ。**
仕様上どうしようもないのはわかるが、それはそれとして正直……
Wrapper Class どもに Optional を直接実装してくれりゃあ使い物になったろうにと今でも思う (やれるならやったんだろうが) 。
（もちろん Optional なら OptionalInt がある。が、まとめて扱えないのはやはり欠陥だと思う）

だから、もう一度いう。**Wrapper Class を使うな**。
そして、**Wrapper Class が出てきてしまったなら、そいつは Optional だと思え**。
VSCodeでRubyを気軽に実行する環境を作る。

追記 2021/01/01
TypeScript版を書きました、この記事を書いた時よりももう少し細かく書いています。

VSCodeでTypeScriptを気軽に実行する環境を作る。 - Qiita
https://qiita.com/masakinihirota/items/7ee5c2aa405c2b37d1c5

追記終わり

# VSCodeにRubyが動く環境を追加します。

## 前提
環境
Windows10
VSCodeには、いろいろカスタマイズしてインストール済み。

「プロを目指す人のためのRuby入門」という本を手に入れたので、VSCode上からRubyを気軽に試せる環境を作りました。

## 環境のインストール開始
Powershellを立ち上げ、Rubyがインストールされているかどうかを見る。

VSCodeのメニューから
表示＞総合ターミナルでターミナルを立ち上げる。

VSCodeのターミナルから
`Ruby --version`
と打つ。

```
PS c:\webapp> Ruby --version
ruby 2.5.0p0 (2017-12-25 revision 61468) [x64-mingw32]
```

インストールされているとこのように表示される。

インストールされてない場合は

Downloads
https://rubyinstaller.org/downloads/
からダウンロードしてインストールします。

インストール終了後、
`Ruby --version`
と打ち、インストールされたかどうかを確認します。

確認ができたら、

## 拡張機能をインストール

Ruby実行用の拡張機能をインストールする方法。

インストールする方法
![CodeRunner.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44761/eb0eb5d8-2068-8d00-0658-a4bec1e9b5ef.png)

１，左サイドバーの拡張機能を選択。
２，検索窓から「code runner」を入力します。
拡張機能インストール候補リストから「Code Runner」をインストールします。

一旦再起動させてから、（念のため）
Rubyファイルを作成するフォルダを作る。
VSCodeでそのフォルダを開いてRubyファイルを作成します。
ファイルを新規作成して、
このファイルの拡張子を「.rb」にします。

### お試し用プログラム

```ruby:try_ruby.rb
class Hello
  def hello
    puts 'HELLO'
  end
end

aisatu = Hello.new
aisatu.hello

```

コマンドパレット（Ctrl + Shift + p）を開き、
`run code`
と検索して、コマンドを選び実行します。

ショートカットはctrl + alt + N

実行結果

```
[Running] ruby "c:\webapp\tempCodeRunnerFile.rb"
HELLO

[Done] exited with code=0 in 0.152 seconds
```

Ruby以外でも、 C, C++, Java, JavaScript, PHP, Python, Perl, Ruby, Go, Lua, Groovy, PowerShell, BAT/CMD, BASH/SH, F# Script, F# (.NET Core), C# Script, C# (.NET Core), VBScript, TypeScript, CoffeeScript, Scala, Swift, Julia, Crystal, OCaml Script, R, AppleScript, Elixir, Visual Basic .NET, Clojure, Haxe, Objective-C, Rust, Racket, AutoHotkey, AutoIt, Kotlin, Dart, Free Pascal, Haskell, Nim, D, が特に設定せずに使用可能です、他の言語もコマンドを設定すれば可能です。

### 追加
自分の場合は、（新規ファイル作成とかぶっていたので）
ショートカットを設定して
ファイル＞基本設定＞キーボードショートカット
`run code`で検索して、
キーバインドをCtrl + B に設定した。
iPhone（実機）でMac（Webサーバー）を確認する

# ローカル開発時に実機で確認

Web開発をしていると、ローカルでも実機で確認したい時があります。尚且つ、Macのhostsの設定で確認したい。
検索するとインターネット共有をする、DNSを設定するなど色々やり方が出ますが、上手くいかなったのですがCharlesを使うとサクっと出来るようになりました。

# 手順

1. Charlesをインストール（https://www.charlesproxy.com/）

2. hostsの設定
`sudo vi /etc/hosts`
任意のドメインをつける(今回はexample.comとします)
`xx.xx.xx.xx        example.com`
xx.xx.xx.xxにはMacのローカルIPを入れてください。（システム環境設定の「ネットワーク」から確認することができます）

3. iPhoneからxx.xx.xx.xx:8888にアクセス
すると、Macの起動していたCharlesにてダイアログが出てきますので「Allow」を押してください。

これでexample.comにアクセスするとMacのWebサーバーにアクセスすることができました。
Alpine LinuxでGmailにメール送信する方法(ついでにPHPからも)

# 概要

`Alpine Linux`を使って`mail`コマンドを実行する
ついでにPHPからも送信する

# 参考にしたサイト

* https://qiita.com/chikoboo/items/77d0030c49e0d8b7fd4f
* http://eng-memo.hatenadiary.com/entry/2016/05/05/211419

# 環境

|項目|バージョン|
|---|---|
|Docker|17.12.0-ce|
|docker-compose|1.18.0|
|コンテナイメージ|php7.2-alpine3.7|

# 構成

```bash
$ tree
.
├── docker
│   ├── Dockerfile
│   └── ssmtp.conf
└── docker-compose.yml

```

```Dockerfile:Dockerfile
FROM php7.2-alpine3.7

RUN apk update \
 && apk add ssmtp mailx

COPY ssmtp.conf /etc/ssmtp/ssmtp.conf
```

```conf:ssmtp.conf
root=${自身のGmailメールアドレス}
mailhub=smtp.gmail.com:587
rewriteDomain=gmail.com
hostname=gmail.com
AuthUser=${自身のGmailメールアドレス}
AuthPass=${自分のGmailログインパスワード}
AuthMethod=LOGIN
UseSTARTTLS=YES
FromLineOverride=YES
```

```yaml:docker-compose.yml
version: '3'
services:
  mail:
    container_name: mail
    build: ./docker
    image: mail:latest
```

# 事前作業

以下のURLから「安全性の低いアプリ」を許可する
https://myaccount.google.com/lesssecureapps
※即時反映されるわけではないので、1分程度時間を置いたほうが良い

# 手順

* ビルド

```
$ docker-compose build
```

* ashの場合

```ash
$ docker run --rm -it mail:latest ash
$ echo 'body' | mail -s 'subject' ${自身のGmeilメールアドレス}
```

* PHPの場合

```bash
$ docker-compose run mail
php > mail("${自身のGmailメールアドレス}", "subject", "body");
```

* Gmail宛てにメールが届いていることを確認

## エラー

ログインできなかった場合、以下のようなエラーが出力される

```
sendmail: Authorization failed (534 5.7.14  https://support.google.com/mail/answer/xxxx xxxx.xxxx - gsmtp)
```
enchant.js＆phina.js 覚書１

これまでenchant.jsを使っていましたがphina.jsも覚えたくなりました。
勉強の覚え書きとして、同じ処理を各ライブラリを使って記述したときのコードを記録しておきたいと思います。
#キャラクターを表示して動かす
今回は本当にシンプルな、テンプレート用のプログラムです。
次の３つについて記述位置と記述方法が最低限分かるシンプルなものとしました。
1.初期設定
2.画像表示
3.定期的な処理

またHTMLファイルについては、どちらもscriptタグでライブラリファイルをリンクするのみなので割愛します。
#enchant.js

![image.png](https://qiita-image-store.s3.amazonaws.com/0/234600/59a2964a-7b3c-cc8f-9f46-a09d81ae69aa.png)


```js
// ライブラリの初期化
enchant();

window.onload = function(){
    var game = new Core(320, 320);  //  画面サイズ
    game.fps = 15;                  // fps
    game.preload('chara1.png');     // 画像素材
    game.onload = function(){
        // キャラクター表示
        var kuma = new Sprite(32,32);
        kuma.image = game.assets['chara1.png'];
        kuma.moveTo(280,280);
        game.rootScene.addChild(kuma);
        // 定期処理
        kuma.addEventListener('enterframe',function(){
            kuma.x--; // 左へ移動
        });
    };
    game.start();   // 処理開始
};
```

#phina.js
![image.png](https://qiita-image-store.s3.amazonaws.com/0/234600/d2db7980-e89b-7d58-5603-a6621ec32cc9.png)


```js
// ライブラリの初期化
phina.globalize();

phina.define('MainScene', {
  superClass: 'DisplayScene',
  init: function() {
    this.superInit();
    // キャラクター表示
    this.player = Sprite('tomapiko', 64, 64).addChildTo(this);
    this.player.setPosition(400, 400);
    this.player.frameIndex = 0;
  },
  // 定期処理
  update: function(app) {
    this.player.x -=1;  // 左へ移動
  }
});

phina.main(function() {
  var app = GameApp({
    startLabel: 'main',
    width: 465,  // 画面幅
    height: 465,// 画面高さ
    fps:60,     // fps
    assets: {   // 画像素材
      image: {
        tomapiko: 'http://cdn.rawgit.com/phi-jp/phina.js/v0.2.0/assets/images/tomapiko_ss.png',
      }
    }// アセット読み込み
  });
  app.run();     // 処理開始
});

```

#感想
今回は本当にベースの部分だけですが、どちらもほんの数十行で完了してしまうので、覚えやすいという印象です。細かなところは好みで別れるのかもしれません。
初めて触ってみたphina.jsは、コンストラクタ含めクラスの記述が分かりやすいと思いました。

なお、開発環境はenchant.jsは[code9leap](http://code.9leap.net/)、phina.jsは[Runstant](http://runstant.com/)です。

#参考サイト
https://github.com/phinajs/phina.js/wiki
ミーティングの依頼

# March 7th meeting on the budget.

◆Opening
Dear Mr. John.

◆Body 
I'd like to let you know about a meeting on March 7th at 3:00 p.m in Room A.

We plan to discuss the budget for the next year.

If you can't attend,  please let me know as soon as possible.

◆Closing
Take care,
Taro Yamada.
デコレータの理解

[クロージャ](https://qiita.com/meznat/items/65555a6e9ca6005c4495)を応用して関数に機能を修飾するデコレータが使える

```.py
#デコレータ関数
def print_info(func):
    def wrapper(*args, **kwargs):
        print('start')
        result = func(*args, **kwargs)
        print('end')
        return result
    
    return wrapper

@print_info
def add_num(a,b):
    return a+b

r = add_num(1,2)
print(r)

>>>
start
end
3
```

print_info()は関数を引数にとりwrapper関数に渡す。
wrapper関数は任意の処理を行ったあと、受け取った関数を呼び出し返り値を返す。

以下の記述と同等の意味を持つ。

```.py
#デコレータ関数
def print_info(func):
    def wrapper(*args, **kwargs):
        print('start')
        result = func(*args, **kwargs)
        print('end')
        return result
    
    return wrapper

def add_num(a,b):
    return a+b

f = print_info(add_num)
r = f(1,2)
print(r)

>>>
start
end
3
```

複数のデコレータを重ねる場合は順序によって処理が変わる。

```.py
def print_info(func):
    def wrapper(*args, **kwargs):
        print('start')
        result = func(*args, **kwargs)
        print('end')
        return result
    
    return wrapper

#new
def print_more(func):
    def wrapper(*args, **kwargs):
        print('func:',func.__name__)
        print('args:',args)
        print('kwargs',kwargs)
        result = func(*args, **kwargs)
        return result
    
    return wrapper

@print_info
@print_more
def add_num(a,b):
    return a+b

r = add_num(1,2)
print(r)

>>>
start
func: add_num
args: (1, 2)
kwargs {}
end
3
```

デコレータの順序を逆にすると

```.py
#略

@print_more
@print_info
def add_num(a,b):
    return a+b

r = add_num(1,2)
print(r)

>>>
func: wrapper
args: (1, 2)
kwargs {}
start
end
3

```

処理順が変わる。

以下の記述と同等の意味を持つ

```.py

#略

def add_num(a,b):
    return a+b

f = print_info(print_more(add_num))
r = f(1,2)
print(r)

>>>
start
func: add_num
args: (1, 2)
kwargs {}
end
3
```

以上
簡単なクロージャの理解

以下の関数内関数を返り値に取った関数があった場合

```.py
def outer(a):
    
    def inner(b):
        return a+b

    return inner
```
outer関数はオブジェクトを返す。

```.py
print(outer(1))
>>> <function outer.<locals>.inner at 0x00000000085340D0>

```

inner関数を実行するには

```.py
f = outer(1)
r = f(2)
print(r)

>>> 3
```
とする。
inner関数に与える初期値をいくつか変更したい場合などに使う。

・円の面積を求める場合

```.py
def circle_area_func(pi):
    def circle_area(radius):
        return pi * radius * radius

    return circle_area


cal1 = circle_area_func(3.14)
cal2 = circle_area_func(3.1415)

print(cal1(10))
print(cal2(10))

>>>314
>>>314.15
```

など場合分けができる。

以上
Windowsのコマンドプロンプトでホームディレクトリを見るときの注意点: ~ディレクトリの恐怖

# はじめに

```shell_session:コマンドプロンプト
C:\current_directory>dir ~
 ドライブ C のボリューム ラベルは OS です
 ボリューム シリアル番号は 0000-0000 です

 C:\current_directory のディレクトリ

ファイルが見つかりません
```

コマンドプロンプトでは`dir ~`コマンドを用いてホームディレクトリを見ることはできません。

Windowsをいつも使っているつもりでしたが、`ls == dir`だと思い込んでいてハマったので書いておきます。



# 正解

```shell_session:コマンドプロンプト
C:\current_directory>dir %homepath%
 ドライブ C のボリューム ラベルは OS です
 ボリューム シリアル番号は 0000-0000 です

 C:\home_directory のディレクトリ

2020/02/02  20:20    <DIR>          .
2020/02/02  20:20    <DIR>          ..

# ほか色々

               0 個のファイル                   0 バイト
               2 個のディレクトリ  000,000,000,000 バイトの空き領域
```



# 原因

Windowsのコマンドプロンプトで`dir ~`を打つと、殆どは最初の結果になります。
しかしWindowsであれば、多くの環境で何らかのファイルがホームディレクトリに存在するはずです。

実はコマンドプロンプトにおいて、`dir ~`コマンドは、カレントディレクトリ内の`~`ディレクトリを見ています。

つまり、先ほどは殆どが最初の結果になるといいましたが、例外として、カレントディレクトリ内に`~`ディレクトリが存在する場合のみ、次の結果になります。

```shell_session:コマンドプロンプト
C:\current_directory>mkdir ~
C:\current_directory>dir ~
 ドライブ C のボリューム ラベルは OS です
 ボリューム シリアル番号は 0000-0000 です

 C:\current_directory\~ のディレクトリ

2000/02/28  23:59    <DIR>          .
2000/02/29  00:00    <DIR>          ..
               0 個のファイル                   0 バイト
               2 個のディレクトリ  000,000,000,000 バイトの空き領域
```

そして恐ろしいことに、コマンドプロンプトでは`mkdir ~`でカレントディレクトリ下に`~`ディレクトリを作れてしまいます！



# PowerShellの場合

PowerShellでは`dir ~`というコマンドでホームディレクトリを見てくれます。

そのため、カレントディレクトリに`~`ディレクトリが存在していても、`~`ディレクトリの中身ではなくホームディレクトリを見ます。

```posh:PowerShell
PS C:\home_directory> tree
C:.
├─~
|  ├─subdirectory1_in_~
│  └─subdirectory2_in_~
├─dir1
|  ├─subdirectory1_in_dir1
│  └─subdirectory2_in_dir1
└─dir2
   ├─subdirectory1_in_dir2
   └─subdirectory2_in_dir2
PS C:\home_directory> dir ~


    ディレクトリ: C:\home_directory


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       1900/01/01     00:00                ~
d-r---       2036/02/06     00:54                dir1
d-r---       2038/01/19     03:14                dir2
```

また、コマンドプロンプトのように`mkdir ~`をすることはできません。

```posh:PowerShell
PS C:\current_directory> mkdir ~
mkdir : 指定された名前 C:\home_dir の項目は既に存在します。
発生場所 行:1 文字:1
+ mkdir ~
+ ~~~~~~~
    + CategoryInfo          : ResourceExists: (C:\home_directory:String) [New-Item], IOException
    + FullyQualifiedErrorId : DirectoryExist,Microsoft.PowerShell.Commands.NewItemCommand
```


# おわりに

Nyagosを使いましょう！（ぉぃ

もし何か気づいたこと、気になったことがあれば教えてください！
「0x80070035　ネットワーク パスが見つかりません。」が出てアクセスできないとき

コントロールパネル⇒ユーザーアカウント⇒Windows資格情報の管理にWindows資格情報を追加する(アクセス先のコンピュータ名とアカウントの情報)。**そして再起動**。
1つの映像出力を2画面分に拡張する

<h1>映像出力の拡張</h1>
意外とネットに情報が上がってなくてハマったので記録

結果から言うと現状DisplayPortしか拡張出来ないみたい。
理由は信号の伝達方式の違いらしい。

ほとんどの映像出力はデータをそのままシリアル伝送しているのに対して
DisplayPortはデータをパケットにしてシリアル伝送しているとの事。
もちろん映像データだけではなく音声データも含まれる。

なるほど、それで同時に２画面分のデータを別々のディスプレイに送信出来るのか。

<h1>実はそこそこ強いDisplayPort</h1>
現在よく採用される映像入出力のインタフェースはHDMI、だと体感している。
コネクタは小さくて機器の入出力ポートが集まる場所でもコンパクトに収まるし、
それでいて映像は綺麗で音声も扱える。
デジタル接続でノイズに強いため従来の規格よりもケーブルも長くしやすい。
これだけ普及している事もあって価格もそれなりにお手頃。
実際HDMIがあればほとんどの事は事足りると思う。

しかし、限定的な場面においてはDisplayPortは強いと思う。
例えば、1出力のDisplayPortを2出力に拡張したい時など（どんだけ限定的なんだ…）

ありきたりが嫌いなあなたなら迷わずDisplayPortを選ぶべきだろう…
いつかは役に立つ、はずである。
Perlを使いWindowsのホームディレクトリにフォルダを作ろうとしてハマった点

# はじめに

```pl:make_dir_in_home_dir.pl
use strict;
use warnings;

mkdir "~/dir_name";
```

と書いたら、ホームディレクトリに`dir_name`フォルダができるような気がしました。

しかし、うまくいきませんでした。



# 正解

Windowsではこのようにする必要があります。

```pl:make_dir_in_home_dir.pl
use File::Path 'mkpath';

chomp(my $home_dir = `echo %homepath%`);
mkpath "$home_dir/dir_name";
```

```sh:command
$ perl make_dir_in_home_dir.pl
$ ls ~
dir_name
```

mkpathとは、複数階層のディレクトリを一度に作ってくれる便利なやつです。

参考ページ: [複数階層のディレクトリを作成する File::Path::mkpath() - Perlゼミ](http://d.hatena.ne.jp/perlcodesample/20080524/1211608231)



# 原因は不明

Bash on Ubuntu on Windows上やPowerShell上で、最初のスクリプトを実行してもうまくいきませんでした。
それどころか、カレントディレクトリにもホームディレクトリにも作ろうとしたディレクトリは現れませんでした。

そもそも`mkdir "~/dir_name";`は使えないようです。

スクリプトの実行自体にエラーはないのですが、`dir_name`ディレクトリがどこに行ったのかは謎のままです。




# `$ENV{HOME}`は使えなかった

最初は環境変数として`$ENV{HOME}`を使おうと試みましたが、中身が空っぽでした。

```pl:print_home_dir.pl
use warnings;

print "Home directory is $ENV{HOME}?\n";
```

```sh:コマンドプロンプト
$ perl print_home_dir.pl
Use of uninitialized value $ENV{"HOME"} in concatenation (.) or string at test.pl line 3.
Home directory is ?
```

下記の参考ページのコメント欄2つ目を見ると、取れないとのことです。

> Windowsの環境変数はいくつかあって、%ENVでアクセスできるのは、
http://www.atmarkit.co.jp/fwin2k/win2ktips/460envset/envset.html
の環境変数の種類の説明でいうプロセス環境変数なので、システム環境変数やユーザー環境変数とは別物です。

参考ページ: [【Perl】【Windows】システム環境変数を取得できますか？ Active… - 人力検索はてな](http://q.hatena.ne.jp/1149408077)

これに関してBash on Ubuntu on Windowsでは動作したため、その環境であれば使えます。



# おわりに

~~これだからWindowsってやつは！~~

でも好きです。

もし何か気づいたこと、気になったことがあれば教えてください！
あと、もう少し簡単な方法はないのでしょうか？
スレッドへの参照渡し

<h1>スレッドに参照を渡す</h1>
おはようございます。
やってますか？C++の参照渡し。

C++でもC言語同様ポインタを使用できますが、C++で追加された参照渡しをフル活用しましょう。
C++でC言語のようなポインタ渡しをするとコンパイラには怒られなくても先輩上司に怒られます。

<h1>std::ref()を使え</h1>
スレッドに呼び出し元関数で使用している値の参照を渡すときはstd::ref()を使う。

```c++:hoge.cpp
#include <iostream>
#include <thread>

void hogeMethod( int& param )
{
    param = 100;
}

int main( void )
{
    int param = 0;
    std::thread t1( hogeMethod, std::ref(param) );
    t1.join();

    std::cout << param << std::endl;

    return 0;
}
```

出力結果

```
100
```

<h1>まとめ</h1>
c++を始めたばっかの頃、呼び出し先関数のパラメータに&を付ければ参照渡しになるんじゃないの！？？って混乱してました。
色々あるんですね。
CreateJSで「あれやりたい！」集

CreateJS、けっこうハマりどころが多かったので参考にしたURLなどメモを残しておきます。

# Retina対応したい！
この記事が参考になりました。ありがとうございます。
[《CreateJSとか》canvas要素の高解像度デバイスへの対応のしかた。 \- Qiita](https://qiita.com/uto-usui/items/5ee0634d5107f3da86e8)

# スマホのタップに対応させたい！けどcanvas上でスクロールする場合にも対応したい！

``` JavaScript
createjs.Touch.enable(stage, false, true);
stage.preventSelection = false;
```

CreateJS製のCanvasに対するスマホでのタップを受け付けると、
スクロールしようとしてCanvas上を触れつつ指をスライドさせる動作を行った時にうまくスクロールされないケースがあります。
上記コードで抑制できると思いますが、タップイベントとスクロールの切り分けは複雑なようなので様子を見つつ実装してください。
参考 :
[createjs\.Touch\.enable\(stage, false, true\); does not work in 0\.8\.0 · Issue \#586 · CreateJS/EaselJS · GitHub](https://github.com/CreateJS/EaselJS/issues/586)

# Tweenのアニメーションが終わったタイミングで適当な処理をさせたい！
アニメーションを記述した後に`.call()`の中に処理内容を書く方法が便利です。
[CreateJS でのトゥイーン実装方法まとめ \- ICS MEDIA](https://ics.media/tutorial-createjs/tween_api.html)

# 画像を中心を基準点として座標指定したい！
regX、regYに画像の中心(=widthの半分、heightの半分)を指定すると良いです。
[CreateJSでcanvasに読み込んだ画像の基準点を設定する方法 \- Qiita](https://qiita.com/pikoshimame/items/1739c471cead8f80a970)
初めに勉強するならWordPressがおすすめな理由

HTML+CSSとWordPressをどっち先勉強しましたかと聞くと、多くの方はHTML+CSSから勉強し始める方が多いように感じますし、自分自身もそうでした。
しかし、スキルを上げていくためにはWordPressを先に勉強していくほうがメリットがあると感じています。
その点について今回は自分の考えを紹介します

<h2>HTML+CSSから勉強していくのは色のついていないジグソーパズルを作るようなもの</h2>
皆さん、ジグソーパズルをしたことはあるでしょうか?
ジグソーパズルをしようと思うタイミングの多くは、「このジグソーパズルが完成したものを部屋に飾りたい」といった理由が多いでしょう。
逆に、ジグソーパズルに色がついていなければ、多くの人は買わないでしょうし、やる気も起きないでしょう。
これは、HP制作について学ぶ際にも同じことが言えます。
WordPressについて最初に学ぶと、場合によっては数分使い方を学べは、自分でHPを作ることができ、実際に自分の目で作品を見ることができます。
これがHTML+CSSを先に学ぶこととの違いにもなるのですが、HTML+CSSを先にやるとどうしても<strong>形のないものを追いかけている</strong>ような気持ちになることが多いのです。
そして、モチベーションが続かなくなって、勉強をやめる人が多いように感じるので、先にWordPressをやるほうがいいのではないかと考えてます。

<h2>WordPressを使う過程でHTML+CSSやその他の言語を学べる</h2>
WordPressにはプラグインというものがあり、例えば、Google Mapによる位置情報をHP上にあげたり、トップページ画像がスライドするものにしたりといった機能をすごく簡単に追加することができます。
そのため、こういった機能を追加してHPを作っていく過程で、「どうやってこのプラグインが動いているのだろう」といった興味から勉強を始めることができると思います。
こういう勉強の仕方は、機械を分解するのが好きという人などには特にうってつけです。

いかがだったでしょうか。
HTML+CSSについて学ぶことはWordPressで作られたHPをカスタマイズしていくうえでいずれ必要となるものではあります。
しかし、WordPressでHPを作っていく過程で、こういうことがしたいと思ってからHTML+CSSについて学んでいくほうが、効率よく学んでいくことができるのではないかと考えています。
GKEでなるべく安くKubernetesクラスタを作成してPrometheus + Grafanaを使ってみる Part3 -SSL編-

タイトルの通りGKE (Google Kubernetes Engine)でKubernetesクラスタを作成して、その上でPrometheusとGrafanaを動かしてみます。

前回クラスタとそこにIngressを追加したので、今回はIngressでSSLを使えるようにします。

# はじめに

[cert-manager](https://github.com/jetstack/cert-manager)を使ってLet's Encryptから証明書を取得・設定していきます。

cert-managerで証明書を取得するためにはDNS認証かHTTP認証のいずれかを行う必要があります。
DNS認証はRoute53ではうまく動かなかったので、HTTP認証で行います。

# cert-managerのインストール

helmを使ってインストールします。
下記コマンドを実行してください。

```bash
git clone https://github.com/jetstack/cert-manager
cd cert-manager
helm install \
    --name cert-manager \
    --namespace=kube-system \
    contrib/charts/cert-manager \
    --set ingressShim.extraArgs='{--default-issuer-name=letsencrypt-prod,--default-issuer-kind=ClusterIssuer}'
```

# 設定

下記yamlをClusterIssuer.ymlとして保存してください。
※メールアドレスは自分のものを設定してください。

```yaml
apiVersion: certmanager.k8s.io/v1alpha1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
  namespace: default
spec:
  acme:
    # The ACME server URL
    server: https://acme-v01.api.letsencrypt.org/directory
    # Email address used for ACME registration
    email: (メールアドレス)
    # Name of a secret used to store the ACME account private key
    privateKeySecretRef:
      name: letsencrypt-prod
    # Enable the HTTP-01 challenge provider
    http01: {}
```

下記yamlをcertificate.ymlとして保存してください。

各ドメインは自分のものを設定してください。
commonNameは証明書の通称として使われるものなので、(ドメイン1)を指定するといいと思います。
dnsNamesで指定したドメインは[SAN (Subject Alternative Name)](https://jp.globalsign.com/support/faq/516.html)として登録されます。

```yaml
apiVersion: certmanager.k8s.io/v1alpha1
kind: Certificate
metadata:
  name: (ハイフンつながりのドメインex: kter-jp)-tls
  namespace: default
spec:
  secretName: (ハイフンつながりのドメイン)-tls
  issuerRef:
    name: letsencrypt-prod
    kind: ClusterIssuer
  commonName: (ドメインex: kter.jp)
  dnsNames:
  - (ドメイン1)
  - (ドメイン2)
  - (ドメイン3)
  acme:
    config:
    - http01:
        ingressClass: nginx
      domains:
      - (ドメイン1)
    - http01:
        ingressClass: nginx
      domains:
      - (ドメイン2)
    - http01:
        ingressClass: nginx
      domains:
      - (ドメイン3)
```

設定を反映します。
下記コマンドを実行してください。

```bash
kubectl apply -f ClusterIssuer.yml
kubectl apply -f certificate.yml
```

進捗は下記コマンドで確認出来ます。

```bash

kubectl describe certificate
```

# 確認

各ドメインにhttpsでアクセスして、証明書が正しく設定されるか確認します。
air play環境の構築でハマったこと

raspberry piを使い、airplayが使える環境を作った際に困ったこと。

システム自体は、
[mikebrady/shairport-sync](https://github.com/mikebrady/shairport-sync)
を利用して構築しました。

shairport-syncのセットアップなどは後述する参考が詳しく書いてあったので確認してください。
ここでは自分がハマったところだけ書きます。


# usbのdac関連
以下を入力しても
```aplay -l```
aplay: device_list:268: no soundcards found...
とエラーが帰ってきてしまう。
sudoが必要だった。

```sudo aplay -l```

以下を入力しても、音がならない
```aplay /usr/share/sounds/alsa/Front_Center.wav```

sudoが必要だった。
addgroupでも良い 
``` sudo addgroup yuusuke audio ```


# 参考
https://qiita.com/yuyakato/items/600f499cf0610bfc1a16
そのRubyプログラムをきっと速くできない小ネタ

2017年9月なので少々前の話になるのですが、Rails のコミットログを見ていたらこんな変更を見つけました。

https://github.com/rails/rails/commit/32e1e70995a0c3f985dd2b5e9ce2295bc7b906ef#diff-83ce56e0f856f2c8d7ceb7fab4eb4c2bR74

難しいことではなく、単に `||=` を使っていたところを `defined?` でチェックし代入するように変更しています。

# 何が違うか

値が nil だった場合、変更前の書き方の場合は、「偽かチェックして、右辺を改めて算出する」のに対して、変更後はそれらが要りません。

 「偽なら代入 `||=` 」の場合

* 定義しているか -> ?
* 偽か -> チェックする
* 代入する値 -> 計算する

「defined? が偽なら代入」の場合

* 定義しているか -> チェックする
* 偽か -> なし
* 代入する値 -> なし

しかもこれが、このメソッドを通るたびに発生します。

自分は、真偽チェックと `defined?` と (Ruby の言語レベルの話として) どの程度コストが違うのか、というところまでは理解してないのですが、少なくとも `defined?` だけにすればやることが減るのは確かだと思います。

# どんなケースに応用できるか

フレームワークレベルでこれを直せばなるほど意味があるように思いますが、それ以外でもどこかに役立てたいものです。

同様の修正が有効なのは、（追記しました）

* 右辺で複雑な計算をしている
* 結果として nil もしくは false が返って来うる
* 何度も実行されるが、右辺の返り値は変わらない

上記の場合でしょうか。

~~自分の書いているプログラムには思い当たらないです。残念。~~

追記: 特に早くしたい目的ではないのですが、代入するものの導出が複数行に渡り、 `begin - end` で書いているようなケースでは、見た目の複雑さが大きくは変わらないので積極的に使っていこうと思いました。

```ruby:before
def client
  @client ||= begin
                # ... 何かすごい処理
                Client.new
              end
end
```

```ruby:after
def client
  unless defined?(@client)
    # ... 何かすごい処理
    @client = Client.new
  end
  @client
end
```
とある大手サイトのLPコーディングをやっていたときにはまった件

#とある大手サイトのLPコーディングをやっていたときにはまった件

初めまして、27歳業界歴３年のryuji62でございます。

文字コードがeuc-jpの案件だったのですが、

エディタはATOMを使用してまして、途中でなぜか保存ができなくなりました。。

色々足掻いてみた結果、原因が判明致しました。

「ローマ数字」と「～」でした。

[ローマ数字変換参考サイト](https://kw-note.com/website/roman-numerals-and-html-tags/)

[～変換参考サイト](http://d.hatena.ne.jp/katano034/20090730/1248924852)

上記を参考にしたらいけました！！

良かったです。。

何せ、LPコーディングは未経験だったもので、、。

まだまだ未熟者ですが、これからもどうぞよろしくお願いいたします。
PythonのformatのようにGoで文字列をformatしたい

Python2.7以上ではformat関数を利用して文字列に変換することができる。

```
>>> "foo{nantoka}".format(nantoka="bar")
'foobar'
```
個人的にこの機能が可読性が高くて好きだったがGolangにはないということで自力で導入する方法を調べてみたところ、[text/template](https://golang.org/pkg/text/template/)を使えば実現できることがわかったため実際に試してみた。

```go
package main

import (
	"bytes"
	"text/template"
	"fmt"
)

type fstr string
func (s fstr) format(m map[string]string) string {
	t := template.Must(template.New("").Parse(string(s)))
	var buf bytes.Buffer
	t.Execute(&buf, m)
	return buf.String()
}

func main() {
	s := fstr("nantoka-{{.foo}}-kantoka")
	fmt.Println(s.format(map[string]string{"foo": "bar"}))
}


```
出力はnantoka-bar-kantokaとなる。`{{.`と`}}`で囲まれた部分の名前がここでつかいたい変数の名前で、その変数への代入はmap経由で行うことができる。[実行例](https://play.golang.org/p/iYRTdEpZnMV)

なお、templateからstring出力する場合には[golang-nuts](https://groups.google.com/forum/#!forum/golang-nuts)の[とある投稿](https://groups.google.com/forum/#!msg/golang-nuts/dSFHCV-e6Nw/SyPf_m0s3eQJ)にある通り`bytes.Buffer`を使えばよい。

あとはstring型に関数を追加できないGoの仕様上string型を上の`fstr`のように再定義するのが面倒なのでやめたいし、`map[string]string{"foo": "bar"}`のところを`{"foo": "bar"}`のように簡潔に書きたいが、今のところどうやればいいかよくわかっていない。
Transfer from Basic to Python（日本語）

Transfer from Basic to Python
https://wiki.openoffice.org/wiki/Python/Transfer_from_Basic_to_Python


４．Macroの杜(Sample Macro)
OpenOffice.org / LibreOffice Basic編 Writer
をPythonマクロに変換して
LibreOffice Pythonマクロ　サンプルプログラム（初級者向け）Writer編 No.1
https://qiita.com/ty21ky/items/1d591b2180333d4d4961
を作成するために、Transfer from Basic to PythonをGoogle翻訳で翻訳しました。

BasicとPythonを対比して表示しているので、原本より見やすいと思います。

#Transfer from Basic to Python(日本語)
http://ty21ky.web.fc2.com/libreoffice/Basic_to_Python_LibreOffice.html
Discord用のBotアカウントの用意


Discord用のBot作成のための下準備について説明します。
Discordのアカウントがない場合、まずアカウントを作成してください 

# スクリーンショットつきの記事
[【Discord】最新版Python版音楽bot（Musicbot）を導入する方法](https://kunimaly.ml/how-to-setup-python-musicbot/)の「bot用のアカウントを作る」という部分が参考になります

#テキストによる覚書

## アプリの作成
[ここ](https://discordapp.com/developers/docs/intro)からDiscordの開発者用のページにアクセスし、MyAppsをクリックして「New App」を選択します
「APP NAME」に任意の名前を入れて「Create App」を押すとアプリができます。ここの名前を変更するUIは今のところ存在せず、プログラムで変更するしかないので注意が必要です。

アプリを作ったら、BotUserを作ります。スクロールしてしたのほうにある「Create a BotUser」をクリックしてください

最後に「APP BOT USER」のすぐ下にある「Token」をコピーしておいてください

## サーバーにBotを招待
OAUTH2 URL GENERATOR の下にある「Generate OAuth2 URL」というボタンをクリックします
するとURLが出てくるので、ブラウザのアドレスバーにコピーします
サーバを選択して「認証」を押すと完了です。
Botの招待には管理者権限が必要です。
Windows10+Python+C#でDiscord用マルコフ連鎖Botを作った話

# はじめに

@kakunpc さんが動かしていたマルコフ連鎖のBotで楽しく遊んでいたのですが、ふとこういうBotを自分でも作ってみたいと思い、ソース公開していないんですか？と質問したら公開してもらえたので、それを利用してDiscordで動くBotを作りました

## 環境
- Windows10
- Python3.6.4

## Botの動き
Botに話しかけると、特定のファイルから日本語文章を読み込んで、その文章と、Discordの特定の名前のチャンネルの発言をあわせたテキストからマルコフ連鎖で生成した文章が投稿されます

# マルコフ連鎖の文章を生成するプログラム：MarkovInu

こちらでソースが公開されています
https://github.com/kakunpc/MarkovInu

MarkovInu（以下マルコフ犬）のソースコードは C# で書かれています。そのため、ビルドしてやる必要があります

VisualStudioがない場合、VisualStudioをダウンロードしてきましょう。コミュニティ版は無償で使えます。
https://www.microsoft.com/ja-jp/dev/compare-editions

コンパイルに先立って、以下の2点を修正しました

- Sample.txt へのパスを `./base_text.txt` に変更
- 以下の1行を削除した
 - https://github.com/kakunpc/MarkovInu/blob/master/MarkovInu/MarkovInu/Program.cs#L51
 
修正が終わったら、メニューの「ビルド」－「MarkovInuをビルド」を選択すると、`MarkovInu\MarkovInu\bin\Debug` の中にライブラリなど含めて一通りビルドされています。
ファイル内の `Sample.txt` を `base_text.txt` にリネームしてこのディレクトリに配置してください。
ここでコマンドプロンプトを立ち上げて、ファイル内の`MarkovInu.exe` を実行し、1行出力されたら、マルコフ連鎖の文章生成部分は完成です。

# DiscordへのBotの登録
長くなったので記事をわけました
https://qiita.com/oosawa/items/e5b01e88a209d9087432

- Bot用のアプリケーションを作成し、TOKENを得る
- Botをディスコードのサーバに招待する
- Botを招待したサーバに、`maou-no-niwa` というチャンネルを作る

という3つの作業が必要です

# Botの実装

Botのソースは以下で公開しています
https://gist.github.com/oosawa/7c38797b602d8da04e4a1f8eb2f16a08

これを動かすためには、pythonのインストールと、discord.pyのインストールが必要です。
```
python -m pip install -U discord.py
```

## ファイルの配置

以下のようにファイルを配置してください

```
ディレクトリ
└reply.py
└create_base_text.py
└Inu
  ├MarkovInu.exe
  ├base_text.txt
  ├dic
  :
```

# Botの実行
コマンドプロンプトを立ち上げて
`python reply.py`
でBotがたちあがります

`#maou-no-niwa` でいろいろ発言したあと、Botに話しかけてみてください


# 参考

https://github.com/Rapptz/discord.py
http://discordpy.readthedocs.io/en/latest/
FizzBuzzで学ぶオブジェクト指向の有用性

内容
------------------------------------------------------------------------------------------

オブジェクト指向の有用性を説くために、FizzBuzzテストに数字やfizzやbuzzを言った人の名前を表示する機能を付けた上で、いくつかルールを追加してみてもらうってのはどうだろう。

- "fizz"と言ったら一人スキップ
- "buzz"と言ったら一回休み
- "fizzbuzz"と言ったら順番が逆転

……といったルールを追加してもらうと、非オブジェクト指向に対するオブジェクト指向の優位性が示せるのではないだろうか。


非オブジェクト指向版
------------------------------------------------------------------------------------------

- fizzbuzzを表示する機能と、人の順番を決める機能が混ざっていて分かりづらい。
- ルールを追加すればするほどmainロジックの複雑さは増していく
  （その複雑さは、単純に関数に切り分けて分離することができない）

```javascript
function main() {
	const member = [{name:"Aさん", loseTurn:0},
	                {name:"Bさん", loseTurn:0},
	                {name:"Cさん", loseTurn:0},
	                {name:"Dさん", loseTurn:0}];
	let currentIndex = 0;
	let increment = 1;
	for (let num=1; num<=20; num++) {
		let say = (num % 3 == 0 && num % 5 == 0 ? "fizzbuzz" :
		           num % 3 == 0 ? "fizz" :
		           num % 5 == 0 ? "buzz" :
		           num);
		console.log(`${member[currentIndex].name} : ${say}`);
		if (say == "fizz") {
			currentIndex = moveNextIndex(member, currentIndex, increment);
		}
		else if (say == "buzz") {
			member[currentIndex].loseTurn = 1;
		}
		else if (say == "fizzbuzz") {
			increment = -increment;
		}
		currentIndex = moveNextIndex(member, currentIndex, increment);
	}
}

function moveNextIndex(member, currentIndex, increment) {
	let nextIndex = currentIndex;
	while (true) {
		nextIndex += increment;
		if (nextIndex >= member.length) { nextIndex -= member.length; }
		if (nextIndex < 0) { nextIndex += member.length; }
		
		if (member[nextIndex].loseTurn > 0) {
			member[nextIndex].loseTurn -= 1;
		} else {
			break;
		}
	}
	return nextIndex;
}
```


オブジェクト指向版
------------------------------------------------------------------------------------------

- fizzbuzzを表示する機能と、人の順番を決める機能が分離できている
- さらにルールを追加しても、mainロジックの複雑さは変わらない

```javascript
function main() {
	const order = new Order(["Aさん", "Bさん", "Cさん", "Dさん"]);
	for (let num=1; num<=20; num++) {
		let say = (num % 3 == 0 && num % 5 == 0 ? "fizzbuzz" :
		           num % 3 == 0 ? "fizz" :
		           num % 5 == 0 ? "buzz" :
		           num);
		console.log(`${order.getMemberName()} : ${say}`);
		order.passTurn(say);
	}
}

class Order {
	constructor(member) {
		this.member = member.map(i => ({name: i, loseTurn: 0}))
		this.currentIndex = 0;
		this.increment = 1;
	}
	getMemberName() {
		return this.member[this.currentIndex].name;
	}
	passTurn(say) {
		if (say == "fizz") {
			this.moveNextIndex();
		}
		else if (say == "buzz") {
			this.member[this.currentIndex].loseTurn = 1;
		}
		else if (say == "fizzbuzz") {
			this.increment = -this.increment;
		}
		this.moveNextIndex();
	}
	moveNextIndex() {
		let nextIndex = this.currentIndex;
		while (true) {
			nextIndex += this.increment;
			if (nextIndex >= this.member.length) { nextIndex -= this.member.length; }
			if (nextIndex < 0) { nextIndex += this.member.length; }
			
			if (this.member[nextIndex].loseTurn > 0) {
				this.member[nextIndex].loseTurn -= 1;
			} else {
				break;
			}
		}
		this.currentIndex = nextIndex;
	}
}
```
byobuのキー操作（完全版）

## ウィンドウ関連

ウィンドウの代わりに「タブ」とでも呼んだほうがしっくり来るかもしれません。

|Ctrl|Alt|Shift|キー|機能|
|---|----|-----|---|----|
||||F2|新しいウィンドウ|
||||F3/F4|ウィンドウの切り替え|
||Alt||←→|ウィンドウの切り替え|
|Ctrl||Shift|F3/F4|ウィンドウを隣に移動|
|Ctrl|||F6|今のスプリット/ウィンドウを閉じる|
||||F8|今のウィンドウの名前を変更|

## スプリット関連

画面分割のことです。分割されたウィンドウをそれぞれスプリットと呼んでいます。

|Ctrl|Alt|Shift|キー|機能|
|---|----|-----|---|----|
|||Shift|F2|新しい横スプリット|
|Ctrl|||F2|新しい縦スプリット|
|||Shift|←→|スプリット間のフォーカス移動|
|||Shift|F3/F4|スプリット間のフォーカス移動|
|Ctrl|||F3/F4|スプリットを隣に移動|
||Alt|Shift|←↓↑→|スプリットのリサイズ|
|Ctrl|||F6|今のスプリット/ウィンドウを閉じる|
|||Shift|F8|スプリット配置の切り替え|
||Alt|Shift|F8|スプリット配置の復元|
|Ctrl||Shift|F8|スプリット配置の保存|
||Alt||F11|スプリットを全画面化|
|||Shift|F11|スプリットのズーム|
|Ctrl|||F11|ウィンドウを縦スプリットに統合|

## セッション関連

複数のウィンドウを取りまとめているのがセッションで、同時に複数のセッションを使用できます。

|Ctrl|Alt|Shift|キー|機能|
|---|----|-----|---|----|
|Ctrl||Shift|F2|新しいセッション|
||Alt||↑↓|セッション間のフォーカス移動|
||||F6|セッションのデタッチとログアウト|
|||Shift|F6|セッションのデタッチ|
|Ctrl|||F8|今のセッションの名前を変更|

## byobu 全般
|Ctrl|Alt|Shift|キー|機能|
|---|----|-----|---|----|
||||F5|プロファイルのリロードとステータスの更新|
||Alt||F5|UTF-8サポートの切り替え|
|||Shift|F5|ステータスの切り替え|
|Ctrl|||F5|ssh/gpg/dbusソケットの再接続|
|Ctrl||Shift|F5|ステータスの色をランダムに変更|
||||F6|セッションのデタッチとログアウト|
|||Shift|F6|セッションのデタッチ|
||Alt||F6|他の全クライアントをデタッチ|
||||F7|スクロールモードの切り替え|
||Alt||PageUp/PageDown|スクロール|
|||Shift|F7|履歴を $BYOBU_RUN_DIR/printscreen に保存|
||||F9|設定|
||||F12|エスケープシーケンス|
|||Shift|F12|ここに書かれているキー操作のON/OFF|
||Alt||F12|マウスホイールによるスクロールのON/OFF|
|Ctrl||Shift|F12|モンドリアンのコンポジション|

## ぜんぶ

|Ctrl|Alt|Shift|キー|機能|
|---|----|-----|---|----|
|||Shift|F1|ヘルプ|
||||F2|新しいウィンドウ|
|||Shift|F2|新しい横スプリット|
|Ctrl|||F2|新しい縦スプリット|
|Ctrl||Shift|F2|新しいセッション|
||||F3/F4|ウィンドウの切り替え|
||Alt||←→|ウィンドウの切り替え|
||Alt||↑↓|セッション間のフォーカス移動|
|||Shift|←→|スプリット間のフォーカス移動|
|||Shift|F3/F4|スプリット間のフォーカス移動|
|Ctrl|||F3/F4|スプリットを隣に移動|
|Ctrl||Shift|F3/F4|ウィンドウを隣に移動|
||Alt|Shift|←↓↑→|スプリットのリサイズ|
||||F5|プロファイルのリロードとステータスの更新|
||Alt||F5|UTF-8サポートの切り替え|
|||Shift|F5|ステータスの切り替え|
|Ctrl|||F5|ssh/gpg/dbusソケットの再接続|
|Ctrl||Shift|F5|ステータスの色をランダムに変更|
||||F6|セッションのデタッチとログアウト|
|||Shift|F6|セッションのデタッチ|
||Alt||F6|他の全クライアントをデタッチ|
|Ctrl|||F6|今のスプリット/ウィンドウを閉じる|
||||F7|スクロールモードの切り替え|
||Alt||PageUp/PageDown|スクロール|
|||Shift|F7|履歴を $BYOBU_RUN_DIR/printscreen に保存|
||||F8|今のウィンドウの名前を変更|
|Ctrl|||F8|今のセッションの名前を変更|
|||Shift|F8|スプリット配置の切り替え|
||Alt|Shift|F8|スプリット配置の復元|
|Ctrl||Shift|F8|スプリット配置の保存|
||||F9|設定|
|Ctrl|||F9|コマンドを入力して全ウィンドウで実行|
|||Shift|F9|コマンドを入力して全スプリットで実行|
||Alt||F9|キー入力を全スプリットに送信するか切り替え|
||Alt||F11|スプリットを全画面化|
|||Shift|F11|スプリットのズーム|
|Ctrl|||F11|ウィンドウを縦スプリットに統合|
||||F12|エスケープシーケンス|
|||Shift|F12|ここに書かれているキー操作のON/OFF|
||Alt||F12|マウスホイールによるスクロールのON/OFF|
|Ctrl||Shift|F12|モンドリアンのコンポジション|

## メモ

### F6 と Shift-F6

`$ byobu-enable`でログイン時に byobu が自動起動するように設定している場合は、F6 でログアウト、Shift-F6 でログアウトせずにデフォルトのログインシェルに移行します。
自分で`$ byobu`と打ったりして起動した場合は、F6 と Shift-F6 の挙動は同じのようです。

### Alt-F*

Alt-F12 は左Altのみ使える場合とか全く使えない場合とかありました。
Alt-F9 なんかはよくわかりませんが使えませんでした。

![Piet_Mondriaan,_1930_-_Mondrian_Composition_II_in_Red,_Blue,_and_Yellow.jpg](https://qiita-image-store.s3.amazonaws.com/0/116137/d5c525bf-e7c1-7d2b-bb49-cf04baf8cc48.jpeg)
Piet Mondrian, 1930 - Mondrian Composition II in Red, Blue, and Yellow