OmniAICreator/Qiita-1.07M huggingface dataset:
schemaspyのER図で日本語テーブル名が化ける件

# DBの定義書を自動でつくりたいよ。日本語でね。
日本語テーブル名？つかわないよ！
そんな人はスルーでお願いします…
でも、使いたくないけど、客先からの要望で…なんて人用。
ま、しょうがないですよね。自分もそうでした。

# 環境
* ~~[schemaspy](https://github.com/schemaspy/schemaspy)~~
* ~~[graphviz](http://www.graphviz.org/)~~
* ~~[java8](https://java.com/en/download/manual.jsp)~~
* ~~DB（以下のものしか試してないです）~~
 + ~~MySQL~~
 + ~~SQLite3~~
* [docker](https://hub.docker.com/r/coneyware/schemaspy_jp)用意しました。
* DB毎に接続用のJDBCドライバを用意
 + dockerの/driversフォルダの下へJDBCドライバをマウント
* DBのテーブル名は__UTF-8__で。（他の文字コードは試してないです）

# とりあえず実行
ま、このへんはDBによってイロイロ。
ググればシングルバイトのテーブル名なら普通にできる設定はイッパイでてくる。
実行結果をみても、とりあえずgraphvizを使わない所は日本語で表示できてます。

``` docker-compose.yml
version: "3"
services:
  schemaspy_jp:
      image: "coneyware/schemaspy_jp"
      container_name: "schemaspy_jp"
      hostname: "schemaspy"
      # ホストのネットワークに接続
      network_mode: "host"
      volumes:
          - "path/to/output:/output"
          - "path/to/drivers:/drivers"
          - "path/to/schemaspy.properties:/schemaspy.properties"
```
# 問題はER図
schemaspy.propertiesの記述はDBのによっていろいろなんですが、公式サンプルみるとこんな感じ。

``` .properties
# type of database. Run with -dbhelp for details
schemaspy.t=mssql
# optional path to alternative jdbc drivers.
# dockerの/driversフォルダ。docker起動設定で好みのフォルダにマウントすればOK
# schemaspy.dp=path/to/drivers
# database properties: host, port number, name user, password
schemaspy.host=server
schemaspy.port=1433
schemaspy.db=db_name
# db scheme for which generate diagrams
# schema設定、mysqlだとdbと同じで良さげ
schemaspy.s=db_name
schemaspy.u=database_user
schemaspy.p=database_password
# output dir to save generated files
# dockerの/outputフォルダ。docker起動設定で好みのフォルダにマウントすればOK
# schemaspy.o=path/to/output
```
ドキュメントのドコさがしてもフォント指定ないんですがgraphvizじたいはUTF-8に対応しているハズ。
なんですが、化けるのはなぜかとおもって出力フォルダをあさってみるとgraphviz用のdotファイルを発見。
主力フォルダ/diagramsの下の.dotファイルですね。
フォント指定がヨロシクナイ。

# 結論
~~schemaspyにわたすconfig.fileの設定に以下を追加。~~

~~schemaspy.font="日本語フォント名"~~

~~たぶん、起動引数に```-font "フォント名"```追加でも行けると思う。~~
~~フォント名は~~
~~windowsなら、"MS　ゴシック"でも。~~
~~acrobatはいってれば"HeiseiKakuGo-W5"で、~~
~~どのOSでも日本語テーブル名でER図が出力されるかと思います。~~

~~ドキュメントにのってないんで、ソースから設定を見つけました。~~
~~なので、__今後どうなるかわかりません。__~~

## 2020/04/27　修正／追記

日本語フォントファイルだけつっこんだdocker環境用意したら、とくに設定なく日本語でました。
schemaspyのバージョンも6.1.0に上げたからかもしれませんが。
Django + PostgreSQLでマイグレーションファイルの適用テストを行う(邪道編)


自分向けのDjango + PostgreSQL での操作備忘録
決して正しい方法ではないし、本来は正攻法で対応すべきだけども
こんな方法もありますよということで記述。

なお、手順としての正しさは保証しない。


# 目的
Djangoでモデルを変更した場合に、
みんなで共有で使っている検証環境で
マイグレーションファイルを適用した後に対応する。

※ もちろん、正攻法としては
https://stackoverflow.com/questions/32123477/django-revert-last-migration
のようにするのが正しいようだ。

とはいえ追加のコードを書いたりするのも面倒だな〜という方のための対応手順。

# 前提

- 手順に記述したコマンドがインストール済みかつ実行可能であること。
- 操作対象のデータベース名はtargetdbとする。

# 手順概要

- 対象データベースの退避先データベースを準備する
- 既存のセッションを切断する
- 対象データベースをバックアップする
- マイグレーションを適用する
- バックアップから元に戻す


# 手順

## 対象データベースの退避先データべースを準備する

```bash:退避先データベースの準備
$ createdb targetdb_evate;

```

## 既存のセッションを切断
PostgreSQLに接続しているセッションを切断する。
(もちろん操作などが行われていないことを確認の上で)

```txt:既存セッションの確認
$ psql
postgres=# select pid, datname from pg_stat_activity;
```

上のコマンドで確認したpidを指定して以下のSQLを投げる。

```txt:セッションの切断
postgres=# select pg_terminate_backend($pid) from pg_stat_activity;
```
※ $pidには 既存セッションの確認 で確認したpidを入力する。

## 対象データベースをバックアップする

対象データベース(targetdb)から退避先データベース(targetdb_evade)
にデータをバックアップする。

```bash:データベースのバックアップ
$ pg_dump -Ft targetdb | pg_restore -d targetdb_evade
```

セッションが残っているとここで失敗する。

## マイグレーションを適用する

適当な方法でDjangoのマイグレーションを適用する。

```bash:マイグレーションの適用
$ python manage.py migrate
```

適用後動作確認やら各種テストを実行する。

## バックアップから元に戻す

退避先データベースから、マイグレーション前の状態に戻す
**既存のセッションを切断** の手順を再度実施し、
セッションを全て切断する。

マイグレーション適用済みのデータベース(targetdb)を削除し、
退避していたデータベース(targetdb_evade)をリネームすれば完了。

```txt:バックアップからの戻し
$ psql
postgres=# drop database targetdb;
postgres=# alter database targetdb_evade rename to targetdb;
```
ある時間おきに関数を実行する　　Timer.scheduledTimerがよくわからない

```
var timer : Timer?

timer = Timer.scheduledTimer(timeInterval: 1.0,
                             target: self,
                             selector:#selector(self.randamMove),
                             userInfo: nil,
                             repeats: true)
    }

```

これで1秒ごとにrandamMoveという関数を実行し続けるようだ

このようにすれば動くが、何をしているかの意味が全くわかっていない。　少しづつ理解したい。


scheduledTimerはリファレンス調べると宣言のところにclass funcと書いてあるので型メソッド？
普通メソッドを使う場合は、インスタンスを作ってからでないと利用できないが、型メソッドはインスタンスなしでいきなり使えるメソッド。
今回の場合はscheduledTimer()というのはTimerクラスのメソッドだが、インスタンスを作らなくてもメソッドを使うことができる。
Timer.scheduledTimer()でTimerのインスタンスを作らないでメソッドを使っているということ


Timerのリファレンスをちゃんと読んでさらにまとめたい
RestTemplateでレスポンスのContent-Typeを変更する。

# この記事で紹介すること

この記事ではSpringのRestTemplateで受け取ったレスポンスのContent-Typeを変更し、任意のHttpMessageConverterを実行させる方法を考えたのでメモとして記載します。

外部のAPIサーバを利用した際に、JSONフォーマットのbodyにContent-Type: text/plainで帰ってくることがありました。レスポンスのJSONに対応したBeanに値をバインドさせようとしてもContent-Typeがtext/plainのため、期待したHttpMessageConverterにマッピングされません。
そこで、RestTemplateにレスポンスのヘッダを変更するClientHttpRequestInterceptorを登録し解決しました。

ClientHttpRequestInterceptorの実装とRestTemplateBuilderの利用方法は以下のサイトを参考にしました。

 * [TERASOLUNA Server Framework for Java (5.x) Development Guideline 5.1.0.RELEASE documentation5.17. RESTクライアント（HTTPクライアント）](https://terasolunaorg.github.io/guideline/1.0.1.RELEASE/ja/ArchitectureInDetail/REST.html)
 
 * [Spring Boot 1.4+でRestTemplate(HTTPクライアント)を使う](http://qiita.com/kazuki43zoo/items/7cf3c8ca4f6f2283cefb)

またBing Speech API を対象に今回の内容を実装したものを以下のリポジトリに置いています。認証などの要素も入っているため、今回の説明とは多少異なります。
https://github.com/masato-ka/speech-api-proxy-service

# ClientHttpRequestInterceptorの実装


```Java:ResponseHeaderInterceptor.java

@Component
public class ResponseHeaderInterceptor implements ClientHttpRequestInterceptor {
	
	@Override
	public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
			throws IOException {		
		ClientHttpResponse response = execution.execute(request, body);//(1)
		response.getHeaders().setContentType(MediaType.APPLICATION_JSON);//(2)
		return response;
	}

}
```

(1)実際のリクエスト実行処理
(2)リクエスト実行後、レスポンスオブジェクトのContentTypeをapplication/jsonで上書きします。

# RestTemaplateの設定と実行

```Java:RestClient.java
@Component
public class RestClient {
        
        private final String apiUri = "https://hoge.com/api/v1/foo"
        private final RestTemplate restTemplate;
	
	public RestClient(RestTemplateBuilder restTemplateBuilder,
			  ResponseHeaderInterceptor interceptor){//(1)
		restTemplate = restTemplateBuilder.additionalInterceptors(interceptor).build();//(2)
	}
	
	public Result request(){

		URI targetUri = UriComponentsBuilder
                                      .fromUriString(apiUri)
                                      .build()
                                      .toUri();
		
        Result result = restTemplate.getForObject(targetUri, Result.class);//(3)
		return result;
	}
	
}
```

(1) ResponseHeaderInterceptorをInjection
(2) RestTemplateBuilderを通してResponseHeaderInterceptorをRestTemaplateに設定
(3) リクエストを実行、この際にResponseHeaderInterceptorの処理がフックされる

# まとめ

そもそもサービス側がContent-Typeを正しく返してくれればいいのですが、コントロールできない他者のサービスだったため、このような方法をとりました。
　そもそもInterceptorを実装しない簡単な方法があるかもしれません。
XAML内でDataContextのプロパティにIntelliSenseが効くようにする

WPFなどのMVVMアプリを作成するときには、ViewModelをViewのDataContextプロパティに設定します。

ここでは下記のようなViewとViewModelがあるとします。

```csharp:ViewModel.cs
namespace WpfTest
{
    class ViewModel
    {
        public string ViewModelText => "Test String";
    }
}
```

```xml:MainWindow.xaml
<Window x:Class="WpfTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfTest"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TextBlock FontSize="50" Text="{Binding ViewModelText}"/>
    </Grid>
</Window>
```

このときに、`{Binding ViewModelText}`の箇所は補完が効かずに手打ちする必要があります。
せっかくVisual Studioという高機能なIDEを使っているのにスペルミスなどしていたらもったいないです。

そこでXAMLエディタ内でインテリセンスを効かせるようにするには2つ方法があります。


### ①XAML内でDataContextを作成する

```xml:MainWindow.xaml
<Window x:Class="WpfTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfTest"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <local:ViewModel/>
    </Window.DataContext>
    <Grid>
        <TextBlock FontSize="50" Text="{Binding ViewModelText}"/>
    </Grid>
</Window>
```

`<local:ViewModel/>`を`<local:ViewModel　x:Name="vm"/>`などとすれば、コードビハインドでvmという変数を使うこともできます。

この方法だとViewModelが引数なしのコンストラクタを持たなければならないとかDataContextの自由度があまり高くありません。
その場合は次の方法を使います。

### ②デザイン用の設定を加える

```xml:MainWindow.xaml
<Window x:Class="WpfTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfTest"
        mc:Ignorable="d"
        d:DataContext="{d:DesignInstance local:ViewModel}"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TextBlock FontSize="50" Text="{Binding ViewModelText}"/>
    </Grid>
</Window>
```

こちらは`d:DataContext="{d:DesignInstance local:ViewModel}"`と書き加えました。
`d:`はデザイン用設定でビルド時には無視されるので、別途DataContextを設定する必要があります。

こちらの方が自由度が高くなります。

また、引数なしのコンストラクタがあるなら
`d:DataContext="{d:DesignInstance local:ViewModel, IsDesignTimeCreatable=True}"`
とすることで、実際にインスタンスを作成した状態での表示も見られます。


インテリセンスが効く状態で快適にXAMLを書きましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/125224/96b28dc1-8cfd-88ef-b2c8-d59db7aafc75.png)
リフレクションでプロパティへのSetValueしたときにどうなるか気になった挙動のチェック

UnityのRefrection使っているコードみてて次の二点の挙動が気になったので調べた

1. setterがない場合
1. setterの中で別の処理をいれていた場合その処理も実行されるかどうか

動かしてる環境がUnityなだけで実態はC#の話かな

次のようなRefrectionをしてプロパティの値を変更する

```csharp
public class MyGameObject : MonoBehaviour
{
    [SerializeField]
    int myNumber;

    public int MyNumber
    { 
        get { return myNumber; } 
    }
}
```
```csharp
public class RefrectionController : MonoBehaviour
{
    [SerializeField]
    MyGameObject myGo;

    void Start()
    {
        Debug.Log("[LOG] 1 myGo.MyNumber = " + myGo.MyNumber);
        var propertyInfo = myGo.GetType().GetProperty("MyNumber", BindingFlags.Public | BindingFlags.Instance);
        // テキトーに数字の更新をする
        propertyInfo.SetValue(myGo, 1, null);
        Debug.Log("[LOG] 2 myGo.MyNumber = " + myGo.MyNumber);
    }
}
```
出力結果 (StackTrace除外)

```
[LOG] 1 myGo.MyNumber = 0
ArgumentException: Set Method not found for 'MyNumber'
```

次にSetterを生やしてログを仕込みそれが出力されるかみる

```csharp
public class MyGameObject : MonoBehaviour
{
    [SerializeField]
    int myNumber;

    public int MyNumber
    { 
        get { return myNumber; } 
        set
        {
            Debug.Log("Set myNumber");
            myNumber = value;
        }
    }
}
```

出力結果 (StackTrace除外)

```
[LOG] 1 myGo.MyNumber = 0
[LOG] Set myNumber
[LOG] 2 myGo.MyNumber = 1
````

Setterに追加した処理も呼ばれていた。そうなるよね。
Gitで特定の時間にcheckoutしていたcommitに戻る方法


# コマンド

```
git reflog --date=local
```

で時間を見てチェックアウトする

```
git checkout <commit>
```

# コマンドの使用シーンの例

あなた: あなたの管理しているブランチをpullしたら動かなくなったのですが
同僚　: そうですか
あなた: いつ頃なおりますか？
同僚　: わかりません
あなた: 原因はわかりますか？
同僚　: わかりません
あなた: どのコミットなら動きそうですか？
同僚　: わかりません
あなた: わかりました


あなた: checkoutの履歴はreflogで見れます

```
$ git reflog
51c40d6 HEAD@{0}: pull origin develop: Fast-forward
2a2be6a HEAD@{1}: pull origin develop: Fast-forward
07be43d HEAD@{2}: pull origin develop: Fast-forward
280ac79 HEAD@{3}: pull origin develop: Fast-forward
135d2db HEAD@{4}: checkout: moving from feature/xxx to develop
```

あなた: 動かなくなってから何回かpullしたせいでどこが動く断面かわかりません
あなた: 昼食前は動いていたような気がします
あなた: reflogはlogとおなじオプションが使えるので時間も見れます

```
$ git reflog --date=local
51c40d6 HEAD@{Thu Sep 7 15:00:00 2017}: pull origin develop: Fast-forward
2a2be6a HEAD@{Thu Sep 7 14:50:00 2017}: pull origin develop: Fast-forward
07be43d HEAD@{Thu Sep 7 10:00:00 2017}: pull origin develop: Fast-forward
280ac79 HEAD@{Thu Sep 7 09:30:00 2017}: pull origin develop: Fast-forward
135d2db HEAD@{Thu Sep 6 13:20:00 2017}: checkout: moving from feature/xxx to develop
```

あなた: 動くのはおそらくcommit 07be43dでしょう

```
git checkout 07be43d
```

あなた: 無事動きました
React：Importの相対パスから絶対パスの切替

```
相対パス：import FuncGroup from '../../components/english/FuncGroup';
絶対パス：import FuncGroup from 'root/components/english/FuncGroup';
```
絶対パスを有効するには、webpack.config.jsの設定が必要です。

```javascript:webpack.config.js
module.exports = {
  devtool: "source-map",
  context: __dirname + "/src",
  entry: './index.js',
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'build')
  },
  devServer: {
    contentBase: 'build',
    port: 3000
  },
★★★★★★★★★★★★
  resolve: {
    alias: {
      root: path.resolve(__dirname, 'src/'),
      styles: path.resolve(__dirname, 'styles/'),
    }
  },
★★★★★★★★★★★★
  module: {
    loaders: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        loaders: ["babel-loader"],
      },
      {
        test: /\.js$/,
        exclude: /node_modules/,
        loaders: ["eslint-loader"],
      },
      {
        test: /\.html$/,
        loader: "file?name=[name].[ext]",
      },
      {
        test: /\.css$/,
        loaders: ['style-loader', 'css-loader?modules'],
      }
    ],
  },
}
```
sketchプラグイン自分用 2018.04

Webは基本 PS + AI メインだけど、
アプリは sketch が早い。 Webの構成もsketchが一番使い勝手いい気がする。

2018.04 Sketch v49.2

2017.09 Sketch v46.2



#### <b>Runner</b>
http://sketchrunner.com/
> コマンドでスケッチの操作とか可能なやつ。
プラグインのインストーラーとしてnpm的に使える。必須。

#### <b>Symbol Organizer</b> （R）
> シンボルが右に永遠に並び続けるのを回避。必須。

#### <b>Sketch Measure</b> （R）
> 寸法線引きは結構便利。
組み込み系の画面作るときに死ぬほど役に立った。

#### <b>font-finder</b> （R）
> ディベロッパーにデータ渡すときに便利。

#### <b>Rename It</b> （R）
> レイヤー名一括変換。

#### <b>Find and Replace</b> （R）
> テキスト全部検索、置換可能。

#### <b>Prism</b> （R）
> ドキュメントカラーズのパレットを作ってくれる

#### <b>Sketch Palettes</b> （R）
> カラーパレットを細かく分けられる。

#### <b>Sketch2AE</b> （R）
> AfterEffects に必要なレイヤーを吐き出してくれる。
Sketch → AE（Bodymovin -> json） → Lotte
でインラタクション作る用。

#### <b>overview artboard</b> （R）
> 複数のアートボードの背景にまとめて1枚のアートボードを設定
アートボード名を自動で入れてくれる。

#### <b>Style-Inventory</b> （R）
> 同じスタイルを持ってる要素を選択できる。
またシンボル化しない荒いフェーズで、
まとめてスタイル変更するときとかに楽。

#### <b>p5sketchplugin</b> （R）  
https://p5js.org/
> キャンバスに図形を p5.js でかけるプラグイン
http://www.jacopocolo.com/p5sketchplugin/#content

<br>
---
<br>
#### <b>Launchpad for Sketch</b> （R）  
https://animaapp.github.io/Auto-Layout/
> RUNNER経由ではインストールできなかった。
http://nsblogger.hatenablog.com/entry/2017/01/03/sketch_autolayout
<br>

---

### 使わなくなった

- 
Prott Sketch Plugin 

> v49から Preview がついたのでもはや不要。

- Sketch Toolbox  
> プラグイン管理アプリ。
即落ちで使えなかった。 Runnerがあるので不要。
ruby + rails バージョンアップ

# 概要
忘れるので手順をメモ。
対象はrbenvを使用してlinuxにインストールされているruby, rails。

# rbenv の更新
```
$ cd ~/.rbenv/plugins/ruby-build 
$ git pull origin master
```

# インストールしたいrubyのバージョンを探す
```
$ rbenv install --list
```

# バージョンを指定してrubyインストール
```
$ rbenv install -v 2.4.1
```

# インストールされているrubyのバージョンを確認
```
$ rbenv versions
  system
  2.3.1
* 2.4.1
```

# rubyのバージョンを指定する
```
$ rbenv global 2.4.1
```

# rubyのバージョンを確認する
```
$ ruby -v
```

# rubyのバージョンを変更したことにより、railsコマンドが使用できなくなった
```
$ rails c
rbenv: rails: command not found

The `rails' command exists in these Ruby versions:
  2.3.1
```

# Rubyのバージョンに対応するrails gemのインストール
```
$ gem install rails --version 4.2.8
$ gem install rails
```
ESXi 6.5 でCD/DVDをマウントする

nested ESXi に DVD をマウントして、その上の仮想マシンにホストデバイスとして DVD をマウントさせたいと思ったりしたけど、ESXi に DVD をマウントさせる方法を意外と知らなかったのでメモ。

# 環境
- ESXi 6.5 build-5969303

# 手順

モジュールをロード
> \# vmkload_mod iso9660
> Module iso9660 loaded successfully

CD/DVD ドライブのパスを確認
> \# esxcfg-mpath -b | grep -i cd
> mpx.vmhba64:C0:T0:L0 : Local NECVMWar CD-ROM (mpx.vmhba64:C0:T0:L0)

モジュールを CD/DVD ドライブにセット
> \# vsish -e set /vmkModules/iso9660/mount mpx.vmhba64:C0:T0:L0

/vmfs/volumes ディレクトリ配下にマウントされていることを確認
> \# ls -l /vmfs/volumes/
> total 6144
> ～ 中略 ～
> lrwxr-xr-x    1 root     root            20 Sep  7 13:57 RHEL-7.3 Server.x86_64 -> mpx.vmhba64:C0:T0:L0
> ：
> ：

不要になったらアンマウント
> \# vsish -e set /vmkModules/iso9660/umount mpx.vmhba64:C0:T0:L0
> ※コマンドが似ているけどマウントするときは mount だったけど、アンマウントのときは umount 

モジュールをアンロード
> \# vmkload_mod -u iso9660
> Module iso9660 successfully unloaded

# 参考
How to Mount the Host CD-ROM to the ESXi Shell
http://www.techcrumble.net/2017/05/how-to-mount-host-cd-rom-to-esxi-shell.html
デバイス別@media

**iPhone 6/7 in portrait & landscape**

    @media only screen 
    and (min-device-width : 375px) 
    and (max-device-width : 667px) { /* STYLES GO HERE */ }

**iPhone 6/7 in landscape**

    @media only screen 
    and (min-device-width : 375px) 
    and (max-device-width : 667px) 
    and (orientation : landscape) { /* STYLES GO HERE */ }

**iPhone 6/7 in portrait**

    @media only screen 
    and (min-device-width : 375px) 
    and (max-device-width : 667px) 
    and (orientation : portrait) { /* STYLES GO HERE */ }

**iPhone 6 plus in portrait & landscape**

    @media only screen 
    and (min-device-width : 414px) 
    and (max-device-width : 736px) { /* STYLES GO HERE */ }

**iPhone 6 plus in landscape**

    @media only screen 
    and (min-device-width : 414px) 
    and (max-device-width : 736px) 
    and (orientation : landscape) { /* STYLES GO HERE */ }

**iPhone 6 plus in portrait**

    @media only screen 
    and (min-device-width : 414px) 
    and (max-device-width : 736px) 
    and (orientation : portrait) { /* STYLES GO HERE */ }

**iPad in portrait & landscape**

    @media only screen 
    and (min-device-width : 768px) 
    and (max-device-width : 1024px) { /* STYLES GO HERE */}

**iPad in landscape**

    @media only screen 
    and (min-device-width : 768px) 
    and (max-device-width : 1024px)
    and (orientation : landscape) { /* STYLES GO HERE */}

**iPad in portrait**

    @media only screen 
    and (min-device-width : 768px) 
    and (max-device-width : 1024px)
    and (orientation : portrait) { /* STYLES GO HERE */}
Kubernetes's tools

* Kubernetes関連ツールについて
* 概要・インストール方法(for MacOS & Linux only)のまとめ

### Kubectl
* クラスタ管理用CLI
* マニュアル: https://kubernetes.io/docs/user-guide/kubectl/
* インストール: https://kubernetes.io/docs/tasks/tools/install-kubectl/

```bash
# MacOS
brew install kubectl

# Linux
curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
```

### Helm
* Kuberntes用パッケージマネージャ
* マニュアル: https://docs.helm.sh/helm/#helm
* インストール: https://github.com/kubernetes/helm#install

```bash
# MacOS
brew install kubernetes-helm

# Linux
curl -o helm-linux-amd64.tar.gz https://kubernetes-helm.storage.googleapis.com/helm-v2.6.0-linux-amd64.tar.gz
tar -xzvf helm-linux-amd64.tar.gz 
sudo mv ./linux-amd64/helm /usr/local/bin
```

### Kompose
* docker-composeのYamlからKubernetesにデプロイするツール
* マニュアル: http://kompose.io/user-guide/
* インストール: http://kompose.io/installation/

```bash
# MacOS
curl -L https://github.com/kubernetes/kompose/releases/download/v1.1.0/kompose-darwin-amd64 -o kompose
chmod +x kompose
sudo mv ./kompose /usr/local/bin/kompose

# Linux
curl -L https://github.com/kubernetes/kompose/releases/download/v1.1.0/kompose-linux-amd64 -o kompose
chmod +x kompose
sudo mv ./kompose /usr/local/bin/kompose
```

### Kops
* 主にAWSでKubernetesクラスタを構築する際の支援ツール
* マニュアル: https://github.com/kubernetes/kops/blob/master/docs/cli/kops.md
* インストール: https://github.com/kubernetes/kops#installing

```bash
# MacOS
brew install kops

# Linux
curl -O https://github.com/kubernetes/kops/releases/download/1.7.0/kops-linux-amd64
chmod +x kops-linux-amd64
sudo mv kops-linux-amd64 /usr/local/bin/kops
```

### Kubefed
* マルチクラウド, マルチリージョン環境でKubernetesクラスタを配置し、一括管理する Federation機能の管理ツール
* マニュアル: https://kubernetes.io/docs/admin/kubefed/
* インストール: https://kubernetes.io/docs/tasks/federation/set-up-cluster-federation-kubefed/#getting-kubefed

```bash
# MacOS
curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/kubernetes-client-darwin-amd64.tar.gz
tar -xzvf kubernetes-client-darwin-amd64.tar.gz
sudo cp kubernetes/client/bin/kubefed /usr/local/bin
sudo chmod +x /usr/local/bin/kubefed

# Linux
curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/kubernetes-client-linux-amd64.tar.gz
tar -xzvf kubernetes-client-linux-amd64.tar.gz
sudo cp kubernetes/client/bin/kubefed /usr/local/bin
sudo chmod +x /usr/local/bin/kubefed
```
---

参考
* https://kubernetes.io/docs/tools/
MacのリモートデスクトップアプリでBluemixInfrastructure上のWindowsにアクセス

接続先: Microsoft Windows 2016 FULL STD 64 bit

(1) App Storeにアクセスしてアプリをダウンロード

(Mac App Storeプレビュー)
https://itunes.apple.com/jp/app/microsoft-remote-desktop/id715768417?mt=12
 
<img width="949" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/104697/9d564ee7-aae6-2fff-67d2-a14e81f45233.png">

(2) アプリ立ち上げ

<img width="464" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/104697/8846060e-c804-cb31-0a06-e20bebb88893.png">


(3) Newをクリック

<img width="415" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/104697/a53efa72-4fb7-c918-7033-19306a834783.png">

(4) 設定
 - Connection name: 任意の名前
 - PC name: IPアドレス
 - User name: ユーザ名(例: Administrator)
 - Password: パスワード
 - Resolution: デフォルト 
 - Colors: デフォルト
 - Full Screen Mode: デフォルト

(BluemixInfrastructureの画面)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104697/57ddc551-e396-7fb7-49c8-b4f79e5ed18e.png)


