OmniAICreator/Qiita-1.07M huggingface dataset:
ABC03CとD問題

#C問題

##解答の方針
与えられたRから大きい順にK個取り出し、
取り出したものを小さい順から比較していけばいい。
高橋君のレートに各Rが引っ張られるので、近しいものから比較していけば、影響が小さくなるから。

##コード

```python:abc03c.py
N,K = list(map(int,input().split()))
R = list(map(int,input().split()))

R = sorted(R)
ans = 0

for i in range(N-K,N):
    ans = (ans+R[i])/2
print(ans) 
```
#D問題部分点解答
##
まずは部分点を目指そうと思った。

R*Cの平面で、X*Yの長方形が配置されるパターンの数は、
平面の隅に長方形を置いたとすると、
平面の長さから長方形の辺の長さを引いた数だけ、縦と横それぞれずらせるので、
(R-X+1)*(C-Y+1)のパターン数が考えられる。

次に、DとLの並び方の組み合わせを求めてX*Yの配置パターンと書けてやれば答えが求まる。
部分点の場合X*Y=D+Lなので、D+L個からD個選ぶ組み合わせの数を求めればよい。

最初は以下のような関数を作成し、組み合わせの数を求めたが、

```python:combination.py
def comb(n,m):
    res = 1
    for i in range(m):
        res *= (n-i)/(i+1)
    return res
```

計算結果が大きくなると、間違った値を返していた。
おそらく、商を求めているので、数値がFloat型になっており、大きな値を保持できなかったと考えられる。

ので、math関数のfactorialを利用して組み合わせの個数を求めた。

##コード

```python:abc03d.py
import math

R,C = list(map(int,input().split()))
X,Y = list(map(int,input().split()))
D,L = list(map(int,input().split()))
Comb = 1

f = math.factorial
Comb = f(D+L)//f(D)//f(L)


res = ((R-X+1)*(C-Y+1)*Comb)%1000000007


print(res)

```
#（追記）D問題満点解答
##解答の方針
Atcoderの解説にある通り、X*Y内で上下左右にくっついて？いるものだけを数えたい。
包徐原理を利用して、くっついていないものを求め、全パターンとの差を求める。

#コード
```python:abc03dver2.py
import math

def Comb (n,m):
    if n < m:#（X-2),（Y-2）などを参照することがあるので条件を追加
        return 0
    f = math.factorial
    Comb = f(n)//f(m)//f(n-m)
    return Comb

def calc (xy,d,l):
   return Comb(xy,d)*Comb(xy-d,l) 

if __name__ == '__main__':
    R,C = list(map(int,input().split()))
    X,Y = list(map(int,input().split()))
    D,L = list(map(int,input().split()))
    

    comb = calc(X*Y,D,L) #X*Y>D+Lの時の全組合せを求める。X*Y=D+Lの時X*Y-D=Lになるのでx*yCd*1となる。
    
    if X*Y != D+L:
        #すべてのケースから壁にぴったりくっついていないケースを求める
        comb -= calc((X-1)*Y,D,L)*2     #左右どちらかにくっついていないケースは同じ値なので、一方を2倍することで横にくっついていないケースを求められる。
        comb -= calc(X*(Y-1),D,L)*2     #上下の場合も同じ
        
        comb += calc((X-1)*(Y-1),D,L)*4 #（右,上）(右,下),（左,上）（左,下）の４パターン
        comb += calc((X-2)*Y,D,L) #（右,左）
        comb += calc(X*(Y-2),D,L) #（上、下）

        comb -= calc((X-2)*(Y-1),D,L)*2 #（右,左,上）（右,左,下）
        comb -= calc((X-1)*(Y-2),D,L)*2 #(右,上,下)(左,上,下)

        comb += calc((X-2)*(Y-2),D,L)
    res = ((R-X+1)*(C-Y+1)*comb)%1000000007
    print(res)

```


#参考文献
https://mathtrain.jp/hojo
JavaScript: [[1]] < [[2]]; // => true

題名でだいたい終わっているんですが、1要素の配列はNumberにキャスト（？）することで第一要素を取り出せるようです。

```javascript
// +をつけて数値にしてみる
> +[[1]]
1
// なので比較もできる
> [[1]] < 2
true
> [[1]] < 0
false
```

要素数が2つになると`NaN`になるようです。

```javascript
> +[[1, 2]]
NaN
```

Spec読めば仕組みは分かるんですが、時間がないので割愛。

**使っちゃ負けな気がする**。
PIXEL for PC メモ

