OmniAICreator/Qiita-1.07M huggingface dataset:
Excel VBA セル内の文字列の数字だけなどを半角、全角にする

# ポイント
配列で変換する文字列を決めます。
配列で決めた文字があるかどうかは、正規表現で決めます。
このためMicrosoft Vbscript Regular Expression 5.5を参照設定してください。
StrConvを使うと空白まで変換されるため、空白を除外するために作りました。

#セル内の文字列のうち、全角の数字、かっこ、加減乗除記号だけを選択して半角にするマクロ

```vb.net
Sub TransferWideNumber()
'かっこ()は除外してある
Const includeParenthes As Boolean = True
Dim wb As Workbook: Set wb = ThisWorkbook
Dim ws As Worksheet: Set ws = ActiveSheet
Dim R As Range: Set R = ws.Range(ActiveCell.Address)
Dim buf As String
Dim i As Long, ar
Dim reg As RegExp: Set reg = New RegExp
If includeParenthes = True Then
ar = Split("1 2 3 4 5 6 7 8 9 0 = ≠ , . + - * ( ) { } [ ]", vbTab)
Else
ar = Split("1 2 3 4 5 6 7 8 9 0 = ≠ , . + - *", vbTab)
End If

If R.HasFormula = False And IsNull(R.Value) = False And IsEmpty(R.Value) = False And IsDate(R.Value) = False Then
With reg
.Global = True
.MultiLine = True
.IgnoreCase = False
If includeParenthes = True Then
.Pattern = "([0-9]|\+|\-|\/|\*|\=|≠|\.|,|\)|\(|\}|\{|\[|\])"
Else
.Pattern = "([0-9]|\+|\-|\/|\*|\=|≠|\.|,)"
End If
For Each R In Selection
If .Test(R.Value) = True Then
buf = R.Value
For i = LBound(ar) To UBound(ar)
buf = Replace(buf, ar(i), StrConv(ar(i), vbWide), 1, -1, vbTextCompare)
Next
R.Value = StrConv(buf, vbWide)
End If
Next R
End With
End If
End Sub
```

#セル内の文字列のうち、全角の数字、かっこ、加減乗除記号だけを選択して半角にするマクロ

全角スペースを半角にしないにしない
ポイントは実際の変換文字列リストを配列で指定し、
配列で指定した文字があるかを正規表現で検索する。
その中に指定の文字があれば、対応する全角文字に変換する。
Strconvをかけるとすべて半角になってしまうので、選択的に半角にする。


```vb.net
Sub TransferNarrowNumber()
'かっこ()は除外
Const includeParenthes As Boolean = True
Dim wb As Workbook: Set wb = ThisWorkbook
Dim ws As Worksheet: Set ws = ActiveSheet
Dim R As Range: Set R = ws.Range(ActiveCell.Address)
Dim buf As String, i As Long, ar
Dim reg As RegExp: Set reg = New RegExp
If R.HasFormula = False And IsNull(R.Value) = False And IsEmpty(R.Value) = False And IsDate(R.Value) = False Then
If includeParenthes = True Then
ar = Split("０,１,２,３,４,５,６,７,８,９,，,．,＊,＋,／,＝,≠,−,（,）,｛,｝,［,〕", ",")
Else
ar = Split("０,１,２,３,４,５,６,７,８,９,，,．,＊,＋,／,＝,≠,−", ",")
End If
With reg
.Global = True
.MultiLine = True
.IgnoreCase = False
If includeParenthes = True Then
.Pattern = "([０-９]|，|．|＊|＝|＋|／|−|（|）|｛|｝|［|〕)"
Else
.Pattern = "([０-９]|，|．|＊|＝|＋|／|−"
End If
For Each R In Selection
If .Test(R.Value) = True Then
buf = R.Value
For i = LBound(ar) To UBound(ar)
buf = Replace(buf, ar(i), StrConv(ar(i), vbNarrow), 1, -1, vbTextCompare)
Next i
R.Value = StrConv(buf, vbNarrow)
End If
Next R
End With
End If
End Sub
```
Swiftにおけるオプショナルなメソッドとは

#オプショナルなメソッドとは

具体例を出して説明すると、UITableViewDataSource内に定義されている、numberOfSectionsInTableViewのように実装が必須でないメソッドのことをオプショナルなメソッドといいます。

ただ、Pure Swiftにはオプショナルなメソッドは存在しません。しかし、@objc修飾子を利用するとオプショナルなメソッドを定義できます。

#@objc修飾子を使用するとどうなるのか
Swiftでは、@objcをプロトコルと、オプショナルメソッド宣言時に付与することで、オプショナルなメソッドを定義することができます。

```Swift:例
@objc protocol TestProtcol {
    @objc optional func optionalMethod()
}

```
Vue.js ElementUIのTimePickerに任意の値を入力する

**※ピッカーで選択したときに値が入らないという不具合があり、ソースを修正しました（2018.3.18 10:10）**

ElementUIのTimePicker（el-time-select）は、基本的にstepで設定した時間刻みでしかバインドしたモデルに値が入りません。
オプションのeditableがtrue（デフォルトでtrue）であっても、stepの値に合うよう自動補正されます。
例えばデフォルトではstepは30分のため、9:02と手動入力すると画面表示錠は9:02ですが、データバインドされる値は9:00です。
el-time-select は Fixed time picker と書かれていますしね。

色々調べたところ、TimePickerコンポーネント自体のuserInputというプロパティで手動入力値を保持しており、Pickerで選択した場合には、valueOnOpenに値が入っているようですので、値のあるほうを取得して手動で代入すればOKでした。

さらに、TimePickerを要素数が動的に変わるようなリスト形式の中で使用したかったので、ｘ番目のオブジェクトにバインドするため、ｘ番目を取得する方法として、タグに属性値を付与して、そこにｘ番という値を持たせるようにしました。

```
<template>
<div>
  <el-col id='scheduleArea'>
    <div v-for='(schedule, index) in scheduleList'>
      <el-row>
        ({{index + 1}}日目)
        <!-- DatePicker, TimePicker にリストの番号をidxNumberという属性で付与しておく -->
        <el-date-picker v-bind:idxNumber='index' v-model='schedule.startDate' type='date' />
        <el-time-select v-bind:idxNumber='index' v-model='schedule.startTime' @blur='inputToStartTime' /> -
        <el-time-select v-bind:idxNumber='index' v-model='schedule.endTime' @blur='inputToEndTime' />
      </el-row>
    </div>
  </el-col>
  <el-col>{{scheduleList}}</el-col>
</div>
</template>

<script>
export default {
  data() {
    return {
      scheduleList: [{
          startDate: '2018-03-18',
          startTime: '09:00',
          endTime: '17:00'
        },
        {
          startDate: '2018-03-19',
          startTime: '09:00',
          endTime: '17:00'
        }
      ],
    }
  },
  computed: {},
  methods: {
    // 引数 componentには、elementUIによってコンポーネント自体（TimePicker）が渡される。
    // _data.userInputには、ユーザ入力値が入っている。
    // _date.valueOnOpenには、ピッカーで選択した値が入っている。
    // 手入力・ピッカーでの選択により、userInputとvalueOnOpenどちらかに値が入り、もう一方はNullのよう。
    // TimePickerはstepに設定された値単位に補正してmodelにバインドするため、手動で値を代入する。
    inputToStartTime(component) {
      this.scheduleList[component.$attrs.idxNumber].startTime =
        (component._data.userInput) ? component._data.userInput : component._data.valueOnOpen;

    },
    inputToEndTime(component) {
      this.scheduleList[component.$attrs.idxNumber].endTime =
        (component._data.userInput) ? component._data.userInput : component._data.valueOnOpen;
    }
  }
}
</script>
```

