OmniAICreator/Qiita-1.07M huggingface dataset:
PC２台を使ったOpenFOAMの計算

流体解析のオープンソースソフトウェアであるOpenFOAMのバージョン4.1を使ってノード間計算を実施しようとしたときのメモ

# OpenFOAMのインストール
インストール環境
　- Ubuntu 14.04LTS
　- OpenFOAM4.1
　- WS2台用意で同一のユーザー名（workstation01 workstaion02）
　- リポジトリからapt-getを用いてインストール
　- インストール先は/opt/
　- nfsは使わない

```
sudo add-apt-repository http://www.openfoam.org/download/ubuntu
sudo apt-get update
sudo apt-get install openfoam4 
```

ubuntuであれば特に問題なくインストールできる。
2台ともに入れる

# SSHの設定
SSHの設定は以下を参照して設定
[インフラエンジニアじゃなくても押さえておきたいSSHの基礎知識](http://qiita.com/tag1216/items/5d06bad7468f731f590e)

#チュートリアルcavityによる計算

cavityをコピーしてきてメッシュ作成、decomposeParを編集して4並列化する
まずは単体（workstation01）による並列計算

```
 cp -r $FOAM_TUTORIALS/..  ~/cavity
 cd ~/cavity
 blockMesh 
 decomposePar
 mpirun -np 4 icoFoam -parallel
```

正しくインストールできているのなら特に問題なく実行可能

caseファイルにmachinesを作成し、以下の内容を書き込み保存

```
nano ~/cavity/machines
```
```text:machines
workstation01 cpu=2
workstation02 cpu=2
```
workstation02に同じ位置(~/cavity)にscpを使って転送する。そして実行

```
 mpirun --hostfile machines -np 4 icoFoam -parallel
-------------------------------------------------------------------------
mpirun was unable to launch the specified application as it could not find an executable:

Executable: icoFoam
Node: workstation02

while attempting to start process rank 2.
-------------------------------------------------------------------------
```

エラーが出た。エラーを見るとicoFoamが呼び出せていない
~/.bashrc で　/opt/openfoam4/etc/bashrcは読み込む設定しておりそれぞれ単体では実行可能なのに

```
ssh 　workstation02　icoFoam 
```

と打ってもicoFoamは存在しないようなので
mpirun実行時には　~/.bashrc で　/opt/openfoam4/etc/bashrcは読めていないよう。

```
ssh 　workstation02　echo $PATH 
```
としたら/opt/openfoam4以下のものが設定できていないことが判明。
~/.bashrc の先頭付近にある以下のもので上の部分ですぐ ~/.bashrc を抜けてしまって、それ以降の設定が反映されない。
これらをコメント文にすると/opt/openfoam4/etc/bashrcが読め込めた。

```text:.bashrc
# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac
```


再び実行するが結果は同じ。

```
 mpirun --hostfile machines -np 4 icoFoam -parallel
-------------------------------------------------------------------------
mpirun was unable to launch the specified application as it could not find an executable:

Executable: icoFoam
Node: workstation02

while attempting to start process rank 2.
-------------------------------------------------------------------------
```

やはり/opt/だとroot権限がないためmpirun実行時には実行できなかった。
そこでapt-get installでは/opt/にしか入らないので、
ソースからコンパイルして任意の場所(/Home/user/OpenFOAM)に入れた。

コンパイルのやり方は以下を参照に
[CentOSにOpenFOAM 4.0をインストール](http://qiita.com/yotakagi77/items/1e6f95a121ecd7460705)
大きな問題はなくコンパイルできた。（OpenFOAMのコンパイルは時間かかったけど）

openFOAMへのパスを通して

```
 mpirun --hostfile machines -np 4 icoFoam -parallel
```
ちゃんと動いた。

# まとめ
mpirun もしくはsshからの実行時には
~/.bashrc の先頭付近ですぐ ~/.bashrc を抜けてしまって、それ以降の設定が反映されない。

抜ける処理の部分をコメント文にする。

リポジトリからapt-getを用いてインストールするとインストール先は/opt/になるためroot権限で実行できなかった。
ソースからコンパイルしてユーザー権限のある場所に入れる。

もしかしてrootユーザーでログインして/opt/をユーザー保有にすればよかったのか


# 参考
[OpenFOAM のインストール](http://www.geocities.jp/penguinitis2002/study/OpenFOAM/install_memo/install_memo.html)
[インフラエンジニアじゃなくても押さえておきたいSSHの基礎知識](http://qiita.com/tag1216/items/5d06bad7468f731f590e)
[CentOSにOpenFOAM 4.0をインストール](http://qiita.com/yotakagi77/items/1e6f95a121ecd7460705)
Canvas内でImageをInstantiateする備忘録(自動生成)

前回グダグダ書きすぎたので今回は簡潔に。

Canvas内でimageを自動生成させようと試みるもオブジェクトは生成されるのにimageが表示されない！ということがありました。
今回はCanvas内でInstantiateする方法の備忘録。

#Canvasの親要素、子要素
Canvas内でimageを表示させるにはCanvasを親要素として配置しないといけないんですね。

```hoge.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class hoge : MonoBehaviour
{
    [SerializeField]
    GameObject hogehoge;

    [SerializeField]
    GameObject canvas;

    // Use this for initialization
    void Start()
    {
        GameObject prefab = (GameObject)Instantiate(hogehoge);
        prefab.transform.SetParent(canvas.transform, false);
    }
	
    // Update is called once per frame
    void Update()
    {

    }
}

```
上記が参考にしたサイトをちょこっといじったコードです。
ネットで調べると同じようなコードがわんさか出てきましたw
これだとhogeがCanvasの子要素になるのでちゃんと表示されるようになります・・・が、今回やりたいのが「◯秒おきに自動生成」です。

#自動生成する
上記のコードをまたちょこっといじって自動生成できるように編集します。

```hoge.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class hoge : MonoBehaviour
{
    [SerializeField]
    GameObject hogehoge;

    [SerializeField]
    GameObject canvas;

    // Use this for initialization
    void Start()
    {
        StartCoroutine("Hoge");
    }
	
    // Update is called once per frame
    void Update()
    {

    }

    IEnumerator Hoge()
    {
        while (true)
        {
            GameObject prefab = (GameObject)Instantiate(hogehoge);
            prefab.transform.SetParent(canvas.transform, false);
            yield return new WaitForSeconds(10f);
        }
    }
}

```
これで10秒おきに自動生成されるようになりました。

##まとめ
上記コードだと自動生成はされるようになりますが、座標がずっと一緒。。。
まだまだUnity初心者なので忘れないうちに備忘録として書きました。
次は座標！

参考にさせていただいたサイト↓
http://mhgames.blog.fc2.com/blog-entry-14.html
var/let/constの使い分けのメモ


### グローバルスコープ
* トップレベルに変数や関数を置くと、それはどこからでもアクセスできるグローバルオブジェクトになる
* 別のJSファイルに書いたとしても、同様にグローバル扱いになる

### 関数スコープ
* functionの中に書かれた変数・関数はその内部でしか変更・参照はできない
* 外部から参照できないので変更に強いモジュールが作れる

### var
* 巻き上げがおきる
	* JavaScriptは関数内のどこでもvarの宣言を書ける
	* 関数のどこで宣言しても、先頭で定義したものとしてみなされる
	* 先頭部分で使いたい変数は全て定義するのが定石
* 関数スコープである
	* 関数内ならどこからでも参照できる

```js
var pokemon = 'ライチュウ';
function sing(){
   //JavaScriptは関数内のどこでもvarの宣言を書ける
   //これらの変数は関数のどこで定義しても、先頭で定義したものとして見なされる
   //var pokemon;
   console.log(pokemon);
   var pokemon = 'ピカチュウ';
   console.log(pokemon);
}
sing();
```

### let
* ブロックスコープ
* 今までvarで書いてきた所はletで置き換えられる
* if,for等の{}内のブロックのみで使うブロックスコープが作れるので、スコープを狭く出来るため影響範囲を狭められる
* 変数の巻き上げは従来どおり起きる

```js
if (true) {
  //if内はスコープが無いのでグローバルスコープ扱い
  var test = 'hoge';
}

//ブロックスコープではないので、アクセスできる
console.log(test);

if (true) {
  //ブロックスコープになる
  let test2 = 'hoge2';
}

//アクセスできない
console.log(test2);
```

### const
* 再代入不可能な変数を作る (つまり定数にできる)
* 再代入しようとするとエラーになる
* letと同じブロックスコープ
* 巻き上げは起きる
* ほとんどは再代入は不要なのでconstを使う
* constを使っておけば値が変わることが無いので、値が変わるかも?という懸念が無くてコードが読みやすい
* forのイテレータのような再代入が必要な所のみletを使う

```js
const test3 = 'hoge';

test3 = 'fuga'; //エラー

console.log(test3);
```
Sinatra上でファイルアップロードのRSpecを記述する

Rack::Test::UploadFileを使用する

```
it 'テスト' do
  post 'url', file: Rack::Test::UploadFile.new('local_file_path', 'content-type')
end
```

第1引数にローカル上のファイルパスを指定し、
第2引数に`image/jpeg`等のContent-Typeを指定する。

Railsだと`fixture_file_upload`というメソッドがあるようです。
rex0220 チェックボックスレイアウトプラグイン

チェックボックス項目のレイアウトを調整するプラグインです。


# 概要

・チェックボックス・ラジオボタン項目の横サイズ指定
　横に入りきれない分は、縦に並びます。
・チェックボックス・ラジオボタン項目の縦サイズ指定
　縦に入りきれない分は、スクロール制御になります。
・チェックボックスの全セット・リセット機能
　全セット・リセット機能については、サブテーブルは対象外
・プラグイン設定　ダウンロード・アップロード機能
・3ヶ国語
・PC のみ対応

[rex0220 stores](https://rex0220.stores.jp)で、販売中です。

# 直近の変更点

Ver.8
・チェックボックスの全セット・リセット時に、計算式プラグインとの連携

# Ver.2 以降での注意事項

プラグイン設定保存時に、rex0220_chekbox_layout.css ファイルをチェックします。
Ver.1 から Ver.2 以降にバージョンアップする場合は、プラグイン設定を保存後に rex0220_chekbox_layout.css を削除してください。
![2022-05-07_15h38_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/71541552-83ae-f263-5fc8-6c5cdc19d550.png)

# 使用例

- [rex0220 チェックボックスレイアウトプラグイン・計算式プラグイン連携](
https://qiita.com/rex0220/items/9bbc433c2367c860d4bc)


# 操作例

![2017-06-01_20h33_45.gif](https://qiita-image-store.s3.amazonaws.com/0/100572/7d42ab31-2e23-874f-5c95-21154f5dd935.gif)

# 編集画面表示例


![2017-06-01_18h09_09.png](https://qiita-image-store.s3.amazonaws.com/0/100572/8a8f6f8f-eaf0-4797-b07e-d4926eb9581d.png)


# 詳細画面表示例

詳細画面では、縦スクロールされずそのまま表示されます。

![2017-06-01_18h14_33.png](https://qiita-image-store.s3.amazonaws.com/0/100572/5de7c901-a6c3-a946-eb08-e73d1799c8ce.png)

# 一覧画面で、チェックボックス項目の縦スクロール

![2023-12-27_11h01_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/54dae502-46e2-8096-fafa-c95db2a8a1e7.png)

# プラグインの追加

- kintoneシステム管理 > プラグイン　の画面で、プラグインを読み込みます。
- アプリの設定 > プラグイン　で、プラグインを追加します。

![2017-06-01_18h20_35.png](https://qiita-image-store.s3.amazonaws.com/0/100572/f47f0137-7580-e1c9-9ee8-21f074f8dee0.png)


# プラグイン設定画面

各項目を指定して、「保存する」をクリックします。
下記の入力エリアでタブ名と表示行数欄を入力していただくとレイアウト欄に自動反映されます。
入力エリアをクリックすると、入力可能となります。
値を入力後、Enter キーで確定後に、さらにEnter キーかTabキー、矢印キーで移動すると入力確定します。
※入力確定前に、マウスで別の入力エリアをクリックしますと入力内容がリセットされます。

- プラグインの有効／無効
- 一覧画面で縦スクロール
- 対象項目の選択
- 項目幅
- 項目高
- 値の幅

![2023-12-27_10h59_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/1c4f2cd0-7394-1121-9af9-e68d349d5878.png)

# 注意事項

- 既に、JavaScript によるカスタマイズを行っているアプリの場合、処理が競合して、エラーになる場合があります。その場合は、該当するアプリでプラグインの使用を中止してください。
- アプリ設定を変更した場合は、プラグインを再設定してください。
Visual Studio > 公式文章は難しい

https://msdn.microsoft.com/ja-jp/library/ms742521(v=vs.110).aspx

> 公開日: 2016年6月
Entity with relative path '../Token/TLA2%23tla_winclient_md.md' can not be found, for source topic '{"project_id":"3fedad16-eaf1-41a6-8f96-0c1949c68f32","entity_id":"0f4d9f8c-0230-4013-bd7b-e8e7fed01b4a","entity_type":"Article","locale":"ja-JP"}'.データ テンプレート モデルは、非常に柔軟に、データの表示を定義します。 Entity with relative path '../Token/TLA2%23tla_winclient_md.md' can not be found, for source topic '{"project_id":"3fedad16-eaf1-41a6-8f96-0c1949c68f32","entity_id":"0f4d9f8c-0230-4013-bd7b-e8e7fed01b4a","entity_type":"Article","locale":"ja-JP"}'.コントロールには、データの表示のカスタマイズをサポートする組み込みの機能があります。 このトピックは、まずを定義する方法を示します、 DataTemplateし、カスタム ロジックと階層データを表示するためのサポートに基づくテンプレートの選択などその他のデータ転送の各機能を紹介します。

公式文章はなぜにこれほど難しい書き方をするのだろうか。
データテンプレートを説明するのにentity_idやlocale, cannot not be foundなどのキーワードは本当に必要だろうか :thermometer_face: 。

> このトピックは、まずを定義する方法を示します、 


まだ英語版の方が分かりやすい。
https://msdn.microsoft.com/en-us//library/ms742521(v=vs.110).aspx
> The WPF data templating model provides you with great flexibility to define the presentation of your data. WPF controls have built-in functionality to support the customization of data presentation. This topic first demonstrates how to define a DataTemplate and then introduces other data templating features, such as the selection of templates based on custom logic and the support for the display of hierarchical data.

意訳「WPFデータテンプレートモデルはデータを表現するための大きなフレキシビリティを提供します。WPFのコントロールはビルトインの機能により、データ表現のカスタマイズをサポートします。このトピックにおいては、最初にDateTemplateをどのように定義するかを紹介し、その他のデータテンプレート機能を紹介します。それらの機能に含まれるものは、カスタムロジックに基づくテンプレートの選択や、階層データの表示のためのサポートなどです。」


https://msdn.microsoft.com/fi-fi/library/ms742521(v=vs.110).aspx

### 症状の発生範囲

英語以外の文章で軒並み同じエラーが表示されている。

MSDNのシステム再構築などでリンクが切れたのだろうか。

連絡しておいたが、正しい連絡先かは不明。


### 文書が改訂されていた
(追記 2018/05/09)

2017/03/30に文書が改訂されていたようだ。

読みやすい文書になっている。
全ての行の先頭に文字を挿入する


　ファイルのフォーマットを合わせたりする際に先頭行に # だとか // だとかを挟むことが往々にしてあります。

　Vidual Studio Code や Atom などの正規表現機能付きテキストエディタで置換処理すれば大抵は済みますが挿入パターンが多いと大変になってきます。

　以下のコードは全ての行の先頭に様々な文字列を挿入する例です。

　**先頭への挿入を行うシェルスクリプト**

```bash:bindSeq.sh
#!/bin/bash
numLine=1
cat $1 | while read line
do
    sed "s/^/$line/g" $2 > temp/$numLine
    numLine=$((numLine + 1))
done
```

 **挿入する文字列リスト**

```txt:patt.txt
<1>
(2)
[3]

```
 **挿入される元テキスト**

```
Laziness: The quality that makes you go to great effort to reduce overall energy expenditure. It makes you write labor-saving programs that other people will find useful and document what you wrote so you don't have to answer so many questions about it.
Impatience: The anger you feel when the computer is being lazy. This makes you write programs that don't just react to your needs, but actually anticipate them. Or at least pretend to.
Hubris: The quality that makes you write (and maintain) programs that other people won't want to say bad things about.
```

 実行例
--

 **入力**

```bash
mkdir temp
./bindSeq.sh insert.txt original.txt
```

 **出力**

```txt:temp/1
<1>Laziness: The quality that makes you go to great effort to reduce overall energy expenditure. It makes you write labor-saving programs that other people will find useful and document what you wrote so you don't have to answer so many questions about it.
<1>Impatience: The anger you feel when the computer is being lazy. This makes you write programs that don't just react to your needs, but actually anticipate them. Or at least pretend to.
<1>Hubris: The quality that makes you write (and maintain) programs that other people won't want to say bad things about.

```

```txt:temp/2
(2)Laziness: The quality that makes you go to great effort to reduce overall energy expenditure. It makes you write labor-saving programs that other people will find useful and document what you wrote so you don't have to answer so many questions about it.
(2)Impatience: The anger you feel when the computer is being lazy. This makes you write programs that don't just react to your needs, but actually anticipate them. Or at least pretend to.
(2)Hubris: The quality that makes you write (and maintain) programs that other people won't want to say bad things about.

```

```txt:temp/3
[3]Laziness: The quality that makes you go to great effort to reduce overall energy expenditure. It makes you write labor-saving programs that other people will find useful and document what you wrote so you don't have to answer so many questions about it.
[3]Impatience: The anger you feel when the computer is being lazy. This makes you write programs that don't just react to your needs, but actually anticipate them. Or at least pretend to.
[3]Hubris: The quality that makes you write (and maintain) programs that other people won't want to say bad things about.

```

　こういう些細な操作に時間をとられないようにしたいですね。

　以上です。ありがとうございました。
「line-height」と「行間」と「行送り」

デザインって何で作られてますか？

やっぱり多く方は「photoshop」で作ってらっしゃるんじゃないんですかね？
いま所属している会社でも、コーディングする際に頂くデザインデータは基本「photoshop」ですね。
（最近は、sketchもあるから結構、photoshopから乗り換えてる人も多いのかな。）

下記のようなレイアウトを渡される事も多いかと思います。
テキストの部分「line-height」は、どう設定されてますか？

![photoshop.png](https://qiita-image-store.s3.amazonaws.com/0/105694/ece5df6d-33e3-d9c5-f5dd-4175d6408729.png)

大抵の方は下記の計算式を使って値を導くと思います。

```
行送りの数値 ÷ フォントサイズ
```

この場合は、

```
28 ÷ 14 = 2
```
ですね。

---

では、コーディングしてブラウザで確認してみましょう。

![web.png](https://qiita-image-store.s3.amazonaws.com/0/105694/43bcd2a2-00ef-091c-676d-f08d7df3d250.png)

**なんじゃこりゃー**
**なんか、テキスト上部に隙間（ピンクの帯部分）できてるじゃねーかー**

となって、デザイナーさんに**「デザインと違うんだけど！」**って言われた人も多いんじゃないですかね？


# これって何でなの？
**そもそも「行送り」「行間」「line-height」って、定義が違うものなんですよ。**
定義が違えば、反映のされ方も違うというのは当たり前な話なわけで。
## photoshop
line-heightを指定する際に、photoshop上で見る値って「行送り」であって「行間」ではない。
「行送り」と「行間」の定義っていうのは
### 行送り
- 文字の大きさ + 次の行までの間隔。

### 行間
- 2つの行の間隔。

という感じらしいんですね。

私はずっと「photoshop」で「行間」を設定しているんだと思い込んでました。
でも実際は「行送り」だったわけです。


## web
cssで行間を指定するとしたら「line-height！」って思うかと思うんですが、
「line-height」って「行間」を指定する訳じゃなくて「行の高さ」を指定するプロパティなんです。
この「行の高さ」は「line-height」で指定した数値からフォントサイズを引いた数値が行の上下に均等に反映されます。

この場合、

```
( (14 x 2) - 14 ) ÷ 2 = 7 
```

となって、上下に7pxずつ反映され、上に隙間が出来てしまうって事になるわけですね。

## 調べて思った事
**ややっこしいな、おい**
っていうのを個人的に思った訳で、なんかもっとすぐにわかるツールないかなーと思って、こんな物を作ってみました。
※精度は低いと思うので、あしからず。
[Line Height Checker](https://font-lineheight.herokuapp.com/)
AzureのVisual Studio Dev Essentials でアカウント登録

Azureの無料枠「Visual Studio Dev Essentials」でアカウント登録する手順です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/144b14c7-96c8-e1aa-fb85-e91a73c78ae7.png)

#前提
- Microsoftアカウントを保有している。（o365の会社アカウントは極力避けた方がよいです。不要なアカウントを避けるために今回用にMicrosoftアカウントを登録して使用して頂くことをお勧めします。）
- Azureを初めて使う（上記のMicrosoftアカウントでAzureアカウント登録を行ったことがない）
※Microsoftアカウントを持ってない人は以下からアカウントを作りましょう。
https://www.microsoft.com/ja-jp/msaccount/

#Visual Studio Dev Essentioalsってなんぞや？
マイクロソフトが無償で提供している総合的な開発者プログラムです。アプリを開発して好きなプラットフォームにデプロイするのに必要なものがすべて揃っています。Azureは1年間も3,000円の範囲で使い放題なので勉強やちょっとだけ検証したいなどの用途であればこのサービス便利です。

#登録する
https://www.visualstudio.com/ja/dev-essentials/
[今すぐ参加またはアクセス]をクリックすると以下のような認証画面になります。
Microsoftアカウントでログインしてください。
※無駄にキャッシュを拾うことを避けるためにセキュアブラウザでの作業を推奨します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/8e82c6cd-d3f2-54bc-514a-6a436aaa1e4b.png)

>注意：一度でも同じMicrosoftアカウントでAzureアカウント作ったことのある方は要注意です。一度でも使われている個人情報が含まれると判明するとブロックされたり手順が変わってすぐに作れなくなります･･･（私も一度ハマりました。。）

パスワードを入力します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/a7dbb7c5-7bf6-2c89-f115-b4de975daec8.png)

>こんな手順になった人もいたらしいですが私は出ませんでした。
指示されたとおり進めてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/1e5c0e80-9a3f-8cf4-7ee9-099cddff0921.png)

私はこのような画面が出ました。[続行]をクリックしてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/02b1979b-f6d7-654a-75bc-be18b9344dfa.png)

#この画面になるはず。
[確認]をクリックしてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/69f7f159-4f83-5fda-2e13-d53e88857004.png)

#Azureのアクティベート
Azureを使うためにActivateします。Azureの[Activate]をクリックしてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/c26c5544-c954-7f33-8b87-c2c2b4fe74c8.png)

サインアップ画面
案内に従い項目を記入してください。本名でなくとも構いません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/56b86e45-8330-8467-f57e-e916d59d61a4.png)

以下の手順で本人確認認証を行います。電話でもメッセージでも構いません。番号は0を入れても入れなくても認証できました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/e198b0dd-adb2-3c65-2044-ff8a56140c97.png)

ドキドキしますがお金を勝手にとられることはありません。本人確認のための登録ですので安心してください。他にAzureアカウントを保有し2つ目としてこの開発者用アカウントを作成する場合には別のカードを登録することをお勧めします。（MSからは非公開ですが、1人1アカウントとするためにカードで排他となるように制御されていると思われます）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/90690aad-ddd0-13bd-5350-3d3985734853.png)

同意を行い[サインアップ]します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/8ba61765-c776-5177-6d4a-0ec09b2210a4.png)


サポート契約は不要ですのでここは何もしなくても大丈夫です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/2c42df3e-0848-2496-74e2-86a7096a0cb0.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/5e48f2ef-e4cb-eb7e-6f21-13095eb8deda.png)

ようこそ画面で[ポータル]をクリックしてみましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/c3f044cd-f44b-2f80-67f9-f03c3a48ac5d.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/1a6c65f1-ac04-89c5-d30e-c897850150a4.png)

#これがAzureのダッシュボードだ！！！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/a86c1546-78ea-04a0-d8f7-68fdca3bf4aa.png)

上記画面にログインできましたら当該手順は完了です。
ログアウトしてください。
kotlinで文字列を暗号化したり複合する

言わずと知れた [facebook/conceal](https://github.com/facebook/conceal)を使う。
このリポジトリのサンプルは少しわかりにくいので、Context/StringのExtensionとして以下の様に実装するといいと思います。

#設定

```build.gradle
    compile "com.facebook.conceal:conceal:1.1.3@aar"
```

これだけやるとproguard指定している場合はリリースビルドでクラッシュする。
[公式](https://github.com/facebook/conceal#troubleshooting)に対応方法が書いてあるので参照されたし。proguard-ruleに追記すること

#実装
ENCRYPT_KEYはよしなに変更してください。

```kotlin


private val Crypto.ENCRYPT_KEY: String
    get() = "###########"

val Context.crypto: Crypto
    get() {
        val keyChain = SharedPrefsBackedKeyChain(this, CryptoConfig.KEY_256)
        val crypto = AndroidConceal.get().createDefaultCrypto(keyChain)
        if (!crypto.isAvailable) {
            throw Exception("error")
        }
        return crypto
    }

fun Crypto.encrypt(plainText: String): String {
    return encrypt(plainText.toByteArray(Charsets.UTF_8), Entity.create(ENCRYPT_KEY)).let {
        Base64.encodeToString(it, Base64.DEFAULT)
    }
}

fun Crypto.decrypt(encrypted: String): String? {
    return Base64.decode(encrypted, Base64.DEFAULT).let {
        String(decrypt(it, Entity.create(ENCRYPT_KEY)))
    }
}
fun String?.aesEncrypt(context:Context):String?{
    if(this == null){ return null }
    val res = context.crypto.encrypt(this)
    return res
}

fun String?.aesDecrypt(context:Context):String?{
    if(this == null){ return null }
    try {
        val res = context.crypto.decrypt(this)
        return res
    }catch (e:Exception){
        return null
    }
}
```

この部分はイケテナイ気もする

```kotlin

    if(this == null){ return null }
    val res = context.crypto.encrypt(this)
```
ブロック付きメソッドによる安全なリソース管理を破壊する

Rubyにおける良いスタイルとして、ブロック付きメソッドでリソースを自動管理するという手法がある。
この安全性を破壊してみよう。

# 前提知識
まず、確認として次を見てみよう。

```ruby
File.open("foo.txt") {|f|
  f.read(3)
}
```

1行目で開いた`File`オブジェクト`f`は3行目で自動的に`close`される。ブロック中の制御フローが多少複雑でも、例外が発生しても確実に3行目で`close`される。
最近では他の様々なメジャーな言語が独特の構文で似た機能を提供しているから、10年前とは異なり特にRubyの目立つ機能というわけでもなくなったが、とにかくブロックによるリソース管理は良いものだ。

しかし、安全は不自由でもある。ブロック終了時点で確実にファイルを閉じてしまうため、`File.open`を呼んだメソッドが終了したあとで`f.read`を呼ぶことはできない。

```ruby
def open_file(name)
  File.open(name) {|f| return f }
end

f = open_file("foo.txt")
f.read(3)  # IOError: closed stream
```

# 破壊への道のり
時として、人はそれでも自由を必要とする。そんな時はちょっとしたトリックで自動リソース管理を破壊しよう。

```ruby
def open_file(name)
  iter = File.enum_for(:open, name)
  return iter.next, ->{ loop { iter.next } }
end

f, close = open_file("foo.txt")
f.read(3)
close.call  # ちゃんとファイルを閉じるのは自己責任
```

これで安全性を取っ払って自由にリソースリークできる。

```ruby
10000.times.map do
  f, _ = open_file("foo.txt") # Errno::EMFILE: Too many open files @ rb_sysopen - foo.txt
  [f, f.read(3)]
end
```

# 終わりに
実のところ、`File.open`の場合なら単にブロック付きでないバージョンを呼べば良い。しかし、場合によってはそういう安全でないAPIは提供されていないこともある。また、安全でないAPIはコーディング規約で利用が禁止されているかもしれない。
そういうやむを得ない場合に、それでもどうしてもリソースをリークさせる必要があるときに本稿が役に立てば幸いである。
[Linux][Ansible] localeの設定 (ja_JP.UTF-8) に設定

Ansibleでlocaleを設定する方法

# 設定例

```yaml:localeの設定例(Ubuntu)
    - name: install language-pack-ja
      apt: name={{ item }} update_cache=yes
      with_items:
        - language-pack-ja

    - name: create locale ja_JP.UTF-8
      locale_gen:
        name: ja_JP.UTF-8

    - name: change locale
      command: update-locale LANG=ja_JP.UTF-8
```

Ansibleの `locale_gen` は対象のlocaleが生成されていなければ生成する。
（Ubuntuの場合には `language-pack-ja` のインストールで生成されているのでいらないかもしれない）

TODO: 最後でcommandで実行しているのを冪等性のチェックでokにするには？

# 参考
[locale_gen - Creates or removes locales. — Ansible Documentation](http://docs.ansible.com/ansible/locale_gen_module.html)
[Debian/Ubuntuのデフォルトロケールを変更する - Qiita](http://qiita.com/tailak/items/77b90a4df07e4f6a1fc2)
備忘録 Serverspec　fileリソースのbe_linked_to での苦悩。

Serverspec、はじめました。

# 1. やりたいこと
指定したファイルがシンボリックリンクになっているかどうかを確認した。


■対象ファイル
---
・/etc/localtime
・/etc/pam.d/system-auth
・/etc/pam.d/password-auth

---

```ruby:
$ ls -l /etc/localtime
lrwxrwxrwx 1 root root 25 Apr 26 13:50 /etc/localtime -> /usr/share/zoneinfo/Japan
$ ls -l /etc/pam.d/system-auth
lrwxrwxrwx. 1 root root 14 Jan 13 01:51 /etc/pam.d/system-auth -> system-auth-ac
$ ls -l /etc/pam.d/password-auth
lrwxrwxrwx. 1 root root 16 Jan 13 01:51 /etc/pam.d/password-auth -> password-auth-ac
```


## 2.コードを書く

```ruby:linuxos_spec.rb
require 'spec_helper'

describe file('/etc/localtime') do
    it { should be_linked_to '/usr/share/zoneinfo/Japan' }
end

describe file('/etc/pam.d/password-auth') do
it { should be_liked_to '/etc/pam.d/password-auth-ac' }
end

describe file('/etc/pam.d/system-auth') do
it { should be_liked_to '/etc/pam.d/system-auth-ac' }
end
```

## 3.テスト実行する
悲しいかな失敗に終わる。

```ruby:
$ rake spec:test01 ASK_SUDO_PASSWORD=1
(in /home/serverspec)
/opt/chef/embedded/bin/ruby -I/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/rspec-support-3.5.0/lib:/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/rspec-core-3.5.4/lib /opt/chef/embedded/lib/ruby/gems/2.3.0/gems/rspec-core-3.5.4/exe/rspec --pattern spec/test01/\*_spec.rb
Enter sudo password:

File "/etc/localtime"
test@test01's password:
  should be linked to "/usr/share/zoneinfo/Japan"

File "/etc/pam.d/password-auth"
  should be liked to "/etc/pam.d/password-auth-ac" (FAILED - 1)

File "/etc/pam.d/system-auth"
  should be liked to "/etc/pam.d/system-auth-ac" (FAILED - 2)

Failures:

  1) File "/etc/pam.d/password-auth" should be liked to "/etc/pam.d/password-auth-ac"
     On host `sistest01'
     Failure/Error: it { should be_liked_to '/etc/pam.d/password-auth-ac' }
       expected File "/etc/pam.d/password-auth" to respond to `liked_to?`

     # ./spec/test01/linuxos_spec.rb:8:in `block (2 levels) in <top (required)>'

  2) File "/etc/pam.d/system-auth" should be liked to "/etc/pam.d/system-auth-ac"
     On host `test01'
     Failure/Error: it { should be_liked_to '/etc/pam.d/system-auth-ac' }
       expected File "/etc/pam.d/system-auth" to respond to `liked_to?`

     # ./spec/test01/linuxos_spec.rb:12:in `block (2 levels) in <top (required)>'

Finished in 2.89 seconds (files took 2.34 seconds to load)
3 examples, 2 failures

Failed examples:

rspec ./spec/test01/linuxos_spec.rb:8 # File "/etc/pam.d/password-auth" should be liked to "/etc/pam.d/password-auth-ac"
rspec ./spec/test01/linuxos_spec.rb:12 # File "/etc/pam.d/system-auth" should be liked to "/etc/pam.d/system-auth-ac"

/opt/chef/embedded/bin/ruby -I/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/rspec-support-3.5.0/lib:/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/rspec-core-3.5.4/lib /opt/chef/embedded/lib/ruby/gems/2.3.0/gems/rspec-core-3.5.4/exe/rspec --pattern spec/test01/\*_spec.rb failed
```

/etc/pam.d/system-authも/etc/pam.d/password-authもシンボリックリンクファイルですが？

中年の悩みは解消しないこと3日・・・
Laravelインストール。設定。

インストールのコマンド

```
composer global require "laravel/installer"

```



##基本の書き方
```
Route::get('/', function () {
    return view('index');
});
```

##変数名
```
<span>{{$name}}</span>
```
```
Route::get('/confirm', function () {

    //$で変数名
    //

    return view('confirm', [
        "name" => $user,

    ]);
});
```


```
Route::get('/confirm', function () {
    
    //DBのユーザー名をとってくる
    $user = User::first();

    return view('confirm', [
        "name" => $user,
        "tel" => "0800000000",
    ]);
});
```
Mac自動アプリ起動

#概要
パソコンを叩いていてついつい定例のものを忘れたりするので、定刻になったらアプリを開いてくれるように自動化したいと思っていた。

#Macbookで自動でアプリを起動させる方法
Mac標準搭載のカレンダーアプリの設定を行えばいい。
手順を下記に記載していく。

このアプリです。
<img width="133" alt="スクリーンショット 2017-06-01 17.07.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/167850/d11a3d56-14bb-4bfa-b570-3fa11056ad41.png">

まずアプリを起動させる。
![スクリーンショット 2017-06-01 17.07.39.png](https://qiita-image-store.s3.amazonaws.com/0/167850/086d6399-468d-ff05-8b28-9010ab0ca8ba.png)


新規のイベントを作成して設定をしていく。
<img width="1047" alt="スクリーンショット 2017-06-01 17.09.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/167850/9de83792-c431-e20a-2804-557491365f24.png">

通知の部分でファイルを開くを選択。イベントの開始時刻を選べばカレンダーに設定した時間にファイル（アプリ）を起動させることができます。

![スクリーンショット 2017-06-01 17.10.04.png](https://qiita-image-store.s3.amazonaws.com/0/167850/e5c0643b-9959-cfae-1136-5c57fe3dc2c1.png)

<img width="931" alt="スクリーンショット 2017-06-01 17.14.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/167850/ea2e9dac-0d2e-5939-07ae-1c87397e204b.png">

#参考記事
http://gijutsubu.backstage.jp/?eid=87
A5:SQL Mk-2を使ってDB定義書を自動生成

## 概要
DB定義書を自動で作ってくれる、「A5:SQL Mk-2」というツールの使い方です。
出力方式は、ExcelかHTMLのどちらかを選択できます。
MySQL、PostgreSQL、Oracleなど、さまざまな環境で利用できます。
また、SSHトンネルでDBに接続することもできます。
非常に便利で簡単に使えるツールです。

## 動作環境
Windows XP, Windows Vista, Windows 7, Windows 8, Windows 8.1, Windows 10
Windows Server 2003, Windows Server 2008, Windows Server 2012

## ダウンロード
http://a5m2.mmatsubara.com/
ここからダウンロードします。
ページ下部から、ご自分の環境にあったものをダウンロードしてください。

![e86c7282ec3a80dab84a28d8f9827819.png](https://qiita-image-store.s3.amazonaws.com/0/105936/cb4e68ca-bd23-8a64-1e7b-f718b209cee2.png)

ZIPファイルがダウンロードされるので、解凍して、適切な場所へ設置してください。

## 起動
解凍したら、ディレクトリ内にある `A5M2.exe` を実行してください。
そうすると、このような画面が表示されます。よくわからない場合は、 `レジストリ` を選択してください。
`設定ファイル` を選択すると、 `ポータブルモードではパスワードの指定が推奨されます` と表示され、
A5:SQL Mk-2を起動するたびに入力するためのパスワード設定画面が出るので、入力してください。

![65713c8e60281b012662dee6550e2d45.png](https://qiita-image-store.s3.amazonaws.com/0/105936/d0d46c6d-3e8b-ad2d-46df-d443056b15c3.png)


## DB接続情報設定
OKを押します。
![20f51d800c6aa1910376eeb34999bd47.png](https://qiita-image-store.s3.amazonaws.com/0/105936/98379af5-a9fd-8e17-fae8-c6815d36a99d.png)

追加をクリックします。
![5d2bf82c14a7814337abb7b9a60d0101.png](https://qiita-image-store.s3.amazonaws.com/0/105936/40bd8eb9-7f79-d6bc-5dab-25e8fe6fa97c.png)

環境に合ったものをクリックします。
今回は、Mysql且つ、SSHトンネルでDBに接続する方法を取ります。
その場合、 `MySQL/MariaDB (直接接続) (M)` をクリックしてください。
SSHトンネルの場合でも、直接接続で設定します。
![16f65aa9a966a22f13a3b535b9d54f4a.png](https://qiita-image-store.s3.amazonaws.com/0/105936/f9b72754-1e16-c4ef-8c8d-10e19226af21.png)

## DB接続情報の設定
基本タブで、DBの接続情報を設定してください。
![fd71322db9e78bc24a45347fc30e1b7c.png](https://qiita-image-store.s3.amazonaws.com/0/105936/5d894c94-a9d2-15fb-16c5-b9c633fa9a5b.png)



## SSHトンネルの設定
`SSH2トンネル` タブを選択し、`SSH2トンネル経由で接続する` にチェックを入れ、SSH接続に必要な情報を入力してください。
![a0dba403c917ff501de965ec74c67d9.png](https://qiita-image-store.s3.amazonaws.com/0/105936/9ab717f9-2f5a-6ace-bfd6-39eb9cdca880.png)

設定が終わったら、 `テスト接続` をクリックして、DBに接続できることを確認してください。
![2f784160276ef744af12a463dbe5136e.png](https://qiita-image-store.s3.amazonaws.com/0/105936/95a7f09e-42e2-9566-e0e8-87239675d1af.png)

## DB定義書の作成
DB名の左の三角印をクリックして、ダイアログが出たら、 `接続` をクリックしてください。
![706d60ebf058a52c620b22e6bf76ecdd.png](https://qiita-image-store.s3.amazonaws.com/0/105936/d6ab77dc-a3e9-b4a4-cd62-3d200ce4fa75.png)

DBに接続されたら、ツールバーの
[データベース(D)] → [テーブル定義書作成(S)]
をクリックしてください。

そうすると、下記が表示されるので、DBとテーブル、また出力方式を選んで、 `テーブル定義書作成` をクリックしてください。
今回はExcelで出力します。
![7871e5de64d960b6540d19c5722a51e6.png](https://qiita-image-store.s3.amazonaws.com/0/105936/ae51d0bb-618a-ccf9-b9e0-a8c6de08dfd8.png)

## 出力
すると、この様なExcelが出力されます。
テーブルごとにシートが分かれています。
この状態ではまだ保存されていないので、[名前を付けて保存] をしてください。
![6839399289910a62e357190eeb7fc805.png](https://qiita-image-store.s3.amazonaws.com/0/105936/3d2a151d-f0e4-f3e2-9155-1ba655f2081f.png)

以上でDB定義書の作成は終わりです。
HTML方式で出力すると、テーブルごとにHTMLファイルが生成されます。

非常に簡単で便利です。

## 参考
http://a5m2.mmatsubara.com/
https://liginc.co.jp/programmer/archives/2686
Vue-SPAでもGoogle Analyticsしたい！

小ネタです。

VueでSPAを作った時にも、GoogleAnalytics（以下、GA）でトラッキングしたい！
でもどうしたら…。

と思った皆さん、朗報です。 [vue-analytics](https://github.com/MatteoGabriele/vue-analytics)というモジュールがあります。

# 使い方
とっても簡単。モジュールをロードして、`Vue.use()`で組み込むだけ。

```javascript:main.js
import Vue from 'vue'
import VueAnalytics from 'vue-analytics'

Vue.use(VueAnalytics, {
  id: 'UA-XXX-X'
})
```

あとは

```javascript
this.$ga.page('/')
```

と呼び出すだけでGAにAPIを投げてくれます。


## vue-routerとの連携
[vue-router](https://router.vuejs.org/ja/) を使っている場合は、


```javascript:main.js
import Vue from 'vue'
import router from './router'
import VueAnalytics from 'vue-analytics'

Vue.use(VueAnalytics, {
  id: 'UA-XXX-X',
  router
})
```

とすれば、ページ（URL）切り替えをするたびに自動的にGAにAPIを投げてくれます。
便利ですね。
xrandr でHI-DPI(Retina）なLinuxでのマルチモニタの設定

DELLのxps-13(解像度3200x1800)にUbuntuを入れて使っているのですが、13インチでこの解像度ではドットバイドットで使用するのはちょっと厳しい。最近のUbuntuはちゃんとHI-DPIな環境も考慮していて、設定画面からwindow scalingなるものを設定できるのですが、これが整数しか指定できず、実質的には2（2倍）を設定するしかありません。ただ、それではFullHDにも満たない解像度になってしまいます。まあそれでも1600x900あるんだからまあいっかと思えなくもないのですが、ここに余っていたFullHDのモニタをつなげるとそっちもスケール2倍で描画されてしまい、これはがまんできん、ということでいろいろ調べたらxrandrコマンドで詳細な設定ができることを知ったのでそれのメモ。

## 接続済みのディスプレイの検出
```
$ xrandr | grep -w connected
```
とやると、ディスプレイの一覧が表示されます。

```
eDP-1 connected primary 3200x1800+1920+0 (normal left inverted right x axis y axis) 294mm x 165mm
HDMI-1 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 476mm x 267mm
```

eDP-1というのがxps-13のディスプレイで、HDMI-1が外部ディスプレイのことです。
外部ディスプレイを左側に置いているので、xps-13の設定が 3200x1800+1920+0 になります。
x座標が1920、つまり外部モニタがFulHDなのでその右側に位置させたいのなら、このような値になる、ということです。

## スケーリングの値を変更する

まずは外部モニタの解像度を本来のFullHDにしたいので、次のように打ちます。
```
$ xrandr --output HDMI-1 --scale 2x2 
```

本来のFullHDになりました。
ここでxrandrでHDMI-1の値を見てみると解像度がFullHDの倍になっていました。
UbuntuのWindowScaleを2にしているので、FullHDを4Kにしてスケール2倍で描画、てなイメージでしょうか。

## xps-13のディスプレイの座標を変更

となりのモニタの解像度が大きくなったので、本体の表示位置もその分ずらしてやる必要があります。
```
$ xrandr --output eDP-1 --pos 3840x0
```

## xps―13の解像度もせめてFullHDにする

外部モニタの方は本来のFullHDの解像度にできたので、xps-13本体の方もせめてFullHDにしたいところです。13インチなのでそのあたりが限度ではありますが、、、。

```
$ xrandr --output e-DP1 --scale 1.2x1.2
```

本来の解像度が3200x1800のところをスケール2倍にしているので、実際の解像度は1600x900になっているのですが、これを1.2倍すればちょうど1920x1080のFullHD解像度になります。

これで無事にxps-13はFullHDのRetinaとして、外部モニタは通常のFullHDモニタとして快適に使えるようになりました。

最終的には下のような値になります。

```
$ xrandr | grep -w connected
eDP-1 connected primary 3840x2160+3840+0 (normal left inverted right x axis y axis) 294mm x 165mm
HDMI-1 connected 3840x2160+0+0 (normal left inverted right x axis y axis) 476mm x 267mm
```
Azure Image 超概要

# はじめに
今年2月に新たなストレージ形態としてリリースされたManaged Diskと同時に、Azureではイメージとスナップショットがリリースされました。
V1のときはイメージというリソースがありましたが、V2になってからは仮想マシンのテンプレート化の手順も複雑化してしまっていたので、Azureユーザとしては朗報でした。
そこで、本記事ではAzureのV2で提供されているイメージリソースに関してまとめていきたいと思います。

# イメージ概要
![image.png](https://qiita-image-store.s3.amazonaws.com/0/181154/ba558ee1-b712-dffd-e89e-30d7d8ae61ba.png)←このリソースのこと

・Azure上に存在する仮想マシンをテンプレート化して簡単に複製を作成するためのサービス。
・仮想マシンのOSディスクのみでなく追加されたデータディスクもまとめて一つのイメージとしてテンプレート化できる。
・従来のカスタムイメージと違いBLOB上のVHDファイルでなく、一つのリソースとして見える。
・仮想マシンからのみでなく、BLOB上の既存VHDからもイメージの作成が可能。
・__イメージに対して課金は一切発生しない。__

# イメージ作成方法
## 仮想マシンから作成する方法
前提として仮想マシンにログインし、__sysprep終了済み__であることとする。

1. sysprepを行った仮想マシンを仮想マシンの概要ページから停止させる。
2. 概要ページの上部にある「撮影タブ」を選択しイメージ化を行う。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/181154/1c52f124-c1ea-51f4-8a61-1a1a30182f32.png)

3. イメージの名前、リソースグループを入力し、イメージの作成を行う。
　下のチェックボックスはイメージ作成後に仮想マシンを削除するか否かの選択です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/181154/eb28c369-6325-021c-3e4f-1bd24b60e982.png)

作成したイメージは以下の図のようにリソースとして表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/181154/5e2334e0-4218-5837-9ace-1c36e8058411.png)

## vhdファイルから作成する方法

1. イメージリソースのページを開き、左上の「追加」を選択する。
![Image02.png](https://qiita-image-store.s3.amazonaws.com/0/181154/10a40f55-50c8-0593-aa96-31d5b921214f.png)

2. イメージの名前、サブスクリプション、リソースグループ、リージョン、VHDの場所(BLOBから指定)等の設定値を入力し、作成を選択する。OSディスクと別でデータディスクを追加することも可能です。
![Image03.png](https://qiita-image-store.s3.amazonaws.com/0/181154/6cdfc9db-01cc-7390-3fce-c8e756fc1763.png)

# イメージからVMの作成方法

1. イメージの一覧からVMを作成したいイメージを選択し、「VMの作成」を選択する。
![Image04.png](https://qiita-image-store.s3.amazonaws.com/0/181154/65ed22ce-5612-53f1-0cbd-fad9650c203a.png)

2. 新規でVMを作成するときと同様にウィザードを進めます。

* サブスクリプションとリージョンはイメージと同一のもの以外選択できなくなっています。
* 追加データディスクがある場合はVMサイズの選択に注意。
* __NSGはデフォルトだと何も規則が入っていない状態(新規で作った際の様にrdp,sshの許可さえ入っていない)なので注意。__

![Image05.png](https://qiita-image-store.s3.amazonaws.com/0/181154/a8157342-4cb6-c6cd-3db0-064c1929a0ca.png)

# まとめ
以上が基本的なイメージリソースの使用方法になります。
イメージリソース自体は課金が発生しないために、色々なパターンのイメージを用意することで業務の効率化(ARMテンプレートを用意すればさらに効率化！)が図れると思います。
しかし、一点気を付けなければならないのが現段階では**一つのサブスクリプション内での使用に限られている点**です。
ポータルのイメージのページにはリソースの移動という項目が準備されていますが、依然として「Coming Soon」といった状況です。
また、サブスクリプション間のリソースの移動が出来るようになっても、**リソースを移動するユーザーが移動元及び移動先サブスクリプションの両方が見えている必要があります。**
つまり__両サブスクリプションが同一AzureADディレクトリと紐づけられている__必要があります。
以上のことを考えるとこのイメージリソースはあくまでも社内やグループ内利用に向いていると言えるでしょう。
今後AWSのAMIの様に特定のユーザーにだけ公開するといった機能が実装されることを待ち望むばかりです。
先月の日時を求める関数

#目的
先月の日時を得たいが、単純に月を1引いた日時が存在し得ない暦になってしまう場合は、先月の末日に直してから得たい。

#コード

```php:php

<?php

function getPrevMonthDatetime($datetime)
{
	// 先月の1日のtime
	$prevFirstTime = strtotime(date('Y-m-01 00:00:00', strtotime($datetime)).' -1 month');
	// 先月の年
	$prevYear    = date('Y', $prevFirstTime);
	// 先月の月
	$prevMonth   = date('m', $prevFirstTime);
	// 先月の末日
	$prevLastDay = date('t', $prevFirstTime);
	
	$nowTime = strtotime($datetime);
	// 現在の日
	$nowDay = date('d', $nowTime);
	// 現在の時分秒
	$nowHis = date('H:i:s', $nowTime);
	
	// もし現在の日より先月の末日が前なら、先月の末日になる
	if ($prevLastDay < $nowDay) {
	    return $prevYear.'-'.$prevMonth.'-'.$prevLastDay.' '.$nowHis;
	}
	
	// そうでなければ、先月の現在の日になる
	return $prevYear.'-'.$prevMonth.'-'.$nowDay.' '.$nowHis;
}
    
```

# テスト

http://ideone.com/lB7kod
ChromeのDevToolsのテーマを変更する

Developer Tools Settings(F1)
![スクリーンショット 2017-06-01 16.53.26.png](https://qiita-image-store.s3.amazonaws.com/0/24510/fbb2c35d-69c3-e2dd-a8d2-31ab2d8db669.png)

Preferences > Appearance > Theme
![スクリーンショット_2017-06-01_13_06_48.png](https://qiita-image-store.s3.amazonaws.com/0/24510/15cce295-6c01-55e5-46b1-7d8850daba11.png)

変更するとこんな感じ↓

Light
![スクリーンショット 2017-06-01 16.56.12.png](https://qiita-image-store.s3.amazonaws.com/0/24510/495ded6f-f6da-b7ca-4011-9cc938fb39c0.png)

Dark
![スクリーンショット 2017-06-01 16.55.42.png](https://qiita-image-store.s3.amazonaws.com/0/24510/48f5909a-9f19-9aaf-0f2f-8ed4616ce26d.png)
javaからkotlinへの移行メモ

#**はじめに**
kotlinがAndroidの公式言語となり、これからはkotlinで開発することが多くなりそうです。
仕事で一部のjavaクラスをkotlinに置き換える機会があったので
一括置換ではうまくいかなかった部分をどのように修正したかをメモとして残しておきます。
Android開発はまだ1年目なので至らない部分はあるかと思いますがご了承ください。

#**参考**
https://www.slideshare.net/kenichitatsuhama/java-kotlin

#やったこと
##**一括置換を行う** 

はじめにCodeメニューからconvert Java File to Kotlin Fileを選択します。

だいたいはうまく置換してくれます。

##**return@~以降の記述を正しいものにする**
基本returnはメソッドを抜ける時に使用しますが
ラムダの中で記述してあるとメソッドを抜けるのかラムダを抜けるのかが正しく判断してくれないようです。
returnの後に@を打てば正しいものが候補に出てくると思います。

##**staticメソッドに＠JvmStaticをつける**

これはjavaからkotlinのstaticメソッドにアクセスできるようにするための修正です。

##**メンバー変数のmをとる**
IDEの機能でリネームを行えば手作業より間違いがないのでそれを利用します。

##**メンバー呼び出しで「!!」の記述があるところは適宜修正する**
これはメンバーがnullであっても実行されるので修正します。
以下の方法があります。
* 渡している変数をNotNullに変更する
* Null安全呼び出しにする

##**関数の引数に「!!」がついた変数を渡さないように修正する**
* スコープ関数を利用して非Nullであることを保証する

```修正前.kt
hoge.fuga(piyo!!)
```

```修正後.kt
piyo?.let {
hoge.fuga(it)
}
```
##**＠BindDrawableを利用しているところはlazyプロパティに変更する**
```例.kt
internal val icon: Drawable? by lazy {
ResourcesCompat.getDrawable(resources, R.drawable.icon, null)
}
```

##**明示的に型指定、型変換をする**
```修正前.kt
bundle.getLong(hogehoge) != 0)
```

```修正後.kt
bundle.getLong(hogehoge) != 0L)
```

##**可能な箇所はvarをvalに変更する**
onCreateなどで初期化を行っている箇所などはlazyプロパティを利用して遅延初期化を行うなどの対応ができると思います。

##**internalは同一モジュール内で全公開となるので、必要ないのであればprivateにする**
internal -> private

##**必要ならばasをas?に変更する**
findFragmentByTagをしている部分など

##**シングルトンが自動変換されない**
object キーワードを利用したシングルトンに置き換える

##**ラムダ式になっている部分の使用されていないパラメータは、｢_｣にリネームしたり、取り除く**
今回はリファクタも行いました。



#**さいごに**
他にも修正点がありそうなのですが今回対応した分は以上です。
また新たに修正点がでてきたら更新していこうと思います。
dockerのcentOS6にionicのモバイルweb開発環境を構築したメモ

##node.jsを用意する

###インストール

参考
http://qiita.com/you21979@github/items/4efd9fc4363573191b5c

```
# yum install epel-release
# yum install nodejs npm --enablerepo=epel
# yum install gcc gcc-c++
```

###アップデート

参考
http://parashuto.com/rriver/tools/updating-node-js-and-npm

最新版にはエラーがあるので、安定版のv6.9.4でアップデートする。

```
# n 6.9.4
…

# ln -sf /usr/local/bin/node /usr/bin/node
# node -v
v6.9.4
```

##ionicの開発環境を作る

###インストール

参考
http://qiita.com/pugiemonn/items/744032601c728dbbe7b4

###開発のための準備

上記を参考に進めていく。

```
# yo ionic
...

Error: EACCES: permission denied, mkdir '/root/.config'
```

同じようなエラーにぶち当たっている方がいたのでそちらを参考に。
http://qiita.com/tubone/items/11a7ceb3e7013139abab
パーミッションをいちいち変更していってもエラーはなくなるが、
新しいユーザーを作るとエラーが出なくなった。


```
# useradd ionic
# gpasswd -a ionic root
Adding user ionic to group root
```

ionicの作業フォルダのパーミッションを変更する

```
# chmod 774 -R /[作業フォルダ名]
```

もういちど

```
$ yo ionic
```
今度は成功する。
いざサーバーを…

```
$ grunt serve
...

Warning: Error: Cannot find where you keep your Bower packages. Use --force to continue.
```

そのあともbowerとgitがないと言われるのでsuに戻ってインストール

```
# npm install -g bower
# yum install git
```

```
# su ionic
$ grunt serve

...
Warning: Error: Cannot find where you keep your Bower packages. Use --force to continue.
```

まだだめだった。


```
$ bower install
$ grunt serve
```

こんどこそサーバーが立ち上がる。
python3で小数点以下を四捨五入で計算する簡単な方法

# python3で指定した小数点位置で四捨五入で計算する方法

すぐに忘れそうなので備忘のために書いておく。
**round()があるよ**
小数点以下の四捨五入は簡単だけど、知らなかったので。
※切り捨て、切り上げはmathモジュールでやる(参考リンク先を参照)

## デフォルトはこうなる

```python3:python3
>>> a = 1
>>> b = 6
>>> a / b
0.16666666666666666
```

## round関数を使う

```python3:python3
>>> round((a / b), 1)
0.2
>>> round((a / b), 2)
0.17
>>> round((a / b), 3)
0.167
>>> round((a / b), 4)
0.1667
```
#追記
考慮の不足があったので、追記です。

python3系では端数処理により、うまく丸められないことがありました。
[python3の四捨五入でハマったのでメモ](https://qiita.com/sak_2/items/b2dd8bd1c4e4b0788e9a)
こちらの方も解決されていました。
説明なども含めてとても参考になりました。
※こちらに記載のlamdaが小数点以下1桁の解決法でしたので、本稿では2桁以上に対応します。

ただのroundで不都合が発生するのは例えばこの様な感じ。

```pypthon3:python3
>>> round(1.1115, 3)
1.111
>>> round(1.1125, 3)
1.113
```

こういった場合も含めて、以下の様な関数で任意の長さのfloat型も四捨五入が可能となると思います。
※ちょっとテストが不足しているかもしれないので、もし不具合等があれば指摘ください。

```python3:python3
def custom_round(number, ndigits=0):
    if type(number) == int:#整数ならそのまま返す
        return number
    d_point = len(str(number).split('.')[1])#小数点以下が何桁あるか定義
    if ndigits >= d_point:#求める小数点以下の値が引数より大きい場合はそのまま返す
        return number
    c = (10 ** d_point) * 2
    #小数点以下の桁数分元の数に0を足して整数にして2倍するための値(0.01ならcは200)
    return round((number * c + 1) / c, ndigits)
    #元の数に0を足して整数にして2倍して1を足して2で割る。元の数が0.01なら0.015にしてroundを行う
```

```python3:実行例
>>> round(1.1115, 3)
1.111
>>> round(1.1125, 3)
1.113
>>>
>>> custom_round(1.1115, 3)
1.112
>>> custom_round(1.1125, 3)
1.113
>>> round(4.5)
4
>>> round(3.5)
4
>>> custom_round(4.5)
5.0
>>> custom_round(3.5)
4.0
```

### 参考リンク
[Python/サンプル/小数点以下の値の操作・四捨五入や切上げ、切捨て](http://ll.just4fun.biz/?Python/%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB/%E5%B0%8F%E6%95%B0%E7%82%B9%E4%BB%A5%E4%B8%8B%E3%81%AE%E5%80%A4%E3%81%AE%E6%93%8D%E4%BD%9C%E3%83%BB%E5%9B%9B%E6%8D%A8%E4%BA%94%E5%85%A5%E3%82%84%E5%88%87%E4%B8%8A%E3%81%92%E3%80%81%E5%88%87%E6%8D%A8%E3%81%A6)
[本家 (2. 組み込み関数 #round())](https://docs.python.jp/3/library/functions.html#round)
[python3の四捨五入でハマったのでメモ](https://qiita.com/sak_2/items/b2dd8bd1c4e4b0788e9a)
俺でもできるタスク管理

_本記事はcloudpackあら便利カレンダー１日目の記事です_

# あら便利カレンダー誕生秘話

1. 体制変更でセクションリーダーになった
2. もちろんミッションがある
3. iretアドベントカレンダーやるか！
4. 12月まであと半年かぁ...
5. ６月祝日ないんだよなぁ...

*じゃあ平日毎日ブログかこうぜｗｗｗｗｗｗｗｗｗｗ*


というわけで１日目は企画した僕がやります！
名付け親は僕なんですが、アドベントカレンダーとレーベンシュタイン距離が近いので気に入っています。

あら便利カレンダーは[こちら](https://cloudpack.github.io/benri2017/)


# 俺でもできるタスク管理

私は今もそうですが、エンジニアでご飯を食べています。
が、上でも述べた通りリーダー的なこともしているので、どうしても必要になってくるのがチームのタスク管理。

僕のチームはR&Dセクションという研究や検証を主に行っているので、

- 変わったメンバーが多い
- 案件状況がコロコロ変わる
- 同時多発的に案件を遂行している（最多で16案件並行）

そんな理由で、ラフにタスクを管理できるよう工夫しています。
今回はその手法を紹介します。


## 用意するもの

- Slack
- Trello
- Ganttify


## はいはいトレロね、あーはいはい

そうなんです。それだけなんです。
でもちょっと工夫してます。

たとえば、リストは以下のように管理してます。

- 継続（差し込みあったら優先度下げよう）：毎日細々やらないといけないタスク
- やりたい：研究・検証したいけど、案件規模じゃないタスク
- 提案中：検証は完了して案件化するまでの間のタスク。最悪ぽしゃる系
- スタート待ち：やることは決まってるけど、契約とかの都合で着手できない状態のやつら。
- 真っ只中：案件真っ最中
- 終わりそう：大枠終わったぜってやつ
- 完了：オワコン

この中に案件単位のカードを差し込んで、カードにはメンバーと期日を設定しています。

運用ルール的に、アーカイブは僕以外の人はしないようにしてもらってます。
僕が最後の砦なので、僕が確認してやっと、完了 -> アーカイブ、ぽしゃ -> アーカイブが認められる、みたいな感じ。

逆にそれ以外のルールは特にありません。
強いていうならできるだけふざけた感じになるように心がけてます。疲れちゃうので。

![案件s___Trello.png](https://qiita-image-store.s3.amazonaws.com/0/73113/3cbfc64e-faf5-338a-b0e8-1854753bfbb1.png)


## スラックね、つこてるわ当たり前やろ

そうなんですよね。当たり前なんですよ。ボタンポチーで連携できるので楽です。
カードの状態がどう変わったかの履歴がほしいとかじゃなくて、報告の代わりとしてます。
カード移動したら勝手に通知がくるので、本来報告する側もされる側も時間がとられず「ふーん」と思えます。
逆に変なカード移動があれば、それをトリガーにヒアリングもできますよね！

<img width="573" alt="Slack_-_cloudpack.png" src="https://qiita-image-store.s3.amazonaws.com/0/73113/fb29a1e5-ec31-6805-2932-f68b56cd37e2.png">


## Ganttify

なんすかね？これ
Trelloに登録したカードとその期日を元にガントチャートを出力してくれるサービスです。
データの可視化ってやつですよね。
線が重なりすぎてると忙しいよね〜って思うようにしてます。

![Ganttify_と_Desktop.png](https://qiita-image-store.s3.amazonaws.com/0/73113/f1fd8227-99e8-b754-1893-e668c9db4d58.png)

_何もわからない図_

# おわりに

本当にたったこれだけのことしかしてないんですが、タスクが思った以上に管理できてます。
スマホからもやりやすいしね！
viewの可視状態が変化したら（setVisibilityされたら）Eventが欲しい

# やりたいこと

```java
view.setVisibility(View.VISIBLE);
```

とか

```java
view.setVisibility(View.GONE);
```

とかされて可視状態が変化したらEventとして欲しい。
それを捕捉して何かやりたい。



# やったこと

```java

// 同じ状態を再設定でコールバックされないようにtagを使って排他制御
view.setTag(view.getVisibility());
view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        if((int)view.getTag() != (int)view.getVisibility()) {
            view.setTag(view.getVisibility());

            if(view.getVisibility() == View.VISIBLE) {
                // みえた
            }else{
                // それ以外
            }
        }
    }
});
```


# Fragment単位でも使えます

その場合はDataBindingしてたら例えば

```java
final View view = mBinding.getRoot();
```

この子に対しての監視でおｋ
SwiftとIBAction

先日ごくごく小さなツールを書いたときに自分でも面白いなぁと思ったので書き記しておく。

## SwiftでIBAction作りにくい

作りにくいというか、NSObjectから継承する必要があって「気持ち悪い」ことがある。

## JavaのActionListenerぽいやつ

JavaのActionListenerぽいのを考えたけどあまりうまくなかった

## 委譲しちゃえ

委譲しちゃう

## ActionListener

名前だけはJavaからいただいた。

```swift
class ActionListener: NSObject {
    weak var owner: Any?
}
```
これだけ。

## 使う人

```swift
extension ActionListener {
    @IBAction func quit(_ sender: Any?) {
        NSApplication.shared().terminate(nil)
    }
}