[pixel for PC](https://www.raspberrypi.org/blog/pixel-pc-mac/) セットアップメモ。

簡単だった。

- インストール時にキーボードは `Japanese` に固定した
- UI のメニューから設定を選び出して locale などを日本仕様に変更する（フォントの追加は不要だった）
- `chromium-l10n` を追加する
- `fcitx-mozc` を追加する
1.1 プログラミングとは (C++からのプログラミング入門

# はじめに
僕自身、C++を勉強するためにプログラミングの入門シリーズを記事にして書いていきたいと思います。今予定しているには第一章として**C++の基本文法**です。
予定している読者はプログラミングを勉強したことがない方で、基礎からしっかりとコンピュータサイエンスのことを勉強したい方向けです。今回のシリーズを全て読んでいいただけると、プログラミングの基礎を理解できるように作っていくつもりです。ただ、論理や基礎に重点を置きたいので、作りたいもの（Webやゲームなど）がある方、つまりプログラミングの応用に興味がある方はにはこちらのシリーズを参考にするよりも他のものを調べたほうが良いと思います。特に WebはC++を勉強しても仕方がないところはあります。
**この記事ではこれから勉強するプログラミングとは何かということをお話します。**

# プログラミングの定義
実際に説明をはじめて行く前に、これから全て話すことは全て僕の中の理解や解釈です。教科書や一般的な解釈や理解とは違い場合がありますのでご理解いただけると幸いです。

僕はプログラミングをこのようことだと考えます。
**プログラミング: C++やJavaなどのプログラミング言語で機械を動かすこと**

プログラミングを説明するために「プログラミング」を使ってしまってますが、「プログラミング言語」というのはC++やJavaなど具体的な例をあげれるのでこのようにしました。
ここの定義で大事なことは**機械を動かすこと**です。私たちは毎日と言っていいほど機械を動かしています。マウスを利用してカーソルを動したり、アイコンをタッチしてアプリを開くなどです。ただそのようなことはプログラミングとは呼ぶことは難しいでしょう。
もう少し深く考えてみましょう。一つの例として、何気なくしているキーボートで文字を入力するということを取り上げていきます。どうしてキーボードにある「A」のボタンを押すだけでパソコンの画面には「a」という文字が出るのでしょうか。それは「A」というキーを叩くことで、どこかの誰かさんが書いたプログラミングが動き、そのプログラムが機械に「"a"を画面に出力する」ように命令しているからです。そのプログラムを言語を使って設計、実装することがプログラミングです。

# 機械語とプログラミング言語
プログラミング言語はいくつもあります。それぞれに長所、短所があり簡単に「この言語がいい」とは言えません。今回はC++という言語を勉強していきます。C++は非常に基本的な言語で比較的に機械語に近いものです。よく0と1というのをお聞きすると思いますが、機械語というのは機械が直接処理できる言葉の事を指します。そうです、一般的に機械はプログラミング言語を直接処理することはできません。プログラミング言語は機械語に変換される必要があります。その変換することを**コンパイル**といいます。

# 実際にプログラミングをみてみる
このようにあーだこうだ説明をされても実際にプログラミング言語というのはどういうものなのかということをみてみないとイメージがわきにくいですね。ということで、実際にプログラミング言語を見ていきましょう。ここでは最も単純な動きのひとつである**文字を出力**するプログラムをみてみます。

```cpp
#include <iostream>

int main() {
   std::cout << "プログラミングは面白い" << std::endl;
   return 0;
}
```
このプログラムは「プログラミングは面白い」という文字を画面に表示してくれます。

今現在は全くわからなくて大丈夫です。これからこのようなものを書いていくことになります。
実際にこのプログラムを動かすには機械語に直し（コンパイル）なければなりません。それはいろいろと作業があるため、それとこちらのプログラムの詳しい説明は次の記事にしたいと思います。
在 Kotlin 裡覆寫 property 的 setter 

今天複寫一個成員變數的 setter 之後，發現後續拿到的值還是 null ，
查了一下原來是雖然在 setter 有拿到一個值，但是還是要自己設定到該變數裡面去。

## 目前的經驗

### Objective-C

一開始從 Objective-C 時代開始
是需要自己把 setter 拿到的直設定到 instance variable：

```objc
- (void)setName:(NSString *)name {
    _name = name; // _name 是 @property 在自動 synthesize 之後附贈的 instance variable
}
```

### Swift

但是到 Swift 時代之後，這件事情不用（或是說不能）再自己做，於是在寫慣用的 didSet 的時候就逐漸習慣不要寫這個東西了：

```swift
var name: String? {
    didSet {
        // 做設定完想做的事
    }
}
```

## Kotlin

```kotlin
var name: String? = null
    set(newName) {
        field = newName
    }
```

field 是 Kotlin 提供的一個魔術變數，在想要覆寫 setter 行為的時候，可以把該設定的數值設定進 field
Volume相対パス指定でもdocker runがしたい！

# 結論
相対パスの先頭に`$PWD`を付けることで解決できます。


# 現象
`docker run`のVolumeを相対パス指定がしたい。
なぜなら、例えばGitHubの`README.md`のUsageを書くときに、「このファイルのあるディレクトリ上で以下のコマンドを実行してね」という形で実行コマンドを書きたいからです。絶対パスで記述してしまうと、そのまま使えないのです。

ところが・・・

```
$ docker build -t original_ubuntu .  # dockerbuildファイルが現在いるディレクトリ内に存在しているものとする
$ docker run -it -v .:/temp original_ubuntu
docker: Error response from daemon: create .: volume name is too short, names should be at least two alphanumeric characters.
See 'docker run --help'.
```

ひえぇ〜😅
どうやら、`-v`のホスト側ディレクトリは絶対パスもしくは名前を指定するということで、相対パスの指定はできないようです。
（参考： http://docs.docker.jp/engine/reference/run.html#volume ）


# 解決法

## (簡単)`$PWD`をつける
相対パスの冒頭に環境変数`$PWD`を付ければ解決できます。
```
$ docker run -it -v $PWD:/temp original_ubuntu
```

MacOSXやUbuntuなどでは、環境変数`$PWD`によって実行中のディレクトリの絶対パスを取得できるのを利用しています。
なお、万が一、環境変数`$PWD`が設定されていないOS上で実行する場合は、上述の`$PWD`を`$(pwd)`に置き換えてください。

## `docker-compose`を使う
`docker-compose`の`volumes`を使えば解決できます。（これだけのために使うのは変ですが。。。）

具体的には、まず`docker-compose`をインストールします。（詳細な説明は省略します。）

次に、`dockerfile`と同じディレクトリに`docker-compose.yml`を用意します。

```yaml:docker-compose.yml
version: "3"

services:
  main:
    build:
      context: .
      dockerfile: dockerfile
    container_name: original_ubuntu
    volumes:
      - ./:/temp
```

最後に、以下のコマンドを実行すれば、起動します。

```
$ docker-compose run main
```


# 最後に
大きなプロジェクトでは環境変数などでパスの管理をする方が良いのでしょうが、
小さなプロジェクトやテスト的に色々試してみた結果を残したいときに是非お使いください。
Divorce lawyers, Matrimonial lawyers, Child custody lawyers 

We understand that there are unfortunate circumstances in your life and when you see yourself stuck in family dispute it’s important to have quality legal advice as soon as possible we are professional <a href="http://ansarisolicitorfirm.com/divorce-lawyers-ahmedabad/"><b>Divorce Lawyers in Ahmedabad</b></a>. We also provide legal advice in all kinds of matrimonial concerns as we are the best Matrimonial Lawyers in Ahmedabad. When you have a family dispute it’s important to have well experienced Child custody lawyers it’s important to take the legal guardian ship of the child when you are legally separated. So if you need any kinds of assistance regarding family disputes we have years of expertise in all kinds of disputes and will be able to provide you the best legal advice. 

For more information call us on 0972 333 79 84 or visit our website http://ansarisolicitorfirm.com/
UnityのiPhoneX対応案

以下は`Unity2017.1.1f1`、`Xcode9.0GM`で確認しています。


# 前置き
iPhoneXの対応がめんどくさそう
https://developer.apple.com/ios/human-interface-guidelines/overview/whats-new/


# やりたいこと
Unity側でいちいち対応するのは面倒なので、Unityの描画領域を変更して、
iPhoneXの場合は上下に余白を持たせれば良いのでは？という案。


|iPhone 8| iPhoneX before | iPhoneX after |
|:-----------------:|:------------------:|:------------------:|
|![iphonex8p.png](https://qiita-image-store.s3.amazonaws.com/0/19872/ba3155a5-b792-9391-3933-24b1e0fe723e.png)|![iphonex1.png](https://qiita-image-store.s3.amazonaws.com/0/19872/fe5d1515-75a3-f876-0291-4c27d3a69da7.png)|![iphonex2.png](https://qiita-image-store.s3.amazonaws.com/0/19872/aa430e4e-3f82-f98d-eb09-dd7c35e6bcec.png)|


`iPhoneX before`の画像は、`iPhone 8`の画像と同じコードをそのまま実行したものです。
どう表示されるかはもちろんUnityでの実装によりますが、このサンプルの場合は
画面上部に合わせてテキストを表示しているので、iPhoneXの凹部に隠れてしまっています。

`iPhoneX after`の画像は、Unityの描画領域を上50pt、下40pt短くし、余白部分に画像を設定しています。
ついでにステータスバーも表示しています。


# ソース

GitHubに上げました。
https://github.com/tkyaji/UnityIPhoneXSupport

`UnityIPhoneXSupport.unitypackage` をインポートすると、
`PostProcessBuild`でビルド時にUnityのソースを書き換えて、余白を設定するようになります。

余白のサイズと色、または画像を定数で指定できます。


## やってること

### 1. iPhoneXの場合、ステータスバーを表示する

iPhoneXではステータスバーの非表示は非推奨とのことなので、表示するようにします。

Unityの`PlayerSettings`で、`Status Ber Hidden`が設定されている場合のみ以下の処理を行います。

* `Info.plist`の設定を、ステータスバー表示とする
* `UnityViewControllerBaseiOS.mm`を書き換え、iPhoneXの場合は表示、それ以外は非表示とする


### 2. UnityのViewサイズを変更する

`UnityAppController.mm`、`UnityView.mm`を書き換え、`UIWindow`と`UIView`のサイズをそれぞれ変更します。
高さを90pt短くし、Windowの位置を50pt下げています。
これで上50pt、下40ptの余白ができます。
上下余白部分にUIViewをそれぞれ設定し、色を設定します。
さらに画像がある場合は`UIImageView`を`addSubView`します。


# 備考

* シミュレータで少し確認しただけなので、もしかしたら色々問題があるかもしれません。使用する場合は自己責任でお願いします。
* iPhoneXの`Safe Area`は左右にも余白があるため、ちゃんとやるなら左右にも気を使う必要がありそうです
* 余白部分がただの黒帯とかだと、そのせいでリジェクトになる可能性があるかもしれません
* iPhoneXかどうかは画面アスペクト比でざっくり判定しています
【FileMaker】印刷するときの罫線

さて、FileMaker 12以上で罫線を印刷する際、レイアウト上は罫線があってもプレビューモードにした時に表示されないことがあります。

こんな感じに。
<img width="573" alt="filemaker_keisen_print2.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/b3934146-43ed-8831-a903-c0a3637fe14c.png">

こういう風↓に出したいんだよ、という設定の仕方がレイアウト設定にあります。
<img width="589" alt="filemaker_keisen_print3.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/2bf5ab49-e65d-b7f0-5cb5-37ff34c5079a.png">

レイアウトの設定↓で、「現在のレコードのみフィールドに枠を表示する」という設定のチェックを外すだけです。
<img width="486" alt="filemaker_keisen_print1.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/917566c8-e1d9-f0dd-a71f-1af0002ccf26.png">

このチェックは、FileMaker 12以上ではデフォルトでチェックがついています。
FileMakerのサポートページにもありましたので、参考までに。
[フィールド枠が印刷されない](http://filemaker-jp.custhelp.com/app/answers/detail/a_id/11078/~/%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E6%9E%A0%E3%81%8C%E5%8D%B0%E5%88%B7%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84)

逆に、意図的に出したくないフィールドの罫線は、
・インスペクタで罫線を消す
・マージ変数やマージフィールドで実装する（デフォルトの設定は、罫線なし）
のどちらかで対応できます。

同じレイアウトで入力と印刷をしたい場合はインスペクタで調整、単に表示だけの場合はマージフィールド、など、用途に合わせるといいです。

FileMakerは、ver.11と12以降とで大きく変更した部分が多数あります。
ver.11でできていたことがver.12以降では新たに設定やインスペクタを変更しなくてはならないこともありますので、ファイル変換などをしてFileMakerアプリをアップグレードした際には意識してチェックをして、ユーザから思わぬクレームを頂かないようにしましょう。
API設計時に認識合わせするべき基本項目まとめ(フロントエンドエンジニア目線)

サーバーサイドとフロントエンドに開発が分かれている時、API設計についてコンセンサスを取っておくことは非常に重要になってきます。この記事では、API設計時に認識合わせをするべきポイントをまとめました。

なお、自分はフロントエンドエンジニアなので、少し目線に偏りがあるかもしれません。

## API定義書の管理
エクセルで管理するとかなると変更管理が地獄になるので、早い段階でプロジェクトにあった形式のものを選ぶ。APIインターフェースは議論を重ねながら頻繁に変更していくことになるので、必ずコードベースでバージョン管理できるものが望ましい。

ツールの選択肢としては下記のようなものを検討する。経験則ではswaggerが多いイメージ

- API blueprint
- postman
- swagger
- JSON Scheme

## HTTPステータスコード
プロジェクトにおけるステータスコードの使い方を定義する

- 正常系
- リダイレクト系
- クライアントエラー系
- システムエラー系

## エラーハンドリング
おおよそ次の２パターンになる

1. HTTPのレスポンスコードでハンドリングする
2. 基本的には200で返し、body内にrescode等をつけて独自に定義する


## 0とnullの区別
どういう時に0を返し、どういう時にnullを返すのかについて、ルールを統一する。
数字としての0がほしいのか、値がないことを示すnullがほしいのか。グラフUIには直で影響されるのでプロダクトでの見せ方まで考えて検討する。

## 命名
- 省略を許すか
    - info / information、yoy / year on year
    - 専門用語の扱いはどうするか

## 日付のフォーマット
YYYYMMDDとか、UTC時間かとか決める。
フロントエンドとしてはmoment.jsでパースできれば基本なんでも良いはず

## 値がない時
値がない時、キー自体がなくなるのか、キーは残して空の配列を返すのか、等をしっかり決めることでバグりにくくなる
例えば次のように定めるとよい

| 型       | 値がない時 |
|:-----------------|------------------:|
| string             | null |
| number           | null |
| object             | 空のオブジェクト {} |
| array               | 空の配列 [] |
古い MySQL (5.0.77) をビルドしてインストールする

ちょっと古い CentOS (5.4) で古い MySQL をインストールする必要があったのでメモ


### MySQL インストール

参考: http://myknowledge.seesaa.net/article/99361578.html

```
cd /usr/local/src
yum -y install gcc gcc-c++ ncurses-devel
wget --no-check-certificate http://downloads.mysql.com/archives/mysql-5.0/mysql-5.0.77.tar.gz

tar -xvf mysql-5.0.77.tar.gz
cd /usr/local/src/mysql-5.0.77
./configure \
	--prefix=/usr/local/mysql \
	--with-mysqld-user=mysql \
	--with-client-ldflags=-all-static \
	--with-mysqld-ldflags=-all-static \
	--with-charset=utf8 \
	--with-collation=utf8_general_ci \
	--with-extra-charsets=all \
	--enable-assembler \
	--enable-local-infile

make
make install
```

### MySQL 初期化設定

```
groupadd -r mysql
useradd -r -g mysql mysql
/usr/local/mysql/bin/mysql_install_db \
	--basedir=/usr/local/mysql \
	--datadir=/var/lib/mysql \
	--user=mysql
chown -R mysql:mysql /usr/local/mysql

cp /usr/local/mysql/share/mysql/mysql.server /etc/init.d/
service mysql.server start

/usr/local/mysql/bin/mysql_secure_installation
```

## 自動起動設定

```
chkconfig --add mysql.server
chkconfig mysql.server on
chkconfig --list|grep mysql
mysql.server   	0:off	1:off	2:on	3:on	4:on	5:on	6:off
```
xen に virt-install で centos5.4 のイメージを作成するまで

```
virt-install \
  --name=centos5-4 \
  --location=http://archive.kernel.org/centos-vault/5.4/os/x86_64/ \
  --file=/var/lib/xen/images/centos5-4.img \
  --file-size=20 \
  --vcpus=2 \
  --ram=1000 \
  --paravirt \
  --nographics \
  --nonsparse
```

完了したらそのまま reboot してログインするので以下を実行して yum を実行可能にしておく

```
sed -e 's/^mirrorlist=/#mirrorlist/g' -e 's/#baseurl=/baseurl=/g' -e 's/mirror.centos.org\/centos\/$releasever/vault.centos.org\/5.4/g' /etc/yum.repos.d/CentOS-Base.repo -i.org
```

参考: http://dy.hateblo.jp/entry/2017/05/11/172154
古いC言語(C89/C90)での変数宣言

## きっかけ
業務として初めてC89(C90)のC言語環境に飛び込むことになった。（組み込み関係）
良く知らない環境なのでお勉強しようと思った。
とはいえ大体は参考のリンク先で分かるので、その他気が付いたことを書く。

## 参考
[旧時代のC言語を使うのはそろそろやめよう。 - Qiita](http://qiita.com/raccy/items/8fd7765d1d22f29e5d82)

[C言語の最新事情を知る： C99の仕様 - Build Insider](http://www.buildinsider.net/language/clang/01)

[Diagnostic flags in Clang — Clang 6 documentation](https://clang.llvm.org/docs/DiagnosticsReference.html#wc99-extensions)
↑記事を書いてから気が付いたけど、コンパイラが言語規格に準拠している前提であれば警告を見れば規格のエッセンスが分かりそうだ。

## 動作確認環境
環境はWandbox使ってみた： [[Wandbox]三へ( へ՞ਊ ՞)へ ﾊｯﾊｯ](https://wandbox.org/)

※この記事では、clang5.0.0使ってOptimizationにチェックして`-std=c89`にして`-Weverything`付けた環境で見てみた
設定例：https://wandbox.org/permlink/IauhP7p8oMNB6kFy

## 変数の宣言時初期化
変数宣言はスコープの先頭だけでしょ、宣言は処理の前に書かないとダメなんでしょ。知ってる知ってる。
と思っていたけど、変数宣言時の初期化であれば関数呼び出しも書ける。
ということはC89であっても下記のリファクタリングができる。

### before
``` c:C89
#include <stdio.h>

static int func(void) {
    return 0;
}

int main(void) {
    int val;
    val = func();
    printf("val = %d\n", val);
    return 0;
}
```

### after
``` c:C89
#include <stdio.h>

static int func(void) {
    return 0;
}

int main(void) {
    const int val = func(); /* 宣言時に初期化！ */
    printf("val = %d\n", val);
    return 0;
}
```

### before_例2
```c:C89
#include <stdio.h>

static int func(void) {
    return 0;
}

static int func2(int i) {
    return i + 1;
}

int main(void) {
    int val;
    int val2;
    
    val = func();
    val2 = func2(val);

    printf("val = %d\n", val);
    printf("val2 = %d\n", val2);
    return 0;
}

```

### after_例2
```c:C89
#include <stdio.h>

static int func(void) {
    return 0;
}

static int func2(int i) {
    return i + 1;
}

int main(void) {
    const int val = func(); /* 宣言時に初期化! */
    const int val2 = func2(val); /* 宣言時に初期化した変数を使って宣言時に初期化! */

    printf("val = %d\n", val);
    printf("val2 = %d\n", val2);
    return 0;
}

```

## 構造体の宣言時初期化とコンパイル時定数
構造体の初期化周りはコンパイル時定数でなくてはならないという制限がC89にはある。
つまり、下記のようなリファクタリングはC89だと無理（C99やC++03であれば可能）。

### before
```c:C89
#include <stdio.h>

typedef struct ST {
    int x;
}ST;

static int func(void) {
    return 0;
}

int main(void) {
    const int val = func();
    ST st;
    st.x = val;
    printf("val = %d\n", val);
    printf("st.x = %d\n", st.x);
    return 0;
}

```

### after(error!)
```c:C89
#include <stdio.h>

typedef struct ST {
    int x;
}ST;

static int func(void) {
    return 0;
}

int main(void) {
    const int val = func();
    const ST st = {val}; /* error: initializer for aggregate is not a compile-time constant */
    printf("val = %d\n", val);
    printf("st.x = %d\n", st.x);
    return 0;
}

```
一定期間過ぎたファイルを自動削除（find -deleteオプション）

## 古いログファイルを簡単に削除したいとき
`find` コマンドでできます。
[こちら](http://qiita.com/iron-breaker/items/74a2ed1753587476157f)のように、find + xargs というのが多いのかもしれませんが、-delete オプションを使っても一発です。

```
find /path/to/log -name '*.log' -mtime +7 -delete
```
日数指定のところは以下をご参考に。
[findコマンドのmtimeオプションまとめ](http://qiita.com/narumi_/items/9ea27362a1eb502e2dbc)
[findコマンドのmtimeオプションについて](https://doruby.jp/users/SK/entries/find_mtime_)

これをcronに設定しておけばOKです。
※OS依存（BSD系？）の模様。

##### 参考
[【linux】蓄積されていくログファイルなどを定期的に削除する例](https://www.softel.co.jp/blogs/tech/archives/4503)
[find の -delete オプション](http://d.hatena.ne.jp/lurker/20060703/1151936124)
GitコマンドをProxy環境可で利用する。


## プロキシを設定する
Gitを使っていると、環境によってはプロキシ経由でアクセスする必要が出てきます。
そんな時は、以下の設定を実行することで、プロキシ経由でアクセスすることが出来ます。

```bash
git config --global http.proxy http://[proxy]:[port]
```

## 特定の接続先のみプロキシ設定を有効にする

最初の設定だと、すべてのアクセスがプロキシ設定経由となってしまいます。
実際に使っていると、一部のGitリポジトリのみ、プロキシ経由でアクセスする
必要が発生したので調べてみました。

まずは構文。

```bash
git config --global http.[URL].proxy  http://[proxy]:[port]
```

実際に使ってみるとこんな感じ

```bash
git config --global http.https://github.com/.proxy http://sample.com:8080
```

## 設定内容を確認する
実行結果を確認するには、以下のコマンドを実行してください。

```bash
git config --global -l
```

実際には、~/.gitconfigファイルに記述されています。
見てみるとこんな感じに記述されていました。

```bash
[http "https://github.com/"]
	proxy = http://sample.com:8080
```
【Swift3】RealmSwiftをCarthageで導入する

# 環境
- swift 3.1
- Xcode 8.3.3
- Carthage 0.25.0

# 参考
公式ドキュメント
https://realm.io/docs/swift/latest/

# 導入手順
Carthageを導入してない方は以下の公式を参考にして下さい
https://github.com/Carthage/Carthage#installing-carthage

1,Carthageファイルに以下を記述

```
github "realm/realm-cocoa"
```

2,プロジェクトディレクトリ内で以下を実行

```
$ carthage update
```

3,プロジェクトファイルを開く
4,Build Phasesを開く
5,"+"アイコンを押下
6,Run Scriptに```/usr/local/bin/carthage copy-frameworks```を追加
7,InputFilesに以下を追加

```
$(SRCROOT)/Carthage/Build/iOS/Realm.framework
$(SRCROOT)/Carthage/Build/iOS/RealmSwift.framework
```
![スクリーンショット 2017-09-19 12.55.36.png](https://qiita-image-store.s3.amazonaws.com/0/137903/22555ea7-becb-d0ea-cf2a-e813b4a98bc9.png)

8,Generalを押下
9,Linked Frameworks and Librariesの"+"アイコンを押下
10,Add Othersを押下
11,以下2つを追加追加する

```
Carthage/Build/(対象デバイス)/RealmSwift.framework
Carthage/Build/(対象デバイス)/Realm.framework
```
![スクリーンショット 2017-09-19 13.32.30.png](https://qiita-image-store.s3.amazonaws.com/0/137903/1cb25308-cf65-a93b-8d56-063151cbcee1.png)
![スクリーンショット 2017-09-19 13.37.33.png](https://qiita-image-store.s3.amazonaws.com/0/137903/755997dd-6fd2-a076-3c4d-29023540a02e.png)


# 使用

お疲れ様でした。あとは使いたいSwiftファイル内にてimportして、開発を再開して下さい！

```swift

import RealmSwift
```
javaでメールアドレスのMXレコードを調べてドメインチェックする

WEBでメール受付～とかやってると
正しいメールに混じってスパムメールが数多く飛んでくるかと思います。

メールを受け付けた後に「受付完了！」のメールを返信しようとしても
スパム相手だと
そんなアドレスないよ！とエラーリターンの山が積まれていくのを見ていく日々・・・
コレなんとかならないの？！

メールアドレスの＠マークの前部分はユーザに該当しちゃうので
送ってみないと分からないのですが

少なくとも
＠マークの後ろ部分は本当に存在するドメインなのかチェックしよう！

ということが昔あり、javaで組んだ感じです。

特に説明はないです。

```java
import java.util.Hashtable;

import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;

public class MXLookup {
	public static void main(String[] args) {
		exec("yahoo.jp");
		exec("yahoo.co.jp");
		exec("126.com");
		exec("127.com");
	}
	private static void exec(String hostname) {
		System.out.println( hostname + " : " + doLookup( hostname ) + "" );
	}
	private static String doLookup( String hostName ) {
		try {
			Hashtable<String,String> env = new Hashtable<String,String>();
			env.put("java.naming.factory.initial", "com.sun.jndi.dns.DnsContextFactory");
			DirContext ictx = new InitialDirContext( env );
			Attributes attrs = ictx.getAttributes( hostName, new String[] { "MX" });
			Attribute attr = attrs.get( "MX" );
			if( attr == null ){
				return null;
			}
			StringBuilder sb = new StringBuilder();
			for(int i=0;i<attr.size();i++){
				if(sb.length() > 0){
					sb.append(", ");
				}
				sb.append(attr.get(i));
			}
			return sb.toString();
		} catch (NamingException e) {
			return null;
		}
	}

}

```


ちなみに作成したシステムは
[受信メールをシェルに食わせる](http://qiita.com/n_a/items/216492452da400b94ee0)
でメールを受信したタイミングでキックされるシェルからこのJavaが呼ばれ
メール送信者のフィルタリングをする感じです。

以上です
ご参考になれば。
C#のWindowsフォームアプリケーションでメインスレッドのGUIを更新する方法

いまさらな内容ですが、色々やり方があるようで、自分の場合はコレです。
※コメントでいただいたやり方に変えました！

```csharp
// 呼び出すメソッドの定義(匿名メソッドを使う場合は不要)
public void writeToConsole(string msg)
{
    textbox.Text += msg + Environment.NewLine;
}
```

```csharp
// マルチスレッドから呼び出す
if (InvokeRequired)
{
    // 戻り値がvoidで、引数がstring1個の場合
    Invoke( new Action<string>(writeToConsole), "解析終了" );
}
else
{
    textbox.Text += msg + Environment.NewLine;
}
```

もちろんThread.Start()だろうが、Task.Run()だろうが、この方法でOKです。

おまけ。匿名メソッドを使う場合はこちら。

```csharp
Invoke( new Action(delegate (string msg) {textbox.Text += msg + Environment.NewLine;}), "解析終了" );
```

↑のラムダ式版。

```csharp
Invoke( new Action<string>((msg) => textbox.Text += msg + Environment.NewLine) ), "解析終了" );
```

## メソッドの引数がない場合や、戻り値がvoidでない場合
寂しいのでいくつか例を。
戻り値がvoidならAction、void以外ならFuncの定義済みデリゲートを使います。
### 戻り値がvoidで、引数なしの場合
```csharp
// 呼び出すメソッドの定義
public void funcp0()
{
    ...
}
```

```csharp
// マルチスレッドから呼び出す
Invoke( new Action(funcp0) );
```

### 戻り値がvoidで、引数がstringとintの2つの場合
```csharp
// 呼び出すメソッドの定義
public void funcp2(string msg, int nLineNo)
{
    ...
}
```

```csharp
// マルチスレッドから呼び出す
Invoke( new Action<string, int>(funcp2), "解析終了", 100 );
```

### 戻り値がdoubleで、引数がstringとintの2つの場合
```csharp
// 呼び出すメソッドの定義
public double funcdp2(string d, int n)
{
    ...

    return 100.0;
}
```

```csharp
// マルチスレッドから呼び出す
Invoke( new Action<string, int, double>(funcdp2), "50.0", 75 );
```

おまけ。匿名メソッドを使う場合はこちら。

```csharp
Invoke( new Func<string, int, double>( delegate (string d, int n){ return double.Parse(d) + n + 100.0; } ), "50.0", 75 );
```

↑のラムダ式版。

```csharp
Invoke( new Func<string, int, double>((d, n) => double.Parse(d) + n + 100.0) ), "50.0", 75 );
```
HTMLタグだけで簡易スマホ対応（viewport）

モバイル対応する場合、htmlファイル切り替えるとか[CSSのメディアクエリ使う](http://sole-color-blog.com/blog/71/)とかするべきでしょうが、
そんな凝った画面でもないしとりあえずでいいんだ、というときはmetaタグ一つでいけます。

```
<meta name="viewport" content="width=device-width">
```

以下もご参考に。
[もう逃げない。HTMLのviewportをちゃんと理解する](http://qiita.com/ryounagaoka/items/045b2808a5ed43f96607)
CentOS上にDockerでJenkinsサーバを構築する

DockerもJenkinsも初めての超初心者です。
今回は、Windowsホスト上のVagrant CentOS環境への構築してみます。

# 準備
## Vagrantの下準備
Vagrant環境じゃない人は読み飛ばしてください。

### 容量の追加
Vagrantゲストのディスク空き容量が少なかったので、予め追加しておきました。
↓参考にしました
http://qiita.com/koitaro/items/c8bf8eb1e67e78890a5c

### Jenkins接続用のポートフォワード設定
VagrantホストのブラウザからJenkinsにアクセスできるよう、Vagrantfileに下記1行を追加しておきます

```text:Vagrantfile
config.vm.network "forwarded_port", guest: 8080, host: 8080
```

# Dockerのインストール
リポジトリを入れて起動設定まで

```bash:bash
sudo rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6
sudo yum -y install http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
sudo yum -y install docker-io
sudo service docker start
sudo chkconfig docker on
```

# Dockerイメージの作成
Dockerfileを作る

```bash:bash
vi Dockerfile
```

```text:Dockerfile
FROM jenkinsci/jenkins:lts
 
# install via apt
USER root
 
# install jenkins plugins
COPY plugins.txt /usr/share/jenkins/plugins.txt
RUN /usr/local/bin/plugins.sh /usr/share/jenkins/plugins.txt
 
# drop back to the regular jenkins user - good practice
USER jenkins
```

ここでプラグインの設定ができるらしいけど、よくわからないのでとりあえず空のファイルを作ってビルド

```bash:bash
touch plugins.txt
sudo docker build -t jenkins .
```

ワークスペースを永続的にするため、`-v`でディスクマウントして起動
（ディレクトリはchownしておかないと`touch: cannot touch ‘/var/jenkins_home/copy_reference_file.log’Permission denied`と怒られてしまう）

```bash:bash
sudo mkdir /var/jenkins_home
sudo chown -R 1000 /var/jenkins_home
sudo docker run -p 8080:8080 -p 50000:50000 -v /var/jenkins_home:/var/jenkins_home -d jenkins
```

# Jenkinsへアクセス
## パスワード入力
ブラウザで`IPアドレス:8080`へアクセス
「Unlock Jenkins」の画面でパスワードを聞かれるので、マウントしたディレクトリから参照して入力

```bash:bash
cat /var/jenkins_home/secrets/initialAdminPassword
```

## プラグインインストール（初期）
やっぱりよくわからないので「Install suggesed plugins」を選んでオススメを入れておく

## 管理者登録
こんな画面が出るので適当に登録
![image.png](https://qiita-image-store.s3.amazonaws.com/0/135266/aa2f2507-19a2-f54f-c211-32e9ea4f95e9.png)

無事、Jenkinsの管理画面が表示されました
![image.png](https://qiita-image-store.s3.amazonaws.com/0/135266/39c38bee-41f8-e7f3-ca62-a99cd8afc860.png)

## プラグインインストール
今度こそ必要なプラグインを入れましょう。
画面から「Jenkinsの管理」→「プラグインの管理」→「利用可能」を選択して、必要なプラグインをインストールします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/135266/ca1a1589-4ce5-ef42-f358-b7fa8fb24c08.png)


これで構築は完了！
これから、Jenkinsの使い方のお勉強。。
WebpackDevServer で建てたサーバーが ngrok から見れない時

## 問題

WebpackDevServerを何もせずに叩くと`localhost:8080`でサーバーが建ちます。そして、そのポートを`ngrok`で指定したら普通に見れそうなんですが、「Invalid Host Header」と怒られ見れません。

> ```bash
# localhost:8080 を建てる
webpack-dev-server
# localhost:8080 を外部に xxxxxxxx.ngrok.io というホストで公開
ngrok http 8080
```
>
> ![「Invalid Host Header」と怒られる](https://qiita-image-store.s3.amazonaws.com/0/84144/2c498764-04f7-4e5a-94ee-1f853b18b592.png)

## 解決

`devServer.public`を設定する必要があります。

`webpack.config.js`をこんな感じに設定するか、

```js
{
  // ...
  devServer: {
    public: xxxxxxxx.ngrok.io,
  }
  // ...
}
```

cliの`--public`フラグで指定してサーバーを建てます。

```bash
webpack-dev-server --public xxxxxxxx.ngrok.io
```

こんなログが出てれば多分OKです。

```
Project is running at http://xxxxxxxx.ngrok.io/
```

---

[localtunnel](https://github.com/localtunnel/localtunnel)とかも同じです。
geometry > Euler's polyhedron formula > V - E + F = 2 | T = 2V - 4

https://plus.maths.org/content/eulers-polyhedron-formula

Euler's polyhedron formula
により

V: Vertices
E: Edges
F: Faces
に対して以下となる。

```math
V - E + F = 2
```

### Cube

V = 8
E = 12
F = 6

V - E + F = 8 - 12 + 6 = 2

### icosahedron

icosahedronでも同じ式が成り立つとのこと。
https://en.wikipedia.org/wiki/Icosahedron

V = 12
E = 30
F = 20

V - E + F = 12 - 30 + 20 = 2

### Sphere?

三角形で分割をした球でもEuler's polyhedron formulaは成り立つのだろう。

関連: [球面上の格子の作り方](http://qiita.com/kei2ishihara/items/0f60446cab4bd5caa014)

### T = 2V - 4

```math
T = 2 V - 4
```

where T is the number of triangles.

~~icosahedronでは成り立たないような気がする。~~

icosahedronの場合、T = 20 (展開図より), V = 12。

20 = 2 * 12 - 4 
成り立っている。

任意の数の三角形からなる球に対して、V,E,F,Tを求める計算は未消化。

https://math.stackexchange.com/questions/734735/finding-number-of-edges-and-vertices-in-icosahedron
の回答から導出できた。

F = T
E = F * 3 / 2 (triangleの頂点数, double counting)

V - E + F = 2より
V - 3/2*F + F = 2
2V - 3F + 2F = 4
2V - F = 4
F = 2V - 4 (ここでF=T)
(初心者向け)Swift3.0で初アプリ - 外部サイトへアクセスしてみる - AlamoFire

Swift3.0を使って簡単なiPhoneアプリを作ってみます
[(初心者向け)Swift3.0で初アプリ - CocoaPods, Carthagoを使ってみる](http://qiita.com/egplnt/items/af8c6b043557a9578236)でAlamoFireを使えるようにしました

#1.AlamoFireを使ってみる
-　以下のようなコードを使ってAlamoFireを使ってみます
-　ViewController.swiftに以下をコピペします

```swift:AlamoFireを使ってみる
import UIKit
import Alamofire
import SwiftyJSON

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        let urlJson = "https://ntp-a1.nict.go.jp/cgi-bin/json"
        let urlTime = "https://ntp-a1.nict.go.jp/cgi-bin/time"

        Alamofire.request(urlJson).responseJSON{ response in
            print(response)
        }
        
        Alamofire.request(urlTime).response{ response in
            print(response)
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}


```

- Simulatorで稼働させると、コンソールに下記のようにNICTから取得された時刻が表示されます

<img width="487" alt="スクリーンショット 2017-09-19 12.18.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/9c2e8a9c-b7f7-d9da-efa3-2a501c454947.png">
charlessのSSL


アプリのデバックで結構Charlessを使ってます。

**sslの証明書を発行する時のURL**
http://www.charlesproxy.com/getssl

**URLのQRコード**
![ssl.png](https://qiita-image-store.s3.amazonaws.com/0/56169/df5aad31-064c-8224-fe19-9922df2b3a1a.png)

# 参考サイト
http://qiita.com/usagimaru/items/d340e87da98e62f99b60
rails4 で利用していたmigrationファイルを rails5 用に移行するワンライナー

rails5からどのrailsバージョンでmigrationを作成したかという情報が追加されました。
それにともないrails4で作成していたファイル全てにバージョン情報を付与するワンライナーで対応しました。

rails4で作成したmigrationファイルのまま ` bundle exec rails db:migrate ` すると以下のようにエラーとこんな感じで書いてなというメッセージが表示されます。

```
$ be rails db:migrate
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:

Directly inheriting from ActiveRecord::Migration is not supported. Please specify the Rails release the migration was written for:

  class CreateUsers < ActiveRecord::Migration[4.2]
```

以下のコマンドで ` ActiveRecord::Migration ` の後ろにバージョン（ ` [4.2] ` ）をつけてあげます。

```console
$ find db/migrate -name '*.rb' | xargs sed -i "" 's/ActiveRecord::Migration$/ActiveRecord::Migration[4.2]/g'
```
2019/6/21: @creativivalさんの[コメント](https://qiita.com/tackeyy/items/1a6599d9d565cd89cdbc#comment-7372b80615f1becb70d8)を受けてコマンドを修正しました


これでmigrationも通るようになります。


この記事は以下の記事の焼き直しです。

http://tackeyy.com/blog/posts/how-to-migrate-rails4-migration-files-to-rails5-migration-files
[YouTube] iframeのレスポンシブ対応


iframeをレスポンシブ対応した時のメモです。
今回はYouTubeを使用例として。

## HTML

```
<div class="frame-wrapper__video">
  <iframe src="https://www.youtube.com/hoge/hogehogehogehogehoge" frameborder="0" allowfullscreen></iframe>
</div>
```

* YouTubeから取得したiframeを `div` で囲う。


## CSS

```
.frame-wrapper__video {
  position: relative;
  width: 100%;
  height: 0;
  padding-bottom: 56.25%;
  overflow: hidden;
  margin-bottom: 50px;
}

.frame-wrapper__video iframe {
  width: 100%;
  height: 100%;
  position: absolute;
  top: 0;
  left: 0;
}
```

* 4:3の場合 `padding-bottom: 75%;`
* 16:9の場合 `padding-bottom: 56.25%;`
* `padding-bottom`は`padding-top`でも可。


## サンプル

表示サンプルは下記で確認できます。

[GitHub Pages](https://0084ken.github.io/responsive-youtube/)

[GitHubリポジトリ](https://github.com/0084ken/responsive-youtube)

## 参考

[CSSだけでどんな画像でも4:3や16:9の比率を維持して配置する方法](http://sk51.jp/how_to_keep_the_ratio_of_the_image_constant_at_responsive/)
Pythonで作成したSplunkのカスタムサーチコマンドをデバッグする

 Pythonで作成したカスタムサーチコマンドを実行した際、PythonのコードにバグがあってもSplunk上では、

```shell-session
External search commnd 'my_script' returned error code 1.
```

というエラーが表示されるだけで、コードのどこに問題があるかわかりません。

 この場合は以下コマンドでターミナル上でカスタムサーチコマンドが実行できますので、エラーの内容がわかります。

```shell-session
/Applications/Splunk/bin/splunk cmd python my_script.py
```
RaspberryPIの無線設定を忘れるのでメモ


RaspberryPIに標準搭載されつつある無線ですが、外出時にXWindowシステムを起動できない状態で無線設定したい時がよくよくあるので、メモ程度に。

`wpa_passphrase [SSID]`

パスフレーズを聞かれるので入力。

出力された文字列をコンフィグにかけば終了。

`/etc/wpa_supplicant/wpa_supplicant.conf`

## 簡略化

```
$ sudo su
# wpa_passphrase [SSID] >> /etc/wpa_supplicant/wpa_supplicant.conf

(何も促されないが、ここでパスフレーズを入力)
[key]

# 
```

以上。
Tips. Android Studio モジュール名変更で問題が発生した

# 発生した問題
Android Studioで
「モジュール名の変更 (Refactor > Rename / Shift+F6)」
を行った際に以下の問題が発生した。

> The modules below are not imported from Gradle anymore. Check those to be removed from the side project too:

![image.png](https://qiita-image-store.s3.amazonaws.com/0/189004/1b395108-bae4-0153-f8cd-1e355884d028.png)
▲. モジュール名を sample > samplex に変更

上記のダイアログが表示され、ダイアログへのアクションに関わらず、
空になった変更元のフォルダのみが表示され、プロジェクトからモジュールが表示されなくなってしまった。

![無題1.png](https://qiita-image-store.s3.amazonaws.com/0/189004/b863891f-6076-4604-1024-dc9139e30219.png)
▲. 空のsample と 行方不明のsamplex

# 解決
プロジェクトの「setting.gradle」を開き、
include 文で列記されたモジュール名の前に コロン ":" があるか確認する。

上記の問題が発生した環境では以下のようになっていた。

```setting.gradle
include ':app', 'sample'
```
sample の前にコロンが無いためにリネームの失敗とモジュールの読み込みに失敗したものと思われる。
下記のようにすることで、モジュールが正しく読み込まれるようになった。

```setting.gradle
include ':app', ':samplex'
```
![無題1.png](https://qiita-image-store.s3.amazonaws.com/0/189004/3b5e1297-a56c-5c7b-593c-fb6a62f97a15.png)
▲. 帰ってきた samplex

## 備考
なぜコロンが削除されてしまったのかは原因特定ならず。
もしかしたら手動でモジュールの include をした際に入れ忘れたのかもしれない。

ビルドやapkファイルの生成などは通り、警告なども出ていなかったため問題になっているのに気付きにくかった。
WebdriverIOの導入とテスト


[メモは書いた](http://qiita.com/matsum0623/items/126691d0b756592e514f)けどやっぱり導入方法もまとめておく。

基本的にWindowsでの構築例

## 環境構築
以下の手順で、環境を構築する

### node、npmのインストール
以下のサイトよりnodejsのLTS版をダウンロードする。
[nodejs](https://nodejs.org/en/)

以下のコマンドでバージョンが表示されればOK

```bash
$ node -v
$ npm -v
```

### Chromeのインストール

[本家](https://www.google.com/chrome/browser/desktop/index.html)からダウンロードしてインストール
※新しいバージョンが出ると途端にテストが動かなくなることがある。ご愛嬌。

### 3. プロジェクトフォルダの作成
適当な場所で、nodejsのプロジェクトを作成しておく

```bash
mkdir sample
cd sample
npm init -y
```

### 必要なツールをインストールする

```
# webdriverIO本体のインストール
npm install --save webdriverio

# selenium-standalone-serverを使用するためにインストール
# 入れておけば、サーバを自動的に立ち上げてくれる
npm install --save-dev wdio-selenium-standalone-service

# テストフレームワークのインストール
npm install --save-dev wdio-mocha-framework
npm install --save-dev chai

# レポーター(テスト結果の表示ツール)の導入。お好みで
npm install --save-dev wdio-dot-reporter
npm install --save-dev wdio-junit-reporter
npm install --save-dev wdio-spec-reporter
```


### テストを作成
WebdriverIOを利用してサンプルを作成する

```
.\node_modules\.bin\wdio
```
実行するといろいろ聞かれるが、以下の2つ以外はENTERでOK

- Which reporter do you want to use?<br>
   好きなレポーターを上下キーで選択してスペースキー。でエンター
- Do you want to add a service to your test setup?<br>
  `selenium-standalone`を選んでスペースキー。でエンター

### 設定を変更する
設定ファイル`wdio.conf.js`にてテスト実行環境の設定を変更する。
テストするブラウザを変えるには

```
    capabilities: [{
        maxInstances: 5,
        browserName: 'firefox'
    }],
```
の`browserName`を変更する。クロームなら`chrome`。
同時に別ブラウザでの実行も可能。こうする、

```
    capabilities: [{
        maxInstances: 5,
        browserName: 'firefox'
    },{
        maxInstances: 5,
        browserName: 'chrome'
    }],
```


### テストファイルを作成する

```
mkdir test && cd test && mkdir spec && cd specs && touch test.js
```

作成したファイルに次のように保存する

```
var assert = require('assert');
describe('webdriver.io page', function() {
    it('should have the right title - the fancy generator way', function () {
        browser.url('http://webdriver.io');
        var title = browser.getTitle();
        assert.equal(title, 'WebdriverIO - WebDriver bindings for Node.js');
    });
});
``` 

## テストの実行

プロジェクトの直下にて、以下のコマンドでテストを実行する

```
.\node_module\.bin\wdio
```

ブラウザが立ち上がって、テストが実行される。


そのほか使い方は例のごとく[本家サイト](http://webdriver.io/)
【質問】Pythonを使ったチャットbotのAPI化について

Pythonを使ったチャットbotを作り、コマンドラインで動かせるようにしました。
なので今後これをwebAPIとして実装し、chrome拡張から選択した範囲のwebテキストをXMLHttpRequestでAPI(チャットbot)に送って
botから貰った返事をブラウザ上に表示する、といったものを作りたいです。

今出来ていること
・オフライン環境で動くチャットbotの作成(コマンドラインで動く粗末なものですが)
・chrome拡張を使って既存のwebAPIにリクエストを送ってその結果をchrome上で表示させる

出来ていないこと
・PythonのチャットbotをオンラインでAPIとして動かすこと

OSはWindows7ですが、サブのマシンにLINUXを入れることも出来ます。
色々とググったつもりなのですがローカルサーバーでの動作テストのやり方は見つかっても、実際にオンラインで動かすための方法が見つからず困っています。

サーバーレンタル、有料サービス、書籍等にお金をかけてもいいので、とにかくローカルサーバーではなく実際のサーバーでpythonを動かすために必要な知識がどこにあるのかをご教授いただければ幸いです。
任意の形式の曜日を取得する(PHP)

PHP普段書かないのでよくわからんけども、やりたいことはできたのでメモ。

## コード
```
<?php
$date = new DateTime('Asia/Tokyo');
print $date->format('Y-m-d H:i:s') . "\n";

$dayOfTheWeek = array('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat');

print $dayOfTheWeek[$date->format('w')];
?>
```

## 出力結果
```
2017-09-19 10:53:00
Tue
```
Firebase tips(Email Auth:javascript)

# FIREBASE TIPS 

## 1. Connect and Create Email User

```html:create
<script src="https://www.gstatic.com/firebasejs/4.1.1/firebase.js"></script>
<script>
  var config = {
    apiKey: 'XXXXXXXXX',
    authDomain: 'XXXXXXX.firebaseapp.com',
    databaseURL: 'https://XXXXXXXX.firebaseio.com/',
    storageBucket: 'XXXXXX.appspot.com',
    messagingSenderId: 'XXXXXXXX',
  };
  firebase.initializeApp(config);
   
  firebase.auth().createUserWithEmailAndPassword('YYYYYYY@XXXXX.com', 'XXXXXXX').catch((error) => {
      console.log('code:' + error.code + 'message' + error.message);
  });
</script>
```
`result`
![email_auth_create.png](https://qiita-image-store.s3.amazonaws.com/0/199460/69fb9908-fde5-a467-5803-390248b614c1.png)

## 2. Login with Email and Password.

```js:login
    firebase.initializeApp(config);
    firebase.auth().signInWithEmailAndPassword('coffeeandcode.tokyo@gmail.com', 'coffee').catch((error) => {
        console.log('code:' + error.code + 'message' + error.message);
    });
    firebase.auth().onAuthStateChanged((user) => {
        if (user) {
            console.log('login success');
        }else{}

    });
```

`result`
![signin.png](https://qiita-image-store.s3.amazonaws.com/0/199460/ad711f3d-6783-4f1f-c33c-d1d58e2d1220.png)

## 3. Logout
```js:logout
    firebase.auth().signOut().then( () => {
        console.log('logout sucess');
    }).catch(function (error) {
        console.log('code:' + error.code + 'message' + error.message);
    });
```

`result`
![signout.png](https://qiita-image-store.s3.amazonaws.com/0/199460/37af4e4b-3112-8734-fa54-787b2986ba28.png)


## 4. Email Verfication
```js:verfication
    firebase.initializeApp(config);
    firebase.auth().createUserWithEmailAndPassword('coffeeandcode.tokyo@gmail.com', 'coffee').catch((error) => {
        console.log('code:' + error.code + 'message' + error.message);
    });
    firebase.auth().onAuthStateChanged(function (user) {
        if (user) {
            if (user.emailVerified == false) {
                user.sendEmailVerification().then(() => {
                    console.log('sent email');
                }, (error) => {
                    console.log('code:' + error.code + 'message' + error.message);
                });
            }
        } else { }

    });
```

`result1`
![email1.png](https://qiita-image-store.s3.amazonaws.com/0/199460/fcaf2451-6d94-8447-096c-62197e1687b5.png)


`result2`
![email2.png](https://qiita-image-store.s3.amazonaws.com/0/199460/bd347f7a-b8b2-c10e-8c12-ac1d59a267b4.png)
pythonでweb3ライブラリを使用する。

##やったこと
pythonベースでweb3ライブラリを使うため
Web3.pyを使用する。

※Web3.pyはEthereumと対話するためのPythonライブラリ。
　Web3.js から派生したもの。

python3.4で動作を確認する。

##インストール
公式からクイックスタートでインストール方法を確認する
https://web3py.readthedocs.io/en/latest/quickstart.html

```consol:
$ pip3 install web3
```
※(追記：2017.9.21）
　上記方法でインストールする場合web3.pyのバージョンは2017年9月20日時点で3.13.5であり
　github上での最新版は3.15となっています。githubから最新版をインストールする場合は
　補足を追記していますので参考にしてください。　


##実行サンプル
ためしにブロックチェーンのブロック番号を取得する。
ここでは”web3.eth.blockNumber”を使用してみる。

```py3:sample.py
from web3 import Web3,HTTPProvider

web3 = Web3(HTTPProvider('http://localhost:8545'))
blockNumber=web3.eth.blockNumber
print(blockNumber)
```

上記のとおり、数行ですんでしまうため、とても簡単。
簡単にethereumノードの情報を取得できてしまうので次回から使っていきたい。

##その他APIについて
公式ドキュメントに記載されているので適宜確認してきたい。
https://web3py.readthedocs.io/en/latest/

##補足（追記：2017/9/21)
上記ドキュメントのクイックスタートでインストールする場合
web3.pyのバージョンが最新でない場合がある。

そうした場合、公式ドキュメントにある関数の実行方法が、最新版をインストールしていないため
ドキュメントどおりに実行できない可能性がある。
（例えばweb3.sha3のコマンド指定方法がバージョン3.13から3.15で変更されているときなど
　引数の指定方法が変更されている。）

そのようなバージョンごとの変更点は、ドキュメントのリリースノートで適宜チェックしていかないといけない。
https://web3py.readthedocs.io/en/latest/releases.html#id1


web3.pyをインストールしている場合は、次のコマンドでバージョン確認できる

```:console:
$python3 -m pip list|grep web3

(出力例)web3 (3.13.5, /home/umidachi/web3.py)
```

最新版をインストールするため一旦、パッケージを削除する。

```:console
$ pip3 uninstall web3

```

以下githubから最新版のセットアップ方法どおりに作業を行う。
https://github.com/pipermerriam/web3.py

```:

$ git clone https://github.com/pipermerriam/web3.py.git
$ cd web3.py
$ virtualenv venv
$ bash venv/bin/activate
```

依存ライブラリはrequirements-dev.txtに定義されている。-rで一括インストールする。

```:
$ pip3 install -r requirements-dev.txt
$ pip3 install -e .
```

上記作業でインストールできたか確認しとく

```:console:
$python3 -m pip list|grep web3

(出力例) web3 (3.15.0, /home/umidachi/web3.py)
```

上記結果から、バージョンが最新版になれば良い。



##参考
「web3.py」
https://web3py.readthedocs.io/en/latest
https://web3py.readthedocs.io/en/latest/quickstart.html
【Rails】relationテーブルの条件でthrough先を抽出

# relationテーブルの条件でthrough先を抽出
ユーザーがイベントに参加する状況を考えているような、以下の3つのテーブルがあるとする。
approvedはユーザーがイベントに参加することを承認されているかがboolで持っている。
この時にイベントごとに承認済みユーザー、未承認ユーザーを抽出したい。

<img width="598" alt="スクリーンショット 2017-09-19 10.15.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/107187/57b5530f-ea6a-7eef-8cd2-69f7b13113d5.png">

whereで以下のように条件を指定してしまうと、抽出後のusersでapprovedの条件を評価してしまい、カラムが存在しないというエラーになってしまう。

```rb:event_error.rb
has_many :approved_users, -> { where approved: true }, through: :relations, source: :user
```

## 解決策
以下のようにワンクッション挟むことで解決。

```rb:event.rb
  has_many :approved, -> { where approved: true }, class_name: "Relation"
  has_many :unapproved, -> { where approved: false }, class_name: "Relation"
  has_many :approved_users, through: :approved, source: :user
  has_many :unapproved_users, through: :unapproved, source: :user
```
【Linux】rsyncコマンドによるデータ同期


先日、NASへのデータ同期した際に使用した。
オプションとかリストの書き方など、また使うかもしれないので備忘として残す。
※キュレーション的な要素強めですが…

--

#1.rsyncコマンドって何？

- バックアップ（データ同期）を実施するときに使用するコマンド
- リモート、ローカルを問わずにファイルやディレクトリのコピーが可能
- 様々なオプションを使用することで柔軟にデータ同期ができる

#2.rsyncコマンドの使い方

基本的な書式は下記のとおり。

```書式
rsync [オプション] コピー元パス コピー先パス
```

オプションについては、多々あるので以下参照。
[rsyncコマンドオプション](https://webkaru.net/linux/rsync-command/)


#3.対象ファイルの指定

ディレクトリを指定してコピーするときなど、一部のディレクトリやファイルは対象外としたいケースがよくある。
**例）スナップショット領域、念のために取得したバックアップファイル　など…**

そういった場合、`--exclude`と`--include`オプションを使用することで柔軟に実現できる。
また、対象、非対象となる項目が多い場合は、リスト化することもできる。

こちらのオプションについては、以下のサイトでわかりやすくまとめられていたので参照ください。
[rsync の複雑怪奇な exclude と include の適用手順を理解しよう](http://tech.nitoyon.com/ja/blog/2013/03/26/rsync-include-exclude/)
How to remove screen options and help links in the admin area?

To remove the Help Tab use

````
add_filter( 'contextual_help', 'mytheme_remove_help_tabs', 999, 3 );
function mytheme_remove_help_tabs($old_help, $screen_id, $screen){
    $screen->remove_help_tabs();
    return $old_help;
}
````

Or

````
add_action('admin_head', 'mytheme_remove_help_tabs');
function mytheme_remove_help_tabs() {
    $screen = get_current_screen();
    $screen->remove_help_tabs();
}
````

And to remove the Screen Options Tab

````
add_filter('screen_options_show_screen', '__return_false');
````


You can use this on tour functions.php file or as part of a custom plugin.

````
<?php
/*
Plugin Name: Remove Tabs
Plugin URI: http://sample.com
Description: Remove Help Tab and Screen Options Tab
Author: sample
Author URI: http://sample.com
*/

/* It will remove the tabs, not hide them with CSS */

add_filter( 'contextual_help', 'mytheme_remove_help_tabs', 999, 3 );
function mytheme_remove_help_tabs($old_help, $screen_id, $screen){
    $screen->remove_help_tabs();
    return $old_help;
}

add_filter('screen_options_show_screen', '__return_false');
?>
````
Atom エディタでスペルチェックを無効化する方法🙅‍♂️

　macOS では、いまだに Windows の秀丸エディタの領域を超えるテキストエディタが存在しないのが困りものです。日々コードをバリバリ書いている自分としては、サムライの刀と同様、テキストエディタが何より重要であり基本。無料だけでなく有料のテキストエディタをもあれこれライセンス購入し使ってみましたが、少なくとも自分的にしっくり来るものがありません🤔

　今のところ、Macテキストエディタ難民の私が到達したのは「ATOM」です。がしかしデフォルトの状態では不都合が多く、カスタムして何とか自分に合わせています。

　Atomは起動が微妙にモッサリしていて、クリックしてから２〜３秒程度掛かるのがややストレス（期待値は0.5秒以内でしょう）ですが、機能面ではまあまあ使えると思います。矩形でのコピー＆ペーストやら便利だった秀丸エディタの偉大さを痛感しています。。。秀丸さん感謝🙏

　というか、クラウドファンディングで開発予算を集めて、秀丸エディタ for macOS を開発したら如何かと本気で思います。投資した資金は、きっと回収できると思いますよ。私も 6,000円前後なら是非買いたいです‼️ 😤

## さて、ご挨拶はこれくらいにして、本題に入ります。

　ATOM はデフォルトでスペルチェックが有効になっていて、赤波線がところどころに表示されてしまいます。
これを無効化する手順を以下説明します。

１. メニューの「Atom」➡️「環境設定」を選択します。もしくは ⌘ (コマンド)を押しながら , (カンマ)がショートカットキーとなります。

![atom.png](https://qiita-image-store.s3.amazonaws.com/0/88183/e43f6804-3038-4980-bf9f-c5202b7f9a4d.png)

２. 左メニューの「パッケージ」を選択し「インストール済みのパッケージ」欄に "Spell Check" と入力します。  

３. コアパッケージに「spell-check」と表示されるので「Disable」を選択します。  

![spellcheck.png](https://qiita-image-store.s3.amazonaws.com/0/88183/88d4c226-32cd-221d-cf9d-79a35285857a.png)

４． エディタを再起動すれば、それでOKです。

もう赤い波線は表示されなくなりましたね😊

enjoy! 👍
[swift] Storyboardのsegue idを「かんたん・きれい・色あせない」方法で管理する

# Storyboardのsegue idを「かんたん・きれい・色あせない」方法で管理する

## 概要
- Storyboardを使っているとsegueのidを文字列で指定すると思うのですが、ソースでも同じidじゃないといけません。
- 増えると面倒なのでまとめていると思いますが、enumが便利なのでそっちでまとめています。


## 実際のコード
- SegueHandlerType.swift　と　Config.swift　を適当な場所においておきます。

```Utility/SegueHandlerType.swift
protocol SegueType {
    var rawValue: String { get }
}

extension UIViewController {
    /**
     performSegue for segue
     - Parameters:
     - segue: Segue
     - sender: AnyObject
     */
    func performSegue(segue: Segue, sender: AnyObject?) {
        performSegue(withIdentifier: segue.rawValue, sender: sender)
    }
}

```
- `toCamera` などをStoryboardのsegueに書いておきつつここでまとめる

```Config/Config.swift
enum Segue: String, SegueType {
    case toCamera
    case toPhotos
    case toTutorial
    case toDetail
}

```

- Controllerから呼び出す

```Controllers/Hoge/Hoge.swift
private func firstExplain() {
    self.performSegue(segue: .toTutorial, sender: nil)
}
```

## まとめ
- **かんたん・きれい・色あせない** 方法で管理できるようになりました。
- その他にもぐぐるといろいろな方法が出てきます。
- もっと難しい方法もあるみたいですが、私の理解を超えているのでこれで許してください。
rubyの!（破壊的メソッド）や?（真偽値を返すメソッド）について

# !（破壊的メソッド）

元の値も変更するメソッドを破壊的メソッドといい、!を語尾につける。

```ruby:test
name = "taguchi"
puts name.upcase
puts name
>ただ大文字で返す
=>"TAGUCHI"
=>"taguchi"

puts name.upcase!
puts name
=>"TAGUCHI"
=>"TAGUCHI"

```

# ?（真偽値を返すメソッド）

```ruby:test
name = "taguchi"
p name.empty?
=>false
```

メソッドの通りだったらtrue、違ったらfalseを返すメソッドを書く場合、?を語尾につける。
[Android]ImageViewでsvg画像を表示させるときの注意点

# はじめに
ImageViewでsvg画像を表示させるときの注意点を書いていきます。
メモ書きなので参考程度に参照してください。

# 注意点とは？
ImageViewを用いてsvgを表示させたときです。
Android5系でアプリを起動したときに落ちて、Android7系では正常に起動しました。

# プレビュー画面
表示させようとしたsvgは下記の画像(Android studioのプレビュー画面)の時計とマップのアイコンです。
<img width="155" alt="プレビュー.png" src="https://qiita-image-store.s3.amazonaws.com/0/56169/ac10e0d2-41ce-fd7f-21e7-4034291eb4c4.png">

# 開発環境
|端末名  |OS  |
|---|---|
|Huawei nove lite  |OS7|
|Asus Zenfone2|OS5  |

# エラーコード
ログには以下のようにImageViewがerrorの原因だよと教えてくれています。
ログを追っていくとxmlを読み込むところでエラーになっていました。
さらにxmlのImageViewをコメントアウトすると両端末で表示してました。

```error.log
android.view.InflateException: Binary XML file line #68: Error inflating class ImageView
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:763)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:809)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:809)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
    at keiba.japan.forest.net.japankeiba.activity.ui.adapter.SampleRecyclerAdapter.onCreateViewHolder(SampleRecyclerAdapter.java:60) 
    at keiba.japan.forest.net.japankeiba.activity.ui.adapter.SampleRecyclerAdapter.onCreateViewHolder(SampleRecyclerAdapter.java:22)
    at android.support.v7.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:6367)
```

```main.xml
    <ImageView
        android:src="@drawable/ic_map_black_24px" // svg画像
        android:layout_width="12dp"
        android:layout_height="12dp" />
```

# 改修方法
ライブラリを使って修正してください。
僕の場合はGoogleのSupport Libraryを使ってsvgを表示させました。

```main.xml
     <android.support.v7.widget.AppCompatImageView
        app:srcCompat="@drawable/ic_schedule_black_24px"
        android:layout_width="12dp"
        android:layout_height="12dp" />
```
# 所感
svgが表示しない原因を調査していたときに
開発するときは「Support Library」を使ってコードの統一をした方が保守性など考えるいいかも