OmniAICreator/Qiita-1.07M huggingface dataset:
netcat や nmap を使わずに bash だけでポートの開放をみたい場合のハック (横着)

Docker コンテナなどでミニマルなイメージを作っていると、 `netcat` や `nmap` はおろか、 `vim` も `dig` も `curl` すらもないイメージを作ってしまうことがよくあります。通常の運用では困ることはほとんどありませんが、たまにネットワークの状況などを観察したい場合に `docker exec` で実行中のコンテナに入って「このコンテナの中からあのホストのあのポートって叩けるのかな？」などと手軽に調べたいことがあります。

そういう場合に、 `apt-get`, `yum`, `dnf` などを叩いてインストールしようとすると、リポジトリの取得から入る必要があって大変長く待たされたりします。場合によっては完全に閉じたネットワークで実行していて、外の世界のリポジトリを参照できないこともあります。

あくまで「さっとポートが空いてるか調べたい」だけなのです。こういうときに何か簡便な方法で (とにかく横着した方法で) ポートの開閉をチェックできないでしょうか？

# そういうときに使えるハック

bash の net-redirection を利用すると、ポートの開閉くらいはかんたんにわかります。

詳しくは [bash で TCP 通信](https://qiita.com/k_ui/items/a01fdcfa8ac6729e7870) を御覧ください。
例として 8.8.8.8 の 53 番ポート (Google の Public DNS サービス) を叩いてみましょう。

# open

```console
$ exec 7<> /dev/tcp/8.8.8.8/53
```

特にエラーなく成功します。

# filtered

存在していない 54 番ポートを叩いてみましょう。

```console
$ exec 7<> /dev/tcp/8.8.8.8/54
(しばらく待たされる)
-bash: connect: Operation timed out
-bash: /dev/tcp/8.8.8.8/54: Operation timed out
```

# closed

とくにわかりやすい例がなかったので、ローカルの 127.0.0.1 10000 に closed なポートが有る前提で書きます。

```console
$ exec 7<> /dev/tcp/127.0.0.1/10000
-bash: connect: Connection refused
-bash: /dev/tcp/127.0.0.1/10000: Connection refused
```

# 簡易コマンドを作る

このような性質を利用して、簡易的なポート開閉チェックコマンドをつくってしまいましょう。
結果は終了ステータスで判別することにします。

```console
$ check_tcp_port() (bash -c 'trap "exit 2" SIGTERM; (exec 7<> /dev/tcp/'"$1"'/'"$2"' & (sleep 1 && kill 0) & wait %1)' &> /dev/null)
```

## 使い方

```console
$ check_tcp_port 8.8.8.8 53 ; echo $?
0
$ check_tcp_port 8.8.8.8 54 ; echo $?
2
$ check_tcp_port 127.0.0.1 10000 ; echo $?
1
```

open なときだけ 0 を返します。
filtered なときは 2, closed なときは 1 を返します。
(しかし厳密ではありませんが、ここまで横着しているわりにはちゃんととれます)

## 解説

### `sleep 1 && kill 0`

kill 0 は現在のプロセスグループすべてに SIGTERM を送ります。
一定時間でのタイムアウトを実現します。

### `trap "exit 2" SIGTERM`

タイムアウトで SIGTERM が発行された場合に終了ステータスを 2 にしたいので `trap` します。

### `&> /dev/null`

余計な出力は忘れてしまいましょう。 標準出力と標準エラー出力を消します。

# まとめ

横着しつつも、これでちょっとは戦えます。
ネットワークの疎通はみたいけど、新たなパッケージの追加をしたいというほどでもない場合には使ってみてはいかがでしょうか。
オブジェクトの比較に JSON.stringify() を使ってはいけない —— プロパティには順序が無い

## たまたま動いているコード

オブジェクト同士の比較に [`JSON.stringify()`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify) を使う例がそこかしこで見られます。
典型的には、

```javascript
JSON.stringify(objA) === JSON.stringify(objB)
```

のようなコードです。
オブジェクトの中身を再帰的にたどって比較する、いわゆる「深い比較」で「deep equality」を判定したい場合に使われる事が多いようですが、これはとても危うく、いつ壊れてもおかしくないコードです。


## 理由

まず、JSON化する際にそのまま含まれないプロパティ（enumerableでなかったり、値が関数であったりするものなど）がありますが、これは考慮の上でのことが多いでしょう
問題は、配列でないJavaScriptのオブジェクトには順序が無く、JSONにされる際にもプロパティの順序がどうなるか決まっていないことです。
MDNには、

> 配列でないオブジェクトのプロパティは、特定の順序で文字列化されることを保証されてはいません。文字列化において同じオブジェクトのプロパティの順序付けを信用しないでください。
> 
> ```javascript
> JSON.stringify({ x: 5, y: 6 });
> // '{"x":5,"y":6}' または '{"y":6,"x":5}'
> ```

とあります。
これは、同じ値の同名のプロパティしか持たないオブジェクトであっても、異なった文字列に変換され得る、ということです。
生成されたJSON同士を文字列として比較して、オブジェクトの比較に代えることは出来ないことになります。


## 実際の例

例えば、

```javascript
let objA = {}
objA.x = 0
objA.y = 0

let objB = {}
objB.y = 0
objB.x = 0

console.log( JSON.stringify(objA) === JSON.stringify(objB) )
```

を考えます。
`objA` と `objB` はJSON化の対象となるプロパティ、`x` と `y` を持っています。
それぞれ値も同じですので、これは比較結果として、`true`（等しい）を期待しています。
しかし、Node.js v6.11.4での結果は `false`（等しくない）です。
生成されたJSONは、

```javascript
// objA
'{"x":0,"y":0}'

// objB
'{"y":0,"x":0}'
```

となっています。
この動作は以下のように説明できると思います。

* `objA` と `objB` ではプロパティを追加した順序が違う
* 現在のNode.jsでは `for..in` などでのプロパティの列挙が、プロパティを追加した順序で行なわれる
* 現在のNode.jsでは `JSON.stringify()` でJSON化すると、プロパティが列挙される順序で出現する

しかし、これはあくまでも、**たまたま**このバージョンのNode.jsではこのようになっていた、という話でしかないことに注意して下さい。

> プロパティを追加する順序に依存するなら、同じ順序で追加するように気を付ければよい

と考えては危険です。
将来は動作が変わるかも知れません（プロパティを追加する順序に依存するコードを将来に渡ってメンテするというのもちょっと面倒ですね）。


## 代案

では深い比較をしたい時はどうすればよいかというと、残念ながら**簡単な方法はありません**。
利用できるものとして、

* [Lodashの `_.isEqual()`](https://lodash.com/docs#isEqual)
* [Node.jsの `assert.deepEqual()`](https://nodejs.org/api/assert.html#assert_assert_deepequal_actual_expected_message)
* [deep-equal](https://github.com/substack/node-deep-equal)

などがありますので参考にしてください。
オブジェクト同士の比較方法に決まりはありませんので、同じ `deep equal` を名乗っていても仕様は少し異なることがあります。
JSON化に際し、プロパティの順序を常に一定にするというアプローチもあります。

* [json-stable-stringify](https://github.com/substack/json-stable-stringify)

実際の所、本当に深い比較が必要なことは少ないので、そこを見直してみるのもよいでしょう。


## この記事のライセンス
[![クリエイティブ・コモンズ・ライセンス](https://i.creativecommons.org/l/by/4.0/88x31.png)](http://creativecommons.org/licenses/by/4.0/deed.ja)
この記事は[CC BY 4.0（クリエイティブ・コモンズ 表示 4.0 国際 ライセンス）](http://creativecommons.org/licenses/by/4.0/deed.ja)の元で公開します。
Redash利用事例とメリット

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

最近、業務でRedashを導入しました。
まだ、使い始めたばかりで小規模ですが、そのあたりのRedashの利用事例として、メリットを書きます。

# Redash利用用途

ログ/データのアドホックな調査や可視化の環境に使用しています。
対象ログ/データは以下がメインです。

* サービスログ 
  * 例:) 広告系(クリック,コンバージョン), KPIログ... 
* システムログ 
  * 例:) アクセスログ, パフォーマンスログ, セキュリティログ... 
* サービスデータ 
  * 例:) マスタデータ, 中間データ, アカウントデータ... 
* システムデータ
  * 例:) サービスディスカバリデータ, 監視/モニタリングデータ...


# Redashの規模感

* 実行クエリ数 約200/日
* 登録データソース 56
* 登録クエリ数 62
* ダッシュボード数 8


# Redashのメリット

3つほど記載します。

* 画面開発工数の削減
* データ活用性向上
* 超シンプル

## 画面開発工数の削減

Redashは、クエリを保存し共有、クエリからチャートを作成しダッシュボード化することができます。
非エンジニアが、アドホックな調査目的で使用する画面を簡単に用意する事ができ、画面開発のエンジニア工数の削減が出来きました。

// 任意のパラメータを与えて登録クエリを実行し、ログ/データの抽出
![名称未設定.png](https://qiita-image-store.s3.amazonaws.com/0/27974/50cd24e2-4265-4e06-d3f8-36b2818e8474.png)

// ダッシュボードを作成し、可視化
![名称未設定1.png](https://qiita-image-store.s3.amazonaws.com/0/27974/0d7fbc3d-60b2-e890-5686-df164f554243.png)

## データ活用性向上

Redashは、豊富なデータソースへ対応してるので、データへの一元的なアクセスが可能です。
エンジニアが、アドホックな調査目的で、インスタンスにログイン(SSH等)したり、管理画面(AWSのマネコン等)にログインしたりする手間がなくなりました。
現在、以下へRedashからクエリを投げられるようにしています。

* AWS Athena
* AWS RDS for Aurora
* AWS RDS for Mysql
* AWS RDS for PostgreSQL
* AWS DynamoDB
* AWS ElasticSearchService
* AWS EMR Hive
* AWS EMR Presto
* Hadoop CDH Hive
* Hadoop CDH Impala
* Google spreadsheet

<img width="1034" alt="スクリーンショット 2017-12-05 14.04.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/27974/57a397ea-d329-54da-a637-c9d158faca36.png">


また、[Redash Advent Calendar 2017](https://qiita.com/advent-calendar/2017/redash) 1日目の[Redash v3.0.0で追加されるQuery Resultsデータソースについて](http://ariarijp.hatenablog.com/entry/redash-advent-calendar-day-1)の方法で、異なるデータストア間のクエリをJoinする事が可能です。
簡単なユースケースにはとても便利で、全てのデータのJoinを期待でき、データ活用性が向上できました。

ただし、これらはRedashのインメモリで行われ、HadoopやMPPエンジンのような分散アーキテクチャを持っていません。データセットが大きい場合は、スケールしないので、RedashのハブとしてPresto等を検討したほうが良いかもしれません。


## 超シンプル

Redashは、画面自体が超シンプルです。Redashは、Tableauとかと異なり、エンジニア向けのツールだと思っています。

エンジニアだと、Redashのマニュアルを読まなくても、そのままRedashを活用する事が出来ました。
企業内だと、何か新しい技術を導入するよりも、それを広めたり、文化を作ったりする方が大変です(ケースによると思いますが)。
Redash利用にあたって、学習コストがとても低く、超シンプルなので、この辺りの活動工数を大きく抑える事ができました。


# おわりに

社内勉強会ですが、話しました。
そのときのスライドです。

https://www.slideshare.net/tkmoteki/redash-aws-athena-embulk
Pull Requestに対して何かしてみませんか？

この記事は「[IDOM Engineer Advent Calendar 2017](https://qiita.com/advent-calendar/2017/idom-engineer)」の9日目の記事です。

# はじめに
現在私は大学院にいるのですが，大学院でのチーム開発ではGitHubを利用して開発をしています．
そこで，GitHubのPull Requestで私が工夫として導入してみたものを紹介したいと思います．

# コードレビューを自動で行う
コードレビューは大事なのですが，やっぱり開発が忙しかったりとすぐにはコードレビューできない場合あったりしますよね．．．
あと，ちょっとしたレビューの見落としなど．．．

そこで，今回は[SonarQube](https://www.sonarqube.org/)というソースコードの品質チェックを行ってくれるものを利用しました．

使い方としては，Travis-CIでビルドおよびテストを行った後に，SonarQubeを利用して，GitHubのPull Requestに対して，ソースコードの品質をチェックした結果を返しています．

このソースコードの品質チェックとして，対応しているプログラミング言語は，以下の言語などがあるようです．

- C/C++
- JavaScript
- Python
- Java
- PHP
- Swift
- etc...

実際にJavaのプロジェクトで使った様子は以下の図のようになっています．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/116983/a78082fa-65f3-3dfb-6615-a0b130466eff.png)

こんな感じに
「変数名がスネークケースで書かれてるぞ！！！！キャメルケースで書けよ！！！オルァ！！！」
と教えてくれますね！

その他にも，

- Move the array designator from the variable to the type. 

[]は，変数じゃなく型に付けましょうというものだったり

```java
int hoge[][]; // NG
int[] hoge[]; // NG
int[][] hoge; // OK
```
-  Use a StringBuilder instead. 

文字列連結は+で繋げずにStringBuilder使いましょうというものだったり

```java
// NG
String str = "";
for (int i = 0; i < arrayOfStrings.length ; ++i) {
  str = str + arrayOfStrings[i];
}

// OK
StringBuilder bld = new StringBuilder();
for (int i = 0; i < arrayOfStrings.length; ++i) {
  bld.append(arrayOfStrings[i]);
}
String str = bld.toString();
```
を見てくれます．

これらは，SonarQubeのルールに反したコードを指摘しています．
ルールの詳しくは[こちら](https://sonarcloud.io/organizations/default/rules#languages=java)で確認することができます．

しかし，SonarQubeでは変数名の妥当性やプログラムの柔軟性などまでは見てくれなさそうです・・・
ですがちょっとしたコードのミスを開発メンバーの手を煩わせることなく修正することができそうですね．

まぁJavaScriptとかだと，Lintとか使えば手元で分かるので，そっちのほうがいいかもしれませんが．．．

導入してみたい方はこちらの記事を参考にしてやってみてください．
[SonarQube と TravisCI を使って Github でのコードレビューを自動化する](https://qiita.com/yo1000/items/740f0f775a5ba3753d5f)

# テストコードのカバレッジを投げる

テストコードを書くのって機能の開発と同等の時間かかったりするので，面倒という理由でさぼって書かなかったりする人もいるかもしれません．また，テストコード書いたのに果たしてカバレッジがどの程度なのか分からなかったりします．

そこで，今回はiOSのプロジェクトに対して，Pull Requestに関連するテストコードのカバレッジを返すようにしました．
こちらも先程と同様に，Travis-CIでビルドおよびテストを行った後に，，GitHubのPull Requestに対してカバレッジの結果を返しています．

それを実現するのために，ビルドやリリース作業の自動化などを行えるfastlane利用しました．
fastlaneには[様々な機能](https://docs.fastlane.tools/actions/)があるのですが，今回はテストコードのカバレッジを調べるxcovとPull Requestに通知できるdangerを利用しました．

実際に利用して行った結果を以下に示します．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/116983/cbc77fc4-2ff8-4343-750a-ea9d61034a33.png)

こんな感じに，テストコードが書かれていないと，💀や🚫などの絵文字が表示されます．
こうすることで，毎回の機能の開発でPull Requestを出すとテストコードのカバレッジを見ることになり，開発メンバーはテストコードを書くようになるかもしれません．
※テストコードを全体的に充実すべきかどうかはまた別の話なので，話を省きます．

実際に利用してみたい方は以下の記事を参考にしてください．
[iOS 開発での Pull Request と テストカバレッジの連携](http://sssslide.com/speakerdeck.com/starhoshi/ios-kai-fa-defalse-pull-request-to-tesutokabaretuzifalselian-xi)

# おわりに
今回GitHubのPull Requestに対し，コードレビューの自動化や，テストコードのカバレッジの可視化を行ったことについて紹介しました．
この他にもDangerを利用してPull Requestに様々なチェックをしている方などいますので，参考にしながら活用してみては如何でしょうか？

- [Dangerで始めるPull Requestチェック自動化](http://tech.connehito.com/entry/danger)
- [Dangerで効率よくPR駆動開発](https://techblog.recruitjobs.net/development/danger_driven_development)

次は@manekineko_glvさんによるAngularの話です〜
Unsafe Nested Virtualization on Intel CPU (の捕捉)

(BitVisor Summit 6 の懇親会が予想以上に盛り上がり，23時までいたら普通に日付変わってしまった...)

# はじめに

本日，BitVisor Summit 6 Unsafe Nested Virtualization on Intel CPU というタイトルで発表しました．
端的に言うと，Intel CPU で，BitVisor 上で，VMM が動く，というものです．
発表内容の詳細は，スライドを見ていただければいいかなと思います．
この記事では，スライドに入っていない会場での議論や余談の内容を少し書こうかと思います．

# 発表スライド
https://www.slideshare.net/DeepTokikane/unsafe-nested-virtualization-on-intel-cpu-83409391

AMD 対応版は 2 年前の BitVisor Summit 4 で，株式会社イーゲルの榮樂様によって発表されております．
https://www.bitvisor.org/summit4/slides/bitvisor-summit-4-2-eiraku.pdf

Unsafe Nested Virtualization の設計はこちらのスライドの方がわかりやすいかと思います．
今回の僕の発表はこの Intel 版実装についてとなります．

## いつ Unsafe なのか?
誰だったか忘れましたが，実際にどういう場合に危ないのか? という質問を受けました．
色々あるとは思いますが，一番考えやすいのは L1 と L2 が共謀して L0 BitVisor のコードを破壊するというものです．

スライドにも書いておりますが，Unsafe Nested Virtualization では L1 物理アドレス = L0 物理アドレス なのをいいことに，L2 動作時に EPT に L1 VMM が作成した L2 物理 -->　L1 物理の変換テーブルをそのままロードします．
これはアドレス変換に関しては特に問題ないのですが，L1 が作ったページテーブルによっては，L2 が L0 BitVisor の領域を読み書きすることができてしまいます．
つまり，L1　VMM が L0 BitVisor が居るであろうメモリ領域をマップしたページテーブルを作成し，これを L2 動作時にロードさせれば，L2 は EPT Violation などを起こさずに BitVisor の領域にアクセスできてしまいます．

## 会場でのデモ
会場では Unsafe Nested Virtualization のデモとして，KVM on BitVisor, VMWare Workstation Player on BitVisor の環境で Ubuntu 16.04 が起動するのをお見せしました．
デモの時にはお話しし忘れましたが，KVM は 1 vCPU, VMWare は 2 vCPU の VM を起動しました．

そして，Arch Linux on **BitVisor** on BitVisor も動作しました．
ただ，BitVisor が 2 つ動くと，dbgsh 叩いてもどっちの BitVisor が動作しているのかよくわからなかったですね...
仕組み上，おそらく dbgsh は L1 BitVisor のもののはずです．

L2 から L0 の VMMCALLを呼ぶ仕組みとかあっても面白いのかもしれません．

会場では，ものは試しと **BitVisor on BitVisor on BitVisor** も試してみましたが，さすがにこれは動きませんでしたね...

#VMEntry Failure ツライ & 考えられる用途
VM-x においては，VMEntry 時に設定した vCPU の状態の一部がおかしいと，エラーを返すようになっていますが，このエラーコードの情報量が少ないためにデバッグしづらいという話があります．
これを Nested Virtualization で何とかデバッグできないかという話があり，会場では Nested Virtualization は残念ながらあまり有効ではないだろうと答えました．

基本的には会場で答えた通りだと思いますが，もし Failure を出しているのがクローズドな VMM だと，割と原因究明に有効かもしれません． 

というか，基本的にコードを弄れるものだとコードを弄った方がデバッグでは有用なことも多いかもしれませんが，クローズドな VMM の挙動を監視できる点が一ついいところなのかもしれません． (調べると怒られることもありそうですが)

# VMCS Shadowing
実は，VT-x には Nested Virtualization を支援するための機能として VMCS Shadowing というものがあります．
これを使うと，L1 による VMREAD/VMWRITE を L0 への VMExit なしで CPU が勝手にやってくれるそうです．
それ以外にも機能があるかもしれませんが，ちょっとまだ追えてないです．

なぜこれを使ってないかというと，開発当初に実験用として使っていたマシンにこの機能がなかったからです...
(Core i5, i7 は大抵あると思いますが，オーバークロックモデル(型番の最後にKがつくモデル)にはなかったりします．)
ただ，VMCS Shadowing を使わなかったおかげで，VMREAD/VMWRITE をフックして色々できるというメリットもありそうです．

## おわりに
思いつくまま会場で話したことなどを色々書いてみました．
質問や気づいた点，コメントなどがあれば，この記事や Twitter でコメントやリプライを送ってもらえれば，時間のある時にお返事できればと思います．
「知行合一」「先憂後楽」

さて、12/6分のシビックテックについて書く。

まず、初めに宣言しよう。
シビックテックは、私の中では、公民連携、ソーシャルデザインの一部でしかないということを。なので、カタツムリの両目の国で戦争を起こすがごとき、細かいことは気にしないこととする。

では、本題。
今回なぜ、二つの四字熟語をタイトルとしたのか。それをご説明しよう。
「知行合一」とは、言わずと知れた、王陽明の哲学の根幹たる、知っていることとは即ち行えること、分離不可能なことであるということである。巷に、シビックテックと語るものは、最近多く見受けられるが、続かないもの、アプリのみのものも多く、それはなんでだろうと考えているうちに、ああ、行動はするけれど、やはり魂がこもっていない、口先は爽やかだが、活動が伴っていないものは、知行合一ができていないのだろうと行き着いた次第である。

 <知行合一>
https://ja.wikipedia.org/wiki/%E7%9F%A5%E8%A1%8C%E5%90%88%E4%B8%80

なれば、なんとするか。
そうさな、知に偏っているならば、活動をしてみなさい。地に足をつけてみなさいということです。外から外野で見ていることと、中に入ってやることは一億光年の差がある。そこに気がつくことが、入り口としては必要だと思う。いいと思うなら、まず、始めよということである。
また、なかなか人に刺さらないと思うのであれば、その知の方向が、ターゲットと合っていない可能性もある。そうであれば、知と行動に差があるということである。３ヶ月から半年やって、仲間が集まらない、地に足がつかない場合は、高尚な理念、こうあるべきになっている可能性が高い。そういう時は、一度、原点に立ちもどろう。

もう一つ、行に偏っている場合は、どうなるか。必死なことは伝わろう。だが、なぜやっているのか周りに伝わらなければ、応援はあれど、仲間は増えない。一度自分のやっていることを言語化して整理することをオススメする。浅い信念の活動は、どこかで必ず行き詰まる。

知行合一とは何か。それは、やりたいことと、やれることを一致させることである。そうすれば、次が見えてくる。

もう一つの言葉。
「先憂後楽」についてお話ししよう。
私は、シビックテックを初めてこのかた、イベントでも活動でも、やっている最中は、参加者や仲間のことを見ており、そこに私自身のエンジョイなどはない。みなさんが、楽しくてやってるってなんでだろうな？と思っていたが、なんのことはない、日本語の楽しいは複数の意味を持っているからだと思うております。私は、その場の刹那的な楽しさと、イベント全体を通じて得られる満足度は全く違うものだと思っています（エンジョイとハピネスは別物）。
参加していただく人たちにも、苦しみと、それを通じて得るものを伝えたいと普段から思っています。（苦悩を突き抜け、歓喜に至れ！そこに真実がある）

その時楽しいでは青い。子供の頃、楽しかったことが、今でも続いているかというとそういう楽しみ方が続くわけではない。困難ののち、得られるものもあることを理解することも、頭の片隅に、特に地域を引っ張る気概のある人には必要なものではなかろうかと思っている。
人に先んじて憂い、人々が楽しむのを見て自分も楽しむとはまさにそのことである。

人の活動原理とは、楽しい、怒り、悲しみ、感動、恐れ、責任など、常に心がどれだけ動くかによる。そんなことが、シビックテックで得られる体験できるのであれば、それは非常に良いし、それらが地域のことに対する活力やテコになるのだと思う。

シビックテックも、全体最適化の一要素として考えているので、これが全てを解決する解ではないが、これによって解決するものもある。手段を、思想と捉えることなかれ。技術でやれればいいことは、技術でやればいい。コンサルティングでできるものは、それでやればいい。必要なことは、人がチャレンジする土壌を、シビックテックというものを通じて、いの一番に日本に定着させられるかということである。思考のステージをあげるものとして、この概念がうまく使えると良いなと思うております。

「民明書房　灰色を受け入れる東洋哲学とシビックテックの関係」
[I/O Kit] USB Device Interfaceを試す

<p>以前、Cocoa LifeというCocoa勉強会の会誌で、ジョイスティックをアプリケーションで扱うお話として、HID Device Interface入門という記事を書いたが、これをSwiftで挑戦してみようと思う。</p>

<p>今回対象となるのは、SmartScroll。左手で扱うトラックボール。知人がドライバを書いていたのだが、最新のOSに対応していないので、挑戦することにした。</p>

<img width="383" alt="SmartScroll.png" src="https://qiita-image-store.s3.amazonaws.com/0/12540/aaa4904a-1710-844f-7d4a-6f77f96085ad.png">

<p>以前の開発環境には、USB Proberというアプリが存在したが、今の開発環境ではなくなった。そこで、当時から存在していたIORegistryExplorerを使うことにする。これは、別途、Additional Toolsとしてダウンロードしてインストールするものだ。</p>

<p>以下が、その結果。</p>

<img width="383" alt="IORegistryExplorer.png" src="https://qiita-image-store.s3.amazonaws.com/0/12540/9c58d7d4-9e9f-08eb-cc9d-05fd5880ebaf.png">

<p>赤い枠で囲まれた値が、機器の特定に必要となる情報だ。</p>

<p>今回、デモ用ということでコマンドラインツールとしてアプリを製作することにしたのだが、戸惑ったのは、main()関数をSwiftではどう書くか？結論は、main()関数は書かないということのようだ。</p>

<pre><code>import Foundation
import CoreFoundation
import IOKit
import IOKit.usb.IOUSBLib
 
exit(0)
</code></pre>

<p>main()関数の戻り値は、exit()関数の引数で渡すということになる。</p>

<p>IORegistryExplorerで取得した値のVendor IDとProduct IDを使って機器を特定することにするのだが、それを定数として定義する。</p>

<pre><code>let kOurVendorID = 0x56a    /* Vendor ID of the USB device */
let kOurProductID = 0x50    /* Product ID of device */
</code></pre>

<p>機器を探す条件の辞書を用意する。</p>

<pre><code>var masterPort: mach_port_t = 0
let usbVendor: Int32 = Int32(kOurVendorID)
let usbProduct: Int32 = Int32(kOurProductID)
 
let kr: kern_return_t = IOMasterPort(mach_port_t(MACH_PORT_NULL), &masterPort)
 
var matchingDict = IOServiceMatching(kIOUSBDeviceClassName) as? [String: Any]
matchingDict![kUSBVendorID] = usbVendor
matchingDict![kUSBProductID] = usbProduct
</code></pre>

<p>検索条件を設定して、RunLoopで待つことにする。</p>

<pre><code>private var gNotifyPort: IONotificationPortRef? = nil
private var gAddedIter: io_iterator_t = 0
 
gNotifyPort = IONotificationPortCreate(masterPort)
let runLoopSource = IONotificationPortGetRunLoopSource(gNotifyPort).takeUnretainedValue()
 
private var gRunLoop: CFRunLoop? = CFRunLoopGetCurrent()
CFRunLoopAddSource(gRunLoop, runLoopSource, CFRunLoopMode.defaultMode)
 
let _ = IOServiceAddMatchingNotification(gNotifyPort, kIOFirstMatchNotification, matchingDict! as CFDictionary, DeviceAdded, nil, &gAddedIter)
 
DeviceAdded(nil, gAddedIter)
 
CFRunLoopRun()
</code></pre>

<p>機器を見つけると呼ばれる関数の定義は以下の感じだ。</p>

<pre><code>func DeviceAdded(_ refCon: UnsafeMutableRawPointer?, _ iterator: io_iterator_t) {
    print(#function)
}
</code></pre>

<p>これで動作確認してみたのだが、うまく動かない。申し訳ないが今回は時間切ということで続きは勉強会で！</p>

関連情報
<a href="https://qiita.com/advent-calendar/2017/cocoa">Cocoa Advent Calendar 2017</a><br />
<a href="https://cocoa-kanto.connpass.com">Cocoa勉強会 BUKURO.swift (connpass)</a><br />
<a href="https://atnd.org/groups/cocoa-study">Cocoa勉強会 BUKURO.swift (ATND)</a><br />
<a href="http://cocoa-study.peatix.com">Cocoa勉強会 BUKURO.swift (Peatix)</a><br />

【Cocoa練習帳】
<a href="http://www.bitz.co.jp/weblog/">http://www.bitz.co.jp/weblog/</a><br />
<a href="http://ameblo.jp/bitz/">http://ameblo.jp/bitz/</a>（ミラー・サイト）<br />
<a href="https://t.co/6P3h2jtbRk>note</a><br />
<a href="https://qiita.com/m_yukio>Qiita</a><br />
Karabiner-ElementsでHHKBスタイルのカーソルキー(とhome/end)バインドを実現する

## 概要
Macbook Pro 2016のカーソルキーが個人的にめちゃくちゃ使いにくいので、使い慣れたHHKBのキーバインドをKarabiner-Elementsで設定した。
デフォルトで用意されているVimバインド(Change right_shift+hjkl to arrow keys)をちょっと変えただけで簡単にできた。よかった。
ただ、returnキーがHHKBより短い(右Shiftの右端と;[/'が近い)気がするのでちょっと詰まる感じ。慣れるしか無い。

## 環境
MacBook Pro (13-inch, 2016, Two Thunderbolt 3 ports)
macOS High Sierra 10.13.1
Karabiner-Elements 11.3.0

## 設定ファイル

~/.config/karabiner.jsonを開いて
complex_modifications > rulesに追加

```JSON:karabiner.json
{
  "description": "Change right_shift+;/[' to arrow keys(HHKB style)",
  "manipulators": [
    {
      "from": {
        "key_code": "semicolon",
        "modifiers": {
          "mandatory": ["right_shift"],
          "optional": ["any"]
        }
      },
      "to": [
        {
          "key_code": "left_arrow"
        }
      ],
      "type": "basic"
    },
    {
      "from": {
        "key_code": "slash",
        "modifiers": {
          "mandatory": ["right_shift"],
          "optional": ["any"]
        }
      },
      "to": [
        {
          "key_code": "down_arrow"
        }
      ],
      "type": "basic"
    },
    {
      "from": {
        "key_code": "open_bracket",
        "modifiers": {
          "mandatory": ["right_shift"],
          "optional": ["any"]
        }
      },
      "to": [
        {
          "key_code": "up_arrow"
        }
      ],
      "type": "basic"
    },
    {
      "from": {
        "key_code": "quote",
        "modifiers": {
          "mandatory": ["right_shift"],
          "optional": ["any"]
        }
      },
      "to": [
        {
          "key_code": "right_arrow"
        }
      ],
      "type": "basic"
    },
    {
      "from": {
        "key_code": "k",
        "modifiers": {
          "mandatory": ["right_shift"],
          "optional": ["any"]
        }
      },
      "to": [
        {
          "key_code": "home"
        }
      ],
      "type": "basic"
    },
    {
      "from": {
        "key_code": "comma",
        "modifiers": {
          "mandatory": ["right_shift"],
          "optional": ["any"]
        }
      },
      "to": [
        {
          "key_code": "end"
        }
      ],
      "type": "basic"
    }
  ]
}

```

## 参考
https://github.com/tekezo/Karabiner-Elements/issues/925
Nuxt.jsでlocalStorageを用いる際のTipsとハマったこと

GMOペパボ、ロリポップのエンジニア@sunecosuriです。
昨日は@bake0937による、`Macの開発環境をzshで良い感じにする`でした。
ghq + peco の組み合わせ、一度知ったら手放せないくらい便利ですよね。

さて、今回私はNuxt.jsでのlocalStorageを扱う際にハマったお話とTipsのようなものをご紹介したいと思います。
## Nuxt.js について
Nuxt.jsはSSR基盤を持ったVue.jsを用いたwebpackベースのフレームワークです。
詳細は[公式ページ](https://ja.nuxtjs.org/)を御覧ください。
### Nuxt.jsの認証について
Nuxt.jsで認証を行うにあたって、`nuxtServerInit`という
アプリケーションがロードされたとき、サーバーから取得できるデータをVuexのstoreに渡すことができる機構が提供されています。  
session認証になりますが、公式にも以下のようにサンプルコードが提供されています。
sessionをそのままstateに渡すといった内容になります。

```js
// store/index.js
export const actions = {
  nuxtServerInit ({ commit }, { req }) {
    if (req.session && req.session.authUser) {
      commit('SET_USER', req.session.authUser)
    }
  }
}
```

これを用いて以下のようにlocalStorageからTokenを取得して認証を行おうとすると、初回ロード時にトークンが与えられていないというエラーが出て処理が失敗してしまいます。

```js
//localStorageからtokenを取得できない
export const actions = {
  nuxtServerInit ({ commit, state, dispatch }, { req }) {
    if (localStorage.accessToken) {
      commit('user/setToken', localStorage.token)
    }
  }
}
```
原因はライフサイクルにありました。
nuxtServerInitはSSRする際に最初に処理を行うためブラウザにあるlocalStorageにそもそもアクセスできるはずがありません。
## Nuxt.jsのライフサイクル
![image.png](https://qiita-image-store.s3.amazonaws.com/0/156068/118ee8e0-4031-c49d-1601-30e3c263b496.png)

これは、nuxtClientInitといったプラグインを独自に定義することで取得することができます。
やっていることはactionを定義するいたってシンプルなものですがnuxt.config.js で定義している`ssr: false`がポイントになります。

```js
// nuxt.config.js
module.exports = {
  plugins: [{ src: '~/plugins/nuxt-client-init.js', ssr: false }]
}
```
```js
// plugins/nuxt-client-init.js
export default async (ctx) => {
  await ctx.store.dispatch('nuxtClientInit', ctx)
}
```

これを用いることでほぼ同じ記述でtokenを取得することができるようになります。

```js
// localStorageからtokenを取得できる
export const actions = {
  nuxtClientInit ({ commit, state, dispatch }, { req }) {
    if (localStorage.accessToken) {
      commit('user/setToken', localStorage.token)
    }
  }
}
```

### Token認証を扱うにあたって
取得したトークンを認証ヘッダに加えてリクエストを送る際に個人的にハマったポイントがありました。

それは、Client側でトークンを取得しているため、Vue.jsの[ライフサイクル](https://jp.vuejs.org/v2/guide/instance.html#ライフサイクルダイアグラム)においてbeforeMount以降でないと処理ができないという点です。

所感としては、localStorageから値を表示するだけであれば上記は適していますが、「SSR × SPA」を行っているNuxt.jsにおいてはlocalStorageの値を基にAjaxでリクエストを送り、レスポンスを基に処理を行うといったシーンにおいては機能こそするものの、ページ遷移ごとにカクつきが生じて高速なページ遷移といったSPAとしてのメリットが失われてしまう、複雑な処理になるほどより管理しにくい構造になってしまうといった印象を持ちました。

## まとめ
- Nuxt.jsでlocalStorageを用いた認証を行うには上記のライフサイクルを意識する必要がある。
- そもそもSSRする必要があるのかというのを再考する。  
認証の結果に応じて表示するなど、場合によってはtemplateブロックに<no-ssr>や`ssr:false`オプションなどを使えば解決できる問題かもしれません。

明日は@gatchan による`Vue.jsでモーダルウインドウをつくったこと`についてのお話です。
-> [GMOペパボ Advent Calendar 2017](https://qiita.com/advent-calendar/2017/pepabo)
有線LAN接続ラズパイをSSHでセットアップ

# 1. このメモを書いた目的
RaspberryPiの準備で、最初にいつもやる設定って何だっけをメモった。というか、毎回検索した結果、同じサイトから情報をかき集めてる気がしたので、整理した。
(2017.12.19：piの名前とパスワード変更を追記)

# 2. 目標
有線LANに接続したラズパイを、キーボードやディスプレイを一切繋ぐことなく下記のセットアップを完了。操作はwifi接続のPCから行う。

1. OS(Raspbian)が立ち上がって、SSH接続ができる状態
1. さらに、VNCサーバーが立ち上がって、リモートデスクトップできる状態
1. piの名前とパスワードを変更した状態

# 3. 参考サイト

1. [Raspberry Pi 3にRaspbian Stretch/Jessieをセットアップする方法](http://karaage.hatenadiary.jp/entry/2016/04/03/080000)
1. [Raspberry Piをディスプレイ・キーボード・マウス無しの三重苦でもセットアップする方法](http://karaage.hatenadiary.jp/entry/2015/07/15/080000)
1. [Raspberry Piに公開鍵認証を使ってssh接続する](https://tool-lab.com/2013/11/raspi-key-authentication-over-ssh/)
1. [[メモ] Raspberry Pi : VNCサーバ設定(raspbian 2016-09-23～)](https://qiita.com/mt08/items/bcefc691d89c7981fad9)
1. [SDメモリカードフォーマッター](https://www.sdcard.org/jp/downloads/formatter_4/index.html)
1. [[Raspberry Pi]ユーザ名変更の個人的に「正しい」と思うやり方](https://jyn.jp/raspberrypi-username-change/)

# 4. 詳細
## 4-1. 使ったもの
・MacBook Air (13-inch, Early 2014, macOS Sierra)
・Raspberry Pi 3
・8GBのSDカード
## 4-2. 起動用SDカード作成
1. [こちら](https://downloads.raspberrypi.org/raspbian_latest)からzipをダウンロード。今回はRASPBIAN STRETCH WITH DESKTOPのRelease date:2017-11-29。
1. SDカードをフォーマット。SDFormatterを使用。
1. ```df -h```でSDカードを確認。今回は/dev/disk3s1だった。s1がよくわからないけど放置。
1. ```diskutier unmountDisk /dev/disk3```　でアンマウント。
1. ```sudo dd if=2017-11-29-raspbian-stretch.img of=/dev/rdisk3 bs=1m conv=sync```でSDカードに書き込み実行。
1. SDカード上に、SSHフォルダを作成（中身は空）。これで、SSHが起動時に有効化されるらしい。というか、される。

## 4-3. Raspberry PIの起動とSSH
1. RaspberryPiに有線LANケーブルを接続。
1. SDカードをRaspberryPiに挿して電源投入。
1. MACからSSHログイン。ipはラズパイのもの。192.168.1.3の場合、```SSH pi@192.168.1.3```で接続。パスワードはデフォルトのraspberry。
1. ここからはMacを操作するけど、操作対象はRaspberryPi。最新状態に更新して再起動。ついでに、avahiとやらもインストールしておく。

    ```bash:RaspberryPi
sudo apt update
sudo apt upgrade -y
sudo apt-get install -y libavahi-compat-libdnssd-dev
sudo reboot now
 ```

1. 再起動後するとSSH切断される。この間に、SSHログインを公開鍵認証に変更。まずはMACで公開鍵生成してRaspberryPiに転送。

    ```bash:mac
ssh-keygen -t rsa
scp .ssh/id_rsa.pub pi@raspberrypi.local:
```

1. 再度SSH接続。RaspberryPiのホームディレクトリに公開鍵が飛んできてるハズ。これを、SSH公開鍵用のフォルダに移動して、アクセス制御をかけとく。そしてexit（piを名前変更するため）。

    ```bash:RaspberryPi
mkdir .ssh
cat id_rsa.pub >> .ssh/authorized_keys
chmod 700 .ssh
chmod 600 .ssh/authorized_keys
rm id_rsa.pub
```
次に、仮にのユーザーを作ってSSHログオフ。

    ```bash:RaspberryPi
    sudo useradd -M tempuser
    sudo gpasswd -a tempuser sudo
    sudo passwd tempuser
    exit
    ```

1. tempuserでSSHログイン。
    この間に、

1. ```sudo nano /etc/ssh/sshd_config```でパスワード認証無効、RSA公開鍵認証を有効にして先ほどのファイルを指定、を行った。
1. これでSSHのセットアップ完了。GUI要らなければ、ここで糸終了。

## 4-4. リモートデスクトップ（VNC）の設定
1. RaspberryPi上で```sudo rpi-config```でVNCをONにする。ついでに、パスワードも変更しといた。
1. MacのFinderの⌘Kからは繋げない。諦めて、```brew cask install real-vnc```した。いつもありがとう[Homebrew](https://brew.sh/index_ja.html)。
1. VNC Viewerを起動して接続。おしまい。

# 感想
次回セットアップする機会があればメモが便利な気がしなくもない。
Ansibleでよく使うコマンドをmakefileに落としておく

この記事は、Ansible Advent Calendar 2017 の6日目の記事です。

Ansible を使っているプロジェクトで、毎回書いているような `Makefile` を公開。
サンプルレポジトリは、以下。
[yyoshiki41/ansible-makefile](https://github.com/yyoshiki41/ansible-makefile)

## Makefile
```bash
$ make help
Make command examples for Ansible
    ls-hostname                    to show all host ips
    syntax-check                   to run with --syntax-check option
    lint                           to lint playbook files
    galaxy-install                 to install roles using ansible-galaxy
    vault-dec                      to decrypt secret.yml
    vault-enc                      to encrypt secret.yml
    vault-edit                     to edit secret.yml
    vault-view                     to view secret.yml
```

### ■ `ls-hostname`

とりあえずhostへのコマンドが通るか、手っ取り早く確認したい時の為。

```bash
$ ansible all -i hosts -m shell -a "hostname;"
```

### ■ `syntax-check`

`ansible-playbook` コマンドについている `--syntax-check` オプションでエラーがないか確認。
とりあえず、自分はCIに入れてます。

```bash
$ ansible-playbook playbook_dir/*.yml -i hosts --syntax-check
```

### ■ `lint`

`ansible-lint` はフォーマットにあまり重きを置いていないチームでは、不要かもです。

```bash
$ ansible-lint playbook_dir/*.yml
```

### ■ `galaxy-install`

Ansible Galaxy に登録されているロールをインストールするエイリアス。
`requirements.yml` の記述方法は、[公式](http://docs.ansible.com/ansible/latest/galaxy.html#installing-multiple-roles-from-a-file)を。

```bash
$ ansible-galaxy install -r ./roles/requirements.yml --roles-path ./roles
```

### ■ `vault-enc` / `vault-dec`

`ansible-vault` での encrypt/decrypt 時のエイリアス。
vault-password は、ファイルパスをオプションで渡していますが環境に合わせて、`ANSIBLE_VAULT_PASSWORD_FILE`や対話式で行うものに変更してください。

```bash
$ ansible-vault decrypt hosts/group_vars/secret.yml --vault-password-file ./.secret/vault_password
$ ansible-vault decrypt hosts/group_vars/secret.yml --vault-password-file ./.secret/vault_password
```

他にも `ansible-vault edit`, `ansible-view` とかもお好みで。

---

この他にもこんなのmakeに設定しているというのがあれば、ぜひ！
GitLabのエディション

[GitLab Advent Calendar 2017](https://qiita.com/advent-calendar/2017/gitlab) 5日目の記事です。

[GitLabのビジネスモデル](https://qiita.com/hiroponz/items/44b44066d0b65d1d599c)の最後で触れたように、GitLab CEには含めないで、GitLab EEだけに追加する機能の判断基準について説明します。

以前はGitLabはGitLab CEとGitLab EEの2つのエディションのみが存在しましたが、現在のGitLab EEはさらに細かいエディションに細分化されています。具体的には、3つのエディションに分かれていて、1ユーザー当たりの年間ライセンス料金は以下の通りです。

1. EE Starter (EES): $39
2. EE Premium (EEP): $199
3. EE Ultimate (EEU): $999 (現在はearly adopter割引有り)

これらのGitLab EEの各エディションに追加する機能によって、GitLabの売上が大きく左右されると考えられます。そのため、GitLab社の販売戦略について簡単に説明します。[こちらのハンドブック](https://about.gitlab.com/handbook/sales/#market-segmentation)によると、GitLab社は市場(潜在顧客となる組織)を以下の４つのセグメントに分けています。

1. Strategic: 社員数5000名以上
2. Large: 社員数750名 - 4999名
3. Mid Market: 社員数100名 - 749名
4. SMB(small and medium businesses): 社員数100名未満

また、[こちらのハンドブック](https://about.gitlab.com/handbook/product/#enterprise-edition-tiers)によると、GitLabの各エディションに追加する機能は以下のように決定していることが分かります。

1. 「SMB」に有用な機能は「CE」に追加
2. 「Mid Market」に有用な機能は「EES」に追加
3. 「Large」に妥当な有用は「EEP」に追加
4. 「Strategic」に有用な機能は「EEU」に追加

大きな組織において有用な機能が、小さな組織でも有用である場合は多々ありますが、大きな組織にとっての方が**より**有用な機能であれば、GitLab EEだけに追加するというのが、GitLab社の基本方針のようです。

以上、GitLabのエディションについてまとめると以下の表のようになります。

| エディション | 1ユーザー当たりの年間ライセンス料金 | 市場セグメント | 機能追加の判断基準となる社員数 |
| --- | --- | --- | --- |
| CE | 無料 | SMB | 100名未満 |
| EES | $39 | Mid Market | 100名 - 749名 |
| EEP | $199 | Large | 750名 - 4999名 |
| EEU | $999 | Strategic | 5000名以上 |

なお、GitLabはバージョンアップでの機能追加が早いので、エディション間の機能の違いについては[こちらの機能比較ページ](https://about.gitlab.com/products/feature-comparison/)を参照して下さい。
まなみんと私

まなみん（We are MAの2017アドベントカレンダー）のための投稿記事です。
12月はまなみんの誕生月とのことでストーカー的な記事を書いてみたくなりました。はたしてこんな記事がQiitaで投稿していいのか甚だ疑問です。本人に了解を取っていないので幻の記事になるかもしれません。

# 出逢いは突然に
まなみんとの出逢いはMAではありません。2013年頃から私はシビックテックと呼ばれる活動に参加していました。そのときCode for Japanで地方の団体を繋げる支援を担当していたのがまなみんです。オンライン越しの会議やFacebookの投稿などで一生懸命に各地を繋ぐ連絡係に奮闘されているのが印象的でした。

そんな日々を過ごしているうちに出逢いは突然にやってきました。

### 2014年4月 TechCrunchハッカソン in 大阪


午前中に仕事の予定が入り、午後から遅れて参加した私は伴野さんによってすでに結成されているチームにエンジニアとして放り込まれました。

![13906543007_bdb09a2067_k.jpg](https://qiita-image-store.s3.amazonaws.com/0/151569/fc1bf427-24f5-021a-8c1b-3ee38c94a079.jpeg)


その会場で一眼レフを持って走り回っている彼女を見かけたのです。「え？Code for Japanの方がいる！」地方にいる人の８割は都会に憧れを抱いており中央の人は雲の上の存在だと認識しています。そんな雲の上の方が私の目の前を横切っていくではありませんか！しかもシビックテックとは全然関係ない（と、当時は思っていた）ハッカソンの会場に！

混乱する頭でとりあえず勇気を出して声をかけてみました「Code for Japanの鈴木さんですよね？」「え。あ、はい」と忙しそうに去って行ってしまいました。写真一緒に撮れませんでした。はっきりいって失敗。出逢いは最悪でした。

# キッカケはマスコット

その頃、彼女がご執心だったマスコットキャラが「丹波竜のちーたん」です。
http://www.city.tamba.lg.jp/site/chi-tan/

### 2014年7月 OSC名古屋
初夏の名古屋にそのマスコットキャラと一緒にやってきていました。Facebookの投稿ではお見かけしていたのですが、生ちーたんは初めてでひどく感激したのを覚えています。

![14799544174_1d2c3703a7_o.jpg](https://qiita-image-store.s3.amazonaws.com/0/151569/19cd953b-8886-039c-a4e7-631f94340c08.jpeg)
ちーたんと一緒で嬉しそう（私もうれしい）

![14778941456_19db445f5e_o.jpg](https://qiita-image-store.s3.amazonaws.com/0/151569/48ac96ce-7a5c-621e-aebc-1d72ec72362d.jpeg)
私の最大のライバル伴野氏といつも一緒（なぜか宮内さんも写りこんでるw）

８月にはちーたんの地元である丹波を訪れる機会があり、その時の私のFacebook投稿への彼女の食いつきっぷりがすごかったです。このことをキッカケに彼女との距離が近くなりました。いまでもこの時に買ったキーホルダーを家の鍵につけています。

![14863128106_305a7267b9_o.jpg](https://qiita-image-store.s3.amazonaws.com/0/151569/14275a69-8079-1b23-9cde-8473498b04ee.jpeg)
ちーたんと一緒

# ラブメッセ事件
まなみんはお酒を飲むといろいろな方にメッセージを送りつけるという癖があるようです。確かにFacebookの投稿も時間帯によっておかしなことがあります。
前後の流れは省きますが2014年9月に以下のメッセージをもらいました。

```
まなみん：私、石井さんもすきですよ
私：ありがとうございます。まなみんさんも好きですよ。MAがんばってくださいね。
まなみん：「まなみんさん」は禁止ですよ。まなみんかまなみさんのどちらかでお願いしますｗ
私：じゃあ、まなみさんでw
```
これはすでに恋人同士の会話ではないですか！！！
（それよりも3年以上まえの会話が残っているってITの進歩は恐ろしいですね。みなさん不用意なメッセージに気をつけましょう）

# それから月日は流れ

数多くのシビックテックのイベント、MAのイベント、またCivicWaveのオンライン井戸端会議でもよく顔をあわせるようになったので、おそらく彼女は私のことを認識してくれていると思います。
今年になってようやく「まなみさん」から照れずに「まなみん」と呼べるぐらいになりました。私は意外と人見知りが激しいのです。

![IMG_9248-1-01.jpeg](https://qiita-image-store.s3.amazonaws.com/0/151569/2049ba44-ddcd-2438-a3f1-808f627029f8.jpeg)
今年の大垣ハッカソンでやっぱりビールを飲んでいるまなみん

本人が気づいているかどうかわかりませんが、彼女がいると会場の雰囲気が賑やかに（華やかではない）なります。それはとても大きな武器です。
またストレートに自分の考えや感情を伝えるところも好きです。MAに至っては愛があふれています。これからもその惜しみない愛を存分に発揮してMAを盛り上げて行ってください。
Oracle DB内の特定のTableのDDLを取得する手順

##1.sqlplusを発行できるサーバへログインする。
##2.以下のコマンドを実行する。
**＜コマンド＞**
sqlplus / as sysdba
##3.以下のコマンドを実行して描画行数を設定する。
**＜コマンド＞**
set long 3000;
##4.以下のコマンドを実行してDDLを取得する。
**＜コマンド＞**
select DBMS_METADATA.GET_DDL('TABLE','TABLE_NAME','SCHEMA_NAME') from dual;

※TABLE_NAME : 参照したいテーブル名に置換すること
※SCHEMA_NAME : 参照したいテーブルのスキーマ名に置換すること
Go完全導入から2年目の冬が来た感想

# はじめに

この記事は [アイスタイル Advent Calendar 2017](https://qiita.com/advent-calendar/2017/istyle) の 5 日目です。

@ytakeの投稿を期待されていた皆様申し訳ありません。
諸事情により本日はアイスタイルでサーバーサイドエンジニアとしてGo/Scalaなどで開発している @ginshari がお届けします。

## TL;DR
- 社内のアプリケーションにGoを本格的に利用し始めてから２年がたちました
- REST-APIの開発用途やデータ移行バッチなど、幅広く使われています
- 会社でのGo勉強会も活発に行われるようになってきました
- 俺達の戦いはこれからだ！

## この２年ちょっとの振り返り
- @ginshari が入社して２ヶ月、実はGoが少し使われていることを知る
- サービスに利用するちょっとしたREST-APIをGoで作成してみて、なし崩し的に本番リリース→稼働
- goji、echoと使っていったがgoaに出会ったのでgoaを使ってみる
- goa良かった・・・尊い・・・となったので2017年はずっとgoa
- 別部署でもGo導入の機運が高まったので社内勉強会の実施！

## goaの導入

弊社では現在、複数の多様なサービスが互いに関わり合うことが多いため、他部署のシステムにAPIのインターフェースをレクチャーするタイミングがどの部署においてもかなりの頻度で発生しています。
そこで、

- メンテされないAPIドキュメントにならない（なりづらい）開発サイクル
- Swaggerで定型的に提供されるドキュメントとなるため、慣れが前提にはなりますが、読みやすい

という効果が得られることを期待して、goaを導入しています。
個人的な体感として、APIドキュメントのメンテコストはかなり削減されているように思いますし、Sampleのレスポンスも設計として定義した内容で示すことができるため、インターフェースの理解の齟齬が生まれにくくなってきているなという風には思っています。

2017年は、[goa勉強会 in 六本木一丁目](https://istyle.connpass.com/event/57455/)と題しまして、弊社にてgoaの勉強会イベントを行ったりもしました。機会があれば2018年も開催したいなと思っておりますので、ご興味のある皆様のご参加をお待ちしております。

## アプリケーション配布など
弊社アイスタイルは、PHPのプロダクトの比率が多く、jenkinsを経由して自動デプロイツールを利用していることが多いのですが、コードベースの大きさや配布先サーバー数などの影響でデプロイに数分ではありますが時間がかかっていました。

Goを利用したアプリケーションに関しては以下のような工夫をしています

- go-bindata等を利用した静的ファイルの.goファイル化
- 実行ファイルを必ずバイナリ化して稼働させるサーバーに配布
- アプリケーションを動作させるサーバーでは、配布されたバイナリをsupervisordで複数プロセス起動させる
    + そのため、アプリケーションはコマンドラインオプションなどでポート番号指定を行えるようにしておく
- nginxでポートごとに起動されたサーバーアプリケーションに対してupstreamを定義し、ロードバランサーが複数サーバーのnginxに対してリクエストを振り分ける

![スクリーンショット 2017-12-04 19.56.14.png](https://qiita-image-store.s3.amazonaws.com/0/221046/90342544-5b55-a91d-a3bd-b7c6c2736853.png)


こうすることで、

- 配布の煩わしさを低減し、配布物をアプリケーションのバイナリ１つに絞ることによってデプロイ処理を簡素化
- スケールしたい場合にもバイナリを配布すればよくなるため、高負荷になった場合の対策も用意しやすい

といった良い結果を生むことができました。
※ 同一サーバーで２プロセス動作させるところは、もしかしたらGoのCPUの使い方的にあんまり意味が無いかもしれませんが、片方ずつ再起動させることで落ちないような状態にできているようにも思うのでこうしています。

## 社内Go勉強会について
まだまだ始めたばかりなので、どういう形が社内のメンバーに対してフィットするのかという部分で手探り状態で進めているのですが、

- go入門
- goa入門
- ポインターとレシーバについて
- インターフェースと委譲
- テストの始め方とテスト時に役立つツール

と言ったテーマで１０月後半から、数回実施しています。
こちらについては、まだまだこれから知識自体の読み物や手を動かす時間などを増やせるようなコンテンツを増やしていくことでより良くしていければなと思います。

## おわりに

ざっくりとではありますが、アイスタイルにおけるGoアプリケーション開発について解説させていただきましたが、いかがでしたでしょうか？

明日の弊社アドベントカレンダーでは、DBAの @sugat1679 が「MariaDBのストレージエンジンを駆使して目指せRDS - はじめの一歩」というテーマで投稿を行いますので、ぜひご覧いただければと思います！
C++とEigenで状態方程式を解く。

#目的
C++言語とEigenとで、1自由度系(バネマスダンバ系)の状態方程式を解く。

[PythonControlで初期条件応答を求める。](https://qiita.com/nnn112358/items/ec0a601e5b9ee0a1d893)をC++に移植する。


#事前準備
[Eigen](http://eigen.tuxfamily.org/index.php?title=Main_Page)をインストールする。
上記ページからヘッダファイルをダウンロードし、読み込むだけでコンパイルすることができる。
Eigenは、C++言語で行列・ベクトルを扱うためのライブラリである。
C++で現代制御をプログラミングする場合、制御システムをベクトル行列で扱う為、Eigenを使うことでプログラミングを作成しやすくできる。

#システムのモデル化

![test.jpg](https://qiita-image-store.s3.amazonaws.com/0/73020/79622859-1f58-2857-67fe-381084054ee2.jpeg)
>>m:質量[kg]
k:ばね定数[N/m]
c:粘性減衰係数[N・s/m]
f：力[N]

以下の状態方程式を立式する。

```math
\dot{x}(t)=Ax(t)+Bu(t) \\
y(t)=Cx(t)+Du(t)
```


```math
x(t)=
\begin{bmatrix}
x_{1}  \\
x_{2}  
\end{bmatrix}

,
u(t)=f
,

A=
\begin{bmatrix}
0 & 1 \\
-k/m & -c/m
\end{bmatrix}
,
B=
\begin{bmatrix}
0 \\
1/m 
\end{bmatrix}
,
C=
\begin{bmatrix}
1 & 0 
\end{bmatrix}
,
D=[0]
```


#ルンゲクッタ法
状態方程式の時間応答はルンゲクッタ法で近似解を得ることができる。
ルンゲクッタ法を以下の式に示す。

```math
\begin{eqnarray}
k_1&=&f(t,x)\\
k_2&=&f(t+\frac{Δt}{2}, x(t)+\frac{k_1Δt}{2})\\
k_3&=&f(t+\frac{Δt}{2}, x(t)+\frac{k_2Δt}{2})\\
k_4&=&f(t+Δt, x(t)+k_3Δt)\\
x(t+Δt)&=&x(t)+\frac{Δt}{6}(k_1+2k_2+2k_3+k_4)
\end{eqnarray}
```

これをEigenを使って、プログラミングすると、

```c

void RungeKutta(MatrixXd dX, MatrixXd &X, MatrixXd u, double tt, double dt, MatrixXd A, MatrixXd B, MatrixXd C, MatrixXd D) {
	MatrixXd k1 = A*X + B*u;
	MatrixXd k2 = A*(X + 0.5*k1*dt) + B*u;
	MatrixXd k3 = A*(X + 0.5*k2*dt) + B*u;
	MatrixXd k4 = A*(X + k3*dt) + B*u;
	MatrixXd k = (k1 + 2.0*k2 + 2.0*k3 + k4)*dt / 6.0;
	X = X + k;
}

```



#サンプルソース
1自由度系(バネマスダンバ系)の伝達関数の初期条件応答を、ルンゲクッタ法から求める。
X=[10,0]からの初期条件応答を求める。

```c
#include "Eigen/Dense"
#include "Eigen/Core"
#include <iostream>
#include <fstream>
using namespace Eigen;
using namespace std;

void RungeKutta(MatrixXd dX, MatrixXd &X, MatrixXd u, double tt, double dt, MatrixXd A, MatrixXd B, MatrixXd C, MatrixXd D) {
	MatrixXd k1 = A*X + B*u;
	MatrixXd k2 = A*(X + 0.5*k1*dt) + B*u;
	MatrixXd k3 = A*(X + 0.5*k2*dt) + B*u;
	MatrixXd k4 = A*(X + k3*dt) + B*u;
	MatrixXd k = (k1 + 2.0*k2 + 2.0*k3 + k4)*dt / 6.0;
	X = X + k;
}

int main() {
	double	k = 1.0;
	double	m = 0.1;
	double	c = 0.1;

	MatrixXd A(2, 2);
	A(0, 0) = 0;
	A(0, 1) = 1;
	A(1, 0) = -k / m;
	A(1, 1) = -c / m;
	MatrixXd B(2, 1);
	B(0, 0) = 1;
	B(1, 0) = 1 / m;

	MatrixXd C(1, 2);
	C(0, 0) = 1;
	C(0, 1) = 0;
	MatrixXd D(1, 1);
	D(0, 0) = 0;

	double dt = 0.01;
	double tt = 0.0;
	MatrixXd X(2, 1);
	X(0, 0) = 10;
	X(1, 0) = 0;
	MatrixXd dX(2, 1);
	dX(0, 0) = 0;
	dX(1, 0) = 0;
	MatrixXd u(1, 1);
	u(0, 0) = 0;
	MatrixXd Y(1, 1);
	Y(0, 0) = 0;

	double freq = 1.0;
	ofstream ofs("outdata.csv");
	ofs << "time," << "y" << endl;

	for (int i = 0; i < 1000; i++) {
		RungeKutta(dX, X, u, tt, dt, A, B, C, D);
		Y = C*X;
		ofs << tt << "," << Y(0, 0) << endl;
		tt += dt;
	}

	return 0;
}
```

#結果
以下の初期条件応答が得られる。
![新しいビットマップ イメージ.png](https://qiita-image-store.s3.amazonaws.com/0/73020/49752f2a-f147-9e74-a620-ceb035edb602.png)

 [PythonControlで初期条件応答を求める。](https://qiita.com/nnn112358/items/ec0a601e5b9ee0a1d893)と全く同じグラフが得られた。
【Python】Pygame で Nintendo Switch の Joy-Con(L) の操作を検出

ロボット開発のデバッグにコントローラーを使いたくて、何か良いの無いかと探しておりました。

はじめは、[iBUFFALO USBゲームパッド SFC風](https://www.amazon.co.jp/iBUFFALO-USB%E3%82%B2%E3%83%BC%E3%83%A0%E3%83%91%E3%83%83%E3%83%89-8%E3%83%9C%E3%82%BF%E3%83%B3-%E3%82%B9%E3%83%BC%E3%83%91%E3%83%BC%E3%83%95%E3%82%A1%E3%83%9F%E3%82%B3%E3%83%B3%E9%A2%A8-BSGP801GY/dp/B002B9XB0E) とか良いかなと考えていたのですが、
Joy-ConがBluetooth接続で簡単に使用できると聞いて、Joy-Conへ方向転換。
PythonのPygameを用いて簡単に検出できたので、手順を以下にメモ。

① Joy-ConをBluetooth接続モードへ移行
![01.png](https://qiita-image-store.s3.amazonaws.com/0/140207/afa0082d-0d11-f972-8072-5e32c8561984.png)

②-1 Windows側でBluetooth機器を検出
![2017-12-05 (16).png](https://qiita-image-store.s3.amazonaws.com/0/140207/af5b58ab-8fc4-5d4f-344c-64edbcf46481.png)
②-2 Windows側でBluetooth機器を検出
![2017-12-05 (17).png](https://qiita-image-store.s3.amazonaws.com/0/140207/1acc80d1-1f21-10b9-5047-efdb2b765296.png)
②-3 Windows側でBluetooth機器を検出
![2017-12-05 (18).png](https://qiita-image-store.s3.amazonaws.com/0/140207/7d2c4e5d-dd13-ae9f-2ae6-38a3ed398127.png)
②-4 Windows側でBluetooth機器を検出
![2017-12-05 (19).png](https://qiita-image-store.s3.amazonaws.com/0/140207/2a24796a-3385-2249-04ca-98b6a5b5acf0.png)
②-5 Windows側でBluetooth機器を検出
![2017-12-05 (20).png](https://qiita-image-store.s3.amazonaws.com/0/140207/b1514296-282e-8360-c91b-2cbcb1057781.png)




実際に検出してみたところの動画は以下。
https://www.youtube.com/watch?v=UiDuYm2suMk
[![【Python】Nintendo Switch の JOY-CON を Pygame で Joy-Con の操作を検出
](https://img.youtube.com/vi/UiDuYm2suMk/0.jpg)](https://www.youtube.com/watch?v=UiDuYm2suMk)

スティックは、ハットスイッチとして検出するようで、以下のような割り付けになっておりました(横向き持ちの場合)
　スティック左倒し：ハットスイッチ X軸 -1
　スティック右倒し：ハットスイッチ X軸 1
　スティック上倒し：ハットスイッチ Y軸 1
　スティック下倒し：ハットスイッチ Y軸 -1
　SL：ボタン 4
　SR：ボタン 5
　L ：ボタン 14
　ZL：ボタン 15
　十字キー 左：ボタン 2
　十字キー 右：ボタン 1
　十字キー 上：ボタン 3
　十字キー 下：ボタン 0
　- ：ボタン 8
　キャプチャーボタン ：ボタン 13

　モーションIRカメラ、NFC、加速度センサー、ジャイロセンサーとかスティックの微妙な倒し具合 は検出できない模様。
HD振動とか指示出来たら、色々楽しめそうですが、今のところ操作出来るか不明。

ソースコードは以下。

```py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pygame
from pygame.locals import *
import time

def main() :
    pygame.joystick.init()
    joystick0 = pygame.joystick.Joystick(0)
    joystick0.init()
    
    print 'joystick start'
    
    pygame.init()

    while True:
         # コントローラーの操作を取得
        eventlist = pygame.event.get()

        # イベント処理
        for e in eventlist:
            if e.type == QUIT:
                return

            if e.type == pygame.locals.JOYAXISMOTION:
                x, y = joystick0.get_axis(0), joystick0.get_axis(1)
                print 'axis x:' + str(x) + ' axis y:' + str(y)
            elif e.type == pygame.locals.JOYHATMOTION:
                x, y = joystick0.get_hat(0)
                print 'hat x:' + str(x) + ' hat y:' + str(y)
            elif e.type == pygame.locals.JOYBUTTONDOWN:
                print 'button:' + str(e.button)

        time.sleep(0.1)
 
if __name__ == '__main__':
    try:
        main()
    except pygame.error:
        print 'joystickが見つかりませんでした。'

```

以上。
技術コミュニティの運営を手伝って勉強になったこと

# はじめに
今年の夏から、縁あって、技術系コミュニティ（TECH PLAY 女子部）の運営をお手伝いすることになりました。
イベントの企画や実施など、進めて行く中で色々な気づきがあったので、技術系コミュニティに興味があるものの一歩を踏み出せない、というプログラマ、エンジニアの後押しになればと思い、投稿します。（が、Qiitaの内容にそぐわないようだったら個人ブログに移行します。）


# どんなことをどんな風にしているか
現在のコミュニティでは、主に女性エンジニア向けのイベントの企画・実施をしています。

### ＊ 運営体制
現在コアに関わっている運営メンバーは10人前後です。
そのうち、TECH PLAYに所属している人は2人、あとの8割はバラバラの職場のメンバー。
触っている技術も違うので、企画を考えるときにも、みんな集まれば文殊の知恵！みたいなことがよく起きます。
ちなみにコミュニティ自体のフォロワーは600人超、イベント参加者は大きめのイベントで40名くらい。

### ＊ 連絡手段
普段の連絡は専用のslackチームで行っています。
コミュニティ全体のslackと別に、運営メンバー用のslackを用意していて、運営希望者だけを招待。
もくもく会以外の勉強会やイベントは大体1〜2ヶ月に1度開催。企画時にslackのchannelを立ち上げます。運営は全員が強制参加というわけではないので、日程を見てお手伝い可能であれば参加する流れです。

### ＊ MTG
月に1度は運営メンバーが集まって打ち合わせしています。
大体、月1で開催しているもくもく会と合わせて、会場に集まって話すことが多いです。
アジェンダはいつも↓こんな感じです。

- 現在準備中のイベント進捗確認
- 次回イベントの企画
- 次回イベント準備の役割分担
- その他、今後の話
- 時々、乾杯（？）

### ＊ イベントの企画・運営
開催しているイベントはプログラミング言語のハンズオンからLT大会、開発合宿など幅広く実施。
ピラティスレッスンを取り入れるなど、女性コミュニティならではの企画もやっています。

- Ruby on Rails ハンズオン + ピラティス体験会
- React Native ハンズオン
- 技術やマネジメントに関連するLT大会
- [田舎の旅館で開発合宿](https://qiita.com/maimax/items/3f5a938aa019bd5a91e7)
- 女性エンジニアのキャリア支援ワークショップ
- 夫婦エンジニア Meetup
- 月1もくもく会  

技術勉強会では、外部講師を呼んで（RailsGirlsのメンターなども！）来ていただいたりしています。
自由参加の交流会もあるので、横の繋がりを作る良い機会になります。



# 技術コミュニティに参加するメリット
自分なりに、この半年で「参加してよかったー！」と思ったことを洗い出してみました。
大体いいことづくしで、個人的にはデメリットはないと感じています。

### ＊ 触れたことのない技術を知る機会が増える
普段、自分の業務だけの日々を送っていると、どうしても必要最低限の技術しか触らなくなってしまう人が多いと思います。もちろん常に自己学習するのがエンジニアだとは思いますが、**大半の人がわかっていながらできていない**のではないでしょうか。
技術コミュニティに参加していると、自然と新しい情報が入ってきたり、最新技術のハンズオンが開催されたりするのでトレンドを追うきっかけにもなっています。

### ＊ 一緒に勉強会にいく仲間を作れる
知らない人がたくさんいる勉強会に一人で飛び込んでいくのって勇気がいるもの。新しい技術をインプットしたいとか、持っているTipsをLTで話してみたいとか、思っているだけで踏み出せていない人も多いと思います。
技術コミュニティなら、同じように躊躇している仲間がたくさんいるので、誘い合って参加することもよくあります。

### ＊ 仕事の引き合いがあったりする
これは技術コミュニティに限らずですが、仕事のことを相談する相手が増える分、ひょんなことから新しい仕事に繋がったり、ときには転職でお世話になる人もいたりします。他業種の仕事に興味がある、という人も外の世界を見ることができる良い機会だと思います。



# 運営に参加するメリット
コミュニティへの参加だけでなく、運営を手伝うとどんなことが起きるのか（起きたのか）考えてみました。
### ＊ 好きな勉強会を企画できる
自分が企画側になることで、やりたい勉強会を実施できる可能性は非常に高くなります。
全てが実現するわけではないですが、業界の有名な技術者に登壇をお願いしたり、講師として来ていただいたり、触ってみたかったフレームワークを勉強できたり。
社会人としてもエンジニアとしても、モチベーションUPに繋がる経験ができています。

### ＊ 自分の得意分野を強化できる
副次的なメリットは、自分の強みを生かすことで普段の業務とは別の得意分野が見つかること。
特に、イベントの企画や参加者の取りまとめなど、やってみて得意不得意がわかる、ということもたくさんあります。コミュニティ運営は、日頃プログラミングがメイン業務だと気がつかないような自分の強みを見つけられる環境です。ステップアップを考えている人こそ、飛び込んでみるのも良いと思います。


# 組織運営できるエンジニアって意外と少ない
多くのエンジニアは、普段から組織運営について考えながら仕事している、ってことはないと思います。（PMとかは別。）それが悪いわけではなく、抱えている仕事上、求められていることが組織運営ではないから当然なわけで。

なので思った以上に、ファシリテーション能力のあるエンジニアは多くない。だからこそ、潜在的に能力のある人は遠慮せず前に出たら仕事の幅が広がるんでは？と思うし、失敗しても全然恥ずかしくないです。だってみんなも得意じゃないんだから。

今後のキャリアに迷っているエンジニアは、いざ、チャレンジ！


# 最後に
お手伝い中のTECHPLAY女子部も、ガチエンジニアが揃った技術者女性集団です。もちろん、今年のQiitaアドベントカレンダーも実施中。
色々な分野のエンジニアが参加登録しているので、きっと参考になるtipsがあると思います。よかったら見てください。

- [TECHPLAY女子部 アドベントカレンダー](https://qiita.com/advent-calendar/2017/techplaygirls)
- [Tech Fun アドベントカレンダー](https://qiita.com/advent-calendar/2017/techfun)
CocoaPodsのインストールと使い方 

#インストール


```
sudo gem install cocoapods -n /usr/local/bin
```

```
pod setup
```

# プロジェクトごとに使用
xcodeで新規作成(PodTest)
xcodeを閉じる

```
cd Podtest
pod init
```

ファイルが作成される

```
ll
-rw-r--r--  1 imajo  staff  253 12  5 23:42 Podfile
drwxr-xr-x  7 imajo  staff  224 12  5 23:42 podTest
drwxr-xr-x@ 5 imajo  staff  160 12  5 23:42 podTest.xcodeproj
```

Podfileで入れたいライブラリを指定

```
# Uncomment this line to define a global platform for your project
 platform :ios, '8.0'
# Uncomment this line if you're using Swift
 use_frameworks!

target 'podTest' do
  pod 'JSQMessagesViewController'
end
```

インストール

```
pod install
```
.scworkspaceファイルで開く

```
open podTest.xcworkspace/
```

search pathの設定
BuildSetting > Linking > Runpath search pahts
に、以下を追加

```
$(inherited) @executable_path/../Pods/Frameworks
```
a-blog cmsでのウェブサイト公開時に確認しておきたい「チェックリスト」ページ

※このページは「[a-blog cms Advent Calendar 2017](https://adventar.org/calendars/2570)」6日目のエントリとなります。
※このページではa-blog cms Ver.2.7.20 での機能を解説しています。

今回は、直接的な制作に関する内容ではなく、公開前の確認に便利な「チェックリスト」ページのご紹介です。
ウェブサイト制作の最終段階である公開前のチェックは、各制作者さんそれぞれがチェックリストなどに照らしてご確認いただいているのではないかと思いますが、そういったチェックの助けとなる機能が「チェックリスト」ページです。

![チェックリストページ.png](https://qiita-image-store.s3.amazonaws.com/0/221230/19885262-7151-6f8e-8bbc-fb94fdf7d7a2.png "チェックリストページ")

#見落としがちな情報は公開前に「チェックリスト」で確認！
チェックリストページでは管理上の情報がまとめて確認できるため、公開前のチェックもまとめて行えます。
制作中の場合は設定上問題ありませんが、公開時にはこの状態ではいけないのではないか、という項目は背景が赤系になるなど、見やすい処理もされています。それでは、チェックリストページの各項目を確認していきましょう。


##ライセンス・バージョン情報
ここでは、正式公開に当たって正しいライセンスが適用できているかを確認できます。ライセンス種別やドメイン、ユーザー数などのオプションが正しいものになっているかをチェックしておきましょう。
![ライセンス情報.png](https://qiita-image-store.s3.amazonaws.com/0/221230/16c00a92-8001-8c42-bc56-3eecd703b253.png "ライセンス情報")

##動作モード
デバッグモードは、ONの場合に各種エラーメッサージや、インクルード先のパスがコメントで表示されるようになります。開発中は便利な機能ですが、キャッシュを使用しないこと、warningなどのメッセージも表示されてしまうことから、公開時にはOFFにしておきましょう。
OFFにする場合は config.server.php の define('DEBUG_MODE', 1); の1を0に変更します。
```
define('DEBUG_MODE', 1);
```
![動作モード.png](https://qiita-image-store.s3.amazonaws.com/0/221230/b940a547-9a0f-4dc2-6532-42091e073de6.png "動作モード")



ベンチマークモードは、モジュールの処理にかかる時間をはじめ、表示・処理パフォーマンスに関わる情報を、ページ下部に出力する機能です。こちらも公開時にはOFFにしておきましょう。
OFFにする場合は config.server.php の define('BENCHMARK_MODE', 1); の1を0に変更します。
```
define('BENCHMARK_MODE', 1);
```

画像エンジンはGDまたはImageMagickとなりますが、ここは公開に当たっては問題になる部分ではありません。

##サーバー環境情報
ここにはa-blog cmsではなく、動作させているサーバに関する情報が表示されています。インストールができていれば大きな問題はありませんが、1つのエントリに多くのユニットや、大きな画像を登録することができないような場合には確認が必要です。
これらはa-blog cmsではなくサーバ上のhtaccessやphp.iniによって設定を変更します。詳しくはa-blog cms Developersブログ「[画像が一定数枚までしかアップロードできない場合の対処法](https://developer.a-blogcms.jp/blog/max-file-uploads.html)」をご確認ください。
![サーバー環境情報.png](https://qiita-image-store.s3.amazonaws.com/0/221230/9f563b93-dd00-e724-7467-283ff8efecdb.png)




##キャッシュ・アクセスログ
コンテンツによってはブログ単位でキャッシュをOFFにしたいということがあるかもしれません。ここで適切なキャッシュの利用にできているかをチェックしましょう。制作時に確認のためキャッシュを使わない設定にしたままになっている場合もあります。
アクセスログは通常POST動作のみを記録するようになっています。すべての動作を記録したり、記録を止める、保存期間を変えるなどは コンフィグ > 機能設定 から可能です。行の右端「編集」ボタンで直接この機能設定ページへ移動できます。
![キャッシュ・アクセスログ.png](https://qiita-image-store.s3.amazonaws.com/0/221230/55e9d544-cc51-9fc8-9dab-1a27431b6dd8.png)


##フォーム（一般宛・管理者宛）
フォームの宛先が、テスト用のものになっていないかをチェックしておきましょう。
宛先は コンフィグ > 機能設定 から変更できます。また、行の右端「編集」ボタンで直接このフォームIDの設定ページへ移動できます。

##コンフィグ検索
ここではデータベースのconfigテーブルを検索します。
通常、テストで登録したエントリは「エントリー管理」でキーワードフィルターを使って「テスト」などをエントリの全文から探して削除というような形で発見・対応していくこともあるかと思いますが、エントリ以外（例えばバナー）のモジュールを使ったものについては検索することができません。
このような場合には「コンフィグ検索」を使用して確認していきましょう。

- - -
この他にもチェックが必要な内容はあるかと思いますが、チェックリストページでの確認は便利に使っていただけるのではないでしょうか。
せっかく作ったウェブサイト、最後にしっかりチェックして公開に備えてみてくださいね。
公共Galaxyサーバー（概要）

Galaxyプロジェクトの公開サーバー [Galaxy Main](https://galaxyproject.org/public-galaxy-servers/galaxy-main/) は多くのニーズを満たすことができますが、全てに適しているわけではありません（理由は [Choices](https://galaxyproject.org/choices/) を参照してください）。幸い、様々な研究機関がGalaxyサーバーを一般公開しています。一部のサーバーではログインが必要な場合があります。

一般公開されている公共Galaxyサーバー（[Public Galaxy Servers](https://galaxyproject.org/public-galaxy-servers/)）は次の３つに分類されています。

- **汎用ゲノム解析サーバー**（[General Purpose / Genomics server](https://galaxyproject.org/public-galaxy-servers/#general)）は、一般的なゲノム解析を行う場合に使用できるサーバーです。幅広いツールを実装し、一部の生物や解析に特化したものではありません。
- **ドメインサーバー**（[Domain specific server](https://galaxyproject.org/public-galaxy-servers/#domain)）は、特定の生物や解析に特化したサーバーです。
- **ツール公開サーバー**（[Tool Publishing server](https://galaxyproject.org/public-galaxy-servers/#tool-publishing)）では、1つ以上のツールが公開されています。ドメインサーバーとツール公開サーバーの区別はあいまいです。一般に、ツール公開サーバーは特定の組織のツールを公開し、ドメインサーバーは他の組織のツール/データセットを含みます。
SalomeでOpenFOAMのメッシュを用意する方法

#Salomeとは
オープンソースの数値計算用プリポストGUIで、FEMソルバ「Code-Aster」を内蔵したものはSalome-Mecaと呼ばれている。オートメッシュ、ブロック分割による手切りに対応しており、頑張ればフルヘキサのメッシュも切れる。

#Salomeでのメッシュの準備
Salomeの使い方は省くがメッシュ作成時のポイントは以下の点で、これを守ればうまくいく。

- 面の集合はパッチ面として出力される。

- ボリュームの集合はCellZoneになる。

- unv形式で出力する。

#メッシュの返還
unvファイルを次のユーティリティで変換する。変換時にはケースディレクトリの構成が必要。

```
$ ideasUnvToFoam <unvファイル>
```

boundaryファイルでは定義していた面集合が「type patch」として登録される。

#まとめ
6面体ベースのメッシュを作成する場合はSalomeは有用な一つの手段となる。面やセルゾーンも作れるので、オーバーセットメッシュやに層流領域のメッシュ作成に使える。
指定したフォルダが存在する場合にフォルダ名に日時を追加する

ちょくちょく使うのに毎度うろ覚えで一々調べなおしてた。今日仕事で作ったので忘れないうちにメモメモ　φ(。_。;)


#if文
windowsコマンドのifは以下の書式

```bat


if 条件式　命令1　[else　命令2]

```

条件式が真の時は命令1、偽の時は命令2を実行する。else句は省略可。
命令文中にスペースが入る時は( )で囲む

指定したファイル・フォルダの有無を条件にしたい場合は下

```bat

@rem 指定したファイルが存在するかどうかを条件にしたい場合
if exist ファイル名 命令1　[else　命令2]

@rem フォルダの場合
if exist フォルダ名/ 命令1　[else　命令2]

```

#move（フォルダ名の変更）
ファイルやフォルダを移動するコマンド。
書式は以下

```bat

move　移動元　移動先

@rem 同名ファイルがある場合に強制的に上書く
move /Y 移動元　移動先

@rem 同名ファイルがある場合に上書きするか確認する
move /-Y 移動元　移動先

```

移動元と移動先のフォルダを同じにして、別の名前を指定すれば名前変更ができる。

#ファイル・フォルダ名に日時を入れる
システム日付と時刻はそれぞれ%date%、%time%という環境変数に入ってる。
確認

```bat

C:\>echo %date%
2017/12/05

C:\>echo %time%
23:20:48.79

```

だが、このままだと/や:のようなファイル名に使えない特殊文字が入っている。
そこで、変数から特定の文字列だけを抜き出すために以下の方法で抽出します

```

%変数:~開始位置,文字数%　

```

ここで、開始位置はセパレタといって、文字と文字の隙間に振られている番号
例えば"takagari"という文字列があったとして
![image.png](https://qiita-image-store.s3.amazonaws.com/0/219335/8b6d1e38-157c-8a2f-4540-cdf7a156a0ac.png)
こんな風になってる。

なので、5文字目の"g"が欲しい場合、4番目のセパレタを指定しないといけない。
（とか小難しく考えるより、普通に「先頭から数えて捨てる文字数」って考えた方が早いか）

上のYYYY/MM/DD形式の%date%とhh:mi:ss.ss形式の%time%から"MMDD-hhmi"を作るには下のようにする。

```bat

c:\>echo %date:~5,2%%date:~8,2%-%time:~0,2%%time:~3,2%
1205-2344

```

#まとめ
ここまでやった事を合体させて
hogeフォルダが存在する場合にフォルダ名をhoge_MMDD-hhmiに変更するコマンドはこうなる

```bat

if exist hoge/ (move /-Y \hoge \hoge_%date:~5,2%%date:~8,2%-%time:~0,2%%time:~3,2%)

```

#参考にしたサイト
この辺
https://www.k-tanaka.net/cmd/move.php
http://www.atmarkit.co.jp/ait/articles/0405/01/news002.html
https://qiita.com/sawa_tsuka/items/8edf3d3d33a0ae86cb5c