(5) ウインドウを閉じて登録(左上赤色のボタンをクリック)、ダブルクリックで接続

<img width="472" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/104697/572e400d-b2ec-f41f-26e6-c9cf4f53a6b0.png">

※(3)でプライベートIPを入力した場合はVPN接続が必要
https://www.softlayer.com/jp/VPN-Access

<img width="799" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/104697/ab827832-3445-c39c-ab97-f5443eb7c9fd.png">


(6) 接続完了

<img width="1296" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/104697/acf72466-0344-c18a-b50e-a9d8b8ac8dff.png">

※ テキストのコピー&ペースト Mac側で文字をCtr-C -> 接続先のWindows側でメモ帳を開き、右クリックPasteで貼り付け
tensor flow with anaconda on mac

how to install in anaconda env
-------

# requirement
pyenv
anaconda
tensorflow


# install
## pyenv
```
pyenv local anaconda3-XXX
```

## create virtual env
```
conda create -n tensorflow python=3.5 anaconda
```

## activate
```
source activate tensorflow
```

## install tensor flow by pip
```
pip install --ignore-installed --upgrade \
 https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-1.3.0-py2-none-any.whl
```

## confirm
```
python
>>> import tensorflow as ts
```

# jupyter notebook
```
jupyter notebook
```
PostgreSQLでCREATE VIEWする

