OmniAICreator/Qiita-1.07M huggingface dataset:
goで実行中のプログラムのpidを保存したい。

# やりたいこと
- goで実行中のプログラムのpidを、`$HOME/.mytool/pids/mytool.pid`に保存したい。
- クロスコンパイル環境でも動作させたい。

# pidファイルを保存するプログラム

## 必要なパッケージ

- [pidfile](https://github.com/facebookgo/pidfile): pidファイルを簡単に作成できる。
- [go-homedir](https://github.com/mitchellh/go-homedir): クロスコンパイル環境でHOME dirを取得できる。

## ソースコード

```main.go
import (
	"fmt"

	"github.com/facebookgo/pidfile"
	homedir "github.com/mitchellh/go-homedir"
)

func main() {
	dir, err := homedir.Dir()
	if err != nil {
		fmt.Println(err.Error())
		return
	}
	pidfilePath := fmt.Sprintf("%s/%s", dir, "/.mytool/pids/mytool.pid")
	pidfile.SetPidfilePath(pidfilePath)
	err = pidfile.Write()
	if err != nil {
		fmt.Println(err.Error())
		return
	}
	defer func() {
		err = os.Remove(pidfilePath)
		if err != nil {
			fmt.Println(err)
		}
	}()
	time.Sleep(30 * time.Second)
}
```

## 実行

パッケージ管理ツールに[dep](https://github.com/golang/dep)を使っている場合は、以下のコマンドでインストールします。

```
$ dep ensure -add github.com/facebookgo/pidfile
$ dep ensure -add github.com/mitchellh/go-homedir
$ dep ensure
```

main.goを実行し、pidファイルを確認

```
$ go run main.go

# ターミナルの別タブを開く
$ cat ~/.mytool/pids/mytool.pid
8642
```

# おまけ: プロセスをkillするプログラム


## ソースコード

```process_killer.go
package main

import (
	"fmt"
	"os"

	"github.com/facebookgo/pidfile"
	homedir "github.com/mitchellh/go-homedir"
)

func main() {
	dir, err := homedir.Dir()
	if err != nil {
		fmt.Println(err.Error())
		return
	}
	pidfilePath := fmt.Sprintf("%s/%s", dir, "/.mytool/pids/mytool.pid")
	pidfile.SetPidfilePath(pidfilePath)
	defer func() {
		err = os.Remove(pidfilePath)
		if err != nil {
			fmt.Println(err)
		}
	}()
	pid, err := pidfile.Read()
	fmt.Printf("pid: %d\n", pid)
	if err != nil {
		fmt.Println(err.Error())
		return
	}
	process, err := os.FindProcess(pid)
	err = process.Kill()
	if err != nil {
		fmt.Println(err.Error())
		return
	}
	fmt.Printf("killed process: pid:%d\n", pid)
}
```

## 実行

```
$ go run main.go

# ターミナルの別タブ
$ go run process_killer.go
pid: 10211
killed process: pid:10211
```
わりと自由なクラスタ計算環境や共用計算機環境においてどれくらいリソースを使ってよいかの指標例

# 概要

わりと自由なクラスタ計算機や、わりと自由な１台の共用計算機を使うときに、どのあたりを気にしたらよいかの指標の例です。
今回書いたことは、自分の知っている環境についての経験なので、リソースをどれくらい使ってよいかについて詳しくは管理者や、詳しい人、長く使っている人などにきいてみてください。

# 前提

わりと自由に使える計算環境のことを考えています。
そのような計算環境だと、効率よく計算できる限度を超えて、ジョブを実行することができることがあります。
そのような環境にいる人を対象にしています。

* パフォーマンスが改善された新しいソフトウェアを使っているのに、自分の想定と違う、マニュアルに書いいてある設定したがおもったほどパフォーマンスがでていないが、何をみたらよいかわからない人
* 自分のパソコンを使って計算している人

も参考になるところもあるとおもいます。


一方、
計算リソースの利用について厳格に色々きまっている場合は、
おそらく管理者が、どう使っても基本的には計算リソースの限界を超えたジョブが実行されてパフォーマンスが落ちるということがないと思いますので、
このような指標はいらないかもしれないです。

# 用語について

説明するときによく使っている言葉で書いています。
大きく逸脱していない範囲で書いているつもりですが、正確な定義とは違うかもしれません。

# CPUをどれくらい使ってよいか

CPU1コアあたりのロードが１を超えなければ問題ないとおもっています。

大抵 `uptime` とか `top` とか、 `qstat` とかの出力にでてきます。
お使いの環境での確認方法を、詳しい人に、きいてみたください。

# Memoryをどれくらい使ってよいか

100%ギリギリくらいまで使ってよいとおもいます。

100%を超えると、SWAPを利用することになる。
SWAPについては後述

## SWAPとはなんですか？

メモリに入り切らないデータを、HDDやSSDなどの記憶装置に転送します。
必要なときには、そこから取り出して使います。
この操作は、計算機側が勝手にやってくれるので、計算機の利用者が何かをする必要はないです。

しかし、HDDやSSDは、メモリに比べるとスピードが遅いです。
最近のSSDは、それなりに速くなってきていますが、、、

そのため、SWAPが発生すると、見積もっていた時間よりもだいぶ長い時間かかることがあります。

SWAP の発生がかならずしも、極端なスピード低下をまねくわけではないですが、
発生しないようにしたほうがよいでしょう。

# HDDをどれくらいの容量を使ってよいか

一応、残り２０％を切らないようにしておくとよいのではないかと思っています。

* ０％になると、よきせぬ出来事がおこることがあるので、できればそうなることは避けたいです。
* １０％を切ると、例えば圧縮するとか、スペースを空ける作業に何か問題があるかもしれないです。
* ２０％を切ったくらいなら、あまり快適さを損なわずに色々できる印象があります。
あと、作業する人も結構気が楽です。

# これ以外のことも気にしなければいけない。

ネットワークや、IO wait など、
これ以外のことも気にする必要があるのですが、それはそれでなかなか大変なので、またの機会に、、、

メモリについても、いろいろな指標がありますが、それもまたの機会に、、、
CPU も、、、
HDD, SSD などストレージ（記憶領域）も、、、
Swift 基本構文の備忘録

# 備忘録
よく忘れがちな基本構文をメモメモ

## 定数
```
let number1 = 12
let number2 = 24

let number3 = number1 + number2

print ("\(number3)") // ---> 36
```

## イメージの挿入
```
let image = UIImage(named:"imagename")

let imageView = UIImageView(image: image)
```

## 変数
```
var sr = "Hello, playground"
sr = "Hello Swift"

let st = "Hello!"
```

- 文字列

```
var member1: String = "Yamada Taro"
var member2 = "yamada"
var member3: String
member3 = "Taro"
```

- 整数

```
var age1: Int = 26
var age2 = 26
var age3: Int
age3 = 25
```

- Double 64 bit の浮動小数点数

```
var height1: Double = 182.4
var height2 = 182.4
var height3: Double
height3 = 183.4
```

- Float 32bit の浮動小数点数

```
var weight1: Float = 88.3
var weight2 = 88.3
var weight3: Float
weight3 = 33.2
```

- 真偽値

```
var isMan1: Bool = true
var isMan2 = true
var isMan3: Bool
isMan3 = false
```

- 代入

```
var a: Int
a = 2 * 9
```
**Intの余りの計算では変数がDoubleなど整数でないとエラーになる．**

## String ()
```
let num1: Int = 86
let sNum1: String = String(num1)

print(sNum1)
```

- description

```
let num2: Int = 65
let sNum2: String = num2.description

print (sNum2)

let num3: Int = 39
let sNum3: String = "\(num3)"

print(sNum3)
```

## String -> Int
- Int ()

```
let Str1: String = "94"
let nStr1: Int = Int (Str1)!

print (nStr1)

let Str2: String = "98abc"
let nStr2 = Int(Str2)

print(nStr2 as Any)

let Str3: String = "108abc"
if let nStr3 = Int(Str3){
    print(nStr3)
}
else{
    print ("error")
}
```

- NumberFormatter

```
let Str4 = "78"
let nStr4 = NumberFormatter().number(from: Str4) as! Int
print(nStr4)
```

## Double -> String
- String()

```
let num4: Double = 86.87
let sNum4: String = String(num4)

print (sNum4)
```

- desciption

```
let num5: Double = 65.989
let sNum5: String = String(num5)

print (sNum5)

let num6: Double = 8.001
let sNum6: String = "\(num6)"

print (sNum6)
```

## String -> Double
- Double()

```
let Str5: String = "94.765"
let nStr5: Double = Double(Str5)!
```

- Darwin.atof

```
let Str6: String = "10.59"
let nStr6: Double = atof(Str6)
```

## Int <-> Double
-  Double から Int

```
let dNum1:Double = 3.14
let iNum1:Int = Int(dNum1)

print(iNum1)
```

## Int から Double

```
let iNum2:Int = 37
let dNum2:Double = Double(iNum2)

print(dNum2)
```

#　最後に
とりあえず，パート1である．
そのうち続きも備忘録で書くかも
redashのWidgetでJavaScriptを有効にする（v2.0.1での例）

Redashにちょっとだけ手を加えたくJavaScriptを埋め込もうと思ったものの、
v1.0以降ではすんなり動かないようなのでなんとかしてみました。
試した環境はv2.0.1をUbuntu16にローカルインストールしたものです。


## TextWidgetでコードを許可するよう設定する
.envに記載するなど、環境に応じてスクリプトを許可します。
本来はこれだけで動いてくれるのが理想なんだけども…

```bash
export REDASH_ALLOW_SCRIPTS_IN_USER_INPUT="true"
```

## コードを編集

markdownフィルタのせいで動かないのではずしたよという情報もあったのですが

I can't use javascript in Text Box - Support - Redash Discourse
[https://discuss.redash.io/t/i-cant-use-javascript-in-text-box/637](https://discuss.redash.io/t/i-cant-use-javascript-in-text-box/637)

v2.0.1でフィルタを外すとREDASH_ALLOW_SCRIPTS_IN_USER_INPUTの設定が処理されなくなってしまいました。
なので、フィルタそのものの動作を変更。当然ながら、Markdownは使用できなくなります。

・redash.2.0.1.b3080での編集例

/opt/redash/redash.2.0.1.b3080/client/app/filters/markdown.js

```diff
@@ -1,4 +1,4 @@
-import marked from 'marked';
+//import marked from 'marked';

 export default function (ngModule) {
   ngModule.filter('markdown', ($sce, clientConfig) =>
@@ -7,7 +7,8 @@
          return '';
        }

-       let html = marked(String(text));
+//       let html = marked(String(text));
+       let html = String(text);
        if (clientConfig.allowScriptsInUserInput) {
          html = $sce.trustAsHtml(html);
        }
```

## リビルド

本来はnpmインストールしてこれだけでいいはずなんですが…

```shell-session
$ cd /opt/redash/redash.2.0.1.b3080/
$ npm install
$ npm run build
```

ここも投稿時点ではいろいろ問題があったので、対処方法を別の投稿に記載しています。

redashビルドとエラー対応（2017/11 時点）
[https://qiita.com/tomokin/items/c5204e1d5f73249b72d3](https://qiita.com/tomokin/items/c5204e1d5f73249b72d3)
Fogのノード間通信の実現方法調査（Bluetoothまわり）(2017/11/02)

Fogコンピューティングのネットワーク層の実現方法について、調査した内容を順次記していく。(2017/11/02)

調査しながらなので、間違いがあるかもしれない。また、もっといいやり方があるよ、というのをご存じの方がいらっしゃったらぜひご教授下さい。

# Fogにおけるネットワーク層の必要機能(要件)
*　ノード間でのメッセージ交換 
*　ノードの発見
*　複数ノード間でのメッセージのルーティング

全部が最初から必須なのではなく、やりたいことに合わせて揃えていく、という想定。まずは最も基本的なメッセージ交換から調査に着手する。

# 前提とする条件

基本的には以下を想定する。ノウハウあるしLinuxベースOSが動くので。

* ハードウエア : ラズパイ(Raspberry Pi3 or Raspberry Pi Zero W) (WiFi/Bluetoothがビルトインなので)
* OS : Raspbian or Ubuntu
* OS Version : Raspbian Jessie


# ノード間でのメッセージ交換方法

## BLEのアドバタイズメントを利用する方法(iBeacon)

iBeaconは、ビーコンの名前の通り、基本的にはペリフェラル側からセントラル側に向けてアドバタイズメントを送りつける一方向通信だが、短時間でペリフェラルとセントラルを切り替えれば擬似的には双方向でのメッセージ交換が可能になるのではないか(仮説)。

この記事が参考になる。
[Raspberry PiでiBeaconを検知する](https://qiita.com/katsuyoshi/items/9d5417495a47c4b15ac1)
およびその記事内で参照されている
[Raspberry Pi で iBeacon を試してみよう！](https://www.eyemovic.com/works/4269.php)

こちらも参考になる。内容は上記とほぼ同じ。
[Raspberry Pi 3に Bluetooth BlueZ Version 5.42 BLE](http://www.neko.ne.jp/~freewing/raspberry_pi/raspberry_pi_3_bluetooth_ble_bluez/)

記事ではbluez(フリーののBluetoothプロトコルスタック実装)をインストールする様に書いてあるが、raspy3/jessieではフルパッケージを手動で入れる必要はなく、

`$ sudo apt-get install bluetooth libbluetooth-dev libudev-dev` 

でOK。

### ペリフェラルになる場合(コマンドライン実行)
ペリフェラル(電波吹く方)になるには「bluez-ibeacon」というソフトウエアを入れる、ということ。

### セントラルになる場合(コマンドライン実行)
セントラル(受信する方)になるのは、「hcidump -R」を起動したまま「hcitool lescan」を実行すれば見られる。hcidumpはsudoしないと受信したメッセージが見えないので注意。

### Pythonから制御する

これから、Pythonから制御する方法を調査する。Pybluezか？

## BLEでちゃんと通信する場合

参考URL。
[Check! Raspberry Pi で Bluetooth 経由のセンサーデータを取得する 〜 準備編](https://qiita.com/dz_/items/4e858e4d50db19b57491)

## 6LoWPANとか
## Bluetooth 5とか
## Bluetooth全般の基礎知識

[【BLEを使う】GAP（Generic Access Profile）概要](http://yegang.hatenablog.com/entry/2014/07/19/224754)
[Bluetooth Low Energy リンクレイヤの解説](https://blog.reinforce-lab.com/2013/02/07/ble-linklayer/)
[Bluetoothl-Low-Energy入門講座-part1](https://www.slideshare.net/edy555/ble-deospart1)
[20140922 ble bootcamp](https://www.slideshare.net/reinforcelab/20140922-ble-bootcamp)
評価版WindowsOSのライセンス期限を延長する方法

WindowsOS評価版にて検証作業中、評価ライセンスが期限切れとなってしまった場合の暫定対処方法。

## 作業手順
コマンドプロンプトを**管理者権限**で起動し、以下のコマンドを実行する。

```bat:Cmd(Administrator)
slmgr -rearm
```

マシンを再起動し、ライセンス期限が延長されていることを確認する。

## 残りの延長可能回数を確認する
この延長には回数制限がある。以下のコマンドを実行し`残りのWindows猶予期限リセット可能回数`がリセット可能な回数となる。

```bat:Cmd
slmgr -dlv
```

![2018-05-23_11h14_55.png](https://qiita-image-store.s3.amazonaws.com/0/97774/7ee0adc5-5d01-9029-d0e4-5df82fbafaf1.png)
PACEMAKER > RPi設定 > デスクトップ起動時にターミナルを表示する > .config/autostart/[任意の名前].desktopを用意する

```txt:動作環境
Raspberry Pi 2 Model B (以下RPi)
Raspbian Jessie
Python 2.7.9
```

Raspberry Piを起動時、デスクトップが表示される。
デスクトップ上にターミナルが表示されて欲しい。

参考: [Raspberry PiのNode-RED小ネタ](https://qiita.com/NaotakaSaito/items/0087c0b47c20d6e4bb17)

情報感謝です。

`.config/autostart/[任意の名前].desktop`を用意してみた。

```terminal-setup.desktop
[Desktop Entry]
Exec=lxterminal
Type=Application
Name=Terminal autostart
Terminal=true
```

RPiを起動するとデスクトップが表示され、ターミナルも表示された。

TODOを2つ処理できた。
[マインドマップ](https://atlas.mindmup.com/yasokada/hw0002_pacemaker_171026/index.html)

### サイズ指定

参考: https://sites.google.com/site/tetsuroweb/home/software/ubuntu/tips/lxterminal-size

`lxterminal --geometry=200x50`
あたりにすると27インチモニタの9割程度でおさまりそう。

geometryの指定は「文字数」。ピクセルと思って指定するとデスクトップが落ちた。
【UnityEditor】ダイアログからフォルダを作成する

# 環境について
Windows 10
Unity2017.2.0f3 (Unity5 系でも動くと思います)

# はじめに
エディター拡張をしているとコード側からフォルダを作成させたいというシチュエーションがあると思います。

今回は**ダイアログを使って**フォルダを作成する手順を備忘録も兼ねてまとめてみました。

# これって何？
ダイアログに名前を入力してフォルダを作成するエディター拡張です

![1.gif](https://qiita-image-store.s3.amazonaws.com/0/44288/6a0fe838-3aa0-63ee-7041-e5e9ea049392.gif)



# ソースコード
Unityプロジェクト内にEditorフォルダを作成し、以下のスクリプトを入れてください。

```DisplayFolderCreateDialog.cs
namespace Hoge
{
    using System.IO;
    using UnityEngine;
    using UnityEditor;

    public class DisplayFolderCreateDialog
    {
        [MenuItem("Test/フォルダ作成...")]
        static void Display()
        {
            var fullpath = EditorUtility.SaveFilePanel("フォルダ作成先の選択", "Assets", "", "");
            if (string.IsNullOrEmpty(fullpath)) { return; } 

            string path = "Assets" + fullpath.Substring(Application.dataPath.Length); // フルパスを "Assets/xxxx" の形に変換

            var directory = Path.GetDirectoryName(path);
            var fileName = Path.GetFileName(path);
            var folderGUID = AssetDatabase.CreateFolder(directory, fileName); // フォルダ作成
            var folderPath = AssetDatabase.GUIDToAssetPath(folderGUID);

            Debug.LogFormat("folderPath = {0}", folderPath);
        }
    }
}


```
Gradle で APP_HOME を logback に渡したい

ログの出力先をアプリケーションを展開したディレクトリに合わせて変えたい場合など

https://www.mkyong.com/gradle/gradle-application-plugin-app_home-in-applicationdefaultjvmargs/

上記のまんま。だけど、小手先すぎないか、、

``` build.gradle

applicationDefaultJvmArgs = [ "-DappHome=MY_APP_HOME" ]

startScripts {
doLast {
           unixScript.text = unixScript.text.replace('MY_APP_HOME', '\$APP_HOME')
    }
}
```

``` logback.xml
  <appender name="APPLOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${appHome}/logs/app.log</file>
     ～(以下略)
```
VimGolf 解説: surround.vim の代替



VimGolfについてはこちら: https://www.vimgolf.com/


解説する問題はこれ: https://vimgolf.com/challenges/5192f96ad8df110002000002
興味ある方は是非、下の解説を見ずに挑戦してみてください。


```:start
one two
three
```

```:goal
(one) (two)
(three)
```


---
以下解説

---



# 解答(現状最短解)
14 ストローク
```cw(<C-R><C-O>")<Esc>w.w.ZZ```


# 解説
この14文字に詰まっているテクニックを解説する。

## cw
* c: cut  (action)
* w: word (text object)

この時点

```:cw
| two
three
```

<sup>|はカーソル位置</sup>

## \<C-R>\<C-O>"

* \<C-R>{0-9a-z"%#*:=} : レジスタから挿入
* \<C-R>\<C-O>{0-9a-z"%#*:=}: インデントなしでレジスタから挿入

http://vim-jp.org/vimdoc-ja/vimindex.html

ここが今回のポイントで \<C-R>\<C-R> でも貼り付けは出来るんですが、single-repeat の際に毎回`one`が挿入さるはずです。
single-repeat もレジスタを使い動作を再現するんですが、\<C-R>\<C-O> はそのコマンド自身がレジスタに格納されます。よって期待通り毎回 \<C-R>\<C-O>が呼ばれその都度 cw でカットした文字列が挿入されます。

レジスタの中身を覗いてみるとわかりやすいです。

![1__takaya-uniform-map__vimgolf_put_5192f96ad8df110002000002__zsh_.png](https://qiita-image-store.s3.amazonaws.com/0/40717/43bad5ea-3473-92d0-ee8d-2d14d884d92a.png)
\<C-R>\<C-R> で貼り付け

![1__takaya-uniform-map__vimgolf_put_5192f96ad8df110002000002__zsh_.png](https://qiita-image-store.s3.amazonaws.com/0/40717/eef94bd1-fe01-34ec-e6fa-91391152accb.png)
\<C-R>\<C-O> で貼り付け


```:
(one) two
three
```

## w.w.

* w: 単語移動
* `.`: single-repeat(`cw(<C-R><C-O>")`)


## `ZZ`
保存して終了。


# 考察など
`q` マクロを使わずに `.(single-repeat)`を使えるように挿入するパターンは 前にも見たことがあって、VimGolf では定番なのかもしれません。

自分は [surround.vim](https://github.com/tpope/vim-surround) を使っていて他のエディタにも同様のプラグインを入れています。なので `vwS(` でやってしまうところです。(そもそもエディタによって実装が違うところだしレジスタの機能も再現できているかわからないという点があります。)
レジスタから挿入はあまり使わない(OSのペーストもあるので)のですが、括弧でくくるだけでない場合にも力を発揮しそうなので意識したいなと思いました。


surround 関連の小ネタですが、Atom の vim-surround 用パッケージで
[vim-mode-plus-keymaps-for-surround](https://atom.io/packages/vim-mode-plus-keymaps-for-surround) を気に入っています。
このプラグインでは括弧の指定を省いて一番内側の括弧が自動で指定される仕様になっています。
例えば `cs'"` は `cs"`、 `ds(` は `ds` のみで編集できます。(かわりにカーソル位置は意識しないといけません。)

## 終わり

他の問題を解説したものも紹介しておきます。
https://qiita.com/elzup/items/5b6992d21408ba35a3b4



過去解説した別の問題

* https://qiita.com/elzup/items/5b6992d21408ba35a3b4
* https://qiita.com/elzup/items/9e0ebcbe180744ed45ff

参考記事

https://qiita.com/0829/items/6e16142be13a9007e91c
ユーザ補助機能のテキストの拡大と縮小が反映される箇所と反映されない箇所

Android 7.0のChromeにてスマホ用サイトのアクセシビリティの確認を行っていたところ
ユーザ補助機能のテキストの拡大と縮小が反映される箇所と反映されない箇所があることに気付いた。
重要な箇所は文字の大きさを拡縮させたいので、調べてみた。

##反映されない箇所のCSS指定
文字の大きさを拡大しても大きくならない箇所のCSSの指定を調べてみると
以下のCSS指定があることに気付く。

```css
display: inline-block;
```

指定をinlineにしたところ、文字の大きさがユーザ補助機能で指定したとおり拡縮するようになた。

レイアウト組みとして使われるinline-blockは拡縮するとレイアウトが崩れるかもしれないから、拡縮の対象外になっているのだろうか。

仕様などは見つからなかったが、上記CSS指定が原因なのは明らかになった。


## 反映される・されないの確認

文字の大きさの拡縮が反映される、されないの確認を行っていた。
以下のHTMLを用意した。

```html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
タグ指定なしの文字列<br>
タグ指定なしの文字列<br>
タグ指定なしの文字列<br>
<br>
<span>インラインタグ（SPAN）の文字列</span><br>
<span>インラインタグ（SPAN）の文字列</span><br>
<span>インラインタグ（SPAN）の文字列</span><br>
<br>
<p>ブロックタグ(P)の文字列</p>
<p>ブロックタグ(P)の文字列</p>
<p>ブロックタグ(P)の文字列</p>
<div>
<p style="display: inline-block;">inline-blockの文字列達</p>
<p style="display: inline-block;">inline-blockの文字列達</p>
<p style="display: inline-block;">inline-blockの文字列達</p>
</div>

<ul style="list-style: none;">
<li style="display: inline-block"><span>inline-blockの子要素のインライン要素</span></li>
<li style="display: inline-block"><span>inline-blockの子要素のインライン要素</span></li>
<li style="display: inline-block"><span>inline-blockの子要素のインライン要素</span></li>
</ul>
</body>
</html>
```

拡縮をしないままで表示したらすべてが同じ大きさで表示される。

<img width="203" alt="Screenshot_20171026-120328.png" src="https://qiita-image-store.s3.amazonaws.com/0/21476/3aa4d749-d85c-cb37-ef8c-3d01a67c4251.png">

では、拡大してみたらどうなるか。

<img width="203" alt="Screenshot_20171026-120411.png" src="https://qiita-image-store.s3.amazonaws.com/0/21476/c15ca89d-88b6-fbe1-d8f6-3c5dbd590688.png">

すべてが表示されていないが、inline-blockの指定がある要素だけ拡縮されていない。

##対応方法

display属性をblockまたはinlineにして
inline-blockを使わずに、レイアウトが成り立つようにCSS調整を行う。

意味のあるコンテンツでinline-blockは使わないようにしましょうってこと。
エンジニアがPCを新しくするときに忘れがちなこと

# いきさつ
最近、会社で PC を交換してもらった。当然、様々なデータの migration が必要だったので、社内の wiki に備忘録として何を移行したか書いていた。しかし、いくつかは割りと汎用的な話だと思ったので Qiita にも書いておく。

# OS何よ
今回はmacOS -> macOSだが、Linux でもあんまり変わらなそう。Windows はあんまりわかりません。

# ファイル移行

## `.bash_profile` 等シェルの設定
普通忘れないかも。pyenv/rbenv/nodebrew みたいなプログラミング言語ごとの環境管理ツールとかも含めて。

## `/etc/hosts`
開発中、IP アドレスに適当なドメインをローカルで振ることは結構あると思う。たくさん書いてあった場合死ぬ。その割に忘れがち。

## `~/.ssh/config`
サーバ開発者だと色々書いてあるはず。忘れがち。

## `.gitconfig`
git の設定も、エイリアスバンバン貼ってたりすると死ぬ。[補完スクリプト](https://github.com/git/git/tree/master/contrib/completion)使ってる人はそれも一緒に移行してしまうとよい。

# アプリケーション

## Google Chrome の同期
この機能すごい。拡張機能まで自動同期されるので POSTMAN とか入れてても再インストールいらない。

## IntelliJ IDEA の設定をエクスポート＆インポート
IntelliJ を使っている人向け。`File > Export Settings...` から。インポートも同様に `File > Import Settings..`。
ただプラグインは移行できなかった[^1]ので、Java の Lombok Plugin とかよく使うものはメモしておいたほうがいいかも。

[^1]: いい方法あったら誰か教えてください
jest-enzyme を TypeScript で使う方法

## TLDR

TypeScript で jest-enzyme を使う場合は tsconfig.json の `typeRoots` プロパティに "node_modules/jest-enzyme" を追加すること。

## jest-enzyme とは

[jest-enzyme](
https://github.com/blainekasten/enzyme-matchers/tree/master/packages/jest-enzyme) とは Jest に Enzyme 専用の matcher を追加するプラグインで、 React のテストが以下のように書けるようになる。

```ts:
import * as React from 'react';
import { shallow } from 'enzyme';

test('example matcher', () => {
  const element = <a href="http://www.facebook.com">Facebook</a>;
  const wrapper = shallow(element);

  // jest
  expect(wrapper.find('a').prop('href')).toBe('http://www.facebook.com');

  // jest-enzyme
  expect(wrapper.find('a')).toHaveProp('href', 'http://www.facebook.com');
});
```

記述用の違いはちょっとしたものだが、テストの意図を残せることと失敗した時のエラーメッセージがわかりやすくなることから Enzyme を使う場合はマストで入れるようにしている。

## 問題

そんな便利な jest-enzyme なのだが、 TypeScript から使おうとするとかゆいところに手が届かない。

というのも、上のコードはコンパイルエラーになるからだ。

## 原因

原因は型定義ファイルの所在とセットアップの手続きにある。

1. jest-enzyme はパッケージ自体に型定義ファイルをバンドルしており、@types にはない。
1. jest-enzyme の import は通常 config を通して行われ、テストコードそれ自体に入らない。 create-react-app を利用した場合も事情は同じ。

以上のことから、コンパイラや IDE が前述の型定義ファイルをみつけることができなくなっている。

## 対策

手動でこのファイルのありかを教えてあげればいい。素朴にやるとほかの型定義ファイルまで見えなくなるので、最低でも以下のようにする。

```json:tsconfig.json
{
  "compilerOptions": {
    ...
    "typeRoots": ["node_modules/@types", "node_modules/jest-enzyme"]
  },
  ...
}
```

## 意見

これで解決……なのだが、すべてのプロジェクトでこれをやるのはだるいし、ダサい。

もし TypeScript が @types よりもバンドル方式を——あるいは初めから TypeScript で開発することを——推奨してゆくのならば、こうした環境に組み込まれるタイプのパッケージを扱うための簡便な方法[^1]が必要だと思う。想像してほしい、かりに mocha が同じ状況だったらどれほどの影響が出るだろうか。

あるいは、現状の仕組みのままでも @types にダミーパッケージを作って型定義を転送するなどすれば解決するのかもしれない（未検証）。

[^1]: node_modules/__${package}__/package.json に types エントリがあったら自動で参照するなど。
C++ Builder XE4, 10.2 Tokyo > 設定 > TComboBoxの保存 > ItemsとItemIndexの保存 > TMemo + TEdit

```txt:動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2018/01/05)
```

TComboBoxの設定を如何に保存、読込みするか。

TComboBoxではItemsとItemIndexを扱うことになる。
Itemsを書換えたとき、ItemIndexはクリアされる。
そのため、Itemsを先に、ItemIndexを次に読込む必要がある。

TMemoにItemsを、TEditにItemIndexを読込んで、それをTComboBoxに設定する方法は思いつく。

```Unit1.h
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE で管理されるコンポーネント
	TButton *B_save;
	TComboBox *CMB_profile;
	TLabel *Label1;
	TEdit *E_ItemIndex;
	TLabel *File;
	TMemo *M_Items;
	TButton *B_load;
	void __fastcall B_saveClick(TObject *Sender);
	void __fastcall B_loadClick(TObject *Sender);
private:	// ユーザー宣言
public:		// ユーザー宣言
	__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
```

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
	CMB_profile->Items->Clear();
	CMB_profile->Items->Add(L"DeltaFlyer");
	CMB_profile->Items->Add(L"DeltaFlyer2");
	CMB_profile->Items->Add(L"Voyager");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::B_saveClick(TObject *Sender)
{
	M_Items->Lines->Assign(CMB_profile->Items);
	E_ItemIndex->Text = IntToStr(CMB_profile->ItemIndex);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::B_loadClick(TObject *Sender)
{
	CMB_profile->Items->Assign(M_Items->Lines);
	CMB_profile->ItemIndex = StrToIntDef(E_ItemIndex->Text, -1);
}
//---------------------------------------------------------------------------
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/b0ceb6b7-3cbe-d4ff-e029-538553e79585.png)

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/912d6285-9e02-8f78-04c0-08881ba499cc.png)

### 備考
項目に空白が入っていても問題ない。

一つのTComboBoxに対して、二つのコンポーネントが余分に必要になる。

TComboBoxの使用しそうにないプロパティを使う方法も考えられるが、それをすると、そのプロパティを使用することになった時に対処が必要になる。
JAXBで文字コード、改行コード指定する方法

Shift_jisでCRLFの例

```java
Marshaller marshaller = JAXBContext
        .newInstance(records.getClass())
        .createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, "Shift_jis");

Writer writer = new StringWriter();
marshaller.marshal(records, writer);
String writeContent = writer.toString().replaceAll("\n", "\r\n");
```
git cherry-pickで助かりました(他ブランチのコミットを反映させる方法)

###前置き
つい最近、コミットするブランチを間違えてしまうというドジっ子な事をやってしまいました。そんな時に助けてくれたのが"git cherry-pick"さんです。

###git cherry-pickとは?
git cherry-pickとは他のブランチの特定コミットを反映できる超絶便利なコマンドです。

```
git cherry-pick　コミットID
```
で他のブランチのコミットを自分が今いるブランチに反映させる事が出来ます。
*インデックスに反映されます。つまりgit addした状態になるということです。コマンドを打った後はcommitしなくてはなりません。

###コミットIDの見方
コミットIDをどう見ればいいのかわからないという方に説明しますと、

ターミナルでgit logを叩いてみます

```
commit 26151f9ee8......
Author: bossunn bossunn <test@test.co.jp>
Date:   Wed Nov 1 17:44:14 2017 +0900

    [change] テストやで〜

    　　　　　　　　　Qiita書くやで〜
```
というlogがズラ～っと流れてくると思います。
一番上に書いてある

```
commit 26151f9ee8......
```
の26151f9ee8......がコミットIDとなります。

git cherry-pickについてわかったところで、次は利用していきましょう。

###git cherry-pickの使い方
今いるブランチ(間違えてコミットしてしまったブランチ)をtest/cherryブランチ、
本来コミットするべきだったブランチをtestブランチとします。


```
$ git checkout test
Switched to branch test
$ git cherry-pick 26151f9ee8......
error: could not apply 26151f9ee8......
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'
```
コンフリクトが起こっています。
とりえあえずコンフリクトを解消しましょう。

コンフリクトを解消してから

ちゃんと、

```
git add ファイル名
```
をしてmodified:にうつしておきましょう。

最後は

```
git commit
```
をしましょう。これにて他ブランチのコミット内容が反映されたと思います。


###参考URL様
https://www.backlog.jp/git-guide/stepup/stepup7_4.html
https://qiita.com/ta__ho/items/8204a22a53b02ee0817e
https://qiita.com/Rock22/items/e53d6135c59099149592
【Git】git checkout -b [ローカルブランチ名] origin/[リモートブランチ名]：リモートブランチをローカルに持ってきてチェックアウト

いい加減覚えて欲しいと思うがすぐ忘れるのでメモ。
タイトル見ただけでほぼ分かるようにしてみたシリーズ。

## リモートブランチをローカルに持ってくる

リモートブランチ `new-branch` をローカルに持ってくる場合

```sh:
$ git branch new-branch origin/new-branch
```

```sh:
$ git branch {ローカルブランチ名} origin/{リモートブランチ名}
```

「git branch」コマンドに第2引数を与えると、それを起点にしたブランチがつくられる。


## リモートブランチをローカルに持ってきてチェックアウト

下記のようにすると、新しいブランチを作成し、さらに作成したブランチにチェックアウトできる。

```sh:
$ git checkout -b new-branch origin/new-branch
```


## 参考

下記、参考にさせていただきました。今日も先人様に感謝。

* [Git で新しいリモートブランチをローカルに持ってくるときに git pull してはいけない理由](http://blog.inouetakuya.info/entry/20120826/1345979787)

以上
CircleCI 2.0でAndroidアプリのversionCodeにビルド番号を付ける

CircleCI 1.0と2.0で環境変数の使い方が異なり、小一時間ハマったのでメモ。

# 参考
https://discuss.circleci.com/t/using-environment-variables-in-config-yml-not-working/14237/6

# やり方
```yaml:.circleci/config.yml
version: 2
jobs:
  build:
    working_directory: ~/code
    docker:
      - image: circleci/android:api-26-alpha
    environment:
      JVM_OPTS: -Xmx3200m
    steps:
      - checkout
      - restore_cache:
          key: jars-{{ checksum "build.gradle" }}-{{ checksum  "app/build.gradle" }}
+     - run:
+         name: Export version code
+         command: echo 'export ORG_GRADLE_PROJECT_VERSION_CODE="$CIRCLE_BUILD_NUM"' >> $BASH_ENV
      - run:
          name: Download Dependencies
          command: ./gradlew androidDependencies
      - save_cache:
          paths:
            - ~/.gradle
          key: jars-{{ checksum "build.gradle" }}-{{ checksum  "app/build.gradle" }}
      - run:
          name: Run Builds
          command: ./gradlew assembleDebug
      - store_artifacts:
          path: ./app/build/outputs/apk/app-debug.apk
          destination: /app-debug.apk
```

```gradle:app/build.gradle
android {
    defaultConfig {
        applicationId "com.example.hoge"
        minSdkVersion 26
        targetSdkVersion 26
-       versionCode 1
+       versionCode VERSION_CODE as int
        versionName "1.0"
    }
}
```

```gradle.properties
+ VERSION_CODE=1
```

# 何をしているか
## .circleci/config.yml
- build.gradleで置き換えるVERSION_CODE(CIRCLE_BUILD_NUM)をBASH_ENVへ出力している
  - 「ORG_GRADLE_PROJECT_」というプレフィックスで始まる変数を定義しておくと、Gradleのビルドスクリプト内から、プロジェクトのプロパティとして参照できるようになる

## app/build.gradle
- VERSION_CODEをCIRCLE_BUILD_NUMに置き換えている

## gradle.properties
- ローカル環境でビルドエラーとならないように、デフォルト値を設定している
How to fix java VisualVM plugin update error

## Symptom
```
Unable to connect to the Java VisualVM Plugins Center because of Server returned HTTP response code: 503 for URL: http://www.oracle.com/splash/java.net/maintenance/index.html 
```

## How to fix

The latest JDK points to the obsolete update URL
Create a new update URL 

```
https://visualvm.github.io/uc/8u131/updates.xml.gz
```

![2017-11-02_111703.jpg](https://qiita-image-store.s3.amazonaws.com/0/114634/785ed7d8-ae46-8062-397e-9de6f65efdde.jpeg)


cf.
**VisualVM failing to find plugins/updates? Solving the 503 error with an updated URL**
http://www.carehart.org/blog/client/index.cfm/2017/7/17/VisualVM_failing_to_find_plugins_updates_solution
C++ Builder > Error >   [ilink32 エラー] Fatal: ファイル '*.OBJ' を開けません

```txt:動作環境
C++ Builder XE4
```

> [ilink32 エラー] Fatal: ファイル '*.OBJ' を開けません

JSON関連の設定読書きソースを追加したときに上記のエラーになる時がある。

以下の対応でエラーは出なくなる。

- カスタム作成したコンポーネントをフォームに追加
- そのコンポーネントを削除

上記により、.hには`#include`が、.cppには`#pragma link`が追加される。
phpMyAdminを用いたMySQLデータベース管理

#phpMyAdminへのログイン

クライアントからブラウザを利用して、phpMyAdminのログイン画面へ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185534/bafc6080-def3-8602-a3ea-c068ab69190c.png)
MySQLへ登録されているユーザ名とパスワードにてログイン

![image.png](https://qiita-image-store.s3.amazonaws.com/0/185534/0223b238-88a9-50d3-7f5f-3d87d5426a64.png)
ログイン成功の場合は上図のような画面が表示される。

#ユーザの追加

rootユーザのみしかMySQLに登録されていないため、
一般ユーザを追加する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/185534/a28c2263-6f89-13c4-c63f-18c2ce6781c7.png)
赤枠のメニューをクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/185534/2ac60415-58b2-7c64-860b-d32f3e4e6a50.png)
ユーザの概略が表示されるので、__ユーザを追加する__をクリック


![スクリーンショット 2017-11-02 9.48.21.png](https://qiita-image-store.s3.amazonaws.com/0/185534/a167db4d-911b-e52e-9c68-e8286242c520.png)
ユーザ名　　　　　　　　：ユーザ名を入力
ホスト　　　　　　　　　：ローカルを選択
パスワード　　　　　　　：パスワードを入力
もう一度入力してください：同じパスワードを再度入力

ユーザ専用データベース
__同名のデータベースを作成してすべての特権を与える__チェックを入れる
__ワイルドカード（ユーザ名_%）に該当するデータベースにすべての特権を与える__チェックを入れる

設定終了したら__実行__ボタンを押す。

###ログイン確認
正常にユーザを追加できたか確認するために、新規作成したユーザでログインする。

#テーブルの追加
cakephpを利用するためにテーブル名は意味のある単語を入力する
![スクリーンショット 2017-11-02 11.36.07.png](https://qiita-image-store.s3.amazonaws.com/0/185534/0e5a634e-19e8-a51d-bf53-1ae7ab2047c6.png)
例：名前__posts__
  ：カラム数　5
![スクリーンショット 2017-11-02 11.44.15.png](https://qiita-image-store.s3.amazonaws.com/0/185534/27848a28-faf4-8c76-ff5f-24a38c4f0aba.png)
上図のようにテーブルの詳細を設定して実行する。

以上でテーブルの作成は終了。

次回はcakephpでPHPのフレームワークを使ったプログラミングを行います。
Swift3 TableViewをスワイプしたらイメージボタンを表示させる

#スワイプの時にイメージボタンを表示
Assetsに「delete」という名前で保存されている

![スクリーンショット 2017-11-14 18.33.34.png](https://qiita-image-store.s3.amazonaws.com/0/108475/dca9a196-703e-6113-49f9-fa4530ee6ec0.png)

```swift:swift3

 func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]?
{
        let deleteAction = UITableViewRowAction(style: .normal, title: stockWidth) { (rowAction:UITableViewRowAction, indexPath:IndexPath) -> Void in
           print("削除イメージボタンクリック") 

        }
        //イメージボタン追加
        deleteAction.backgroundColor = UIColor(patternImage: UIImage(named: "delete")!)
            
        //複数のボタンを追加したい場合アクションを追加して下の配列に追加すればOK
        return [deleteAction]
}
```
Vagrantの起動が失敗した時の対処法 (NS_ERROR_FAILURE (0x80004005))

# エラー内容

```
$ vagrant up                                                                                                                                                                                                                                                                        
Bringing machine 'default' up with 'virtualbox' provider...
...

Stderr: VBoxManage: error: Nonexistent host networking interface, name 'vboxnet0' (VERR_INTERNAL_ERROR)
VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component ConsoleWrap, interface IConsole
```

# 対処法

VirtualBoxと拡張パックを最新版にアップデートしたら治りました。
【随時更新】説明に英語が必要になってしまった時のTips

# 概要

日本語に不慣れな外国人の方が同じプロジェクトで仕事をする際、英語でプロジェクト、プログラミングについて話すのに必要だった表現をまとめていきます。随時更新していきます。
自分で調べて使っているだけなので、この表現が不自然などありましたら指摘して頂けると助かります。

# 表現
## プロジェクト 
|日本語|英語|
|:---:|:---:|
|柔軟な対応が必要です。|Flexible response in the project is necessary.|
ルールはあくまで基本です。|The rules are fundamental to the last.
このタスクお願いします。|Please take care of this task.


## プログラミング
|日本語|英語|
|:---:|:---:|
そのコードはおかしいです。|That program code is strange.
このデータベースにアクセスしたいなら上司の許可が必要です。|If you want to access this database you need permission from your manager.
Swift3 Alert表示の二つ方法

#Alertメッセージ表示（画面の中央に表示される）
![alert.png](https://qiita-image-store.s3.amazonaws.com/0/108475/7dcbe32f-1bc4-2542-ce32-37be31681a52.png)

```swift:swift3
let alertController = UIAlertController(title: "選択してコメントを削除しますか？",message: "一度削除すると元に戻せません。", preferredStyle: UIAlertControllerStyle.alert)
                
//UIAlertActionStye.destructive指定でフォントを赤色に変更できす
let okAction = UIAlertAction(title: "削除する", style: UIAlertActionStyle.destructive){ (action: UIAlertAction) in
     print("コメント削除")
}
                
let cancelButton = UIAlertAction(title: "キャンセル", style: UIAlertActionStyle.cancel, handler: nil)
                
alertController.addAction(okAction)
alertController.addAction(cancelButton)
                
self.present(alertController,animated: true,completion: nil)
```

#ActionSheet表示（画面の下に表示される）
![ActionSheet.png](https://qiita-image-store.s3.amazonaws.com/0/108475/f14b3e34-f80d-359a-db4e-bf37d650992a.png)

```swift:swift3
//タイトルとメッセージを表示したくない場合「nil」指定
let alert: UIAlertController = UIAlertController(title: nil, message: nil, preferredStyle:  UIAlertControllerStyle.actionSheet)

let informantAction: UIAlertAction = UIAlertAction(title: "コメントを通報する", style: UIAlertActionStyle.destructive, handler:{
                    (action: UIAlertAction!) -> Void in

     print("コメントを通報する")
})
                
let cancelAction: UIAlertAction = UIAlertAction(title: "キャンセル", style: UIAlertActionStyle.cancel, handler:{
                    (action: UIAlertAction!) -> Void in
     print("キャンセル")
})
                
alert.addAction(cancelAction)
alert.addAction(informantAction)
                
self.present(alert, animated: true, completion: nil)
```
pythonで、冪集合 powersetのiteratorを作る

# べき集合(powerset)とは

リストaがあったとする。

```py3
a = [1, 2, 3,]
```

これを集合と見たてたとき、その全ての部分集合は

```
() (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)
```

である。

$2^a$ = {aの全ての部分集合（上のやつら）}

を aの **冪集合(powerset)**　という。


# べき集合のiteratorの実装

```py3
from itertools import chain,combinations
def powerset(iterable):
    "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
    s = list(iterable)
    return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
```

iterableに上のlist aなどをいれて使う。

# 注意

べき集合は　**全ての組合せ、全ての順列とは違う** 。
曖昧であれば、それぞれの定義と具体例を再確認されたい。

ちなみに、組合せと順列のiteratorは`itertools`に備わっている。


参考

[python official itertools recipes](https://docs.python.org/3/library/itertools.html#recipes)
Apache 2.4にmod_sslを設定する

# はじめに
昨今ウェブサイトのHTTPS化が必須になってきたので、Apacheサーバにmod_sslをインストールする手順をまとめました。

以下の方針で設定しています。

- TLSv1.1以上を強制
- 割と強い暗号スイートのみを使用

#### 更新履歴
2018.6.19 セキュリティ基準を強化

#### 前回までの記事はこちら
Apacheのインストール手順などは以下の関連記事をお読みください。

* [GCPに共通鍵を追加する手順まとめ](https://qiita.com/ariaki/items/e225b815924d37bc19d5)
* [GCP Compute Engineを使ってLinuxサーバを始める](https://qiita.com/ariaki/items/1d4dbfeb41a4080a3f66)
* [Cent OS 7開発用サーバを初期設定する](https://qiita.com/ariaki/items/d84a651427f418c5103e)
* [Cent OS 7上でApache/PHP開発環境を構築する](https://qiita.com/ariaki/items/2ec627a7567437f893ee)
* [Cent OS 7上でApache/Tomcat開発環境を構築する](https://qiita.com/ariaki/items/6fafac7d89ea14b12203)

# インストール手順

## 作業方針
前回までと同様にyumを使ってインストールします。

## mod_sslインストール
以下のコマンドでApache向けmod_sslモジュールをインストールします。

```
yum -y install mod_ssl
```

## mod_ssl設定
SSL設定は以下のように行います。
強度が弱すぎるプロトコルや暗号方式のみブロックしています。

```/etc/httpd/conf.d/ssl.conf 
Listen 443 https
Mutex default ssl-cache
SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:!DSS
SSLCompression off
SSLCryptoDevice builtin
SSLHonorCipherOrder on
SSLPassPhraseDialog exec:/usr/libexec/httpd-ssl-pass-dialog
SSLProtocol -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 +TLSv1.2
SSLRandomSeed startup file:/dev/urandom  256
SSLRandomSeed connect builtin
SSLSessionCache shmcb:/run/httpd/sslcache(512000)
SSLSessionCacheTimeout  300
SSLStaplingResponderTimeout 5
SSLStaplingReturnResponderErrors off
SSLStaplingCache shmcb:/var/run/ocsp(128000)
SSLStrictSNIVHostCheck off
SSLUseStapling on

<VirtualHost *:443>
    ServerName ドメイン名
    ServerAdmin 管理者のメールアドレス
    DocumentRoot ドキュメントルートパス
    ErrorLog logs/ssl_error_log
    TransferLog logs/ssl_access_log
    LogLevel warn
    SSLEngine on
    SSLCertificateKeyFile 秘密鍵ファイル(KEY)のパス
    SSLCertificateFile サーバ証明書ファイル(CRT)のパス
    SSLCertificateChainFile 中間証明書ファイルのパス（※中間証明書が不要な場合は行削除）
    BrowserMatch "MSIE [2-5]" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
    CustomLog logs/ssl_request_log "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>
```

## HTTP→HTTPS転送設定
以下の設定で、mod_rewriteモジュールを使って全てのHTTPアクセスをHTTPSに転送します。
（※httpdパッケージに同梱されており、yumで追加インストールは必要ありません）
必要に応じて設定してください。

```/etc/httpd/conf.d/rewrite.conf
<IfModule rewrite_module>
    RewriteEngine On
    LogLevel alert rewrite:trace3
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</IfModule>
```
Pythonで、テキストファイルの各行をlistまたはiteratorにする方法

テキストファイル

```
foo
bar
baz
qux
quux
```

コード

```py3
# path_text: text の　path
with open(path_text) as f:
    lines = f.read().splitlines()
```

結果

```py3
print(lines)

['foo', 'bar', 'baz', ...]
```

もっと良い書き方ありましたら教えてください。
Backlog => Webhook => Laravel => Slack連携

# これは
- BacklogとSlackを連携するフックスクリプトです。
- Backlogで課題を追加/更新すると、Webhookを使ってLaravelで受けて、Slackへメッセージを送ります。
- Backlogで課題を追加したときと、更新した時では取得できる情報に差異があるようなので、BacklogのAPI Keyをつかって課題情報を参照するようにしてます。
  - dueDateやassigneeが取れなかったはず

# ソース
- https://github.com/yuki777/backlog-slack
文字変換プラグイン

#簡単に文字変換

https://github.com/niwaringo/moji

ここにあるプラグインをダウンロードする。

後はjqueryファイルを読み込み

簡単な使用方法

```js:henkan.js

jQuery(function ($) {
            /** [全角英数字] => [半角英数字]**/
            var result = moji('ｔｅｓｔ１２３').convert("ZEtoHE").toString() || '';
            //result => test123
});

```

この記述でinputのtype=textに入力された内容の全角英数は半角英数に変換される。
例：ｔｅｓｔ１２３ => test123　
    ｔｅｓと１23 => tesと123 //半角英数字のみ変換対象となり、その他の文字はなにもおこらない

converの変換内容
"ZEtoHE": 全角英数 => 半角英数
"ZStoHS": 全角スペース => 半角スペース
"HStoZS": 半角スペース => 全角スペースに
"HEtoZE": 半角英数 => 全角英数
"HGtoKK": ひらがな => カタカナ
"KKtoHG": カタカナ => ひらがな
"ZKtoHK": 全角カナ => 半角カナ
"HKtoZK": 半角カナ => 全角カナ

少し応用した例

```js:henkan.js
//半角カタカナを全角カタカナに
//全角英数字を半角英数字に
jQuery(function ($) {
            /** 半角カタカナのみを全角カタカナに変換**/
            var kana = moji('ﾃｽﾄてすとｔｅｓｔ').convert("HKtoZK").toString() || '';
            //kana => テストてすとｔｅｓｔ
            /** 全角英数字のみ半角英数字に変換**/
            var result = moji(kana).convert("ZEtoHE").toString() || '';
            //result => テストてすとtest
        }
});
//メソッドチェーンで繋いで、変換する
jQuery(function ($) {
            /** [半角カナ] => [全角カナ] => [ひらがな] **/
            moji("ｱｲｳｴｵ").convert("HKtoZK").convert("KKtoHG").toString();
            // => あいうえお
        }
});

```
スパコンなどの使い方とか、ジョブスケジューラの使い方とか、資料など

# 概要

スパコンや、ジョブスケジューラの使い方などについて、学習できるところなどをあげる。

いまのところ、紹介しているものは、生命科学系のデータ解析の人向けのものが多い。

# 基本的な用語集

## スパコン関連の資料

## 動画

* [DDBJ 講習会 アーカイブ](http://www.ddbj.nig.ac.jp/ddbjing/dl.html)
* [生命科学系DB・ツール使い倒し系チャンネル](http://togotv.dbcls.jp/ja/index.html)

### それぞれYouTube チャンネルもある

内容は同じようだが、YouTube チャンネルとしてもあるので、登録しておくのもよいかもしれない。

* [DDBJvideo](https://www.youtube.com/channel/UC8BhjrBAmwGdL11GuKogm-w)
* [togotv](https://www.youtube.com/channel/UCyftgRDCOa09RYl63QBFPdg)

## PDF

遺伝研スパコンのシステム紹介や、使い方の資料

* [基本的利用方法](https://sc.ddbj.nig.ac.jp/index.php/ja-howtouse)


## 参考情報

### スパコン

* [遺伝研スパコン - Heavy Watal](https://heavywatal.github.io/bio/nig.html)

### ジョブスケジューラ

#### SGE と slurm のコマンドの互換表

* [SGE to SLURM conversion | Stanford Research Computing Center](https://srcc.stanford.edu/sge-slurm-conversion)

#### UGE(SGE関連)

追記:2019-10-24

遺伝研スパコンの資料であるが、以下のようなレベルの質問もかかれているので、初学者に役立つことが多い。

```
qsubで投入したジョブはログアウトすると止まってしまうのでしょうか
```

* [(旧システム)ジョブ管理システム(UGE)関連](https://sc.ddbj.nig.ac.jp/ja/guide/faq/uge)
畳み込みニューラルネットワーク(CNN)の訓練データを作成するツールを作ってみた - ③データリストの作成

# はじめに

- [前回](https://qiita.com/neriai/items/98e4f6b70c87e51014c6)と[前々回](https://qiita.com/neriai/items/5e9ee66e7bd676057ed3)に続いて、今回は訓練データとテストデータのファイルリストを作成を行います。
- このファイルリストを元に実際は学習プログラムを実行していく想定で作成しました。

# プログラム

```py:filelist.py
#!/usr/local/bin/python3
#!-*- coding: utf-8 -*-

import os
import random
import numpy as np

def createFilelist():

    labels = {"gyoza":0, "pizza":1, "sushi":2}

    dir_path = os.path.dirname(os.path.abspath(__file__))

    for label_name, label_key in labels.items():

        files = os.listdir(label_name)
        random.shuffle(files)
        files = np.array(files)

        train, test = np.split(files, [int(files.size * 0.7)])

        print(
            'ラベル名: ' + label_name,
            '訓練データ数: ' + str(len(train)),
            'テストデータ数: ' + str(len(test)),
        )

        for file in train:

            name, ext = os.path.splitext(file)

            if ext != '.jpg':
                print('[' + file + ']: 不正なファイルが含まれています。')

            with open('train.txt', 'a') as f:
                text = '{0}/{1}/{2}\t{3}\n'.format(dir_path, label_name, file, labels[label_name])
                f.write(text)

        for file in test:

            name, ext = os.path.splitext(file)

            if ext != '.jpg':
                print('[' + file + ']: 不正なファイルが含まれています。')

            with open('test.txt', 'a') as f:
                text = '{0}/{1}/{2}\t{3}\n'.format(dir_path, label_name, file, labels[label_name])
                f.write(text)

def main():

    createFilelist()

if __name__ == '__main__':

    main()
```

# 実行結果

```
{プロジェクト絶対パス}/gyoza/2827573.jpg	0
{プロジェクト絶対パス}/gyoza/2628927.jpg	0
```
JPEGのExif情報の削除～ExifInterface～

Exifを削除・修正するのにExifInterfaceは使わない方が良い。


ExifInterface.saveAttributes()だけ使った上書き方法だと、モデル名やメーカー名どころかGPS情報すら残っていた事を確認しました。
ExifInterface.saveAttributes()は書込んで無い情報を消すのではなく、対応していない属性の値を消す(ように見える)らしく、自分の認識が間違っていました。

ExifInterface.setAttribute()で削除に必要なTAGを設定してExifInterface.saveAttributes()すればよいのですが、
下手にTAGを設定すると対応していない属性を破壊しかねなので素直に他のライブラリ(sanselan)を使うか処理を自作して下さい(Exifには設定してはいけなかったり、値が存在しないとダメなTAGって言うのがいくつかあるからです)


間違ったエントリーをしてすいませんでした(戒めの為にしばらく残しておきます)



------

結構簡単に出来た。
但し細かい所で色々と困る所があるので調整する。

OS: Windows7 professional
IDE: Android Studio 3.0
Java: JDK 1.8


```
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        try {
            /*
                1. AndroidManifest.xml に以下のパーミッションを登録する事
                    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
                    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
                2. アプリの権限からストレージへのアクセスを許可する事
            */
            String path = Environment.getExternalStorageDirectory().getPath();

            ExifInterface exif = new ExifInterface(path+"/photo008.jpg");
            
            /* Exifの削除 */
            exif.saveAttributes();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

```


正確に言うと saveAttributes() はExif情報を消すメソッドではなくsetAttribute()で設定した値を反映させるためのメソッドです。
~~その際に古いExif情報は全部消すという仕様らしい。~~
~~なので何も設定せずに saveAttributes() だけするとExif情報だけが消えると言う仕組みだ。~~



~~ただExif情報が全部消えると言うわけでなく、メーカー名やモデル名は残っていた。~~
~~またExif領域も残ったままになっている。~~


~~メーカー名やモデル名が残っていても問題は無いと思うが、その辺もまとめて消したいならこう書けばOK~~

```java
    try {
        String path = Environment.getExternalStorageDirectory().getPath();

        ExifInterface exif = new ExifInterface(path+"/photo008.jpg");

        
        /* Exifの削除 */
        exif.setAttribute(ExifInterface.TAG_MAKE, "");
        exif.setAttribute(ExifInterface.TAG_MODEL, "");
        exif.saveAttributes();

    } catch (IOException e) {
        e.printStackTrace();
    }
```


~~簡単なアプリくらいなら、この程度の実装でも問題ないかな…(他にいい方法あったら教えてください)~~
ファイルをgitの管理対象から外す

```bash
git rm hoge.js
```

ファイルがもう存在しない場合はこれでOK。
ファイルがまだ存在し、ファイルを残したまま管理対象から外す場合は

```bash
git rm hoge.js --cached
```

ファイルがまだ存在し、ファイルも一緒に削除する場合は

```bash
git rm hoge.js -f
```
Xcode 9 & iOS 11 からできるワイヤレスデバッグの手順

# 前提
```
- Xcode 9
- iOS 11
- 同一LAN内
- macOS Sierra 10.12.4 以降
```

# 設定

1. 従来通りUSBでiPhoneをMacに接続する

2. Xcode の メニューから`Window > Devices and Simulators` を選択
<img width="302" alt="スクリーンショット 2017-11-02 8.49.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/38822/bf30c1dc-1e1a-dc8b-4460-254b08dd1cca.png">

3. デバイス一覧からデバイスを選択して `Connect via network` を選択
<img width="305" alt="スクリーンショット 2017-11-02 8.54.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/38822/78aea049-1161-2c10-4d5d-206c41b177e4.png">
選択後は、iPhoneを取り外してしまって問題無い

4. ビルドターゲットにネットワークアイコンが表示されていれば、設定完了
<img width="276" alt="スクリーンショット 2017-11-02 9.04.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/38822/9e8eb139-bb2b-02c2-31e9-5bde817bf2af.png">
後はいつも通りに開発ができます！

# 参考
https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/WhatsNewXcode/xcode_9/xcode_9.html#//apple_ref/doc/uid/TP40004626-CH8-SW6
https://developer.apple.com/videos/play/wwdc2017/404/
多対多リレーションシップを実装したcrud-d-scaffoldパッケージを、Cloud9で試してみる

Laravel 5.5で、CRUDアプリが簡単に作れるScaffoldパッケージに、多対多リレーションを実装しました。

ということで、Cloud9で簡単に試す方法をまとめておきます。

##（１）Cloud9のアカウントを作成する

■Cloud9
https://c9.io/

Githubのアカウントを持っている人は、それで入れるのでらくちん。

##（２）ワークスペースの作成
Create New Workspace から、templateはBlankでOK

##（３）もろもろインストール
PHP7.1とか、それに付随するものとか、Laravelもざっくりインストールしてしまいます。
説明のメインではないので、さっくりと。

//php その他もろもろインストール
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
sudo apt-get install libapache2-mod-php7.1
sudo a2dismod php5
sudo a2enmod php7.1
sudo apt-get install php7.1-dom php7.1-mbstring php7.1-zip php7.1-mysql php7.1-sqlite
sudo apt-get install php7.1-curl

//Laravel インストール
sudo composer self-update
sudo composer create-project --prefer-dist laravel/laravel ./laravel
shopt -s dotglob
sudo chown ubuntu:ubuntu * -hR
mv laravel/* ./
rm -rf laravel

##（４）Laravel公開フォルダ設定

sudo vim /etc/apache2/sites-enabled/001-cloud9.conf

開いた画面で以下、修正

DocumentRoot /home/ubuntu/workspace
↓
DocumentRoot /home/ubuntu/workspace/public

閉じるときは、
Esc キーおしてから、
:wq!

sudo composer update

##（５）.envの修正（DBをsqliteに変更）

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret
↓
DB_CONNECTION=sqlite
\#DB_HOST=127.0.0.1
\#DB_PORT=3306
\#DB_DATABASE=homestead
\#DB_USERNAME=homestead
\#DB_PASSWORD=secret`

touch ./database/database.sqlite

##（６）いよいよ本題、crud-d-scaffoldパッケージをインストールします。

composer require dog-ears/crud-d-scaffold

終了。

php artisanすると、
- 'crud-d-scaffold:setup' : Setup crud-d-scaffold with bootstrap 3
が、見えるはず。

##（７）で、アプリ生成実行！

（必要なら、ここでgitを設定しておいてもよいかも）

//必要アセットファイルのコピー
php artisan vendor:publish --tag=public --force

//サンプル設定データのコピー
cp ./vendor/dog-ears/crud-d-scaffold/crud-d-scaffold.json.sample ./crud-d-scaffold.json

//アプリ生成実行
php artisan crud-d-scaffold:setup -f

//最後に、マイグレーションとシーディングを行います。

php artisan migrate
php artisan db:seed

これで、できあがり。
プレビューすると、実際にアプリケーションを触れると思います。

##サンプルのモデル構成

サンプルのモデルは、４つ
・nicePost
・beautifulTag
・brilliantCategory
・goodComment

命名ルールのデバッグ上、へんなモデル名ですが、気にしない。

多対多リレーション
・nicePost - beautifulTag
nicePost - brilliantCategory

１対多リレーション
nicePost - goodComment

となっています。

なにかわからないこととか、つっこみどころとかあれば、
気軽につっこんでくださいませ。

以上。
畳み込みニューラルネットワーク(CNN)の訓練データを作成するツールを作ってみた - ①画像リサイズ

# はじめに

- 学習には大量の訓練データが必要になります。
- 目安として分類の場合、1ラベル訓練データ:10,000枚。テストデータ:3,000枚くらいと耳にしたりします。
- 畳み込みを行う際は、よく画像が正方形になってます。しかしながら、この正方形画像を用意するのは大変です。
- 今回は無理やり隙間を埋めて正方形画像にリサイズすることにしました。
- ただ、この隙間が学習結果にどのように影響を及ぼすのかはまだ検証中のため、保証できません。

# プログラム

```py:resize.py
#!/usr/local/bin/python3
#!-*- coding: utf-8 -*-

import argparse
import os
import cv2
import numpy as np

def resizeImages(input_dir, output_dir):

    files = os.listdir(input_dir)

    for file in files:

        name, ext = os.path.splitext(file)

        if ext != '.jpg':
            print('[' + file + ']: 不正なファイルが含まれています。')

        img = cv2.imread(
            os.path.join(input_dir, file),
            cv2.IMREAD_COLOR
        )

        tmp = img[:, :]
        height, width = img.shape[:2]

        if (height > width):
            size = height
            limit = width
        else:
            size = width
            limit = height

        start = int((size - limit) / 2)
        fin = int((size + limit) / 2)

        resized_img = cv2.resize(np.zeros((1, 1, 3), np.uint8), (size, size))

        if (size == height):
            resized_img[:, start:fin] = tmp
        else:
            resized_img[start:fin, :] = tmp

        cv2.imwrite(
            os.path.join(output_dir, file),
            resized_img
        )

def main():

    parser = argparse.ArgumentParser()
    parser.add_argument('--input_dir', default='original')
    parser.add_argument('--output_dir', default='resized')
    args = parser.parse_args()

    resizeImages(args.input_dir, args.output_dir)

if __name__ == '__main__':

    main()
```

## 実行結果

![1640.jpg](https://qiita-image-store.s3.amazonaws.com/0/90598/9352d828-51f9-233c-3193-887d81e13811.jpeg)
WRF > mpirun -npの設定と処理時間 > np:10が速い

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.9を使用。
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
```

WRF(Weather Research and Forecasting Model)関連。

16コアの環境にてwrf.exeを実行した時の処理時間メモ。
処理対象は27日分のデータ。

- np:8
    - 4h34m
- np:10
    - 3h58m, 4h00m
- np:12 
    - 4h 4m
- np:16 
    - 4h 7m
- np:20
    - 4h43m

npをコア数に合わせても12の場合と比べて処理が速くはならない。

###