extension Selector {
    static let quit = #selector(ActionListener.quit(_:))
}

struct QuitItem {
    let menuItem = NSMenuItem()
    private let listener = ActionListener()

    init() {
         let format = NSLocalizedString("Quit %@", comment: "Quit Menu Item")
         menuItem.title = String(format: format, AppDelegate.appName)
         menuItem.action = .quit
         menuItem.target = listener
     }
}
```

*...委譲ではない？*

## 既知の問題点

ぽ、ぽりもーふぃずむ？？？
Google VR Viewで360度コンテンツにHotspotを追加する方法

360度コンテンツを簡単に取り入れることが出来るGoogle VR View。

今回は、コンテンツにHotspotを追加してみました。
Hotspotとは、円形のボタンのようなもので、
イベントを追加することが出来ます。

[Google VR Viewで360度コンテンツを表示する方法はこちらから。](http://qiita.com/kfunnytokyo/items/aabb3373ec79ef668f6e)

#Hotspotを追加する

![tyopress2.jpg](https://qiita-image-store.s3.amazonaws.com/0/139029/30135f53-f921-fcee-5a82-7b0caab8a687.jpeg)

vrView.addHotspot()でHotspotを追加します。

```
<script>
  vrView.addHotspot('任意のID', {
    pitch: 0, // 上方向の位置。-90,90の範囲で指定。
    yaw: 0, // 横方向の位置。-180,180の範囲で指定。
    radius: 0.05, // 円の半径。
    distance: 1 // カメラからの距離。
  });