DBでビューを作るということをしたことが無かったのですが、初めて使ってみたのでメモ。
##やりかた
<br>"nice_actor" DB
<img width="450" alt="スクリーンショット 2017-09-07 22.08.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/124843/d187bdbc-c96c-df5b-547d-0f2d9706149f.png">

<br>CREATE VIEWする。

参考：https://www.postgresql.jp/document/9.3/html/sql-createview.html

CREATE VIEWの書き方

```
CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] [ RECURSIVE ] VIEW name [ ( column_name [, ...] ) ]
    [ WITH ( view_option_name [= view_option_value] [, ... ] ) ]
    AS query
```

<br>実際に実行してみた。

```
create view full_name as
select
	first_name || '・' || middle_name || '・' || last_name as actor
from nice_actor;
```

<br>これでビューができた。
<img width="181" alt="スクリーンショット 2017-09-07 22.13.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/124843/6c494501-edef-ab39-e908-c5efdde968ad.png">

<br>SELECTしてみる。

```
select * from full_name;
```

<br>結果
<img width="404" alt="スクリーンショット 2017-09-07 22.23.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/124843/dbd2c07a-4582-86e3-7fc1-e62696d79763.png">

<br>という感じでビューが作れました。
Wiresharkを使ってパケットの中身を見てみる

