OmniAICreator/Qiita-1.07M huggingface dataset:
VBAでボタン(Shape)を凹ませる

# 押されたときに凹むアニメーションをするボタン
## はじめに
昨今のフラットUIの流れからは外れますが立体的なボタンが分かりやすいのも事実です。
かといって、Excel 2010のグレーの標準ボタンは古い感じがします。
そこで図形の3D効果を使用して押されたときに凹ませるアニメーションを考えました。

## VBAでボタン(Shape)を凹ますアニメーション
### ボタンアニメーションマクロ

- button_down : ボタンを押したときのアニメーション
  引数: ボタン図形(Shape)オブジェクト

- button_up : ボタンが上がるとき（処理が完了したとき）のアニメーション
  引数: ボタン図形(Shape)オブジェクト

``` VBA:標準モジュール
Option Explicit

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)


Private Const button_depth = 1  'ボタンの厚み 0.5 から 2をお勧め
Private Const push_speed = 10   '小さいほど早い 厚みが薄いと大きく厚いと小さく調整する

'// ボタンを押したときのアニメーション
Public Sub button_down(button_shape As Shape)
    Dim n As Single

    For n = button_depth To 0 Step -0.1
        button_shape.ThreeD.BevelTopDepth = n
        button_shape.ThreeD.BevelBottomDepth = n
        Sleep 10
        DoEvents
    Next n

    button_shape.ThreeD.BevelTopType = msoBevelSoftRound
    button_shape.ThreeD.BevelBottomType = msoBevelSoftRound
    
    For n = 0 To button_depth Step 0.1
        button_shape.ThreeD.BevelTopDepth = n
        button_shape.ThreeD.BevelBottomDepth = n
        Sleep 10
        DoEvents
    Next n

End Sub

'// ボタンが上がるとき（処理が完了したとき）のアニメーション
Public Sub button_up(button_shape As Shape)
    Dim n As Single

    For n = button_depth To 0 Step -0.1
        button_shape.ThreeD.BevelTopDepth = n
        button_shape.ThreeD.BevelBottomDepth = n
        Sleep 10
        DoEvents
    Next n
    
    button_shape.ThreeD.BevelTopType = msoBevelCircle
    button_shape.ThreeD.BevelBottomType = msoBevelCircle
    
    For n = 0 To button_depth Step 0.1
        button_shape.ThreeD.BevelTopDepth = n
        button_shape.ThreeD.BevelBottomDepth = n
        Sleep 10
        DoEvents
    Next n

    End Sub
```

###使用サンプル
```VBA:Sheet1シートモジュール（ボタンアニメーションマクロの使用例）
    Private Sub button_push(shape_name As String)

        button_down Me.Shapes(shape_name)

        MsgBox "処理中"

        button_up Me.Shapes(shape_name)

    End Sub

'// アニメーションボタンの使用例
    Public Sub test()

        button_push "PROC1"

    End Sub
```

## ボタンアニメーションマクロの使い方

1. 任意の図形に適当な3D効果を設定し名前ボックスで名前をつけます。
    - サンプルでは"PROC1"

2. マクロを登録します。
    - サンプルでは標準モジュールにアニメーション用マクロ本体を、シートモジュールに呼び出し用のマクロを書いています。

3. ボタンアニメーションに関するパラメータを設定します。

    button_depth : ボタンの３D枠の深さ
    push_speed : アニメーション動作のスピード

    ```VBA:ボタンアニメーションパラメータの設定例
    Private Const button_depth = 1  'ボタンの厚み 0.5 から 2をお勧め
    Private Const push_speed = 10   '小さいほど早い 厚みが薄いと大きく厚いと小さく調整する
    ```

4. ボタン（図形(Shape)）を右クリックし「マクロの登録」で"Sheet1.test"を登録します。
tensorflow.nn.softmax_cross_entropy_with_logits()でValueErrorが発生

# tensorflow.nn.softmax_cross_entropy_with_logits()でValueErrorが発生