実行してみると、ちゃんと入力値がデータバインドされています。
![timepicker.png](https://qiita-image-store.s3.amazonaws.com/0/239922/5e17070b-1bc0-6595-c4a8-d480c6238876.png)

ただし、この方法では時刻以外の形式でも入力できてしまうため、何らか入力値チェックや補正をする必要があります。
→　実装しました。こちらのページへ　https://qiita.com/at-sea/items/96fec874ab0566512256

なお、userInputやvalueOnOpenに値が入っていることはChromeの開発者ツールで地道に調べました。下記スクリーンショットだと右のペインですが、[Scope]-[Local]で引数のcomponentの値を調べられますので、その中を一つ一つ開いて[_data]にあることを確認しました。地味な作業でした・・・。値で調べる方法をご存知の方、教えてください。。。 
![picker2.png](https://qiita-image-store.s3.amazonaws.com/0/239922/619181d2-b455-7498-bf1b-25a5d1d3bc57.png)
ELBのStickinessの挙動を確認してみた

Sticky sessionの自体は、わりと一般的な機能だと思いますが、あまり知識がなかったころにえいやっ！で設定して理解が浅かったので、あらためて動作検証してみました。

# ELBのStickiness(維持設定)について

ELBがリクエストを振り分ける際、ユーザーのセッションごとに振り分け先のインスタンスを固定するSticky sessionを提供する機能です。
一度接続が確立すると、Cookieの有効期間を超過するか、接続先インスタンスのヘルスチェックに失敗するまで、同一インスタンスにリクエストを振り分け続けます。

# メリット

以下のように冗長化されたWeb/AP構成で動作を検証してみました。
![Web_App.png](https://qiita-image-store.s3.amazonaws.com/0/30230/70bb9059-0a1c-aa53-9416-7db20a4c1506.png)

1セッションごとに発生するRDS, Appサーバのコネクション数は、Sticky sessionを有効にした場合とそうでない場合とで異なります。

検証過程は冗長なので省きますが、以下のような結果になります。

- ELB->Web, Web->Appでそれぞれ**Sticky sessionを有効にしなかった**場合
    - RDSのコネクション数(最大)：4
    - Appのコネクション数(最大)：2 * 2台
- ELB->Web, Web->Appでそれぞれ**Sticky sessionを有効にした**場合
    - RDSのコネクション数(最大)：1
    - Appのコネクション数(最大)：1

DBやアプリケーションに最大同時接続数の制約があるにもかかわらず、前者はサーバ台数が増えれば増えるほど、サーバ間のコネクションが増大し、余分なリソースを消費するようになるため、サービス全体の同時接続数を増やすことが難しくなります。

一方、後者は１セッションあたり常に１コネクションとなるので、適切なリソース消費が行えるようになります。

# デメリット

今回の検証の中では見つけられませんでした。
サーバ側の障害でエラーを返すようになったとして、ヘルスチェックで切り離されるまで、あるユーザーにはエラーが返るようになりますが、Sticky sessionを無効にした場合も数回に１回エラーが返る状況は変わらないはず。
デメリットをご存知の方に教えていただけると嬉しいです。
Excel アドイン用VBA 選択したセルを縮小して全体表示にする

#縮小して全体表示にするマクロ
これはアドインに登録してツールバーに乗せてもいいかもしれません。

```visualbasic
Sub shrinktofiton()
'For Excel
'選択したセルを縮小して全体表示にする ShrinkToFit
'(複数可能,結合、非結合セルどちらでもよく、混在も可能)
'
Dim R As Range
For Each R In Selection
R.ShrinkToFit = True
Next R
End Sub
```
なんだか随分簡単ですが、これでできます。
OUTLOOK タスク(仕事)で残日数、経過日数を表示させる

#ポイント
##基本
残日数は今日と期限の差であらわすことができる
(本当は期限に日付が入っていない場合のエラー処理をやります)
経過日数は開始日と今日の日付で計算させます
(開始日なんて誰も入れないので、本当はこれもエラー処理が必要です）
##関数
今日の日付を取得するのはDate()
日数の差を計算するのはDateDiff
datediff("d",[開始日時],date())
フィールド名で指定する
"ｄ"が日数
DateDiff("d",[A],[B])
[B]-[A]
日付に何も設定していない場合  #1/1/4501#
西暦4051年1月1日
になっている。
Accessのクエリのようにフィールド名で指定する
(というか実際DASLというSQLの一種を使っている)
次のフィールドを定義する
今回は経過日数と残日数を定義する
##それ以外に付け加えられるもの
手動で更新する必要があるが、たとえば講義で全10回の第1回というような場合のため
[全]と[回]
というフィールドを設定してもよい

##ユーザー定義フィールドはソートできない

##この定義はVBAではできないっぽい
オブジェクトが捕まらない

##厳密にいうと…
経過日数を示すのは難しい
経過日数を示すには
計算を開始する日　現在の日　期限
が必要で新たに計算を開始する日を設定する

#手順
##１．列を作成
###設定の方法
タスク(仕事)を表示させる
[表示]タブ
ビューの設定
列(C)
[内容]タブ
新しい列をクリック
タイトルを入れる
数式を選択
これでOKして、フィールドに表示させ、レイアウトを調整する。
出来上がったらビューの設定から現在のビューを保存する。
##2．作成するユーザー定義フィールドと設定の内容
###フィールド名
経過日数
###式
IIf([開始日]<>#1/1/4501#,DateDiff("d",[開始日],Date()))

###フィールド名
残日数
###式
IIf([期限]<>#1/1/4501# Or Date()>=[期限],DateDiff("d",date(),[期限])

##3.入力
タスクを設定してリストのように表示します。
Outlook的にはTableViewになるようです。
ユーザー定義フィールドはタスクを開いてインスペクター表示しても出てきません。
テーブル表示の画面で
「ゆっくり2回」
入力する欄の部分をクリックします。
するとなぜか入力できます。


#厳密にいうと
##開始日は将来の場合もある
タスクは開始日ではなく事前に登録することもあります。
すると
DateDiff("d",[開始日],Date())
この式はマイナスになります。
このように考えていくと計算を開始する日(個人的にこれを始計日と呼んでいます)が必要です。

###期限の隠しフィールド、そして期限の考え方
期限については一つタスクでメール用の表示の中の期限切れ日時(Expire Date)を使う方法もあります。
また試験などでは試験当日を0にするのではなく試験の前の日が0です。
このように期限も前日か当日か場合によって違います。

##しかしあまり難しいことを考えてもきりがない
なので、単純に表示させた方がいいと思います。
Python3でEnumをいい感じに使う

# やりたいこと
python3で新たに追加されたEnumを利用して、いい感じに使いたい
例えば、以下の感じ

```
step = Step.init
step <- next_step
1番目のステップの処理を実行
step <- next_step
2番目のステップの処理を実行
...
```    

# コード例

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

from enum import Enum
import sys

__author__ = "oomori"
__version__ = "1.0.0"

class Step(Enum):
    init = 0
    step1 = 1
    step2 = 2
    finish = 3

    def __iter__(self):
        return self.value

    def __next__(self):
        next_idx = self.value +1
        if next_idx < len(Step.__members__):
            # step2 = 2, step = 1と逆順で定義されている場合でも
            # value順になるように制御できるようにするため
            steplist = [ name for name, step in sorted(Step.__members__.items(), key=lambda x:x[1].value) ]
            next_name = steplist[next_idx]
            return Step.__members__.get(next_name)
        else:
            raise StopIteration

def main():
    step = Step.init
    while True:
        if step is Step.init:
            print('do somthin on step init')
        elif step is Step.step1:
            print('do somthin on step 1')
        elif step is Step.step2:
            print('do somthin on step 2')
        elif step is Step.finish:
            print('do somthin on step finish')
            break
        step = next(step)

if __name__ == "__main__":
    main()
```

Enum型なので、`step = step +1`とできるかと思ったら、`TypeError: unsupported operand type(s) for +: 'Step' and 'int'`とエラーになる
`IntEnum`型を利用できるんですが、pythonのドキュメントの注意に記載されている通り、
非推奨かつnameを取得できなかったので、上記のようにしてみました。

`next(step)`で次のステップにできるので、けっこう使い道はあるかなと。

# 参考
- [8.13. enum — 列挙型のサポート](https://docs.python.jp/3/library/enum.html)
- [Python 3.4 から標準ライブラリに入る Enum 型が今からでも便利](https://qiita.com/methane/items/8612bdefd8fa4238cc44)
テキストベースでUMLを生成するツール「PlantUML」のセットアップ&操作方法(Mac)

## 「PlantUML」とは？

クラス図やシーケンス図など、各UMLの記述に特化した言語(DSL)です。
Graphvizと併用することで、それを画像として出力できます。

要は __テキストからUMLの画像を生成するツール__ ということです。

## テキストでUMLを生成するメリット・デメリット

### メリット

- __テキストなのでバージョン管理しやすい__
生成前のソースはテキストのみで構成されているので、GitやSVNなどで簡単にバージョン管理できます。
「このタイミングでこのクラスにこの属性を追加した」などが残せるようになるため、これは大きなメリットだと思います。

- __絵を描くのが苦手な人でもUMLを生成できる__
イラストのスキルが低くてもきれいなUMLを生成できます。ありがたいです。

### デメリット

- __新たに言語を覚える必要がある__
UML生成用の言語を新たに覚える必要があります。
ただ、非常に単純な言語なので、この記事を読んでいる方なら全く問題なく習得できると思います。

- __直感的に生成できない__
テキストを入力して作成するため、直感的に考えながら作成することができません。
ですが、私はほぼ必ず紙に下書きしてから作成するため、それほどデメリットだと感じません。清書をテキスト入力で行うか図を描くかの違いのみです。

- __細かいレイアウトの調整ができない__
基本的にはテキストに定義したクラスや関連などに従い、自動でレイアウトが決まります。
ある程度調整することはできますが、もし「○○クラスは絶対に××クラスの左に配置したい」「関連の線が微妙に斜めになっているのが嫌」などがあれば、Visioなどのツールで描くのがいいと思います。

## セットアップ

### 環境

- OS：macOS High Sierra 10.13.1
- PlantUML：1.2018.02

### Javaのインストール

Javaがインストールされていない場合、PlantUMLのインストール時に以下のエラーが発生します。

```shell-session
$ brew install plantuml
…
plantuml: Java is required to install this formula.
JavaRequirement unsatisfied!
You can install with Homebrew Cask:
brew cask install java
You can download from:
https://www.oracle.com/technetwork/java/javase/downloads/index.html
Error: An unsatisfied requirement failed this build.
```

出力内容や[こちらの記事](https://qiita.com/uhooi/items/e047706b9f00d01e1e55)などを参考にJavaをインストールします。

### GraphvizとPlantUMLのインストール

Macの場合、Homebrewからインストールします。

```bash
$ brew install graphviz
$ brew install plantuml
```

私は[すでにGraphvizをインストールしている](https://qiita.com/uhooi/items/83e70e32d5bd7f12af8a#graphvizのインストール)ので、PlantUMLのみインストールしました。

### Vimにシンタックスハイライト用のプラグインを追加

Vimmerのみ行ってください。

PlantUMLの拡張子は `.pu` や `.uml` が使われることが多いですが、デフォルトだとVimでシンタックスハイライトされません。

以下のプラグインを導入することで、シンタックスハイライトされるようになります。
https://github.com/aklt/plantuml-syntax

```vim:.vimrc
call dein#add('aklt/plantuml-syntax')
```

PlantUMLのファイルを編集中に `:make` で画像を出力することもできるようになります。

プラグインの作成者に感謝です。

## 実装

非常に簡単です。
`@startuml` と `@enduml` で囲んだ中にクラス定義や関連を記述するだけです。
コメントはシングルコーテーション `'` です。

説明するより実際に見るのが一番なので、試しに簡単なクラス図を実装してみます。

```pu:car.pu
@startuml

' ----------------------------------------
' スキン設定
' ----------------------------------------

' 可視性のアイコンを非表示にする
skinparam classAttributeIconSize 0

' ----------------------------------------
' クラス定義
' ----------------------------------------

class 車 {
  +車種
  +ナンバープレート
  +走る()
  +止まる()
  +曲がる()
}
note left: 車

class タイヤ {
}

class ドライバー {
  +アクセルを踏む()
  +ブレーキを踏む()
  +ハンドルを切る()
}

class 運転免許証 {
}

' ----------------------------------------
' 関連
' ----------------------------------------

車 "1" *-- "4" タイヤ
車 -- ドライバー
ドライバー "1" o-- "1" 運転免許証

@enduml
```

QiitaではPlantUMLのシンタックスハイライトに対応していないようです。。

属性と操作は `()` の有無で自動判別されます。

見てわかる通り、私は「スキン設定」「クラス定義」「関連」と3つのセクションに分けて記述しています。
他におすすめの書き方があったらコメントなどで教えてくださると嬉しいです。

## UMLの出力

以下のコマンドを実行するだけで、PNG形式のUMLが出力されます。

```bash
$ plantuml {ファイルパス}
```

前述した通り、Vimなら `:make` でも同様のことが行えます。

先ほど実装したクラス図を生成すると、以下の画像が出力されます。
![car.png](https://qiita-image-store.s3.amazonaws.com/0/138245/e898146b-c719-1079-4c8f-3849062f0bc2.png)

簡単にいい感じのUML図を作成することができました！

## 参考リンク

- [PlantUMLをMac OS Xで使う - Qiita](https://qiita.com/kohashi/items/1d2c6e859eeac72ed926)
変更の差分が分かりづらいVR開発プロジェクトをどのように構成管理してきたか

# はじめに

VR開発は Unity や Unreal Engine 4 (以下UE4) などのゲームエンジンを使って開発するのが主流となっています。

ゲームエンジンのプロジェクトは、プログラムのソースコードだけでなく、3Dのシーンの情報や3Dオブジェクトの情報など、多くのバイナリファイルで構成されています。Unityにおける .unity .prefab、UE4における .umap .uasset などがこれにあたります。

バイナリファイルを含んだプロジェクトを構成管理する際に特に問題になるのは、変更の差分を可視化しても人力では分かりづらいことです。
本記事では、この変更の差分が分かりづらいという問題に対して、どのようにアプローチして構成管理してきたかを書いていきます。
まだまだノウハウが少なく拙い内容ですが、参考になれば幸いです。

# どのように構成管理をしてきたか
### 機能ごとのブランチは切らない

基本的に [Git-flow](https://qiita.com/KosukeSone/items/514dd24828b485c69a05) におけるfeatureブランチのような、機能ごとのブランチは切りませんでした。

なぜなら、必要がないからです。
バイナリファイルは変更の差分が分からないので、githubにおいてpullreqしてから差分を確認してマージするという一連の流れにメリットがありません。
また、バイナリファイルはコンフリクトの解消が非常に困難です。複数の機能を並行して開発していると、どのブランチでどのファイルを変更したのか確認するのが難しくなり、コンフリクトの危険性が高まってきます。

以上の理由から、機能ごとのブランチは切りません。
master一本か、もしくはmasterとdevelopのみを使用します。

ブランチを絞るだけでは、コンフリクトの危険性が解消されるわけではありません。そこで次以降に記載するアプローチを組み合わせて、さらにコンフリクトの危険性を抑えていきます。

### できるだけ担当箇所を開発メンバーごとに分ける

同時に同じファイルを変更してコンフリクトをするのを避けるために、できるだけ開発メンバーごとに担当箇所を分けていました。
機能ごとに担当を分けたこともありましたし、スマートではありませんが開発者の名前のフォルダを作成して分けたこともありました。

#### UE4のサブレベルを使う
UE4において、[サブレベル](http://api.unrealengine.com/JPN/Engine/Levels/LevelsWindow/)で担当を分けるのが非常に有効でした。
ただし、カレントレベルを切り替えたときなど、意図しないタイミングでUE4によりパーシスタントレベルに変更が入ってしまうことがあります。その場合は `git checkout -- PersistantLevel.umap` としてパーシスタントレベルの変更を捨てて問題ありませんでした。

### 共通で触る可能性のあるファイルを触る場合は宣言する

開発メンバーで作業箇所を分けていても、シーンのファイルなど共通で触る可能性のあるファイルは出てきます。
そのようなファイルについては、変更する際に開発メンバーにその旨を伝えるようにしていました。

上で挙げた作業分担と合わせて、コンフリクトの危険性を抑えることができていたと思います。

### レビューは動くものをベースに行う

バイナリファイルは差分が分からないので、ファイルの差分を見てソースレビューするという手法が取れません。
なのでソースレビューの代わりに、開発したものを実際に動かして確認していました。

VR体験として成立しているか、例外処理はされているかなどの機能的な観点だけでなく、パフォーマンスや酔いなどの非機能的な観点でも確認を行っていました。

# なぜこの構成管理でプロジェクトが回ったか
### 開発メンバーが少ない

私がこれまで関わったVR開発プロジェクトは開発メンバー2名での体制だったので、お互いにどこを触っているかの把握が容易でした。
またコミュニケーションのコストも低く、「このファイルを触ります」といった宣言も合意をとるのが容易でした。

これがもし4、5名とかになってくると、あるメンバーが「このファイル触ります」と宣言した際にメンバー全員から合意を取るのが大変になるなど、開発効率が下がってしまうと考えられます。

# 課題
### 開発メンバーが多くなった場合にどうする？

上に書いたように、開発メンバーが増えると開発効率が下がると考えられます。

#### Unityではバイナリファイルをテキストで管理するように設定できる
Unityにおいては、[シーンの情報をバイナリからテキストでの管理に変えることができる](https://qiita.com/lycoris102/items/bf0a9ec4a653b4dd97b9#scene%E3%81%AE%E4%BF%9D%E5%AD%98%E5%BD%A2%E5%BC%8F%E3%82%92%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA%E3%81%8B%E3%82%89%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%AB%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B)ので、それによりコンフリクトの解消がいくらか容易になると考えられます。
なので、テキストでの管理にしてコンフリクトを許容し、作業ブランチを切るようにする、という方法を取るのが良いかも知れません。

### やっぱりソースレビューがしたい

UnityのC#や、UE4のC++のようなソースコードはもちろん、UE4のブループリントのようなビジュアルスクリプトについてもレビューをするようにしたいと思っています。

#### ソースコードのみ差分のレビューをする
C#やC++に限って、差分をレビューするようにするというアプローチが考えられそうです。
その際に、レビューの対象を明確にしておくべきだと思います。外部からインポートしたアセットに含まれたソースコードは、レビューの必要がないですからね。

UE4のブループリントについては、[UE4に入っている差分を見るためのツール](https://www.unrealengine.com/ja/blog/diffing-unreal-assets)を利用することでレビューができると考えられます。

### コミットログがより重要になる

バイナリファイルはソースをベースに変更を追うのが難しいので、コミットログを手がかりに変更を追うことが多くなります。
そのため、テキストベースのファイル以上に、コミットの単位やコミットログの文言に気を配る必要があると考えられます。

# おわりに

本記事では自身がどのように構成管理してきたかを書いてきましたが、この方法が最適だとは考えていません。
継続的に改善していく必要があると思っていますし、プロジェクトに合わせて構成管理の方法を変える必要があるとも考えています。

うちではこんなことをやっているなど、何かアイデアがあればコメントを残していただけると嬉しいです。
:last-childか:nth-last-of-type(1)か。

### :last-childは純粋に要素の最後を示す。ここではsection
```css
.f>label:last-child{...}/*don't work*/
```
```html
<div class="f">
 <input id="a" type="radio" name="g"></input><label for="a">aaa</label><section>aaa</section>
 <input id="b" type="radio" name="g"></input><label for="b">bbb</label><section>bbb</section>
 <input id="c" type="radio" name="g"></input><label for="c">ccc</label><section>ccc</section>
 <input id="d" type="radio" name="g"></input><label for="d">ddd</label><section>ddd</section>
 <input id="e" type="radio" name="g"></input><label for="e">eee</label><section>eee</section>
</div>
```

### nth-last-of-typeで指定種類の最後からN番目を指定できる。
```css
.f>label:nth-last-of-type(1){...} /*target last label <label for="e"...*/
```

### 全部
cssで作るタブ。

```html
<div class="f">
 <input id="a" type="radio" name="g"></input><label for="a">aaa</label><section>aaa</section>
 <input id="b" type="radio" name="g"></input><label for="b">bbb</label><section>bbb</section>
 <input id="c" type="radio" name="g"></input><label for="c">ccc</label><section>ccc</section>
 <input id="d" type="radio" name="g"></input><label for="d">ddd</label><section>ddd</section>
 <input id="e" type="radio" name="g"></input><label for="e">eee</label><section>eee</section>
</div>
```

```css
.f{font-size:0/*inline space none*/}
.f>*{font-size:initial}
.f{position:relative;}
.f>section{
 position:absolute;
 top:1.5rem;
 display:none;
 border:1px solid;
 width:300px;height:200px;
}
.f>label{border:1px solid;border-right:0px;}
.f>label:nth-last-of-type(1){border-right:1px solid}
/*tabs*/
.f>[name="g"]{display:none}
;[name="g"]:checked + label{color:orange}
;[name="g"]:checked + label + section{display:block}
```
HTTP(S)プロトコルでデータを送信する方法いろいろ

GETまたはPOSTを使うとき、最近のライブラリやフレームワークを使えば、`id=123&title=hello`や`{id: "123", title: "hello"}`などいろいろな形式で自由にデータを送信することができる。

ただし内部的には厳格にフォーマットが決まっており、適切なリクエストヘッダとリクエストボディを組み合わせないとサーバーやクライアントが意図通りにデータを認識してくれないことがある。

## GET /posts/123

URLパスの中で送信するデータを指定する。Railsや比較的最近のWebフレームワークでよく見かける形式。

```
GET /posts/123 HTTP/1.1
Host: example.com
```

## GET /posts?id=123

URLのクエリパラメータを使って送信するデータを指定する。PerlやPHPで作ったシンプルなWebサイトや、昔ながらのWebサイトでよく見かける形式。

```
GET /posts?id=123 HTTP/1.1
Host: example.com
```

## POST /create (リクエストボディにURLエンコードされたデータ)

リクエストボディを使って送信するデータを指定する。今も昔もいろいろなところでよく見かける形式。

```
POST /create HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded

title=Hello&
text=This+is+a+pen.
```

## POST /create (添付ファイルの送信)

リクエストボディにファイルのバイナリを入れてデータを送信する。Webページのformから添付ファイルを送信するときに使われている形式。

```
POST /upload HTTP/1.1
Content-Type: multipart/form-data; boundary=[boundary_str]
Content-Length: [size]

--[boundary_str]
Content-Disposition: form-data; name="image_file"; filename="image.png"
Content-Type: image/png

[cotent_bytes]
--[boundary_str]
Content-Disposition: form-data; name="image_title"

uploaded_image.png
--[boundary_str]--
```

## POST /create (形式を指定せずバイナリを送る)



```
POST /upload HTTP/1.1
Content-Type: application/octet-stream

[contents_bytes]
```

## POST /create (リクエストボディにJSON)

リクエストボディに送信するデータをJSONで入れる。APIを使ったデータのやり取りでよく使われる形式。

```
POST /posts
Content-Type: application/json

{"title":"Hello","body":"This is a pen."}
```

## 参考リンク

http://article.higlabo.com/ja/request_and_response.html
https://qiita.com/noboru_i/items/827b55b37b2d85e372df
https://murashun.jp/blog/20150920-01.html
RailsへのBootstrap導入でやったことメモ


### 導入環境
Rails 5.1.5   
Ubunts 14.04.5 

### 事前準備
railsのアプリを作成、基本的なブログ機能を構築済み

#### jQueryのインストール
1. https://yarnpkg.com/lang/en/ からYarnをダウンロードし、インストール
2. `yarn add jquery`でjqueryをインストール
3. RailsでjQueryを読み込むためにマニフェストファイルにjqueryのパスを追加

```:app/assets/javascript/application.js
~省略~
//= require rails-ujs
//= require turbolinks
//= require jquery/dist/jquery.js //node_modules内にあるこの行を追加
//= require_tree .
```

#### bootstrapの3系をインストール
1.`yarn add bootstrap@3`でbootstrapをインストール
2. Railsでbootstrapを読み込むためにcssのマニフェストファイルにbootstrapのパスを追加

```:app/assets/stylesheet/application.css
/*
~省略~
*= require bootstrap/dist/css/bootstrap.min この行を追加
*= require_tree .
*= require_self
*/
```

3. Railsでbootstrapを読み込むためにjavascriptのマニフェストファイルにbootstrapのパスを追加

```:app/assets/javascript/application.js
~省略~
//= require rails-ujs
//= require turbolinks
//= require bootstrap/dist/js/bootstrap.min //この行を追加
//= require jquery/dist/jquery.js 
//= require_tree .
```

これで導入は完了、後はindex.html.erbなりにclassタグを指定して実践あるのみ
ampy: MicroPythonマイコンとPCとのファイル転送ツール


MicroPythonは対話モードとスクリプトファイルを実行するモードがあります。スクリプトモードで動かすには、PCなどでプログラムを書き、プログラムファイルをMicroPythonが動くマイコン(ここでは「ボード」と呼ぶことにします)に転送します。
PCとボードとの間のファイル転送ツールはいくつかありますが、そのうちの一つで、M5Stackで動作確認できた[ampy](https://github.com/adafruit/ampy)を紹介します。

![M5Stack](https://ambidata.io/wp/wp-content/uploads/2018/03/pc2m5stack.jpg)

# [ampy](https://github.com/adafruit/ampy)

ampyはAdafruit社が開発したツールで、ツールの名前はAdafruit MicroPython Toolから来ているようです。ampyはシリアル回線経由でPCとボードとの間でファイル転送をします。またPC上のMicroPythonスクリプトをボード上で実行できます。

この記事はversion 1.0.3で評価して書きました。

# インストール

ampyを使うにはPC上にPython 2.7.x か 3.xが必要です。インストールはpipコマンドでおこないます。MacOSでの例を示します。

```bash
$ sudo pip install adafruit-ampy
```

# ampyを使う

ampyはportオプションでボードを接続しているデバイスを指定します。AMPY_PORT環境変数にデバイスを指定しておくと便利です。

```bash
$ ampy --port=/dev/tty.SLAB_USBtoUART ls
flash
$
$ export AMPY_PORT=/dev/tty.SLAB_USBtoUART 
$ ampy ls
flash
```

ampyには次のコマンドがあります。ボードはMicroPythonが動いているマイコンのことです。

*  get: ボードからPCにファイルを転送する
*  ls: ボード上でlsを実行する
*  mkdir: ボード上でmkdirを実行する
*  put: PCからボードにファイルを転送する
*  reset: ボードでソフトリセットとブートを実行する
*  rm: ボード上でrmを実行する
*  rmdir: ボード上でrmdirを実行する
*  run: ボード上でプログラムファイルを実行する

# M5Stackと接続した場合の実行例

M5Stackのファイルシステムは、ルートディレクトリの下にflashというディレクトリーがあり、ファイルをputするとflashの下に置かれます。ampyのディレクトリーの扱いには少しクセがあります。

```bash
$ ampy ls
flash
$ ampy ls flash        # エラーになる
$ ampy ls /flash       # /flashの下のファイルが表示される
boot.py
main.py
config.json
$ ampy mkdir testdir    # /flash/testdirが作られる
$ ampy put test.py /flash/testdir      # エラーになる
$ ampy put test.py /flash/testdir/test.py      # test.pyが/flash/testdir/test.pyとして転送される
```

runコマンドはPCにあるMicroPythonのファイルを、ボードにファイル転送せずにボード上で実行できるため、デバッグ時などに便利です。

```bash
$ cat test.py
print('hello world')
$ ampy run test.py
hello world
$ 
```

# まとめ

ampyはESP8266でもESP32でも動作するMicroPython用のファイル転送ツールです。M5Stackでプログラム開発するときの便利ツールの一つです。
GitHubにSSH認証で接続する

# 環境
・MacOS
・GitHub

# SSH 認証キー（秘密鍵・公開鍵）の生成
```bash
ssh-keygen -t rsa -C "your-mail@address"
```
```bash
Enter file in which to save the key (/YourHome/.ssh/id_rsa):Enter押下
```
```bash
Enter passphrase (empty for no passphrase):任意のパスフレーズ
```
```bash
Enter same passphrase again:任意のパスフレーズ（上記設定値と同じもの）
```

ホーム配下に.ssh/id_rsa（秘密鍵）と.ssh/id_rsa.pub（公開鍵）が作成される。

# 公開鍵の登録
```bash
pbcopy < ~/.ssh/id_rsa.pub
```
クリップボードに公開鍵の内容がコピーされているので、GitHubへログイン

![Add_new_SSH_keys.png](https://qiita-image-store.s3.amazonaws.com/0/83314/ec39769c-dd94-f30a-2979-6a4dc78f663a.png)

Titileは任意の値、Keyにクリップボードにコピーされている内容をそのままペーストする。「Add SSH Key」ボタン押下で登録完了

# 動作確認
```bash
ssh -T git@github.com
```
鍵生成時にパスフレーズを登録した場合は以下が表示されるのでパスフレーズを入力

```bash
Enter passphrase for key '/YourHome/.ssh/id_rsa':
```
以下が表示されればOK

```bash
Hi YourName You've successfully authenticated, but GitHub does not provide shell access.
```

# 参考
[GitHub Help](https://help.github.com/articles/connecting-to-github-with-ssh/)
LLVMのphiとは


## はじめに

LLVMのphiについて、ざっくりと説明します。
個人的な理解を書いているだけなのでご了承ください。

## 予備知識：ブロックとは

phiを理解する前に、ブロック(Basic Block)について知っておく必要があります。

ざっくり言うと、ブロックとは「ラベルから、次のラベルの手前まで」のことです。
アセンブリで説明すると、

```llvm:
label1:
  ; 何か処理
  ; ここまでが、'label1'という名前のブロック
label2:
```

の場合、```label1:``` から ```label2:``` の直前までが一つのブロックになります。
```label2:``` 以降はまた別のブロックになります。


## phiとは

phiとは、「どのブロックから飛んできたかで値を選択する」命令です。
例を挙げると、

```llvm:phi.ll
define i32 @some_function(i32) {
entry:
  %1 = icmp eq i32 %0, 0
  br i1 %1, label %phi_label, label %label1

label1:
  %2 = icmp eq i32 %0, 1
  br i1 %2, label %phi_label, label %label2

label2:
  br label %phi_label
  
phi_label:
  %3 = phi i32 [5, %entry], [8, %label1], [3, %label2] ; entryから来たら5、label1からなら8,それ以外なら３を返す。
  ret i32 %3
}
```

上記の関数some_functionは、
・引数が０なら５
・引数が１なら８
・それ以外なら３
を返す関数です。

```%3 = phi i32 [5, %entry], [8, %label1], [3, %label2]``` の行の
. ```[5, %entry]``` が"entryブロックから来たら５"
. ```[8, %label1]``` が"label1ブロックから来たら8"
.  ```[3, %label2]``` が"label2ブロックから来たら３"
をphiの値とする、ことを表しています。

飛んでくるブロックが増えたなら、```[5, %entry], [8, %label1], [3, %label2]``` の部分はブロックの数だけ増やせます。
```[5, %entry], [8, %label1], [3, %label2], [1, %some_label], [2, %another_label]``` などのようにいくらでも（？）増やせます。


## なぜphiが必要なのか？

[静的単一代入（Static Single Assignment form）](https://ja.wikipedia.org/wiki/静的単一代入)において、

```c:C言語っぽい例
int x;
if(何か条件){
  x = 1;
}else{
  x = 2;
}
```

のように条件によって変数の値を変えたい場合に必要だとか何とか。詳しくは知らない。



## おまけ：全コード

一応、some_functionを試すmain関数つきのコードを載せておきます。

```llvm:phi.ll
define i32 @some_function(i32) {
entry:
  %1 = icmp eq i32 %0, 0
  br i1 %1, label %phi_label, label %label1

label1:
  %2 = icmp eq i32 %0, 1
  br i1 %2, label %phi_label, label %label2

label2:
  br label %phi_label
  
phi_label:
  %3 = phi i32 [5, %entry], [8, %label1], [3, %label2]
  ret i32 %3
}

@0 = private unnamed_addr constant [4 x i8] c"%d\0A\00"

declare i32 @printf(i8*, ...)

define void @main() {
entry:
  %0 = call i32 @some_function(i32 0)
  %1 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @0, i32 0, i32 0), i32 %0)

  %2 = call i32 @some_function(i32 1)
  %3 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @0, i32 0, i32 0), i32 %2)

  %4 = call i32 @some_function(i32 2)
  %5 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @0, i32 0, i32 0), i32 %4)
  ret void
}
```

実行方法は、

```shell:bash
$ llvm-as phi.ll
$ lli phi.bc
```
古い Slack チャンネルを自動でアーカイブする機能を作りました

# 💡作ったもの
毎月第1月曜日に久しく投稿のないSlackチャンネルを1つだけアーカイブしてくれます。こういうのは機械的にやっちゃったほうがいいでしょ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/130874/f012a8a6-7acb-0d7c-1f12-8a2167e9e442.png)

チャンネルに参加しているみんなが寂しくないように謎のメッセージを残してからアーカイブするようにしました。なお、参加者にはメンションが届くし、必要なら手動で戻せるので実害はないかと思います。

# :octocat:成果物
[saitota/SlackChannelArchiver](https://github.com/saitota/SlackChannelArchiver)
Lambda + Cloudwatch Events 起動のサーバレス構成です。

# ✋構築手順
[README](https://github.com/saitota/SlackChannelArchiver/blob/master/README.md) に書きました。Serverless Framework でさくっとデプロイできます。

# 🔧工夫したところ
Serverless Framework を活用するのが楽しくなってきました。単純にデプロイするだけではなく、ステージ毎に設定ファルを切り替えたり `（environment_xxx.yml）` 、プロファイルをオプションで切り替えられることを知りました。

```sererless.yml
provider:
  stage:  ${opt:stage, self:custom.defaultStage}
  region: ${opt:region, self:custom.defaultRegion}
  profile: ${opt:profile, self:custom.defaultProfile}
custom:
  defaultStage: dev
  defaultRegion: ap-northeast-1
  defaultProfile: default
  otherfile:
    environment:
      dev: ${file(./environment_dev.yml)}
      prd: ${file(./environment_prd.yml)}
functions:
  fnc:
    environment:
      ${self:custom.otherfile.environment.${self:provider.stage}}
※一部省略してます
```

明示的に AWS-CLI プロファイル名を指定しなければ defaut を使うようにしました、個人的には事故らないように deault プロファイルを使わないので、私の環境では明示しないとエラーになります。プロファイルを指定する場合は、

```bash:console
$ serverless deploy --profile account1
```

ステージも指定しなければ dev 環境にデプロイされます。プロダクションなら次のように書く。間違えて prd にデプロイするようなミスがなくなります。

```bash:console
$ serverless deploy --stage prd
```

あと面白いのが、プラグイン `serverless-plugin-aws-alerts` で Invoke エラーやスロットリングに対してアラーム設定ができる。もう画面ポチポチしなくていいんだよ！

```sererless.yml
custom:
  alerts:
    stages:
      - ${opt:stage, self:custom.defaultStage}
    alarms:
      - functionErrors
      - functionThrottles
plugins:
  - serverless-plugin-aws-alerts
※一部省略してます
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/130874/c4371260-a2b1-cc9d-e1e9-b469bc6a884c.png)

# 🐛 副作用
もちろんアーカイブしてほしくないチャンネルも、時が立てばアーカイブしてくれます。手動で戻します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/130874/64764de8-06e5-773a-367d-f08eb3bba691.png)


# 🐛 ハマった所
Slack API を生で叩いててハマることがたまにあります。チャンネル一覧などは取得できるのに、[channels.archive メソッド](https://api.slack.com/methods/channels.archive) を呼ぶときだけエラーが。権限が不足している？ちゃんと `channels:write` もScope設定したし、そんなはずないんだけど…

```
{'ok': False, 'error': 'missing_scope', 'needed': 'channels:write', 'provided': 'identify,bot:basic'}
```

どうやらアーカイブなどの一部操作は BOT ユーザではきないみたいです。考えることを諦め Legacy トークンを利用しました。
後日調べたところ、 OAuth でアクセストークンを発行するのが正しいやり方のようです。

[Slackで業務チャンネルの平穏を維持するbot、そして人間のトークンをbotに与える話 - Qiita](https://qiita.com/ru_shalm/items/f88ce03adb5d792c415e)
[SlackでOAuth2を利用したときのメモ - Qiita](https://qiita.com/subarunari/items/3e4c6060fcefd4c65257)
【最速３分】jupyter notebookをssh経由サーバ上で使う方法

こんにちは。コードは以下です。

//remote
ssh -N -L 9999:localhost:9999 anata@anata_no_ip_address
jupyter notebook --no-browser --port=9999

//local
ssh -N -L 9999:localhost:9999 anata@anata_no_ip_address

おわりです。

あとはブラウザにtokenを入力すれば接続できます。

他にも以下のコードでコンフィグ設定ができるようですが、
jupyter notebook --generate-config

今回は「最速３分」なので飛ばしました。

> 2018-03-19 

というかGoogle Colabを使ったほうがいい。
https://colab.research.google.com
俺言語 その22

#概要
俺言語をやってみた。
avrにアセンブラで実装してみた。
ROM化してみた。
単三乾電池4本で駆動してみた。

#環境
avr studio 4
attiny85 1mhz
tera term
usb-serial

#写真
![MVC-006F.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/ef9edc22-61ea-09af-0ec2-0e3e4a8ea3c7.jpeg)


以上。
MeCabで文章を単語ごとに分けて単語listを作るメモ

#Mecabで単語のlistを作成したい
単語を要素として、listを作りたいと思ったので
そのやり方をメモ。


以下のブログを参考にさせていただきました。より詳しく書いていらっしゃいます。
[MeCab-Pythonで分かち書きと形態素解析](http://testpy.hatenablog.com/entry/2016/10/04/010000)

#環境

Python : 3.6.2(Anaconda)
mecab-python3 : 0.7

#Code
###Pythonのコード

```Python
import MeCab

text = 'Pythonを使って、機械学習を勉強する。'

tagger = MeCab.Tagger("-Owakati")

#str型で、単語が空白で別れる
str_output = tagger.parse(text)
print(str_output)
print(type(str_output))

#listに変換する
list_output = str_output.split(' ')
print(list_output)
print(type(list_output))
```
###出力
```
Python を 使っ て 、 機械 学習 を 勉強 する 。 
<class 'str'>

['Python', 'を', '使っ', 'て', '、', '機械', '学習', 'を', '勉強', 'する', '。', '\n']
<class 'list'>
```
GitBucketでファイルアップロードで制限に引っかかった話

# 環境
CentOS7
Tomcat 7.0.76
GitBucket 4.22.0
# 発生した問題
releaseからファイルをアップロードしようとすると標準では3MiBまでしかできないらしい。
もちろん引っかかった。
他の人も引っかかってそうだから残しておく
# 試した方法
いろいろネットで調べて試行錯誤した
## System Administrationから設定する
そんな項目は存在しなかった。実装お願いしたいな
## ggる
開発者[takezoeさんのブログの記事](http://takezoe.hatenablog.com/entry/2017/07/01/135426)が引っかかった。

> アップロード可能なファイルサイズを指定するための--max_file_sizeオプションが追加されました。
> また、システムプロパティgitbucket.maxFileSizeでも同様に指定することができます。gitbucket.warをサーブレットコンテナにデプロイしている場合はこちらの方法で設定するとよいでしょう。

**これだ!**Tomcatで動かしているのでこれでできそう

## 実行ユーザーtomcatの.bash_profileに書き込む。
```bash:.bash_profile
JAVA_OPTS='-Dgitbucket.maxFileSize=134217728' # Bytes = 128MiB
export JAVA_OPTS
```
だめでした。

## $CATALINA_HOME/bin/setenv.shに設定する
```bash:setenv.sh
JAVA_OPTS='-Dgitbucket.maxFileSize=134217728' # Bytes = 128MiB
export JAVA_OPTS
```
だめでした。

## tomcatのcatalina.propertiesに記述する
/etc/tomcat/catalina.propertiesにありました!

```properties:catalina.properties(追記)
gitbucket.maxFileSize=134217728
```

できました!

# 結論

- /etc/tomcat/catalina.propertiesに追記でシステムプロパティというのに反映(?)される。
- 設定ファイルたくさんあってわかんなくなる
エディターでは分かりにくい、.shなのに実行できないスクリプトファイルの確認方法

# 目的
他者／他社からzipやtar.gzで.shファイルを受領、
linux環境で実行してみると以下のエラーメッセージが表示される。
```
/bin/bash^M: bad interpreter: そのようなファイルやディレクトリはありません (No such file or directory)
```
- 特に送り主がWindowsをメインとしている環境からの場合が要注意

# 結論
改行コードをCRLFからLFに置換して実行できるかを確認する。
より正確に言うならCRを除去する

```bash
sed -i 's/\r//' *.sh
```

# 経緯
エディターで表示させてもUTF-8の.shファイル、しかしlinux上で実行すると、
```
/bin/bash^M: bad interpreter: そのようなファイルやディレクトリはありません (No such file or directory)
```

まずcatで改行コードを確認してみる
`^M`がCR、`$`がLFを表す

```bash
$ cat -e *.sh
#!/usr/bin/env bash$
first_command^M$
second_command^M$
```

sedで置換してしまいます。

```bash
sed -i 's/\r//' *.sh
```

置換後

```bash
$ cat -e *.sh
#!/usr/bin/env bash$
first_command$
second_command$
```

## 注意
OSやカーネルのバージョンによってはCRLFであっても実行できる場合があります。

# 参考url
[/bin/bash^M: bad interpreter: そのようなファイルやディレクトリはありません (No such file or directory)](http://totech.hateblo.jp/entry/2014/03/19/174129)
RaspberryPi avs-device-sdkでの外部スピーカ出力

RaspberryPi zero で、Alexa (avs-device-sdk) を試そうとしたけど、

外部スピーカ(USB)出力が標準ではサポートしていない。（下記）
The SampleApp uses the default input and output for audio.

そんな時は、
Troubleshooting Guide
見てね。

https://github.com/alexa/avs-device-sdk/wiki/Troubleshooting-Guide

しかし、Zeroではインストールに時間がかかるので、Pi 3の方が賢明かな？
多段sshで環境変数を利用する方法

# 目的
- 踏み台サーバー（要塞サーバー）からしかアクセスできないサーバーにローカル環境から簡単に確認をしたい
- いわゆる多段sshでのダブルクォーテーション・シングルクォーテーションの使い方

# 結論
ローカル環境の環境変数は""で囲まれた中なら使える
クォーテーションが必要な部分がローカル環境でも取得できるならこの方法で実現

```bash
target_date=`date -v-2d +%Y%m%d` # 一昨日の日付
ssh bastion "ssh goal_server \"ls -ltr /var/log/goal_server/*${target_date}*.log\""
```

# 経緯
ローカル環境はmacOS、ssh先はすべてCentOS（Linux）を前提としています。

クォーテーションを使用しない場合、参考urlに載せたようにヒアドキュメントを利用すると簡潔にコマンドを書くことができます。

```bash
cat <<EOS | \ssh bastion 'ssh goal_server sh'
hostname # goal_serverと表示
EOS
```

環境変数として日付を利用したく、dateコマンドで「昨日」や「一昨日」が欲しい場合にはクォーテーションで囲む必要があり、
最初は環境変数を`goal_server`で得てから実行すればできると思ったが、`target_date`には何もセットされない。

```bash
# ダメ　 # 一昨日の日付
cat <<EOS | ssh bastion 'ssh goal_server sh'
'target_date=`date -d "2 days ago " +%Y%m%d`; ls -lr /var/log/goal_server/*${target_date}*.log'
EOS
```

ローカル環境の環境変数は""で囲まれた中なら使えることを利用し、
クォーテーションが必要な部分がローカル環境でも取得できるならこの方法で実現

```bash
target_date=`date -v-2d +%Y%m%d` # 一昨日の日付
ssh bastion "ssh goal_server \"ls -ltr /var/log/goal_server/*${target_date}*.log\""
```
# 参考url
[SSHでリモートにコマンド実行する方法とその際にクォーテーションのエスケープを気にしないようにする方法](http://progmemo.wp.xdomain.jp/archives/1164)
Laravelトラブルシューティング：外部キーが作成できない

Laravelのマイグレーションで外部キーが作成できなかった件についてのメモ。

外部キーが作成できない原因なぞいろいろあるが、Laravelのちょっとした仕様が理由だった件について。

## 問題

まず、下記で外部キーの作成を試みたところ、

```php5
$table->foreign('product_id', 'product_id_foreign')
                ->references('id')->on('products')
                ->onDelete(self::CASCADE)->onUpdate(self::CASCADE);
```

マイグレーションを実行すると、次のようなエラーになった。

```
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table `products_product_categories` add constraint `product_id_foreign` foreign key (`product_id`) references `products` (`id`) on delete cascade on update cascade)
```

## 原因
結論から書くと、カラムの型が一致していなかったのが原因。

プライマリキーを外部キーに使用することはよくあると思うが、参照されるプライマリキーが `unsigned int` だったのに対して、外部キーを設定しようとしたカラムが `int` だった。

Laravelの場合、プライマリキーの設定は一般的に下記のようにすると思うが、`increments`メソッドは暗黙的に`unsigned int`型のカラムを生成する。

```php5
$table->increments('id');
```
ちゃんと[ドキュメント](https://laravel.com/docs/5.5/migrations#columns)に書いてある。

## 解決策
言うまでもないが、外部キーを設定するカラムを参照先のカラムの型と同じにすればOK。
Xamarin で manifestPlaceHolders もどきの環境変数展開

こんにちは、豚野郎です。 Xamarin 素敵ですね。XAMLでレイアウト組めるので、MVVMでのアプリ開発が捗ります。

さて、 アプリ開発をしていると、Twitterログインや広告を追加したくなります。
これらにはAPIキーをコードに埋め込む必要がありますが、当然リポジトリの管理化には置きたくありません。
Android では、 manifestPlaceHolders を使用してビルド時に挿入する事が可能ですが、どうググっても VisualStudio にはそのような素敵機能が見当たりません…。
とはいえ、APIキーを管理するクラスを .gitignore に埋め込むのは、クローン直後にビルドエラーになるためなんだかいやです。
できるならば manifestPlaceHolders のようにビルド時に挿入したいです。
標準機能で提供されていないので、ビルドイベントでファイル内の文字列を置換する事で実現してみようと思います。

# 対象ファイルに置換用文字列を埋め込む
```cs:Environment.cs
public class Environment
{
    /// <summary>
    /// Twitter API の API KEY を取得します
    /// </summary>
    public string TwitterConsumerKey { get; } = "${TWITTER_CONSUMER_KEY}";

    /// <summary>
    /// Twitter API の API SECRET KEY を取得します
    /// </summary>
    public string TwitterConsumerSecretKey { get; } = "${TWITTER_CONSUMER_SECRET_KEY}";
}
```

`${TWITTER_CONSUMER_KEY}` と `${TWITTER_CONSUMER_SECRET_KEY}` が置換用の文字列です。
ビルド時に上記の文字列を環境変数に定義された文字列に置換します。

# Windows 環境用置換スクリプトを作成する

```powershell:replace.bat
@echo off

set outpath=%1
set inpath=%outpath%.work
set before=%2
set after=%3

copy /Y %outpath% %inpath%
type nul > %outpath%
setlocal enabledelayedexpansion
for /f "tokens=1* delims=: eol=" %%a in ('findstr /n "^" %inpath%') do (
  set line=%%b
  if not "!line!" == "" (
    set line=!line:%before%=%after%!
  )
  echo.!line!>> %outpath%
)
endlocal

del /Y %inpath%
exit /B 0
```
Windows には sed コマンドが存在しない為、 bat ファイルで代替します。
第一引数のファイル内に、第二引数で指定された文字列が存在する場合、第三引数で指定された文字列に置換します。
スクリプトは [こちら](https://qiita.com/kurukurupapa@github/items/f4439fd5c33f6ebfec62) を参考にさせて頂きました。

# プロジェクトに PreBuildEvent と PostBuildEvent を埋め込む。

```xml:Example.csproj
<Project>
  ... 中略 ...
  <PropertyGroup Condition=" '$(OS)' == 'Windows_NT' ">
    <PreBuildEvent>
      copy /Y $(ProjectDir)Environment.cs $(ProjectDir)Environment.cs.bak
      call $(ProjectDir)replace.bat $(ProjectDir)Environment.cs ${TWITTER_CONSUMER_KEY} $(TWITTER_CONSUMER_KEY)
      call $(ProjectDir)replace.bat $(ProjectDir)Environment.cs ${TWITTER_CONSUMER_SECRET_KEY} $(TWITTER_CONSUMER_SECRET_KEY)
    </PreBuildEvent>
    <PostBuildEvent>move /Y $(ProjectDir)Environment.cs.bak $(ProjectDir)Environment.cs</PostBuildEvent>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(OS)' != 'Windows_NT' ">
    <PreBuildEvent>
      source ~/.bash_profile
      cp $(ProjectDir)Environment.cs $(ProjectDir)Environment.cs.bak
      sed -i '' 's/${TWITTER_CONSUMER_KEY}/'$TWITTER_CONSUMER_KEY'/g' $(ProjectDir)Environment.cs
      sed -i '' 's/${TWITTER_CONSUMER_SECRET_KEY}/'$TWITTER_CONSUMER_SECRET_KEY'/g' $(ProjectDir)Environment.cs
    </PreBuildEvent>
    <PostBuildEvent>mv $(ProjectDir)Environment.cs.bak $(ProjectDir)Environment.cs</PostBuildEvent>
  </PropertyGroup>
</Project>
```
PreBuildEvent にて、環境変数をコード中に存在する特定文字列を置換する事で、ビルド時の環境変数展開を実現しています。
また、誤って環境変数が展開されたソースコードを git にコミットしない為に、 PreBuildEvent にて作成したバックアップファイルを PostBuildEvent で元ファイルに上書きしています。
Macでminikubeを使ってkubernetesクラスタを動かす

タイトル通り。
[minikube](https://github.com/kubernetes/minikube)でローカルにkubenetesクラスタを構築してみる。

## インストール

Homebrew-Caskで簡単にインストール出来る。

```
$ brew cask install minikube
```

## 事前準備

```
$ minikube start
```
してminikubeを起動する。
そして、`kubectl`で認識されることを確認する。
```
$ kubectl config current-context
minikube
```

minikubeがdockerを内包している形になっているので、環境変数もろもろを書き換える。

```
$ eval $(minikube docker-env)
```

## ローカルのdockerとminikubeでDockerイメージを共有する

minikubeがdockerを内包している形になっているため

- `docker images`
- `(eval $(minikube docker-env) && docker images)`

では結果が異なる。

回避するには、`eval $(minikube docker-env)`してから`docker build`するなどして、minikube環境下Dockerイメージを作って登録するのが手っ取り早い。

あるいは、

```
docker save <repository>/<image>:<tag> | (eval $(minikube docker-env) && docker load)
```

とする方が後からでも出来るので手軽かもしれない。
何をやっているかというと、ローカル側のDockerイメージを`docker save`で文字列として書き出して、minikube側で標準入力として受け取って`docker load`してDockerイメージとして保存している。

さらに別の方法として少し面倒だが、ローカルにdocker registryを立ててそのregistryに`docker push`しておき、そのregistry上のDockerイメージとして使う、というのもある。
[minikubeでinsecure docker registryを使う - Qiita](https://qiita.com/komattaka/items/0e9f1f03b0a3675995bf)

## kubenetesを動かす

何でも良いので適当に作る。
今回はnginxを動かしてみる。

```
$ kubectl run --image=nginx --port=80 nginx
deployment "nginx" created

$ kubectl expose deployment nginx --port=80 --type=NodePort
service "nginx" exposed

$ kubectl get svc nginx
NAME      TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
nginx     NodePort   10.104.96.71   <none>        80:31485/TCP   1m
```

これで`nginx`にアクセスできる...というわけではない。

```
$ curl '10.104.96.71' -I
curl: (7) Failed to connect to 10.104.96.71 port 80: Operation timed out
```

minikubeの機能を使ってアクセス出来る。

```
$ minikube service nginx --url
http://192.168.99.100:31485
```

このURLに対してリクエストを送ればnginxからレスポンスが返ってくる。  
ちなみに`--url`つけなければ勝手にブラウザで開かれる。

```
$ curl $(minikube service nginx --url) -I
HTTP/1.1 200 OK
Server: nginx/1.13.9
Date: Thu, 08 Mar 2018 10:12:23 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 20 Feb 2018 12:21:20 GMT
Connection: keep-alive
ETag: "5a8c12c0-264"
Accept-Ranges: bytes
```

minikube経由でアクセスするあたりは以下を参照。

[ローカルでkubernetesを動かせるminikubeを試す - 年中アイス](https://reiki4040.hatenablog.com/entry/2017/04/11/221122)

## ダッシュボードを見る

minikubeを使っていなければ`kubectl proxy`して`localhost:8001/ui`で見れるアレ。  
`minikube dashboard`で見ることが出来る。

ちなみにGrafanaでモニタリング用のダッシュボードも見ることが出来る。

```
minikube service --namespace=kube-system monitoring-grafana
```

どういったものがminikubeで見れるかは`minikube service list`すると一覧で表示されるようになっている。
Python：Pandasでエクセルリストを読んで、Vlookup的な事をする

# 概要
前回つくったTIFFをPDFに変換するコードで
元のTIFFファイルに送信元FAX番号がついていたので、電話帳から番号をキーにして
法人名を当て込むコード

## 使用環境
インタープリター：Python3.6
使用ライブラリ：Pandas
使用ファイル：xlsx
※例：下記のようなエクセルファイルでつくった電話帳
![テスト.png](https://qiita-image-store.s3.amazonaws.com/0/244225/e4c48aaf-e410-a6fc-84d2-259a7a19b9f8.png)

### コード
```python:Pandas_test.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pandas as pd

# 読み込むエクセル一覧
input_file_name = 'C:/test.xlsx'

# xls book Open (xls, xlsxのどちらでも可能)
#ファイルからシートネームの取得
input_book = pd.ExcelFile(input_file_name)
#ブックからシートネームの取得
input_sheet_name = input_book.sheet_names
#一枚目のシートから2時配列をパース、データ型はオブジェトで読まないと詰む
input_sheet_df = input_book.parse(input_sheet_name[0], dtype='object')
#2字配列を表示
print(input_sheet_df)

#キーとなる電話番号例
Bangou="111222333"

#条件指定を指定する。※queryで変数使う場合は＠使わないと詰む
result =input_sheet_df.query('FAX == @Bangou')
print(len(result))

#検索する番号が配列にある場合は2列目の値を持ってくる
#同じ番号はリストにないものとして考えてます。
if len(result) >= 1:
    result=(result.iat[0, 1])

#結果表示
print(result)
```

### 結果
法人Aだけ表示される筈です。
ファイル名の置き換えをしたかったので書いてみた
Rails5でFullCalendarの実装

色んなサイトでRails FullCalendar と探してみたが、バージョンが変わったせいか、あまり参考にならなかったので、最速で実装できるコードを列挙する。

結局fullcalendar公式サイトのドキュメントが一番役になった。

まずは下記のURLからfullcalendarをダウンロードする
https://fullcalendar.io/docs/installation

次に rails new ファイル名 でrailsファイルの作成
`rails new fullcalendar`

railsではjQueryとMomentを入れる際にGemfileに書かなければならない。
Gemfileに以下を記入。

```ruby:Gemfile
gem 'fullcalendar-rails' 
gem 'momentjs-rails'
gem 'jquery-rails'
```
そしたらgemの更新をする
`bundle install`
次にrails g controllerでview,controllerファイルの作成をする。
目的はイベントのデータベース、カレンダーのビュー表示である。
ex) `rails g controller calendar index`
※必要であれば，modelも作成し，migrationファイルを作成する
viewを編集する

```html:app/views/calendar/index.html.erb
<div id="calendar"></div>
```

んで、application.jsに以下を記入

```js:application.js
//= require jquery
//= require moment
//= require fullcalendar
//= require fullcalendar/lang/ja

$(document).ready(function(){
  $('#calendar').fullCalendar({
  });
});
```

application.cssにも以下を記入

```css:application.css
*= require fullcalendar
```
また、calendar.coffeeに以下を記入。これを書かないと表示されない。

```coffeescript:calendar.coffee

$(document).on 'turbolinks:load', ->
  $('#calendar').fullCalendar {}
  return

$(document).on 'turbolinks:before-cache', ->
  $('#calendar').empty()
  return
```

これでrails server で接続し、localhost:3000/calendar/indexに行けばカレンダーが表示されるはず。
![スクリーンショット 2018-03-17 12.29.02.png](https://qiita-image-store.s3.amazonaws.com/0/240897/d9030441-b6d9-eab7-13a4-0f86b82f01d2.png)

割と出すまでに時間がかかった。特にcalendar.coffeeに書くところにたどり着くまでにかなり時間がかかった。
次はgoogleカレンダーのイベントとの連結とかをやりたい。
Homebrewでchromedriverをインストールする

selenium-server-standalone と chromedriver をインストール

```
$ brew update
$ brew install selenium-server-standalone
$ brew install chromedriver
```

参考
https://gist.github.com/stoshiya/3dc36187ede3e6eee3e4

# エラーが出た場合

```
$ brew install chromedriver
Error: No available formula with the name "chromedriver"
Found a cask named "chromedriver" instead.
```

```
$ brew cask install chromedriver
==> Satisfying dependencies
==> Downloading https://chromedriver.storage.googleapis.com/75.0.3770.8/chromedriver_mac64.zip
######################################################################## 100.0%
==> Verifying SHA-256 checksum for Cask 'chromedriver'.
==> Installing Cask chromedriver
==> Linking Binary 'chromedriver' to '/usr/local/bin/chromedriver'.
🍺  chromedriver was successfully installed!
```
bitflyer apiを使ったビットコイン自動売買システム

## 概要
 - bitflyer apiを使ってビットコインを自動売買
 - 損はしたくない

## 開発環境
python, mysql, Django, bitflyer api

## 自動売買流れ
 - ある時点でbitcoinを買う、買った時点でbitcoinの価格、買う前の円などをDBに保存する
 - 前回データを参照して、購入だったら、今回は販売する
 - 前回買った金額よりある基準の(例：2%とか)利益が発生した場合のみ行う
 - これをずっとループさせる

## 結果
 - 6235円 -> 6238円 -> 6248円 -> 6345円　-> 6379円 -> 6388円　増えた！
 - 
![スクリーンショット 2018-03-17 12.10.44.png](https://qiita-image-store.s3.amazonaws.com/0/88511/0f962d5f-8483-696b-0fd9-2339a7aa6626.png)

## 問題点
 - 損はしないけど、売買時点来るのが数少ない
Python：TIFFをPDFに変換する


# 経緯
会社のFAX複合機は勝手にTIFFを指定のフォルダに保存してくれるのですが、
TIFFなのでPDFにしたかったので書いてみました。
## 使用環境
インタープリター：Python3.6
使用ライブラリ：os

そのほかアプリ：Tiff2Pdf
配布元：https://bitmiracle.com/libtiff/
ライセンスおよび使用方法：https://bitmiracle.github.io/libtiff.net/
### コード
```Python:Tiff2PDF
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os

# 保存元のパス：I:/000.FAX/受信控
# 出力先のパス：C:/FAX_PDF/
# 上記は任意にて変更してください。

# パスの指定し取得したファイル一覧をまわす
files = os.listdir("I:/000.FAX/受信控")　

for BFR_LIST in files:
    # PDFコンバーターを用意
    cmd_file = "C:/tiff2pdf\Tiff2Pdf.exe"
    command = cmd_file

    # 変換後のＰＤＦ名に置き換え
    AFT_LIST = BFR_LIST.replace('.tif', '.pdf')

    #指定フォルダにファイルが存在している場合はスキップ
    if bool(os.path.isfile("C:/FAX_PDF/"+AFT_LIST )) is True:
        continue

    #  PDFコンバーター引数渡し
    command += " " + "-o" + " C:/FAX_PDF/" + AFT_LIST+ " I:/000.FAX/受信控/" + BFR_LIST

    # PDFでない場合は変換をスキップ
    if bool(AFT_LIST.endswith("pdf")) is False:
        continue

    #コマンド確認用
    #print (command)

    # PDFの変換を実行
    os.system(command)
    command=[]

```
【Oracle】CREATE文『結果にコミットする』?

#1.はじめに

OracleのDBを使う事があるのだが、CREATE文を流す時に『あれっ？COMMITって必要ないの』となったので調べた事をメモ。

#2.なぜ『あれっ？』てなったか
個人的にSELECT以外のDBの状態を変化させるような作業は全てCOMMITが必要と考えていた。
INSERT → COMMIT。DELETE → COMMIT。CREATE →　Non COMMIT。
テーブル作成時にコミットしていないことに気づき、『結果にコミットしなくて良いのか？』となった。

#3.DDL文は『暗黙コミット』

CREATE文などのデータ定義言語(DDL)文は、明示的にコミットしなくても暗黙的にコミットされるとのこと。
その他、SQL*PlusをEXITかQUITコマンドで終了した場合にも暗黙コミットされるとのこと。

<参考>
https://www.shift-the-oracle.com/transaction/commit.html
http://oraclemasterdb.seesaa.net/article/96566762.html

##DDL例
　・CREATE文 (CREATE TABLE,CREATE SEQUENCE,CREATE SYNONYM) 
　・ALTER文 (ALTER TABLE,ALTER USER) 
　・DROP文 (DROP TABLE,DROP SEQUENCE,DROP VIEW) 
　・TRUNCATE文 
　・RENAME文
hubot-slack v4でチャンネルIDからチャンネル名を拾ってくる方法

hubot-slack v3までは `msg.envelope.room` にはRoomの名前が入っていたのが、hubot-slack v4からはRoom IDに変わったらしい。

[ここの記事](https://qiita.com/0tofu/items/ee23e1023f8f09ef088f)を見ると簡単に変換できるように見えたのだが、`SlackDataStore`がdeprecatedらしくWarnが出て[Migrationガイド](https://github.com/slackapi/node-slack-sdk/wiki/DataStore-v3.x-Migration-Guide)を案内された。

Migrationガイドとソースコードを読んだ感じから次のようにすれば`SlackDataStore`を使わずにRoomの名前が取れることがわかった。

```coffeescript
robot.hear /.*/i, (res) ->
  robot.adapter.client.web.channels.info(res.message.room)
    .then((response) ->
      roomName = response.channel.name
```

そんなわけでRoomの名前が必要な場合は上のような感じで拾ってきましょう。