OmniAICreator/Qiita-1.07M huggingface dataset:
Sketchを導入したら必ず入れるべきプラグイン７選（2017年12月）

[エイチームライフスタイルアドベントカレンダー2017](https://qiita.com/advent-calendar/2017/ateam-lifestyle)、19日目です！
[株式会社エイチームライフスタイル](http://life.a-tm.co.jp)のデザイナ @manoo が担当します。

# はじめに

突然ですが、[Sketch](https://www.sketchapp.com/)のプラグインを紹介している記事ってたくさんありますよね。
しかし、情報が古い記事が増えてきていて、今となっては入れなくても良いプラグインがたくさんあります。
年末年始にSketchを触る方も多いと思いますので、数年Sketchを使っているデザイナの私が、今必須といえるプラグインを７つ紹介します。

# :trophy: 必ず入れるべきプラグイン７選 :trophy: 
## [Sketchpacks](https://sketchpacks.com)
![1@1x.png](https://qiita-image-store.s3.amazonaws.com/0/125665/d8ad2c72-0ab1-6530-b3d5-a985433d05a7.png)

Sketch用のプラグインマネージャーです。
プラグインを探したりインストール/アンインストールも出来て便利です。
他のプラグインマネージャもありますが、今はSketchpacksが一番見やすく使いやすいと思います。

## [Craft](https://www.invisionapp.com/craft)
![2@1x.png](https://qiita-image-store.s3.amazonaws.com/0/125665/f8ea959b-517c-f18b-2c15-cb2860092028.png)

Sketchのプラグインの中で１番優秀だと思います。
フリーハンドでメモ、アセットの共有機能、JSONやWeb上の画像やテキストデータを自動挿入、要素の自動複製、なんといってもこれを入れるだけで **プロトタイピング** ができるようになります。
とても素晴らしいプラグインなので、入れてみて色々触ってみてください。

## [Sketch Runner](http://sketchrunner.com)
![3@1x.png](https://qiita-image-store.s3.amazonaws.com/0/125665/60397599-aee3-5342-83f8-1a5fd112bab5.png)

プラグインの管理やシンボルの検索・挿入、Sketchのメニューアクションを一発で実行できるようになります。一度入れて慣れてしまうと離れなれなくなるプラグインです。

## [SketchCleaner](http://www.sketchcleaner.com)
![4@1x.png](https://qiita-image-store.s3.amazonaws.com/0/125665/03b55523-bc2e-810f-b5ef-7e5c73e167ab.png)

使っていないレイヤーを削除、命名規則に従ってレイヤー名の変更など。
レイヤーを整理するプラグインですね。作業をしていると必ずレイヤーは複雑になっていきます。
手動で整理するのは非常に効率が悪いです。このプラグインにすべて任せましょう。

## [Symbol Organizer](https://github.com/sonburn/symbol-organizer)
![5@1x.png](https://qiita-image-store.s3.amazonaws.com/0/125665/0596b265-a669-d2e2-2c24-0af4b10b3b4c.png)

Sketchのシンボルページに生成されたシンボルを自動で整理できるプラグイン。Sketchでデザインデータを制作する際、必ずシンボルを作成することになります。そんなとき、このプラグインがあれば一瞬でシンボルを整理整頓してくれます。

## [Auto Layout for Sketch](https://animaapp.github.io)
![6@1x.png](https://qiita-image-store.s3.amazonaws.com/0/125665/b670b235-cce0-96ad-efe3-e0d242cf89ee.png)

デザインをレスポンシブに対応させながら制作できるようになります。
ですので、複数の画面サイズを意識したデザインを制作する際は、Auto Layoutは必須なプラグインとなります。

## [sketch-relabel-button](https://github.com/kenmoore/sketch-relabel-button)
https://www.youtube.com/watch?v=14IKFvKiNqM
Sketchでボタンのラベルの中にあるテキストを変更した際に、
余白サイズをキープしたまま、ボタンを変形してくれるプラグイン。
Sketchでデザイン制作をしていくと必ず欲しいと思う余白サイズをキープしたまま、ボタンを変形を叶えるプラグイン。



# おわりに
![7@1x.png](https://qiita-image-store.s3.amazonaws.com/0/125665/17b42169-1ed0-2ed3-f1af-2d79540e0abd.png)

今年は[Adobe XD](http://www.adobe.com/jp/products/xd.html)のアップデート。来年は、[InVision Studio](https://www.invisionapp.com)、[Evrybo](http://evrybo.com/)、[Studio](https://studio.design/)など、新しいデザインツールの正式なリリースが控えてますね。今後、どのデザインツールを導入したら良いのだろうと悩む方も多いと思います。
そんな方には、長谷川恭久さんの[「現場で必要なデザインツールの見つけ方」](http://www.yasuhisa.com/could/article/design-tool-for-you/)という記事を紹介しておきます。ぜひ、参考にしてみてください。
新しいから使うのではなく、現場で抱えている課題は何かを見極めた上でツールを選ぶと、皆Happyになれると思います。

最後までお読みいただき、ありがとうございました！

[エイチームライフスタイルアドベントカレンダー2017](https://qiita.com/advent-calendar/2017/ateam-lifestyle)、
明日はイケメンエンジニア @hytkgami が「エンジニアがインターンを設計・運営して学生満足度100%を獲得した話」について書いてくださるそうです！お楽しみに！

---

[株式会社エイチームライフスタイル](http://life.a-tm.co.jp/)では、一緒に働けるチャレンジ精神旺盛な仲間を募集しています。興味を持たれた方はぜひエイチームグループ採用サイトを御覧ください。
http://www.a-tm.co.jp/recruit/
Pythonista 3とDropboxのファイルを連動させる

Pythonista 3 とPCで作成または取得したファイルを共有する方法を色々探しましが、Dropbox File Picker.pyやその他の方法を使ってもエラーが発生しうまくいかず。
最終的にSynchronatorのスクリプトを用いて共有できましたので、備忘録用に記事を残しておく。


#環境
OS:macOS Sierra version 10.12.6
pythonista: 3


#インストール

まずは[Github](https://github.com/markhamilton1/Synchronator/tree/master)よりスプリプトをダウンロードしてきます。

取得したDropboxSetup.pyとSynchronator.pyのプログラムのテキストをコピーして
何かしらでiOSのデバイスに送ってください。
（メモ帳やらメールやら）

#Dropbox Developers App の作成
Dropbox DeveloperにてAPPを作成します。
APP name :Synchronator-(任意)
Type :App folder

作成すると編集ページに飛ぶと思うのでアクセストークンを生成し、コピーしておきます。


#Pythonista 3 にてスクリプトを実行

pythonista 3 にて新規にスクリプトを2つ作成し、ダウンロードしたDropboxSetup.pyとSynchronator.py
のプログラムをコピーしてください。

Synchronator.pyを実行します。
(DropboxSetup.py は実行しません。)

コンソールにてアクセストークンの入力が要求されるので、
先ほど取得したトークンを入力します。

これでpythonista 3 とDropbox のファイルが共有されているはずです。
三角形と外積

# はじめに

三角形は素晴らしいです。この記事では回転方向から三角形と点の内外判定までを説明します。(数学的な話がありますが、本当に正しいかどうかは保証できませんのでご了承ください...)


# 時計回りか反時計回りか

2次元平面上の一直線上に並んでいない3点を順番に結ぶと、それは時計回りか反時計回りかのどちらかに区別することができます。点O, A, Bを `O → A → B` の順で結ぶと時計回りで、 `O → B → A` の順で結ぶと反時計回りとなります。

![3 points](https://gyazo.com/f97a00b6aa84918e5fd005a2978c74a9.png)


### ベクトルの外積

ここで、いきなりですがベクトルの外積について覚えていますか？

$$(a_x, a_y, a_z) \times (b_x, b_y, b_z) = (a_yb_z-a_zb_y, a_zb_x-a_xb_z, a_xb_y-a_yb_x)$$
$$\big| \vec{a} \times \vec{b} \big| = \big|\vec{a}\big|\big|\vec{b}\big| \cdot \big|\sin\theta\big|$$

また、外積は2つのベクトルに対して直交するベクトルを得られることでも知られています。よって、XY平面上に限るなら以下のようにも言い換えられます。

$$\vec{a} \times \vec{b} = \big(0, 0, \big|\vec{a}\big|\big|\vec{b}\big|\sin\theta \big)$$

ここで $\theta$ の範囲は $0$ から $2\pi$ (もしくは $-\pi$ から $\pi$ )です。 $\sin\theta$ は $\theta \in (0, \pi)$ で正、 $\theta \in (\pi, 2\pi)$ で負を取るため、外積のzの値から $\theta$ が $(0, \pi)$ か $(\pi, 2\pi)$ 、または $0, \pi$ のどれに属しているかを判定することができます。 (0のときは $0, \pi$ のどちらか)


### θはなにを示しているのか

![theta](https://gyazo.com/e87055d68067aca87da52e01da59ace8.png)

この画像は $\vec{OA} \times \vec{AB}$ における $\theta$ を表した図です。$\theta$ とは、始点を原点に移動した際の $\vec{OA}$ から $\vec{AB}$ へ **反時計回りを正とする回転角** のことを指します。
なぜ反時計回りなのかというと、別に時計回りでも問題はありません。みなさんが高校時代に勉強した三角関数もxy座標軸に対して反時計回りを正として考えていました。これは座標系が右手系であるからです。座標系が左手系である場合は時計回りを正とすればいいのです。


### 時計回りと反時計回りの違い

ここで、時計回りと反時計回りはどのような違いがあるのかについて考えてみましょう。答えは簡単です。 $\theta$ が $(0, \pi)$ の範囲内か $(\pi, 2\pi)$ の範囲内であるか ( $0, \pi$ のときは一直線に並ぶ) です。左手系ならば、 $\theta \in (0, \pi)$ で時計回り、 $\theta \in (\pi, 2\pi)$ で反時計回りであり、右手系ならばその逆です。実際に紙に書いて確かめてみるとわかりやすいでしょう。


### 判定

ここまでの話から、点を結んだ順路は外積によって時計回りか反時計回りかを判定することができそうです。時計回りである `O → A → B` の順で結んだ場合について考えます。

![OAB](https://gyazo.com/84a18b6a746622226aa7b814f664c386.png)

$\vec{OA} \times \vec{AB}$ について、 $\theta \in (0, \pi)$ (見た目から判断してます😅) と考えられるでしょう。すなわち時計回りです。外積のzの値は $\big|\vec{a}\big|\big|\vec{b}\big|\sin\theta$ であることから、正であると言えます。
つまり、左手系のXY平面上の順路 `O → A → B` について、 $\vec{OA} \times \vec{AB}$ のzの値が正ならば時計回り、負ならば反時計回り (0ならば一直線に並んでいる) ということがわかりました。


# 三角形と点の内外判定

[点と三角形の当たり判定( 内外判定 )](http://www.sousakuba.com/Programming/gs_hittest_point_triangle.html)

ここまでを理解できたあなたならば、この記事がどのように内外判定を行えているのかを理解することができるでしょう。

![内側判定](https://gyazo.com/fb63aac91aa6437436d8e8c3546b4c2d.png)

このように点が内側にあるときは、赤と緑、青色の順路の回転方向が一致します。

![外側判定](https://gyazo.com/f6bad9bc656a199744b36f3187faeb8a.png)

このように点が外側にあるときは、順路の回転方向が一致しないということです。よって外積によって求めるということができるのです。


# おわりに

以上、外積と回転方向の関係性について学びました。今回はXY平面上に限ってしまいましたが、3次元平面上の3点に対してそのすべてを含む平面は一意に決定するため、このお話を3次元に拡張することが可能だと思います。(めんどくさいので証明とかはしてません)
［Ruby/Rails］PAY.JPを利用したクレジットカード決済の実装

## 共有すること
![スクリーンショット 2017-12-18 4.43.57.png](https://qiita-image-store.s3.amazonaws.com/0/199441/4a05cfb0-d7a8-4506-566b-be31b589c319.png)

### 開発環境
Ruby 2.4.1
Rails 5.1.4

### コード例
```command:command
rails new sample
cd sample
rails g controller home top
```

```ruby:congfig/routes.rb
Rails.application.routes.draw do

  get 'home/top'
  post '/pay' => "home#pay"

end
```

```ruby:home_controller.rb
class HomeController < ApplicationController
  protect_from_forgery except: :pay

  def top
  end

  def pay
     Payjp.api_key = 'テスト用秘密鍵'

    token =Payjp::Token.create(
    :card => {
    :number => params[:number],
    :cvc => params[:cvc],
    :exp_month => params[:exp_month],
    :exp_year => params[:exp_year]
  }
)

    charge = Payjp::Charge.create(
      :amount => 10000,
      :card => token.id,
      :currency => 'jpy',
    )

    redirect_to "/home/top"

    flash[:notice] = "支払い完了"

  end
end
```

```views/home/top.html.erb
<h1>PAY.JPを利用したクレジットカード決済の実装</h1>

<% if flash[:notice] %>
<%= flash[:notice] %>
<% end %>


<%= form_tag("/pay",method:"post",datakey:"テスト用公開鍵") do %>


  <input type="text" name="number" maxlength="16" placeholder="カード番号"><br>

  <input type="text"  name="cvc" maxlength="3" placeholder="CVC"><br>

  <input type="text" name="exp_month" maxlength="2" placeholder="月">
  <input type="text" name="exp_year" maxlength="4" placeholder="西暦（４桁）"><br>

  <input type="submit">
<% end %>
```

### 実行結果
```command:command
rails s
```

http://localhost:3000/home/top にアクセス
↓
PAY.JPで指定されたクレジットカード情報（ダミー）を入力
↓
「送信」ボタンを押す
↓
flash[:notice]が表示され、PAY.JPのダッシュボードに売り上げ情報が反映される。

### 参考資料
PAY.JP https://pay.jp/
社会人大学院生のとある日常3Q編

#限定公開中
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211326/dcca7c6b-d52c-a82d-78cd-c1d2b123b4dc.png)A3：2Q編読んだけど、いい大人が悔しくて大泣きするって痛すぎるね。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211326/55af63d2-e62e-e2df-bd88-fab18024c0d7.png)ピーちゃん：働きながら学校に通うのは体力的にくるんだろうね～。だからメンタルがもろくなるんじゃない？？？
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211326/ca49dfa8-9db6-12e0-436f-e922caee0496.png)A3：やっぱり痛い人だってことはよくわかったけど、励ましてくれる友だちがいてよかったよね！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211326/6be0606a-9cec-7d94-48e7-c5a254482ba7.png)ピーちゃん：ひよこも人間も一人では生きていけないから周囲のサポートは必要だと思う☆
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211326/ca49dfa8-9db6-12e0-436f-e922caee0496.png)A3：つらいときはやっぱり友だちなのはひよこも人間も同じだね！それにしても、この院生ちゃんと単位取れるのかな？？

プログラミングネタをまとめる時間がなくて書き溜めていた3Q 編・・・25日なので削除しました。
[社会人大学院生のとある日常3Q編]
社会人大学院生のとある日常2Q編

#限定公開中
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211326/dcca7c6b-d52c-a82d-78cd-c1d2b123b4dc.png)A3：1Q編読んだけど、なんか院生なのにターミナルがどこにあるかわからないってやばい人だったね・・・
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211326/55af63d2-e62e-e2df-bd88-fab18024c0d7.png)ピーちゃん：しかも、WordにSSH書く人ってたぶんこの院生だけだろうね。。。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211326/ca49dfa8-9db6-12e0-436f-e922caee0496.png)A3：痛い人だってことはよくわかったけど、やる気だけはあるっぽかったよね。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211326/6be0606a-9cec-7d94-48e7-c5a254482ba7.png)ピーちゃん：ひよこも人間も初めて挑戦するときはたくさん痛いことをしまうものなのよ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211326/ca49dfa8-9db6-12e0-436f-e922caee0496.png)A3：2Q編も先が思いやられるね・・・

今回もカレンダーを埋めるお手伝い。大学院での日常を振り返っただけのブログのつづきです。25日なので削除しました。
[社会人大学院生のとある日常2Q編]
Azure Notebooks で GitHub からクローンするのにおすすめの repository 集

[Azure Notebooks 活用の tips](https://qiita.com/kozo2/items/cc6444e6bc02374e18ad)
で
「Azure Notebooksでgithubのrepositoryのclone機能を使うのがおすすめ」
とお伝えしました。

この記事ではそのcloneにおすすめのrepositoryを列挙したいと思います。
一部のrepositoryには [binderの紹介](https://qiita.com/kozo2/items/fef4ee9c175f941a8a59) でお伝えしたbinder環境へのリンクが用意されているものもあります。

### [Python Data Science Handbook by Jake VanderPlas](https://notebooks.azure.com/jakevdp/libraries/PythonDataScienceHandbook) 
  
Azure Notebooks サイトトップで `Featured: ` として取り上げられている repository です。
すでにAzure NotebooksのLibraryとして著者公認でクローンされており、githubからクローンする必要もありません。

### [Materials and IPython notebooks for "Python for Data Analysis" by Wes McKinney, published by O'Reilly Media](https://github.com/wesm/pydata-book)

Pandasの作者であるWesさんの書籍のnotebook集です。
[Azure Notebooks 活用の tips](https://qiita.com/kozo2/items/cc6444e6bc02374e18ad) で紹介したようにこのrepositoryのREADMEには `launch azurenb` のバッジが用意されています。
また本家本元のこのrepositoryから中国語翻訳版へのリンクがあるので、翻訳物を作成しそれを公開することは歓迎してそうです。
もし日本語版の作成に興味がある方は是非。

### [foundations-for-analytics-with-python](https://github.com/cbrownley/foundations-for-analytics-with-python)

O'Reilly社書籍 [Foundations for Analytics with Python: From Non-Programmer to Hacker](https://www.amazon.com/Foundations-Analytics-Python-Brownley/dp/1491922532) に関連するすべてのPythonスクリプト、入力ファイル、および出力ファイルが含まれています。
ipynb形式ではありませんが段階を経た説明(を行うスクリプト)で初学者にやさしい作りとなっています。
副題の通り `From Non-Programmer to Hacker` といった層にはおすすめです。

### [The compiled, clean (not run) Jupyter notebooks for Elegant SciPy](https://github.com/elegant-scipy/notebooks)

O'Reilly社書籍 [Elegant SciPy](https://www.amazon.com/_/dp/1491922877?tag=oreilly20-20) の notebook 集です。
バイオインフォマティクス色が濃いので万人におすすめとはいかないものの、準備に面倒なデータが同梱されているのが助かるので挙げました。
[binder環境へのリンク](https://mybinder.org/v2/gh/elegant-scipy/notebooks/master?filepath=index.ipynb)もあります。

### [A series of Jupyter notebooks that walk you through the fundamentals of Machine Learning and Deep Learning in python using Scikit-Learn and TensorFlow.](https://github.com/ageron/handson-ml)

O'Reilly社書籍 [Hands-On Machine Learning with Scikit-Learn and TensorFlow](https://www.amazon.com/_/dp/1491962291?tag=oreilly20-20) の演習のサンプルコードと解答を含む、機械学習の基礎が学べるnotebook集です。

以上。
AndroidのARをUnrealEngineを使用した開発環境を構築を目指す

GoodpatchでAndroidエンジニアをやらせていただいている木村です。
VRやARについて前々から興味があったので、Unreal Engineもこの機会に触ってみました。
結果自分が思っている所まで出来なかったですが、途中までの内容を残します。
タグ等は開発環境をきちんと構築出来た時に修正します

## Windows環境で開発するために必要なもの
- Visual Studio 2013 バージョン以下の開発環境を用意
- CodeWorks for Android 1R6u1
- EPIC Games Launcher
- ARToolkit

## 作業手順
http://www.unreal4ar.com/documentation/ の手順に従い環境構築を進める

1. Visual Studio 2013 をインストール（コミュニティ版で問題ない）
2. CodeWorks for Android 1R6u1をインストール
3. EPIC Games Launcherをインストール
4. Launcher を起動しUnreal Engineをインストール
5. 新規にプロジェクトを作成
6. Android用にビルドの設定を変更し、AndroidをUSBに繋ぐ
7. Androidを指定しプレイ起動できる環境を確認する（筆者はここからうまくできなかった）
8. プロジェクトにARToolKitを取り込む
9. Androidを指定し実行できたことを確認する

## まとめ
ギリギリまで作業し、環境構築環境が完了しできたところをお見せしたかったのですが
ダウンロードとインストール自体に結構時間が取られます、時間がある時にインストール等の準備は進めておくとよいと思います。
ビルド自体に結構負荷がかかり色々試していたら時間が足りなくなったので、
いずれ追記します。
基本構文

内容はバージョン３をベースにしています。
#コメントアウト
行単位は``#xxx``
範囲指定は下記です。
ダブルクォーテーション(")3つでも可能であり、シングルクォーテーション(')とのネスト構造も可能です。
※インテンドの位置は前述に合わせないとエラーになります。

```
'''
ここがコメントアウト
'''
```


#構文の区切り
①基本は改行で区切りになります。
②セミコロン(;)は改行の代わりになるので、1行にまとめられます。
③長文などの場合にスクリプト上のみで改行する場合はバックスラッシュ(\\\)を使います。
④リスト([...])、タプル((...))、辞書({...})はカンマの区切り箇所であればバックスラッシュ(\\\)は省略できます。

```python3:base_sample.py
#!usr/bin/python
# -*- coding: UTF-8 -*-
#①
print('Hello')
print('Python!')
#②
print('これも'); print('改行')
#③
a = 1 + 2 +\
3 + 4\
+ 5
print("1+2+3+4+5="+str(a)+"は複数行で構成されています。")
#④
print('この文、'
      '実は3行で'
      '構成されています。')
print([1, 2, 3,
       4, 5, 6,
       7, 8, 9])
```

```
# python3 base_sample.py
Hello
Python!
これも
改行
1+2+3+4+5=15は複数行で構成されています。
この文、実は3行で構成されています。
[1, 2, 3, 4, 5, 6, 7, 8, 9]
```




#インデックス

前回：[pyファイルの書き方](https://qiita.com/billy-attack/items/8487eb282727d4834230)　　次回：[未定](https://qiita.com/billy-attack/items/89e410a4a218a09b89c4)

[Topのインデックスに戻る](https://qiita.com/billy-attack/items/89e410a4a218a09b89c4)
昔働いていて「良いな」と思ったIT会社の文化

転々と会社をホップしてきたため、無駄に多くの文化に触れました。

悪かったところを共有しても角が立つだけなので良かったところだけ紹介します。ある特定の会社の話ではなく、いろんな会社の良いとこ取りの話です。経営者の方々のご参考にでもなればと。

## 人間
### 上層部が偉ぶってない
社長とかから対等な目線で元気な挨拶されると気持ち良い。

### 知らない顔でもちゃんと挨拶する
別に会釈だけも良いんですよ。知らない間柄でも同じフロアにいる同士は挨拶していきましょう。

### 愛想が良い・紳士的
大事。人間は感情の生き物なのです。

### 愚痴を聞いてくれる人がいる
自分は「愚痴を聞いてもらうためのMTG」を設けてました。

まぁ問題点の共有です。

## 習慣
### 全員朝の定時に揃ってる
これは難しいことかもしれませんが、実現するとかなり効果的です。
相談したい相手が常に同フロアにいるという安心感。

### チャットのレスポンスがめっちゃ早い
意思決定者からの応答が早いと本当に助かる。

### 定期的に自分たちで掃除してる
毎週決まった時間になると一斉に皆が動き出して、キーボードの掃除したりディスプレイとか机の表面拭いたり、床の掃除機かけたりしだす。

あの感じはなかなか祭り感があって良いです。良いコミュニケーションのきっかけにもなっていると思う。

※基本的に業者は床掃除等はしてくれますが机の上についてはノータッチなのですよ。

### ちゃんと休める
みんな躊躇なく休むときは休む。
会議予定があってもなんのその、育児があれば育児が優先。

会議なんていつでもリスケできますがな。

## 学習意欲
### ちゃんと勉強している人が多い
別にプログラミングに限った話じゃないんだけど。
業界の時事ネタをチェックしてる程度でも「えぇやん」って気分になります。

### 社内勉強会が定期的に（しかも定時内に）ある
毎週の決まった時間に社内勉強会（参加自由）がある。
発表者は固定にせずに持ち回りというのが良いです。

### 社外勉強会もある
参加者を社内に限定せず社外の人も参加できるような勉強会をちょくちょく開いてくれるところ、印象良いです。ちゃんと社外にも通ずる技術を保持していないとできないことです。

### ペアプロする余裕がある
これは本当に良いです。人のやり方（コーディングだけでなくツールの使い方等）を学び合えます。

余裕のあるところは [モブプロ](https://qiita.com/takus69/items/d399d31073a260a888b1) なんかも試してみてください。

### 新規学習に躊躇が無い
今使っているツールを手放して新しい優れたツールを学習することに躊躇が無い。

## 透明性
### 情報探索が楽
自プロジェクト内で必要な情報は検索一発で必要な情報のあたりが付く。

### 他プロジェクトの情報もオープン
他プロジェクトのリポジトリも見れたりして、余裕あれば他プロジェクトの  GitHub レビューをしたりもできる。

### チームリーダーがちゃんと仕事をする
チームリーダーに伝えた要望や提案が、ちゃんと上層部に伝達されて、そのフィードバックが共有される。（というのがずっと当たり前だった環境にいた人は幸せですね）

### 障害は全部記録に残す
障害内容と対策内容の記録。あとからそういうの見れると助かる。

### 障害の犯人捜しをしない
障害のコミット探しはするけど。該当者には「ドンマイ」。

人はミスをするので運用やシステムでカバーしましょう。

### 会議室がガラス張り
中身丸見え。誰と誰がどういう雰囲気で話してるのか分かるし、会議室の空き状況も一目瞭然。

まぁ本当の機密の話し合いは不透明な会議室でやってください。

### エキスパートの所在が明確
分からないことがあるときに相談する相手が誰だかが分かりやすく共有されているとありがたい。

### 全体チャットで質問できる
技術特化チャットなどに質問をすると回答が得られる可能性が高く、重宝。もちろん自分が答えに回ることもある。

## 運用
### プログラマ以外も Git 使ってる
不慣れだけど一生懸命触っている。触ることが大事。そのうち慣れます。

### プログラマ以外もスクリプト書いてる
デザイナがMayaのシェーダーとか書いてる。尊い。

## 機材・福利厚生
### カジュアルに高スペックマシンが使える
言えば貸してくれる。

### 曖昧に休憩できるソファ等がある
タバコ吸わない人からすると何かしらの小休憩スペースが必要。
会議予約されないタイプのソファ、良いですよ。

### 自販機・お菓子箱がある
これは最近だとよくありますね。グリコさん等がそういうサービス提供しています。

### シンクライアント
シンクライアントがが導入されているとその日の気分で好きな作業場所を選べる。どこで作業しても同じデータが参照できるので。

でもだいたい習慣で同じ場所に座っちゃうんだけど。
ちょっとずつ読むドメイン駆動設計 第四部 戦略的設計 第十四章 モデルの整合性を維持する2 境界づけられたコンテキスト 

# これまでの十四章
[第四部 戦略的設計 第一四章 モデルの整合性を維持する](https://qiita.com/YasuhiroKimesawa/items/6e8e5503a05ce9515a79)

# 境界づけられたコンテキスト
## 境界を定める
前回読んだように、システム全体で一つのモデルを持つことにはあまり得られるものはなく、コンテキストごとにモデルを持ち、何をどう統一し、何を統一しないかを決める方法が必要と書きました。

その境界をどうするか。それについてはほとんどの場合不明瞭とEvansは述べています。
それを明確するには**プロジェクトと最終成果物(コード・データベーススキーマ)の両方を見なければならない**ということです。

明示的な境界は**チーム編成、アプリケーションに特有の部分が持つ用途、コードベースやデータベーススキーマなどの物理的な表現などの観点から設定**すること。

境界内では、モデルを一貫性のあるものに保つことが求められます。

## 境界を定める効果
チームのメンバーは一貫性を持つものが何かが理解しやすくなり、他のコンテキストとどう関係づけるか明確な理解を共有できるようになります。

他のコンテキストは他のモデルが適用されますが、用語法・概念・ルール・ユビキタス言語が該当のコンテキストと異なります。なので、その区別が付くというのは大きな効果だと思います。

## コンテキスト内での分派
サブシステムごとにチームが分かれていたり、ソースリポジトリが分かれていたりすれば、境界は引きやすいと思います。

難しいのは、同じチームの同じリポジトリのソースでも不明瞭な境界があるかもしれないというところ。サブシステムの分け方も間違っているかもしれない。
そこで、常に注意すべきは**重複した概念**と**偽同族語（false cognate)**です。

- **重複した概念**・・・ 複数の要素が実は同じ概念を表現していること
- **偽同族語**・・・ 同じ用語を使って話しているつもりが実は別々のことであったということ

重複した概念では１つの修正で２箇所修正が必要になってくる。
偽同族語はコードに矛盾が生じ、データベースのデータにも矛盾が生じてくる。チーム内の会話も混乱する。

こうしたことに気がつくか気がつかないかがとても重要でとても難しい。
気がついたら、問題に対してどうするべきか。判断を下す必要が出てくる。

その問題の対処の仕方は明日引続き読んでいきます。

## マイクロサービスでのコンテキスト境界
マイクロサービスでのサービス分割にコンテキスト境界の考え方が役に立つと言っているのが、実装ドメイン駆動設計のVaughn Vernon([InfoQ マイクロサービスとドメイン駆動設計に関するVaughn Vernon氏の意見](https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwiR-4qxv5HYAhXIvbwKHdnhAqYQFggnMAA&url=https%3A%2F%2Fwww.infoq.com%2Fjp%2Fnews%2F2016%2F08%2Fmicroservices-ddd-vernon&usg=AOvVaw2qC16QwnGSvmlp3q3S0ywE))。
一つの境界づけられたコンテキスト毎に一つのサービスから始めることを推奨しています。

Evansも、最低でもサービスとコンテキストの一対一の関係が生まれると言っています。([InfoQ DDD、マイクロサービス、境界についてEric Evans氏が語る](https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cad=rja&uact=8&ved=0ahUKEwiR-4qxv5HYAhXIvbwKHdnhAqYQFgguMAE&url=https%3A%2F%2Fwww.infoq.com%2Fjp%2Fnews%2F2015%2F06%2Fdddx-microservices-boundaries&usg=AOvVaw0l-LEKVQY3_KW2YKSY-K28))

まあ、上記で見てきたとおり、その境界を定めるのが難しいのですが・・・

> 高いレベルから考えることができる優秀なエンジニアがシステム内でドメインと境界付けられたコンテキストを見つけることができる。

とEvansも言っていますね。
社会人大学院生のとある日常1Q編

#限定公開中

![image.png](https://qiita-image-store.s3.amazonaws.com/0/211326/dcca7c6b-d52c-a82d-78cd-c1d2b123b4dc.png)A3：あれ～？今回はプログラミングじゃないの～？
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211326/55af63d2-e62e-e2df-bd88-fab18024c0d7.png)ピーちゃん：みんな課題におわれてブログ書いている余裕がないのよ。だから落ちこぼれ大学院生の日常ブログをUPするはめになったのよ。。。。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211326/ca49dfa8-9db6-12e0-436f-e922caee0496.png)A3：とっても需要なさそうだね。。。。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211326/6be0606a-9cec-7d94-48e7-c5a254482ba7.png)：しー！聞こえたら、すぐ引きこもるとか言うめんどくさい院生だから心の中で言ってあげて！

大学院での出来事を振り返ったブログです。25日なので削除しました
[社会人大学院生のとある日常1Q編]
G'sでのswift歴3ヶ月半を振り返る

テクニカル的なことを書こうと思いつつ、結局ポエムになりそうです。
どうもスナックあきえのママです。

G'sを見学したのが7/17,IDEA試験の企画書提出したのが7/19,入学式が7/22という、おそらく最短スケジュールでDEV8期に滑り込みました。

仕事は社会インフラ系Sierぽいところで、エクセル職人兼プリセールス・システムの導入支援をやっています。
プロジェクトが落ち着いたのを機に念願のプログラミングをやりたくて8期にJOINしました。
今日はDEV＋swiftコース選択を悩んでる人のために、自分のことを振り返ります。

その前にG's Academyって？という方は[こちら](https://gsacademy.tokyo/)を見てね😍


# ■swift経歴
## swiftやるまでの話
SQLはわかるのですが、プログラミングはほぼやったことがなかったです。
なので7月末にやりはじめたJavaScriptが実質はじめての言語です。
（その前にscalaを3ヶ月ぐらい自習でつまんでましたが、あまりうまくいってなかった。）

## swiftやってからの話
iOSコースが始まったのは9/2でした。
そこから2ヶ月ちょっとの学習期間を経て、卒業制作を迎えている最中です。
なので、やりはじめてからは3ヶ月半ほどになります。

# ■iOSを選んだ理由
①やりたかった企画がモバイルベースだった
②JSもそこそこ楽しく取り組めたので、swiftもやれるかなーと思った
③（実は）WEBデザインがとても苦手だった
デザインが本当に苦手で、PC画面サイズでモダンなデザインを要求されても何にも考えられなかったので、ビジネスロジックに集中できるという前評判のswiftは本当に魅力的でした。

swiftやるのは当日までギリギリ悩んで提出した記憶があります。

# ■やってみた感想
トータルでみるとすごくいいです。swift好きだし、もっちーが先生でよかった。
でも努力とappleへの信仰心は求められるので、デメリットも書いておきます。

## メリット
・言語自体はとてもわかりやすい。
　1画面1コントローラー1クラスだから、直感的に書けるような気がします。
・（初心者には）やさしいXcode
・storybordもパワポかってぐらい触りやすい（最初は。）

## デメリット
・（慣れるほどに）つらみが増すXcode
　再起動かけないとだめだったりとか、言うこと聞いてくれなくなる（私だけ？）
・UIパーツやプロトコルやライブラリを使いこなすのには少し学習コストがかかる。
　これは授業中にもっとやっておけばよかったと後悔しました。
・ググラビリティが生死を分ける
→swift2やObjective-CなどiOSアプリを作るにしても色々な言語があるので、swift3~~とかswift4〜〜とかを検索キーに入れるのは必須。

## コース自体に思うこと
・講師のもっちーをはじめ、一緒に受講してる先輩たちにも刺激をうける
　自分より6つ年下のもっちーがとにかくキラキラしてみえる。
　授業以上の価値をもっちーやiOSコースの皆と話すことで得られた気がします。
・1日も休んではならない
　進度が早いので、休まないことをお勧めします。

# ■やっておいた方がいいこと
最後に自分が卒業制作時期に入って、やっておいてよかった・やっておけばよかったと思ってることを書きます。

・課題は課題以上のことを必ずやる。
出した課題自体は最低限のことしかやってませんでしたが、それ以外に昼間()の仕事で新規企画のモック版を作成してたので、最低でも1日3-4時間は書いてました。あとwebコースの動画授業は結構1.5-2倍速で電車移動や睡眠前に見てました。
iOSコースに入ってからも、最初のころは授業と平行でschooで七島さんの動画みてましたけど、後半息切れした気がします。もっとやっておけばよかった...。

・Qiitaは書く。
限定公開でもいいと思います。私は結構メモ魔で限定公開等でとりあえず書き散らしたりしてたのですが、自分が卒業制作つくるときに過去の自分に助けられたりしました。たまに過去の自分すごいなって思います。

・定量的に自分を測る。
githubやbitbucketだと、コード何行書いたかが把握できると聞いて、それ以来定量的に自分を測るツールとして使用してます。自分ができたことを他人に報告するのが苦手なタイプなので、こうした客観的な指標はわかりやすくて頼りになりました。

・集中的にやる時間を作る。
13時間の金曜日（という徹夜のもくもく会）は、さすがに長すぎるのですがw
集中的に1週間に1度だけ、朝6時まで実施するのはすごくいいと思います。
卒業したあとでも偶数期ぐらいのサイクルで徹夜もくもく会やりたいなって思います。
（G'sスナック会員とともに募集中。）


とりとめなく記述しましたが、こんなところですかね！
充実したG'sでの日々が過ごせることを願っています。（ママより。）
Windows環境でVSCode+MSYSで快適に使う方法

**記事の内容に不備 (@lunateaさん、@yumetodoさんにご指摘いただきました) ＆ @yumetodo さんの過去投稿記事とネタかぶりがありましたので、以下記事は参考にしないでください……orz**

VSCodeを使うときに統合ターミナル画面が便利なので常時開きながら使っています。
MacなりLinuxなりだとBashなりなんなりとまともなターミナルが使えるのですが、Windows7だとデフォルトでcmd.exeとなるのが辛いところ。
なのでMSYS2を入れて快適なターミナル環境で使おうとしたけれど、ちょっとハマりどころがあるので共有します。

必要なもの
---

* [VSCode](https://www.microsoft.com/ja-jp/dev/products/code-vs.aspx)
* [MSYS2](http://www.msys2.org/)

手順
---

1. VSCodeはインストールされているものとします

2. MSYS2を`C:\msys64`にインストールします

3. VSCodeの統合ターミナル機能で利用するシェルの指定をします

ユーザ設定に素直に設定すると以下のようになると思いますが

```json
{
    ...
    "terminal.integrated.shell.windows": "C:\\msys64\\msys2.exe",
    ...
}
```

これでは上手く動作しません。

で、どうするかというと


---------------------

(12/18追記)

ここから↓ よろしくないようです。

```json:setting.json
{
    ...
    "terminal.integrated.shell.windows": "C:\\msys64\\vscode_bash.bat",
    ...
}
```
と設定して、`C:\msys64`フォルダの下に

```bat:vscode_bash.bat
@echo off
set CHERE_INVOKING=1 set MSYSTEM=MINGW64 & C:\\msys64\\usr\\bin\\bash.exe --login -i
```
というbatファイルを用意します。

これで無事VSCodeの統合ターミナル機能からmsys2を呼ぶことが出来るようになります。


ここまで↑ よろしくないようです。

---------

コメント欄で @lunatea さん、 @yumetodo さんに指摘していただいたところによると、引数なども指定できるようでした。

```json:setting.json
{
    ...

    "terminal.integrated.env.windows": {
        "CHERE_INVOKING": 1,
        "MSYSTEM": "MINGW64"
    },
    "terminal.integrated.setLocaleVariables": true,
    "terminal.integrated.shell.windows": "C:\\msys64\\usr\\bin\\bash.exe",
    "terminal.integrated.shellArgs.windows": [
        "-i"
    ],

    ...
}
```

で行けるようです。

あと`"terminal.integrated.setLocaleVariables": true`を指定することでpacman等が日本語表示されました。

詳細は @yumetodo さんの「[Visual Studio Code 15.1の統合シェルをMSYS2のbashにする](https://qiita.com/yumetodo/items/42132a1e8435504448aa)」をご参照ください。

---

それでは良いVSCodeライフを！
初心者が明日から使えるLinuxコマンド【簡易編】

こちらはDMM.com #1 Advent Calendar 2017 18日目の記事です。
前日の記事は@hayatanさんのCleanArchitectureを導入してみたい話でした。
カレンダーのURLはコチラ
-[DMM.com #1 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/dmm)
-[DMM.com #2 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/dmm2)

本記事は、Linuxコマンドをあまり触ってこなかった17卒入社の私がLinuxコマンドを覚え始め、使い始める内に学んだコマンド達の一部をできるだけ噛み砕いて紹介していく記事になっております。

#Linuxコマンドとは？
Linux系の`CUI`上で使えるコマンドです。例えば、ディレクトリを移動する`cd`コマンドやファイルやディレクトリ情報を表示する`ls`コマンドなどがあります。

#コマンド紹介
| コマンド名 | 説明 |
|:-----------:|------------|
| which | コマンドを探すコマンド | 
| test | 条件式の真偽を判定する。<br>ファイル・ディレクトリの有無や、数値・文字列の比較に使う |
| grep | 文字列を検索する。<br>前のコマンドと合わせて使うことが多い |
| split | ファイルを分割し、複数のファイルに出力する |
| tar |  ファイルを書庫化・展開する |
| scp | リモート・マシン間でファイルをコピーする |
| diff | ファイル間の差分を表示する。<br>-rオプションをつけるとディレクトリ内を再帰的に差分を表示する。 |
| trap | 実行中のプロセスに対して、さまざまなイベントを通知するために送出される<br>シグナルを捕捉し、あらかじめ指定されていた処理を実行するコマンド |
| xargs | 標準入力から生成したコマンドラインを実行する |
| sed | 文字列の置換、行の削除を行う。<br>stream editorの略で、非対話型のエディタ（処理の経過・内容を逐次ユーザに確認することはない） |

#コマンドの使い方
###which
`which`で`ls`コマンドを探すと`/bin/ls`にあるということがわかります。

```bash:whichコマンド
$which ls
/bin/ls
```
###test
数値の比較の例として、最初は真ということで`0`が返ってきます。
次の式では、偽（`1`）が返ってきます。
ちなみに、`$?`は直前コマンドの終了ステータスが返ってきます。
・コマンドが成功時には`0`失敗時には`０`意外（基本的には`1`）

```bash:testコマンド
$test 1 = 1 ; echo $?
0
$test 1 = 2 ; echo $?
1
```

###grep
`test.txt`内にある値10がある出現行数を数える。
ファイルの内容を閲覧する`cat`コマンドにパイプをつなげて、値が10にマッチした行を表示する。

```bash:grepコマンド
$grep -c '10' test.txt
4
$cat test.txt | grep '10'
710
1010
10
10
```
###split

`-b`オプションをつけると元ファイルをbytesで示したバイト数で分割し、出力する。

```bash:splitコマンド
$split -b 1000 test.tar out
$ls -l
2048 12 17 00:27 test.tar
1000 12 17 01:11 outaa
1000 12 17 01:11 outab
48 12 17 01:11 outac
```
###tar
`.tar`拡張子に圧縮することができる。オプションをつけると圧縮状況などもわかるようになる。
また、ここでは書かないが解凍も行うことができる。

```bash:tarコマンド
$tar -cvf test.tar test.txt 
a test.txt
$ls
test.txt
test.tar
```

###scp
sshでサーバにつなげるときにローカルのファイルをssh先のサーバにアップロードしたい時に使う。
使い方自体はcpコマンドと変わらずに、引数1はコピー元のパス（何を）、引数2はコピーの置き場（どこに）

```bash:scpコマンド
# ローカルからサーバーへ
$scp ~/temp/test.txt test@xxx.xx.jp:~/
# サーバーからローカルへ
$scp test@xxx.xx.jp:~/test.txt ~/temp/
```
###diff
`test.txt`をコピーした`test1.txt`を用意する。

```bash:diffコマンド
#test.txtの中間あたりに2000を追加
$diff test.txt test1.txt 
11d10
< 2000
```
###trap
プロセスに割り込む(Ctrl+c)シグナル時には`Hello`を出す。
こういった割り込みが起きた場合に関して、'コマンド'を実行できる。
コマンド部分はシングルクォートです。※バッククォートじゃない点が注意

```bash:trapコマンド
# コマンド部分はシングルクォートで囲む
$trap 'echo Hello' 2
# Ctrl + Cを押す
$ Hello
# 元に戻す
$trap 2
```
###xargs
`xargs`はシェルのバッククォートでコマンドを実行するのと同じようなものです。
それよりも、柔軟性がある書き方ができます。
デフォルトだと空白と改行の両方を区切り文字として扱ってしまうので、`xargs`が空白文字ではなくヌル文字を区切りとして扱うように`-0`を指定し、`xargs`の形式に合わせるために`find`の`-print0`を指定する。

```bash:xargsコマンド
$find ./ -maxdepth 1 -name "*.txt" -print0 | xargs -0 grep '10'
```
###sed
sedはいろんな操作ができるので今回は指定行数削除の方法だけのせます。
test1.txt の 1行目から 10行目までを削除して test2.txt に保存する。

```bash:sedコマンド
$sed '1,10d' test1.txt > test2.txt
```
#まとめ
今回は自分がよく使うコマンドちゃん達の紹介をしました。
いつも使っている人にとっては退屈だったと思いますが、
最後までスクロールしていただきありがとうございます。
初心者の方や使ったことなかったという人は、
明日からでも使えるコマンドばっかりですので、ぜひ使ってみてください。
【詳細編】については気が向いたら投稿しようと思います。

明日は17卒同期の@Hiro2525が書いてくれます。
お楽しみにしてください！
それでは、みなさん良いコマンドライフを！
Laravel Valetをfish shellで利用する際に詰まった箇所

##背景
友人のエンジニアに「開発環境作るならLaravel Valetおすすめっすよー」と勧められ、さてやるかと導入する前に[この煽り文句](https://qiita.com/kinchiki/items/57e9391128d07819c321)に触発され、ターミナルのテーマとシェルをいじったがために引き起こった問題。見た目から入ると危ない。

##事象
fishを入れたものの、そもそも殆どの記事がbash用で書かれているため、fishで利用する際に何を変更しなければいけないか、どこを書き換えればいいのかわからなかった。
[公式のドキュメント](https://laravel.com/docs/5.2/valet)を見ながら作業を進めたため、`composer global require laravel/valet`までは問題なく完了。ここから

```
❯ valet install
fish: Unknown command 'valet'
```

がつづく...とりあえずググり続ける。

##対応
###1. [Laravel “valet install” not found](https://stackoverflow.com/questions/37085102/laravel-valet-install-not-found)
上記を読んでみると、そもそもシェルに関係なくパスの設定が上手くいっていないと`valet install`が呼び出せないということを理解。
パスの設定がうまくいっていない場合、~/.bash_profileにパスを正しく設定しろとのことだったので、fishのパスの設定の仕方を調査することに決定。

###2. [Path setup in Fish shell](https://stackoverflow.com/questions/45676288/path-setup-in-fish-shell)
`set -gx PATH $PATH $HOME/.composer/vendor/bin` または
`set -U fish_user_paths $HOME/.composer/vendor/bin` で解決。

##It works!しか表示されない別の問題
[Laravel valet It works
](https://stackoverflow.com/questions/39708139/laravel-valet-it-works)
を見ていたらApacheとNginxはどうやら相性悪いらしい。
・`sudo apachectl stop`
・`valet restart`
上記2行で解決した。
他にも詳しい解説は[こちら](###https://gist.github.com/adamwathan/6ea40e90a804ea2b3f9f24146d86ad7f
)

##まとめ
よくわからないのまま、見切り発車で突っ込むとこうなる。
ただfishは秀逸だし、bashに戻さず敢えてこの環境で突き進みたい。

##※追記(2017.12.18)
`Application ready! Build something amazing.` 表示後、実際にhoge.devにアクセスしてみるが、どうしても表示されなかったところ、こんな現象が。

[Laravel Valet でローカル開発中の.devドメインのページにchromeからアクセス出来ない。](https://qiita.com/hidea/items/8ac08ebcf3283f81d965)

一件落着。
JXAを使ってChrome&TwitterWebでツイート

休日に思いつきで苦労した。作ってからもっとマシな方法を思いついたのでもう使ってないが、いつか役に立つかもしれないのでメモ
## 今回の思いつき
Vivaldiに`Tooter`という拡張を入れている。これはWeb版Twitterの投稿ページにマストドンへのクロスポストボタンを追加するアドオンだ。これを使って面倒なウェブサービスを使わずにクロスポストを簡単にしてやろうと考えた。そこで思いついたのが **AppleScript**。これを使って

1. 実行したらシステムの入力窓が出現
2. 窓にポスト内容を入力
3. ブラウザで投稿画面を呼び出し
4. 投稿 -> クロスポスト成功！

をやってやろうということだ。ちなみに作ってからもっとマシな方法を思いついたのでもう使ってない。
### AppleScriptは使わない
開幕から手のひらを返すが、AppleScriptは使わない。なんでもMacOS Elcapitanから、AppleScriptが要求されていた場面でJavaScriptが使えるようになったらしいので、それで行く。
> 参考 : 知らないうちにMacがシステム標準でJavaScriptで操作できるようになってた (JXA)
> https://qiita.com/zakuroishikuro/items/1b02378bf9e940602d87

## 完成品
ちなみに、VivaldiはChrome派生なのでアプリケーション名を差し替えればChromeでも使える。

```javascript
//変数にアプリケーションIDをセット
vivaldi = Application('Vivaldi');
//標準コマンドを使用可能にする
vivaldi.includeStandardAdditions = true
//新規ウィンドウの作成と同時に関数winにウィンドウIDをセット
win = vivaldi.Window().make();
//ウィンドウが開くまで3s待つ
delay(3);
//アクティブなタブを取得
tab = win.activeTab();
//boundにウィンドウ情報を代入
var bound = win.bounds();
//ウィンドウの大きさを書き換え
bound.width = 840;
bound.height = 525;
bound.x = 0;
bound.y =0;
//ウィンドウ情報を書き戻して変更
win.bounds = bound;
//DisplayDialogで入力(投稿内容)を取る
var tweet = vivaldi.displayDialog("What you doing?", {
    defaultAnswer: "",
    withIcon: "note",
    buttons: ["Cancel", "Continue"],
    defaultButton: "Continue"
})
//urlに含められない文字を置換
//encodeURL()は使えなかった。必要なら置換を増やす。
tweet.textReturned = tweet.textReturned.replace(/\r?\n/g, '%0a');
tweet.textReturned = tweet.textReturned.replace(/&/g, '%26');
//投稿ページを開く
tab.url = "http://twitter.com/home?status=" + tweet.textReturned;
//開いたページが読み込み終わるまで待つ
while(tab.loading()){
}
//送信確認ダイアログを出す
var dialogText = "以下の内容で送信していいですか？\n" + tweet.textReturned;
var dig = vivaldi.displayDialog(dialogText,{
    buttons: ["No", "Yes"],
    defaultButton: "Yes",
    cancelButton: "No"
});
//前の確認でYesが選ばれたら
if(dig.buttonReturned == "Yes"){
	//送信ボタンの要素を取得してクリックする
	vivaldi.execute(tab, {javascript:"var tmp = document.getElementsByClassName('tweettoot');console.log(tmp);tmp[0].click();"});
}
//邪魔なのでウィンドウサイズを小さくする
bound = win.bounds();
bound.width = 10;
bound.height = 10;
bound.x = 0;
bound.y =0;
win.bounds = bound;
//送信の処理が終わるのを待つ
while(tab.loading()){
}
//ウィンドウを閉じる
win.close();
```
サーバレスでどこまで出来るのかの備忘録（2017）

# ほんとのところ
GoogleHome使って、[SSML](https://developers.google.com/actions/reference/ssml)で歌を歌わせようとしていていたのですが。。。

* [Amazon Polly](https://aws.amazon.com/jp/polly/)でピッチを適当にしたSSMLで音声生成
* ピッチ推定からの音程推定を、FFTとか何かしらの方法で行う
  * FFTだけでは足りない、自己相関関数あたりを併用するらしい 
  * [pitchfinder（仕組みはYIN？）](https://github.com/peterkhayes/pitchfinder)
  * [REAPER](https://github.com/google/REAPER)
  * [SPTK](http://sp-tk.sourceforge.net/)
  * [WORLD](https://github.com/mmorise/World)
* 推定結果からピッチを調整して再度生成
* 推定と調整を繰り返す
* 出来上がったSSMLをGoogleHomeにぶん投げる

全然間に合わなかった

# ということで

サイトを作成する必要があったので、
全部サーバレスで作るとしたらどのへんのサービス使うか考えたときのメモです

* 要件
  * ログイン機能がある
  * ネット上のデータの定期的な収集がある
  * ユーザがファイルを上げた時に非同期で変換処理する
  * 各種データを一覧でページングする
  * APIで提供も行う
  * サイトの公開場所

## ログイン機能

- [Amazon Cognito](https://aws.amazon.com/jp/cognito/)
  - User Pools
  - ID Poolを使うとAWSサービスに直接アクセスできる一時的なAWS認証情報を取得可能
- Amazon Cognito フェデレーテッドアイデンティティ

IAMでユーザロールを変更することも出来るので
API等も作成せずに、直接DynamoDBのリードオンリーのロールを与えてリソースに直接アクセス等もあり

## 処理

- [AWS Lambda](https://aws.amazon.com/jp/lambda/)
 - S3、DynamoDB、Kinesis、SNS、CloudWatchからのイベントで起動させる
      - 作成、変更、削除など 
 - AWS Step Functionsをつかえば、処理のフロー構築も可能
 - １００ms単位で課金
 - 稼働時間の上限（タイムリミット）指定可能、最大５分

S3にファイルアップ→イベント伝搬→Lambdaでファイル処理

- [AWS Batch](https://aws.amazon.com/jp/batch/)
 - 定期的な処理
 - ログ集計とか

## データの永続化

- [Amazon DynamoDB](https://aws.amazon.com/jp/dynamodb/)
  - NoSQL, KVS

RDSを使ったほうがいいパタンもあるが殆どの場合、DynamoDBで行けそうな気がする

## 定期実行

- AWS Lambda
 - CloudWatchのスケジュール起動からのイベントで起動させる
      - 最小単位１分
 - 秒単位で稼働させるには、独自実装必要

## API

- [Amazon API Gateway](https://aws.amazon.com/jp/api-gateway/) 
    - 処理部分はAWS Lambdaにつなげる

## 公開

- [Amazon S3](https://aws.amazon.com/jp/s3/)
    - 静的ファイル
    - ウェブサイトホスティング用の[設定](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/HowDoIWebsiteConfiguration.html)を想定

# 価格

無料枠は考えずに

- Amazon Cognito
  - 月間アクティブユーザー（MAU）で従量課金
  - 0.00550USD/MAU
     - １００００ユーザで５５USD(月間)

- Amazon DynamoDB
    - 0.000742USD/WCU 1時間当たり 1秒１回書き込み
    - 0.0001484USD/RCU 1時間当たり 1秒１回読み込み
    - 書き込みも読み込みも５ユニット（初期設定）の場合
        - (0.000742+0.0001484)*24*30*5 = 3.2USD(月間)

- AWS Lambda
 - 0.0000002USD/Request
 - 0.000000208USD/128MB100ms
 - 一ヶ月動かしっぱなし
     - (0.0000002*60*24*30)+(0.000000208*10*60*60*24*30) = 5.4USD(月間)

- Amazon API Gateway
    - 4.25USD/100万Request
    - 0.14USD/GB　転送量

- Amazon S3
    - 保存容量　0.025USD/GB
    - 転送量　0.140USD/GB

マイクロインスタンスの方が安い場合があるけれども
サーバ管理なしに完全マネージドのメリットは大きいかと思います
Unityマルチシーン運用時のSkyboxの動的設定

Qiita初投稿。

# マルチシーン運用時のSkyboxの動的設定
環境は**Unity 2017.2.0f3**。

## RenderSettings.skyboxの設定先
skyboxの設定自体は`RenderSettings`クラスにあるんで普通にsetすればいいだけ。

[Unity \- スクリプトリファレンス: RenderSettings](https://docs.unity3d.com/ja/540/ScriptReference/RenderSettings.html)

```C#
public void SetupSkybox(Material skybox) {
    if (RenderSettings.skybox != skybox) {
        RenderSettings.skybox = skybox;
    }
}
```

ただこれ、マルチシーン運用しているときに非常に困りました。なんとシーンの指定がない。
これどこのシーンに設定されるのだろうかと思ったら、**Activeなシーンのskyboxに設定**されるんですね。**強制的に。**

つまりこれは「non activeなシーン（またはまだload中のシーン）のskyboxを編集してからactiveにしたい」ということが出来ない。

例えばシーンAを開いた状態でシーンBを動的に`LoadScene(Additive)`したとき、シーンBのhierarchy上にあるobjectの`Start()`でシーンBのskyboxを動的に設定ようとしても、まだシーンBはloadが完了しておらずactiveになっていないので、**その時点でactiveなシーンAのskyboxに設定されてしまう**という、非常に面倒くさいことが起きた。

## 解決策：遅延設定
つまるところ、シーンがActiveになったら設定するようにしておくしかないのかなと。
本当に？ っていう感じ……。

```C#
private string TargetSceneName = "設定したいシーン名";

// activeになったときに呼ばれるコールバック
private void OnActivedSetupSkybox(
        UnityEngine.SceneManagement.Scene prev,
        UnityEngine.SceneManagement.Scene next) {
    if (next.name == TargetSceneName) {
        // 改めてskyboxを更新
        SetupSkybox();
        // コールバック登録を解除
        UnityEngine.SceneManagement.SceneManager.activeSceneChanged -= OnActivedSetupSkybox;
    }
}

// skyboxの設定処理
public void SetupSkybox(Material skybox) {
    if (UnityEngine.SceneManagement.SceneManager.GetActiveScene().name == TargetSceneName) {
        // 所望のシーンがactiveだったら素直にskyboxを更新する
        if (RenderSettings.skybox != skybox) {
            RenderSettings.skybox = skybox;
        }
    }
    else {
        // 所望のシーンがactiveでなかったら、activeになったときに更新するように
        // コールバックを登録しておく。
        UnityEngine.SceneManagement.SceneManager.activeSceneChanged += OnActivedSetupSkybox;
    }
}
```

なんでこれ標準でシーン指定できないんだろうなあ。
この事について軽く検索してみたところ、他に記事を見かけなかったということは、こういうマルチシーンでのskybox動的設定はあまり推奨されないということなんですかね……。
自分の仕事をこっそりBotっぽくしてBotだと悟らせない3つの方法

こんにちわ。 @simeji です。
本記事は [LIFULL Advent Calendar 2017](https://qiita.com/advent-calendar/2017/lifull) の18日目の記事です。
昨日は @hclo の [nginxの基本設定を改めてちゃんと調べてみた](https://qiita.com/hclo/items/35f00b266506a707447e) でした！

みなさん、年の瀬は忙しいでしょうか。楽しいことをやっていると良いのですが、仕事がありすぎると大変なものですよね。

仕事の中でも定型のものは、
1. その作業は必要か、定期的に棚卸しする
2. 渡せるものは人に渡す
3. 自動化みたいなことをする
といったようなことをして省力化していきたいものです。

1は確実にやったほうがいいですよね。 その上で、2もいいのですが、誰かがやることになり、(育成観点を除けば)組織としての仕事の総量は変わらないので、できれば、3にしたいところです。

## やっていること

本題とはズレますが、LIFULL では、Github, Chatwork, Jira などを利用しているので、これらを使ってBotっぽくしています。
<img src="https://qiita-image-store.s3.amazonaws.com/0/30588/294ea7c8-1644-4c3f-d5c1-7e16bfdc4aef.png" width="60%" />


大雑把に表すと以下のように連携しています

<img src="" width="70%" />
※画像引用[^1] 
[^1]: https://go.chatwork.com/ja/download/cw_logo.html | https://github.com/logos | https://atlassian.design/guidelines/marketing/resources/logo-files


## Botだと悟らせない3つの方法

それでは、余談は終わりまして、以下、タイトルで「自分の仕事をこっそりBotっぽくしてBotだと悟らせない3つの方法」です。
Botだと悟らせないことにどれだけ意味があるかは、正直良くわかっていませんが、人は温かいものです。
※ その手の話に詳しい方には釈迦に説法のような話だと思います。

### １. 発言パターンを一定ではなくする

発言に特定のパターンを用意しましょう。
たとえば、前述のものにおいて、上記メールアドレスの設定漏れに対する回答も幾つかパターンがあります。

* ◯◯ はどうやらメールアドレスの設定がされてないみたいですので確認ください
* ◯◯ 、メールアドレスの設定がされてないのでご確認ください
* ◯◯ はメールアドレスを設定後再度ご連絡ください
* ◯◯ はメールアドレス設定がされていないようです
* ◯◯ についてメールアドレス設定をしてください
* ◯◯ はメールアドレスの設定がされていません

これで悟られません。

### ２. 労働時間を決める

24時間働いていると、まさにBotです。
効率は置いておいて、労働時間を決めましょう。
前述のものは、私のPCが起動している時間のみ仕事をしています。

これで悟られません。

### ３. 怪しまれても認めない

最後に、ここはテクニック的な部分なんですが、100人いたら、95人くらいはBotだと思いこんで、挙動を探ろうとしたり、 **「Botなんですよね？」** や、当然のように **Bot前提** で、話をしてくることになります。
その時は焦らずに、 **そうではない** ということを主張しましょう。

これで悟られません。
※ ただし、本気で聞かれたらこっそり答えましょう。（信用の問題）

おそらくこれからだんだんと、人とBotの垣根もなくなってくると思うので、そのようなことを気にしなくても大丈夫でしょう。
また、本件以外の、仕事でのミスなどは素直に認めましょう。その上で次に活かしましょう。

## さいごに

Botだと悟らせない事自体には、あまり意味がないのでオススメはしません。
また、私が作っていたのはBotではありませんが、LIFULLには、[Botなども作りつつ、楽しく仕事しているメンバー](https://qiita.com/ikedaosu/items/b01183f207ea1db6a8d3) もたくさんいます。

明日もLIFULLアドベントカレンダーをよろしくお願いします！
※ [LIFULLアドベントカレンダーその２](https://qiita.com/advent-calendar/2017/lifull2)もあります！
Windows版OpenSSHの接続batファイルを便利にする

Windows版OpenSSHをSSHクライアントとして使ってみる
https://qiita.com/liberaldenial/items/0fe01950543e367fb46e
からの続きになります。SSH接続を行うbatファイルを更に便利にしてみようという試みです。

#追加する機能
1.接続先情報と接続機能を別のbatファイルに分割する。
2.SCPが使えるようにする。
2-1.batファイルにドラッグアンドドロップしたらファイル送信
2-2.batファイルにフォルダをドラッグアンドドロップしたらフォルダの送受信どちらか確認し、フォルダ送受信でない場合はファイルを受信する。

#フォルダ構成
・Windows側のフォルダ構成は以下の通りですがほぼ代わりありません。
├─OpenSSH-Win32
├─OpenSSH.bat(このにある.batを叩いて接続する)
└─sshkeys
　　└─myself
　　　　└─hogefuga(ここに鍵ファイルがある)

#接続情報を持つbatの作成
このファイルにはSSH接続に必要な情報を書いておきます。このbatファイルに対してドラッグアンドドロップを行うとSSHSCP.batに引数が渡されSSHやSCPが接続情報を元に実行されます。このファイルは接続先の数だけ必要です。

```
@echo off
set HOSTNAME="hoge.jp"
set KEYFILE="..\sshkeys\myself\hoge\id_rsa"
set PORT="1001"
set USERNAME="hoge"
set PORTFORWARD="-L 10001:hoge:10001"

rem このファイルにドラッグアンドドロップされた引数を次のファイルにも渡す。
call SSHSCP.bat %1
```

#接続機能を持つbatの作成
このファイルはOpenSSH.batフォルダ内に配置し、SSH接続を行うbatファイルが起動されたときに呼び出され、接続情報を元に接続を行います。このbatは1つあればいいです。

```SSHSCP.bat
@echo off 
set OPENSSHPATH=..\OpenSSH-Win64\
set ARGS=%~1
set FILENAME=%~nx1
set FILEPATH=~/
cd /d %~dp0

if "%ARGS%"=="" (
    call :SSH_CONNECT
) else if exist "%ARGS%\" (
    call :SCP_SELECT
) else if not "%ARGS%"=="" (
    call :SCP_FILE_SEND
)

rem 何も引数がない場合はSSH接続
:SSH_CONNECT
%OPENSSHPATH%ssh.exe -p %PORT% -i %KEYFILE% %USERNAME%@%HOSTNAME% %PORTFORWARD%
echo 切断しました
pause
exit

rem ファイルの場合はSCP送信
:SCP_FILE_SEND
set /p FILEPATH="送信先ファイルパスを入力してください(デフォルト値:%FILEPATH%)  : "
echo %FILENAME%を%FILEPATH%に転送します
call :KAKUNIN
%OPENSSHPATH%scp.exe -P %PORT% -i %KEYFILE% %ARGS% %USERNAME%@%HOSTNAME%:%FILEPATH%
pause
exit

rem フォルダの場合は操作を選択する
:SCP_SELECT
set SCPFLG=
echo SCPを実行します操作を選択して下さい
set /p SCPFLG="(送信:s / 受信:r / 終了:q)？  : %SCPFLG%"
if "%SCPFLG%"=="s" (
  call :SCP_FOLDER_SEND
) else if "%SCPFLG%"=="r" ( 
  call :SCP_RECEIVE
) else  if "%SCPFLG%"=="q" (
  exit
) else (
  echo 他のキーが押されましたもう一度入力してください
  call :SCP_SELECT
)

rem SCPフォルダ送信
:SCP_FOLDER_SEND
set /p FILEPATH="送信先ファイルパスを入力してください(デフォルト値:%FILEPATH%)  :"
echo %ARGS%を%FILEPATH%に転送します
call :KAKUNIN
%OPENSSHPATH%scp.exe -P %PORT% -i %KEYFILE% -r %ARGS% %USERNAME%@%HOSTNAME%:%FILEPATH%
pause
exit

rem SCP受信
:SCP_RECEIVE
set /p FILEPATH="受信するファイルパスを入力してください(デフォルト値:%FILEPATH%)  : "
set /p RECEIVE_FILENAME="受信するファイル名を入力してください(フォルダの場合は未入力にする)  : "
echo %FILEPATH%%RECEIVE_FILENAME%を%ARGS%に転送します
call :KAKUNIN
if "%RECEIVE_FILENAME%" == "" (
  call :SCP_FOLDER_RECEIVE
) else (
  call :SCP_FILE_RECEIVE
)
pause
exit

rem SCPフォルダ受信
:SCP_FOLDER_RECEIVE
%OPENSSHPATH%scp.exe -P %PORT% -i %KEYFILE% -r %USERNAME%@%HOSTNAME%:%FILEPATH% %ARGS%
exit /b

rem SCPファイル受信
:SCP_FILE_RECEIVE
%OPENSSHPATH%scp.exe -P %PORT% -i %KEYFILE% %USERNAME%@%HOSTNAME%:%FILEPATH%%RECEIVE_FILENAME% %ARGS%\%RECEIVE_FILENAME%
exit /b

:KAKUNIN
SET /P YESNO="実行しますか？(y/n)  : "
if "%YESNO%" == "n" (
    exit
)
exit /b
```

ここまで作っておいて何だけど、これ使うことってあるのかなぁ。
gOpenSSHとかいう名前でGUIクライアントあったほうが良い気が・・・
systemd-nspawnの--as-pid2オプション

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

systemd-nspawnで-bオプションを使って通常bootする分には問題ないのですが、dockerのように必要なプロセスをPID1番として起動する場合があります。
その際、PID=1だと、SIGTERMを無視する等特別扱いされ不都合が起きる場合があります。

そういう時は--as-pid2オプションを付けましょう

```bash
systemd-nspawn -D ubuntu2/ --as-pid2
```

こうすると
こんな感じになります

```
STUBINIT
  `-bash
      `-pstree -a
```

--bootオプションと併用するとはできません。
PID=1がinitとして適切にシグナルをハンドリングできるように作っていないならば、毎回指定した方が無難かもしれません。

# 参考リンク

* [PID1 は、カーネルから 特別扱いされてるって本当ですか？](https://speakerdeck.com/superbrothers/pid1-ha-kanerukara-te-bie-xi-isareterututeben-dang-desuka)
MacBook pro 2016 Touchbar モデルにUbuntuをインストールする

今年も枠を頂きました。
Retty Inc.のすずたく(@takumi-suzuki )です。
Retty Inc. Advent Calendarの記事はこちらです。
[RDS からEC2へ Multi-master replicationを組んでみた](https://qiita.com/takumi-suzuki/items/3bcedbd431c89e9d4ee9)

今回は、僕のPCが不調で代替機としてtouchbar付きのMacを渡されてしまったので、その時に使えるようにした方法を書いていきます。

# 問題点
今回のtouchbar付きを渡されてしまった時に何が問題だったかは以下の通りになります。

- 本体のkeybordが認識しない。
- Trackpadが操作できない。
- `esc`キー、`Fx`のショートカットキーが存在しない。

それではこれらの問題点の解決方法を書いていきます。

# Setup
OSのインストールに関しては様々な記事が上がっているので省きます。
しかし、以下のものを用意しないとインストールができないので準備をしておいたほうが良いです。

- USB-Keybord
- USB Type-c to Type-Aへの変換系
- マウス

とりあえずこれらがあればインストールすることはできました。
最初はmokumoku会の最中にカジュアルにやろうと思っていましたが、こんな装備が必要と思っていなかったため詰みました。

## kernel update
touchbarやkeybordを使えるようにするtoolはGithubに上がっていたのですが、
それらを使用するためにはkernelのupdateが必要だったためこの作業を行います。

以下のコマンドを実行すれば完了します。

```
$ sudo apt install linux-generic-hwe-16.04-edge 
$ sudo reboot
```
これでkernel updateが完了しました。

## Keybord・Trackpad・Touchbarの有効化
Githubに上がっている以下を使用します。
https://github.com/Dunedan/mbp-2016-linux

以下のコマンドを実行してセットアップが完了します。

```
$ git clone https://github.com/Dunedan/mbp-2016-linux.git
$ cd mbp-2016-linux
$ sudo apt install dkms
$ sudo git clone https://github.com/cb22/macbook12-spi-driver.git /usr/src/applespi-0.1
$ sudo dkms install -m applespi -v 0.1
$ sudo echo -e "\n# applespi\napplespi\nintel_lpss_pci\nspi_pxa2xx_platform" >> sudo /etc/initramfs-tools/modules
$ sudo update-initramfs -u
$ gcc touchbar.c
$ sudo ./a.out -d /dev/bus/usb/001/002 1
```
これで使用できるようになりました。

## 起動時にTouchbarを有効化する
上の設定でTouchbarを有効化することができるようにはなりました。
しかし、起動時に毎回実行をする必要があるため、以下のファイルを設置します。

```bash:/etc/rc.local
#!/bin/sh -e
#
# rc.local
home_dir=''

{$home_dir}/.init_script/a.out -d /dev/bus/usb/001/002 1

exit 0
```
これで再起動の際にこのスクリプトが実行され、Touchbarが最初から使用可能になります。

## Gnomeのインストール
UbuntuはDefaultがunityなのでGnomeに変更して使用しましょう。

Gnomeの変更方法は以下のとおりです。

```
$ sudo apt install ubuntu-gnome-desktop
$ sudo reboot
```
これでログイン画面でGnomeが選択できるようになりました。

## 日本語入力
日本語入力が効かなくなっているので、Mozcを使えるようにします。
日本語の入力ソースでMozcを選択しようとしたところ、選択肢に出てこなかったためインストールからおこないます。

```
$ sudo apt-get install ibus-mozc
$ killall ibus-daemon
$ sudo killall ibus-daemon
$ ibus-daemon -d -x &
```
上記のコマンドを実行することにより、Mozcが選択できるようになりました。

後は下の画像のように
[設定]→[地域と言語]を選択し、入力ソースの左下にある `+` をクリックすると言語の一覧が出るので、日本語をクリックします。
その後、画像のように **日本語(Mozc)** を選択して追加をすると日本語入力が可能になります。
![Screenshot from 2017-12-18 01-02-18.png](https://qiita-image-store.s3.amazonaws.com/0/57616/f5a1392a-9688-72ae-2a19-85d6337e62e9.png)


# まとめ
簡単にMacでUbuntuを使用できるようにするための方法を書いていきましたが、その他のディレクトリ名の変更等の細々とした所は書いていないので調べてやってみてください。

これで、Touchbar付きのMacでもUbuntuが使えるようになったので、みなさんもガンガンMac OSを捨てて行きましょう。
良いUbuntu lifeをお送りください！！
「うんこなう」をTwitterでシェアするアプリを作った

この記事は[クソアプリ Advent Calendar 2017](https://qiita.com/advent-calendar/2017/kuso-app2017) 18日目の記事です。

# 作ったもの

**Britter(ブリッター)** です。Android版しかありません。

<a href='https://play.google.com/store/apps/details?id=com.ogapants.britter'><img alt='Google Play で手に入れよう' src='https://play.google.com/intl/ja/badges/images/generic/ja_badge_web_generic.png' width="200"/></a>

「うんこなう」のツイートたちが表示され、
ワンボタンで「うんこなう」とTwitterに投稿し、臨場感をシェアできます。
位置情報から近場の「うんこなう」をチェックしたり、位置情報を付与して「うんこなう」することもできます。

![device-2017-12-17-235517のコピー.png](https://qiita-image-store.s3.amazonaws.com/0/35511/c908b3d6-4132-3956-e23e-df4a4b831779.png)

# 使った技術
ほぼ [Twitter Kit](https://dev.twitter.com/twitterkit/android/overview)でまかなえたのでView周りは楽でしたが、細かいチューニングなどが大変でした。
ツイートしすぎると自分のツイートがAPIで帰ってこなくなったりするので、おとなしく自前でやったほうがいいかもしれません。
本当は流行りの設計やライブラリなどを盛り込みながら開発したかったのですが、
今回はリリースすることを最優先にして既存の知識だけでとにかく作り切ることを意識しました。

# 大変だったところ
Androidを本格的にやり始めた3年ほど前からこの案はあったのですが、意志が長続きせず、リリースにたどり着くまでが一番大変でした。
アドベントカレンダー駆動開発で念願の夢が果たせて感激です。

# 今後
まだいっぱい直したいバグや追加したい機能ががあるので対応しつつも、基本的には新しい技術の実験場にしていけたらと思います。
個人アプリはモチベーションが命なので、頑張りすぎない程度に頑張ろうと思います。

# 所感
ここまで読んだ方はもうお気づきかもしれませんが、なんとGoogle Playの審査で落ちたので公開できていません。
参りました。この結果は正直全く予想できませんでした。Google様には返す言葉もありません。なんの言い逃れもできません。お手数をおかけして申し訳ありませんでした。

現場からは以上です。
googleのMaterial Designを使って一瞬でデザインをレベルアップさせる

こちらは[フロムスクラッチ Advent Calendar 2017](https://qiita.com/advent-calendar/2017/fromscratch)の１６日目の記事です。

35歳になってエンジニアに挑戦中の元PMです。
自分もエンジニアになって見たいと思っている方は、[こちら](https://blog.codecamp.jp/codecampgate_ohara)もどうぞ。

# ちょっとデザインをよくしたい。でもbootstrapはありきたりで・・・

そんな時って、ないでしょうか（笑）

前回、[[Rails]slackでチャットを一括削除する方法](https://qiita.com/hideno0110/items/23a617c3f050a52c9390)という記事を書いたのですが、そのデザインセンスのなさに切なさを覚えました。。。

↓ これ・・・。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3130343432342f39356338333430352d636537662d636138352d376431652d3161663633313835643966342e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/104424/549320d5-87b0-86fe-8816-7a518e337b96.png)

流石に、もうちょっとよくした方が良いかなということで、デザインを直してみようと思います。
でもbootstrapはありきたりで・・・と思う方に、ちょうどいい感じでおしゃれなのがこちら。

[Google 「Material Design」](https://getmdl.io/index.html)

![Material_Design_Lite_と_「_Rails_googleのMaterial_Designを使ってみる」を編集_-_Qiita.png](https://qiita-image-store.s3.amazonaws.com/0/104424/09fc0ae3-39d5-2f2d-226f-41346c0809eb.png)

テキストに、マウスを置くと、文字が左上にスライドしたりと、いちいち小洒落ております。

早速、利用して見ます。
こちらからCDNを持ってきます。
https://getmdl.io/started/index.html#download
headタグに追加

``` ruby:application.html.erb
    <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
    <link rel="stylesheet" href="https://code.getmdl.io/1.3.0/material.indigo-pink.min.css">
    <script defer src="https://code.getmdl.io/1.3.0/material.min.js"></script>
```

レイアウトは、Fixed headerを利用します。

![Material_Design_Lite.png](https://qiita-image-store.s3.amazonaws.com/0/104424/9887cf20-fffa-bbe2-47a3-a455cc13a97f.png)

一覧のテーブルには、こちらのOrganize dataを利用。
![Material_Design_Liteあ.png](https://qiita-image-store.s3.amazonaws.com/0/104424/0eff3a36-cc3e-1fba-d29a-edabe987e9a0.png)

ということで、出来上がりがこちら。
この間、わずか１０分。（短時間で記事がかけてラッキーw）

### before
![Untitled2.png](https://qiita-image-store.s3.amazonaws.com/0/104424/8d00b7b3-6066-60d5-156d-959ca1eb71ac.png)

### after
なんということでしょう。。。！！
ほんの10分で、デザインがあたり、かつ素のbootstrapとはまた違ったおしゃれなデザインになったのではないでしょうか！？

![Untitled2_と_Understanding_Event_Delegation___jQuery_Learning_Center.png](https://qiita-image-store.s3.amazonaws.com/0/104424/792b9d40-5797-6f37-6f0c-98b1a6d80f93.png)


ということで、デザインも当てたのを[github](https://github.com/hideno0110/slack)に置いておきます。
docker イメージをsystemd-nspawnへ移行

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

[このイメージ](https://hub.docker.com/_/mysql/)をsystemd-nspawnで動かしてみます

```bash

# コンテナをエクスポート
docker export $(docker create mysql:5.7) > db.tar

# インポート
machinectl import-tar db.tar

# コンテナをあげる
cd /var/lib/machines/
rm -rf db/lib/systemd/ db/var/lib/mysql/* db/sbin/init
curl -sL https://goo.gl/BXcacQ > db/sbin/init
chmod +x db/sbin/init
systemd-nspawn --capability=CAP_NET_ADMIN -bD db
```

# 結論

やっぱ面倒だな
MPIプログラムのデバッグ方法 〜MPIプロファイリングインタフェース編〜

# はじめに

これは[MPI Advent Calendar 2017](https://adventar.org/calendars/2548)の18日目の記事です。

MPI Advent Calendar 2017 はMPIプログラムのデバッグ技法の記事が多い気がしますが、MPIプロファイリングインタフェースを使う方法を書いたものがないので、この「MPIプログラムのデバッグ方法〜MPIプロファイリングインタフェース編〜」を書きます。

# MPIプロファイリングインタフェースというものがある

MPIにはMPIプロファイリングインタフェースというものが1.0のときから規格として存在します。

どういうものかをざっくり書くと、

- 各MPI関数は```MPI_```を接頭詞とせず、```PMPI_```を接頭詞としても呼び出し可能。機能や引数は接頭詞```MPI_```のものと全く同じ...と言うか **単なる別名** 。
  - 例えば、```MPI_Send```を```PMPI_Send```で呼べる。
- 接頭詞```MPI_```のMPI関数は **ユーザプログラムで再定義できる** 。

というもの。
パチェコの本が手元にあるなら、とりあえず12章6.1節を読むと良いでしょう。

具体的使い方としてはこんな感じで

```C
#include <mpi.h>

int MPI_Send(void* buffer, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm)
{
   int ret;

   /* ここで何か固有処理(1) */

   ret = PMPI_Send(buffer, cont, datatype, dest, tag, comm);

   /* ここで何か固有処理(2) */

   return ret;
}
```
とすることで、ユーザプログラム定義のMPI_Send関数が作れます。
呼び出し側は特に何もする必要はありません。

```C
MPI_Send(...);
```
などと通常のMPI関数と同様にコールすればOKです。

固有処理を通信ごとに分けたいような場合は、tagで制御するといいです。

なお、各MPIライブラリはこれをどう実現しているのかはよくわかりません。調べてもいませんが。特にFortranではどうやってるんでしょうね。

# MPIプロファイリングインタフェースを使ったデバッグ

さて、MPIプロファイリングインタフェース(以下、"PMPI関数"と呼ぶ)はその名前のとおり、タイマ関数を使うなどして通信性能(正確にはMPI関数の経過時間)を測定することを目的としています。たぶん。

そしてこれはデバッグにも使うことができます。

たとえば、MPIプログラムをデバッグするときは、通信内容をダンプしたいことがよくあります。少なくとも私はある。
プログラム中のMPI関数の呼び出しの前後にダンプするコードを挿れいていくのは大変手間です。そんなとき、ダンプの対象としたいMPI関数を、PMPI関数のラッパとしてユーザプログラムで再定義してラッパ内でダンプ処理することで容易に実現できます。

え？そんなことしたら、全部の通信がダンプされて大変なことになるって？tagで処理を分けましょう。異なる通信は異なるtagを着けるのが作法ですよ。(自戒)

## デバッグ事例

こういう記事を書くということは、わたしの経験としてPMPI関数がデバッグに強烈に役立った経験があるからなわけで、その例を簡単に紹介。(実際のコードは手元に残ってないので擬似コードで)

バグの事象としては、プログラムを実行すると毎回ほぼ同じタイミングでMPIの内部エラーでプログラムが終了を起こすというもの。そういうわけで、まずはそのプログラムで使っている全てのMPI関数をPMPI関数を使って再定義して、呼び出し回数をカウントするようにしました。

こんな感じ

```C
static unsigned int mpi_send_count = 0;
int MPI_Send(void* buffer, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm)
{
   int ret;
   mpi_send_count++;
   printf("MPI_Send: %d\n", mpi_send_count);
   ret = PMPI_Send(buffer, cont, datatype, dest, tag, comm);
   return ret;
}
```

この結果、毎回同じ呼び出しカウントでコケることが判明。続いて、

```C
static unsigned int mpi_send_count = 0;
int MPI_Send(void* buffer, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm)
{
   int ret;
   mpi_send_count++;
   if (mpi_send_count == コケるカウント) {
      /* 引数とスタックトレースをダンプする処理 */
   }
   ret = PMPI_Send(buffer, cont, datatype, dest, tag, comm);
   return ret;
}
```

として、問題が発生するMPI関数の呼び出し位置とタイミングを特定して、デバッグの材料とした・・・ということがありました。まあ、結果としてMPIライブラリの実装のバグだったのですけども。(おこ)

# まとめ

- MPIプロファイリングインタフェースというのがあります。
- 使い方しだいでデバッグにも使えます。