OmniAICreator/Qiita-1.07M huggingface dataset:
UbuntuへのTOMOYO Linuxのインストール

# TOMOYO Linux とは

一言で言うと、強制アクセス制御を実現するための仕組みです。
一番下に記述した参考文献や私の昔の資料を参照ください。

# Ubuntu へのインストール
UbuntuへのTOMOYO Linuxのインストールは、パッケージが用意されているため簡単です。以下は14.04と16.04で確認しています。
ちなみに、Debianにインストールする場合は、[phase-dさん](http://qiita.com/phase-d)の「[DebianにTOMOYO Linuxをインストールする](http://qiita.com/phase-d/items/9e309b149891710ba42e)」を参照してください。まぁ、ほぼ一緒ですね。

## ツールのインストール

`tomoyo-tools` パッケージをインストールします。

```
sudo apt-get install tomoyo-tools
```

続いてポリシーの初期化して/etc/tomoyo以下を準備します。これを忘れてTOMOYO Linuxを有効にして起動すると、途中で失敗します。

```
sudo /usr/lib/tomoyo/init_policy 
```

GRUBの設定ファイル `/etc/default/grub` を確認し、もし変数 `GRUB_CMDLINE_LINUX` に `security=tomoyo` が含まれていない場合(Ubuntu 14.04)は追記します。

```text:/etc/default/grub
...
GRUB_CMDLINE_LINUX="... security=tomoyo"
...
```
`/etc/default/grub` を修正した場合は、変更を反映します。

```
sudo update-grub
```

そして再起動！

## 動作確認

コマンドラインからポリシーエディタを起動します。

```
sudo tomoyo-editpolicy
```
![Screenshot from 2017-07-15 01-26-39.png](https://qiita-image-store.s3.amazonaws.com/0/65518/62f78f25-7f0a-9833-fa05-7d2edb24d7f1.png)

ポリシーエディタの使用方法は[公式ドキュメント](http://tomoyo.osdn.jp/documentation.html.ja)の[Appendix C](http://tomoyo.osdn.jp/2.5/tool-editpolicy.html.ja)を参照してください。


## 参考文献

[TOMOYO Linux 公式ドキュメント](http://tomoyo.osdn.jp/documentation.html.ja)
[TOMOYO Linuxの世界](http://tomoyo.osdn.jp/wiki/?WorldOfTomoyoLinux)

### 昔々の私の記事・資料
[組み込みセキュアOSの動向](http://www.asahi-net.or.jp/~jg3h-snj/osc2007/embedded_secureos.pdf)（2007/03/16）
[セキュアOSの紹介と最新動向 ～SELinuxとTOMOYO Linuxを中心に～]
(http://www.asahi-net.or.jp/~jg3h-snj/documents/20090516_OSC2009Shimane_Shinji.pdf)（2009/05/16）
[TOMOYO Linux徹底解剖](https://thinkit.co.jp/series/4542)：[組み込み機器でTOMOYO Linuxを使う](https://thinkit.co.jp/article/996/1)（2009/7/30）
[hshinjiの日記 - [セキュアOS]](http://d.hatena.ne.jp/hshinji/searchdiary?word=%2A%5B%A5%BB%A5%AD%A5%E5%A5%A2OS%5D)
Raspberry piのセットアップ

#MacによるminiSDのフォーマット
- ディスクユーティリティで「消去」をクリック
- 「フォーマット」プルダウンメニューからをMS-DOS (FAT)を選択
- 「消去」をクリック

#NOOBのインストール

- NOOBのダウンロード
- 解凍されたフォルダの中のファイルをminiSDカードにコピー
- miniSDカードをRaspberry Piに移す

#sshを使うための変更
SDカードの最上位にsshという名前のファイル（形式は何でも可。ssh.txtファイルを作ってFinderで拡張子を外す）

#カメラを使えるようにする

```bash
$sudo raspi-config
```

##静止画の撮影
```bash
$raspistill -o test.jpg
```

##ムービーの撮影

```bash
$raspivid -o test.h264 
```

#vnc接続
```bash
$sudo apt-get install tightvncserver
```

# Macとファイル共有
```bash
$sudo apt-get install netatalk
```

#hostnameの変更
hostnameを変更しておく、デフォルトだとraspberrypiなので複数台管理するとややこしくなる。



```bash
$sudo nano /etc/hostname 
```
で raspberrypi を miuraRasPi2 にする。

```bash
$sudo nano /etc/hosts
```
で raspberrypi を miuraRasPi2に書き直す。

マシン名を反映させるため sudo reboot で再起動しておく。再起動したら再びsshで接続。

#piユーザのパスワードの変更
電気工作で遊ぶだけならpiユーザのままでいいけど、外部公開するサーバの場合は以下のような対応を行うのが良いと思われる。

- piユーザでpasswdコマンドを実行しpiユーザのパスワードを変更しておく
- sudo passwdコマンドを実行しrootのパスワードを変更しておく
remapだらけのClang初心者.vimrc保存版

久しぶりにPC触ると.vimrcの位置すら記憶から飛んでるvim初心&C初心の人（自分）向けのバックアップ的な何か(Github?知らない子でs(ry))

```
  1 ".vimrc ============================================================
  2
  3
  4
  5 "visual ============================================
  6 syntax on
  7 set number
  8 set title
  9 set ruler
 10 set cursorline
 11
 12 set tabstop=4
 13 set autoindent
 14 set shiftwidth=4
 15 "set expandtab
 16 filetype plugin indent on
 17
 18
 19
 20 "Keymap ============================================
 21 nnoremap ; : 　" :を;で代用
 22 nnoremap s <Nop> " sの初期化
 23 nnoremap sj <C-w>j " 分割画面移動
 24 nnoremap sk <C-w>k
 25 nnoremap sl <C-w>l
 26 nnoremap sh <C-w>h
 27 nnoremap sv :vsplit " 画面左右分割
 28 nnoremap ss :split " 画面上下分割
 29
 30 inoremap { {}<Left> " 括弧補完(C用）
 31 inoremap {<Enter> {}<Left><Enter><Enter><up><TAB>
 32 inoremap ( ()<Left>
 33 inoremap (<Enter> ()<Left><Enter><Enter><up><TAB>
 34 inoremap [ []<Left>
 35 inoremap [<Enter> []<Left><Enter><Enter><up><TAB>
 36 inoremap " ""<Left>
 37 inoremap <silent>jj <ESC> " jjでノーマルモードに
 38 
 39
 40
 41
 42 "setting color =====================================
 43 colorscheme molokai
 44 autocmd ColorScheme * highlight LineNr ctermfg=22 guifg=#757575
 45 autocmd ColorScheme * highlight CursorLineNr ctermfg=22 guifg=#858585
 46 autocmd Colorscheme * highlight Cursor ctermfg=22 guifg=#707070
 47 autocmd ColorScheme * highlight Comment ctermfg=22 guifg=#808080
 48
 49
 50 "not beep ==========================================
 51 set visualbell t_vb= "beep音消し
```
Kobitoで「投稿に失敗しました Request faild: forbidden(403)」エラーのため投稿できない


![[エラー][Qiita]_投稿に失敗しました 403.png](https://qiita-image-store.s3.amazonaws.com/0/78776/62966a75-3c5c-f30b-996e-2280602bddf7.png "[エラー][Qiita]_投稿に失敗しました 403.png")

# TL;DR
    ２行程度のシンプルな記事が投稿できるなら、記事のタグを５つ以内に減らしてみる

# Kobito への要望

記事の関連タグ数に問題があると、投稿時もしくは入力中に知らせて欲しい。

提案としては、本文が空だと「１行目がタイトルになります」と表示されるのと同様に、タグのフィールドが空だと「タグは５つまで登録できます」といった表示がされていると助かります。

他には「x/5」とかタグ数を表示するとか、警告文の中にエラーの内容をもう少し入れて欲しいなどあるかもしれませんが、この問題に対しては上記の提案で私は十分です。

しかし、[Kobito のサポートは終わっていた](https://kobito.qiita.com/)のであった。。。

# 所感
最近 Qiita に投稿が増えたので、[Kobito](http://kobito.qiita.com/) を使って記事を書いてみましたが、インターフェースがシンプルで使いやすいと感じました。しかし、いざ記事を投稿をしてみようとしたところ、「Request faild: forbidden(403)」エラーが。

403エラー といえば WEB では「アクセス禁止（読み書き）」エラーのことでベーシック認証など関連で見かけるエラーです。まずは以下の切り分けをしてみました。

- アプリ・OSを再起動してみる → **NG**
- アプリの「Qiitaに再ログイン」でログインしなおしてみる → **NG**（認証がブロックされている？）
- WEBから直接Qiitaに投稿してみる → **OK**（アカウントは生きている、コンテンツサーバーも動いている）
- Qiitaに前例がないか検索してみる → **NG**（2017/07/14現在[１件のみ](http://qiita.com/search?q=Kobito+403)）
- テストで２行記事を書いてみる → **OK**（データに問題あり。アプリには問題なし？）

以上から、アプリは正常に動いている（投稿できる）ので、データに問題があると考えられます。
データの入力項目は「タグ」と「本文（タイトル込み）」の２フィールドとシンプルなもの。となると、データ量、入力文字などの禁則事項に触れている可能性があります。

- 添付画像？ → **NG**（そもそも添付画像はない）
- 問題の記事を少しづつ削って投稿してみる → **NG**（データ量、禁則文字などではなさそう）
- タグを削除して投稿してみる → **OK**


あ、、、 **タグを６つ使ってる** じゃん…。タグ入力欄の表示が見切れていて気づかなかったわのよ。アッチョンブリケ。

## 参考文献

- 記事にタグを設定する | Qiita:Support @ Qiita<br>http://help.qiita.com/ja/articles/qiita-tagging

- Qiita:Support @ Qiita<br>http://help.qiita.com/
画像をリサイズするプログラムをexe化して配布したい Python3+pyinstaller

# 企画・概要
- python3がない環境のPCでpython3のプログラムを動かしたい
- ソフト使えばええやんとか禁句（書いてみることに意味があるｷﾘｯ）
- pyinstallerを使えばexe化ができるらしい

# 環境
- windows10
- Python 3.5.2 |Anaconda 4.2.0 (64-bit)
- PyInstaller: 3.2.1

# 実行
それでは早速やってみよう。
コマンドプロンプトで以下を入力してインストール。

```
pip install pyinstaller
```

## exe化するプログラム
今回書いたものは画像をリサイズするプログラムだ。
フリーソフトを使えば一瞬でできることをわざわざ書いているので真似する必要はない。
お好きなプログラムでどうぞ。

```py:resize.py
#! python3
# -*- coding: utf-8 -*-
from PIL import Image
import sys


print("画像のリサイズを行います")

try:
    inp_img = str(input("ファイル名を入力:"))
    filename = "picture/" + inp_img + ".jpg"
    img = Image.open(filename, "r")
except FileNotFoundError:
    print("【エラー】ファイルが見つかりません！\n"
          "ファイルはpictureフォルダの中に入れてください")
    exit()

try:
    inp_a = int(input("縦:"))
    inp_b = int(input("横:"))
except ValueError:
    print("【エラー】半角数字を入力してください")
    exit()

resize_img = img.resize((inp_a, inp_b))

# 2017/07/21
# .jpgを削除しないと'pic01.jpg_resize2.jpg'のようになる
filename = filename.replace(".jpg", "")
filename = filename + "_resize2.jpg"

resize_img.save(filename, "JPEG", quality=100, optimize=True)
print("【結果】: " + filename)

```

thumbnailを使うと綺麗にリサイズできると読んだので試してみたが、指定通りの大きさにリサイズされなかったため断念（コードはおまけ参照）。resize()であれば指定通りのサイズになる。

FileNotFoundErrorはファイルが見つからなかったときのエラー。
ValueErrorは数字以外を入力したときのエラー対策。

qualityの数字を上げることで品質を上げることができる。

```
画像のリサイズを行います
ファイル名を入力:pic01
縦:100
横:200
【結果】: picture/pic02_resize2.jpg
```

※pillowが入ってなければ以下のコマンドを実行。

```
pip install pillow
```

## pyinstallerを使おう
コマンドプロンプトで以下を入力。

```
pyinstaller.exe resize.py --onefile --clean
```

(※1)resize.pyの部分にはexe化したいプログラム名を書くこと。
(※2)当然だが指定のプログラムが配置されている階層で行うこと。


/distができたと思うのでその中にあるexeをダブルクリック。
resize.pyでは/dist/pictureが必要なので予め作成して画像を突っ込んでおく必要がある。自動でフォルダを作るとかそんな処理を書いた覚えはない。

ちなみにこのままではエラーが出たときに一瞬で画面が消えてしまってコメントが読めない。そこでもう少し書き換えることにする。

```py
def end():
    while True:
        key = str(input("'e'を入力すると終了します:"))
        try:
            if key == "e":
                sys.exit()
        except ValueError:
            break
```

前のプログラムのexit()をend()に書き換えればeキーが入力されるまで終了しないようになる。

# 反省
exe化するプログラムはコマンドプロンプトに依存する形のものではなく、PyQtなどを使ったGUIの方が良いと思った。

# おまけ
thumbnailを使ったリサイズプログラム。
適当な大きさにリサイズしたい場合はthumbnailを、指定通りにリサイズしたい場合はresizeを使うのが良いだろう。

```py
from PIL import Image

print("リサイズを行います. jpgのみ対応.")
inp_img = str(input("ファイル名のみ入力してください:"))
filename = "picture/" + inp_img + ".jpg"
img = Image.open(filename, 'r')

a = int(input("縦:"))
b = int(input("横:"))

img.thumbnail((a, b), Image.ANTIALIAS)
img.save(filename+"_resize.jpg", "JPEG", quality=100, optimize=True)
```

# 参考資料
- [Pythonのexe化、Pyinstaller使用メモ](http://qiita.com/ymdymd/items/f9f5587f0f3128285e25)
- [Python 3.5 対応画像処理ライブラリ Pillow (PIL) の使い方](https://librabuch.jp/blog/2013/05/python_pillow_pil/)
java8StreamAPI :: reduceによるListの操作

業務ロジックにありがちなListのインデックスに応じて処理を分ける処理はreduceを使って実装することもできる
例えば
「リストの先頭以外には:を付加する」
といったロジックはreduceを使って、下記のように実装することができる

```MyBusinessLogic.java
package test;

import java.util.ArrayList;
import java.util.List;
import java.util.function.BiFunction;
import java.util.stream.Stream;

public class MyBunessLogic {
	public static void main(String args[]){
		final BiFunction<List<String>, String, List<String>> operation = 
	            (accum, value) -> {
	            	if(accum.size()!=0)accum.add(" : "+value);
	            	else accum.add(value);
	                return accum;
	    };
	    Stream.of("start","middle","end")
	    .reduce(new ArrayList<String>(),operation,(s,v)->s)
	    .forEach(System.out::print);
	}
}
```
```
出力結果
start : middle : end
```
追記
BiFunctionの型の意味が分かりにくいので、その用途をメモする
ジェネリックの1番目と2番目の型は関数の引数の型で、1番目はアキュームレーター、2番目は演算の対象になる値が設定される。
ジェネリックの3番目の型は関数が実行された時の戻り値を示している

追記2
reduceの3番目の引数に渡すラムダ式はStreamクラスのpararellメソッドを実行したときに呼び出されるが、サンプルの例だと適当な式を与えている。
というのも上記の例だと、そもそもListを順番に処理することを目的としており、並行処理で処理することを目的としていないからだ。
個人的にはreduceメソッドに並行稼働を目的としないメソッド、(U indentity,BiFunction\<U,T,U\> func)のオーバーロードがあれば便利だと思うが。

追記3
上記の例だとラムダ式の引数で渡している変数(accum)に対して破壊的な操作を行っているため、改良版を書いてみる

```MyBunessLogic.java
package test;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

public class MyBunessLogic {
	public static void main(String args[]){
	    Stream.of("start","middle","end")
	    .reduce(new ArrayList<String>(),MyBunessLogic::operate,(s,v)->s)
	    .forEach(System.out::print);
	}
	
	private static  List<String> operate(List<String> accum,String value){
		List<String> list = new ArrayList<String>(accum);
    	if(list.size()!=0)list.add(" : "+value);
    	else list.add(value);
        return list;
	}
}
.NET Framework 4 の FtpWebRequest で RETR/STOR に失敗する

# .NET Framework 4 の FtpWebRequest で RETR/STOR に失敗する

苦労するとは思っていなかった VB.NET を使った FTP 接続によるファイル送受信でハマったときの対処を残す。

## 症状

VB.NET で実装した FTP クライアントから FTP サーバに接続後、ディレクトリのファイル一覧を取得し (これは成功)、ファイルのダウンロードを実行するデモでエラー `501 Syntax error in parameters or arguments.` を受信した。

FTP クライアント FFFTP で彼のサーバから同じファイルをダウンロードすると成功する。FFFTP のログによると CWD した後、ファイルを RETR している。
一方、私のコードはローカルパスを直接指定してダウンロードしようとする。.NET Framework 4 以降の FtpWebRequest では `CWD (Change Working Direcotry)` コマンドがなかったからだ (廃止されている)。

## 対処

次のサイトをソースに適用すると、ファイルの送受信に成功するようになった。

[System.Net.FtpWebRequest class behaves differently in .Net Framework 4 vs .Net Framework 3.5](https://support.microsoft.com/en-us/help/2134299/system.net.ftpwebrequest-class-behaves-differently-in-.net-framework-4)

内容は、
RFC に準拠する FTP サーバはローカルパスを指定した取得方法でも動作するはずなので .NET Framework 4 以降は CWD してから RETR (Retrieve) したりはしない。
RFC に準拠しない FTP サーバと .NET Framework 4 クライアントで通信したい場合は次を試せ。実行前に1回呼べばよい。と読めた。

サイトは C# で書いていたが、VB.NET で実装する必要があったので以下のとおり読み替えた。

ただし、私が参照サイトの情報によって動作するようになる仕組みを完全に理解できているわけではないこと、したがって、動くこと、正しく動くことを保証できないこと、さらに正しく C# から読み替えできていることを保証しないことを了解し、使用者の責任において利用すること。

```vbnet
Private Shared Sub SetMethodRequiresCWD()
    Dim requestType = GetType(FtpWebRequest)

    Dim methodInfoField = requestType.GetField("m_MethodInfo", BindingFlags.NonPublic Or BindingFlags.Instance)
    Dim methodInfoType = methodInfoField.FieldType

    Dim knownMethodsField = methodInfoType.GetField("KnownMethodInfo", BindingFlags.Static Or BindingFlags.NonPublic)
    Dim knownMethodsArray = CType(knownMethodsField.GetValue(Nothing), Array)

    Dim flagsField = methodInfoType.GetField("Flags", BindingFlags.NonPublic Or BindingFlags.Instance)

    Dim MustChangeWorkingDirectoryToPath = &H100
    For Each knownMethod In knownMethodsArray
        Dim flags = CType(flagsField.GetValue(knownMethod), Integer)
        flags = flags Or MustChangeWorkingDirectoryToPath
        flagsField.SetValue(knownMethod, flags)
    Next
End Sub
```


## 確認した環境
OS: 日本語 Windows 10 Home 64ビット
VS: Visual Studio Community 2015
.NET Framework: 4.6.2
git branch変更をもっと楽に(対話式で)

# 背景
エンジニアに転職して早くも二ヶ月。
最近bashでブランチの切り替えがめんどくさいな〜と思ってます。
いつもやるのは：

    git branch
    git checkout <branch>

branch一覧を一度確認することもめんどくさいし、branch名を入力するのも割りとめんどくさい。

## 対処
少し調べてみましたが、[pythonで書いたツール](https://github.com/ferhensil/interactive-git-checkout)を見つけましたが、手元のマシンでうまく動かないので、自作してみました。
[リポジトリはこちら](https://github.com/tonyjiangh/interactive-git-checkout)

## 使い方
エリアスを設定して実行すると対話的にブランチ切り替えができるようになります。
振られた番号を入力するだけでいけます。

```
(prompt)$ git ch
Branch numbers and name
1	* add_tool_file
2	  master
Input the branch number to checkout:
```

## 補足
なんとなく絶対どっかでいい方法はすでに存在していると思うんですが（IDEを使う以外）、もしご存知でしたら教えてください。

## 他にgitコマンド周りの効率化参考資料

[gitで便利なエイリアス達](http://qiita.com/peccul/items/90dd469e2f72babbc106)
[git commandのaliasを作ってる時でも保管して欲しい時](http://qiita.com/Sho2010@github/items/46ef3d1475dc6a6f7cba)
iOS 11 から追加された SFAuthenticationSession でシングルサインオン

※iOS 12 で `SFAuthenticationSession` は Deprecated になりました。今後は `ASWebAuthenticationSession` を使いましょう！
https://developer.apple.com/documentation/authenticationservices/aswebauthenticationsession

以下の記事にある `SFAuthenticationSession` は `ASWebAuthenticationSession` に適宜読み替えてください。

----

下記の @glayash さんによる記事でも書かれていますが、iOS 10 までは Safari と SFSafariViewController の認証情報が共有されていました。

[iOS 11 / Android O 時代のアプリ認証 \- Qiita](http://qiita.com/glayash/items/cf2bf2a5ff03b4604926)

しかし、iOS 11 からはそれぞれ独立した Cookie ストレージを持つように仕様が変更されました。

そこで iOS 11 beta 3 からは Safari の認証情報を共有できる [SFAuthenticationSession](https://developer.apple.com/documentation/safariservices/sfauthenticationsession) というクラスが登場するのですが、この記事ではその使い方を説明したいと思います。

## 実行環境

* Xcode 9.2

## 準備

今回は foursquare にログインしてみます。予め [Foursquare 開発者サイト](https://ja.foursquare.com/developers/apps) からアプリを新規登録し、CLIENT_ID と Redirect URI を取得しておきます。Redirect URI には `fsoauthexample://authorized` を設定してください。


## 実装手順

Xcode を起動し、適当なサンプルプロジェクトを作ります。
プロジェクト名は何でもいいです。

### URL Schemes の設定

**2017.8.8 追記：`SFAuthenticationSession` 初期化時に引数でスキームを指定する場合、この設定は不要です**

`fsoauthexample://` でアプリが立ち上がるように設定しておきます。

![スクリーンショット 2017-12-11 11.30.09.png](https://qiita-image-store.s3.amazonaws.com/0/8292/e0321571-e35a-1190-93b9-22882c2c9cb6.png)


### 実装

SafariServices をインポートします。

```
import SafariServices
``` 

引数 `url` に認証用のURLを指定して、SFAuthenticationSession を呼び出します。

```swift
let url = URL(string: "https://ja.foursquare.com/oauth2/authenticate?client_id=
(YOUR_CLIENT_ID)&response_type=token&redirect_uri=fsoauthexample://authorized")!
self.session = SFAuthenticationSession(url: url, callbackURLScheme: nil) { url, error in
    print(url)
    // fsoauthexample://authorized#access_token=XXXXXXXXXXXXXX
}
session?.start()
```

~~※Xcode 9 beta 3 の時点では引数 `callbackURLScheme` に何を指定しても挙動が変わりませんでした（詳しい方いましたら教えてください）。~~

**2017.8.8 追記：Xcode 9 beta 5になって、ようやく挙動に変化が現れました。`callbackURLScheme` にスキームを指定しておけば Info.plist への指定が不要になります。**

`start()` メソッドを実行すると「アプリがSafariの情報を使うけど問題ない？」的なアラートが表示された後、 SFSafariViewController のような画面（本記事では「ログイン画面」と呼ぶことにします）がモーダル表示されます。

<img width="320" alt="Simulator Screen Shot - iPhone SE - 2017-12-11 at 11.33.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/8292/00f2ebf7-ff17-e0e0-6718-fc56560891d3.png">


すでに Safari で Foursquare にログイン済みの場合は即座に redirect url（fsoauthexample://authorized）にリダイレクトがかかり、そのタイミングで `completionHandler` が実行されます。
未ログインの場合は、IDとパスワードを入力する通常のログイン画面が表示されます。ログインが成功すると、redirect url にリダイレクトがかかり、そのタイミングで `completionHandler` が実行されます。

`completionHandler` の `url` にはリダイレクト先の URL がセットされているので、ここから access_token を取り出すことができます。

```
fsoauthexample://authorized#access_token=XXXXXXXXXXXXXX
```

`completionHandler` が実行されるタイミングでログイン画面は自動的に閉じますが、`cancel()` メソッドを呼ぶことにより、意図したタイミングでログイン画面を閉じることもできます。

これで `SFAuthenticationSession` によるシングルサインオンが完了しました。

## サンプルコード

https://github.com/koogawa/SFAuthenticationSessionSample

## リンク

* [Foursquare 認証の仕様](https://developer.foursquare.com/overview/auth)
Raspberry Pi3にTensorFlowを入れてMNISTする

現在ARM用のTensorFlowは公式配布されていないので、[有志によるRasPi用TensorFlowプロジェクト](https://github.com/samjabrahams/tensorflow-on-raspberry-pi)のものをつかってインストールします。

## 環境

|項目||
|---|---|
|端末|Raspberry Pi 3|
|OS|Raspbian Jessie With PIXEL (Kernel 4.4)|

OS標準でPython2とPython3が入ってますが今後の事も考えてとりあえず3でいきます。

## インストール

```
$ wget https://github.com/samjabrahams/tensorflow-on-raspberry-pi/releases/download/v0.12.1/tensorflow-0.12.1-cp34-cp34m-linux_armv7l.whl
$ sudo pip3 install tensorflow-0.12.1-cp34-cp34m-linux_armv7l.whl
```

TensorFlowは、インストール後のmodule関連エラーが絶えないライブラリとして個人的に有名です。

RasPi版TensorFlowも、mockというライブラリの関係でimportに失敗するとのことなので、予め一旦アンインストールしたのちインストールします。

```
$ sudo pip3 uninstall mock
$ sudo pip3 install mock
```

これにて準備完了です。

## MNISTモデルの学習と実行

MNISTのコードに関しては、TensorFlowの公式チュートリアルに則って作成しました。

[https://gist.github.com/5adb40902add16b3a9d861cd4093e203:embed#MNIST For ML Beginners - Tensorflow Tutorials]

[MNIST For ML Beginners - Tensorflow Tutorials](https://www.tensorflow.org/versions/r0.10/tutorials/mnist/beginners/)

実行した結果、このようになりました。

```
$ python3 mnist.py
Extracting MNIST_data/train-images-idx3-ubyte.gz
Extracting MNIST_data/train-labels-idx1-ubyte.gz
Extracting MNIST_data/t10k-images-idx3-ubyte.gz
Extracting MNIST_data/t10k-labels-idx1-ubyte.gz
100 times	accuracy: 40.7499998808 %
200 times	accuracy: 89.4800007343 %
300 times	accuracy: 90.3100013733 %
400 times	accuracy: 90.7400012016 %
500 times	accuracy: 90.3699994087 %
600 times	accuracy: 91.2500023842 %
700 times	accuracy: 91.5000021458 %
800 times	accuracy: 91.6199982166 %
900 times	accuracy: 91.7599976063 %
1000 times	accuracy: 91.6599988937 %
```

RasPiでもTFが動く…感動。

MNISTモデル程度の簡単なタスクなら思ったより時間はかかりませんでした。ただ、CIFAR-10等のカラー画像等になってくるとちょっと怪しいかもしれません。

いずれにせよ、カメラを使ったいろいろなことや、RNNを用いた自動対話Botなんてのもこれで作れちゃいますね。

創作の幅が広がってよきかなよきかな。
Jupyter Notebookでmatplotlibのグラフが表示されない

サークルで統計が流行っているのですが、みんなRを使うのでひねくれものの私はPythonでデータサイエンスを勉強しています。（Rもそのうち触りたい）

そんな中、matplotlibがインライン展開されないという問題にぶちあたったのでメモ。

## 解決策

ノートのはじめで以下のコードを走らせないとインライン展開されないみたいですね。

```
%matplotlib inline
```

### Before

```
In  [48] : tz_counts[:10].plot(kind='barh', rot=0)
Out [48] : <matplotlib.axes._subplots.AxesSubplot at 0x18dd7d8c358>

```

### After

```
In  [49] : %matplotlib inline
In  [50] : tz_counts[:10].plot(kind='barh', rot=0)
Out [50] : <matplotlib.axes._subplots.AxesSubplot at 0x18dd7d8c358>
```

![20170402160818.png](https://qiita-image-store.s3.amazonaws.com/0/61960/1779cff1-f03e-6a8b-72da-0ac8542ee034.png)


表示されるよ！やったねたえちゃん！
pip installしたはずなのにImport errorと言われた場合

## 環境

MacOSX 10.12.2
pyenv 20160629

## 方法

pip installしたモジュールをimportしようとして`Import Error`を吐かれたときは、`$PYTHONPATH`が正しく設定されているか確認しなければならないらしい。

pipでインストールしたモジュールのインストール先は、`/usr/local/lib/python2.7/site-packages/`であるのに対して、pyenvを使っている場合のパスは`/Users/Hoge/.pyenv/shims/python/site-packages/`になっている。これでは、pipでインストールしたモジュールが読み込まれないのもうなずける。

Pythonは、`$PYTHONPATH`という環境変数の中にあるパスを基本的には探索します。
そこで、`$PYTHONPATH`にこのpipで設定されているインストールパスを追加することで、正常に読み込まれるようになります。

```
$ export PYTHONPATH=$PYTHONPATH:/usr/local/lib/python2.7/site-packages/
```

あとは、上記スクリプトを`.bashrc`なり、`.zshrc`なりに追加することで解決です。
Macで使えるフリー回路図エディタ「Qt-BSch3V」を使ってみた

私の通っている学校の講義のなかで「実験」というものがありまして，それがまた厄介なんですよね（？）

そんな話はさておいて，今回は回路図をMacで書こうと思います．（というのも実験のレポートで回路図を用意する必要性が生じたからなのですが…）

いろいろ探した結果，「Qt-BSch3V」というものがよさそうなので使ってみます．

もともと，Win用の回路図エディタとして「BSch」というものがあるらしく，それのMac移植版ということらしいです．

## 使い方

### ダウンロードとインストール

まずは，Vectorから「Qt-BSch3V」をダウンロードしてきます．

[http://www.vector.co.jp/soft/mac/business/se481361.html:embed:cite]

ダウンロードしてきたら，解凍してください．

解凍してできたフォルダをまるごとApplicationsフォルダに投げればインストール完了です．

### 起動とセットアップ

青色のBSchと書かれたアイコンがそれです．

起動すると，セキュリティの警告が出ると思いますが，お構いなく立ち上げましょう．

起動すると，以下のような画面になると思います．

[f:id:musaprg:20170424013146p:plain]

これが，エディタ画面です．

初期状態だと抵抗等のコンポーネントが読み込まれていませんので，コンポーネントをどこから読み込むかを指定してあげなければなりません．

メニューバーのSet→Libraryをクリックすると，Qt-BSch Set Libraryが立ち上がります．

[f:id:musaprg:20170424013449p:plain]

コンポーネントは，先程解凍してできたフォルダの中の`LIBV`というフォルダ内に入っています．

Addを押すと，選択画面が出るので，この中のライブラリファイルをすべて追加します．

以上でコンポーネントの追加は完了です．好きなだけ回路図をかきましょう！

（使い方については気が向いたら加筆します）
windowsストアでubuntuをインストールしてみた

#はじめに
仮想マシンを導入したり、デュアルアップデートしなくても
**windows10上でlinux**が走るようになりましたね！
　参照:http://japanese.engadget.com/2017/07/11/ubuntu-linux-windows-os-linux/
　　　 http://news.mynavi.jp/series/bashonwindows/053/
さほどPCに詳しくない私が解説するので、
初心者にはわかりやすくなりますが、間違いもあると思うのでフィードバックお願いします。


#必要なversionをダウンロード
ubuntuをインストールするには、
*Windows 10 Version 16215.0　以降*
が必須です。
現在（7/14)の最新versionは、15063.483ですので、
[Windows Insider Program](https://insider.windows.com/)に参加して、ベータ版を取得する必要があります。

まず、[Windows Insider Program](https://insider.windows.com/)のページをしっかり読んでください。
[インストールの前に](https://insider.windows.com/Home/GetStarted)は必ず読みましょう。
**特にバックアップをしておくべきことは当然ですが注意してください。**


次に、[Windows Insider Preview Downloads](https://www.microsoft.com/en-us/software-download/windowsinsiderpreviewiso)のselect editionで最新版を選んで64-bit版をダウンロードしてください。
ダウンロードが完了すれば、良しです。


#Windows subsystem for linuxの有効化
Windows subsystem for linuxの有効化しましょう。
>コントロールパネル → プログラム → プログラムと機能 → Windowsの機能の有効化または無効化 → Windows subsystem for linuxをチェック → OK

で再起動して完了です。 

#ubuntuのダウンロード
Windows Storeで "ubuntu" と検索し、ダウンロードしましましょう。

完了すれば、コマンドプロンプトでubuntuと入力してみましょう。何が起きるでしょう？
Rails with docker-composeで'/tmp/mysql.sock'がねえよと怒られたとき

この問題、よくあるみたいなのでメモ。

## 1. mysql.sockがあるかどうか疑う

mysql.sockについてですが、まれに自動で作成されない場合があるそうです。そのため、dbコンテナ上であらかじめ手動で作成してから再度試してみましょう。

```bash
$ sudo touch /var/lib/mysql/mysql.sock
$ sudo chown mysql:mysql /var/lib/mysql/mysql.sock
```

## 2. config/database.ymlの設定を疑う


そもそもソケットいらない？


docker-composeを用いてweb用とdb用のコンテナをそれぞれ分けて運用している場合、`config/database.yml`の`host`に`db`とコンテナを明示する必要があります。（当たり前かもしれない…）

```yaml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root
  password: password
  host: db
 
development:
  <<: *default
  database: myapp_development
 
test:
  <<: *default
  database: myapp_test
```

passwordの空欄を許可している場合は、passwordの値は空欄で構いません。
Rails with docker-composeで"A server is already running."と出る問題 

`docker-compose`で、`db`と`web`の切り分け運用している方は多いらしい。（僕は長いこと`vagrant`だったのでよくわかりません）

友人のプロジェクトを手伝っているときに、`docker-compose up`で`web`が立ち上がらないことがあったのでメモ。

## 問題の概要

`docker-compose up`とすると、`A server is already running.`というエラーが発生し、`web`コンテナが正常に起動してくれない。

## 原因

これは、何かしらの要因によって、前回のプロセスが正常に終了しなかった場合に発生すると考えられます。

`docker-compose`は、実行プロセスのPIDを`<project_dir>/tmp/pids/server.pid`に書き込み、終了時に削除するという方法をとっています。

`docker-compose`は、コンテナを立ち上げる際、まずこのファイルを見に行った上で、実行中のプロセスを確認します。

そのため、何かしらの要因でこの`server.pid`が削除されず残ってしまった場合、`docker-compose`はこれを実行中とみなしてしまいます。

## 対処法

諸悪の根源である`server.pid`を葬り去りましょう。

```bash
$ rm <project_dir>/tmp/pids/server.pid
```

PIDがわかる場合は、server.pidの中で該当するPIDを削除するだけで大丈夫です。
ActiveRecord::PendingMigrationError の倒し方

よくあります。

99.9%がモデルの変更に伴うマイグレーション忘れです。

作業を開始する前、pullしてきた直後、必ず以下のコマンドを実行しましょう。

```bash
$ rails db:migrate
```

docker-composeを使ってる場合のメモ。

```bash
$ docker-compose run web rails db:migrate
```
Cannot connect to the Docker daemon. の対処法

とある日、Docker上で走らせていたナレッジベースシステムが落ちていた。

「どうせだれか間違ってdockerのプロセスkillしたんだろｗｗｗ」とか思って`docker ps`してみたところ以下のエラーが。

```
$ docker ps
Cannot connect to the Docker daemon. Is the docker daemon running on this host?
```

どうやっても治らなかったので再インストールします。

## 再インストール手順

### 下準備

公式ドキュメントにアンインストールの方法も書いてあったのでこちらを参考にします。

[https://docs.docker.com/engine/installation/linux/ubuntu:embed:cite]

どうやら`docker`とか`docker-engine`とか呼んでた時代はとうの昔のようで、古いパッケージを捨ててアップデートしてくれと書いてありました。（もしかしてコレが原因…？）

```
$ sudo apt-get remove docker docker-engine
```

ちなみに、dockerやdocker-engineを削除しても、作成したコンテナやイメージは消えないのでご心配なく。
（各ファイルは`/var/lib/docker/`に入ってるので、もし仮に全データを吹き飛ばしたいのであればこちらのディレクトリを`rm`してください。）

> 特段の理由がない限りは`linux-image-extra-*`ってパッケージ入れてね。これないとdockerが`aufs`っていうストレージドライバを使えないからさ。

って公式が言ってるので入れます。

```
$ sudo apt-get update

$ sudo apt-get install \
    linux-image-extra-$(uname -r) \
    linux-image-extra-virtual
```

さて、サクサク再インストールしていきましょう。

まずは`apt`コマンドがHTTPS経由でやり取りできるようにするパッケージを入れます。

```
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common
```

次に、dockerの公式GPGキーを登録します。

```
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
```

念のため、キーのfingerprintが以下のものであるか確認してください。（公式サイトで確認することをおすすめします。）

`9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88`

```
$ sudo apt-key fingerprint 0EBFCD88
```

次に、dockerのリポジトリを`apt`に追加します。

基本は`amd64`だと思いますが、Raspbian等を使っている方は`armhf`の方を実行してください。

amd64:

```
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
```

armhf:

```
$ sudo add-apt-repository \
   "deb [arch=armhf] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
```

### dockerのインストール

さて、ここからは安定版のdockerをインストールしていきます。

まず、パッケージのindexを更新しましょう。

```
$ sudo apt-get update
```

次に、dockerをインストールします。今回は、Community Editionをインストールするので、実際は`docker-ce`というパッケージをインストールすることになります。

```
$ sudo apt-get install docker-ce
```

インストールが完了したら、以下のコマンドを実行して`hello-world`イメージが正常に起動するか確認してください。

```
$ sudo docker run hello-world
```

これにて完了です。

## dockerの更新手順

`sudo apt-get update`を実行後、上記インストール手順を頭から繰り返せばいいらしいです。

詳しくは公式ドキュメントをご参照ください

[https://docs.docker.com/engine/installation/linux/ubuntu/#install-docker:embed:cite]
EasyWineでwinetricksを使う方法

`winetricks`をHomebrew経由でインストールしたら、EasyWineに同梱されているwineを認識してくれなかったので、使えるようにする手順をメモ。

## 必要なものをインストール

```bash
$ brew install winetricks zenity
```

zenityは、winetricksをGUIモードで操作するのに必要なパッケージです。

## 環境変数の設定

winetricksは、まさかEasyWine.appの中にWineがあるとは思いもしません。そこで、`wine`コマンドの場所をwinetricksに教えてあげます。

以下の環境変数の値は、bashの場合は`.bash_profile`、zshの場合は`.zprofile`等に記述しておくと楽です。

WINEという環境変数に`wine`コマンドへのパスを与えることによって、winetricksは`wine`コマンドの位置を認識することができます。

```bash
$ export WINE=/Applications/EasyWine.app/Contents/Resources/wine/bin/wine
```

また、EasyWine.appが使用しているWINEPREFIXを環境変数に登録してしまいます。

```bash
$ export WINE=/Applications/EasyWine.app/Contents/Resources/wine/bin/wine
$ export WINEPREFIX=$HOME/Library/Caches/Wine/prefixes/defaults
$ export XDG_CACHE_HOME=$HOME/Library/Caches/Wine
$ export XDG_CONFIG_HOME=$HOME/Library/Caches/Wine
$ export XDG_DATA_HOME=$HOME/Library/Caches/Wine
```

これらの環境変数を、以下のように`~/.bash_profile`に記述しておくと楽です。

```bash
#EasyWineの設定
export WINE=/Applications/EasyWine.app/Contents/Resources/wine/bin/wine
export WINEPREFIX=$HOME/Library/Caches/Wine/prefixes/defaults
export XDG_CACHE_HOME=$HOME/Library/Caches/Wine
export XDG_CONFIG_HOME=$HOME/Library/Caches/Wine
export XDG_DATA_HOME=$HOME/Library/Caches/Wine
```

## 起動

```bash
$ winetricks
```

あとはGUIを操作して、必要なDLLをインストールしたり、winetricksを使い倒してください。
Go x goqueryでwebスクレイピング

この記事は[Go4 Advent Calendar](https://qiita.com/advent-calendar/2017/go4) 2017の14日目の記事です。

# BackGround
筆者は普段あまりwebベースな技術とは接点がありません。
しかしながら、webスクレイピングを活用できれば、いろいろおいしいなと思う今日この頃。
というわけで、Go向け公開されているgoqueryというライブラリを使用して、簡単なスクレイピングにチャレンジしてみました。

# Target
* スクレイピングでどんなことが実現できるかの一例を、過程を踏まえて伝えます
* goqueryの詳しい情報が欲しい方は、ReferenceのGoDocをご覧ください

# What I want to make
Weblio百貨辞典をコマンドラインから利用できるツールを作りたい。
英和、和英の機能をシンプルに利用したい。

# Demo

以下のように、引数の言語(英語or日本語)を自動判定して、適したフォーマットで出力します。

```bash
# 英和
$ ./webligo apple
単語             : apple
主な意味         : リンゴ
音節             : ap・ple
発音記号・読み方 : ˈæpl
$ ./webligo pen
単語             : pen
主な意味         : (昔の、ペン先  とペン軸  を含めて)ペン、鵞(が)ペン、文筆(の業)
音節             : pen
発音記号・読み方 : pén

# 和英
$ ./webligo 鯖
日単語           : 鯖
英単語           : mackerel
$ ./webligo 鯵
日単語           : 鯵
英単語           : horse mackerel

# weblioに存在しない文字列
$ ./webligo wwwwwwwwwwwww
単語             : wwwwwwwwwwwww
主な意味         : 
音節             : 
発音記号・読み方 : 
```
実行時間は最大10Mbps環境で1sec程度なので、十分実用に耐えるくらいになっています。

# SourceCode
ソースコードは以下のようになりました。
goqueryの細かな説明は趣旨ではないので割愛しますが、`goquery`の`Find()`というメソッドを使って、
htmlのclassという属性から、そこに含まれるテキストを取得しています。

* ソースコードはGithubへ公開しています
    * https://github.com/akif999/webligo

```go
package main

import (
	"fmt"
	"log"
	"unicode/utf8"

	"github.com/PuerkitoBio/goquery"
	"gopkg.in/alecthomas/kingpin.v2"
)

var (
	word = kingpin.Arg("word", "target word").Required().String()
)

func main() {
	kingpin.Parse()

	doc, err := goquery.NewDocument("http://ejje.weblio.jp/content/" + *word)
	if err != nil {
		log.Fatal(err)
	}
	if isIncludeMultibyte(*word) {
		fmt.Printf("日単語           : %s\n", *word)
		fmt.Printf("英単語           : %s\n", doc.Find(".content-explanation").Text())
	} else {
		fmt.Printf("単語             : %s\n", *word)
		fmt.Printf("主な意味         : %s\n", doc.Find(".content-explanation").Text())
		fmt.Printf("音節             : %s\n", doc.Find(".syllableEjje").Text())
		fmt.Printf("発音記号・読み方 : %s\n", doc.Find(".phoneticEjjeDesc").Text())
	}
}

func isIncludeMultibyte(str string) bool {
	return utf8.RuneCountInString(str) != len(str)
}
```

```go
package main

import "testing"

func TestIsIncludeMultibyte(t *testing.T) {
	tests := []struct {
		input    string
		expected bool
	}{
		{
			"apple",
			false,
		},
		{
			"umbrella",
			false,
		},
		{
			"----",
			false,
		},
		{
			"林檎",
			true,
		},
		{
			"かさ",
			true,
		},
		{
			"○",
			true,
		},
		{
			"Goラング",
			true,
		},
	}

	for i, test := range tests {
		got := isIncludeMultibyte(test.input)
		if got != test.expected {
			t.Errorf("tests[%d] got %v, want %v", i, got, test.expected)
		}
	}
}
```

# Roundup
* webの知識に疎くともライブラリを適切に使えば、やりたいことを簡単に実現できた
* 広く利用されているjqueryをベースとしているので、情報がたくさんある

# Reference
* [weblio.jp](http://ejje.weblio.jp)
* [GoDoc goquery](https://godoc.org/github.com/PuerkitoBio/goquery)
MCP 70-483 Programming in C# のお勉強 「目次」

MCP試験 [70-483 Programming in C#](https://www.microsoft.com/ja-jp/learning/exam-70-483.aspx) の学習材料。試験に合格するにはもう少し踏み込む必要があるかもしれませんが、とっかかりの参考として。

MCP試験そのものについては[MCP試験を初めて受験する人むけ情報](https://qiita.com/takutoy/items/a63ba024388ed6811158)で。

# この記事の対象者レベル
- 1年程度のC#の経験があり、ステップアップの一環として [70-483 Programming in C#](https://www.microsoft.com/ja-jp/learning/exam-70-483.aspx) の受験を考えている人。
- コンピュータに関する基礎的な用語を知っている、または自分で調べられるレベルの人。
- 英語が苦手な人。得意な人は [Exam Ref 70-483 Programming in C# (MCSD)](https://www.microsoftpressstore.com/store/exam-ref-70-483-programming-in-c-sharp-9780735676824) を買って読んだ方がいいと思います。

# 必要なモノ
- 必須：Visual Studio (Communityでよい)
- 推奨：LINQPad

# 試験範囲と記事へのリンク

記事とリンクは随時追加していきます。

1. プログラム フローの管理
    1. [マルチスレッド処理と非同期処理を実装する](http://qiita.com/takutoy/items/6f3a20f7f48f36d918dd)
    2. マルチスレッドを管理する
    3. プログラム フローを実装する
    4. イベントとコールバックを作成および実装する
    5. 例外処理を実装する

2. 型の作成と使用
    1. 型を作成する
    2. 型を使用する
    3. カプセル化を強制実行する
    4. クラス階層の作成および実装
    5. リフレクションを使用して実行時に型を検索、実行、および作成する
    6. [オブジェクトのライフサイクルを管理する](http://qiita.com/takutoy/items/bb502427b912ffc66b6c)
    7. 文字列を操作する

3. アプリケーションのデバッグとセキュリティの実装
    1. アプリケーションの入力を検証する
    2. 対称および非対称の暗号化を実行する
    3. アセンブリを管理する
    4. [アプリケーションをデバッグする](https://qiita.com/takutoy/items/817a9f82a430c1096ff4)
    5. アプリケーションに診断を実装する

4. データ アクセスの実装
    1. [I/O 操作を実行する](http://qiita.com/takutoy/items/5370d040ff2075dfbeec)
    2. データを使用する
    3. LINQ を使用してデータとオブジェクトをクエリおよび操作する
    4. [データをシリアル化および逆シリアル化する](http://qiita.com/takutoy/items/a9fa670d85ff05ef2c4f)
    5. コレクションにデータを格納およびコレクションからデータを取得する

※ただし上記に限るわけではない
nmcli memo

昔作ったメモのリンク

* [nmcliを使ったVLAN + ブリッジインターフェースの設定方法](https://gist.github.com/hiroyuki-sato/980de66e531bc067320b)
* [nmcliでブリッジインターフェースを作成する2](https://gist.github.com/hiroyuki-sato/2b7890338e5eca2c4931)
* [nmcli and ib memo](https://gist.github.com/hiroyuki-sato/9af1817838ad196387de)
AWSとGCPの料金比較

EC2より俄然安いと噂のGCPだけど、実際にどうなのか比較して見た。

# EC2 vs ComputerEngine

AWSはリザーブド1年、GCPは30%オフ価格

| コア数 | メモリ | AWS       | GCP           | 料金    |
|--------|--------|-----------|---------------|---------|
| 1      | 0.5    | t2.nano   |               | $4.32   |
| 1      | 0.6    |           | f1-micro      | $4.64   |
| 1      | 1      | t2.micro  |               | $8.64   |
| 1      | 1.7    |           | g1-small      | $16.23  |
| 1      | 2      | t2.small  |               | $18.00  |
| 1      | 3.75   |           | n1-standard-1 | $30.74  |
| 2      | 4      | t2.medium |               | $36.00  |
| 2      | 7.5    |           | n1-standard-2 | $61.49  |
| 2      | 8      | t2.large  |               | $71.28  |
| 4      | 15     |           | n1-standard-4 | $122.98 |
| 4      | 16     | t2.xlarge |               | $142.56 |

低スペックでは余り変わらないが、AWSのt2.mediumのお得感が際立つ
コア数が増えてくると、GCPがお得。
リザーブドインスタンスは面倒臭い。

# RDS(mysql) vs CloudSQL

AWSはリザーブド1年、GCPは30%オフ価格

| CPU  | memory | CloudSQL         | RDS           | 料金 |
|------|--------|------------------|---------------|-------|
| 共有 | 0.6    | db-f1-micro      |               | $10   |
| 1    | 1      |                  | db.t2.micro   | $15   |
| 共有 | 1.7    | db-g1-small      |               | $33   |
| 1    | 2      |                  | db.t2.small   | $30   |
| 1    | 3.75   | db-n1-standard-1 |               | $63   |
| 2    | 4      |                  | db.t2.medium  | $60   |
| 2    | 7.5    | db-n1-standard-2 |               | $126  |
| 2    | 8      |                  | db.m4.large   | $114  |
| 2    | 8      |                  | db.t2.large   | $130  |
| 4    | 15     | db-n1-standard-4 |               | $253  |
| 4    | 16     |                  | db.m4.xlarge  | $230  |
| 8    | 30     | db-n1-standard-8 |               | $506  |
| 8    | 32     |                  | db.m4.2xlarge | $459  |

こちらは、全体的にRDSの方が安い、特にt2.medium。
RDSのリザーブドインスタンスは契約後変更(分割)出来ないので、完全に適用するのは難しい。
【Swift】ランダムな方向に同じ速さで球を飛ばす【Spritekit】

# はじめに

球をランダムな方向に同じ速さで飛ばしたい！

# ランダムな`Double`型の値を生成する

指定した範囲内の`Double`型の値を生成する。

```swift
func getRandomValue(between min: Double, and max: Double) -> Double {
    let random = Double(arc4random_uniform(UINT32_MAX)) / Double(UINT32_MAX)
    return random * (max - min) + min
}
```

# 球に衝撃を与える

先程生成したランダムな値を利用して球に衝撃を与える。

```swift
var ball: SKSpriteNode!
```

```swift
let angle = getRandomValue(between: 0, and: 2 * Double.pi)
let impulseValue = 45
let dx = impulseValue * cos(angle)
let dy = impulseValue * sin(angle)
self.ball.physicsBody?.applyImpulse(CGVector(dx: dx, dy: dy))
```

# おわりに

球にはあまり衝撃を与えすぎないようにしましょう。
Windows8（x64）でGulpとXamppを連携させる

GulpでPHP環境を使用する為に、
「gulp-connect-php」を使用して
xamppのphp.iniとphp.exeを流用する方法があるが、
私の環境では**上手くいかなかった。**

そもそも上記方法を用いてPHP環境だけ動いても
Wordpress案件においてDBを使用するので困ってしまう。

よってXamppと連携させる方法を見出したので記そうと思う。

#導入方法
###①Xamppにgulpフォルダを作成する
Xamppのディレクトリについては任意で構わないが、
私は以下のディレクトリに配置した。

```
C:\xampp\htdocs\test\gulp
```
なお、Gulp環境の作成、使用方法については以下の記事にまとめているので、
Gulp環境を構築しておく。

[Windows8（x64）でgulpを初期設定する](http://qiita.com/taguchinbo/items/23bfa57fc7dda04f2625)
[Windows8（x64）のgulpでうまくいかなかったプラグインの対処法](http://qiita.com/taguchinbo/items/c8eac89ceb40f67fee3d)
[Windows8（x64）で構築したgulpの使い方](http://qiita.com/taguchinbo/items/d50ac1dd63261e86fe52)

###②プラグインのインストール
上記プラグインをインストールする。

```
npm install --save-dev gulp-connect-php
```
しかし、私の環境の場合、これではうまくいかなかったので、


```
npm install gulp-connect-php@0.0.5
```
これを打ち込んだらうまくいった。

###③gulpfile.jsの設定
以下の記述を追加する。

```gulpfile.js
var connect = require('gulp-connect-php');
var home_src = 'develop/';// index.htmlがある場所

gulp.task('connect', function() {
   connect.server({
     hostname: 'localhost',
     base: home_src
   }, function (){
    browserSync({
      notify: false,
      proxy: 'http://localhost/test/gulp/develop'//データが入っているXamppのURL
    });
  });
});
```
仕組みとしては、proxyにXamppのURLを入れることにより、
gulpのリロードを行った際、proxyのURLをリロードさせるようにする。
なお、gulp watchを使用したいので、以下の記述も追加した。

```gulpfile.js
var sass_src = 'develop/resource/sass/';// Sassの場所
var home_src = 'develop/';// index.htmlがある場所

gulp.task("watch",['connect'], function() {
    gulp.watch(sass_src + "**/*.scss",["sass"]);
    gulp.watch(home_src + "**/*.html", ['bs-reload']);
    gulp.watch(home_src + "**/*.css", ['bs-reload']);
    gulp.watch(home_src + "**/*.php", ['bs-reload']);
});
```
その他リロードさせたいファイルや設定などあれば、追記していく。
###④Xamppを起動し、コマンドを打つ
XamppのApacheとMySQLを起動し、以下のコマンドを打つ。

```
gulp watch
```
これであとは

```
C:\xampp\htdocs\test\gulp
```
内にある該当ファイルを編集するとライブリロードとコンパイルを実現しつつ
XamppのURLをリロードすることが出来る。

以上で、設定は完了だ。

#Wordpressの場合

```
C:\xampp\htdocs\test\gulp\develop\wordpress
```
このようにディレクトリを作成し、構築していくと
テキストエディタベースでテーマの改造をする際は便利だと思う。
※管理画面からプラグインなどを触るときはgulp watchを切っておく。
[備忘録]youtubeアプリを申請時のリジェクト理由


swiftで書いたつべを見るアプリが意味不明に林檎マークからリジェクトされてるので、
やる気をなくして放置してたんだけど、
心機一転、kotlinで書き直しました。

そしたら、結構リジェクトされましたorz
なので、忘れないようにメモ。


・動画再生画面で、アプリ広告を表示してはいけない
配信者、もしくは、Youtubeの広告以外の広告は表示してはいけない。
という規約があるらしい。
下バナーを当然のように表示していたので、リジェクト。。。


・バックグランド再生機能を停止しなければならない
バックグランドに回った場合、通知のとこから、以前はバックグラウンド再生が出来たらしい。
（ブラウザで見た場合）

特に、バックグラウンド再生を有効にしていたわけではないが、
リジェクトされました・・・
ホームボタンや、アプリ切り替えボタンを押した時、
バックグランドにまわるが、
持ってる端末（kindlefire:lolipop、Nugat:Zenphone3）で、
バックグランドに回った時に、通知ウィンドウにバックグラウンド再生の通知ビューが現れるわけでは無いし、
再生画面自体にもバックグラウンド再生のUIが表示されるわけでもない。
リジェクトされて、そんな機能はないと、反論するけど、聞く耳もたず。。。orz

結局、
Application.ActivityLifecycleCallbacks#onActivityStopped()で
バックグラウンドに回ったイベントをハンドリングし、
埋め込みJSの、player#stopVideo()をバックグランド検知時に実行するようコードを変えると、
この項目が、リジェクト理由からなくなった。。。
といっても、修正前コードでもバックグラウンドで再生する事はできなかったんだけど、
リジェクトされます。。。
（何回か、そんな機能ねーよと反論しても、
同じ条文をつきつけられるだけなので、
諦めて上記修正をくわえたらリジェクト理由からなくなりました。。。）

・ネットワーク不正使用
毎回この条文が付いてくる。
この条文にはダウンロードがホニャララとか書いてあるので、
ダウンロードなんかないよっと反論しても同じ。。。

結局、
ネットワーク不正使用とか何回あげても言われるので、そういえば、
APIキーのユーザーと、申請ユーザーが違うなと思い当たり
変えたら公開されました。。。
同一ユーザーである紐付けないのかなorz

アプリ申請時のユーザーと、APIを使用するユーザーは同じでなければならない
みたいです。。。



[結論]
結果、公開はできました。。。
https://play.google.com/store/apps/details?id=gkgkdrink.com.simpleyoutubeviewer


Androidのアプリでも、GGLさんのAPI使ってる場合は、
チェックして、リジェクトってされるんだなぁ。。。
Githubでファイル名で横断検索する

こんにちは

Githubでファイル名検索をする場合、Repository内であれば
tを押すことで検索ができます。
<img width="323" alt="スクリーンショット 2017-07-14 20.32.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/8904/8b8d4a9b-cfa7-117f-19ff-458344839ef1.png">


今回は、Ansibleのhostsファイルをみんなどうやって書いているのかを知りたかったので、全体で検索する方法を調べました。

<img width="459" alt="スクリーンショット 2017-07-14 20.30.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/8904/a12b63c3-14cf-e038-5282-d7bbc0c85f2f.png">
これでいけます。

他にもorg: user: language:などがある模様です。
https://help.github.com/articles/searching-code/
ディレクトリを順次圧縮しようぜという話

#はじめに

MacやWindowsで通常作業している際、ファイルの圧縮はGUIのツールでやる事が多かった。Linuxでも個別にファイルを圧縮する場合はGUIでもコマンドラインでも簡単に出来る（ググればすぐ情報が出てくる）

しかし、例えば沢山あるディレクトリ群を各個、個別にアーカイブ化したいなんて時には、一個ずつ手でやっていたら面倒くさくてしょうがない。MacやWindowsにはそういう設定が出来るツールがあるので、普段はそれを使ってチョイチョイっと終わらせているけど、Linuxの物は勉強不足で知らない。

じゃー、UNIXらしくコマンドラインでやれば簡単に出来そうだけど、具体的にはどうしたら良いの？という話。

#要件

- OSはUbuntu 16.04 LTS
- 操作はコンソールからコマンドラインで
- 対象は複数のディレクトリに格納されたソースが点在
- これらを個別にアーカイブ化したい
- とりあえずtar.xzにする

#さてやってみよう

どうやらfindとsed、xargsを組み合わせていけるらしい。当然アーカイブ化、圧縮にはtarとxzも必要です。入っていない場合はapt-getしてください。

詳細の解説は後からするとして、まず最終形態を。

```
$ find -mindepth 1 -maxdepth 1 -type d | sed 's!^.*/!!'|xargs -I% tar -Jvcf %.tar.xz %
```

##各ブロックの説明

まずfindで階層をカレントのみに限定し、ディレクトリのみを対象として名前を列挙。
それからsedで、出てきた文字列を整形してディレクトリ名のみにします。
最後に、渡されたディレクトリ名を使って圧縮対象とアーカイブ名を指定して圧縮。

コンナカンジ。

##各オプションの説明

*-mindepth 1*
これをしないと結果に「.」（カレントディレクトリ）が入ってしまうため

*-maxdepth 1*
自分のいる階層のみを対象とする為

*-type d*
ディレクトリーのみを対象とするため

*sed 's!^.*/!!'*
カレントのみ対象とすると「./〜」という感じで頭にいらないものがつくので置換して消している

*-I%*
指定した記号(%)を渡された文字（ディレクトリ名）で置換する。この文字は好きな記号で良いみたい。

##問題点

理想としては、処理しているフォルダー名を順次表示し、圧縮対象のファイルは冗長なので見せない様にしたい。どうやるのかパッと思いつかなかったので保留。誰かオシエテ。

##応用編

応用するとディレクトリをまとめて消したり出来ますな。

```
$ find -mindepth 1 -maxdepth 1 -type d | sed 's!^.*/!!'|xargs -I% rm -Rf %
```

いきなり実行するのコエーよって場合は一度何が対象になるか表示してみると良いかもしれない。

```
$ find -mindepth 1 -maxdepth 1 -type d | sed 's!^.*/!!'|xargs -I% echo %
```

このsedでやっている処理はawkなんかでも出来るし、もっと簡潔な方法があるかもしれないネ。
言語を作る！(JavaCCの環境構築編)

Javaで使えるJavaCC(Java Compiler Compiler)というツールがありました。

# JavaCCとは
構文解析（再帰降下型）および字句解析のツールです。独自の構文解析、字句解析定義ファイルを記述するとJavaのパーサを生成してくれます。

# JavaCC開発環境
総合開発環境としてEclipseを利用します。
EclipseのJavaCCのプラグイン（コンパイラごと一式）が提供されています。
「help」->「install new software」から以下を指定してプラグインをインストールしてください。
JavaCC - http://eclipse-javacc.sourceforge.net/

![image.png](https://qiita-image-store.s3.amazonaws.com/0/125554/c34790f1-1b28-beca-9ef3-bc574b70948f.png)

# JavaCCプロジェクト作成
適当な新規Java Projectを作成してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/125554/ab7f3115-61c4-c263-daa9-7334f3d95dc9.png)

新規のテンプレファイルを作ります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/125554/4585d167-c2a7-4cc8-aac7-0f52c108e670.png)

jjtを選択し、パッケージはデフォルトで完了
![image.png](https://qiita-image-store.s3.amazonaws.com/0/125554/1106c85c-9e50-9f94-005b-67a569cf659c.png)

`<?parser_name?>`をMyNewPerserに一括置換します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/125554/3392e0f0-d84e-85c6-4e34-1058d1311d0e.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/125554/ab3cb965-165b-b7dc-e675-1840f237a72a.png)

保存すると以下のようにパーサが自動生成されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/125554/42b03b77-74ab-edeb-5f46-44e0f5600e3c.png)

自動生成されない場合はjjtファイルを右クリックし、「Compile with javacc」を実行してください。

# 実行
MyNewParserクラスにmainがついているのでそのまま実行できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/125554/992cd510-2fe9-9795-d749-dee30e93b2f9.png)
（簡単な数式の構文木を表示しています）

# 次回
[言語を作る！(シンプルな電卓を作る編①)](http://qiita.com/toru0408/items/9d7263bce7f9a4bdce13)
に続く。
[PHP] [初心者]sort関数を使わずに並び替えする方法

##初めに
sort関数を使わずに並び替えさせていこうと思います。
確かにsort関数を使えば、簡単に終わることなのですが、私にとってはプログラミングの勉強になることだったので投稿することにしました。
並び替えをするアルゴリズムは、いくつかありますが、その中でも、もっとも簡単なバブルソートをご紹介します。
##バブルソートとは
バブルソートの仕組みは、とても単純です。
隣にある要素と比較して、順序が逆だった場合、要素を交換していくだけです。
この作業を要素数-1だけ繰り返すだけで、並び替えを行います。
これから、昇順にするバブルソートを紹介します。
##バブルソートのコード
```php
function bubble_sort(&$array){
    $size = count($array);
    for ($i = 0; $i < $size; $i++) {
        for ($j = 0; $j < ($size - 1 - $i); $j++) {
            if ($array[$j + 1] < $array[$j]) {
                $tmp = $array[$j + 1];
                $array[$j + 1] = $array[$j];
                $array[$j] = $tmp;
            }
        }
    }
}
    
$array = [100, 3, 30, 20, 44, 32];
bubble_sort($array);
echo implode(",", $array).PHP_EOL;
```
結果は以下のようになります。

```
3,20,30,32,44,100
```
しっかり昇順になっていますね！
解説が必要そうなところは、`$size - 1 - $i`の部分くらいだと思います。
並び替え($i)が進むたびに、最後尾の要素は決まって行くので`$size - 1 - $i`として並び替えする回数を減らしていくというイメージです。

##最後に
バブルソートを紹介しましたが、他にもマージソート、クイックソートなど色々あります。
この記事で初めて知ったという方や、興味を持ったという方がいましたら是非調べて見てください！！
SmartGit > Push [tag] | Push [tag] To

```txt:動作環境
Windows 7 Pro (32bit)
SmartGit Version 17.0.4 #10132
```

CommitペインにおいてTagのpushをしようとしたら、右クリックで表示されるコンテキストに二種類表示された。

- Push [タグ名]
- Push [タグ名] To

http://www.syntevo.com/doc/display/SG/Synchronizing+with+Remote+Repositories
のPushに説明がある。

> **Push** Pushes all commits in one or more local branches to their matching remote branches. More precisely, on the Push dialog you can choose between pushing the commits in the current branch to its matching remote branch, and pushing the commits in all local branches with matching remote branches to said remote branches. A local branch `matches' a remote branch if the branch names match, e.g. `master' and `origin/master'. With this Push command you can push to multiple repositories in a single invocation. SmartGit will detect automatically whether a forced push will be necessary.

> **Push To** Pushes all commits in the current branch either to its matching branch, or to a ref specified by name. With the Push To command you can only push to one remote repository at a time. If multiple repositories have been set up, the Push To dialog will allow you to select the remote repository to push to. Also, the Push To command always allows to do a forced push, what can be convenient. This is necessary when pushing to a secondary remote repository for which forcing the push may be necessary while it is not when pushing to the primary remote repository (i.e. the one which is considered by SmartGit's forced push detection). You can also invoke Push To on a remote to push (or synchronize) all branches from the selected remote to another remote.

**Push**では複数のbranchesを一度にPushできるようだ。
masterに対してorigin/masterなどのマッチングを見るようだ。

**Push To**では1つのbranchに関してのPushをできるようだ。
remoteリポジトリを選択できるという点も異なる。
forced pushを行えるという記述もある。
Update関数のアクセス修飾子(Unity)

Update関数のアクセス修飾子に関するメモ

Unity version : 5.6.1f1


基底クラスで定義したUpdate関数は、派生クラスにUpdate関数が定義されていない場合、アクセス修飾子の内容に関係なく呼ばれる。

例えば、基底クラスのUpdate関数にprivate修飾子をつけていたとしても、派生クラスにUpdate関数がない限り呼ばれる。

これはUnityの仕様のせいなのか。
SmartGit > 2つのcommitの差分を見る

```txt:動作環境
Windows 7 Pro (32bit)
SmartGit Version 17.0.4 #10132
```

http://www.syntevo.com/doc/pages/viewpage.action?pageId=6979721

以下のような手順でできた。

- Journalペインを選択
    - 上部右側の[Log]が押せるようになる
- [Log]を押下
    - Logウィンドウが開く
- Commitsペインにおいて2つのコミットをctrl押しながら選択
    - 変更ファイルが(右側の)Filesペインに表示される
- Filesペインのファイルを選択する
    - Changesペインに差分が表示される
railsのルーティングの不思議

#疑問

railsのルーティングを次のように行うと、

```ruby:routes.rb
resources :aws, only: [:index]
resources :openstack, only [:index]
```

次のようになった。

```
         Prefix Verb URI Pattern             Controller#Action
            aws GET /aws(.:format)           aws#index
openstack_index GET /openstack(.:format)     openstack#index
```

Prefixのawsとopenstack_indexの違いが気になった。
「_index」はどこから来たのか。

#答え

railsではリソースは複数形で記述するらしい。
単数形で記述した場合、Prefixの後ろにindex, showなどのactionが追加されるっぽい。

#試してみた

いろんな単語で試してみた。

```ruby:routes.rb
resources :miss, only: [:index]
resources :misses, only: [:index]
resources :man, only: [:index]
resources :men, only: [:index]
resources :tea, only: [:index]
```

```
         Prefix Verb URI Pattern             Controller#Action
           miss_index GET /miss(.:format)    miss#index
               misses GET /misses(.:format)  misses#index
            man_index GET /man(.:format)     man#index
                  men GET /men(.:format)     men#index
            tea_index GET /tea(.:format)     tea#index
```

#結果
awsはAmazon Web Servicesの略なので複数形扱い。
複数形が変則的な名詞にも対応してるっぽい。
不可算名詞は単数形扱い。

辞書みたいなものを参照してるのかな?
CentOSのcpコマンドで強制的にファイルを上書きする



`cp`コマンドでファイルを強制的に上書きしたいが、`-f`オプションを付けても上書きしてよいか確認されてしまう。

```
# cp -f sample.txt sample2.txt 
cp: overwrite `sample2.txt'? 
```

## 原因

原因はエリアスで予め`cp`コマンドが`cp -i`と設定されているため。

```
# alias
alias cp='cp -i'
```

`-i`オプションは`-f`の反対で常に上書きする前に確認をする。

```
  -i, --interactive            prompt before overwrite (overrides a previous -n
                                  option)
```

## 回避方法

`cp`コマンドの前にバックスラッシュを付けることでエイリアスを無効にして実行する。

```
\cp -f sample.txt sample2.txt 
```

これで確認無しでファイルを上書きすることができる。
RadioGroupのつらみを解決する

`RadioGroup`を捨てることで解決！

# RadioGroupのつらみ

* `LinearLayout`のサブクラスのため、レイアウト配置が縛られる
* 子要素が`RadioButton`でないとダメ

自由なレイアウト、自由な`View`(`extends Checkable`)について、`checked`の排他制御をしたいだけなんじゃ！

# つくった

はー、つっかえって思ったのでつくりました。

https://github.com/ushi3/RadioHandler

![simple.gif](https://qiita-image-store.s3.amazonaws.com/0/40926/f83d4b80-f9c4-3ac4-846e-52959f21f5ab.gif)

![complex.gif](https://qiita-image-store.s3.amazonaws.com/0/40926/3a05811a-08b6-35c4-025a-622f56479345.gif)

![grouping.gif](https://qiita-image-store.s3.amazonaws.com/0/40926/cd97de40-74a5-5323-2f92-91320ccf9b84.gif)

![custom.gif](https://qiita-image-store.s3.amazonaws.com/0/40926/a29272c2-8818-40fb-0dfb-4efdc690839f.gif)



# やれること

* 任意の`View extends Checkable`について、checkedの排他選択ができる
* 同じ`ViewGroup`で自由にグルーピングできる
* `View`を縛らない
* レイアウトを縛らない


# どうなってるの？

自分の配置されているレイアウト階層を検索して、排他となるCheckableのグループを作ります。
そのグループ内で、お互いに`子View`の状態変化を通知しあって、`checked`状態を排他に保ちます。


# やらなかったこと

`RadioGroup`のような、どいつが`checked`なのかってのは取れないようにしました。
というのも、`RadioGroup`の`getCheckedRadioButtonId()`はあっても別に嬉しくないと思っていて、
ID振るなら自分で`子View`見るのと大差ないやん、と。

~~なにより実装めんどくさいし~~


# 課題

* `onLayout()`で検索してるけど、ほかにいいライフサイクルないんだろうか
  * 自分の子の検索については`onFinishInflate()`でもいける気がする？
* `childDrawableStateChanged()`でこーいうことしていいの？


# 参考

今回は特にないです。
Cognos TM1 Architectで接続時にログインプロンプトが表示されない

##概要
Cognos TM1 ArchitectからTM1 Serverに接続する際に、以下の画面で「Planning Sample」をダブルクリックしても、ログインプロンプトが表示されず、ログインが出来ない場合の対応です。
Cognos TM1サーバーノードに、サービスLAN、管理LANなど複数のN/Wがあり、複数IPアドレスを持っている場合に発生する事象です。
複数NICのTM1はこれまで何度も構成していたのですが、最近始めてこの問題に引っかかりました。
自分はなかなか解決策に辿り着けなかったので、同じ問題で困った人が情報に辿り着けるよう、投稿しておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/159de8f9-d612-166b-ed81-0a546b79a4a5.png)

##対応策
通信経路の途中にFirewall等がある場合、TM1管理サーバーやTM1サーバーのポートが空いているかを確認するのは当然ですが、以下の2つのTechnoteに記載されている、IPAddressというパラメーターを、Tm1s.cfgに記載して、使用したいN/WのIPアドレスを記載すると直りました。

**(N33) Connection Failed When Connecting to TM1 Server via Perspectives**
http://www-01.ibm.com/support/docview.wss?uid=swg21648837

**Unable to login to TM1 Server when TM1 Admin Server has multiple network adapters (NICs)**
http://www-01.ibm.com/support/docview.wss?uid=swg21592968

TM1 Architectだけじゃなく、PerspectivesやPerformance Modelerでも同様です。