OmniAICreator/Qiita-1.07M huggingface dataset:
Python3の割り算は常にfloatで返る

チラ裏なので1分で読めます

![スクリーンショット 2018-08-12 12.34.32.png](https://qiita-image-store.s3.amazonaws.com/0/213915/fc17b37c-3d99-aca4-bf3f-9e093e499be9.png)
図：予想外の挙動を見せる割り箸

## いったい何です
### python2
(int型)÷(int型)=**(int型)**

### python3
(int型)÷(int型)=**(float型)**

---

型が異なります、マジか〜〜〜

## Python2系での割り算

```shell:Python2
>>> 12/5
2
>>> type(12/5)
<type 'int'>

>>> 12.0/5
2.4
>>> type(12.0/5)
<type 'float'>
```

とまあ，一般的というか、int型同士の除算は小数点以下切り捨て、出力は商になります。
型もintです。
（どちらか一方でもfloat型だった場合、float型で返ります）

## Python3系での割り算
対してPython3でのint型同士の割り算


```shell:Python3
>>> 12/5
2.4
>>> type(12/5)
<class 'float'>

>>> 10/5
2.0
>>> type(10/5)
<class 'float'>
```

割り算の結果は全てfloat型で返ります。
四則演算の挙動が違う、驚愕の仕様でございます。


## おまけ
Python3でも`/`の代わりに`//`を使用することで、小数点以下切り捨ての除算(商の計算)ができます。


```python:Python3
>>> 12//5
2
>>> type(12//5)
<class 'int'>
```

ただし
`//`を使用するとfloat型同士の計算でも切り捨ててしまうので、一括で置換する際は注意が必要です。
（型はfloatなのに切り捨ててるので尚のこと注意）

```python:Python3
>>> 12.0//5.0
2.0
>>> type(12.0//5.0)
<class 'float'>
```


以上、メモでした。

---

### 追記
数年越しに加筆修正してて気付いたのですが、Python3のほうが出力の型が統一されてる上に情報の欠損少なくて良い気がしますね
intで切り捨てしたいとき(商を求めたいとき)は`result = int(int_a / int_b)`とか`math.floor()`でキャストしてあげればいいだけですし
（マイナスの場合結果が異なるのでご注意を）

組み込み関数の`divmod()`という手もありますね

執筆時は「勝手に変換すんなよー！」とか思って書いた気がします、青いですね
TensorFlowのメモ

＜モデルの定義＞
１．まずライブラリを呼び出す。
import tensorflow as tf
で読み込む。

２．モデル構築
定数を定義する場合には、
tf.constant（定数, name='定数の名前'）

初期値のある変数を定義する場合には、
tf.Variable(初期値, name='変数の名前')
で定義する。

初期値がないものの、最初に型と形を決めておく時は、
tf.placeholder(型（tf.init32など）, name="名前")

変数に値を入れる場合（下記の例では、xにaを代入する場合）には、
tf.assign(x, a)

すべての変数を初期化（モデルを構築した後に実施）：
tf.global_variables_iniializer()

加算
tf.add(x, y)
乗算
tf.multiply(x, y)

＜実行フェーズ＞
変数の初期化

with tf.Session() as sess:
   sess.run(init)

tf.placeholderに対して、値をfeedしてやる場合。
sess.run(x, feed_dict={y, a})
…
placeholderのキーyに対してaをフィード。placeholderが呼ばれる演算がx

※上記内容はあくまでメモであり、正確性を欠いている可能性がありますので、ご注意ください。
Mysqlのgrant文でユーザ作成&権限付与しようとしてエラーが出たのでメモ

まず以下のように書いた。

mysql> grant all privileges on DB名.* to 'user'@'localhost' identified by 'password';

するとと以下のようなエラーが出た。

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'identified by 'password'' at line 1

mysqlのバージョンが8に変わって構文が変わったらしく、以下のようにユーザを作成してから、権限を与えると上手くいった。
mysql> create user 'user'@'localhost' identified by 'password';
mysql> grant all privileges on DB名.* to 'user'@'localhost';
zsh の prezto の sorin テーマのプロンプトの右端に表示されるインジケータの意味

![sorin prompt](http://i.imgur.com/nrGV6pg.png)

sorin[^1]テーマの右端に出てくるやつらは一体何なのか。
よくわからないものもありますが、ソース[^2]を見た範囲でまとめます。
間違っていたら教えてやってください。

[^1]: 何度も他のテーマに変えてはみるけど、いつのまにか`sorin`テーマに戻って来るんすよね。

[^2]: `~/.zprezto/modules/prompt/functions/prompt_sorin_setup`

# git 関連

| インジケータ     |       意味          |備考                |
|:---------------:|:-------------------|:-------------------|
| master（とか）   |今いるブランチ   |                    |
|✱               |ステージングしてない変更ファイルあり | `git add`すると✚に変化|
|◼             　|`git`で管理してないファイルあり|`git add`すると✚に変化 |
|✚               |コミットしてないファイルあり |`git commit`すると⬆に変化 |
|⬆     　        |`push`してないファイルあり |`git push`すると消える   |
|⬇     　        |今の作業ツリーがbehind？   |behind                    |
|✭            　 |スタッシュあり 　　　|`git stash pop`すると消える |
|✖      　        |`git rm`したものあり？               |deleted     |
|➜      　      |`git mv`したものあり？            |renamed          |
|═      　      |今`merge`してないブランチにいる？   |unmerged      |
|      　        |不明               |action                    |
|      　        |不明               |commit                    |
|      　        |不明               |position                    |
|      　        |不明               |keys                    |

# その他

| インジケータ     |       意味          |備考                |
|:---------------:|:-------------------|:-------------------|
| ✘               |前回のコマンドが失敗した|右の数字は exit status|
| ♺            　 |不明　　　            |overwrite         |
|              　 |python info?         |virtualenv         |


# テーマの変えかた

ちなみに、テーマを変えたいときは`~/.zpreztorc`ファイルに追加。
こちらの環境では119行目あたり。

```sh:~/.zpreztorc
113 # Prompt
114 #
115
116 # Set the prompt theme to load.
117 # Setting it to 'random' loads a random theme.
118 # Auto set to 'off' on dumb terminals.
119 zstyle ':prezto:module:prompt' theme 'sorin'
120
```

盆休みにgitと戯れる日々はつづく。

# 参考

[ prezto - The configuration framework for Zsh](https://github.com/sorin-ionescu/prezto)
[Zsh + Prezto で快適コマンド環境を構築する](https://dev.classmethod.jp/tool/zsh-prezto/)
CSS: キーフレーム内で!important付けた宣言は無視される

[MDNの@keyframesの解説](https://developer.mozilla.org/en-US/docs/Web/CSS/@keyframes#!important_in_a_keyframe)に「キーフレーム内で`!important`が付けられた宣言は無視される」とあるものの、どういう意味なのか分かりませんでした。
「詳細度(優先順位)を上書きする効果がなくなる」という意味なのかと思ったら、「そのスタイル指定がまったく働かなくなる」という意味でした。

```css
@keyframes important {
  50% {
    width: 300px !important; /* スタイル指定が無視される */
    background: lightgreen; /* こちらは問題なし */
  }
}
```

<p data-height="265" data-theme-id="dark" data-slug-hash="VBgEmx" data-default-tab="css,result" data-user="sutara79" data-pen-title="CSS: Declarations in a keyframe qualified with !important are ignored" class="codepen">See the Pen <a href="https://codepen.io/sutara79/pen/VBgEmx/">CSS: Declarations in a keyframe qualified with !important are ignored</a> by Yuusaku Miyazaki (<a href="https://codepen.io/sutara79">@sutara79</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
B-CASカードについて解説

#はじめに
テレビを買うとB-CASカードを刺しますよね。B-CASカードって何をやっているんでしょう。また、wowwowやCS等、契約しないと見られないですがどのように契約者情報を管理しているのでしょうか。

#デジタルテレビの暗号の仕組み

![GGZN0214.png](https://qiita-image-store.s3.amazonaws.com/0/272771/dd5354c2-73ee-4836-8341-200e9ac87744.png)
*gigazine経由、三才ブックス「ゲームラボ」6月号19ページより、「B-CASカードによる暗号解除の流れ」*

映像信号はMPEG2のTS(トランスポートストリーム)という映像・音声多重化フォーマットに従って流れてきますが、映像信号などは暗号化されています。暗号化されているので鍵がないとTVを視ることができません。

この映像信号を復号する鍵はKs(スクランブルキー)と呼びます。
Ksは番組ごとに異なります(同じでも良い)。

このKsはどのように入手するのでしょうか？それを知るためにB-CASカード内部に話を移していきます。

B-CASカード内部にはKm(マスターキー)というB-CASカード毎に異なるKmキーが入っています。
このKmはEMMを復号するための鍵となっています。放送局側はすべてのB-CASカードのKmを把握しています(放送局と受信者の共有鍵)。

EMMとはTSに重畳されてくるパケットです。例えばwowowと契約すると、wowowからEMMが契約したB-CASカードのためだけのパケットを送ってくれます。
それをKmで復号すると、契約者情報とKw(ワークキー)が入っています。契約者情報はB-CASカード内のストレージに格納します。Kwキーは放送局ごとに異なる鍵で、ECMを復号するための鍵です。

ECMもTSに重畳されてくるパケットです。ECMは番組の映像信号を解くための鍵、Ks(スクランブルキー)が格納されています。ECMには日時情報が入っているため、有効期限切れを起こしていないかをB-CASカード内部で判定し、有効期限が切れていた場合はKsをTV側に供給せず、したがって映像信号を複合できない仕組みになっています。

まとめると以下となります。

|暗号化単位|キー|説明|
|--------|----|---|
|B-CAS単位|Km(マスターキー)|B-CASカードごとユニーク。B-CASカード内に最初から入っている。EMMを複合するための鍵|
|放送局単位|Kw(ワークキー)|EMMの中に入っている。ECMを複合するための鍵|
|番組単位|Ks(スクランブルキー)|ECMの中に入っている。番組ごとの映像信号を複合するための鍵|

TV視聴にはEMM/ECMを受信する必要があります。そのためTVの電源を消している間もチューナーは動いていて、EMM/ECMを裏で受信し続けています。

#不正視聴対策
なんらかの事情で不正視聴されていると知った場合、放送局側は新しいKw(ワークキー)をEMMに乗せて対象B-CASカード向けに送信します。

新しいKwを入手しないとECMが複合できず、よって映像信号を複合するためのKs(スクランブルキー)が手に入らず、視聴できないことになります。

[wowow 更新信号について](https://www.wowow.co.jp/support/faq/detail.php?cd=2&sub=75)
[スカパー チューナーの設置・設定が完了しても、有料チャンネルが視聴できません](https://helpcenter.skyperfectv.co.jp/articles/knowledge/AID1141?category=helpcenter.Category9&selectedService=)

wowow、スカパーのFAQを見ると、
・みたい放送局を30分以上選局する → その放送局のEMMを受信するためです。放送局は契約したすべてのB-CAS宛に30分以内に送信をし、それを繰り返していることが読み取れます。

EMMはパケットが小さいのだろうけど、億を超えるであろうB-CASカード宛にパケットを送るのは非現実的に思えます。何か工夫してるんでしょうね。

#Ks(スクランブルキー)の変更について
HDMIは確か40sec毎に映像信号の鍵を変えていましたが、ECMはおそらく放送局固有になってそうです。B-CASカードを抜いても映像は見られますからね。


#感想
ややこしいですね。


#参考
[【gigazine】B-CASカードを有料放送見放題カード「BLACKCAS」にする手順が判明するまでの経緯まとめ、一体ネット上で何が起きたのか？](https://gigazine.net/news/20120518-b-cas-card/)

[【ブログ】B-CASカード...](https://s.webry.info/sp/michi0103.at.webry.info/201210/article_23.html)

[B-CASカードの仕組み](http://www.1000web.net/b-cas/)

[【はてな】B-CASカード技術的なことをしらべてみた](https://anond.hatelabo.jp/20120520150244)
　*昔の自分が書いたような気が、、、*

[B-CAS 方式](https://sehermitage.web.fc2.com/security/b_cas.html)

#履歴
2018/08/12 初版
Prism 6.3でAOPを使う方法

# 問題
Prism 6.3 + Unityを使用していて、AOPをやろうと思い、最新のUnity.Interceptionパッケージ 5.5.3をNugetから取得。しかし、AOPのクラスが参照できない。

# 解決方法
Prism6.3で参照しているUnityが古いことが判明。Interceptionパッケージ 4.0.1をNugetから取得することで解決。
どうやらPrism6.3は４系のUnityと依存関係がある様子。
さらには４系と５系で破壊的変更が起きているようで名前空間が違う。

４系
~~~ C#
Microsoft.Practices.Unity.InterceptionExtension
~~~

５系

~~~ C#
Unity.Interception
~~~

サンプルコード。PrismのBootStrapper。jobsRepositoryのメソッド呼び出し時にLogBehaviorを呼ぶように設定。サンプルコードなので、CreateShellでjobsRepositoryを呼び出していますが、実際にはこんなところで呼び出しません。

~~~ C#
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.InterceptionExtension;

    class Bootstrapper : UnityBootstrapper
    {
        protected override DependencyObject CreateShell()
        {

            Container.AddNewExtension<Interception>();
            Container.RegisterType<jobsRepository>(new Interceptor<VirtualMethodInterceptor>()
                                         , new InterceptionBehavior<LogBehavior>());

            var jobsRepo = Container.Resolve<jobsRepository>();
            jobsRepo.GetJobs();
            return Container.Resolve<MainWindow>();
        }
     }
~~~

~~~ C#
using Microsoft.Practices.Unity.InterceptionExtension;

    public class LogBehavior : IInterceptionBehavior
    {
        public bool WillExecute => true;

        public IEnumerable<Type> GetRequiredInterfaces()
        {
            return Enumerable.Empty<Type>();
        }

        public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
        {
            Debug.WriteLine("開始: " + input.MethodBase.Name);

            var result = getNext()(input, getNext);

            Console.WriteLine($"終了:{input.MethodBase.Name}");

            return result;
        }
    }
~~~
React.js で setState が undefined

備忘録。

TypeScript + React.js で書いていると

> TypeError: Cannot read property 'setState' of undefined

とのエラーが出た。

# もとの(エラーが出た)コード
```tsx
interface IState {
    message: string
}

class App extends React.Component<{}, IState, any> {
    constructor(props: {}) {
        super(props)
        this.state = {
            message: "The button has not been clicked yet."
        }
    }

    public render() {
        return (
            <button onClick={ this.onClickButton }/>
            <p>{ this.message }</p>
        )
    }

    private onClickButton() {
        this.message = "The button has been clicked!"
    }
}
```

# 対応
2つ方法があるらしい。

## 1つめ
`bind`する

```tsx
constructor() {
    super(props)
    this.state = {
        message: "The button has not been clicked yet."
    }
    this.onClickButton = this.onClickButton.bind(this)
}
```

参考: [Reactで Uncaught TypeError: Cannot read property 'setState' of undefined と怒られる場合の対処法](https://qiita.com/massa142/items/16d51b32c12542476b91)

## 2つめ
アロー関数にする

```tsx
private onClickButton = () => {
    this.setState({
        message: "The button has been clicked!"
    })
}
```

参考: [this.setState is undefined (Stack Overflow)](https://stackoverflow.com/questions/39210971/this-setstate-is-undefined)
[個人的メモ]WPF Tips

# はじめに
本投稿は自身のメモとして書いたもので、散文になっています。適宜Tipsを追加していく予定です。

## コントロールに初期値を設定する

下記はTextBoxに設定する例。とりあえず、App.xamlに記述。BasedOnプロパティが設定の肝。

~~~ xml
    <Application.Resources>
        <ResourceDictionary>
            <Style x:Key="BaseTextBoxStyle" TargetType="TextBox">
                <Setter Property="Background" Value="Azure" />
                <Setter Property="VerticalAlignment" Value="Bottom" />
            </Style>

            <Style BasedOn="{StaticResource BaseTextBoxStyle}" TargetType="TextBox" />

        </ResourceDictionary>
    </Application.Resources>
~~~


## デザイン時に仮の値を設定する

Prismを使用してのMVVMを想定しての話で、[AdventureWorks.Shopper](https://github.com/PrismLibrary/Prism-Samples-Windows/tree/master/AdventureWorks.Shopper)のコードを参考にした。
結果は実行時とデザイン時でViewModelを分ける。

この例では、CheckoutSummaryPageDesignViewModelがデザイン時に使用される（実行時はPrismのAutoWieViewModelが適用され、CheckoutSummaryPageViewModelが適用される。）。
CheckoutSummaryPageDesignViewModelに設定したい値をコンストラクタで定義することで使用可能。

~~~ xml

<local:NavigationAwarePage x:Class="AdventureWorks.Shopper.Views.CheckoutSummaryPage"
                           xmlns:designViewModels="using:AdventureWorks.Shopper.DesignViewModels"
                           xmlns:local="using:AdventureWorks.Shopper.Views"
                           xmlns:prismMvvm="using:Prism.Windows.Mvvm"
                           x:Uid="Page"
                           x:Name="pageRoot"
                           d:DataContext="{d:DesignInstance designViewModels:CheckoutSummaryPageDesignViewModel,
                                                            IsDesignTimeCreatable=True}"
                           prismMvvm:ViewModelLocator.AutoWireViewModel="True"
                           mc:Ignorable="d">

~~~
ショートカットキーで苦戦（MacのGoogle日本語入力 vs eclipse）

#問題
最近PCをMacに変えて、eclipseをインストールしたりしたのですが、
日本語⇔英字入力の切り替えで使用するショートカットキーが
Google日本語入力とeclipseとで重複していてイライラしました。

|ショートカットキー|Google日本語入力の動作|eclipseの動作|
|---|---|---|
|Ctrl + Shift + J|ひらがな入力モードにする|Enter|
|Ctrl + Shift + ;|英字入力モードにする|ズームイン|

eclipse操作中に
ひらがな入力モードに切り替えようとすると改行もされるし、
英字入力モードに切り替えようとするとズームもされてしまう。

#対処
eclipseのショートカットキーを変更して対処しようと考えましたが、
Ctrl + Shift + Jの方がどうしても回避できず。。。
ちょっと調べてみましたが、Macの標準のキーバインドのようですね。
eclipse固有のものではなく。

#結局
ツールを使ったりすればなんとかできるようですが、
あんまりデフォルト設定をごちゃごちゃいじるのが好きではないので、
入力モードの切り替え方法を変えました。
（設定を変えたのではなく、やり方を変えました。）

|入力モード|使用するキー|
|---|---|
|日本語入力へ|**かな** キー|
|英字入力へ|**英数** キー|

今まで全然使っていませんでしたが、親指の位置に入力モードの切り替えキーがあったのですね。便利！
QMK Firmwareのコンパイル方法が変わっている件について

# 本記事
`Ergodox EZ`をはじめとするキーボードのファームウェアをQMK Firewareを使っている人を対象に、コンパイル方法が変わっているので、それを解説します。

## コンパイル

従来では以下の方法でした。

1. 自分のキーボード設定`keyboard.c`が入ったディレクトリ(`keke`など)を用意する。
2. その`qmk_firmware/ergodox_ez/keymaps`ディレクトリに移動
3. `make keke`

のような手順だったと思います。

しかし、現在では

1. 一緒
2. トップディレクトリ(`qmk/firmware`直下)で`make`をする

に変わっています。

ここで注意する点が

```:従来(qmk_firmware/[対象キーボード]/keymaps)
make [キーマップ]
```

でしたが

```:現在(qmk_firmware直下)
make [キーボード名]:[キーマップ]:[ターゲット]
```

に変更されています。

自分の場合は

```:例
make cospad:keke:all
```

になります。

出力は`.build/keke.hex`です。
Rubyの#yield_selfの良さを#tapと比較して説明する

# まえがき
`Object#yield_self`、使ってますか？
`Object#yield_self`はRuby2.5から追加された強力なメソッドです。
今回はその使い方を、似たメソッドである `Object#tap`と比較しながら説明します。

# 中身の実装

## `Object#yield_self`

```ruby
class Object
  def yield_self
    yield self
  end
end
```

https://bugs.ruby-lang.org/issues/6721

## `Object#tap`

ネイティブで実装されていてRubyコードじゃなくて辛いので、
RubyのRuby実装であるRubiniusからソースを持ってきます。

```ruby
module Kernel
  def tap
    yield self
    self
  end
end
```

https://github.com/rubinius/rubinius/blob/387c488798d8b911f160d36278710474e526d73f/core/kernel.rb#L924-L927

## #yield_selfと#tapの相違点

`yield`自体の挙動がちょっとむずかしいので難解かもしませんが、
~~どちらもレシーバを引数のブロックの引数にとって実行する点は同じです。~~
どちらもレシーバをブロックのパラメーターにとって実行する点は同じです。
<font color="green">※用語が不正確だというご指摘いただきましたので修正</font>

違うのは返り値で
`yield_self`だと実行結果（つまり受け取ったブロックの返り値）が返って、
`tap`はブロックを実行した後のレシーバが返ります。

## つまりどういうことだってばよ
ブロックの中で `String#downcase!`を使う例で比較します。

`String#downcase!`はレシーバの文字列を小文字にして返す破壊的メソッドですが、
変更があった場合には小文字化した文字列が返り値になり、変更なしの場合はnilが返ります。

```ruby
'Hoge'.downcase! # => "hoge"
'hoge'.downcase! # => nil
```
ただし破壊的とはいえ、そこまで暴君ではないので元の文字列までnilにするわけではありません

```ruby
str = 'hoge'
str.downcase! # => nil
str           # => 'hoge'
```

さてこれをyield_selfとtapで使ってみましょう。

```ruby
'hoge'.yield_self { |str| str.downcase! } # => nil 

'hoge'.tap { |str| str.downcase! }        # => 'hoge'
```

yield_selfはブロックの中の実行結果が返るので、 `'hoge'.downcase!`の返り値である `nil`が返り、
tapは実行後のレシーバが返るのでそのまま `'hoge'`が返りました。


## で、yield_selfの何がいいのか
たとえばこんなコードをリファクタしてみる。

```ruby
before = 'hello world'
str = 'L'.downcase
p str                         # => 'l'
str = str * 2
p str                         # => 'll'
after = before.gsub(str, 'X')
p after                       # => "heXo world"
```
( `self =`とかはナシで)tapを使うとせいぜいこんなものでしょう↓

```ruby
before = 'hello world'
str = 'L'.downcase.tap { |tmp| p tmp }             # => 'l'
str = (str * 2).tap { |tmp| p tmp }                # => 'll'
after = before.gsub(str, 'X').tap { |tmp| p tmp }  # => "heXo world"
```

yield_selfを使うとこんな感じ

```ruby

before = 'hello world'
after = 'L'.downcase
           .yield_self { |str| p str; str * 2 }               # => 'l'
           .yield_self { |str| p str; before.gsub(str, 'X') } # => 'll'
           .tap { |str| p str }                                # => "heXo world"
```

いちいち変数にいれなくても次のメソッドで使えるので幾分かスマートになりました。

元のコードと比べて、変数(引数)のスコープが限定的になるのでコードを読むときに「この変数なんだっけ？」という状態になりづらくてとても便利です。

## おわり

tapでメソッドチェーンを作るのもいいですが、時にはyield_selfのことも思い出してあげてください。
ちなみに`tap`と `break`で同じことできます。
[ruby2.6からは `then`でかけます](https://qiita.com/jnchito/items/ce11cb7fccdf4b66af24#yield_self%E3%81%AE%E3%82%A8%E3%82%A4%E3%83%AA%E3%82%A2%E3%82%B9%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%A8%E3%81%97%E3%81%A6then%E3%81%8C%E8%BF%BD%E5%8A%A0%E3%81%95%E3%82%8C%E3%81%9F)
grandine の初期的研究

[thomersch の grandine](https://github.com/thomersch/grandine) とはどのようなものなのか、実際にインストールしてみて３コマンドの --help をチェックしてみました。

# コマンドの --help 概要
## grandine-converter
- csv-delim: 値の間のデリミタを指定する。
- csv-lat: ゼロインデクスで、CSV のどのカラムが latitude を持っているか指定する。
- csv-lng: ゼロインデクスで、CSV のどのカラムが longitude を持っているか指定する。
- in: 入力ファイル
- mapping: データを変換するために使われるマッピングファイル（mapping.yml らしい）
- out: 出力する spaten ファイルのパス

## grandine-spatialize
- in: 入力ファイル（デフォルトは osm.pbf)
- mapping: データを変換するために使われるマッピングファイル。指定されない場合にはデフォルトのマッピングが適用される。
- memprofile: メモリプロファイルの出力パス
- out: 出力する spaten ファイルのパス

## grandine-tiler
- compress: gzip で圧縮する
- cpuprof: CPU プロファイルの出力パス
- default-layer: 地物にレイヤ名が指定されていない場合、デフォルトレイヤに入れるかどうか（デフォルトは true）
- in: 入力ファイルのパス。サポートされているファイルのフォーマットは spaten。
- out: タイルが書き出されるパス（デフォルトは tiles）
- q: quite mode
- std-in: 標準出力から読む。
- workiers: ワーカーの数（デフォルトは 20）
- zoom: タイルをレンダする一つまたは複数のズーム

# 感想
- grandine-tile の出力がフォルダになっているらしきこと、ズームを個別に指定することになっていることが不安である。
- simplify などの機能は組み込まれていない。
- どちらかいえば、基本図というよりは GIS データを軽快にベクトルタイル化することを主眼にしているように思われる。
- 引き続きウォッチすべきとは思われるが、今すぐ利用を検討するべき状況とは言えない。
- しかし、パラメータのセンスが良いと感じる。
GitHub Wikiをチームで運用した話

# 実現したいこと

- GitHub Wikiをチームで運用したい．

- メンバーがGitHub上で編集できる開発用の非公開Wikiと直接編集できない本番用の公開Wikiを分離したい．

作成したWiki：[Factorio逆引きリファレンス](https://github.com/templateaholic10/factorio-tips/wiki/Factorio%E9%80%86%E5%BC%95%E3%81%8D%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9)

# GitHub Wikiの注意すべき点

- 通常のコードとは別のGitプロジェクトで管理されている．リポジトリそのものがgit@github.com:user/project.gitならば Wikiはgit@github.com:user/project.wiki.gitになる．

- master以外のブランチはGitHub上では表示も編集もできない．ローカルにcloneすれば編集が可能．

# 実現方法

- 本番用の公開リポジトリと開発用の非公開リポジトリを作り，それぞれのWikiをミラーする．

- 開発用リポジトリのcollaboratorにメンバーを追加し，メンバーは同リポジトリのWikiを編集する．

- 開発Wikiから本番Wikiへの反映はローカルで行う．

    - 本番Wikiを追跡する本番用ブランチと開発Wikiを追跡する開発用ブランチを作成する．
    
    - 開発用ブランチをpull → 開発用ブランチを本番用ブランチにmerge → 本番用ブランチをpush．

# 手順

1. GitHub上で本番Wikiと開発Wikiを作成する．公開リポジトリと非公開リポジトリを作成し，それぞれ Wikiのタブでcreate the first pageする．今回はユーザ名`user`，公開リポジトリ名`project`，非公開リポジトリ名`project-dev`とする．

2. ２つのWikiをミラーする．
   
    ```shell
    git clone --bare git@github.com:user/project.wiki.git
    cd project.wiki.git
    git push --mirror git@github.com:user/project-dev.wiki.git
    cd ..
    rm -rf project.wiki.git
    ```

    参考：[Duplicating a repository - User Documentation](https://help.github.com/articles/duplicating-a-repository/)

    ちなみに[こちら](https://stackoverflow.com/questions/10642928/how-to-pull-request-a-wiki-page-on-github#answer-11481887)で示されていた手順は私の環境ではうまくいかなかった．

3. `project.wiki`をcloneする．masterブランチの追跡先は`project.wiki`のmasterブランチになっている．

    ```shell
    git clone git@github.com:user/project.wiki.git
    cd project.wiki.git
    git remote -v # project.wikiがoriginリモートとして登録されていることを確認
    git branch -vv # masterブランチがorigin/masterを追跡していることを確認
    ```

4. developブランチに`project-dev.wiki`のmasterブランチを追跡させる．

    ```shell
    pwd # project.wiki.git
    git remote add dev git@github.com:user/project-dev.wiki.git # project-dev.wikiをdevとして登録
    git remote -v # project-dev.wikiがdevリモートとして登録されていることを確認
    git fetch dev --prune # devリモートのブランチ情報を取得
    git checkout -b develop dev/master # dev/masterを追跡するdevelopブランチを作成
    git branch -vv # developブランチがdev/masterを追跡していることを確認
    ```

# 最後に

初めてorigin以外のリモートを登録し，勉強になった．素直にそれぞれがローカルで作業する方が簡単？
【Python】imghdrでJPEGファイルが正しく判定されない


# はじめに
画像形式の取得には imghdr  というパッケージが便利なのですが、たまにjpgファイルが正しく判定されないので困ってました。

うまく判定されない画像の例
[ドラえもんの画像 1](http://livedoor.blogimg.jp/doraemon_vs_suneo/imgs/f/a/faee12d8.jpg?62203f8b)
[ドラえもんの画像 2](https://sociopouch.files.wordpress.com/2018/03/e3838fe38383e38394e383bce382bbe38383e38388e3839ce38383e382afe382b9.jpg?w=432&h=520)


# imghdr
imghdrの[ソースコード](https://github.com/python/cpython/blob/3.6/Lib/imghdr.py)を覗いてみると、jpgの判定は以下の関数で行っていることがわかります。

```py
def test_jpeg(h, f):
    """JPEG data in JFIF or Exif format"""
    if h[6:10] in (b'JFIF', b'Exif'):
        return 'jpeg'
```

どうやら、判定がうまく行かなかったファイルでは'JFIF'や'Exif'が正しい位置にはなかったようです。


# 解決方法
jpgファイルには、ファイル先頭が必ず FFD8 で始まる、というお約束があるのでそれを利用します。（なぜ imghdr がこの方法を取らないのかは気になるところです。）

```py
def is_jpg(byte):
    return byte[:2] == b'\xff\xd8'
```

短すぎて関数化する必要無い気もしますが、とりあえずこれでjpgファイルが正しく判定できるようになりました。
Deeplearning4j で質問-回答の関係を解く自然言語処理

# レポジトリとそのドキュメント
https://github.com/MokkeMeguru/self_introduction
ドキュメントはREADME.orgから飛んでください(Markdownは得意じゃないので許して下さい...)

# 概略図と感想
![Diagram.png](https://qiita-image-store.s3.amazonaws.com/0/147520/483d4501-0238-9802-a5e0-16ea5b5b4eec.png)

以下のモデルを作りました。
実行はこのレポジトリをintellijなどで開いて SimpleSequence2VecModel のメイン関数を実行すれば大丈夫だと思います。
精度はそこそこに良かったですが、辞書のサイズが増えると学習により時間がかかります。入力のCSVファイルを変更すれば簡易的なオペレータを作ることができるかもしれません。
記述行数は多かったですが、殆どが保管機能で事足りたのですごく楽でした。
またgitter で気楽に質問をすることができるため、困ったときにはかなり助けて頂きました。

実行図
![Example.png](https://qiita-image-store.s3.amazonaws.com/0/147520/1baceb04-ed7d-9560-a297-166cca8b149d.png)
TsukArm First Impression

TsukArm は 株式会社MTMシステムズのロボットアーム。

- 7軸ロボットアーム
- Arduinoでコントロール、制御プログラムを書くのも簡単。
- トルク26.3kg-cm。それに見合う剛性で、実用にも応用できる
- オープンソースハードウェア
- ロボットアーム本体は CC BY NC
- ドキュメント、ソフトウェア類は CC BY SA
- 過去のオープンソースロボットアームプロジェクト、7botやnanabo を継承している。

今回、デモ品を借りてきたのでちょっと触ってみた。

# 開封

パッケージはアルミケース

![IMG_20180812_021710.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/9cd2fd74-be76-a501-52ca-3e392f0f2ea9.jpeg)

中身はスポンジで一式が保護されています

![IMG_20180812_021729.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/1c99cab8-0e70-8e4c-d939-74df2adc602f.jpeg)

内容物：
![IMG_20180812_022057.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/88a4dd73-5005-2d77-9047-c7a7b5ed2d0e.jpeg)

- TsukArm 本体
- コントローラ
- ACアダプタ＋電源コード
- microUSB通信ケーブル
- レンチセット
- ドライバセット

# 配線

モーターケーブルはこのくらい。まずはこれを配線します。
![IMG_20180812_022304.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/74daaf2d-ca43-ab15-c52b-8ecf7e7d80ad.jpeg)


コントローラを開けて

![IMG_20180812_022213.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/a974602a-a44d-1efa-ec41-c5c2e943ba48.jpeg)


このように差し込みます。コネクタは -,+,Pとあるが、それぞれ茶、赤、橙を接続。

![IMG_20180812_022648.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/8a3569cf-3771-3cdd-e42c-197a5f339b72.jpeg)

# 火入れと調整

ACアダプタをつなげ、コンセントに差し込むとすぐに動作する。
急発進するので気をつけないといけない。


デモ動作は各モータを動作させます。それぞれが動作するかどうかチェック。


![IMG_20180812_023141.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/88c17500-eeed-9339-3d8e-f6b759e2151b.jpeg)


さて、元々付いている脚小さく、は何かに固定しないとそのままだと転げてしまった。


![IMG_20180812_023321.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/242b308b-af28-d398-2861-0532eb2dd3f0.jpeg)

棚板を使って、テストベンチを作る。


![IMG_20180812_023924.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/572308a6-6aa3-2787-2ba5-a1007c7394c0.jpeg)

動かしたところ、先端のグリッパから結構うるさい音がする。キャリブレーションが必要ぽい。
ドライバを使ってグリッパを更に開き気味に調整してみるとちょうどよくなった。

![IMG_20180812_024807.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/2c14fb47-dfd3-5177-53a2-0d3491c5e193.jpeg)

# PCに接続

次は、USBケーブルをPCに接続してプログラムを書き込んでみる。
サンプルプログラムはここ。
https://github.com/TsukArm/TsukArm-Library/blob/master/arduino_lib/tsukarm_sample/tsukarm_sample.ino

コントローラに使われているのはArduino Dueなので、こちら
http://wiki.tsukarm.com/Arduio%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89
を元にして環境設定。

以下のように書込ができたら、
[]( scale=0.5 )![image](https://qiita-image-store.s3.amazonaws.com/0/139524/70e8e312-a032-5089-0d7d-ac0a4f533802.png)

水平姿勢を保つようになる。
ここまででひとまずの動作確認はOKかな。

![IMG_20180812_025001.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/fa0a9132-5c47-4a41-2548-486240794422.jpeg)
【windows】TensorFlowをC++から利用する(準備編)

# 概要
タイトルの通りにTensorFlowをC++から利用します。
今回は、準備編ということで、tf_tutorials_example_trainerをビルドし、動作確認するところまでです。

次回は、実践編でPythonで学習したネットワークをC++から読み込んで評価することを予定しています。

# 環境
- windows10 (cpu:core i5, gpu:なし)
- Visual Studio 2015
- TensorFlow 1.9 

[【windows】AVX2を有効にしてTensorflowをビルドする(GPUなし)](https://qiita.com/soyiharu/items/098056897d6206da48b7)とTensorFlowのバージョン以外は同じ環境です。
ちなみに、すでにtf1.10がリリースされていますが、ビルドを開始した時はまだtf1.9が最新だったので、今回はtf1.9です。

# 方法
基本的には、前回の[【windows】AVX2を有効にしてTensorflowをビルドする(GPUなし)](https://qiita.com/soyiharu/items/098056897d6206da48b7)と同じです。

今回はAVX2などの命令セットはなしです。
MKL,MKLDNNを有効にしてビルドします。

1．CMakeLists.txtの修正
MKLのライブラリが存在しないので削除(なくてもビルドできました)。
ちなみに、googleでmkl_cdll_intel64を検索しても4件しかヒットしません。

```cmake:tensorflow/contrib/cmake/CMakeLists.txt
346行目-　mkl_intel_lp64_dll mkl_sequential_dll mkl_core_dll mkl_rt mkl_cdll_intel64)
       +  mkl_intel_lp64_dll mkl_sequential_dll mkl_core_dll mkl_rt)
```

2．CMakeでVisual Studioのslnなどを生成
3．vcxprojファイルの修正
パスの間違いがあるのでそれらを修正します。

- 名前が_から始まるプロジェクト
ライブラリの名前で判断すると修正が必要ないかも。
修正の内容は[前回の記事](https://qiita.com/soyiharu/items/098056897d6206da48b7)を参照

- tf_core_cpu.vcxproj
grpcのヘッダが見つけられないので、tf_core_cpu.vcxprojのAdditionalIncludeDirectories部分に"tensorflowのディレクトリパス\tensorflow\contrib\cmake\build\grpc\src\grpc\include"を追加します
- tensorflow/core/common_runtime/mkl_cpu_allocator.h
i_malloc, i_calloc, i_realloc, i_freeの定義をMKLのライブラリに見つけられなかったので、代わりに見つかったi_malloc_dll, i_calloc_dll, i_realloc_dll, i_free_dllに変更します。

```c++:tensorflow/core/common_runtime/mkl_cpu_allocator.h
103行目- i_malloc = MallocHook;
       - i_calloc = CallocHook;
       - i_realloc = ReallocHook;
       - i_free = FreeHook;
103行目+ i_malloc_dll = MallocHook;
       + i_calloc_dll = CallocHook;
       + i_realloc_dll = ReallocHook;
       + i_free_dll = FreeHook;
```

- tensorflow/core/platform/windows/port.cc
関数の定義が不足しているので追加します。
github上でissueが出ていました。最新版では修正されています。

```c++:tensorflow/core/platform/windows/port.cc
int NumHyperthreadsPerCore() {
  static const int ht_per_core = tensorflow::port::CPUIDNumSMT();
  return (ht_per_core > 0) ? ht_per_core : 1;
}
```

- tf_tutorials_example_trainer.vcxproj
i_malloc_dllなどの定義をintelのMPIのライブラリの中に見つけたので、修正します。
libimalloc.libをAdditionalDependenciesの項目に、そのディレクトリパスをAdditionalLibraryDirectoriesに追加します。
MKLのライブラリの方にもi_malloc_dllなどの定義があったので、この変更は不要かも。
dumpbin /exportsでまとめて調べたので、どのlibファイルに含まれているかはよくわかりません。

4．ビルド
変更は完了したので、ビルドします。
そして、ひたすら待ちます

```bash
msbuild tf_tutorials_example_trainer.vcxproj /p:PreferredToolArchitecture=x64 /p:configuration=release /p:platform=x64
```

5．実行
MKLなどのdllにパスを通してから実行します。

```bash
Release\tf_tutorials_example_trainer.exe 
Release\tf_tutorials_example_trainer.exe --num_iterations=30 # オプションあり
```

私の環境では問題なく実行できました。
C++でUnityのGetComponentのようなものを実装してみた

# 経緯
実行時型情報(RTTI)を使って何か書きたい

# コンパイル環境
```bash
$ g++ --version
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 9.0.0 (clang-900.0.39.2)
Target: x86_64-apple-darwin16.7.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
```

# コンパイル、リンク
```bash
g++ main.cpp -o main -std=c++11
```

#コード
```c++

#include <cstdio>
#include <string>
#include <iostream>
#include <list>

class Object
{
public:
    Object() {}
    virtual ~Object() {}

    static void Destroy(Object* obj)
    {
        if (obj != nullptr)
            delete obj;
    }
};

class GameObject;
class Component : public Object
{
public:
    Component() {}
    virtual ~Component() {}

    virtual void Print()
    {
        std::cout << "I am Component!" << std::endl;
    }

    GameObject* gameobject;
};

class Transform : public Component
{
public:
    Transform() {}
    virtual ~Transform() {}

    virtual void Print()
    {
        std::cout << "I am Transform!" << std::endl;
    }
};

class Text : public Component
{
public:
    Text() : text("I am Text") {}
    virtual ~Text() {}

    std::string text;

    virtual void Print()
    {
        std::cout << text << std::endl;
    }
};

class GameObject : public Object
{
public:
    GameObject()
    {
    }
    virtual ~GameObject()
    {
        for (Component* component : componentList_)
        {
            if (component != nullptr)
                Destroy(component);
        }
    }

    template <class T, bool isExtended = std::is_base_of<Component, T>::value> T* AddComponent()
    {
        static_assert(isExtended, "AddComponent<> : T is not inherited from Component Class");
        T* component = new T();
        componentList_.push_back(component);
        return component;
    }

    template <class T> T* GetComponent()
    {
        T* component;

        for (Component* c : componentList_)
        {
            component = dynamic_cast<T*>(c);
            if (component != nullptr)
                return component;
        }
        return nullptr;
    }


    void PrintComponentList()
    {
        transform_.Print();
        for (Component* component : componentList_)
        {
            component->Print();
        }
    }

private:
    std::list<Component*>   componentList_;
    Transform               transform_;
};
template <> Transform* GameObject::GetComponent()
{
    return &transform_;
}


int main()
{
    GameObject gameObject;

    Text* text1 = gameObject.AddComponent<Text>();
    Text* i = gameObject.GetComponent<Text>();

    gameObject.PrintComponentList();

    rewind(stdin);
    getchar();
    return 0;
}
```
VSCodeでHaxeをAutoformat

1. VSCode に [AStyle拡張機能](https://marketplace.visualstudio.com/items?itemName=chiehyu.vscode-astyle)をインストール
2. `setting.json`に以下を記述

```json
"astyle.additional_languages": ["haxe"],
"astyle.cmd_options": ["--mode=cs", "-f", "-U", "-Y", "-o", "-xe", "-xg", "-xL", "-S", "-t", "-xj", "-xt1", "-xW", "-z2"]
```

3.コマンドパレット等からフォーマットを実行


|オプション(Short)|オプション(Full)|説明|
|:---:|---|---|
||`--mode=cs`|インデントのパターン<br>デフォルトだと、C,C++でも見られるキーワード(ex: アクセス修飾子`public`/`private`)を含む行のインデントがずれる|
|`-o`|`--keep-one-line-statements`|1行内の複数の式を改行しない|
|`-j`|`--add-braces`|1行の条件文を`{}`で囲む|
|`-S`|`--indent-switches`|switch式のブロック内をインデント|
|`-s`<br>`-s#`|`--indent=space` <br> `--indent-space=#`|スペースでインデント<br>#は1インデントあたりの文字幅(未設定:4文字分)|
|`-t`<br>`-t#`|`--indent=tab` <br> `--indent-tab=#`|タブ文字でインデント<br>#は`-s#`と同じ|
|`-f`|`--break-blocks`|コードブロックやクラス記述の前後に空行を挿入|
|`-xe`|`--delete-empty-lines`|関数内の空行を削除|
|`-xg`|`--pad-comma`|カンマの後ろにスペースを1つ挿入|
|`-p`|`---pad-oper`|演算子の前後にスペースを1つ挿入|
|`-U`|`--unpad-paren`|丸括弧の内側に隣接するスペースを削除|
|`-xC#`|`--max-code-length=#`|1行の文字数が#文字以下になるよう、<br>論理演算子、セミコロン等で改行|
|`-xL`|`--break-after-logical`|`-xC#`とセットで使用<br>論理演算子を複数含む行を改行するとき、演算子より後ろで改行(オプションなし:演算子の前で改行)|
|`-z1`<br>`-z2`<br>`-z3`|`--lineend=windows`<br>`--lineend=linux`<br>`--lineend=macold`|改行コードの設定<br>`-z1`(=windows): CRLF(Windows)<br>`-z2`(=linux): LF(Linux, Mac OSX)<br>`-z3`(=macold): CR(Mac 9まで)|

オプションはまだまだあるので、
使用に際しては[公式](http://astyle.sourceforge.net/astyle.html)を読むことをおすすめします。

参考:

Is there a code formatter tool for Haxe code?
https://stackoverflow.com/questions/41648474/is-there-a-code-formatter-tool-for-haxe-code

Artistic Style 3.1
http://astyle.sourceforge.net/astyle.html
rails s -b 0.0.0.0で起動したWebサーバにアクセスできない

##事象
「rails s -b 0.0.0.0」で起動したWebサーバにアクセスできない。
サーバのブラウザからは「localhost:3000」でアクセスできる。しかしLAN上の別PCから「<サーバIPアドレス>:3000」でアクセスできない。

##環境
OS: CentOS7
ruby: 2.5.1
rails: 5.1.6

##原因
ファイヤーウォールによってサーバの3000番ポートが閉じられていたため。

##対処
以下のコマンドで3000番ポートを開ける。

```bash
$ firewall-cmd --add-port=3000/tcp
```

##余談
ファイヤーウォールの設定は、CentOS7からはiptablesコマンドの代わりにfirewall-cmdコマンドを使う。以下のとおり、httpは許可しているのに、なぜアクセスできないのか悩んでいたが、これは80番ポートを開けているだけのようだ。

```bash
$ firewall-cmd --list-services
ssh dhcpv6-client http https
```
Pythonのsplit で[]を使う方法

Pythonでsplitを使うとき、[]を活用することで、リストの中から適切に値を取得することができます。例えば、下記のような文字列をsplitでリスト化したとします。

```python

>>> urls = 'http://quotes.toscrape.com/page/1/'
```

上記のような文字列は下記のようなリストを生成します。

```python

>>> print( urls.split("/") )
['http:', '', 'quotes.toscrape.com', 'page', '11', '']
```

もし "http" だけを取得したいとしたら、こうします。

```python

>>> print(urls.split("/")[0])
http:
```

それか、もし "1" だけを取得したいとしたら、こうします。

```python

>>> print(urls.split("/")[-2])
1
```
以上です。
AWS SDK for C++をラズパイでビルドしたら24時間掛かった件

2018/08/09現在のAWS SDK for C++をRaspberry Pi 3Bでビルドした。
以下のURLに記載の通り、cmakeをやってmakeをやればOKと言う訳には行かなかったので共有する。

http://sdk.amazonaws.com/cpp/api/LATEST/index.html

大きな問題点は「メモリが足りない」こと。
とにかく巨大なソースファイルが存在するため、それをコンパイルするためのメモリが全然足りない。
そして、SDメモリにスワップすると、ほぼハングアップ状態になるので実質使えない。

そこでやったことは以下の2つ。

* SDメモリのスワップファイルは止め、USB HDDにスワップファイルを作成する。
* スワップが発生しても耐えられるように巨大なソースファイルは分割する。

USB HDDには2GBのスワップファイルを作成した。

```
# swapoff /var/swap
# dd if=/dev/zero of=/media/pi/here-is-usb-hdd-mount-point/swapfile bs=1M count=2048
# mkswap /media/pi/here-is-usb-hdd-mount-point/swapfile
# swapon /media/pi/here-is-usb-hdd-mount-point/swapfile
```

以下のソースコードを概ね等分となるように分割した。

| ソースコード                                                       | 行数 | 分割数 |
|:-----------------------------------------------------------------|-----:|-------:|
| aws-cpp-sdk-apigateway/source/APIGatewayClient.cpp               | 4721 |      2 |
| aws-cpp-sdk-cognito-idp/source/CognitoIdentityProviderClient.cpp | 3514 |      2 |
| aws-cpp-sdk-ec2/source/EC2Client.cpp                             | 9961 |      4 |
| aws-cpp-sdk-iam/source/IAMClient.cpp                             | 4679 |      2 |
| aws-cpp-sdk-iot/source/IoTClient.cpp                             | 5513 |      2 |
| aws-cpp-sdk-rds/source/RDSClient.cpp                             | 3466 |      2 |
| aws-cpp-sdk-ssm/source/SSMClient.cpp                             | 3802 |      2 |

あとはAWSのドキュメントの通り、cmakeをやってmakeをやればビルドが完了できる。
ただし、24時間ほど掛かるのでそのつもりで作業して欲しい。
【Linuxコマンド】findコマンドで特定の関数が使用されているファイルを見つける

# コマンドを使用する目的

特定のファイルを見つけ出すには``findコマンド``が多用されるかと思います。今回の内容も、特段目新しいものではありません。

以下のコマンドは``膨大なファイルから特定の関数が使用されているファイルを見つける``ために、職場の先輩から教わりました。

```sh
$ find . -name '*.php' | xargs grep '関数名'
```

以前からfindコマンドは利用していましたが、自分は単純に``ファイルを見つけるコマンド``としか捉えていませんでした。今回のように特定の関数を見つけ出す場合、該当ファイルを開いて地道に``Ctrl+F``で全文検索してましたから(´；ω；`)

個々のコマンドを知るのは大事ですが、どこでどういう目的で使用するのかも重要です。コマンドに限らず、独学だと使用目的のバリエーションが広がりにくいのが難点ですね。

忘れないうちに、各コマンドの解説とともにメモしておきます。

# findコマンド

## 基本
ファイルを探すためのコマンドです。知名度高し。ファイルだけでなく、ディレクトリも検索対象になります。

``.``でカレントディレクトリを指定すれば、カレントディレクトリ以下を検索します。

同じく１階層上にあるディレクトリは``../../parents``、同階層にあるディレクトリは``../brother``のように指定します。

```sh
$ find .
```

この状態で使用しても全てのファイル・ディレクトリが表示されるだけなので、ここから絞って行きます。

## nameオプション

ファイル名・ディレクトリ名を指定して検索する場合に使用するオプションです。``inameオプション``であれば、名前の大文字小文字は区別されません。

以下のコマンドで、カレントディレクトリにある``test.html``が検索されます。

```sh
$ find . -name test.html
./test.html
```

ファイル名が一部しかわからない場合は、``ワイルドカード``を使用します。``*``は任意の文字列、``?``は任意の1文字を意味します。

ワイルドカードを使用する場合は、必ず``クォーテーション``で文字列を囲ってください。

```sh
$ find . -name 'test*'
./test2.html
./test001.html
./test.html
./testdir
```

## typeオプション

ファイルの種類を指定します。``-type d``でディレクトリのみ、``-type f``でファイルのみを検索対象とすることができます。

以下のコマンドでは、名前が``test``で始まるディレクトリに限定して検索を行なっています。

```sh
$ find . -type d -name 'test*' 
./testdir
``` 

# grepコマンド

ファイル内の文字列を検索するコマンドです。``nオプション``で行番号の表示ができます。

以下のコマンドでは、``test.html``に対して``test``という文字列が存在する行を検索しています。この場合、クォーテーションの有無は関係ありません。

```sh
$ grep -n test test.html 
7:    <p>git_test</p>
```

``vオプション``を指定すると、反対に指定する文字列が存在しない列を抽出します。

```sh
$ grep -n -v test test.html
1:<!DOCTYPE html>
2:<html lang="ja">
3:  <head>
4:    <meta charset="UTF-8">
5:  </head>
6:  <body>
8:
9:
10:  </body>
11:</html>
```

# xargsコマンド

前のコマンドから実行結果（標準入力）を受け取り、それを次のコマンドで引数として扱います。単体で使用するのではなく、その引数を利用するコマンドも指定します。

仮に``xgargs grep``と指定した場合、前のコマンドで出力されたファイルを引数にしてgrepコマンドが実行されます。

合わせて``パイプライン（前のコマンドの標準出力を、別のコマンドの標準入力につなぐ）``という機能が使用されています。

# コマンドの意味

```sh
$ find . -name '*.php' | xargs grep '関数名'
```

処理の流れはこんな感じです。

1. ``findコマンド``でカレントディレクトリからphpファイルを探す。
2. 1.の結果を引数にして``grepコマンド``を実行する。
3. ``grepコマンド``で、指定した関数名を含むファイルを見つけ出す。

様々な場所や状況で利用できるコマンドです（＾ω＾）
Xamarin.Forms VisualStudio2017 UWPのデバッグでブレークポイントで止まらない

2018/08/11時点

VisualStudio2017でXamarin.Formsのプロジェクトを作成
ライブラリーは.NetStandard

問題点
1.Debugでx86でUWPにしてデバッグを開始
2.適当にブレイクポイントを設定
何故かブレイクポイントで止まらない

いきなり結論
もしこの状態で困っている方がいる場合Debugモードにこだわらず一度Releaseモードで
デバッグをしてみること
何故かReleaseモードなのにブレイクポイントで止まる
Releaseの構成をコピーして新しい構成を作成したとしても何故かブレイクポイントで止まらない
むしろRelease構成が正しく機能しているその証拠にデバッグしていいのかどうかダイアログが出現してくる
要するにVisualStudioのバグだと決めつけていいと思う。

この症状はどうやらXamarin.Formsで.NetStandardのプロジェクトで、Debug構成のUWPアプリのみに起きることが分かった。
Androidで確認してみたが特に問題ない。
エディターにゲーム風のカーソル移動ショートカットを設定する

## 動機

カーソルキー、なかなか押しづらいのでショートカットキー当てようとすると
まずVimバインドのカーソル移動が候補に上がると思うんですが、
自分はどうしても馴染めず諦めてました。
ただ、新しいMBP買ってさらに押しづらくなりどうしたものかと悩んだのち、
ゲームっぽい配置を試したところ使いやすかったので紹介してみます。

## やり方

と言ってももちろん何も難しいことはしていなくて、
controlキー+ijklで上下左右に動けるようにしただけです。

<img width="517" alt="スクリーンショット 2018-08-11 23.46.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/30168/2f264cf1-bada-d4d2-0825-71bea7fc2127.png">

Sublime Tex3ではPreferences > Key Bindings で以下を追加。

```json
[
    { "keys": ["ctrl+j"], "command": "move", "args": { "by": "characters", "forward": false } },
    { "keys": ["ctrl+i"], "command": "move", "args": { "by": "lines", "forward": false } },
    { "keys": ["ctrl+k"], "command": "move", "args": { "by": "lines", "forward": true } },
    { "keys": ["ctrl+l"], "command": "move", "args": { "by": "characters", "forward": true } }
]
```

## どうなるか


この状態からセミコロンを打ちたいという時に
<img width="368" alt="スクリーンショット 2018-08-12 0.00.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/30168/5792c36c-71c7-399c-f633-cce94fc105f3.png">

control + l 2回で
<img width="356" alt="スクリーンショット 2018-08-12 0.01.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/30168/ed6ed621-13d4-d115-0374-981b43d6cb22.png">

ここに動く!
(さらにいうと補完の候補選択もこの上下ショートカットキーが効きます)

慣れるまで少し時間が必要ですが個人的にはだいぶ捗るようになったのでおなじようなことに悩んでる方はぜひ。
第29話 アッカーマン関数

この記事は[仮面ライダービルドの数式](https://qiita.com/izmktr/items/e26a624e79bce3edccc9)の第29話です。

```math
A(3,2)=A(2,A(2,A(3,1)))=29
```

アッカーマン関数のA(3,2)の値は29、という式です。
アッカーマン関数は巨大数に関連のある関数で、次の形で定義されます。

```math
\begin{align}
A(0,n)&=n+1\\
A(m,0)&=A(m-1,1)\\
A(m,n)&=A(m-1,A(m-1,A(m,n-1)))
\end{align}
```

定義を見てもわかりにくいので、mを行、nを列として表にします。

|m行＼n列|0|1|2|3|
|:-:|:-:|:-:|:-:|:-:|:-:|
|0|1|2|3|4|
|1|2=(1,0)|3 =(0,2)|4 =(0,3)|5=(0,4)|
|2|3=(1,1)|5=(1,3)|7=(1,5)|9=(1,7)|
|3|5=(2,1)|13=(2,5)|29=(2,13)|61=(2,29)|
|4|13=(3,1)|65533=(3,13)|2^65536-3|2^(2^65536 )-3|
|5|65533|2^(2^(2…) )-3 ※|-|-|


まず一番上の0行目は1,2,3…が入ります。
一番左の0列目は自分から見て右上のマスの数が入ります。

それ以外は、一つ上の行の、左のマスの列目の値が入ります。
例えば、今回の29は3行目2列目の値です。
ここは、左のマスの値が13なので、2行目13列目の値が入ります。

※のある、5行目1列目ですが、2の2乗の2乗の…が65536回繰り返されるという、途方もない数です。
桁数にしても、大体2万桁の桁です。10000桁の数は5桁の桁、といえばその巨大さがわかるでしょうか。

5行目2列目以降や6行目以降はかけないぐらい巨大です。ですから、アッカーマン関数は巨大数という大きな数を作る分野では頻出します。
railsでgretelを使ってパンくずリストを作った

# 目的

railsのサイトでgretelを使ってパンくずリストを作成する。SEO対策も兼ねているので下記仕様。

* 構造化データ
* タグに階層構造をつける
* 階層にリンクをつけてタグの一覧に飛べるようにする
* 親がないときとある時で階層が違う

# gretel導入

https://github.com/lassebunk/gretel

document

https://www.rubydoc.info/gems/gretel

## install

```
gem "gretel"
```

```
$ bundle install
```

## fileの設定

設定fileを下記コマンドで作成

```
$ rails generate gretel:install
```
```ruby:config/breadcrumb.rb
# Root crumb
crumb :root do
  link "Home", root_path
end

# Issue list
crumb :issues do
  link "All issues", issues_path
end

# Issue
crumb :issue do |issue|
  link issue.title, issue
  parent :issues
end
```

## viewに設置

```ruby
<% breadcrumb :issue, @issue %>
```

上記で各ページでどこまでのパンくずを出すのか設定する。実際にパンくずが出るのは下記を記述した箇所

```ruby
<%= breadcrumbs pretext: "You are here: ", separator: " &rsaquo; " %>
```

* pretext→パンくずリストの前のテキスト
* separator→パンくずの間の区切り

# 親の設定

config/breadcrumb.rbのcrumbとendの間にparentを設定することで親を設定することができる。

```ruby:config/breadcrumb.rb
crumb :root do
  link "Home", root_path
end

# user#index
crumb :users do
  link "Users", users_path
  parent :root
end
```

上記でparentにrootを設定。


# リンクをつける

## リンクの設定

リンクはconfig/breadcrumb.rbのcrumbとendの間にlinkを下記のように設定する。

```ruby:config/breadcrumb.rb
crumb :root do
  link "Home", root_path
end

# user#index
crumb :users do
  link "Users", users_path
  parent :root
end
```

# 構造化データ

semantic: trueでgretelで構造化データを作ることができる。gretelの場合data-vocabularyで設定される。

# root>親カテゴリ>記事名で親カテゴリページでタグを出したい場合

```ruby:breadcrumbs.rb
crumb :root do
  link "Home", root_path
end

crumb :tag do |tag|
  if current_page?(:controller => 'post', :action => 'show')
    show_post_tag_id = TagMap.find_by(post_id: params[:id]).tag_id
    show_post_tag = Tag.find_by(id: show_post_tag_id)
    link show_post_tag.name
  else
    tag_page = Tag.find_by(id: params[:id])
    link tag_page.name
  end
  parent :root
end

crumb :show_title do |show_title|
  show_title = Post.find_by(id: params[:id])
  link show_title.title
  parent :tag
end
```
リンクを含んだTextViewの実装〜タップアニメーションも

#はじめに
アプリを実装していて、「お問い合わせはこちら」のようなTextViewにリンクを含んだTextViewが作れないかと思ったことはありませんか？

![screenhere.png](https://qiita-image-store.s3.amazonaws.com/0/259412/03d50af8-cb5d-2f0d-8bb9-1032f94d65d3.png)

#方法
今回は「お問い合わせはこちら」の「こちら」だけをリンク化したいと思います。
まず、ClickableSpan()というものを使用します。
指定した範囲の色やアンダーライン、そしてタップした時のイベントを登録することができます。

```Kotlin:
class MyClickableSpan(private val context: Context, private val textView: TextView) : ClickableSpan() {

    override fun updateDrawState(ds: TextPaint) {
        super.updateDrawState(ds)

        // リンク化する箇所の色を指定
        ds.linkColor = ContextCompat.getColor(context, R.color.colorAccent)

        // リンク化する箇所のアンダーラインの有無を指定
        ds.isUnderlineText = false
    }

    override fun onClick(p0: View?) {
        // お好きな処理をどうぞ
    }
}
```

そして、リンク化する範囲をどうやって決めるのかと言うと、
PatternとSpannableStringを使用します。

```Kotlin:
fun setTextLink(context: Context, textView: TextView) {
    // テキストはstrings.xmlから参照
    // 「こちら」のパターンを指定
    val pattern = Pattern.compile(getString(R.string.here))
        
    // TextViewにセットした「お問い合わせはこちら」から「こちら」を探す
    val matcher = pattern.matcher(textView.text)

    // SpannableStringを指定。これを使ってClickableSpanの適用範囲を決定
    val spannableString = SpannableString(getString(R.string.text))
    
    var start = 0
    var end = 0

    //「こちら」という文字がどこから始まり、どこで終わるのかを探し変数に収める
    while (matcher.find()) {
        start = matcher.start()
        end = matcher.end()
    }

    // SpannableStringのうち、MyClickableSpanを適用する範囲を指定
    spannableString.setSpan(MyClickableSpan(context, textView), start, end, Spanned.SPAN_INCLUSIVE_INCLUSIVE)

    // TextViewにSpannableStringを適用
    textView.text = spannableString

    // リンク機能を適用
    textView.movementMethod = LinkMovementMethod.getInstance()
}
```

これでひとまず、TextViewにリンクを追加することができました。


# おまけ - タップアニメーションを追加
このままでも十分なのですが、せっかくなのでリンクを押した時のハイライトを追加してみましょう。
先ほどのMyClickableSpanのupdateDrawState()に、`textView.isPressed`を使った条件文を追加します。

```Kotlin
class MyClickableSpan(private val context: Context, private val textView: TextView) : ClickableSpan() {

    override fun updateDrawState(ds: TextPaint) {
        super.updateDrawState(ds)

        // リンク化する箇所の色を指定
        ds.linkColor = ContextCompat.getColor(context, R.color.colorAccent)

        // リンク化する箇所のアンダーラインの有無を指定
        ds.isUnderlineText = false

        // 新規追加
        // TextViewが押された時はハイライト色を変える
        if (textView.isPressed) {
            textView.highlightColor = ContextCompat.getColor(context, R.color.colorPrimaryDark)
        } else {
            textView.highlightColor = ContextCompat.getColor(context, R.color.white)
        }

        // TextViewの描画を更新
        textView.invalidate()
    }

    override fun onClick(p0: View?) {
        // お好きな処理をどうぞ
    }
}
```

これを適用すると、下のように「こちら」をタップした時にハイライト色が変化します。
（もちろん指を離すと`isPressed=false`で指定した色に戻ります！）

![screenlink2.png](https://qiita-image-store.s3.amazonaws.com/0/259412/6f68b7f5-aae2-6f88-81dd-80ec9cf56ae1.png)

ということで、今回はAndroidのリンクを含んだTextViewの実装方法を紹介しました。
phpのpassword_hashで使えるハッシュをローカルのPythonで生成！

テストアカウントとかで簡単に使えるPython製のパスワードジェネレータです。[password_hash](http://php.net/manual/ja/function.password-hash.php)とか[password_verify](http://php.net/manual/ja/function.password-verify.php)で確認してみて下さい。

### 事前準備

```cmd
pip install bcrypt
```

## コード

```python:passward_hash.py
import bcrypt


def check_password(pw: bytes, h_pw: bytes) -> bool:
    if bcrypt.checkpw(pw, h_pw):
        return True
    else:
        return False


def get_password(pw: bytes) -> bytes:
    salt = bcrypt.gensalt(rounds=10, prefix=b'2b')
    return bcrypt.hashpw(pw, salt=salt)


def run():
    pw = input("ハッシュ化以前のパスワードを入力して下さい。").encode('utf-8')
    hash_pw = get_password(pw=pw)
    result = check_password(pw=pw, h_pw=hash_pw)
    if result:
        print("検証完了！", end='')
        print(f"\npure: {pw}")
        print(f"hashed: {hash_pw}")
    else:
        print("検証失敗！")

while True:
    run()

```

## 実行結果

![GIF.gif](https://qiita-image-store.s3.amazonaws.com/0/246065/aa42acda-4864-2224-2919-f5235562f747.gif)

何回か試しに入れてみると出力する結果が毎回違っているので、あれ、これ**アカン**やん！って思ったのですが、**なんかOK**みたいです。よー分からん！！

#### 参考記事:

- [Qiita: Pythonでbcryptを使ってパスワードをゆっくりハッシュ化](https://qiita.com/matsulib/items/2bcf59c2b2cb5eb5c5c4)
- [php.net: password_hash](http://php.net/manual/ja/function.password-hash.php)
- [php.net: password_verufy](http://php.net/manual/ja/function.password-verify.php)
- [pypi: bcrypt](https://pypi.org/project/bcrypt/)
BigQueryへCSVファイルをロードする際、どこまで気を利かせてくれるのか

## はじめに

BigQueryへCSVファイルをロードする時、気になるのがCSVファイルのフォーマットやデータの表現形式。
BigQueryが受け付けてくれる形なら問題ないが、出力元システムによって特有の方言がありうる。
とりあえず思いついたものを自動検出ONでロードしてみて、どうなるか知っておきたい。

## CSVファイル

```sample.csv
col1,col2,col3,col4,col5,col6,col7,col8,col9,col10,col11
null,abc,文字列１,"カンマ,がある",12345,1.2345,20180101,2018-01-01,2018/01/01,2018-01-01 23:59:59,2018/01/01 23:59:59
,def,文字列２,"カンマ,がある",67890,6.7890,20180201,2018-02-01,2018/02/01,2018-01-01 23:59:59,2018/01/01 23:59:59
```

## テーブル定義ファイル

なし。自動検出をONにする。

## 試しにロードしてみる

ロード失敗。
![error1.png](https://qiita-image-store.s3.amazonaws.com/0/175280/9374fb26-ae3a-4d5d-2a31-845f31d5b4c6.png)

```
Error while reading data, error message: CSV table encountered too many errors, giving up. Rows: 1; errors: 1. Please look into the error stream for more details.
```
stackdriver loggingで確認してみる。
![error2.png](https://qiita-image-store.s3.amazonaws.com/0/175280/2010e460-534e-18a8-8700-ddfb37b7208a.png)

```
Could not parse '2018/01/01 23:59:59' as a timestamp. Required format is YYYY-MM-DD HH:MM[:SS[.SSSSSS]]; Could not parse '2018/01/01 23:59:59' as datetime for field timestamp_field_10 (position 10) starting at location 51
```

## `YYYY/MM/DD HH:MM:SS`は取り込めない
`2018/01/01 23:59:59`は取り込めない模様。よくある形式だと思うので辛い。
該当列を消してリトライ。

```sample.csv
col1,col2,col3,col4,col5,col6,col7,col8,col9,col10
null,abc,文字列１,"カンマ,がある",12345,1.2345,20180101,2018-01-01,2018/01/01,2018-01-01 23:59:59
,def,文字列２,"カンマ,がある",67890,6.7890,20180201,2018-02-01,2018/02/01,2018-01-01 23:59:59
```

## 結果

![result1.png](https://qiita-image-store.s3.amazonaws.com/0/175280/422a62c1-c550-4dae-40a3-41cd46746cee.png)
![result2.png](https://qiita-image-store.s3.amazonaws.com/0/175280/52f7c712-5ff9-151d-c176-2729ec8ccd9f.png)

- 空文字は`null`になる
- ダブルクォートの有無に限らず文字列扱いしてくれる
    - 改行文字もOKみたい
        - https://cloud.google.com/bigquery/docs/schema-detect?hl=ja#csv_quoted_new_lines
- `YYYYMMDD`は数値扱いになる
- `YYYY/MM/DD`は日付扱いしてくれる
    - https://cloud.google.com/bigquery/docs/schema-detect?hl=ja#dates
- `YYYY/MM/DD HH:MM:SS`はダメ
    - https://cloud.google.com/bigquery/docs/schema-detect?hl=ja#timestamps

気になる項目が出てきたら都度追記予定。