<script>
```

#Hotspotにイベントを追加する

イベントはon()を使って追加します。

```
<script>
  vrView.on('click', function(e) {
    if (e.id == '任意のID') {
      // 処理。
    }
  });
</script>
```

さらに、ページがロードされたらコンテンツを表示して、
Hotspotとイベントを追加するようにしてみます。

*Hotspotをクリックしたら、コンソールにテキストを表示する処理を追加しています。

```
<script>
  function onLoad() {
    vrView = new VRView.Player('#vrview', {
      image: '../img/tyopress.jpg',
      width: '100%',
      height: '100%',
      is_autopan_off: true,
    });

    vrView.on('ready', onVRViewReady);
    vrView.on('click', onVRViewClick);
  }

  function onVRViewReady(e) {
    vrView.addHotspot('clickspot', {
      pitch: 0, // 上方向の位置。-90,90の範囲で指定。
      yaw: 0, // 横方向の位置。-180,180の範囲で指定。
      radius: 0.05, // 円の半径。
      distance: 1 // カメラからの距離。
    });
  }

  function onVRViewClick(e) {
    if (e.id == 'clickspot') {
      console.log('Hotspotをclickしました！')
    }
  }

  window.addEventListener('load', onLoad);
</script>
```

[![tyopress.jpg](https://qiita-image-store.s3.amazonaws.com/0/139029/cc266dea-46a4-6e08-dabe-c08501c220bb.jpeg)デモページはこちらから。](https://google-vrview.herokuapp.com/hotspot/)

処理の部分を変更すれば、
色々なイベントを組み込めちゃいます。

[公式サイト](http://googlevr.github.io/vrview/examples/hotspots/index.html)には、Hotspotを駆使したギャラリーが紹介されています。
こんな風にHotspotを使って、
道案内や建物の紹介などに取り入れてみるのも良さそうですね！
railsで、住所入れたら、その位置のgooglemapを表示させる

##やりたいこと
![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/167576/b0876810-97af-baf7-9953-405efaab69dc.png)

京都駅と記入して、青いボタンの登録をすると、下に京都駅のgoogle mapが出てくる。


##gem追加

```ruby:Gemfile
gem 'geocoder'
```
```ruby:ターミナル
bundle install
```

##モデル説明

今回は、shopモデルに住所を入れたいとする

shopモデル　

![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/167576/cd873c8b-93f5-65ba-40cc-2ce205891f1a.png)

上の図の説明は、shopモデルである。店の名前と来客人数のカラムを作ってある。
　　googlemap表示のために、カラムaddress latitude longtudeを追加する。


```ruby:ターミナル
rails generate migration AddaddressLatitudeAndLongitudeToShop address:string latitude:float longitude:float
```


```ruby:shop.rb
geocoded_by :address
after_validation :geocode, if: :address_changed?　
```
上の記述で、　住所（カラムaddress）を入れたときに、自動でその住所の緯度、経度をカラムlatitude,
longitudeに記述してくれる。

### 登録画面


```ruby:show.html.erb
<%= form_for @shop :url => {:action => :update}   do |f| %>

 <div class="text-center"><%= f.text_field :address %></div>

    <%= f.submit "住所登録", class: "btn btn-primary center-block" %>

 
 <% end %>


 <body>
    <div id="map"></div>
    <style>
    	#map {
        height: 500px;
        width: 70%;
      }
    </style>
    <script>
      function initMap() {
        var uluru = {lat: <%= @shop.latitude %>, lng: <%= @shop.longitude %>};
        var map = new google.maps.Map(document.getElementById('map'), {
          zoom: 16,
          center: uluru
        });
        var marker = new google.maps.Marker({
          position: uluru,
          map: map
        });
      }
    </script>
    <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap"
    async defer></script>
  </body>

