OmniAICreator/Qiita-1.07M huggingface dataset:
【elixir】slackbotをつくり定期的にコメントさせる

elixirを使ってslackのbotを作り、定期的にコメントできるようになるまでです。
slackのapi_tokenの取得などは割愛してます。



#BOTを作成

ライブラリは下記を使いました。

elixirでslackbot作るようのライブラリ
[slack](https://hex.pm/packages/slack)

Cronっぽく実行できるライブラリ
[quantum](https://hex.pm/packages/quantum)

## サンプル用のプロジェクトを作成

```
mix new bot
```

##`mix.exs`の修正

```mix.exs
defmodule Bot.Mixfile do
  use Mix.Project

  def project do
    [app: :bot,
     version: "0.1.0",
     elixir: "~> 1.4",
     build_embedded: Mix.env == :prod,
     start_permanent: Mix.env == :prod,
     deps: deps()]
  end

  def application do
    [applications: [:logger, :slack, :quantum],
         mod: {Bot, []}]
  end

  defp deps do
    [
      {:slack, "~> 0.11.0"},
      {:quantum, "~> 1.9"}
    ]
  end
end
```

##次に`config.exs`に追記

```config.exs
use Mix.Config

config :quantum, :bot,
cron: [
    "* * * * *": {Bot.ScheduleAction, :hello} # 実行させたいタスク
]

config :quantum,
  timezone: "Asia/Tokyo" # デフォルトUTCなので設定ここで変更する

config :slack,
 api_token: "{API_TOKEN}" # slackのトークン

```

## プログラム作成

```lib/bot.ex
defmodule Bot do
  use Application

  def start(_type, _args) do
    Bot.Supervisor.start_link
  end
end

```

slackのチャンネルIDを保持させるためにRegistryを使用してます。

```lib/bot/supervisor.ex
defmodule Bot.Supervisor do

  use Supervisor

  def start_link(opts \\ []) do
    Supervisor.start_link(__MODULE__, :ok, opts)
  end

  def init(:ok) do
    api_key = Application.get_env(:slack, :api_token)

    children = [
      worker(Slack.Bot, [Bot.SlackBot, [], api_key]),
      supervisor(Registry, Bot.Registry.opts()) 
    ]

    supervise(children, strategy: :one_for_one)
  end

end

```

```lib/bot/slack_bot.ex
defmodule Bot.SlackBot do

  use Slack

  alias Bot.Registry

  def handle_connect(slack, state) do
    Registry.set_channel_id(lookup_channel_id("#general", slack))
    Registry.set_slack(slack)
    send_message("参上！", Registry.get_id(), slack) #成功したら参上！ってgeneralにつぶやく

    {:ok, state}
  end

end


```

```lib/bot/registry.ex
defmodule Bot.Registry do

  @key :slack_registry

  def opts(), do: [:unique, @key]

  def set_channel_id(channel_id), do: Registry.register(@key, :id, channel_id)

  def set_slack(slack), do: Registry.register(@key, :slack, slack)

  def update_slack(slack), do: Registry.update_value(@key, :slack, fn(_) -> slack end)

  def get_id() do
    case Registry.lookup(@key, :id) do
      [{_pid, channel_id}] -> channel_id
      _ -> nil
    end
  end

  def get_slack() do
    case Registry.lookup(@key, :slack) do
      [{_pid, slack}] -> slack
      _ -> nil
    end
  end
end


```

quantumに登録するようのアクション

```lib/bot/actions/schedule_action.ex
defmodule Bot.ScheduleAction do

  alias Bot.Registry
  alias Slack.Sends

  def hello() do
    Sends.send_message("こんにちは", Registry.get_id(), Registry.get_slack())
  end

end

```

## 実行してみる

```
mix deps.get
mix run --no-halt
```
うまくいくとgeneralに「参上！」とでて毎分「こんにちは」してきます


[サンプル](https://github.com/sumiyoshi/bot_sample)

GitHubに今回のソース置いておきました。

elixirって書いてて楽しい！
【読書ノート】《C# in Depth》～6ジェネリック

何故ジェネリックが必要なの？何のためにジェネリックが存在するの？

＞型だけ違って処理の内容が同じようなものを作るときに使う。

すげー昔の昔の昔！ある現場で2つのint値の大きいほうをとる関数を作る。

```csharp
int GetMax(int x, int y)
{
  return x > y ? x : y;
}
```

次の日、2つのdouble値の大きいほうをとる関数がほしい。

```csharp
double GetMax(double x, double y)
{
  return x > y ? x : y;
}
```

次の日.....マジがよ！！

同じ処理のメソッドを一杯作りたいくないでしょう！

神ジェネリックが誕生：

```csharp
static Type GetMax<Type>(Type a, Type b)
  where Type : IComparable
{
  return a.CompareTo(b) > 0 ? a : b;
}
```

where はなだ？　
where キーワードを使って型に制約条件を付加します。
CompareToを使うために、where Type : IComparableを書かないと行けないですよ。

```csharp
int    n1 = GetMax<int>(5, 10); 
int    n2 = GetMax(5, 10);
double x  = GetMax(5.0, 10.0);
string s  = GetMax("abc", "cat");
```
すすすすごいでしょう！！！！
Pythonの単体テスト

Python 3.5.1で実行

## ディレクトリ構成
```
unittest
├ src
│　 └ Main.py
└ test
　  └ TestMain.py
```

## コード
```py3:Main.py
class Main(object):
    def sum(num1, num2):
        return num1 + num2
```

```py3:TestMain.py
import unittest

import sys
sys.path.append('../')
from src.Main import *

class TestMain(unittest.TestCase):
    def test_sum(self):
        expected = 3
        actual = Main.sum(1, 2)
        self.assertEqual(expected, actual)

if __name__ == '__main__':
    unittest.main()
```

## 出力結果
```
$ python -B TestMain.py 
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK
```
AWS CodeStarを使ってみた所感

AWS Manaement Consoleを何気なく弄っていた(!?)ら、「**[AWS CodeStar](https://aws.amazon.com/jp/blogs/news/tag/codestar/)**」なるサービスに目が留まった。
CodeXXX系を使い倒してAWS上にDevOps環境を作ろうとしていたところだったので、CodeStarを試してみた。

# おおっと思った点

* CodeCommit/CodeBuild/CodePipelineの夢の競演
  →ソースコードのPull~ビルド～デプロイをAWSサービスで自動化

* Lambda（Javaアプリ）のデプロイの自動化!!
  →今まではお手製のJavaアプリZIPを手動でアップロード...
  →CodeBuildに、自前のJenkinsを組み込もうとしていた矢先!!

* Lambda（Javaアプリ）のデプロイはCloudFormationで実装
  →EC2へのデプロイとかだと、CodeDeployも登場するはず!!

* EclipseプラグインによるCodeCommitとのシームレスな連携

* CodeCommitへのPushをトリガーにして、CodePipelineが処理を自動開始

* DashBoradにCodeCommitのコミット・メッセージを一覧表示

# 今後に期待する点

* 日本Regionでの提供開始...

* カスタマイズしようとしてCloudFormationをいじると、次のCodePipeline実行でデフォルトStackに上書きされる？？？
  ※まだ不勉強なせいだろうが、これは困る...

* 既存のCodeCommitリポジトリとの連携性
  ※CodeStarが自動作成したCodeCommitリポジトリに、既存ソースコードをAdd/Pushする必要があったような...

* 想定外の挙動不審が多い？？？
  ※ローカルで更新したソースファイルが正しく適用されていないことがしばしば...ローカルでクリアビルドしているのにCodeBuildがコケるとか...

* 各タスクの実行ステータスの高精度化
  ※完了表示のタスクが、F5で実行中に戻ったり...

日本Regionでリリースされれば、少なくとも自分は、GitとかJenkinsとか自分で構築することはなくなるかなぁ...
Visual Studio > XAML > エラー:名前空間プレフィックス"sys"が定義されていません、の対応

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

参考: https://code.msdn.microsoft.com/windowsdesktop/WPF-ComboBoxEnum-ddd26709

上記のコードをまねしようとしていたら、以下のエラーが出る。

> 名前空間プレフィックス"sys"が定義されていません

XAMLに以下を追加することで回避できた。

```
xmlns:sys="clr-namespace:System;assembly=mscorlib" 
```
Macにswagger-ui導入した時のメモ

## リポジトリをクローン
git clone https://github.com/swagger-api/swagger-ui.git

## swaggerスペックを./swagger-ui/distに配置
mv でも cp でも使って移動

## dockerイメージ作製
docker build -t swagger-ui-builder .

## 起動
docker run -d -p 127.0.0.1:8080:8080 swagger-ui-builder
タイムアウト問題

.NETで作成したアプリケーションからDBアクセスした際にタイムアウトが発生した場合、以下の原因が考えられる。

#1.トランサクションタイムアウト
トランザクションには、トランザクションタイムアウトという機能があります。
これは、トランザクションが開始されると同時にトランザクションの経過時間を監視し、
一定の時間に到達するとトランザクションを自動的にロールバックする機能です。

例えばデータの更新中にクライアントのPCがシャットダウンしアプリケーションが終了してしまった場合、データベースの占有してしてしまうことになるので他のクライアントからのアクセスでトランザクションの待ち状態が発生してしまいます。
一定の時間でトランザクションをロールバックさせることで、このように予期せぬ事態が発生したさいもトランザクションの待ち状態を短くすることができるのです。

データの一貫性を保つためには大切な機能なのですが、
これが原因で膨大なデータ操作を行う際に、タイムアウトが発生してしまうことがあります。

トランザクションのタイムアウトが発生した場合は、
サーバー/クライアントどちらの処理で時間がかかっているのか確認すること。

待機時間の初期値は1分
これ以上伸ばしたい場合は、
TransactionScope.Timeoutプロパティに時間を指定する。

```csharp
using(var tran = new TransactionScope(TransactionScopeOption.Required,new TimeSpan(0,10,0))
```
isolationレベルも指定したい場合は、以下のようになる

```csharp
var transactionOptions = new TransactionOptions();
transactionOptions.IsolationLevel = IsolationLevel.ReadUncommitted;
transactionOptions.Timeout = new TimeSpan(0, 10, 0);
using(var tran = new TransactionScope(TransactionScopeOption.Required, transactionOptions));
```
↓(1行で書いてもよい）

```csharp
using(var tran = new TransactionScope(TransactionScopeOption.Required,new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted,Timeout = new TimeSpan(0,10,0)}))
```

※待機時間を10分以上に設定したい場合は、machine.configで設定する必要がある。
machin.configはサーバー単位で共有されるため、慎重に。

#2.Sqlコマンドのタイムアウト
1つのコマンド単位の待機時間。
規定値は30秒。
ObjectContext.CommandTimeoutプロパティで設定する。
herokuデプロイ時にENOTFOUNDと出る

学校のwifi下で

`$heroku run rake db:migrate`

と命令した時

ENOTFOUND: getaddrinfo ENOTFOUND api.heroku.com api.heroku.com:443

と出てmigrateができない状態が続いた。

調べてみると
問題は学校のwifiによるネットワークらしく
実際家のwifi下では問題なく命令が通った。

確かに学校のwifi上でネトゲとかもできないもんな...。
gemの追加によりcomit数が異常に増えてしまった時の対処方法


今回 vender/budle をインストールしたことにより更新ファイルが6800個ほど追加されてしまったことに気づかずに他の作業をしてしまい、消すに消せなくなってしまっていた。
そこで対処法が見つかったので記載する。

##省きたいものを浮き出させる##

```ターミナル
git add .
git diff
git rm -r --cached .
```

上記コマンドをターミナル上で打つことで、コミットしていたものでも、gitdesktop上にもう一度浮き出させることができる。

##gitignoreに追加##

```.gitignore
# Ignore bundler gems.
/vendor/bundle
```

上記の文面をgitignoreファイルの下部に追記する。
追記することでgitdesktop上から省きたかったものが一気に消える。

##github上のコミットを省略する##

```ターミナル
git push origin ブランチ名
```

このコマンドを打つことでgithub上にあった膨大なコミット数が省かれる。
Visual Studio / WPF > DataGrid > DataGridComboBoxColumnを使ってみる

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

関連 [Visual Studio / WPF > DataGrid > XAMLで列を追加して、CSでデータを追加する](http://qiita.com/7of9/items/c3fce444407d48235f11)

~~DataGridView~~DataGridにおいて、コンボボックスを扱いたい。

参考: http://stackoverflow.com/questions/19003133/wpf-datagrid-combobox-column

1. XAMLにてDataGridComboBoxColumn追加
  - `x:Name`指定
  - `SelectedValueBinding`指定
  - `DisplayMemberPath`指定

```xml:XAML
        <DataGrid x:Name="dataGridView1" HorizontalAlignment="Left" Height="211" Margin="10,10,0,0" VerticalAlignment="Top" Width="497">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
                <DataGridComboBoxColumn Width="100" x:Name="Gender"
                                        Header="Gender"
                                        SelectedValueBinding="{Binding Gender, Mode=TwoWay}"
                                        DisplayMemberPath="{Binding Gender}"/>
            </DataGrid.Columns>
        </DataGrid>

```

```MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace _170421_t1510_WpfDataGridComboBox
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public List<string> genlist { get; set; }

        public MainWindow()
        {
            genlist = new List<string>();
            genlist.Add("Male");
            genlist.Add("Female");

            InitializeComponent();
            Gender.ItemsSource = genlist;
            dataGridView1.Items.Add(new Employee { Name = "7of9", Gender = "Female" });
            dataGridView1.Items.Add(new Employee { Name = "Chakotay", Gender = "Male" });
            dataGridView1.Items.Add(new Employee { Name = "Odo", Gender = "Unknown" });
        }
    }
    public class Employee
    {
        public string Name { get; set; }
        public string Gender { get; set; }
    }
}
```

![work.png](https://qiita-image-store.s3.amazonaws.com/0/32870/394f20bc-f429-387e-e012-b99b7e9cff22.png)


Odo (Deep Space Nineのキャラクター)はUnknownのGenderであるが、追加しても「Unknown」という表示ではない。Genderのリスト項目にないためだろう。

コンボボックス項目を編集しようとしてダブルクリックすると例外が発生する。このあたりは今後の学習事項。
[Linux][awk] awkでログ集計(合計, 平均)

ログ集計時にたまに使って毎回調べてるのでメモ

# 入力例

```text:test.log
A 1.1 funcA1()
B 1.2 funcB1()
C 1.3 funcC1()
A 2.4 funcA2()
B 2.5 funcB2()
C 2.6 funcC2()
```

# 使用例
## 合計

```shell-session:すべての合計
$ cat test.log | awk '{sum+=$2} END {print sum}'
11.1
```
```shell-session:Bの合計
$ cat test.log | awk '/^B\s.*$/{sum+=$2} END {print sum}'
3.7
```

## 平均

```shell-session:すべての平均
$ cat test.log | awk '{sum+=$2} END {print sum/NR}'
1.85
```

```shell-session:Aの平均
$ cat test.log | grep -E "^A\s.*$" | awk '{sum+=$2} END {print sum/NR}'
1.75
```

(抽出した場合の個数を簡単に出す方法がわからなかったので、前段でgrepを使ってます・・・)

# 参考
[Awkワンライナー (最小値、最大値、合計、平均、中央値) - それがしの足音](http://d.hatena.ne.jp/leetmikeal/20130117/1358423717)
[統計屋のためのAWK入門 - あんちべ！](http://antibayesian.hateblo.jp/entry/2014/09/15/162605)
Azure Time Series Insights プレビュー触ってみた(2) デモ・チュートリアル編

こんにちは。連投になります。

[前回の記事](http://qiita.com/eriver_jpn/items/ad8b29acf5dbedba6e1e)を書いていたら途中で画像がアップロードできなくなりました。。。
ので記事を分けています。

Azure Time Series InsightsのサービスをAzureポータルで展開するところまで来たので、今回はダッシュボード機能について紹介します。このダッシュボードはこのサービス独自に作ったようで、直感的で使い勝手が良いと感じました。

# Time Series Insights ダッシュボード（？）

![image](https://qiita-image-store.s3.amazonaws.com/0/133948/ba59d041-e378-37d2-1fbe-efdc3c2e7603.png)
さて、概要タブの中に「タイムシリーズインサイトのURL」と書いてあるところがあるのでこちらに移動します。


![image](https://qiita-image-store.s3.amazonaws.com/0/133948/bf35a51a-5387-766b-e1eb-930be7ac11c3.png)
ブラウザの別画面でTimeSeriesInsights画面が開きます。

![image](https://qiita-image-store.s3.amazonaws.com/0/133948/fbf13e1d-1795-c28f-d9e7-fedc80b1a567.png)
プレビューに関するService Agreementです。

![image](https://qiita-image-store.s3.amazonaws.com/0/133948/9feab11e-4eaa-3e72-33ee-310d00e55256.png)
同意するとメイン画面が表示されます。とりあえず何も設定してないので、デモ環境に行く、ってボタンを押しましょう。

![image](https://qiita-image-store.s3.amazonaws.com/0/133948/1d33593b-6736-d0af-74f2-f70427786f2c.png)
Contoso Factoryというデモ環境のデータがロードされ、4/1から5/1までの1ヶ月間の時系列データがあるグラフが出てきました。ここからチュートリアルの始まりです。

![image](https://qiita-image-store.s3.amazonaws.com/0/133948/d3f43573-6305-294f-2276-7b4fc6bd2e63.png)
まずは時系列選択パネルからドラッグで範囲を選択し、![image](https://qiita-image-store.s3.amazonaws.com/0/133948/dc6f176d-22cd-6209-c603-e32b6dddac52.png)
をクリックします。

![image](https://qiita-image-store.s3.amazonaws.com/0/133948/bf4dadd7-c86e-d1f1-054a-f614d85c5456.png)
拡大されました。

![image](https://qiita-image-store.s3.amazonaws.com/0/133948/b56cb7ef-1b0a-50cf-82ca-23ab869fcf2b.png)
右側ペインのグラフを適当にドラッグし、右クリック→[Explore Events]を選択すると、


![image](https://qiita-image-store.s3.amazonaws.com/0/133948/b57dbbb0-0db7-7408-b815-a5d4f74512dd.png)
チャートの下にデータそのものを確認するグリッドを出せたりします。
＊ここのロードが結構時間かかってたのだけどどうしてだろう。。。

![image](https://qiita-image-store.s3.amazonaws.com/0/133948/c89db5a4-4360-8436-1804-7d53bfe0f251.png)
STATSのタブをクリックするとグラフが出たりします。型をみてグラフ分けてるのかな？


![image](https://qiita-image-store.s3.amazonaws.com/0/133948/5edafd65-50b6-4a47-2017-4534bc7b4321.png)
左側のペインには時系列データの間隔調整を行う機能、時系列のカテゴリを調整・追加する機能が並んでます。
表示の系列はMEASUREで選んで、上のCOUNT/AVG/SUMで集計方法を選択します。
また、SPLIT BYにカテゴリ項目を指定することで、系列をグループ化することもできます。

![image](https://qiita-image-store.s3.amazonaws.com/0/133948/f3a9e7d3-0ed7-688c-3c66-354ac3545657.png)

系列を追加するともちろん増えます。


![image](https://qiita-image-store.s3.amazonaws.com/0/133948/ab5d0b16-bb38-f64e-5872-76f7be5e4ff6.png)
右側ペインのフィルタ欄を使うと特定の系列のみにフィルタすることができます。

![image](https://qiita-image-store.s3.amazonaws.com/0/133948/3bf90f32-f42a-c875-21c8-d0c419c570e0.png)
画面上で系列にマウスを当てると、そこだけが強調表示されます。クリックする必要はありませんので素早く比較できる感じです。

![image](https://qiita-image-store.s3.amazonaws.com/0/133948/affe3e87-291e-b13c-779e-3df5a4d2aca6.png)
右側ペインのCHARTをHEATMAPに切り替えると、時系列ごとのヒートマップに切り替わります。系列が行に展開される感じですね。

#まとめ

ということで、デモ・チュートリアルを利用してAzure Time Series Insights プレビューの機能を概観してみました。個人的な感想としては、（今回はやってませんが）データをアップロードしたらすぐに使い始めることが出来そうで、ダッシュボードは時系列データの操作に関する基本的な機能を網羅しているところは非常に良いと思います。

PowerBIでも同じことはできると思いますが、こちらのほうが時系列データに特化している分操作が簡単になっているため、センサーデータのモニターをしたいとか、やることの決っているユーザーにとっては使い勝手がよいのではないかと思います。

今後はAPI連携など、他の機能の調査もしていきたいです。特にMachine Learning系サービスとどうやって連携させるのかについては、IoTという技術分野では興味深いところだと思ってます。

ではでは。
BEGAN( + DCGAN )をpytorchで実装して日本人顔の生成

GANのSOTAとして注目されている、BEGAN: Boundary Equilibrium Generative Adversarial Networks( https://arxiv.org/abs/1703.10717 ）をpytorchで実装して日本人顔の生成を行いました.

論文の解説記事はたくさんあるので、ここでは詳しい解説はしませんが、

・Discriminatorがautoencoderになっている
・複数のLossがあり、Lossごとの学習のバランスを取る方法が提案されている （←これがないと全く学習できません）
・収束判定を簡単にできる

解説は、
・Boundary Equilibrium Generative Adversarial Networks [arXiv:1703.10717] – ご注文は機械学習ですか？ ( http://musyoku.github.io/2017/04/16/Boundary-Equilibrium-Generative-Adversarial-Networks/ )
・BEGAN: State of the art generation of faces with Generative Adversarial Networks |  ( https://blog.heuritech.com/2017/04/11/began-state-of-the-art-generation-of-faces-with-generative-adversarial-networks/ )
この辺りが参考になると思います。

実装ですが、まず、できるだけ論文の通りの実装をしたのですが、ちゃんと動いてくれなかったです。。
その後、以下のように試行錯誤をしました。データセットは20万枚の日本人の顔写真を使っています。

論文通り実装
→全く顔らしきものが生成されない
↓
DiscriminatorのInputにガウシアンノイズを入れる
→状況変わらず
↓
Discriminatorが弱すぎると思い、Dの構造をUnet( https://arxiv.org/abs/1505.04597 )に変える
→少し顔っぽくなったものの、形は崩れている
↓
Unetでは顔の抽象化がうまくできていないと思い、Dの構造の後半とGをDCGANのGに変える
→かなり顔っぽくなったものの、少し形が崩れている
↓
DにDropoutを入れたり、学習率を変えたり、ガウシアンノイズを入れたり、こまかいパラメータ調整をした。(DとGのOutputにTanhやsigmoidが入るとうまく動かないみたいでした。)

Iteration=100000での現状のモデルでの生成結果が以下です
<img width="400" alt="スクリーンショット 2017-04-21 15.13.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/170131/844c1218-042c-b7d6-25a8-f44f5ed4cb08.png">

まあまあいい結果になったと思いますが、まだまだ崩れている部分も多少ありますので、パラメータ調整がさらに必要みたいです。
パラメータ調整に２週間くらいかかったので、誰かがもっと安定した手法やテクニックを提案してくれるのを待ってます

<a href="http://musyoku.github.io/2017/04/16/Boundary-Equilibrium-Generative-Adversarial-Networks/">こちらの記事</a>では、
>1epoch目で本物のデータの再構築ができていない場合は学習を打ち切り、ハイパーパラメータを見直した方が良さそうです。

と書かれていたのですが、私の感覚としては、逆に再構築が出来すぎていると、うまくいかないということもありました。顔写真を顔として再構築するのではなく、写真として再構築してしまっているためだと思います。

顔以外でもうまくいくのかな〜、時間があればBedroomのDatasetでもやってみます。
コードはリファクタリング終わったらUpする予定です。Pytorchでの実装なのでそんなに難しいことはしていません。
LaravelのテンプレートでCDNにある静的ファイルへのURLを生成する

# 概要
Laravelには静的なファイルへのURLを生成する`asset`というヘルパー関数が存在し、
普通に使うとWEBサーバーと同じ場所（オリジン）でパスを生成してくれます。

```
{{asset('css/style.css')}}
↓
https://www.example.com/css/style.css
```

しかし大規模なサービスの場合、静的なファイルはCDNを使って別の場所から配信していたりすると思います。
その場合`asset`ヘルパーが使えないので、別途方法を考える必要があります。
色々方法はあるみたいですが、
今回は、**カスタムディレクティブ**を使ってそれを実現してみました。

# 修正
```php:app/Providers/AppServiceProvider.php
    public function boot()
    {
        // ...

        //静的ファイルURL生成
        Blade::directive('asset', function($path){
            return "<?php echo app('url')->assetFrom(config('app.asset_url'), $path); ?>";
        });
    }
```

```php:config/app.php
return [
    // ...

    'asset_url' => env('APP_ASSET_URL'),

    // ...
];
```

```:.env
APP_ASSET_URL=https://asset.example.com
```

# 使い方

```
@asset('css/style.css')
↓
https://asset.example.com/css/style.css
```

カスタムディレクティブなので`{{`と`}}`は使いませんが、
もともとの`asset`ヘルパーと近い使用感で使えると思います。
Visual Studio / WPF > XAMLファイル > "x:" > XAML名前空間用には「x」を付ける決まり

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

http://stackoverflow.com/questions/19003133/wpf-datagrid-combobox-column
を読んでいてわからなかった以下の記述。

```xml
<DataGridComboBoxColumn Width="100" x:Name="Gender" ...
```

Nameの前の「x:」は何なのか。

http://www.atmarkit.co.jp/fdotnet/basics/xaml02/xaml02_01.html
> XAML名前空間用には「x」を付ける決まりになっており、リファレンス・マニュアルなどもその前提で[記述](https://msdn.microsoft.com/ja-jp/library/ms752309.aspx)されています。
Azure Time Series Insights プレビュー触ってみた(1) 環境構築編

こんにちは。

Azure界隈でお仕事しているえりばーと申します。
Qiitaの投稿は初めてです。拙い点ご容赦ください。

# Azure Time Series Insights とは？

Announcing Azure Time Series Insights
https://azure.microsoft.com/en-us/blog/announcing-azure-time-series-insights/

4/20に発表があった、Azure環境で時系列データの分析・可視化を行うクラウドサービスです。
完全なManagedサービスとして展開されるため、事前の環境構築は不要、サービスを展開して設定すると
いきなり使い始められるところがクラウドサービスならではのメリットと感じます。

![image](https://qiita-image-store.s3.amazonaws.com/0/133948/ed0dacc6-b90f-1668-2a2d-3da08a531181.png)
(上記ブログサイトより転載)

紹介されている簡単なアーキテクチャー図を見るに、データはIoT Hub、もしくはEvent Hubsから受信してそのデータを分析するダッシュボードとしての位置付けに読めます。ここでIoT HubやEvent Hubsの機能について詳しく触れることはしませんが、センサーデータ等をメッセージキュー的に受信して、後のサービスに接続するサービスです。何百万台のデバイスにも接続できることが特徴で、AzureのIoTサービスの要となるサービスです。Event Hubsはデバイス→クラウド方向への通信が可能な基本的サービス、IoT Hubはデバイスとクラウドを双方向に通信できる上位サービス的な認識をもっていただけてればよいのかな、と思います。

また、ダッシュボード画面では以下のようなインターフェースで時系列データの可視化を行うことが出来ます。

_時系列グラフ画面_
![image](https://qiita-image-store.s3.amazonaws.com/0/133948/17d870fc-7976-8556-ee9f-87d683d94ad7.png)
(上記ブログサイトより転載)

_ヒートマップ画面_
![image](https://qiita-image-store.s3.amazonaws.com/0/133948/b5b8d237-c7cd-9294-a525-9ceb825a91f1.png)
(上記ブログサイトより転載)

PowerBIサービスの雰囲気に似てますが、表示は専用に開発された固定のGUIで、キビキビ動きます。

今日の時点では環境の設定とデモ・チュートリアルまで見たので、ざっくりとご紹介できればと思います。

*4/21時点ではプレビューサービスであり、今後どのような変更が加わるかわかりません。必要に応じて最新の情報をご参照いただけるようにお願いします。

# サービス展開とポータル上での設定項目

Azureの新ポータルのメニューには出てきません。。。検索機能で探すと出てきます。
![image](https://qiita-image-store.s3.amazonaws.com/0/133948/f74309f1-f4d5-c3f1-779a-787d934da8da.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/133948/d68aaaba-4311-f404-ea10-bb48f84b1f83.png)

[作成]を押下することでデプロイ設定のブレードが出てきますので、必要な情報を入力します。
![image](https://qiita-image-store.s3.amazonaws.com/0/133948/be2b6113-687b-94d6-9218-d9bfaf1d1024.png)

環境名・サブスクリプション・リソースグループは適当に入れてください。

![image](https://qiita-image-store.s3.amazonaws.com/0/133948/7bced4ee-175a-f2ee-1565-8e346c2e1d9d.png)
ロケーションは上記の４箇所が選択できます。早く日本リージョンにも来てもらいたいですね。。。

![image](https://qiita-image-store.s3.amazonaws.com/0/133948/27daeaa3-3cba-4fb9-aba4-9066d981862d.png)
価格帯はS1とS2が選択できます。「１日ごと」と「合計」のイベント数に上限があるようです。

![image](https://qiita-image-store.s3.amazonaws.com/0/133948/11fc59f2-b6a9-9b94-45b6-2bb92eef9f15.png)
容量は単位がわかりませんが、ユニット数みたいな感じでしょうか。
上記はS1の容量を10にした時、

![image](https://qiita-image-store.s3.amazonaws.com/0/133948/ca5bab83-0e4c-3bd2-f875-505501b413a9.png)
上記はS2の容量を10にした時です。推定コストは単純に容量で指定した値倍したものですね。
（プレビュー価格なので、GAしたら変わると思います）

イマイチ課金単位がよくわからないです。判明したら補記しようかと思います。

ここまで設定したら、作成を押すと数分でサービスがデプロイされます。

![image](https://qiita-image-store.s3.amazonaws.com/0/133948/bf156ab7-5336-421e-0df5-7151b20a3e2e.png)
サービスを選択すると、設定用のブレードが出ます。あまり設定するとこなさそうな感じですが。。。
取り急ぎ見ておくべきは、

![image](https://qiita-image-store.s3.amazonaws.com/0/133948/d484aae8-6b54-5e5e-39d4-3869135797da.png)
Configureで容量やイベントの保持期間が変えられること

![image](https://qiita-image-store.s3.amazonaws.com/0/133948/99159191-903c-2389-497d-002d04b26dba.png)
イベントソースを追加して、

![image](https://qiita-image-store.s3.amazonaws.com/0/133948/85677690-96a7-0b12-9850-8dd13f37fd14.png)
イベントハブやIoT Hubの情報を入力するところです。

とりあえず環境は簡単に展開できました。ちなみに削除を押して消すのも一瞬です。

次の投稿では、デモ・チュートリアルを利用してTime Series Insightsのユーザー向け機能を概観したいと思います。
MacのOSをアップデートした後にMySQLが使えなくなった場合の対処方法


MacのOSをアップデートしたところ、mysqlが起動しなくなった。

## 条件

* Mac OS Sierra
* MySQL5.6（Homebrewでインストール済）


## 対処方法

Homebrewでインストール済のパッケージを再度リンクする。

```
#インストールされていることを確認
$ ls /usr/local/Cellar/mysql*
/usr/local/Cellar/mysql56:
5.6.29

/usr/local/Cellar/mysql@5.6:
5.6.29


#再度リンクする
brew unlink mysql@5.6
brew link --force mysql56

#パスも追加する
echo 'export PATH="/usr/local/opt/mysql@5.6/bin:$PATH"' >> ~/.bash_profile 

```

ターミナルを再起動して動作確認する。

```
# 動作確認
$ sudo mysql.server start
Starting MySQL
. SUCCESS! 

```
Visual Studio / WPF > DataGrid > XAMLで列を追加して、CSでデータを追加する

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

[Visual Studio / WPF > DataGrid > 列を追加して、データを追加する](http://qiita.com/7of9/items/8f86d23090c5cd150854)
にてDataGridに項目を追加した。

列の設定はXAMLで行っておきたい。

XAMLでは、DataGrid上で「列の追加」> 「DataGridTextColumnの追加」で列を１つ増やせる。その際のXAMLは以下のようになる。

```xml:XAML
           <DataGrid.Columns>
                <DataGridTextColumn/>
            </DataGrid.Columns>
```

これだけだと列の名前やデータバインディングの指定がないため、以下のように書き換えてみた。

```xml:XAML
           <DataGrid.Columns>
                <DataGridTextColumn Header="Column1" Binding="{Binding Column1}"/>
            </DataGrid.Columns>
```
参考: http://stackoverflow.com/questions/12230866/datagrid-column-xaml

CSファイルは以下のように１つ目の列作成はスキップして、実行してみた。

```MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace _170421_WpfApp1
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_ContentRendered(object sender, EventArgs e)
        {
            var dg = dataGridView1;
            for (int idx = 0; idx < 4; idx++)
            {
                if (idx == 0)
                {
                    continue;
                }
                var column = new DataGridTextColumn();
                column.Header = "Column" + (idx + 1);
                column.Binding = new Binding("Column" + (idx + 1));
                dg.Columns.Add(column);
                //
            }
            dg.Items.Add(new DataItem { Column1 = "a.1", Column2 = "a.2", Column3 = "a.3", Column4 = "a.4" });
            dg.Items.Add(new DataItem { Column1 = "b.1", Column2 = "b.2", Column3 = "b.3", Column4 = "b.4" });
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            
        }
    }

    public class DataItem
    {
        public string Column1 { get; set; }
        public string Column2 { get; set; }
        public string Column3 { get; set; }
        public string Column4 { get; set; }
    }
}
```

![work.png](https://qiita-image-store.s3.amazonaws.com/0/32870/ad25a73a-8328-8552-6408-a90497a17263.png)
KotlinでAndroid Databinding

# Data Binding

ModelとLayoutファイルのプロパティを紐付け、Modelのクラスを生成して渡すとViewに表示してくれるステキな機能でAndroidではライブラリで実現されています。
WindowsフォームなどのGUIプログラミングをやったことある人は知ってる概念かもしれません。

今回はしていませんが双方向バインディングするとViewへの入力をModelに反映も出来ます。

[公式のドキュメント](https://developer.android.com/topic/libraries/data-binding/index.html?hl=ja)はもちろんJava向けなのでKotlinで実装してみます。


## Gradle

``` 
// app gradle

apply plugin: 'kotlin-kapt'
...

android {
    ...
    dataBinding {
        enabled = true
    }
}

dependencies {
    ...
    kapt 'com.android.databinding:compiler:2.3.1'
}
```

kaptはData Bindingのためのものでは有りませんが、Data BindingのためのクラスがAnnotation Processingで生成されるので。KotlinでもAnnotation Processingに対応するためのプラグインを入れています。

## バインディングするモデル作成

```
class User(var firstName: String, var lastName: String)
```

サンプルに習いfirstName,lastNameというプロパティを持つUserというモデルを作成します。


## layout

```
// main_activity.xml
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable
            name="user"
            type="com.example.myapplication.model.User" />
    </data>
<!-- もともとのRoot要素をLayoutでくるむ、xmlns:android="http://schemas.android.com/apk/res/android"が重複するので元々のroot要素からは削除 -->

・・・・・・
<!-- 追加 -->
        <TextView android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.firstName}"/>
        <TextView android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.lastName}"/>
・・・・・・
</layout>
```


- Root要素を「layout」にする
- 「data」にModelの紐付けをする
- Viewのandroid:text（など）に"@{user.firstName}"とプロパティを指定

## Activity

``` 
// ActivityMain.kt
// onCreate
        val binding = DataBindingUtil.setContentView<MainActivityBinding>(this, R.layout.activity_main)
        val user = User("Test", "User")
        binding.user = user
```

DataBindingUtilを持ちいてバインドされたViewを取得。（←これの名称なんて言えばいいんですかね･･････）
このViewのプロパティ（layoutファイルのdata->variable要素のname属性で定義したもの）にModelのクラスを渡すだけです。
ロゴ入りQRコードの生成方法

ZXing Android embeddedを入れる

```
compile 'com.journeyapps:zxing-android-embedded:3.5.0'
```

そしてこれ。

```java
    private Bitmap createLogoQR(String text, @DrawableRes int drawableId, int width, int height) {
        try {
            BarcodeEncoder encoder = new BarcodeEncoder();
            Map<EncodeHintType, Object> hints = new HashMap<>();
            // 誤り訂正レベルHighで、30%程度QRコードが隠れていても読める
            hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
            Bitmap qr = encoder.encodeBitmap(text, BarcodeFormat.QR_CODE, width, height, hints);

            Bitmap logo = ((BitmapDrawable) ContextCompat.getDrawable(this, drawableId)).getBitmap();

            Bitmap logoQr = Bitmap.createBitmap(qr.getWidth(), qr.getHeight(), qr.getConfig());
            Canvas canvas = new Canvas(logoQr);
            canvas.drawBitmap(qr, new Matrix(), null);

            // 縦横30%程度のサイズにロゴを縮小する
            int scaledLogoWidth = (int)(qr.getWidth() * 0.3f);
            int scaledLogoHeight = (int)(qr.getHeight() * 0.3f);
            Bitmap scaledLogo = Bitmap.createScaledBitmap(logo, scaledLogoWidth, scaledLogoHeight, true);

            float cx = (qr.getWidth() - scaledLogoWidth) / 2.0f;
            float cy = (qr.getHeight() - scaledLogoHeight) / 2.0f;
            canvas.drawBitmap(scaledLogo, cx, cy, null);

            return logoQr;

        } catch (WriterException e) {
            // コンテンツがエンコードできなかった場合
            e.printStackTrace();
        }
        return null;
    }
```
Visual Studio / WPF > DataGrid > CSで列を追加して、データを追加する

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

http://qiita.com/7of9/items/ea8a3f3bca45b22d33c1
で試したWindows Forms ApplicationでのDataGridViewへのデータ追加は、WPFの場合エラーとなる。

WPFでは以下のようにするようだ。
参考: http://stackoverflow.com/questions/11950312/how-to-add-data-to-a-wpf-datagrid-programatically

1. DataGridViewを追加
   - 名前をdataGridView1としておく
2. csファイルに以下を実装する

```MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace _170421_WpfApp1
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_ContentRendered(object sender, EventArgs e)
        {
            var dg = dataGridView1;
            for (int idx = 0; idx < 4; idx++)
            {
                var column = new DataGridTextColumn();
                column.Header = "Column" + (idx + 1);
                column.Binding = new Binding("Column" + (idx + 1));
                dg.Columns.Add(column);
                //
            }
            dg.Items.Add(new DataItem { Column1 = "a.1", Column2 = "a.2", Column3 = "a.3", Column4 = "a.4" });
            dg.Items.Add(new DataItem { Column1 = "b.1", Column2 = "b.2", Column3 = "b.3", Column4 = "b.4" });
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            
        }
    }

    public class DataItem
    {
        public string Column1 { get; set; }
        public string Column2 { get; set; }
        public string Column3 { get; set; }
        public string Column4 { get; set; }
    }
}
```

![work.png](https://qiita-image-store.s3.amazonaws.com/0/32870/1fac525b-3540-73da-7a31-0f32243e2770.png)


自分が行いたいこととはまだ違う。
SingleSignOnについて

#はじめに

最近導入を検討しているSingle Sing Onについて調べたもの軽くまとめます。

```

一度のユーザ認証処理によって独立した複数のソフトウェアシステム上のリソースが利用可能になる特性である。

この特性によって、ユーザはシステムごとにユーザIDとパスワードの組を入力する必要がなくなる。

```
[引用元：Wilipedia](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%AB%E3%82%B5%E3%82%A4%E3%83%B3%E3%82%AA%E3%83%B3)

要は、１つの認証ステムの認証をクリアできれば、その認証情報を使い、許可されているすべてのサービスが利用可能になる仕組みの事。

![sso_01.jpg](https://qiita-image-store.s3.amazonaws.com/0/174392/30617c4f-1455-2529-7d10-8cb952032052.jpeg)


#シングルサインオン導入のメリット

**管理すべきログイン情報が１つで済む**

ログイン情報が複数存在する場合、ユーザはログイン情報を忘れないようにとメモを取ります。
よくあるのが、情報の書かれたメモや付箋を人目につく箇所に貼ってしまっている状態。情報漏洩のリスクが高まります。


**情報漏洩のリスクが低くなる**

認証が一度で済んでしまえば覚えるべき情報も少なくなり、メモや付箋に記録する必要無し。

**認証が一度で済むのでシステムごとの認証作業が不要になる**

多くのソフトウェアを使う業務の場合、それぞれの認証作業が不要になる事で工数の削減につながり、社員の生産性も向上。

**ID、PW忘れによる管理者側の管理負担も軽減**

管理のしやすさはもちろんのこと、セキュリティ対策としては今後の大きな課題になってくるログイン情報の管理。
SSOを導入し、一括集中管理を行うことができれば課題は一気に解決されますね。


#SSOの代表的な認証方式


1. エージェント方式
Webサーバにエージェントと言われるソフトウェアを組み込むことで認証を実現する方式。
※webアプリケーションのみに対応
![sso_03.jpg](https://qiita-image-store.s3.amazonaws.com/0/174392/744cc901-3966-c622-abc6-7e7dde5e2491.jpeg)

2. リバースプロキシ方式
WebブラウザとWebアプリケーションの間にリバースプロキシーサーバを設置し、そこに認証エージェントを導入することで認証を実現する。
※webアプリケーションのみに対応
![sso_04.jpg](https://qiita-image-store.s3.amazonaws.com/0/174392/9a8078a8-4d0a-3fd6-8545-25b2c23d61b1.jpeg)

3. フェデレーション方式
ユーザーの認証や属性、認可に関する情報を記述するマークアップ言語。異なるドメイン間でクッキーを利用せずに認証情報の伝達が可能。
クラウドサービスSSOも実現できる。
フェデレーション方式に使えるプロトコルは標準化が進められており、SAML(Security Assertion Markup Language)やOpenID Connecが使われている。

最近試しているSSOのシステムではSAMLが使われています。


#最近良く目にするソーシャルログイン。一般ユーザにも身近なSSO。

最近こういうログインページ良く見かけませんか？

![sso_02.png](https://qiita-image-store.s3.amazonaws.com/0/174392/920018d9-d651-9bc6-2bda-b609ed19eb68.png)

facebookのアカウントを持っていれば、そのアカウント情報を使ってログインできちゃう！
ボタンをポチっと押すだけでOK。面倒な入力作業を省くことができるので、便利ですよね。
これもSSOの一つです。

#おわりに

基本的にニーズが大きいのは企業向けなのかもしれませんが、案外一般ユーザにもニーズありそうだなと思っています。ソーシャルログインも普及してきていますし。
最近は個人でもネットを使って買い物、クレジットカードのWEB明細、SNS、その他アプリケーションやサイトを利用している方が多いですよね。
サイトごとに一つ一つID/PWを入れてっていう作業も面倒ですし、個人だとより管理が煩雑になりがち。
今後個人向けのSSOの簡単な仕組みがあれば便利だな。と思ったりしました。
Visual Studio Code で Go の開発環境を作る


はじめに
========

Visual Studio Code を使った Go 環境が快適だと聞いたので、自分の Mac Pro にインストールし、デバッグ環境構築までの備忘録です。中身は、[公式サイト](https://code.visualstudio.com/docs/languages/go)に書かれていることを順にやっているだけです。

環境
-----

### Mac のバージョン

![セットアップ環境.png](https://qiita-image-store.s3.amazonaws.com/0/29968/ac72fb6e-0f90-4dd6-97f0-48af4ec108eb.png "セットアップ環境.png")

### Go のバージョン

```bash
$ go version
$ go version go1.8 darwin/amd64
```


環境構築
===========

自動補完の設定
-------------------

**Code -> 基本設定 -> 設定** で setting.json を開くか、**⌘,** で setting.json を開きます。以下の設定を追加して保存します。

```setting.json
{
    "go.autocompleteUnimportedPackages": true
}
```

デバッグ環境の設定
-----------------

Homebrew を使っているのであれば、`brew install go-delve/delve/delve` でデバッグ環境が作れるようですが、僕の環境では、MacPorts を使っていたので、こちらの Manual install の手順で環境を作ります。

### toolchain のインストール

```bash
xcode-select --install
```

### 自己署名証明書の作成
1. キーチェーンを起動して、 **キーチェーンアクセス->証明書のアシスタント->証明書を作成...** を選択
2. 名前を好きなもので設定（例えば、dlv-cert）
3. 証明書のタイプは、 **コード署名** を選択
4. デフォルトを無効化にチェック
5. **生成** をクリックし、そのあと表示される確認ダイアログで **続ける** をクリック
6. 有効期間を **3650** に設定して、 **続ける** をクリック
7. **続ける** をクリック（これを証明書の場所を指定画面まで続けます）
8. キーチェーンで **システム** を選択し、 **作成** をクリック
9. キーチェーンで作成した自己署名証明書の情報ダイアログを表示
10. 信頼を展開して、この証明書を使用するときを **常に信頼** に変更

### devel のインストール

```bash
$ mkdir $GOPATH/src/github.com/derekparker
$ cd $GOPATH/src/github.com/derekparker
$ git clone https://github.com/derekparker/delve.git
$ cd delve
$ CERT=dlv-cert make install
```

### 確認

```
$ dlv --help
Delve is a source level debugger for Go programs.

Delve enables you to interact with your program by controlling the execution of the process,
evaluating variables, and providing information of thread / goroutine state, CPU register state and more.

The goal of this tool is to provide a simple yet powerful interface for debugging Go programs.

Pass flags to the program you are debugging using `--`, for example:

`dlv exec ./hello -- server --config conf/config.toml`

Usage:
  dlv [command]

Available Commands:
  attach      Attach to running process and begin debugging.
  connect     Connect to a headless debug server.
  debug       Compile and begin debugging main package in current directory, or the package specified.
  exec        Execute a precompiled binary, and begin a debug session.
  run         Deprecated command. Use 'debug' instead.
  test        Compile test binary and begin debugging program.
  trace       Compile and begin tracing program.
  version     Prints version.

Flags:
      --accept-multiclient[=false]: Allows a headless server to accept multiple client connections. Note that the server API is not reentrant and clients will have to coordinate.
      --api-version=1: Selects API version when headless.
      --build-flags="": Build flags, to be passed to the compiler.
      --headless[=false]: Run debug server only, in headless mode.
      --init="": Init file, executed by the terminal client.
  -l, --listen="localhost:0": Debugging server listen address.
      --log[=false]: Enable debugging server logging.
      --wd=".": Working directory for running the program.

Use "dlv [command] --help" for more information about a command.
```
SQL Severで日付フォーマットを変更


■unixtimeからdatetimeに
```sql
--UTC
dateadd(s,1490972400,'1970-01-01')
--JST(msがない場合）
dateadd(s,1490972400,'1970-01-01 9:00:00')
--JST(msまである場合１）
dateadd(s,cast(substring(cast(1508203163081 as varchar),1,10) as bigint),'1970-01-01 9:00:00')
--JST(msまである場合２。やっていることは1と同じでms以下の部分を切り捨てている）
dateadd(s,1508203163081/1000,'1970-01-01 9:00:00')
--上記で「expression をデータ型 int に変換中に、算術オーバーフロー エラーが発生しました。」みたいなエラーが発生する場合は、intの範囲を超えている行があるので、bigintか何かにCASTしてやればOK
dateadd(s,cast(1508203163081 as bigint)/1000,'1970-01-01 9:00:00')
```
■datetimeからunixtimeに
```sql
UNIX_TIMESTAMP('2017-04-01 00:00:00')
```



■datetimeからdateに
```sql
CONVERT(date, '2017-04-01 00:00:00')
```
Install Skype 5 to Debian Wheezy


|Playing with Debian Wheezy|URL|
|:--|:--|
|Atom|http://qiita.com/cielavenir/items/7835e3d110d7ad79c407|
|VSCode OSS|http://qiita.com/cielavenir/items/8eb3f57373bac0f10d6f|
|Skype|http://qiita.com/cielavenir/items/1b1d733e4ede8593040f|
|Meshlab 2016|http://qiita.com/cielavenir/items/5e02ce18d162e17c8859|

Skype 4 is now dead, but installing [Skype 5](https://go.skype.com/linux.deb) to Debian Wheezy is [a little bit difficult](https://wiki.debian.org/skype#A64_bits.2Famd64-2).

## Updating fontconfig

### apt-src and deb-src line
- (also devscripts, which contains debuild)
- `sudo apt-get install apt-src devscripts` 
- `sudo vim /etc/apt/source.list`
  - put: deb-src http://ftp.jaist.ac.jp/debian/ jessie main contrib non-free
  - never put "deb", which will break apt-get

### Build fontconfig source code
- `apt-src install fontconfig`
- `cd fontconfig`
- `debuild -uc -us`
- `cd ..`

### (Optionally) build libfontconfig1:i386
You need to build libfontconfig1:i386 if you want to keep wine stuff.

#### Make 32bit environment

- `sudo apt-get install binutils debootstrap`
- `sudo /usr/sbin/debootstrap --arch i386 wheezy /opt/wheezy32 http://httpredir.debian.org/debian`

#### Build

- `sudo chroot /opt/wheezy32`
- (add apt-line for contrib/non-free, and deb-src jessie)
- (snip)
- `apt-src install fontconfig`
- `debuild -uc -us`

### Finally...

- `sudo dpkg -i *.deb`

## Install libpango{,cairo}-1.0-0

- libpango1.0-0 package has the content of libpango-1.0 and libpangocairo-1.0.
- So we install fake package to satisfy dpkg.
- Use https://github.com/cielavenir/updatecontrol debgenerate.rb.
- `debgenerate libpango-1.0-0 1.30.0-1; debgenerate libpango-1.0-0 1.30.0-1`
- `sudo dpkg -i libpango*.deb`

## At last...

- `sudo dpkg -i skypeforlinux-64.deb`
- And you are done!

## 170605

- Unfortunately official skype.deb will not work anymore since it requires libc6 2.14.
- You will have to use https://www.dropbox.com/s/tj4wny7bpe6hvaa/skypeforlinux_5.2.0.1_amd64.deb .
Visual Studio > link > WPF > 黒いあれを消す > XAMLのUIデバッグツール

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

WPFでプロジェクトを作成してみた。

![work.png](https://qiita-image-store.s3.amazonaws.com/0/32870/9bb59e5a-4a17-8917-1b24-c7d66e760ecd.png)

黒いあれをどうにかしたい。

参考 https://rksoftware.wordpress.com/2016/04/02/01/

上記のリンクに消し方が掲載されていました。
情報感謝です。

「XAMLのUIデバッグツール」というもののようです。


デバッグ時には表示しておいて、通常使用時には.exeを実行すれば表示されないので、別に消さなくてもいいかもしれない。
Windows 10 Creators Update (Build 1703) の Microsoft Edge で Google サイトにアクセスできない

Windows 10 の最新アップデートである [Creators Update (Build 1703)](http://forest.watch.impress.co.jp/docs/serial/yajiuma/1053417.html) にアップデートすると、標準のブラウザである [Microsoft Edge](https://www.microsoft.com/ja-jp/windows/microsoft-edge) で Google 関連サイト（検索、Gmail 他）や YouTube、Facebook にアクセスできない場合があります。というか、私の場合は、99.9% できません。

症状は、問題のサイトを開こうとすると、ぐるぐるカーソルが回って、しばらくすると、「サイトに到達できません」のようなエラーが表示されます。エラーの詳細を見るとは、INET_E_RESOURCE_NOT_FOUND が表示されます。ネットで調べた結果、同じような症状で悩んでいる人はいるようだが少ない。アップデートが公開されてまだそんなに時間が経っていないからかもしれない。ただ、それを完全に解決できる方法はなかった。

しかし、ようやく、ちゃんと解決できる方法を載せた[ブログ](http://www.bearman.nl/2017/04/13/creators-update-2-microsoft-edge-google-inet_e_resource_not_found/)を見つけたのでここで紹介します。ブログには、いろいろ書いてありますが、本当の解決法は下のほうに書いてありました。それは [TCP Fast Open](http://www.windowscentral.com/enable-tcp-fast-open-microsoft-edge-faster-page-load-times) を無効にすることです。

TCP Fast Open を無効にする方法：

1. Microsoft Edge を起動します。
2. アドレスバーに `about:flags` を打ちます。
3. 下方向にスクロールして Enable TCP Fast Open のチェックを外します。
4. Microsoft Edge を再起動します。そのままブラウザを再起動しなくてもできると書いてあります。

それだけです。

この Creators Update は、いくつか新しい機能、変更されているものがあります。よくなったところも多々あるようですが、特に、この標準ブラウザになった Microsoft Edge では、まだ課題があるようです。上記の問題以外に、レイアウトが崩れるサイトもありました。

参考記事：[CREATORS UPDATE #2: MICROSOFT EDGE & GOOGLE – INET_E_RESOURCE_NOT_FOUND](http://www.bearman.nl/2017/04/13/creators-update-2-microsoft-edge-google-inet_e_resource_not_found/)
Visual Studio > Windows Forms Application / WPF: Windows Presentation Foundation > バグやXAMLの観点を考慮する

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

Windows上で動くソフトの試作としてWindows Forms Applicationを選択していた。
コンボボックスに選択型のリストを設定しようとしていると、XAMLファイルを書き換える例を見つけた。Windows Forms ApplicationにはXAMLはないようだが、XAMLを使う方法は以下に見つかった。
http://stackoverflow.com/questions/16482288/c-sharp-windows-forms-and-xaml

XAMLを使うのは、WPF: Windows Presentation Foundation の方のようだ。
Windows Forms Application、WPFのどちらを使うことになるかは未定。

バグについて注意書きしている人がいる。
http://var.blog.jp/archives/61721571.html
PowerShellで接続されているLANの情報を調べる

普段所属しているサークルの部室で作業をしていると，時々サークルのWifiから大学が提供するWifi(遅い)に勝手に切り替わってしまうことがある．
Windows10の標準ではタスクバーの「インターネットアクセス」のアイコンにカーソルを合わせなければ，現在接続中のSSIDを表示できない．
これが不便に感じたので，PowerShellでLANの情報を取得するスクリプトを作成した．

# 作成したスクリプト
```ps1
$code=(chcp).split(":")[1].trim()
chcp 65001 | out-null
$STATE=7
$SSID=8
$SIGNAL=18
$result=netsh wlan show interfaces
if ( $result[$STATE].split(":")[1].trim() -eq "connected"){
	echo ($result[$SSID].split(":")[1].trim()+":"+$result[$SIGNAL].split(":")[1].trim())
}else{
	echo "LAN disconnected"
}
chcp $code | out-null
```

## 説明とか
```ps1
$result=netsh wlan show interfaces
```
で現在接続中のLANの情報が取得できる


### 実行例1(接続されている場合)
    >$result=netsh wlan show interfaces
    There is 1 interface on the system:

        Name                   : Wi-Fi
        Description            : ***
        GUID                   : ***
        Physical address       : ***
        State                  : connected
        SSID                   : ***
        BSSID                  : ***
        Network type           : Infrastructure
        Radio type             : 802.11n
        Authentication         : WPA2-Personal
        Cipher                 : CCMP
        Connection mode        : Profile
        Channel                : ***
        Receive rate (Mbps)    : 43.3
        Transmit rate (Mbps)   : 43.3
        Signal                 : 99%
        Profile                : ***

        Hosted network status  : Not available

### 実行例2(接続されていない場合)
    >$result=netsh wlan show interfaces
    There is 1 interface on the system:

        Name                   : Wi-Fi
        Description            : ***
        GUID                   : ***
        Physical address       : ***
        State                  : disconnected
        Radio status           : Hardware On
                                 Software On

        Hosted network status  : Not available

Stateがdisconnectなら接続されていない

```ps1
echo ($result[$SSID].split(":")[1].trim()+":"+$result[$SIGNAL].split(":")[1].trim())
```
で必要な情報(この場合はSSIDと電波強度)を表示する．必要に応じて適当に変えればよいと思う
少しスクロールしたら出てきて、特定の箇所までスクロールするとその場所で留まる上へ戻るボタン

そもそも上へ戻るボタンの必要性について懐疑的ですが、こういうデザインをよくもらうので書いてみました。

# サンプル
[上へ戻るボタンサンプル](http://code.flugel.biz/pagetop/)

# HTML

```html:index.html
<footer>
	<a id="btn_pagetop" href="javascript:void(0);">^</a>
	<p>フッタ</p>
</footer>
```

# Sass

ここの #btn_pagetop の素は留まっている状態、.hide が付くとボタンが隠れている状態、.fixed が付くと固定されている状態、それぞれの位置を指定します。

```sass:pagetop.sass
footer
	position: relative
#btn_pagetop
	width: 60px
	height: 60px
	margin-bottom: 20px
	display: block
	position: absolute
	top: 0
	bottom: auto
	right: 20px
	z-index: 1

	&.hide, &.fixed
		top: auto
		bottom: 0
		+transition-property(transform)
		+transition-duration(.3s)
		+transition-delay(0s)
		+transition-timing-function(ease)
	&.hide
		position: fixed
		+transform(translateY(150px))
	&.fixed
		position: fixed
```

# CoffeeScript

bottom に留めたい場所を指定します。今回はフッタの高さ - ボタンの高さ - ボタンの margin-bottom としています。
body の高さ - スクロール位置 - ウィンドウの高さが、留めたい場所よりも少ない場合に .hide.fixed を解き放って素の状態とし、スクロール位置がウィンドウの高さ / 2 を超えた場合に .fixed を付けて固定し、それ以外は .hide を付けて隠します。


```coffeescript:pagetop.coffee
pagetop =
	init: ->
		@$window = $(window)
		@$document = $(document)
		@$body = $('body')
		@$btn = $('#btn_pagetop')
		@bottom = $('footer').innerHeight() - @$btn.innerHeight() - parseInt(@$btn.css('margin-bottom'))
		@$btn.on 'click', ->
			$('html, body').animate({scrollTop: 0}, 1000)
			return
		@$window.scroll ->
			pagetop.fire()
			return
		@fire()
		return

	fire: ->
		scroll = @$document.scrollTop()
		window_height = @$window.innerHeight()
		if @$body.innerHeight() - scroll - window_height < @bottom
			@$btn.removeClass('hide fixed')
		else if scroll > window_height / 2
			@$btn.removeClass('hide').addClass('fixed')
		else
			@$btn.removeClass('fixed').addClass('hide')
		return
$ ->
	pagetop.init()
	return
```

生成された JavaScript も置いておきます。

```js:pagetop.js
(function() {
  var pagetop;

  pagetop = {
    init: function() {
      this.$window = $(window);
      this.$document = $(document);
      this.$body = $('body');
      this.$btn = $('#btn_pagetop');
      this.bottom = $('footer').innerHeight() - this.$btn.innerHeight() - parseInt(this.$btn.css('margin-bottom'));
      this.$btn.on('click', function() {
        $('html, body').animate({
          scrollTop: 0
        }, 1000);
      });
      this.$window.scroll(function() {
        pagetop.fire();
      });
      pagetop.fire();
    },
    fire: function() {
      var scroll, window_height;
      scroll = this.$document.scrollTop();
      window_height = this.$window.innerHeight();
      if (this.$body.innerHeight() - scroll - window_height < this.bottom) {
        this.$btn.removeClass('hide fixed');
      } else if (scroll > window_height / 2) {
        this.$btn.removeClass('hide').addClass('fixed');
      } else {
        this.$btn.removeClass('fixed').addClass('hide');
      }
    }
  };

  $(function() {
    pagetop.init();
  });

}).call(this);
```
Nginx + ASP.NET CoreでクライアントのIPアドレスを取得する

ASP.NET CoreでWebアプリを作りました。
Linuxサーバ（Debian 8.6）にNginxを入れて、リバースプロキシの設定を行い、デプロイして、動きました。
でも、クライアントのIPアドレス（REMOTE_ADDR）が127.0.0.1になっています・・・
そんなときの解決法。

* .NETCoreApp 1.1
* Debian 8.6
* Nginx 1.6.2

***

#アプリ側の設定
##Configureに追記
[公式ドキュメント](https://docs.microsoft.com/en-us/aspnet/core/publishing/linuxproduction)の通り、Startup.cs の Configure メソッド内に下記を追記します。
app.UseMvcの記述よりも先に書きます。

```csharp:Startup.cs
// クライアントのIPアドレスを取得するため、NginxのProxyヘッダを使う設定
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
    ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});
```
##クライアントIPアドレスの表示
HttpContextの、Connectionプロパティから取得できます。
テストのため、アクションメソッドでViewDataにセットして、Viewに表示します。

```csharp
public class HomeController : Controller
{
    public IActionResult Index()
    {
        ViewData["RemoteAddress"] = HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString();

        return View();
    }
}
```

#Nginxの設定
##HttpRealModule設定ファイルの作成
バックエンド側のサーバ（Kestrel）で、X-Forwarded-For の値をクライアントのIPアドレスとして使用するようするため、HttpRealModuleを使います。

```shell-session:
# vi /etc/nginx/conf.d/realip.conf
```

```shell-session:/etc/nginx/conf.d/realip.conf
set_real_ip_from   127.0.0.1;
set_real_ip_from   ::1;
real_ip_header     X-Forwarded-For;
real_ip_recursive  on;
```

このファイルは、/etc/nginx/nginx.conf から自動的に読み込まれます。


##サイトファイルの編集
ASP.NETサイト用にファイル（dotnetapp）を作ります。
Debian の Nginxパッケージには、proxy_paramsファイルが既に用意されているので、それをincludeします。

```shell-session:/etc/nginx/sites-available/dotnetapp
server {
        listen 80;
        location / {
                proxy_pass http://localhost:5000;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection keep-alive;
                proxy_cache_bypass $http_upgrade;

                include /etc/nginx/proxy_params;     # 追記します
        }
}
```

"proxy_xxx"の設定は、[公式ドキュメント](https://docs.microsoft.com/en-us/aspnet/core/publishing/linuxproduction)の通りに記述しています。
ちなみに、/etc/nginx/proxy_params ファイルの内容は、下記のようになっていました。

```shell-session:/etc/nginx/proxy_params
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
```

作成したサイトを有効にします。

```shell-session
# rm /etc/nginx/sites-enabled/default
# ln -s /etc/nginx/sites-available/dotnetapp /etc/nginx/sites-enabled/

# systemctl restart nginx.service
```



これでめでたく、クライアントのIPアドレスがアプリから取得できるようになりました。

#参考ページ
* [Set up a hosting environment for ASP.NET Core on Linux with Nginx, and deploy to it](https://docs.microsoft.com/en-us/aspnet/core/publishing/linuxproduction)
* [nginx でリバースプロキシするときの Tips](http://blog.akagi.jp/archives/3883.html)
* [[stack overflow] nginx server sees its own ip instead of reverse proxy ip](http://stackoverflow.com/questions/33557894/nginx-server-sees-its-own-ip-instead-of-reverse-proxy-ip)