[tensorflowのチュートリアルレッスン](https://www.udemy.com/tensorflow/learn/v4/overview)をやっていたら、エラーが発生したのでメモ。
講義の通りにコードを打ち込んで実行していくと表題のところでエラーが発生。
講義の動画の方ではエラーが発生していなかったので、私のタイポかと思ったが問題がなかったのでググってみた。

## 使用方法が変わっていたらしい
恐らく講義の動画とは`tensorflow`のVerが違っていたのだと思う。
私の使用環境は確か1.2だったと思う。
正しい使用方法は、

```python3
tf.nn.softmax_cross_entropy_with_logits(logits=y_conv, labels=y_)
```

でした。

ちなみに、解決方法が載っていたページは[ここ](https://github.com/tflearn/tflearn/issues/639)

みんな困るところは同じなんだな〜
githubは英語圏以外の人が多いせいか、分かりやすい文章が多くて助かる。
ios用GoogleVR 環境構築


# 環境
- Unity2017.1.0f3
- iOS 10.3.3
- XCode 8.3.3
- GoogleVR SDK 1.7

# 環境構築
とりあえずGoogle VRのドキュメントを見る
[ドキュメント](https://developers.google.com/vr/unity/get-started-ios)

ドキュメントの`Set up the Google VR Unity SDK`の項目からSDKをダウンロードし，インストール


`Builg and run the project on an iOS device`の項目に従ってセットアップする．


さらに，
`Player Settings` > Other Settings, Renderingの一番下 `Virtual Reality Supported`にチェック

Target minimum iOS Version を 8.0に設定

# デモ
GoogleVR > Demos > Scenes > GVRDemoを選択して開く

再生するとエラーが大量に出るので，

Player > MainCamera > GvrReticlePointerのRaycastModeをCameraにする．

ProjectビューのGvrReticlePointerにも同様の設定をしておく．

=> 動かない，落ちる

1.7はAudio関連に問題があるそうなので，
ProjectビューをAudioで検索し，でてきたものを全て消す

これによって
`The referenced script on this Behaviour (Game Object 'Main Camera') is missing!`
と同じようなのがたくさん出るので，対象のコンポーネントを削除する

ビルド => 成功
【eclipse】使うと便利だけど忘れがちな設定＆ショートカット(mac版)

macのeclipseを使い始めて、使えるなあと思った設定や機能を載せていきます。
随時追加編集していきたいと思います。
#設定編

##補完候補を常に表示する
「環境設定」→「Java」→「エディター」→「コンテンツアシスト」で
「Javaの自動有効かトリガー」を
「.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_」
に変更

##やり直し(Redo)の設定
macだとやり直し(Redo)が
`Command + shift + z`
なので、`command + Y`にしたいときは
「一般」→「キー」から、「やり直し」のバインディング(Binding)を変更する

##メッソドを自動補完した際、予測される変数名を自動で入れてくれる設定

`「環境設定」→「エディター」→「コンテンツアシスト」
「メソッド数を入力し、推測された引数を表示」→「最適と推測された引数の挿入」`
にチェック。
英語だと
`「Fill method arguments and show guessed arguments」→「insert best guessed arguments」`


##importしなくても予測変換してくれる設定
「環境設定」→「Java」→「エディター」→「コンテンツアシスト」→「お気に入り」
```java
org.hamcrest.CoreMatchers.*
org.junit.Assert.*
org.mockito.Mockito.*
```
などを設定

#ショートカット編
##自動補完(コンテンツ・アシスト)
`command+control+space`
※初期設定だと、
`^ + Space(control + Space)`
に設定されているが、macの標準で
「キーボード」→「ショートカット」→「前の入力ソースを選択」
が割り当てられているので、こちらの設定を外す or eclipseの自動補完を
`command+control+space`
に変更する処置が必要

eclipseの自動補完は結構優秀で、
`syso`→`System.Out.Println`
`DTC`→`DataTestClass`
`Data hoge = ;`→`Data hoge = new Data()`
のような補完もしてくれる

##quick fix
`command + 1`

##importの自動編成
`command + shift + O`
自動で使用していないクラスを消してくれる

##Rename
`command + option + r`
他のクラスなどで宣言や使用されているものもRenameしてくれる優れもの


##宣言されていない変数を使う
quick fixの
`command + 1`
で、変数の宣言を自動でしてくれる

```java
hoge = getDataClass();
```
```java
Data hoge;
hoge = getDataClass();
```

##ソースにあるフィールド、メソッドを表示
`command + o`
選択するとカーソルを合わせてくれる

##使用していないimportを消してくれる
`command + shift + o`
コミットする前には必ずするようにしています。


##宣言を開く
`F3`
zsh+fzfで実行可能なコマンドをあいまい検索する


半年くらい前から，こちらの記事を参考にzsh+fzfライフになりました．

[おい、peco もいいけど fzf 使えよ - Qiita](http://qiita.com/b4b4r07/items/9e1bbffb1be70b6ce033)

前々から`$PATH`やシェル関数をインタラクティブフィルタできると嬉しいなあと思っていたのですが，公式のwikiでは見つけられなかった（もしかしたらあるのかも）ので，自分で作ってみました．

## シェル関数とキーバインドの追加

```sh:.zshrc
# search commands and shell functions
fzf-cmd() {
  local selected
  selected=`(for p in ${(@s/:/)PATH}; do
    find $p -depth 1 -perm +111 -type f -or -type l 2>/dev/null
    done;
    print -l ${(ok)functions} | grep '^[^_]') |\
      sed 's|.*/||' | fzf --query="$LBUFFER"`
  if [ -n "$selected" ]; then
    LBUFFER="$selected "
  fi
  zle reset-prompt
}

zle -N fzf-cmd
bindkey '^[' fzf-cmd
```

* fzfのインストールなどはされている前提です
* `$PATH` にある実行可能ファイルと，シェル関数のリストからコマンド名だけにしてfzfに渡しています
* シェル関数は `_` で始まるものは除いています

## 実行イメージ

![Sep-18-2017 00-31-28.gif](https://qiita-image-store.s3.amazonaws.com/0/35592/bc3ae06b-4b16-0329-c5ae-dca9ce81af05.gif)


* コマンドの一部など曖昧な場合に，キーワードだけ入れて `^[` すればfzfできます
アットマーク付きパーミッションを変更する

## ことはじめ
ssh-addで別PCのキーを登録しようとした時

```bash:terminal
$ eval `ssh-agent`
$ ssh-add ~/.ssh/id_rsa

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!         @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

・
・
・
```

めちゃ怒られた
パーミッションを確認すると、なんか＠ついてる...

```bash:terminal
-rw-------@  1 ryo  staff  1675  2  3 10:15 id_rsa
-rw-------@  1 ryo  staff   410  2  3 10:15 id_rsa.pub
```

どうやら
Mac OS X Tiger で導入された EA（ExtendedAttributes）というファイルの
メタ情報が付いているらしく、ssh-addできないっぽい

ってことで @ を消します

```bash:terminal
$ chmod 600 .ssh/id_rsa

# @を削除
$ xattr -d com.apple.quarantine ~/.ssh/id_rsa
$ xattr -d com.apple.quarantine ~/.ssh/id_rsa.pub
```

これで、再度sshーaddすれば登録できました

## ※ディレクトリ以下を再帰的に削除する場合

```bash:terminal
xattr -dr com.apple.quarantine <ディレクトリ名>
```
git push -f をやめて --force-with-lease を使おう

## TL;DR

`git push -f`をやめて `--force-with-lease`を使いましょう！

```bash:terminal
$ git push --force-with-lease origin main
```


## --force-with-lease とは
PUSHの際、ローカルrefとリモートrefを比較しローカルが最新か判定し、最新でなければPUSHが失敗するというもの。
<font color="#ff0000">※ただし、直前にfetchしているとPUSHが成功してしまうので注意</font>

## エイリアスに登録する

`--force-with-lease` とか長すぎるので、エイリアスに登録する

```bash:terminal
# ~/.gitconfigに追加
$ git config --global alias.push-f "push --force-with-lease"
```

↓

```bash:terminal
$ git push-f origin main
```


## force push問題
rebaseなどの作業の際、強制PUSHが必要なタイミングが出てくるが `--force`ではローカルの内容を破壊的にリモートレポジトリを上書きしてしまう。

同じブランチで複数人開発していた場合にタイミングによっては
 `「◯◯さんのコミットを吹き飛ばしちゃった//」` が発生する可能性が十分ある。

そもそも上記の運用方法に問題がある気はするが、どんな運用をしていたとしても
force pushする際は　`--force-with-lease`オプションを必ずつけるようにしておいて損はないと思う。

## TIPS: Github上でブランチを削除できないようにする
消されるとまずいブランチは [Settings] → [Branches]でさまざまなprotectionルールをかけておきましょう！

![スクリーンショット 2021-03-25 19.22.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40799/e60d50b4-0059-5e5c-7202-a5c24d895030.png)
【イラストでざっくり理解する】VLANとは

# 通常のLAN
![LAN.png](https://qiita-image-store.s3.amazonaws.com/0/188980/9abea7b6-3d40-0d1a-ae66-75cfd4c602e2.png)
閉じられたネットワーク。
LANの中であれば、どのコンピュータとも通信が可能。

# VLANの場合
![VLAN.png](https://qiita-image-store.s3.amazonaws.com/0/188980/9a6412bf-93e5-f36a-c47c-2efbec63d188.png)
Virtual LANの略。
VLANの中では、どのコンピュータとも通信ができる。
しかし、VLAN同士は同じLANの中ではあるが、論理的にネットワークが違うので通信できない。
※VLANの設定は、スイッチという装置で行うが、この図からは省略してます。
CentOSのバージョンを上げる


# やりたいこと
自宅サーバーのCent0S6.3を6.9に上げる。
6から7へ上げるのはまた手順が違うみたいなので別途。

# コマンド

```sh
# 現在のバージョンを確認
$ cat /etc/redhat-release

# アップデート
$ yum clean all
$ sudo yum update
$ reboot

# アップデート後のバージョンを確認
$ cat /etc/redhat-release
```
コインベーストランザクションまでトランザクションを遡ってみる  

# 前回やったこと
[前回の記事](https://qiita.com/quincedaddy/items/ba04b886881f3cd7c45b)ではあるひとつのビットコイントランザクションの**インプット**に着目してトランザクションを詳しく見てみました。

# インプットをコインベーストランザクションまで遡って見てみる
せっかくトランザクションのインプットとなるトランザクションを取得する方法が分かったので、今回はトランザクションを終わりまでどんどん遡ってみましょう。

ちなみに終わりとなるトランザクションは**コインベーストランザクション**と呼ばれるもので、これはまさにビットコインのマインニングによってビットコインが生まれたときのトランザクションです。

以下のように再帰的にトランザクションを遡るコードを書きました。ちなみに前回もお話した通りインプットはひとつのトランザクションに対してひとつ以上ある場合があります。今回は必ず一番先頭のインプットを遡る対象としています。**ちなみに実行に数分かかります**。

```csharp
using NBitcoin;
using QBitNinja.Client;
using QBitNinja.Client.Models;
using System;
using System.Collections.Generic;

namespace NBitcoinTest1
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<uint256, Transaction> GetTx = (txId) =>
            {
                QBitNinjaClient client = new QBitNinjaClient(Network.Main);
                var transactionResponse = client.GetTransaction(txId).Result;
                return transactionResponse.Transaction;
            };

            UInt64 txTreeDepth = 0;
            Action<Transaction> Foo = null; // For recursion
            Foo = (tx) =>
            {
                txTreeDepth++;
                if (tx.IsCoinBase)
                {
                    Console.WriteLine(tx.GetHash());
                    Console.WriteLine(txTreeDepth);
                    return;
                }

                var txId = tx.Inputs[0].PrevOut.Hash;
                var prevTransaction = GetTx(txId);
                Foo(prevTransaction);
            };

            var transaction = GetTx(uint256.Parse("7008807adb713205d01d378f3d25f1bc5e06bda7d30b526c2b9d2c018cfa08b4"));
            Foo(transaction);
        }
    }
}
```
出力は以下のようになります。

```
58fdd93663c8756855b0bca9401da7e84c9dc748b24d2b66f10571dd5c357778
881
```
なんと881回もトランザクションの連なりを遡りました。このトランザクションを[blockchain.info](https://blockchain.info/tx/58fdd93663c8756855b0bca9401da7e84c9dc748b24d2b66f10571dd5c357778)上にて見てみると、例えば採掘量が25BTCだった時代の採掘だったことが分かります。

このようにマイナーさんによって採掘されたビットコインが、800回以上のトランザクションを経て堀江さんに辿り着いたことを想像すると、どこかロマンチックな気分になるのは私だけでしょうか。

# 参照
- [Programming the Blockchain in C#](https://programmingblockchain.gitbooks.io/programmingblockchain-japanese/content/)
- [NBitcoin](https://github.com/MetacoSA/NBitcoin)
- [QBitNinja](https://github.com/MetacoSA/QBitNinja)
hamlの8倍早いhaml実装のhamlit！！！

hamlitとは、hamlを８倍早くしたものだ。
しかし、作者が、不正にベンチマークが早くなっている。（色々対応しなければならないところに対応していないため）と言っているので、現在では他のhaml実装を採用したほうがいいと思う。
しかし、将来性を考えてぜひqittaで紹介させていただきたい。

このhamlitを作った作者のブログを見てください。
http://k0kubun.hatenablog.com/entry/2015/03/31/004021

しかし、作者が書いている通り、hamlそのものではないので、少し注意が必要だ。

以下引用
---
正直最初のリリースでバグを出さないのは人間には不可能だと思っていて、多分v1.0.0にも細かいバグがたくさん眠っていると思うけど、しょうがない。人間だもの。
---

hamlを使って制作し、テストを終えてから、hamlをhamlitに差し替えてテストを行うことで安全に移行できるはずだ。

作者の以下の記事で、rails5+ruby2.3でhamlエスケープを高速化してくれたようだ
http://k0kubun.hatenablog.com/entry/2016/05/29/215851
本当にありがとうございます。ファンです。

以上紹介でした。
iTerm2 プレビュー画像

## インストール方法

```bash
curl -sSo ~/bin/imgcat https://www.iterm2.com/utilities/imgcat && chmod +x ~/bin/imgcat
```

## ローカル画像からのプレビュー

```bash
imgcat /Users/hanksudo/Pictures/One\ Piece/1212762817.jpg
```
<img src="https://i.imgur.com/75AhrYG.png">

## URLからのプレビュー

```bash
curl -sL https://scontent-nrt1-1.cdninstagram.com/t51.2885-15/s640x640/sh0.08/e35/c0.134.1080.1080/19436538_1687323967964065_7854717434526171136_n.jpg | imgcat
```
<img src="https://i.imgur.com/7PwTn4P.png">

## 参考

- [Images - Documentation - iTerm2 - macOS Terminal Replacement](https://www.iterm2.com/documentation-images.html)
pyenv+pyenv-virtualenv環境でcv2(opencvのライブラリ)を利用する

# やりたいこと
pyenv + pyenv-virtualenv環境で、cv2を利用する
けっこうopencvのインストールで失敗したり、
importに失敗する、という記事を見かけるので、備忘もかねてメモ

# 前提
- pythonをpyenv + virtualenv環境で利用していること

# 方法
下記、仮想環境の名前はsandboxとしてます。

```
$ mkdir sandbox
$ cd sandbox
$ pyenv virtualenv (任意のpythonのバージョン) sandbox
$ pyenv activate sandbox
$ pyenv install opencv-python
```

## 確認方法
```
$ python -c "import cv2;print(cv2.__version__)"
(3.3.0) # 標準出力にバージョンが表示されます。
```

`opencv-python`は、opencvのpythonのバインディングを行うのみでなくopencvのバイナリも内包されているとのこと。
だから、opencvのインストールいらんのか！

# 注意点
- 任意のopencvのバージョンを利用した場合や、最小パッケージ以外のopencvのライブラリを利用したい場合は、opencvをインストールしてください

# 参考
- https://pypi.python.org/pypi/opencv-python
デフォルト値が設定されているモデルのreject_ifの指定方法

# 前提

`accepts_nested_attributes_for`を使った`reject_if`の指定方法において、
以下のように`:all_blank`を指定すると、該当フォームがすべて空の場合に無視してくれる。

```
has_many :users
accepts_nested_attributes_for :users, reject_if: :all_blank
```

# 課題

デフォルト値が設定されているカラムがあるモデルに対するフォームの場合、
`:all_blank`を指定すると、「デフォルト値のみ入力されている状態」はrejectできない。

# 解決策

以下のように指定すると良い。

```rb
has_many :users
accepts_nested_attributes_for :users, reject_if: :reject_user

# デフォルト値が設定されているカラム以外が全て空ならreject
def reject_user(attributes)
  attributes.except(:デフォルト値が設定されているカラム名).values.all?(&:blank?)
end
```

`attributes`にはフォームの入力値がハッシュ形式で入っているため、
まずは、`attributes`からデフォルト値が設定されているカラムを`except`で除外する。

次に`values`でハッシュの値部分のみを配列にして、
その全ての要素に対して、`blank?`関数を実行する。

`all?`メソッドは配列の全てに対して、指定したメソッドを実行し、
指定した関数が全ての要素に対して`true`を返せば`true`を、
ある要素が１つでも`false`を返したら`false`を返す関数である。
Nested Formで動的に追加するフォームをテーブルに追加する

# コード例

```.erb
<table class="table table-responsive alias-table">
  <%= f.fields_for :part_number_aliases, wrapper: false do |pnaf| %>
    <tr class="fields">
      <td>
        <%= pnaf.text_field :alias_code, label: "氏名" %>
        <%= pnaf.text_field :alias_name, label: "年齢" %>
        <%= pnaf.link_to_remove 'ユーザー削除', class: "btn btn-default" %>
      </td>
    </tr>
  <% end %>
</table>
<%= f.link_to_add "ユーザー追加", :part_number_aliases, data: { target: ".alias-table" }, class: "btn btn-default" %>
```

# 解説

## `fields_for`に`wrapper: false`オプションを追加する

通常、link_to_addで追加されるフォームは`<div class="fields">`で囲まれるが、
`wrapper: false`を指定することでそれを防ぐ。

## `<tr>`タグに`class="fields"`を指定する
`link_to_add`で`<tr class="fields">...</tr>`がごっそり動的に追加されるようになる。

## 追加する`table`を指定する。

`<tr class="fields">...</tr>`が追加される`table`を指定する。
上記の例では、`link_to_add`の`data: { target: ".alias-table" }`が相当する。
tesseract.jsがスマホ上で動くOCRアプリケーションを作る

初投稿です。
# 目標
スマホのブラウザとカメラで動く日本語OCRアプリケーションを作る。
# 経緯
会社で社内便（複数）の郵送を頼まれる事がある。その際、宛名読む→宛名から郵便受け番号への変換→宛名の郵便受けまで行って投函→宛名読む→...を繰り返す必要があり効率化したい。
↓
配達の前にPCで宛名を一括で打ち込み、郵便受けの番号リストを作成すれば良いがタイピングが面倒。
スマホのカメラで動くOCRなら便利そうだが、[Google Cloud Vision API](https://cloud.google.com/vision/?hl=ja)の社内利用はセキュリティの問題もあって（多分）無理。
↓
[tesseract.js](http://tesseract.projectnaptha.com)なら入力情報を外部に送信しなくて良いので安全なのでは！？
AndroidとかiOSのアプリは作れないけどhtmlなら何とかなりそう！？
↓
今ここ
↓
社員情報のAPIを使用した最短ルートの提案など...

# 作成物
[作成物のデモ](https://quiye.github.io/ocr/)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/206297/2dadd98f-2f1c-e960-a6b9-bbe86b83baa0.png)
処理速度の関係でiPhone 7以降を推奨します。

デモ動画
<blockquote class="twitter-tweet" data-lang="ja"><p lang="und" dir="ltr"><a href="https://twitter.com/null?ref_src=twsrc%5Etfw">@null</a> <a href="https://t.co/pDajJpD5vc">pic.twitter.com/pDajJpD5vc</a></p>&mdash; 石のことなら (@a_ab_abc) <a href="https://twitter.com/a_ab_abc/status/916646190858432514?ref_src=twsrc%5Etfw">2017年10月7日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

# 仕組み
JavaScriptの`navigator.mediaDevices.getUserMedia()`メソッドを利用してカメラの映像を取り込む。
↓
取り込んだ映像をhtmlの`canvas`タグを利用して切り出す。
↓
映像を2値化してディスプレイする（ユーザーに機械の気持ちを理解してもらい、機械が読みやすい写真を撮ってもらうため）。
↓
シャッター押す。
↓
`canvas`タグで（2値化されていない）静止画を生成。
↓
`Tesseract.recognize()`でOCRする。

#コード
https://github.com/quiye/ocr/blob/319b94792a6773e560d0ccfe24d9a3cb5a0228f0/index.html

#やっていないこと
- tesseract.jsはOCR時に[様々なオプション](https://github.com/naptha/tesseract.js/blob/master/docs/tesseract_parameters.md)を指定でき、何か精度を高められそうだが今回は何もしていない。
- `canvas`タグで画像を描画する際、カメラから得られた画像を半分のサイズに圧縮しているが、圧縮しないほうが認識精度が良いかもしれない。
- vue.jsを使ってみたかったが使っていない。

#注意点
- tesseract.jsでは2回目以降のOCR時に以前使用した推論データのキャッシュが使えるため、推論データのダウンロードが不要で高速。アプリ起動時に`準備中🐹`と出るのは、日本語の推論データをダウンロードするために一度OCRを走らせているから。
- `canvas`以外にカメラの映像を写す必要が無いので、カメラ映像の実体である`<video id="player" controls autoplay playsinline></video>`を隠蔽したかったが、cssで隠蔽するとiPhoneのカメラが起動できなくなる（iPhone 7, iOS11, Safari）。そのため`#player`の`width`を0.5にして目立たなくさせた。
- `navigator.mediaDevices.getUserMedia()`はhttps環境でないと使えないらしい。私はwindows使用者なのでHyper-Vで作成した仮想UbuntuにApache2を入れてローカルにhttps環境を作成しました。

#まとめ
あの[横山三国志全文検索システム](http://gigazine.net/news/20170807-yokoyama-mitsuteru-sangokushi-search/)でも使用されたGoogle Cloud Vision APIと比較すると、tessaractの日本語の読み取り精度は明らかに劣るので文章の意味を読み解くのとかにはいまいち使えなさそうですが、社員名の検索であれば文字列の一部が引っかかればかなり絞りこめるのでこの方向で開発を進めていけそうです。
<img width="375" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/206297/ce3ef043-e4e6-47a7-af89-66fb55eb6b4c.png">
英語の認識精度は高いんですけどね。

#参考サイト
- [【お詫びと訂正】iOS11でついにSafariからカメラにアクセスできるようになりました。（コピペで動くサンプルコード付き） \- KAYAC engineers' blog](http://techblog.kayac.com/webcamera-preview-for-ios11)
- [javascript製のOCRライブラリ「tesseract\.js」を試してみた \| cupOF Interests](http://co.bsnws.net/article/198)
ios11からのNavigationBarを実装する(largeTitleDisplayMode)

# ios11のnavigationBarを実装する
ios11からnavigationBarの以下のようにデザインが変わりました．NavigationBarに新しくlargeTitleDisplayModeというパラメータが加わりました．自分は最初にios11のデザインを見たとき，tableViewのHeaderか何かと思っていていました(笑)
largeTitleDisplayModeには`.automatic`，`.always`，`.never`の三つがあります．`.always`だと左側の画像のように，`.never`だと右側の画像のようにios10までと同じになります．今回はlargeTitleDisplayModeをViewControllerごとに使い分けてみたいと思います．
![1-twlxNSHjlqM5WAv1FlhWHA.jpeg](https://qiita-image-store.s3.amazonaws.com/0/56557/de714917-50fb-4754-5f79-d631774cf5ec.jpeg)

## StoryBoardで
StoryBoardで設定する場合，NavigationBarのinspectorから`Prefers Large Titles`にチェックをつけます．
<img width="553" alt="スクリーンショット 2017-10-07 22.24.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/56557/e69cd973-086b-c201-4f6f-ad3e329bfcf0.png">
viewController毎に変更したい場合は，Navigation Itemから`Lage Title`より設定できます．上で説明した通り，`.automatic`，`.always`，`.never`の三種類で，大きくしたくないなら`.never`にします．
<img width="618" alt="スクリーンショット 2017-10-07 22.31.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/56557/a06732c6-f575-7a6d-435a-c0fad168e453.png">


## コードで
実装はそれぞれのViewControlerで下記のように実装します．
iOS11からの機能なのでそれ以下のバージョンを対応する場合は場合分けが必要です．

``` swift 
// ViewController.swift
override func viewDidLoad() {
   super.viewDidLoad()
   self.navigationItem.title = "iOS 11 Sample"
   // iOS 11 からの機能
   if #available(iOS 11.0, *) {
      // ここで Large Title が有効になります
      self.navigationController?.navigationBar.prefersLargeTitles = true
   } else {
      // 基本書かなくても良いと思います
      // Fallback on earlier versions
   }
   if #available(iOS 11.0, *) {
      // この ViewController でどうするか
      self.navigationItem.largeTitleDisplayMode = .always
   } else {
      // 基本書かなくても良いと思います
      // Fallback on earlier versions
   }
}
```

## 参考
[iOS 11 的放大版 navigation bar](https://medium.com/%E5%BD%BC%E5%BE%97%E6%BD%98%E7%9A%84-swift-ios-app-%E9%96%8B%E7%99%BC%E5%95%8F%E9%A1%8C%E8%A7%A3%E7%AD%94%E9%9B%86/ios-11-%E7%9A%84%E6%94%BE%E5%A4%A7%E7%89%88-navigation-bar-85c05824a14c)
[WWDC17 で気になったセッションについて](https://staffblog.yumemi.jp/wwdc17bash/)
Bitrise 上でだけ指定したテストをスキップする方法

Bitrise 上で動く時だけ、指定したテストをスキップさせる方法を紹介します。


## Test 側の Info.plist に環境変数を追加

```diff
--- a/Example/Info.plist
+++ b/Example/Info.plist
@@ -4,6 +4,8 @@
 <dict>
        <key>CFBundleDevelopmentRegion</key>
        <string>en</string>
+       <key>Bitrise app title</key>
+       <string>$(BITRISE_APP_TITLE)</string>
        <key>CFBundleExecutable</key>
        <string>$(EXECUTABLE_NAME)</string>
        <key>CFBundleIdentifier</key>
```

## テスト側に Bitrise 判定器を実装

```swift:BitriseDetector.swift
import Foundation



class BitriseDetector {
    static func isBitrise() -> Bool {
        let testBundle = Bundle(for: BitriseDetector.self)
        guard let bitriseAppTitle = testBundle.object(forInfoDictionaryKey: "Bitrise app title") as? String else {
            return false
        }

        return bitriseAppTitle == "example" // 👈 Bitrise に登録したアプリ名を入れる
    }
}
```


## Bitrise ならテストをスキップさせる

```swift:TestFlags.swift
enum TestFlags {
    static let shouldDisableNetworkTests = BitriseDetector.isBitrise()
}
```

```swift:ExampleTests.swift
import XCTest

class ExampleTests: XCTestCase {
    func testExample() {
        guard TestFlags.shouldDisableNetworkTests else { return }

        // ...
    }
}
```

# 完

お疲れ様でした。
xcconfigで快適なBuild Settingsライフを

## なぜこの記事を書いたか？
### XcodeのBuild Settingsメニューで設定する問題点
アプリの様々な設定を主に行うBuild Settingsですが、XcodeのUI的にいくつか問題があります

* diffが見づらい(debugの設定なのかreleaseなのか読み取れない)
* テキストファイルのような柔軟な変更ができない(一括置換など)
* undoできない

ので人的ミスが起こる可能性が高い

## xcconfigとは？
Xcode の Build Settings をコードで設定するファイルです。
XcodeのGUIと違って

* diffがわかりやすい
* 一括置換などテキスト編集がなんでもできる
* undoし放題

## プロジェクトに導入してみた
## 手順１：Build Configurationごとの設定ファイルを用意する
Xcodeで新規ファイルを作成する際、```Configuration Settings File```を選択

<img width="729" alt="new_file.png" src="https://qiita-image-store.s3.amazonaws.com/0/30423/83c0ebc2-3ad9-8799-0bd3-ee67fb62fb09.png">



#### 必要な設定をファイルに書く

Buildする環境ごとに設定が違う場合は、ベースとなるConfigファイルを作って、それをインクルードした```Config.debug.xcconfig```のようなファイルを用意するのが良いです。
他ファイルのConfigファイルの設定は```#include```でインクルードできます

<img width="270" alt="project_dir.png" src="https://qiita-image-store.s3.amazonaws.com/0/30423/237839c3-7060-f9d7-8bbf-d73bbab75236.png">

> #### TIPS
Xcode の Build Settings上でcmd+aしてコピペすれば、現在の設定を丸ごとxcconfigにコピーできます

## 手順２：プロジェクトで設定ファイルを読み込む
PROJECT > ConfigurationsからBuild SchemeごとのConfigファイルを選択
<img width="555" alt="build-setting.png" src="https://qiita-image-store.s3.amazonaws.com/0/30423/ceeae32f-c0b0-6c2f-c963-2468a01a0d34.png">



## 手順３：設定の反映
Xcode上のBuild Settingsで設定を直書きしている場合、そちらの設定が勝ちます。
そのためxcconfigの設定を反映するためには、Xcode上のBuild Settingsは項目ごとに```$(inherited)```を指定する必要があります(=設定の行にカーソルを合わせてDeleteキーで削除すればOK)

<img width="1265" alt="settings-order.png" src="https://qiita-image-store.s3.amazonaws.com/0/30423/786a3ce2-4f2f-ce90-62be-f764780dfa05.png">



## ハマったこと
### cocoapodsを使っている場合、podsの設定の#includeが必要
cocoapodsが生成したConfigファイルの設定も読み込む必要があるため、
podsの設定を各Configurationごとのファイルで```#include```する必要があります


```
#include "Pods/Pods/Target Support Files/Pods-xxx/Pods-xxx.release.xcconfig"
```

### 最終的にこんな感じのファイルになりました
(Config.debug.xcconfigの例)

```
#include "xxx/xxx/Supporting Files/Config.base.xcconfig"
#include "Pods/Target Support Files/Pods-xxxTarget-xxx/Pods-xxxTarget-xxx.debug.xcconfig"

GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 XXX=1
IPHONEOS_DEPLOYMENT_TARGET = 11.0

... 各設定続く
```


xcconfigを活用することで、project設定周りの人的ミスをいくらか減らせるかと思います

## 参考記事
http://qiita.com/paming/items/34f94a829c09eddfee95
http://www.lifeaether.com/self/blog/?p=523
Python Client for ONVIF Camera のご紹介

# はじめに

Amazon で買った[WiFi 付きの IPCamera](https://www.amazon.co.jp/gp/product/B06X3YVBF5) を Raspberry Pi から操作（録画、3G回線経由で nginx への中継、etc）をしています。
IPCamera の rtsp server をインターネットに直接晒すのではなく、IPCamera は RPi 上の LAN に隔離して、逆に Internet 上の Nginx に movie を push するようなトポロジで IPCamera を乗っ取られるリスクを下げるのが目的です
具体的には [こんな](https://github.com/UedaTakeyuki/monitor2_leaflet/blob/master/monitor2_leaflet.pdf) 事をやってます

カメラの設定に [Python Client for ONVIF Camera](https://github.com/quatanium/python-onvif)が便利でしたので、その旨ご報告させていただきます次第です

# install
[README](https://github.com/quatanium/python-onvif)を見ると pip と git clone & setup.py が紹介されていますが、私の場合、pip install だとなぜか devicemgmt.wsdl がインストールされませんでした（なんでだろ）
git clone & setup.py だと devicemgmt.wsdl も無事にインストールされました

```
git clone git@github.com:quatanium/python-onvif.git
cd python-onvif && python setup.py install
```

# サンプルプログラム
[README](https://github.com/quatanium/python-onvif)に、カメラの時刻情報を取得したり設定したりする例がでています。

ネットワークカメラの時刻設定なんて、NTP で勝手にやってくれるのにその設定なんて現実にすることあるの？と、賢明な諸兄諸姉はお考えになるかもしれません

はじめに、でも書いたとおり IPCAM がインターネットに直に繋げず、RPi を AP として繋げ、IPCAM からのパケットは RPi でブロックする代わりに RPi から外に 

```
IPCAM の Video Source -> RPi の ffmpeg -> Nginx RTSP reverse proxy
```

とすると外部から IPCAM への侵入が遮断できて少し安心です

その代わりに、IPCAM の NTP client が時刻情報をとれず、時計が狂うので、このサンプルは私の場合は実用的でございました

# pros
onvif を含めて SOAP って全く簡単なサービスの呼び出しだけでも xml を用意しないといけないのがお役所の窓口みたいで鬱陶しくて嫌だというか、なんで今時 json じゃなくて SOAP なんだと腹が立ったりもするのですが、このライブラリはなんと！例えば

```
time_params = mycam.devicemgmt.create_type('SetSystemDateAndTime')
```

みたいにすると、サービス（ここでは SetSystemDateAndTime）を呼び出すのに必要なパラメタの xml のひな形を全部用意してくれるので凄く嬉しいです！ナントイフホガラカサ！

# カメラ設定の例

[KNEWMART のONVIF720HD IP Camera](https://www.amazon.co.jp/gp/product/B06X3YVBF5) で、ONVIF の [5.5.5 Modify a video encoder configuration](https://www.onvif.org/specs/srv/media/ONVIF-Media-Service-Spec-v242.pdf) をやってみた例などを、自分の為の簡単なメモで恐縮ではございますが
[こちら](https://gist.github.com/UedaTakeyuki/f710f406dfa20056d32c840bafbb3244)残させて頂きましたので、僭越ではございますが僥倖にも諸兄諸姉のご参考になる事がございましたら至福の至りです。

この例の中で onvif のアカウントが、一般に良くないとされるデフォルトのままなので良識に富まれた諸兄諸姉におかれましてはギョッとされますかもしれませんが、我が家のIPCAMは前述のとおりRPi を挟んでインターネットからのコマンドを遮断してますのでご安心していただければ幸いでございます ^^/
JavaScript計算ライブラリmathjsをちょっと使いやすく

# 演算関数をリネーム
[mathjs]の演算関数は`add,subtracct,multiply,divide`と長くまたわかりにくい。そこで演算関数自体を代入することでリネームする。
[以前の記事](https://qiita.com/kentaro1530/items/50d26fe4933f12490be3)で書いたJavaScriptのLegendre関数を複素関数化する。

```js:legendre.js
import mathjs from 'mathjs'

export default function(n, x){
    const add=mathjs.add, sub=mathjs.subtract, mul=mathjs.multiply, div=mathjs.divide;
    if( n===0 ) return 1;
    if( n===1 ) return x;
    if( x===1 ) return 1;
    else if( x===-1 ) return n%2===1 ? -1 : 1;

    let val=0, val_n=x, val_n1=1;
    for( let i=2; i<=n; i++ ){
     //      val=2*x*val_n-val_n1-(x*val_n-val_n1)/i;
　　　　　val=sub( sub(mul(mul(2, x), val_n), val_n1), div(sub(mul(x, val_n), val_n1),i));
        val_n1=val_n;
        val_n=val;
    }
    return val;
}
```
C++でいうところの`using`に近い感じである。代入なのでゼロコストではないが`math.multiply`とか書くよりよりだいぶマシだろう。

# そもそも何故こんな書き方が必要なのか
## JavaScriptに演算子オーバーロードがないから
[遥か古には提案はされていたが見送られたらしい](https://www.mozilla-japan.org/js/language/js20/rationale/operators.html)。
そして現代人もオーバーロードもどきを得ようと頑張っている。

- [【Javascript】演算子をオーバーロードしたい話](https://qiita.com/qr_gho_staff/items/5ef26b0a6a353bfd4b47)
- [果たして JavaScript で演算子オーバーロードは可能なのか](http://tkengo.github.io/blog/2015/06/30/operator-overload-in-javascript/)
- [JavaScriptは演算子オーバーロードの夢を見るか ](http://alucky0707.hatenablog.com/entry/2013/07/19/033100)

みんな`valueOf`を使い(悪用)しようと足掻くがあまりうまく行かない上、言語の動作に悩まされているようだ。
結論としては構文解析をするのが一番だと言っている、まあ順当な結論に見えるが本当に可能か?

## C++の演算子オーバーロードとは
演算子オーバーロードといえばC++ということでC++はどうしているかというと型を解決しています。

```c++:add.cc
T operator+(const T &left, const T &right);
```
みたいな定義があっても演算できないクラス同士で実装しようとすればコンパイルエラーになります。
JavaScriptに戻って考えると弱い動的型付けという非常に方という概念が弱い、つまりそれぞれの型にあった処理を選べるのか？というとまず、トランスパイル処理では型を推論するのはほぼ不可能だろう。そもそも型による処理の切り分けができないJavaScriptでは同じ関数で処理を分けるのが非常に難しい。内部で型チェックをするぐらいしかアイデアがない...、すべての演算子にそういった処理を埋め込むのは現実的ではないだろう。

## WebAssemblyは解決になるか？
すべての処理をC++でかけるなら解決の一つになるかもしれないがWebAPIを叩けない現状でそれは不可能だ。C++はコンパイル時に型解決できてないとならないのでwasmにする時にどういった方が使えるかは決まってしまう。それを型のゆるいJavaScriptで使おうとすると...怖い。
ブラウザでどんな言語も扱えるような印象のあるWebAssemblyだが実際は吐かれる中間のアセンブラに精通している必要がある気がする。もちろんプラクティスが溜まってある程度安全に扱えるようになれば使えるかもしれないが、まだ探り探りやっている印象である。

# その他
TypeScriptは型があるので演算子オーバーロードができるかと思ったが情報は見つからなかったのでないと思われる。
[JavaScriptでASTを使ってコードをインジェクションしてみる](https://qiita.com/erukiti/items/e01b1b2f904f4fb2000e)でうまい解決はできるんだろうか？
トランスパイル時に置き換えるにしても数値計算はどうしても`for( let i=0; i<n; i++ )`の形になるのですべて置き換えるのは可読性に大きな影響を与えそうである。
結局、ちまちま頑張るのが一番だと思います。
[Survey] Kaggle - Carvana 3位解法まとめ

Kaggle - Carvana Image Masking Challenge[^1]の3位解法[^2]の調査記事です．

3rd place solution (U-Net + Dilated Conv)
Name: lyakaap
Kaggle Discussion: https://www.kaggle.com/c/carvana-image-masking-challenge/discussion/40199
Code: https://github.com/lyakaap/Kaggle-Carvana-3rd-place-solution

## Model

![image.png](https://qiita-image-store.s3.amazonaws.com/0/107399/3e227366-2279-71ea-3600-a0f61c449c7e.png)

- 1536x1024と1920x1280の二種類
- 最良モデル(スコア: 0.997193)
	- パラメータ数: 約850万
	- KFold(CV=6)
	- TTAなし
	- アンサンブルはしていない
	- 1920x1280
- TTA(オリジナルと反転画像を平均)することで，0.997222を達成
- Optimizer: 
	- RMSProp(lr=0.0002)
	- ReduceLROnPlateau(0.2と0.5の２つでlrを調整)
- Data Augmentation:
	- 左右反転
	- 拡大縮小
	- 平行移動
	- HSVの変更
- BatchSize: 1
- 学習時間: 2日
- 損失関数: bce + dice loss
- アンサンブル:
	- 5つの平均(1536x1024)
	- 6つの平均(1920x1280)
	- ２つのモデル自体はLBで加重平均
- しきい値: 0.508(スコアが0.000001改善するらしい)
- Pseudo Labeling
- Cross validation: K-Fold

## References

[^1]: Kaggle, [Carvana Image Masking Challenge](https://www.kaggle.com/c/carvana-image-masking-challenge), 2017.
[^2]: lyakaap, [3rd place solution (U-Net + Dilated Conv)](https://www.kaggle.com/c/carvana-image-masking-challenge/discussion/40199), 2017.
最新のPHPに対応したDash用Docsetを作成する


# はじめに

開発用のマニュアル・リファレンス類を参照するのに便利な [Dash](https://kapeli.com/dash/) というツールがあります。
Mac専用ですが、Windows / Linux 向けに [Zeal](https://zealdocs.org/) や [Velocity](https://velocity.silverlakesoftware.com/) といったクローンも存在しており大変便利です。

Windows経験者であれば「CHMヘルプファイルを複数統合して拡張したようなもの」と言えばわかりやすいでしょうか。個人的にもCHMヘルプファイルは大変重宝していたので、代替として Dash / Zeal は手放せないツールです。

# 日本語のリファレンスが欲しい

熟読するマニュアル・リファレンスの類いは、内容を正確に把握するためにも母国語のものが欲しくなります。日本人ならお茶漬けやろ、というやつです（違

Dash は海外のツールですので日本語版の Docset（言語単位のリファレンスに相当）が公式サイトで公開されていません。先人の努力により日本語版を入手できる言語も[いくつか存在します](http://hitoriblog.com/?p=33657)が、PHPは現行の7.x系に対応しておらずリファレンスから最新の機能をキャッチアップできません。

# 無ければ作ろう！

という訳で、最新のPHP 7.x系に対応した日本語版の Docset を作る方法を考えました。

- オリジナルの英語版をベースにする（検索DBとファイル構成を継承する）
- 最新のマニュアルはPHP公式から入手したものをなるべく加工せずに差し替えたい
- 表示スタイルはなるべくPHP公式に寄せたい（見栄え、閲覧のしやすさ）
- 自分でビルドできる（ドキュメントのアップデートに追随しやすくする）

もっとも重視したのは「自分でビルドできる」ことです。
公式ドキュメントとDocsetの仕様が変わらない限り、メンテナーがいなくなっても各自が最新のマニュアルを使い続けられる環境が理想です。

# システム要件とビルドツール

拙作の [dash-phpdoc-ja](https://github.com/taka-tactical/dash-phpdoc-ja/) を使用します。
Windows / MacOS でのビルドを想定しており、各環境の必須要件は次の通りです。

1. MacOS
    　
    - PHP 5.4以上
    - Git
    - chmlib（CHMファイルの解凍に必要、[Homebrew](https://brew.sh/index_ja.html)で導入可）
    　
2. Windows
    　
    - PHP 5.4以上
    - [Git for Windows](https://git-for-windows.github.io/)
    - hh.exe
    - 基本的なUnixコマンドが動作する環境（[MSYS](http://www.mingw.org/wiki/MSYS) / [Cygwin](https://www.cygwin.com/) / BoW など）

MacOS Sierra（Git / chmlibをHomebrewで導入）および Windows 10（MSYS環境）でビルド確認済みです。

# ビルド手順

[dash-phpdoc-ja](https://github.com/taka-tactical/dash-phpdoc-ja/) を適当な場所に `git clone` してください。
基本的には、そのまま `php generate-php.php` するだけで必要なファイルのダウンロードとビルドが開始されます。

注意点として、多量のファイルを解凍・コピー・削除する関係からアンチウイルスソフトが動いていると「device busy」や「ファイルを削除できません」といったエラーの発生することがあります。この場合はアンチウイルスソフトの常駐をOFFにしてからビルドするとうまくいくはずです。

ビルド用のオプションを調整する必要がある場合は下記を参考にしてください。

1. Windowsでのビルド

    Windows上でビルドする場合は

    ```php
    // Windows
    //$cfg_chm  = 'hh -decompile %2$s %1$s';
    // Mac, Linux
    $cfg_chm  = 'extract_chmLib %1$s %2$s';
    ```

    の箇所を修正してください。
    コメントアウトされている hh.exe の記述を有効にしてMac用の記述をコメントアウトすればOKです。
    　
2. Open Sans フォントの扱い

    Chromium の表示異常を招く場合がある（Windows での Zeal 使用時など）ため Open Sans フォントをデフォルトで無効にしています。有効にするには、

    ```php
    $cfg_nosans = true;
    ```

    を false に変更してください。
    　
3. 言語選択

    デフォルトで ja に設定されており日本語の Docset を作成しますが、原理的には PHP の公式ドキュメントが対応している言語であれば指定可能です（ru / fr / de 等）。変更する場合は下記の箇所を編集してください。

    ```php
    $cfg_lang = 'ja';
    $cfg_ver  = '7.1';
    ```

    バージョン指定はメタデータ用です。
    ビューワによっては、Docset のタイトル表示に用いられる場合があります。

# 参考情報

- [Docset Generation Guide](https://kapeli.com/docsets)
- [PHP日本語版のDash用Docsetを作った (user notes付き)](http://www.miukoba.net/blog/2013/12/14/japanese-php-docset-for-dash/)
select2 で allowClear オプションだけを指定したときのエラー回避法

次のように `allowClear` オプションを指定すると

```JavaScript:application.js
$('.js-searchable').select2({allowClear: true})
```

次のエラーがでます。

```
select2.js?86fe:1809 Uncaught TypeError: Cannot read property 'id' of undefined
```

この場合 `placeholder` オプションも一緒に指定するとエラーを回避できます。

毎回、引数に `placeholder` を指定してもいいのですが、次のようにグローバルな初期値として指定しておく方が安心でしょう。

```JavaScript
$.fn.select2.defaults.set("placeholder", "")
```

## 参照

https://github.com/select2/select2/issues/3497
大枠

#大枠
- Ruby
<details>Rubyとは**サーバーサイドスクリプト**の一つでプログラミング言語であり、さらにスクルプト言語と分類できるものである。Ruby においては整数や文字列なども含めデータ型はすべてがオブジェクトであり、純粋なオブジェクト指向言語といえる。下記のRubyOnRailsというフレームワークを使用できるという最大のメリットがある。</details>

- RubyOnRails
<details>RubyOnRailsとは、Rubyで使える枠組み（**Webアプリケーションフレームワーク**）である。</details>

- HTML
<details> HTMLとは**クライアントサイドスクリプト**の一つでプログラミング言語ではない。Hyper Text Markup Language（ハイパーテキストマークアップランゲージ）の略で、ウェブ上で文書を記述して視覚構造や文章構造を定義するマークアップ言語。
HTMLでは、ウェブサイトで記載したい文書の他、画像等のデータといったコンテンツの配置などを定義する。
</details>

- CSS
<details>CSSとは、**クライアントサイドスクリプト**の一つでブログラミング言語ではない。Cascading Style Sheets（カスケーディングスタイルシート）の略で、ウェブサイトそのもののスタイルを定義するためのマークアップ言語。基本的には先程紹介したHTMLと組み合わせて利用することが多く、HTMLで定義した文章構造などを定義するのに対して、CSSで、文書を含めてウェブサイトとしてどの様に装飾するのかを定義する。</details>

- JS
<details>JavaScriptは、**クライアントサイドスクリプト**の一つで、ウェブサイト上でユーザーが特定の操作をした時に、どの様に動作し変化をさせるかを定義する言語。一方で、JavaScript、Javaという名称があるがJAVA言語とは異なる言語。HTMLとCSSでは、動的な表現ができず、JavaScriptでは静的な表現を動的に表現する。WEB開発を行うには、HTMLとCSSは必須</details>

######引用及び参考　
[SERVERTALK](https://rentubtalk.com/server-column/language/ )
[侍エンジニア塾](http://www.sejuku.net/blog/2958)
Microsoft Azureにログインして、ダッシュボードにたどり着く方法

普段Microsoft Azureをよく使っている人からすると、意味がわからない記事かもしれませんが、Azureをたまにしかつかわないユーザーからすると、久々にダッシュボードを開こうとすると、どこからたどり着けばよいか、わからなくなることがよくあります。

最近ようやくダッシュボードにたどり着く方法が分かったので、それをメモしておきます。
知っている人にはどうでもいい記事ですみません。

## Azureのホームページからログインする方法
右上の「ポータル」リンクを押すとダッシュボードにたどり着くことができます。
https://azure.microsoft.com/ja-jp/
<a href="https://azure.microsoft.com/ja-jp/" target="_blank"><img width="1417" alt="スクリーンショット 2017-10-07 19.22.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/199506/639ebbb1-a958-55b6-2129-a17ba0b8e5a4.png"></a>

ログイン方法がわかりづらい原因は、下記のようなものがあるのでしょう。

- 「ログイン」とか「サインイン」というリンクがどこにもない
- 「アカウント」というリンクを押してもログインできない
- 「ダッシュボード」という文言がどこにもない（実は「ポータル」を押すとダッシュボードにたどり着ける）
- 「無料アカウント」のリンクやボタンが目立ちすぎる

中には、毎回無料アカウントボタンを押して、ログイン画面にたどり着き、無料期間切れのエラーを起こしてからダッシュボードにたどり着くという方法をとっている人もいましたが、時間がかかるのでオススメしません。

トップ画面はぜひ改善していただきたいですね。

## URLからログインする方法
下記のURLをブックマークしておくと、ログインが必要な場合はログイン画面にリダイレクトしてくれます。
https://portal.azure.com
angular-cliで作成したプロジェクトにelement-angularを適用する

「AngularでもElement UIを使いたい」というそんなあなたに。
Vue.js界隈では人気らしいUIコンポーネントライブラリのAngular実装があるようなので、angular-cliと合わせて使ってみます。

[eleme/element-angular](https://github.com/eleme/element-angular)

## 前提

この記事の内容を試した際のangular-cliのバージョンは、次の通りです。

```
$ ng version
@angular/cli: 1.4.1
node: 8.1.3
os: darwin x64
```

element-angularはまだまだBeta版らしいです。

```json:package.json
"element-angular": "0.0.4-beta.3"
```

## 準備

### ベースのプロジェクトを作成
まずは、angular-cliでベースとなるプロジェクトを作成します。

```
$ ng new element-angular-handson
```

### element-angularをインストール

公式の [Getting Started](https://github.com/eleme/element-angular#getting-started) 通りにインストールしていきます。

本体のインストール

```
$ npm i --save element-angular
```

app.module.tsでElModuleをインポート

```typescript:app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { ElModule } from 'element-angular'; // 追加

import { AppComponent } from './app.component';

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    ElModule.forRoot() // 追加
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }
```

style.cssでelement UIのCSSをインポート

```css:style.css
@import "~element-theme-default";
```

## 実際に試してみる

ここまでの手順で一通りのelement UIのコンポーネントが使えるようになっています。

```html:app.component.html
<el-menu class="el-menu-demo" mode="horizontal">
  <el-menu-item index="1">Toolbar</el-menu-item>
  <el-submenu index="2" title="menu">
    <el-menu-item index="2-1">item1</el-menu-item>
    <el-menu-item index="2-2">item2</el-menu-item>
    <el-menu-item index="2-3">item3</el-menu-item>
  </el-submenu>
  <el-submenu index="3" title="menu2">
    <el-menu-item index="3-1">item1</el-menu-item>
    <el-menu-item index="3-2">item2</el-menu-item>
    <el-menu-item index="3-3">item3</el-menu-item>
  </el-submenu>
  <el-menu-item index="4"><a href="https://github.com/eleme/element-angular" target="_blank">Link</a></el-menu-item>
</el-menu>

<h1>てすと</h1>
<el-button>Button</el-button>
```

`npm start`で開発サーバーを起動しhttp://localhost:4200を確認すると...
次のようにツールバーが表示されます。

![スクリーンショット 2017-10-07 18.37.39.png](https://qiita-image-store.s3.amazonaws.com/0/79414/4fdd6cb9-53ba-6bb0-be33-c7687bf4dde0.png)

## 所感

まだBeta版ということもあり、多言語対応やロケール設定などに対応していないようです。
試しにDatePickerを使ってみましたが、曜日表記が中国表記固定になのでつらみを感じました。
ロケールを気にせず使える部分は、Vue.js版のElement UIと遜色なく使える印象です。

以上です。
Google Apps ScriptをTypeScriptで書いてWebpackでbundleする


タイトルの通り。
[Google Apps Script](https://developers.google.com/apps-script/)を[TypeScript](https://www.typescriptlang.org/)で書いて[Webpack](https://webpack.js.org/)でbundleするexampleを書きました↓

[gas-typescript-webpack](https://github.com/naoki-sawada/gas-typescript-webpack)

# 特徴

* TypeScript を使った型あり言語での開発
* Webpack を使って最終的に一つのファイルに bundle する
* [clasp](https://github.com/google/clasp)を使った Apps Script へのファイルのプッシュ
* watch オプションつき

# 使い方

## 1. サンプルソース を clone する

gitからサンプルソースである [`gas-typescript-webpack`](https://github.com/naoki-sawada/gas-typescript-webpack) をcloneします。

```
$ git clone https://github.com/naoki-sawada/gas-typescript-webpack.git
```

その後、以下のインストールを実行します

```
$ cd gas-typescript-webpack
$ npm install
```

## 2. clasp の設定

### 2.1 インストール

Google Apps Script をローカルで開発するために [clasp](https://github.com/google/clasp) をインストールをします。


```
$ npm i @google/clasp -g
```

### 2.2 Google アカウントでログインする

次のコマンドを実行して、Google アカウントの認証を行います。

```
$ clasp login
```

### 2.3 Apps Scirpt の作成

次のコマンドを実行して、新規に Apps Scirpt を作成します。

```
$ clasp create "My Script" --rootDir ./dist
```

# 開発する

webpackでビルドする

```
$ npm build
```

ビルドしたファイルをプッシュする

```
$ npm run push
```

# 継続的に開発する

```
$ npm run watch
```

`watch` オプションを使えば、`src`フォルダ内のファイルの変更を自動で検知し、 `build` と `push` を自動的に行います。


# 参考

* [TypeScript で Google Apps Script を書く環境を整備する](https://hori-ryota.com/blog/googleappsscript-by-typescript/)
* [Google Apps Script の TypeScript 型定義ファイルを作った](http://motemen.hatenablog.com/entry/2015/06/google-apps-script-typescript-dts)
* [webpack+ES2015でモダンGoogle Apps Script開発](http://dackdive.hateblo.jp/entry/2017/05/01/202717)
[jQuery] スタイルを変更するメソッド

## css
スタイルの変更を行うメソッド

### 書き方
```js
jQueryObject.css('プロパティ名','値');
```

### サンプル
```js
$('.className').css('background-color', 'red');

// まとめてスタイルを指定する場合 （ハッシュオブジェクト形式でまとめて書く）
$('.className').css({
    backgroundColor : 'red',
    display : 'block',
    opacity : 0.5
});
```
プロパティ名をダブルクォーテーションで囲って指定した場合、
cssで使用しているプロパティ名と同様の記述で指定が可能。

プロパティ名をダブルクォーテーションで囲わない場合、
プロパティ名をキャメルケースで記述（'background-color' → backgroundColor）する必要がある。


### ドキュメント
- [css リファレンス](http://semooh.jp/jquery/api/css/css/name%2C+value/)



## show / hide
要素の表示／非表示（disiplay: block; , disiplay: none;）を変更するためのメソッド。

### 書き方
```js
jQueryObject.show(); // 表示（disiplay: block;）
jQueryObject.hide(); // 非表示（disiplay: none;）
```

### サンプル
```js
$('.className').show();
$('.className').hide();

// 引数に数字を入れると指定された時間（ミリ秒）をかけて表示／非表示を行う
$('.className').show(500);
$('.className').hide(1000);
```
もともとの要素のdisplayの値を尊重します。
単純にdisplay : block; none の値を切り替えているのではなく、
その要素が元々持っているdisplayプロパティを記憶してくれており、
再び表示する際はそのプロパティに戻す、という動作をしてくれる。

例えばspan要素はもともとのdisplayの値はinlineのため、
一度noneにして非表示にして、再び表示する際は blockではなく、
inline-block の値に切り替えて表示を行う。


### ドキュメント
- [show リファレンス](http://semooh.jp/jquery/api/effects/show/_/)
- [hide リファレンス](http://semooh.jp/jquery/api/effects/hide/_/)

## width / height
要素の幅、高さを指定するメソッド。

### 書き方
```js
jQueryObject.width(幅);
jQueryObject.hide(高さ);
```

### サンプル
```js
$('.className').width(300);
$('.className').height(300);

// ピクセル以外の単位指定をしたい場合はシングルクォーテーションで囲んで指定を行う
$('.className').width('3em');
$('.className').height('auto');
```
jQueryでは何も単位の指定が無い時は'px'が自動的に補完されている様になっている。

### ドキュメント
- [width リファレンス](http://semooh.jp/jquery/api/css/width/_/)
- [height リファレンス](http://semooh.jp/jquery/api/css/height/_/)

## 参考ドキュメント
- [jQuery日本語リファレンス | CSS](http://semooh.jp/jquery/api/css/)
- [jQuery日本語リファレンス | Effects](http://semooh.jp/jquery/api/effects/)
aws cli で DynamoDB を使う

city という名前のテーブルを作成

```bash:go_create.sh
aws dynamodb create-table --table-name 'cities' \
--attribute-definitions '[{"AttributeName":"key","AttributeType": "S"}]' \
--key-schema '[{"AttributeName":"key","KeyType": "HASH"}]' \
--provisioned-throughput '{"ReadCapacityUnits": 5,"WriteCapacityUnits": 5}'
```

データの挿入

```bash:go_insert.sh
TABLE='cities'
aws dynamodb put-item --table-name $TABLE --item '{ "population": { "N": "38164" }, "date_mod": { "S": "1950-6-22" }, "key": { "S": "t0924" }, "name": { "S": "足利" } }'
#
aws dynamodb put-item --table-name $TABLE --item '{ "population": { "N": "72391" }, "date_mod": { "S": "1950-8-30" }, "key": { "S": "t0925" }, "name": { "S": "日光" } }'
#
aws dynamodb put-item --table-name $TABLE --item '{ "population": { "N": "56148" }, "date_mod": { "S": "1950-9-7" }, "key": { "S": "t0926" }, "name": { "S": "下野" } }'
#

```

データのスキャン

```bash
aws dynamodb scan --table-name cities
```

キーを指定してデータの取得

```bash
aws dynamodb get-item --table-name cities  --key '{ "key": {"S": "t0926" }  }'
```

キーを指定してデータの削除

```bash
aws dynamodb delete-item --table-name cities  --key '{"key": {"S": "t0924"}}'
```

テーブルの削除

```bash
aws dynamodb delete-table --table-name cities
```

レコード数のカウント

```bash
aws dynamodb scan --table-name cities --select "COUNT"
```

テーブル名の取得

```bash
aws dynamodb list-tables
```

テーブルに関する情報の取得

```bash
aws dynamodb describe-table --table-name cities
```

## バックアップ ##

バックアップの作成

```bash
TABLE="cities"
aws dynamodb create-backup --table-name $TABLE \
	--backup-name $TABLE"-Backup"
```

バックアップの一覧

```bash
aws dynamodb list-backups
```

別テーブルにリストア

```bash
TARGET="cities2"
#
aws dynamodb restore-table-from-backup \
	--target-table-name $TARGET \
--backup-arn arn:aws:dynamodb:ap-northeast-1:372407516321:table/cities/backup/01658017317622-d319e000
```

バックアップの削除

```bash
aws dynamodb delete-backup \
--backup-arn arn:aws:dynamodb:ap-northeast-1:372407516321:table/cities/backup/01658017317622-d319e000
```

## ローカルに立てた DynamoDB を取り扱う時 ##
テーブル名の取得

```bash
aws dynamodb list-tables --endpoint-url http://localhost:8000
```

データのスキャン

```bash
aws dynamodb scan --table-name cities --endpoint-url http://localhost:8000
```

次のバージョンで確認しました。

```text
$ aws --version
aws-cli/2.7.12 Python/3.9.11 Linux/5.15.0-25-generic exe/x86_64.ubuntu.22 prompt/off
```
LaTeXのAppendixの表記を変更する

修論をLaTeXで書いていたところ、Appendixの"付録"表記が気に入らなかったので"Appendix"表記に変更しました。

プリアンブルに次のように書くだけです。

```tex:
﻿\renewcommand{\appendixname}{Appendix }
```

今まで"付録A"となっていたのが、"Appendix A"と表記されるようになりました。

ところが`\tableofcontents`で目次をつけると、Appendixと書いてある部分とチャプター名が重なってしまうことに気が付きました。

そこでdocumentclassをjbookからjsbookにしたところ、チャプター名と被ることはなくなりました。
少しレイアウトが崩れる以外は問題なしです。
オフラインリアルタイムどう書くE18の問題をRubyで解く

問題はこちら
http://nabetani.sakura.ne.jp/hena/orde18twintri/
処理遅いです。

```rb
def make_tri(pat)
  pat =~ /(\d+),(\d+)([RLTB])(\d+)/
  x = $1.to_i
  y = $2.to_i
  dx,dy = {'R'=>[-1,0],'L'=>[1,0],'T'=>[0,1],'B'=>[0,-1]}[$3]
  h = $4.to_i
  tri = [[[x,y]]]
  (h-1).times{|i|
    w = tri[-1].clone
    if dy == 0
      w.unshift([w[0][0],w[0][1]-1])
      w.push([w[-1][0],w[-1][1]+1])
    else
      w.unshift([w[0][0]-1,w[0][1]])
      w.push([w[-1][0]+1,w[-1][1]])
    end
    tri << w.map{|x,y| [x+dx,y+dy]}
  }
  tri.flatten(1)
end

def solve(q)
  a,b = q.split('/')
  a_t = make_tri(a)
  b_t = make_tri(b)
  (a_t&b_t).size
end

DATA.readlines.each do |line|
  no,q,a = line.strip.split(/\s+/)
  ans = solve(q)
  print no + "\t" + ans.to_s
  puts ans == a.to_i ? ' o' : ' x'
end
__END__
0	7,0R6/3,1B5	15	
1	1,6L4/4,9R9	4	
2	0,2R4/1,3B4	3	
3	1,2L4/1,2L5	16	
4	3,2L5/5,6B4	8	
5	4,1B3/6,3B4	4	
6	4,4R7/4,3R5	20	
7	4,5R9/0,7T3	7	
8	4,7T9/1,6T3	1	
9	4,8B7/3,7L4	10	
10	5,3L3/9,8L4	0	
11	5,6B4/4,4R2	3	
12	5,6B4/8,5R4	8	
13	5,8B9/5,2L2	4	
14	6,1L5/7,1T2	3	
15	7,2B4/7,2T4	1	
16	7,3T9/9,6L6	11	
17	8,0R6/8,1R7	30	
18	0,4R7/4,6R10	36	
19	10,4L4/9,1T6	9	
20	2,2T7/6,7T10	4	
21	2,7R4/1,6L8	2	
22	3,0R10/1,2T7	7	
23	3,5T2/3,6B10	2	
24	4,7R10/8,2T8	6	
25	6,8B10/4,5B6	36	
26	9,2B7/1,1B10	6	
27	9,3R14/2,4R1	1	
28	3,0R10/0,6B10	54	
29	4,10T8/4,10T8	64	
30	1,5T10/1,20B10	56	
31	15,16L4/5,12L12	4	
32	12,11T18/7,18R18	34	
33	15,16T14/5,12L15	44	
34	5,10L40/22,22B10	100	
35	46,34T34/34,29T14	30	
36	52,75L12/88,69T54	0	
37	67,83B70/99,48T14	52	
38	291,11T120/258,54B130	424	
39	62,170L139/133,172R21	441	
40	98,189B116/183,127R27	240	
41	646,684B96/435,690R772	0	
42	113,668L866/581,859L852	158404	
43	309,321B162/137,420B423	15750	
44	5474,6459R9089/8177,150R5120	376996	
45	2399,1640B2451/1718,2100L1623	221334	
46	5621,8460T7612/2715,5697L8851	861192	
```
ansible-scaffold 書いてみた

http://docs.ansible.com/ansible/latest/playbooks_best_practices.html

上記の通りにディレクトリを作成するスクリプト

```ansible-scaffold.sh
#!/bin/sh

function usage() {
    echo "ansible-scafolld.sh scaffold p1 base_dir [role1,role2,....]"
    echo "ansible-scafolld.sh scaffold p2 base_dir production,staging,.... [role1,role2,....]"
    echo "ansible-scafolld.sh addrole base_dir role1,role2,...."
    exit 0
}

function scaffold() {
    echo "execute ${FUNCNAME[0]}"
    shift
    type=$1
    shift

    eval scaffold_${type} $*
}

function scaffold_p1() {
    base_dir=$1
    roles=$2

    mkdir -p ${base_dir}/{group_vars,host_vars}
    mkdir -p ${base_dir}/{library,module_utils,filter_plugings}
    touch ${base_dir}/{production,staging}

    touch ${base_dir}/site.yml

    mkdir -p ${base_dir}/roles

    if [ ! -z ${roles} ]; then
        scaffold_role ${base_dir} ${roles}
    fi
}

function scaffold_p2() {
    base_dir=$1
    envs=$2
    roles=$3

    IFS_ORG=${IFS}
    IFS=","

    mkdir -p ${base_dir}/inventories/{${envs}}/{group_vars,host_vars}
    touch -p ${base_dir}/inventories/{${envs}}/hosts

    mkdir ${base_dir}/{library,module_utils,filter_plugins}
    touch ${base_dir}/site.yml

    if [ ! -z ${roles} ]; then
        scaffold_role ${base_dir} ${roles}
    fi
}

function addrole() {
    echo "execute ${FUNCNAME[0]}"
    shift
    scaffold_role $*
}


function scaffold_role() {
    base_dir=$1
    roles=$2

    IFS_ORG=${IFS}
    IFS=","
    for role in ${roles}
    do
        mkdir -p ${base_dir}/roles/${role}/{tasks,handlers,templates,files,vars,defaults,meta,library,module_utils,lookup_plugins}
        touch ${base_dir}/roles/${role}/{tasks,handlers,vars,defaults,meta}/main.yml
    done
}

#
# main
#
eval $1 $*

exit 0
```

細かいところは、、、
みなさん、Ansible を使うときにディレクトリやファイルはどうしてるんでしょうか。気になります
Beamerで画像挿入する時、図がずれる問題

プレゼン用スライドをBeamerで作っていたところ、図がなんでかずれる。
`\centering`で中央揃えしてもずれる。
上下方向もよくわからん空白が入る。


という感じで困っていたんですが、原因がわかりました。
参考にしたのはこちら↓
[日本人のための LaTeX タブー集 ～画像読込編～](qiita.com/zr_tex8r/items/5413a29d5276acac3771)


これのタブー②を見ると

```tex
\includegraphics[bb=0 0 800 600]{sample.jpg}
```

のように、bbオプションを設定していたのが原因のよう。
extractbbでxbbファイルを作り、

```
$ extractbb sample.jpg
```

bbオプションを消したら見事に解決しました。

```tex
\includegraphics{sample.jpg}
```

めでたしめでたし。


いちいちxbbファイル作るのも面倒だけど、どうにかならないかなあ…。