```

下からの３行目YOUR_API_KEY記述がある。　これは、各自でgooglemapAPIからkey取得する必要がある。
http://qiita.com/kitaokeita/items/a7f33615940e67c13820
このリンクにkey取得のやり方が書かれているので参考してください

参考文献
https://dev.9bar.tokyo/rails/geocoder
第14回つぶやき勉強会 Ruby と Javascript の スコープとか


## ruby's scope gate は、 class / module / def という話をしました。

----

## つまり ブロックはクロージャであり、以下のようにできる

----

```rb
def hoge
  x = 'outer'
  for i in [3,4,5] do
    return x
  end
end
hoge
=> 'outer'
```

----

```rb:第1問
def hoge
  for i in 3..5 do
    x = 'x-men'
  end
  return x
end
hoge #=> これは？
```

----

```rb:第2問
def hoge
  3.times do
    x = 'x-men'
  end
  return x
end
hoge #=> これは？
```
----

```js:第3問
var hoge = function(){
  function inner(){
    x = 'x-men'
  }
  inner()
  return x
}
hoge() //=> これは？
```

----

# 解答

1. x-men
2. error
3. x-men

3 はひっかけです。`var x` で宣言していれば、外からは呼べません。



----

# おまけ

true が返る行をすべておしえてください。

```rb
hoge = false && true
hoge = false and true
hoge = false || true
hoge = false or true
```