勉強会に参加した時の備忘録です。
Wiresharkでパケット解析とやらをしてみました。
クイズ形式で問題が出されるスタイルだったので、そのまま使わせてもらいます。

###問題①
>次のファイルをダウンロードしてください。
パケットを解析すると以下の文字列が得られます．
解析結果の***の部分に入る文字列を入力してください。

>Your FLAG is HLH={***}

ダウンロードしたファイルを、Wiresharkで見た画面がこちら。
![問題①.png](https://qiita-image-store.s3.amazonaws.com/0/185546/45eb2916-913f-4225-cd67-64734b25caf9.png)


そもそもWiresharkの見方が分からないので、調べたところ以下のような作りになっているみたいです。
![見方.png](https://qiita-image-store.s3.amazonaws.com/0/185546/c6f78885-d7f2-a8bc-72ee-65cf2697760c.png)

* オレンジのところ  
フィルターの機能。
* 緑のところ  
「パケットリスト」と呼ばれる。パケットの流れを表す。
* 赤のところ  
 「パケット詳細部」と呼ばれる。パケットの中身を一覧化している。基本的に見るのはここ。
* 青のところ  
「パケットデータ部」と呼ばれる。パケットの中身を16進数で表示している。


そして問題に戻ると、Your FLAG is・・・それっぽいものがWiresharkの中に3つあります。
![問題１_2.png](https://qiita-image-store.s3.amazonaws.com/0/185546/ed39d58b-b129-21b7-dfd3-5cd7e2ccbcb1.png)
**/Your%20FLAG%20is%20HLH=%7BADAM%7D**
それっぽい。
けどどうしてだか、とても読みづらい。
これはURLがエンコードされているからとのこと。GETだからだろうか。

デコードしてくれるサイトを探して、/Your%20FLAG%20is%20HLH=%7BADAM%7D　をデコードしてもらいます。
私はここ（[TAG index](http://www.tagindex.com/tool/url.html)）を使いました。

デコード結果：
/Your FLAG is HLH={ADAM}

というわけで、この問題の答えは**ADAM**とのことでした。


###問題②
>次のファイルをダウンロードしてください。
パケットを解析すると以下の文字列が得られます．
解析結果の***の部分に入る文字列を入力してください。

>"Your FLAG is HLH"=> "***"

ダウンロードしたファイルを、Wiresharkで見てみたものがこちら。
![問題2_2.png](https://qiita-image-store.s3.amazonaws.com/0/185546/5e6790a9-3fb1-2314-2904-c6064a50bf9c.png)
パケット詳細部に、Your FLAG is HLH"～の記述がありました。
さっきとは違ってすごく見やすく書かれています。
というわけで、この問題の答えは**LILITH**

###感想
問題①はGET,問題②はPOST。
GETとPOSTの違いはなんだ？と新人の時に思って、
URLに情報がでるかでないかの違いだと覚えました。
今回実際にパケットの中を見てみても、仕組みが全然違うんだなあと実感しました。


###勉強会主催者の方々
今回この勉強会を開催してくださった、[Hackerz Lab.博多](https://ja-jp.facebook.com/HackerzLab.HKT/)のみなさんありがとうございました。
Sql Serverで取得項目をマスクする方法

たまに使うのでメモ
以下のSQLを実行すると、取得項目にマスクできます。

## SQL
```SQL
SELECT
	ID
    , NAME AS NAME
    , REPLACE(Name, SUBSTRING(NAME, 2, LEN(NAME)-2), REPLICATE('＊', LEN(NAME)-2)) AS MASK_NAME
FROM 
  MASK_SAMPLE
```

## 実行結果
|ID|NAME|MASK_NAME|
|:-----------------|------------------:|:------------------:|
|1|名前１|名＊１|
|2|名前２|名＊２|
|3|名前３|名＊３|
|4|名前名前４|名＊＊＊４|
Go言語で動的HTMLをWebスクレイピングする

# はじめに

JavaScriptで動的に生成されるWebページの場合、goqueryに直接URL渡しても正しい値でスクレイピングができない。
そのため、WebDriverを使ってブラウザに表示された実際のHTMLをgoqueryに渡してスクレイピングする必要がある。

# 環境

* Ubuntu 16.04.3
* go 1.8.3

# インストール

* ChromeDriver

~~~
# インストール
export WD_VER=2.32
wget -O /tmp/chromedriver.zip http://chromedriver.storage.googleapis.com/${WD_VER}/chromedriver_linux64.zip
sudo unzip /tmp/chromedriver.zip chromedriver -d /usr/local/bin/
sudo chmod +x /usr/local/bin/chromedriver

# 確認
$ which chromedriver 
/usr/local/bin/chromedriver
~~~

* Go パッケージ

~~~
go get github.com/PuerkitoBio/goquery
go get github.com/sclevine/agouti
~~~

# 流れ

## ブラウザ経由でHTMLを取得

WebDriverを使用してHTMLを取得する。

~~~
url := "http://target.example.com"

driver := agouti.ChromeDriver()
err := driver.Start()
if err != nil {
	log.Printf("Failed to start driver: %v", err)
}
defer driver.Stop()

page, err := driver.NewPage(agouti.Browser("chrome"))
if err != nil {
	log.Printf("Failed to open page: %v", err)
}

err = page.Navigate(url)
if err != nil {
	log.Printf("Failed to navigate: %v", err)
}

// contentにHTMLが入る
content, err := page.HTML()
if err != nil {
	log.Printf("Failed to get html: %v", err)
}
~~~


## スクレイピング

goqueryを使用してスクレイピングする。
bodyタグのaタグからhrefとコンテンツを取り出している。

* Find()の指定方法
  * body, .container, body[class="container"]

~~~
reader := strings.NewReader(content)
doc, _ := goquery.NewDocumentFromReader(reader)
doc.Find("body a").Each(func(i int, s *goquery.Selection) {
    // bodyにコンテンツ, hrefにhrefの値が入る
	body := s.Text()
	href, _ := s.Attr("href")
	fmt.Printf("body: %s, href: %s\n", body, href)
})
~~~

# 実践

## ブラウザで表示し、クリックしてからHTMLを取得する

クリックすると表示内容が変化する際に変化後のコンテンツをスクレイピングしたい時、ブラウザでクリック操作をした後にHTMLを取得する。

~~~
package main

import (
	"fmt"
	"log"
	"strings"

	"github.com/PuerkitoBio/goquery"
	"github.com/sclevine/agouti"
)

func main() {
	url := "http://target.example.com"

	driver := agouti.ChromeDriver()
	err := driver.Start()
	if err != nil {
		log.Printf("Failed to start driver: %v", err)
	}
	defer driver.Stop()

	page, err := driver.NewPage(agouti.Browser("chrome"))
	if err != nil {
		log.Printf("Failed to open page: %v", err)
	}

	err = page.Navigate(url)
	if err != nil {
		log.Printf("Failed to navigate: %v", err)
	}

	page.FindByButton("Next").Click()

	content, err := page.HTML()
	if err != nil {
		log.Printf("Failed to get html: %v", err)
	}

	reader := strings.NewReader(content)
	doc, _ := goquery.NewDocumentFromReader(reader)
	doc.Find("body a").Each(func(i int, s *goquery.Selection) {
		body := s.Text()
		href, _ := s.Attr("href")
		fmt.Printf("body: %s, href: %s\n", body, href)
	})
}
~~~

# まとめ

動的HTMLを取得し、スクレイピングを行うことができた。
ただ、WebDriverは、ブラウザを開いて操作がされるのでただスクレイピングしたいだけだと無駄な感じがあって、実際時間がかかる。

# 参考

* https://godoc.org/github.com/sclevine/agouti
* https://godoc.org/github.com/PuerkitoBio/goquery
KotlinのORMapper ExposedをSpringから利用

KotlinでSpring(Spring-boot)を使って開発する時、OR Mapperの選択肢はたくさんあります。Java製のOR Mapperがシームレスに使うことができるので、純粋なJavaプログラマは以前使っていたものをそのまま使えます。その一方でKotlinで書かれたORMapperも存在します。Java製ではなくKotlin製のOR Mapperを使う理由はやはり、よりKotlinらしくコードがかけることでしょう。

その一方で、Kotlin製のORMはどれも開発途上であり、決定打にかけるかもしれません。いばらの道を歩みたくなければJava製の実績のあるものを使うのが良いと思います。

さて、Kotlin製のORMの中で僕は[Exposed](https://github.com/JetBrains/Exposed)を使っています。JetBrains製と言う安心感が主な理由です。また、すべてのコードを終える程度にコンパクトなので、何かあった場合でも自分で対応できるかもしれないことも理由の一つです。

Exposedの使い方自体は、[Exposedの使い方](http://blog.orekyuu.net/?p=484)がよくまとまっています。
今回はspringから使う場合のまとめです。Springのプロジェクト自体は、[Spring Initializer](http://start.spring.io/)で作成しています。

## Gradleの設定

GradleでExposedの依存モジュールを追加します。まずは、Exposed用のrepositoryを追加します。

```groovy
repositories {
	mavenCentral()
	maven { url('https://dl.bintray.com/kotlin/exposed/') }
}
```

repositoryを追加したら次はdependenciesを設定します。僕はPostgreSQLを使っているのでドライバーにそれが入っています。

```groovy
	// https://mvnrepository.com/artifact/org.postgresql/postgresql
	compile group: 'org.postgresql', name: 'postgresql', version: '42.1.4'
	// https://mvnrepository.com/artifact/org.jetbrains.exposed/exposed
	runtime group: 'org.jetbrains.exposed', name: 'exposed', version: '0.8.5'
	// https://mvnrepository.com/artifact/org.jetbrains.exposed/spring-transaction
	compile group: 'org.jetbrains.exposed', name: 'spring-transaction', version: '0.8.5'
```

## transactionの設定

上のdependenciesを見ればわかるように、Exposedは本体の部分と、stringのtransactionをサポートしているモジュールの二つに分かれています。ExposedのSpring Transaction Managerを使用しないと@Transactionalでトランザクションが有効になりません。
とは言え、TransactionManagerの作成でExposedのものを使用するだけです。次のコードを書けばTransactionManagerでExposedのSpringTransactionManagerが使われます。

```kotlin
@Configuration
@EnableTransactionManagement
class TxConfig(val dataSource: DataSource): TransactionManagementConfigurer {
    @Bean
    override fun annotationDrivenTransactionManager(): PlatformTransactionManager = 
        SpringTransactionManager(dataSource)
}
```

あとは、

```kotlin
@Transactional
@Service
class MyService {
  fun doSomething() {
    // access to db with Exposed
  }
}
````

とするだけです。

おわり。


## おわりに

実際にExposedを使っていると、80%ぐらいは満足できるのですが、やっぱりまだ、機能不足を否めません。データ型もプリミティブなものしかサポートしていません。また、Kotlin自体も~~よせばいいのに~~古いJVMもサポートしているため、日付型はorg.joda.time.DateTime型を使っています。新しい言語なのでJava8に限定させちゃえばjava.time.LocalDateTimeなどが使えるのに、もったいないです。

でわでわ
数理最適化モデラー(PuLP)チートシート(Python)

# 数理最適化モデラー(PuLP)チートシート
[最適化](bfbf4c185ed7004b5721)問題を数理モデルとして作成して[ソルバー](82831e01adc3f84c36f5)で解くためのパッケージPuLPのチートシートです。

[PuLPチートシート](https://www.dropbox.com/s/shwfke0hq4zwaor/Cheat_Sheet.pdf?dl=1)(PDF)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/13955/4092104c-ad52-9dac-d4ea-872cbf2b3698.png)

### 参考

- [PuLPについて](070ca9cb37c6b2b492f0#pulp%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)
- [データサイエンス・チートシート(Python)](6d1efbc86d6e0468905e)
- [「Python言語によるビジネスアナリティクス」](http://www.kindaikagaku.co.jp/information/kd0516.htm)
- [「今日から使える！組合せ最適化」](http://www.kspub.co.jp/book/detail/1565449.html)
- [「モデリングの諸相」](http://www.kindaikagaku.co.jp/math/kd0519.htm)
- [いろいろな組合せ最適化問題](http://qiita.com/tags/%E7%B5%84%E5%90%88%E3%81%9B%E6%9C%80%E9%81%A9%E5%8C%96)
VLOOKUPでN/Aとか0とか出さないようにする

VLOOKUPは
* ヒットしないとN/A
* ヒットして空欄だと0

が出て見てくれが大事なときは微妙なので、
IFERRORと小技(VLOOKUP結果値に空文字を結合する)で吸収すると良いです。

```
=IFERROR(VLOOKUP(検索値,範囲,列番号,検索方法) &"","任意のヒットしてないよ系メッセージ")
```
electrumxのインストール手順(centos7)

このドキュメントはelectrumx 1.3に対応しています

# electrumxとは

electrumというサーバークライアント型のビットコインウォレットがあり、様々なオルトコインに移植されている。
electrumxはサーバー部分を設定ファイルの切り替えでオルトコインに対応できる互換サーバーである。
python3で作られている。
通信部分はtcp(tls) + JSONRPC2.0。

# electrumxのインストール

この記事には書きませんがbitcoindをインストールする必要があります
root権限またはsudoで作業します

## python3をインストール

iusを利用します

```
yum install -y https://centos7.iuscommunity.org/ius-release.rpm
yum install -y python36u python36u-libs python36u-devel python36u-pip
```

## rocksdbのインストール

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

データベースにrocksdbを使う場合はインストールする必要がある

```
yum install -y epel-release
yum install -y Development Tools
yum install -y snappy snappy-devel zlib zlib-devel bzip2-libs bzip2-devel lz4 lz4-devel cmake make leveldb leveldb-devel gflags-devel
```

### コンパイル & インストール

```
git clone https://github.com/facebook/rocksdb.git
cd rocksdb
git checkout v5.10.4
make shared_lib
make install-shared INSTALL_PATH=/usr
/usr/bin/pip3.6 install python-rocksdb
/usr/bin/pip3.6 install plyvel
ldconfig
```

## electrumxのダウンロード & インストール

sslが必要であれば自己署名証明書を用意する必要があります

```
curl https://codeload.github.com/kyuupichan/electrumx/tar.gz/1.3 > electrumx-1.3.tar.gz 
tar zxvf electrumx-1.3.tar.gz
cd electrumx-1.3.tar.gz
/usr/bin/pip3.6 install uvloop
/usr/bin/python3.6 ./setup.py install
mkdir /DB
```

# 設定ファイル

```:/etc/electrumx.conf
COIN = Bitcoin
NET = mainnet
DB_DIRECTORY = /DB
DAEMON_URL = http://user:password@localhost:8332/
DB_ENGINE = rocksdb
EVENT_LOOP_POLICY = uvloop
TCP_PORT = 50001
# SSL_PORT = 50002
HOST = 0.0.0.0
MAX_SEND = 1000000

# SSL_CERTFILE=/etc/electrumx/server.crt
# SSL_KEYFILE=/etc/electrumx/server.key
```

```:/etc/systemd/system/electrumx.service
[Unit]
Description=Electrumx
After=network.target

[Service]
EnvironmentFile=/etc/electrumx.conf
ExecStart=/usr/bin/electrumx_server.py
User=centos
LimitNOFILE=8192
TimeoutStopSec=30min

[Install]
WantedBy=multi-user.target
```

## 起動コマンド

```
systemctl start electrumx
systemctl stop electrumx
systemctl restart electrumx
```
初めてJavaScriptをやってみよー日記 ~2日目~

### はじめに

この記事は、JavaScriptを初めて使う自分が、自分のためにまとめた内容を載せています。
自分自身が分からないところもあるので、コメントなどでいろいろ言ってくださると嬉しいです。
また、このようなことをやってほしいなどがあれば、出来るものからやらせて頂きます。

### 日記の内容
- htmlのパス表記
- for文
- do while文

### htmlのパス表記

- html
    - Test.html
- javascript
    - Test.js
 
このようなフォルダ、ファイルの配置で`Test.html`から`Test.js`を参照するには、指定するためのパスを`../javascript/Test.js`とすれば良い。

### for文

`for ()`の中の1つ目は、for文の中でだけ使える変数iの値を0に設定。最初に１度だけ実行される。
2つ目は、繰り返すかどうかを決める条件。この条件が満たされていればfor文内のプログラムが実行される。
3つ目はfor文内のプログラムが実行された後に`i`にどのような変化を持たせるかを書く。`i++`は`i`に+1するという意味。

```javascript
for (i=0; i<5; i++) {
    document.write(" for_test_" + i);
}
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/154303/eba05e9e-70b2-2f95-2fc2-76bb7d83d40e.png)

### do while文

最低でも1度はdo文の中のプログラムを実行して、`while()`の中に書いてある条件を満たしているなら、実行し続ける。

```javascript
n = 0
do {
    document.write("message" + n);
    n += 1
} while(n < 3);
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/154303/229fe558-0dca-d5af-1362-4b250a308fe0.png)

```javascript
n = 5
do {
    document.write("message" + n);
    n += 1
} while(n < 3);
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/154303/908a41e2-3cb9-05ee-04e9-45c0e751c3ae.png)

追記
ブログの方が内容との相性がいい気がしたので、はてなブログさんで続けさせていただきます。　よければそちらもよろしくお願いします。
Javaプログラミング基礎の練習～配列

#問題
入力した5つの数字を逆順に表示するプログラムを作成してください。
要件
* ソースファイル名「Check51.java」
* 5つの整数を入力します
* 入力された5数を配列に格納します
* 配列の要素を最後から順番に表示します
* 以下の実行結果のように出力してください

```
数字を5つ入力してください
1>10
2>20
3>30
4>40
5>50
num[4] = 50
num[3] = 40
num[2] = 30
num[1] = 20
num[0] = 10
```

#実装


```Check51.java
package practice;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class Check51 {
	public static void main(String[] args) {
		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
		System.out.println("数字を5つ入力してください");
		String line;
		try {
			ArrayList<Integer> nums = new ArrayList<Integer>();

			for( int i = 1; i <= 5; i++) {
				System.out.print(i+">");
				line = reader.readLine();
				int num = Integer.parseInt(line);
				nums.add(num);
			}

			for( int i = 5; i > 0; i--) {
				int j = i-1;
				System.out.println("num["+j+"] = "+nums.get(j));
			}
		} catch (NumberFormatException e) {
			System.out.println("整数を入力してください");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
```


forの中で、iから1を引くのは、スマートではないように思いますが。。
配列が0から始まるので、こうしないときれいにいきませんでした。
ちょっとずつ読むドメイン駆動設計 第一部 ドメインモデルを機能させる 第ニ章 コミニュケーションと言語の使い方8

# ドキュメント
> すでにコードがうまくやていることを、ドキュメントでもやろうとしない(第一部 第二章　より)

もちろん、環境構築の資料や営業資料などプロジェクト全体の資料はあるとして、
設計方面のドキュメントとして残してるのはなんだろうと今思い返すと、

- ストーリーバックログ
- 決まってないことリスト
- やらないことリスト
- インセプションデッキ
- 関連するアプリケーションに関する資料
- アーキテクチャ図
- 議事録(Wiki)

などなど、、、

特に、プロジェクトでどうにもいかない、関連アプリケーションについてはリファクタリングも設計の見直しもできないので、腐敗防止層の接続部分も含め、何とかクラス図を書いたり、メモを図に追加したりしています。

　> ドキュメントは活動の役に立たなければならず、最新の状態を保たなくてはならない。(第一部 第二章　より)

バックログやインセプションデッキなどは、きちんとスプリントの終わりに見直して、最新にしなくてはなりませんね。できてるかな・・・できてないな。。。

気になるのは、プロジェクトが進み、モデルが進化するにつれ、ストーリーやユースケースなど、気をつけないと言葉が古いまま使われてるかも・・・とここを読んでいて気になりましたね。

そこに手を付ける段階でやはり混乱を招きそうです。

この辺りはストーリーが多いプロジェクトだと結構大変な作業になりそう、というよりなってます。
スプリントが長いのかな。もう少し頻繁に、小さく見直す時間をとっても良さそうです。

ドキュメントは最小限に、必要なものはユビキタス言語を使い常に最新に保つ！
Vue.js命名規則、命名のコツ

[Vue.js コンポーネント スタイル ガイド](https://github.com/pablohpsilva/vuejs-component-style-guide/blob/master/README-JP.md)
こちらがベースになっているのでまずはこれを熟読すべし!
以下、引用になっているのはこのサイトからの出典です。

# 2017/12/14 追記

**[公式ガイド](https://jp.vuejs.org/v2/style-guide/index.html)がもうすぐBetaが外れるのでこちらを見たほうが良いです。**

# コンポーネント名

> 意味のある名前で: 具体的過ぎず、抽象的過ぎず。
> 短く: ２または３語。
> 発音可能: それらについて話せるようにしたい。

例)

- Card: 短すぎます。抽象的すぎます。
- UserProfilePostErrorModal: 長すぎます。具体的すぎます。
- UserList: Good

## ファイル名

PascalCaseにします。

- user_list.vue: PascalCaseになっていません。
- UserList.vue: Good

## name属性

~~name属性は必ず与えましょう。~~
name属性は`.vue`ファイル**でない場合は**必ず与えましょう。
`.vue`ファイルの場合は自動でファイル名がname属性になるため不要です。

PascalCaseにします。

```js
// name属性がありません。
export default {
  data: function() {
    return {
      foo: "bar"
    }
  }
}

// Good
export default {
  name: 'UserList'
}
```

## html

kebab-caseにします。

```html
<template lang="html">
  <user-list></user-list>
</template>

<script type="text/javascript">
export default {
  name: "Hoge",
  components: {
    'user-list': UserList
  }
}
</script>
```

コンポーネントの登録の部分はES2015では以下のように省略して書くこともできます(Thank you @kimama1997)。

```js
export default {
  name: "Hoge",
  components: {
    UserList
  }
}
```

`{ ComponentA }`は`{ ComponentA: ComponentA }`の簡略形です。
そしてVueは自動でキーを`component-a`に変換してくれます。

参考: https://vue-loader.vuejs.org/ja/features/es2015.html

# メソッド名

当然camelCaseにします。
処理の内容を明確に表す名前にすること。

よくある間違いは`@click`で発火するメソッドに`clickButton`等とつけてしまうことです。
ちゃんと処理の内容(クリックすると何が起きるのか)を表すようにしましょう。

```html
<!-- 何が起きるのかを表していません -->
<button @click="clickSubmit">Submit</button>

<!-- Good -->
<button @click="postData">Submit</button>
```

# イベント名

> イベント名前はケバブケースにするべきです。
> イベント名は末尾が不定形の動詞(例 client-api-load)、または名詞(例 drive-upload-success)で終わるべきです。

よくある間違いは`@click`で発火したタイミングで通知するイベントに対して`update-user-list`等と実行する内容をつけてしまうことです。
何が起きたのかを表す名前をつけましょう。
メソッド名をつけるときとは逆の考え方なので要注意です。

```js
this.$emit('updateButtonClick') // kebab-caseになっていません。
this.$emit('click-on-update-button') // 末尾が不定形の動詞で終わっていません。
this.$emit('update-button-click') // Good
```

ちなみに vue.js 2.3 から使える `.sync` 修飾子を使う場合は少々ややこしいですが、以下のようにkebab-caseとcamelCaseを使い分けるので要注意です。

```html
<comp :my-foo.sync="bar"></comp>
```

```js
this.$emit('update:myFoo', newValue)
```

<p data-height="265" data-theme-id="0" data-slug-hash="OjezvX" data-default-tab="js,result" data-user="isuke" data-embed-version="2" data-pen-title="vue.js sync test" class="codepen">See the Pen <a href="https://codepen.io/isuke/pen/OjezvX/">vue.js sync test</a> by isuke (<a href="https://codepen.io/isuke">@isuke</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>
MySQLでALTER TABLEしたらOut of memoryが出る対応

# エラー内容
大きなテーブルにALTER TABLEしたらメモリが足りなくて下記のエラーが出る

An error has occurred, all later migrations canceled: Mysql2::Error: Out of memory; check if mysqld or some other process uses all available memory; if not, you may have to use 'ulimit' to allow mysqld to use more memory or you can add more swap space:

# 対策
1. RDSのインスタンスのメモリをあげる
2. innodb_buffer_pool_sizeを下げる(AWSは{DBInstanceClassMemory*3/4}がデフォルトだが1/2にしても問題なし)
担当プロダクトのDBをまるっとリプレイスするためにやったこと

#SlideShareで公開してます
[![thumbnail](http://image.slidesharecdn.com/db1-170220005433/95/slide-1-1024.jpg)](https://www.slideshare.net/shinyatakara3/db-1-72341489)
<a href="//www.slideshare.net/shinyatakara3/db-1-72341489" title="担当プロダクトのDBをまるっとリプレイスするためにやったこと" target="_blank">担当プロダクトのDBをまるっとリプレイスするためにやったこと</a> </strong> from <strong><a target="_blank" href="//www.slideshare.net/shinyatakara3">Shinya Takara</a></strong>
pythonでlinuxコマンドlsの実行結果をlistに保存

# listdir

```py3
import os
ls_file_name = os.listdir()
```

# scandir

```py3
import os

filenames = [f.name for f in os.scandir()]


# .から始まる特殊ファイルを除く
filenames = [f.name for f in os.scandir() if not f.name.startswith('.')]

# ディレクトリのみ 
filenames = [f.name for f in os.scandir() if f.is_dir()]

# ファイル のみ
filenames = [f.name for f in os.scandir() if f.is_file()]
```

- [python公式](https://docs.python.jp/3/library/os.html)でlistdirよりscandirが推奨されている。
- 以下のgrep使うより、listdir,scandirを使ってreで絞ったほうがいいかも。

# subprocess

```py3
import subprocess as sp
cmd = "ls" 
proc= sp.Popen(cmd, shell=True, stdout=sp.PIPE, stderr=sp.PIPE)
std_out, std_err = proc.communicate()
# byte文字列で返るのでstrに
ls_file_name = std_out.decode('utf-8').rstrip().split('\n')
```

また、以下のように、簡単に書ける。

```py3
ls_file_name = sp.check_output("ls | grep foo", shell=True).decode('utf-8').strip().split('\n')
```

ただし、今回のように実行したいコマンドを1つの文字列で渡す場合は、`shell=True`にしなければいけない。
Where in の条件部分を正規表現でうまいことしよう

# 概要

システムの保守やってるとwhere in のクエリをよく使います。
エクセルの表が添付されて、こいつらを消せとか調査しろみたいな指令が来たとき

```
ABCD1577
ABCD1618
ABCD1631
```

みたいなのを

```
'ABCD1577',
'ABCD1618',
'ABCD1631'
```

にしたいとか

```
XXXXABC37540M          R52M
XXXXABC37541M          R53M
XXXXABC37542M          R54M
```

みたいなの(エクセルから2列コピってくるとtabに挟まれてますね)を

```
('XXXXABC37540M','R52M'),
('XXXXABC37541M','R53M'),
('XXXXABC37542M','R54M')
```

にしたいときがあります。
正規表現使ってやってみましょう。

## サクラエディタで

だいたいの現場で標準に使われてるサクラエディタでのやり方はこちら。
サクラの正規表現エンジンの所以か、行末を$で指定すると改行まで引っかかってうまくないです。なんでじゃろうな。
苦肉で改行コードを置換前後に入れてたりします。
もうちょっといいやり方があるんでなかろうか…


### 1項目

* 置換前

```
^(.*)\r
```

* 置換後

```
'\1',\r
```

### 2項目

* 置換前

```
^(.*)\t(.*)\r
```

* 置換後

```
('\1','\2'),\r
```

## Vimで

Vimの正規表現での書き方はこちら。

### 1項目

```
:%s/^\(.*\)$/'\1',/g
```
### 2項目

```
:%s/^\(.*\)\t\(.*\)$/('\1','\2'),/g
```

VeryMagic使った方が良さげですね。

割とよく使うので私はvimrcに書いてキーバインドを割り当てています。
VisualModeで選択して使うので、%は抜いています。

```
vnoremap <Leader>k :s/^\(.*\)$/'\1',/g<CR>
vnoremap <Leader>K :s/^\(.*\)\t\(.*\)$/('\1','\2'),/g<CR>
```


置換結果の最後の1行はカンマ削ってね。
[Node.js]Raspberry Pi のカメラモジュールで撮影した写真をAzure Blob Storageに送る


Raspberry Piにカメラモジュールを付け、撮影した写真をAzure Blob Storageに保存します。
OSはRaspbian。言語はJavaScript（Node.js）です。


## 準備
カメラモジュールを接続したRaspberry Pi（OSはRaspbian）を用意します。
そして、Node.jsをインストールしておきます。

Azureには、Blob Storageを作成します。
作成したら、ConnectionStringとコンテナー名を控えておきます。

## コード
以下のコードを実行すると、カメラモジュールが撮影をし、その画像をBlob Storageに保存してくれます。
その際、

- ConnectionStringとコンテナー名は書き換える
- date-utils, azure-storageの各モジュールをnpm installする

ことが必要です。

```js
// 写真ファイルパス（ファイル名は現在日時を使う）
require('date-utils');
var dt = new Date();
var fileName = dt.toFormat('YYYYMMDDHH24MISS') + '.jpg';
var filePath = '/home/pi/photo/' + fileName;

// Azureとの連携用モジュール
var azure = require('azure-storage');

// Azure上のBLOBストレージとの接続用サービスオブジェクト
// 引数にBLOBストレージのConnectionStringを設定
var blobSvc = azure.createBlobService('{ConnectionString}');

// カメラモジュールを使って写真を撮影する
var spawn = require('child_process').spawn;
var option = ['-o',  filePath];
var raspistill = spawn('raspistill', option);

// 撮影完了後のコールバックにてアップロードを実行
raspistill.on('close', function() {
    blobSvc.createBlockBlobFromLocalFile('{コンテナ名}', fileName,  filePath, function(error, result, response){
        if(!error){
            console.log('アップロード成功');
        } else {
            console.log(error);
        }
    });
});
```

たったこれだけでクラウドカメラができました。お手軽ですね。

## 参考
[Node.js から BLOB ストレージを使用する方法](https://docs.microsoft.com/ja-jp/azure/storage/blobs/storage-nodejs-how-to-use-blob-storage)
Colorboxでスマホを回転した時にモーダルを閉じる

#はじめに
Colorboxは画像、動画、htmlなどを手軽にモーダル化できるプラグイン。
公式：http://www.jacklmoore.com/colorbox/

レスポンシブでスマホ対応していたのですが、回転時（landscape/portrait切替時）にどうしても表示が崩れてしまうため、モーダルを自動で閉じることにしました。

#JS
`var timer = false;
        $(window).on("orientationchange resize",function(){ //1
          if (timer !== false) { clearTimeout(timer); }
          timer = setTimeout(function() { $.colorbox.close(); }); //2
        });`

#解説
colorbox読み込み後に上記を追加。
1.画面回転を検知し
2.colorboxのモーダルを閉じています

#参考
http://kidokorock.com/jquery-resize-orientationchange/

https://teratail.com/questions/48285
【Git】ブランチの運用について

# 概要
ブランチってディレクトリ構造みたいに運用するのか？みたいな感じで疑問に思ったので、調べて簡単にまとめました。git-hub flowがシンプルで分かりやすかったので、元にしています。

# ブランチについて
## 種類
- masterブランチ
- topicブランチ

### masterブランチ
常にリリースできる状態のブランチ。従って、テストもしっかりされている状態でマージされないといけない。

### topicブランチ
作業毎にtopicブランチを作成し、開発が完了した時点でmasterブランチにマージする。

# 作業例
1. masterブランチからtopicブランチを作成する。(topicブランチ名には作業が分かるような名称にする)
2. ローカルでcommitし、サーバ上の同じtopic名のブランチに適宜pushする。また、その際、Jenkinsでテストが走るようにする。
3. プルリクをして、レビューを行う。
4. レビューを通過したら、masterブランチにマージする。
Bash on Ubuntu on Windows から VS Code を「普通に」使う

Bash on Ubuntu on Windows から、VSCode を

```
$ code my/suggoi/iketeru.ts aitsu-no/yabai.ts
```

みたいに相対パス付きで立ち上げるのが、いろいろめんどくさかったのでメモ。

環境は `Windows 10 Pro Insider Preview Build 16199` / `$ uname -a
Linux PC201404-001 4.4.0-43-Microsoft #1-Microsoft Wed Dec 31 14:42:53 PST 2014 x86_64 x86_64 x86_64 GNU/Linux` / `VS Code 64bit 1.16.0-insider`。他の組み合わせは知らん。

1. bash に `wslpath` (`cygpath` みたいなやつ) を入れる: https://gist.github.com/ntabee/d7af5686dc4a99fda5a77b4ef081b102 ←を `/usr/local/bin` かなんかに置いて `chmod a+x` すべし。
2. VS Code の `bin` に起動用シェルスクリプトを入れる: https://gist.github.com/ntabee/5c2e655edce1c59d76d885868031cf5d ←を `C:\Program Files\Microsoft VS Code Insiders\bin` に置いて `chmod a+x` すべし。

やってることは、`.exe` や引数のパス名を Windows ネイティブの形に変換して `powershell` に渡す、それだけ。
WordPressのページ間でPOSTデータを送受信する

WordPressで「post」と言うと投稿データのことですが、WordPressの記事内にフォームを作り「**POST**」データを送受信する方法です。

投稿本文欄でPHPを扱えるようにするプラグインを使えばよりイージーにできますが、セキュリティの懸念もあるため使いません。

プラグインに頼らずWPが本来備えている functions.php の**ショートコード機能**を利用します。

## 概要

**ページA**のフォームからPOSTでデータを送り、
**ページB**にショートコードを置いてPOSTデータを取得します。

メール送信など高度な処理が目的ではありません。
ページAのフォームで入力した値をページBで返すことが目的です。

## functions.php

テーマフォルダにある functions.php に以下を追記。

```php
function form_post() {
  if(isset($_POST)){
    $form_post = $_POST;
    print_r($form_post);
  }
}
add_shortcode('sc_form_post', 'form_post');
```

これで「sc_form_post」というショートコードができました。
このショートコードが実行されると、そのページにPOSTデータがあれば出力します。

## ページA

本文欄へ以下のようにHTMLを書き普通にHTMLフォームを作ります。

```html
<form method="post" action="/page-b">
名前：<input type="text" name="name">
アドレス：<input type="email" name="email">
<input type="submit" value="送信">
</form>
```

## ページB

本文欄の好きな箇所へ functions.php に作ったショートコードを置きます。

```html
[sc_form_post]
```
これでページAのフォームからページBへPOSTされたデータが出力されます。


## ショートコードをカスタマイズする

先ほど作ったショートコードをフォームの内容に合わせてカスタマイズします。

```php
function form_post() {
  if(isset($_POST)){
    $name = $_POST['name'];
    $email = $_POST['email'];
    echo '<ul>';
    echo '<li>'.$name.'</li>'
    echo '<li>'.$email.'</li>'
    echo '</ul>';
  }
}
add_shortcode('sc_form_post', 'form_post');
```
受け取ったPOSTデータを自由に扱えます。

しかしこの状態だとPOSTデータの出力が functions.php に依存しており、表示を変える時に functions.php を編集する必要があります。


## JavaScriptで扱いやすくスタマイズする

POSTを受け取った後の操作を functions.php に依存せず、汎用的にPOSTデータを扱えるようにPHPからJSへデータを受け渡します。

```php
function form_post() {
  if(isset($_POST)){
    $postArray = json_encode($_POST, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT);
    echo '<script>var postArray = '. $postArray .';</script>';
  }
}
add_shortcode('sc_form_post', 'form_post');
```

これでショートコード「sc_form_post」の仕事はPOSTデータの受け渡しだけになりました。

ショートコードを呼び出したページで以下のようにJSでPOSTデータを扱えます。

```html
[sc_form_post]
<script>
if(typeof postArray['email'] !== 'undefined') {
  var name = postArray['name'];
  var email = postArray['email'];
}
</script>
```