OmniAICreator/Qiita-1.07M huggingface dataset:
Amazon BIサービスQuickSightを触ってみました!

# はじめに

　QuickSightは昨年度re:Invent2015に発表され、当時はまだプレビュー版でしたが、つい一般公開になりました。
　
　QuickSightについては、AWSからの記載内容を引用させていただきます。
>Amazon QuickSight は非常に高速なクラウド対応のビジネスインテリジェンス (BI) サービスで、すべての従業員が可視化の構築、アドホック分析の実行およびデータからビジネスインサイトを迅速に得ることを容易にします。


　２〜３ヶ月前に、[D3.js](https://d3js.org/)というライブラリーを使って、何とかデータを可視化しようとしていましたが、いろいろあって、未だにできていません。
　せっかくQuickSight（ **SPICE**というエンジンを利用）がGAになりましたので、超ざっくりで触ってみました。

# とりあえず、触ってみる

1. サービスタプからQuickSightをクリック (最近マネコんのUIも結構変わりましたね)
<img width="1572" alt="1.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/117156/e718d31e-5cf7-d5df-78e5-930b7992a74b.jpeg">

1. 最初はこんな画面ですね、さっそくSign upしよう
<img width="683" alt="スクリーンショット 0028-11-17 0.12.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/117156/4ace7eec-d7c2-4173-aa81-4801f9e002ee.png">

1. Regionですが、まだVirgia,Oregon,Irelandしか選択できないので、Tokyoはまだですね
<img width="731" alt="スクリーンショット 0028-11-17 0.13.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/117156/0b983150-c1fa-3dc0-393f-1ec88355c06d.png">

1. ユーザ作成できましたら、「Next」
<img width="1258" alt="WechatIMG2.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/117156/0f6a0bec-4b92-1d13-cb53-b9dd82f6c275.jpeg">

1. さっそく分析してみましょう
<img width="1632" alt="WechatIMG3.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/117156/64fdd0dc-0b78-61f4-683e-9ac8dbec9725.jpeg">

1. 分析に使うデータを選択します。
<img width="1560" alt="WechatIMG4.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/117156/cd17c323-c69e-02f1-2a59-12729ca26380.jpeg">

1. S3、RDS、Redshiftなど、色々ありますね。今回は自前のデータを利用します。
<img width="1810" alt="WechatIMG5.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/117156/2e67a7fd-e445-cb7f-06cb-ddde655712d4.jpeg">

1. 使うデータですが、今回は超適当なものにします。
<img width="566" alt="WechatIMG6.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/117156/fb0a0a95-53ed-9e28-b038-88f4eba5c936.jpeg">

1. スキャン中
<img width="1664" alt="WechatIMG7.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/117156/946dff1d-5bb3-c0e2-e1a8-654c2699fe25.jpeg">

1. スキャンがおわったら、対象となるシートを選択します。
<img width="1728" alt="WechatIMG8.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/117156/22b9632c-9074-8f86-9c1f-bb0b831b2735.jpeg">

1. さきほどお見せした超雑なデータですね。このステップから編集もできますが、今回はとりあえず何も手を加えずに、そのまま「Next」をクリックします。
<img width="1720" alt="WechatIMG9.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/117156/19fa9c50-d992-cf89-bf0b-ca13f8fff4f7.jpeg">

1. こんな画面が表示されます。
<img width="1790" alt="WechatIMG11.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/117156/b9070e2e-8929-7fc2-2768-a5e2df87c240.jpeg">

1. 左下の「Visual types」から「Line chat」を選択して、ドラッグ・アンド・ドロップで、X軸がAccountID、Y軸がbiilingにすると、いい感じに表示してくれますね。
<img width="1794" alt="WechatIMG12.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/117156/6a59878e-e216-03ca-d9ac-d86d7c552b3c.jpeg">
もう一枚
<img width="1364" alt="スクリーンショット 0028-11-17 0.41.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/117156/2c84f838-104f-1d7f-ff12-a25d6819f423.png">

1. とりあえずここまでにします。

# 最後

　QuickSightについて、本当に超ざっくり触ってみました。データが適当かつ簡単過ぎてあまり参考になりませんが、皆さんも是非触ってみてください。なかなか便利なサービスだと思います。
　次回は自分もちゃんとしたデータを使って可視化してみようと思っています。
Pandocを使ってMarkdownを整形されたHTMLに変換する

Markdownはとても便利ですが、専用のビューアーで表示しないと中々見づらいので、リテラシーが低めの方にドキュメントを共有する際にはHTMLの方が都合が良い場合があります。
そこで、コマンドラインから簡単にMarkdownからHTMLに変換できるツールのPandocを使ってみました。

# Pandocとは

Markdownなどのドキュメントファイルを別のフォーマットに変換できるツール。
Markdown以外にも色々なフォーマットのファイルを変換できる。詳細は後述のドキュメントを参照。

# ドキュメント

- [Pandoc公式サイト](http://pandoc.org/installing.html)
- [Pandocユーザーズガイド日本語版](http://sky-y.github.io/site-pandoc-jp/users-guide/)

# インストール

[Pandoc公式サイト](https://github.com/jgm/pandoc/releases/tag/1.18)からインストーラーを入手して実行。

インストール後に以下を実行してインストールされているかを確認。

```bash
$ pandoc --version
```

# MarkdownからHTMLに変換してみる

以下を実行するとMarkdownをHTMLに変換した文字列が標準出力される。

```bash
$ pandoc -f markdown -t html ".mdファイルのパス"
# 例: pandoc -f markdown -t html ./README.md
```

実際にHTMLファイルとして出力する場合は以下のように実行。

```bash
$ pandoc -f markdown -t html ".mdファイルのパス" > "出力先のパス"
# 例: pandoc -f markdown -t html ./README.md > ./README.html
```

これでHTMLファイルに変換されますが、スタイルがあまり整っていないのがちょっと残念。

# 出力したHTMLのスタイルを整形する

もし、変換後のHTMLファイルを整えたい場合は、CSSファイルを既存のテンプレートに適用する方法と、新たにテンプレートを作成する事で対応可能。
CSSを適用する場合は、以下のように`-c`オプションでCSSを指定するだけでOK。

```bash
$ pandoc -f markdown -t html -c ./example.css ./README.md > ./README.html
```

# テンプレートをカスタマイズする

## 事前準備

まずは事前準備としてユーザーディレクトリに.pandocディレクトリを作成。
ユーザーディレクトリが不明の場合は`pandoc --version`を実行すると"Default user data directory: "という部分にパスが表示されるのでそれを参照。

```bash
$ mkdir -p ~/.pandoc/templates
$ cd ~/.pandoc/templates
```

## テンプレート生成

```bash
$ pandoc -D html5 > mytemplate.html
```

このmytemplate.htmlを好きな形に編集する。

## テンプレートを適用

以下のように`--template`オプションでテンプレート用htmlファイルを指定する。

```bash
$ pandoc -f markdown -t html --template=mytemplate ./README.md > ./README.html
```

因みにGithubのスタイルをベースにしたPandoc用のテンプレート[md2html-template-for-pandoc](https://github.com/masaki-ohsumi/md2html-template-for-pandoc/blob/master/md2html.html)を作ったので、良かったらご利用ください。
※僕の場合はCSSファイルの依存を無くしたかったので、HTMLに直接styleを埋め込んでいます。
Qiita 見出し欄の表示に対する改善要望 (11/29改善済)

# Font-Awesome使用時の記事内見出し欄の表示改善要望

現在、Qiitaでは記事内にFont-Awesomeを使用する事ができます。
これを利用して記事のタイトルにアイコンを付け、見栄えを良くする事も可能です。(詳細は下記記事をご覧ください)
[Qiita の記事の見出しに Font-Awesome を利用して見栄えを良くする](http://qiita.com/tbpgr/items/361d8aaa38fb57d75216)

## <i class="fa fa-thumbs-o-down" aria-hidden="true"></i> 現状の問題点
しかしながら、昨今のQiitaのアップデートにより、見出し欄の表示方法が下記の画像のように変わってしまいました。
![名称未設定.png](https://qiita-image-store.s3.amazonaws.com/0/48027/a567b5b9-e07d-8c8f-b2d2-50b09774673f.png)

アイコン付いて綺麗になってもこれじゃ...
早急な改善をよろしくお願い致します。

一方で、以前はhtmlタグ(h2,h3等)によって作成された見出しが見出し欄に表示されていましたが、今回のアップデートによって非表示になっていました。ありがとうございます👍

(そもそもとして、Qiitaでは記事内でのFont-Awesomeの使用は非推奨であったりするのでしょうか...)

## <i class="fa fa-thumbs-o-up" aria-hidden="true"></i> 追記(11月30日)
11月29日21時45分時点で修正が確認されました。
運営担当者様、お忙しい中対応ありがとうございます！
(以前って見出し欄にアイコンは付いてなかったですよね...？ オシャレになってて感動！)
Win10 安物ノートPC用にデフォルトキーモードVBSを登録する

[NumLock キーがオンとオフのどちらになっているかを確認する方法はありますか](http://qiita.com/Q11Q/items/8c7c35b5b1ff59175fcd)
先日こうした記事を投稿いたしましたが、Windows10にはさらに面白い機能があることがわかりました。
まずスクリプトを入れるフォルダーを決めます。まあこれは決めなくてもいいのですが。スクリプトが散らかってもしょうがありません。
たとえばサクラエディタのスクリプトフォルダを開いてもいいです。
C:\Users\Name\AppData\Roaming\sakura
Nameはもちろん皆様の名前に書き換えてください。
そしてスタート+Rキーを押して出てきた空欄にペーストしてエンターを押します。
適当なvbsファイルをタスクバーまで引っ張ります。
これで次からこのアイコンを右クリックすると、vbscriptがリスト化されて選択できます。
特にNUMLOCK系をピン止めしましょう。
これで気になる時はタスクバーのアイコンを右クリックでNumlockをオンにします。
ついでだからこの前のやつをNumLockON+CapsLockOffにしましょう

```basic:DefaultMode.vbs
Set objWord = CreateObject("Word.Application")
Set objShell = Wscript.CreateObject("WScript.Shell")
'msgbox "CapsLock key is on: " & objWord.NumLock
if objWord.Numlock = False then objShell.SendKeys "{NUMLOCK}"
if objWord.CapsLock = True then objShell.SendKeys "{CAPSLOCK}"
objWord.Quit
set objShell = Nothing
set objword = Nothing
```
ついでにVBAも。これはOutlookなどでVBAに登録し、クィックアクセスツールバーにマクロとして登録すると使えます。こちらはそれなりに音が鳴ります。

```basic:DefaultMode.vb...
Sub DefaultKeyMode()
Dim objWord : Set objWord = CreateObject("Word.Application")
Dim objShell : Set objShell = CreateObject("WScript.Shell")
'msgbox "CapsLock key is on: " & objWord.NumLock
if objWord.Numlock = False then objShell.SendKeys "{NUMLOCK}"
if objWord.CapsLock = True then objShell.SendKeys "{CAPSLOCK}"
objWord.Quit
Beep
set objShell = Nothing
set objword = Nothing
End Sub
```
余談：Windows10ではVbscriptで音を鳴らす方法は効かない
[http://pnpk.net/cms/?p=2315](http://pnpk.net/cms/?p=2315)
beep = chr(007)
WshShell.Run "cmd /c @echo " & beep, 0
にしてもなりませんでした
またWindows10のサウンドフォルダはころころ変わる模様
C:\Windows\WinSxS\amd64_microsoft-windows-shell-sounds_31bf3856ad364e35_10.0.10240.16384_none_1f12ede15036e1cb
下記リンクに挙げられているディレクトリが上記のやつで、とてもこの方法は使えそうにない。
[Windows 10 のアラーム&クロックのサウンドの保存場所のパスを教えてください。](http://answers.microsoft.com/ja-jp/windows/forum/apps_windows_10-winapps/windows-10/bdc73caa-9633-42a1-b504-5bb56e892cb4)
標準入力を都度取得する方法

Scannerクラスを使うことで標準入力を取得することができます。

Scannerクラスのメソッドを紹介します。

入力された値の認識する範囲を識別するメソッド

　　next：入力された値を”空白”までの範囲で認識
　　nextLine：入力された値を”改行”までの範囲で認識

例

　　Scanner sc = new Scanner(System.in);
　　①String a = sc.next("test test");
　　②String b = sc.nextLine("test test");

例の結果ですが、
nextの場合は空白までの値が認識されるためaには”test”が代入されることになります。
nextLineは空白も文字列として認識されるためbには”test　test”が代入されます。

ちなみに型指定して読み込むことが可能です。
　　　nextInt:入力値をint型で読み込む
　　　nextDouble:入力値をDouble型で読み込む
Swift3で標準マップを開く(URLスキーム)

#実現したいこと
URLスキームで標準のマップアプリを開いて指定した、緯度経度への経路案内を行いたい。

#開発環境
Xcode8.1
Swift3

#実装方法
```swift:
let latitude:String = "指定緯度"
let longitude:String = "指定経度"
let daddr = latitude + "," + longitude
let urlString = "http://maps.apple.com/?daddr=\(daddr)&dirflg=d"
let encodedUrl = urlString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
let url = NSURL(string: encodedUrl!)!
UIApplication.shared.openURL(url as URL)
```
`daddr`に行きたい場所の緯度と経度を渡して、`dirflg`に探索方法(車：dまたはdirflgなし,(デフォルト)電車：dirflg=r 徒歩:dirflg=w)を渡し、URLスキームでマップアプリで開く。

##参照
https://developer.apple.com/library/content/featuredarticles/iPhoneURLScheme_Reference/MapLinks/MapLinks.html
Tips: Redmine Wiki output PDF without link

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">Redmine の Wiki を PDF 出力するときに Wikiリンクとマクロを無効化して出力したい。単体の PDF ではこれらは有効ではないため。</p>&mdash; ykws (@ykawashi7) <a href="https://twitter.com/ykawashi7/status/798894413711687680">November 16, 2016</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

Plugin を探そうかと思ったけど、 Bookmarket を利用して良い感じに出力している人がいて
http://hacknote.jp/archives/10621/

でも、リンクが有効のままだったので、少し改良して期待する出力結果が得られた。

~~~ javascript:redmine_wiki_output_pdf_without_link.js
javascript:(function(){$("#header").remove();$("#top-menu").remove();$(".contextual").remove();$(".breadcrumb").remove();$("#wiki_add_attachment").remove();$(".other-formats").remove();$("#footer").remove();$("#sidebar").remove();$(".attachments").remove();$("#content").width("100%");$(".wiki-anchor").remove();$("a").each(function(){child=this.childNodes;$(this).replaceWith(child);});})();
~~~
KituraでHello Worldを表示させる

## はじめに

久しぶりにSwift関係の記事を書くような気がします。
今回はIBM製のSwiftサーバサイドの **Kitura** で `Hello world` を表示させてみます。

## 環境

- Xcode8.1 (必須)
- **えるたそ** (OS X El Capitan 10.11.6)
- Swift 3.0.1

一応、Swiftのバージョン

```bash
$ swift --version
Apple Swift version 3.0.1 (swiftlang-800.0.58.6 clang-800.0.42.1)
Target: x86_64-apple-macosx10.9
```

## 注意事項

また、 `Xcode7系` など古いバージョンと共存していて、 `Xcode8.1` を別ファイル名で `Applicationフォルダ` に配置している場合はコンパイラが見つからないとかいろいろ怒られますので黙って、古い方を別名にして `Xcode8.1` を `Xcode` という名前にしましょう！
私は、 __Xcode7.3.1__ を __Xcode__ と設定し __Xcode8.1__ を別名で配置していたため激おこぷんぷん丸されました。

## 準備

```bash
$ mkdir myFirstProject
$ cd myFirstProject
$ swift package init --type executable
```

```
myFirstProject
├── Package.swift
├── Sources
│   └── main.swift
└── Tests
```

こんな感じにファイルが生成される。

## パッケージ追加

```swift:Package.swift
import PackageDescription

let package = Package(
    name: "myFirstProject",
    dependencies: [
        .Package(url: "https://github.com/IBM-Swift/Kitura.git", majorVersion: 1, minor: 1)
    ]
)
```

`IBM-Swift/Kitura` のPackage.swiftから連鎖していろいろとパッケージが同梱されているらしい

## 実装

```swift:Sources/main.swift
import Kitura

let router = Router()

router.get("/") {
    request, response, next in
    response.send("Hello, World!")
    next()
}

Kitura.addHTTPServer(onPort: 8090, with: router)

Kitura.run()
```

ルーティング自体は `route` にアクセスしたら `Hello, World!` を表示するといったとても馴染みのあるものがでましたね。

### コンパイル

Xcode上で実行したら `Build & Run` なのでやる必要がないのですが今回はVimを使ったのでターミナルバンバンコンパイルが必要になりました。

```bash
$ swift build
・・・
Compile CHTTPParser http_parser.c
Compile CHTTPParser utils.c
Compile Swift Module 'KituraTemplateEngine' (1 sources)
Compile Swift Module 'SwiftyJSON' (2 sources)
Compile Swift Module 'Socket' (3 sources)
Compile Swift Module 'LoggerAPI' (1 sources)
Linking CHTTPParser
Compile Swift Module 'SSLService' (1 sources)
Compile Swift Module 'KituraNet' (33 sources)
Compile Swift Module 'Kitura' (40 sources)
Compile Swift Module 'myFirstProject' (1 sources)
Linking ./.build/debug/myFirstProject
```

というような感じでコンパイルが終わりました。

### 実行

```bash
$ ./.build/debug/myFirstProject
```

上記コマンドでサーバが起動できます。デバッグモードですが...

http://127.0.0.1:8090/

にアクセスすると？？

![スクリーンショット 2016-11-16 午後11.42.31.png](https://qiita-image-store.s3.amazonaws.com/0/97280/4f44cab6-b00c-ad81-6191-f3d188d3fe85.png "スクリーンショット 2016-11-16 午後11.42.31.png")

ありがとうございます！ありがとうございます！

### パラメータ付き

先程のmain.swiftに以下を追加しました。

```swift:Sources/main.swift
・・・
router.get("/:name") {
    request, response, next in
    let name = request.parameters["name"] ?? ""
    try response.send("Hello, \(name)").end()
}
・・・
```

![スクリーンショット 2016-11-17 午前0.10.12.png](https://qiita-image-store.s3.amazonaws.com/0/97280/ea1a6116-045e-10c5-bb21-8ef9b17e5136.png "スクリーンショット 2016-11-17 午前0.10.12.png")

__Hello, nnsnodnb__

## 最後に

KituraはFastCGIに対応していて、SSL/TLSなど盛りだくさん機能が実装されているので、
自分の趣味で作るサーバサイド言語も全部Swiftで書ける未来が見えますね。


## 公式参考サイト(パクリ)

http://www.kitura.io/en/starter/gettingstarted.html

## こちらもご覧ください！

[KituraをDockerで動かしてみた。](http://qiita.com/KentaKudo/items/a84531c4ea32a90fd58f)
[!] The `master` repo requires CocoaPods 1.0.0 をバージョンを上げずに回避する

# [!] The `master` repo requires CocoaPods 1.0.0 をバージョンを上げずに回避する


```
Analyzing dependencies
[!] The `master` repo requires CocoaPods 1.0.0 -  (currently using 0.35.0)
Update CocoaPods, or checkout the appropriate tag in the repo.
```

2016.11.12にCocoaPodsのmaster repoが1.0.0以上しかサポートしなくなった.
現在のサポートしているバージョンは[ここ](https://github.com/CocoaPods/Specs/blob/master/CocoaPods-version.yml#L2)に記載がある.

CocoaPodsを今すぐに1.X系にあげることができない場合は以下の設定をすると回避することができる.
(そして1.X系に対応するようにしましょう)

```bash:Podfile
# CocoaPods/Spec.gitはコメントアウトする

source 'https://github.com/CocoaPods/Old-Specs.git'
```

あとは`pod install`するだけです

```bash
Analyzing dependencies

CocoaPods 1.2.0.beta.1 is available.
To update use: `sudo gem install cocoapods --pre`
[!] This is a test version we'd love you to try.

For more information see http://blog.cocoapods.org
and the CHANGELOG for this version http://git.io/BaH8pQ.

Downloading dependencies
Installing OCMock (3.3.1)
Generating Pods project
Integrating client project
```

いつものやつが返ってきました. あとは適当なタイミングで1.X系にあげることを忘れずに.
Qiitaの記事の中で「Markdownでどうやって表現してるんだろう？」と思った時に直接Markdownを調べる方法

**2016年12月9日追記**

記事のMarkdownが標準で見れるようになったみたいです。
[Qiita記事をマークダウンで見ることができるようになってました]
(http://qiita.com/shiozaki/items/8419c06fee8ef5471e3f)

ですので、これから以下で説明する内容は一世代前の内容になります。

**2016年12月9日追記(ここまで)**

たまにQiitaの記事をみていると「この記事のこの部分ってMarkdownでどうやって表現しているんだろう」と思うことがMarkdownに慣れていないころはよくあると思います。

自分も、「ファイル名付きのgitのdiffみたいな表現」をMarkdownで書きたいなと思って調べている時に、まさにそのような表現が含まれている記事をQiitaで見つけました。(下みたいな表現です。)

```diff:test.txt
hoge
-fuga
+piyo
```

今回は、Qiitaの記事のMarkdownを直接見る方法です。
方法はとても簡単で、
**記事のURLの最後に`.md`を追加するだけです。**
例えば、この記事のURLは`http://qiita.com/nishina555/items/cadc3592bca4660fe4b3`なので、これに`.md`を追加して`http://qiita.com/nishina555/items/cadc3592bca4660fe4b3.md`とすると、この記事がMarkdownでどのように表現されているか分かります。Markdownによるgitのdiffの表現方法が知りたい方は確認してみてください。

もし、Qiitaの記事内で｢Markdownでどうやって書くんだろう｣と思ったら是非使ってみてください。

**2016年11月21日追記**

grasemonkeyを利用することで、ドロップダウンの項目からMarkdownを表示できるように拡張できるスクリプトが以下の記事で紹介されています。
[「Markdownを表示する」ボタンを追加するユーザースクリプト 新レイアウト版](http://qiita.com/khsk/items/4752f80bde7b634f0b00)
ubuntu 16.04 TLSのインストールメモ


ubuntu 10.04 -> 16.04 にupdateした手順をまとめる

## ubuntu 16.04 のインストール

 [16.04 TLS 64bit 日本語remix](https://www.ubuntulinux.jp/download/ja-remix) CD経由でclean install
( Ubuntu 16.04 LTS - 2021年4月までサポート)

 **install 後 grubが立ち上がらず.**   (grub rescueの修復)
lsとかでpartationは確認できる．

```shell-session
  grub rescue> ls
  (hd0),(hd0,msdos1),(hd0,msdos5),..
  grub rescue> ls (hd0,msdos1)/boot/
  ``` 

  古いPCでUEFI非対応なのにUbuntuのinstallerがUEFIブート書き込んで死んだっぽい？
  下記手順で修復 ([参考](http://ameblo.jp/ninjin-drink/entry-12155486170.html))
    1.  install CDを使ってubuntuを立ち上げる
    2.  grubを再インストール

  ```shell-session
  $ sudo grub-install /dev/sdb
  $ sudo update-grub
  ```

##  [フォルダ名を日本語から英語に変更](http://qiita.com/taiko19xx/items/d1a001bfc25245b91354)

  ```shell-session
  $ LANG=C xdg-user-dirs-gtk-update
  ```

## DesktopをLXDEに変更 

  ```shell-session
$ sudo apt-get install lxde
$ sudo apt-get install lxsession-logout
```

[お気に入りの壁紙](http://i.imgur.com/BW0VK.jpg) / ( [参考](http://www.ubuntu.se/threads/15805-Ubuntu-11-04-adds-17-brand-new-wallpapers?s=95a351be5d3ba5eabd330cc1f7af472f))

## ログインマネージャ(LightDM)でユーザリスト表示を禁止

[LightDMの設定](https://wiki.ubuntu.com/LightDM#Show_Manual_Login_Box) に沿って，設定ファイルを作成.   (/etc/lightdm/users.conf は使用できない)

  ```shell-session:/etc/lightdm/lightdm.conf.d/50-myconfig.conf
[SeatDefaults]
allow-guest=false         # gust loginを許さない
greeter-hide-users=true   # user listを出さない
```

  ```shell-session
$ sudo service lightdm restart
```
Contributionの式 > v1.1 > 総和の書き方修正 / minのくくり方修正

参考 http://qiita.com/cawa/items/411d1b6a9bcb35315ffd
参考 http://qiita.com/iida-hayato/items/f756d1d1dc75ed17c46b

### v1.1

```math
C(x) = \sum_{n=1}^{N(x)}L_n + min(0.1 \sum_{m=1}^{E(x)}T_m(x), 10) + w \sum_{l=1}^{Cm(x)}L_l
```

参考: 工学における特殊関数 by 時弘哲治さん

もう少し検討は必要かも。

- Tm(x)はE(x)個の総和なのか?
  - Tm(x)を別の総和とったものの、E(x)個の総和なのか?
  - その場合は、元のmin()のくくり方の中にさらに総和が付く?

### v1.2

minの取り方は、オリジナルが正しいような気がした。

```math
C(x) = \sum_{n=1}^{N(x)}L_n + \sum_{m=1}^{E(x)}min(0.1 T_m(x), 10) + w \sum_{l=1}^{Cm(x)}L_l
```

`Tm(x)`だけ引数xを明示するのはまだ違和感がある。`Ln`と`Ll`の方も`Ln(x)`,`Ll(x)`のようにするか、`Tm(x)`を`Tm`として全て引数xを省略した形にするか、どちらかがいいかもしれない。
f-divergence一族の可視化

f-GANを読んでたら，f-divergenceというものが．

## 定義

$D_{f}(P\parallel Q)\equiv \int _{{\Omega }}f\left({\frac  {dP}{dQ}}\right)\,dQ.$


二つの確率分布を比べる
fが特殊な時に名前が付いている．代表的なのは下の表にある


KL divergenceとかJS divergenceだけじゃないのかーと思い，まとめ

![スクリーンショット 2016-11-16 13.22.02.png](https://qiita-image-store.s3.amazonaws.com/0/146563/2b586ac5-423a-57eb-f241-53ffc86db396.png "スクリーンショット 2016-11-16 13.22.02.png")


## 積分内の値の動き
- 例えばkLなら，$f(x) = p(x)\log{\frac{p(x)}{q(x)}}$をプロット
- $p$と$q$は正規分布$N$(網掛け青と緑)
	- $N(x,\mu,\sigma) = \frac{1}{\sqrt{2\pi\sigma^2}}\exp{\frac{-(x-\mu)^2}{\sigma^2}}$
	- $ p(x) = N(x,-2,2)$
	- $q(x) = N(x,2,2)$
	
各f-divergenceの可視化はこんな感じ

![Kobito.go4YWZ.png](https://qiita-image-store.s3.amazonaws.com/0/146563/5dc67ce9-17a6-9d53-912c-20611b5c7969.png "Kobito.go4YWZ.png")

- 対称非対称
- 極値の違い

などが見て取れる．f-divergenceはこの積分値

## 分布の変化とdivergenceの関係
### 比べるものその1 平均のズレ
- $N(\mu=0,\sigma=1)$と$N(\mu_1,\sigma=1)$で，$\mu_1$を[-10,10]で動かす

#### gif

![mu.gif](https://qiita-image-store.s3.amazonaws.com/0/146563/d2621584-5800-7baa-35f2-fb670870e353.gif "mu.gif")

#### 結果
![Kobito.3hOifS.png](https://qiita-image-store.s3.amazonaws.com/0/146563/5674f007-d8f1-8d65-07c3-5a7f3fad13ab.png "Kobito.3hOifS.png")

立ち上がり方がものによって違うという感じ
### 比べるものその2 分散のズレ
- $N(\mu=0,\sigma=3)$と$N(\mu_1=3,\sigma_1)$で，$\sigma_1$を[1,5]で動かす


#### gif


![sigma.gif](https://qiita-image-store.s3.amazonaws.com/0/146563/8f62ce49-dd99-8c4b-e75f-e275c54419c9.gif "sigma.gif")


#### 結果


![Kobito.SuGicE.png](https://qiita-image-store.s3.amazonaws.com/0/146563/727dc83e-e19e-7b0f-010e-e0eb04134383.png "Kobito.SuGicE.png")

反応がわりと違って面白い

## その他の計量
- Histgram Intersection
- L1,L2 norm

とかをはてなブログにまとめている．そちらも参考に

http://saleslog.hatenadiary.jp/entry/2016/10/22/200000
RailsのつかわれていないXXをどうにかする

## XXは使ってないファイルであったり、modelだったり、メソッドだったり
### 経緯
コンパイル言語じゃないと、今は使ってないファイルやクラスなど、
適切な消すタイミングを逃すと、消すのが難しい。（消していいのか調べるのだるい）
（適切な開発フローを行っていればいいのだけれど、限界がある）

### 仕組みを簡単に説明
使ってないファイルがあった場合、git grepなどして、ヒットしなかったら消すっていう運用を
だれでも一度はやったことあるとおもいますが、それをrspecなどでチェック出来るようにする。
動的にファイル名やその他を扱っている場合は上記の限りでないので、ホワイトリストを作って例外はそこで
管理する。

ついでに同じロジックで削除スクリプトも書く。

### ※運用の前提
継続的デリバリー的なものを実施している。
既存のものは一気に削除してリリースしない。少しずつ。

## 用意するもの
### rspec周り

```spec/non_used_files_spec.rb
require "rails_helper"

# この例では使ってない画像ファイルだけれども、sedやawkなど組み合わせて使ってないメソッドや、
# 使ってないXXってのをチェックできるとおもう（投げやり）
describe "使ってないファイル" do
  context "image編" do
    let(:target_path) {"app/views app/assets/stylesheets app/assets/javascripts　used_files_whitelist.text"}
    it "使ってないimageがない" do
      files = Dir.glob("app/assets/images/**/*.*").map do |f|
        [f, f.split("/").last]
      end
      result = []
      files.each do |path, file_name|
        result << path if git_grep_e(file_name, target_path).empty?
      end
      expect(result).to be_empty
    end
  end
end
```

```spec/support/git_grep.rb
module GitGrep
  def git_grep_e(pattern, *path)
    cmd = "git grep --line-number -e '#{pattern}'"
    cmd = "#{cmd} -- #{path.join(" ")}" unless path.empty?
    `#{cmd}`.split("\n")
  end
end
```

```spec/rails_helper.rb
RSpec.configure do |config|
  # ↓追記
  config.include GitGrep
end
```


```used_files_whitelist.text
banner01.png
banner02.png
banner03.png
banner04.png
banner05.png
banner06.png
banner07.png

意図としては検出できない、動的にソースコード内で記述しているものを書いておく
たとえば↓的な記述の場合など
(1..7).each do |i|
 = image_tag "banner0#{i}".png
```

### 削除スクリプト
上記のrspecでは実際の開発中に使わなくなったもののチェックができるという意図
既存の大量にあるつかわれてないimage fileを消すスクリプト
400近くあった（汗）、ちゃんと消そうよ。。

```script/remove_non_use_images.rb
def git_grep_e(pattern, *path)
  cmd = "git grep --line-number -e '#{pattern}'"
  cmd = "#{cmd} -- #{path.join(" ")}" unless path.empty?
  `#{cmd}`.split("\n")
end

target_path = "app/views app/assets/stylesheets app/assets/javascripts used_files_whitelist.text"
files = Dir.glob("app/assets/images/**/*.*").map do |f|
  [f, f.split("/").last]
end
files.each do |path, file_name|
  if git_grep_e(file_name, target_path).empty?
    puts path
    `rm #{path}`
  end
end
```

## 参考URL
[コードを改善する3つの方法](http://qiita.com/sinsoku/items/133c1930cd4ba23d9044)
cflow導入メモ(Windows)


[GNU cflow](https://www.gnu.org/software/cflow/)

Downloading cflow > mirrors > Asia > Japan > cflow >
[Index of /pub/GNU/cflow](http://ftp.jaist.ac.jp/pub/GNU/cflow/) > cflow-1.5.tar.gz (現在最新)

```
$ ./configure
～略～
$ make
～略～
$ src/cflow --version
cflow (GNU cflow) 1.5
Copyright (C) 2005, 2006, 2009, 2010, 2011, 2014 2014 Sergey Poznyakoff
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Sergey Poznyakoff.
```

あっさりできた。あとはこの`src/cflow.exe`だけ取り出してパスの通った所に配置すればよい。
特に書くこともないので環境をメモしておく。

Git for Windows + MinGW-w64

```
$ bash --version
GNU bash, version 4.3.46(2)-release (x86_64-pc-msys)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

$ gcc --version
gcc.exe (x86_64-win32-seh-rev0, Built by MinGW-W64 project) 5.3.0
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ make --version
GNU Make 4.1
Built for x86_64-w64-mingw32
Copyright (C) 1988-2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
```
Azure Function で Slash Commands 作ってみた

Azure FunctionでSlash Commands を試してみる。
(Slash Commands は /command  のフォーマットで、任意のコマンド機能)

# Function App を作成する

Marketplace から [Function App] を検索して、選択する。

![image](https://qiita-image-store.s3.amazonaws.com/0/120590/06cf91c3-d4c2-1e4a-03b8-d3347055889b.png)

アプリ名やサブスクリプション、プランなど設定して、作成する。
![image](https://qiita-image-store.s3.amazonaws.com/0/120590/9a66b599-638e-1b4c-f7dc-344600fcca30.png)

# Function を作成する

 [+ 新しい関数] から [GenericWebHook-CSharp] を選択し、関数名を指定して作成する。

![image](https://qiita-image-store.s3.amazonaws.com/0/120590/d27e7c54-a6ec-7938-7426-c02cc131d598.png)


今回は単純な現在時刻のメッセージを返すだけの Slash Commands を作る。
開発タブで以下のようにコードに変更する。

```csharp
using System;
using System.Net;

public static async Task<object> Run(HttpRequestMessage req, TraceWriter log)
{
    return req.CreateResponse(HttpStatusCode.OK, new
    {
        text = DateTime.Now.ToString(),
        response_type = "in_channel",
    });
}
```

統合タブでモードを [Standard] に 変更する。

![image](https://qiita-image-store.s3.amazonaws.com/0/120590/ecfddbf9-fe75-4599-5622-ba3f5a2f8ed5.png)

# Slash Commands の設定

作成した Azure Function を Slack から呼び出すため、Slash Commands の設定を行う

まず、「Function App」の開発タブの [関数の URL] をコピーして置く。

![image](https://qiita-image-store.s3.amazonaws.com/0/120590/bac7b766-a13e-6f4b-ba63-fe08d9328036.png)

slaskの画面より[Apps & integrations] をクリックして「Slack App Directory」に移動する。
「Slash Commands」 を検索して、Integrationとして追加する。

![image](https://qiita-image-store.s3.amazonaws.com/0/120590/88c1618d-e6bb-c4bc-6907-b07306073e6a.png)

コマンド名を指定して、[Add Slash Command Integration] をクリック。

![image](https://qiita-image-store.s3.amazonaws.com/0/120590/9cafadc7-cfd1-7e08-7b0b-b279ec14ee04.png)

URL に 上記でコピーした [関数の URL] を設定する。

![image](https://qiita-image-store.s3.amazonaws.com/0/120590/5989b339-8f82-e075-7444-648a02c79ddb.png)

[Add integration] をクリックしてSlash Commandsを登録する。

# 実行してみる

Slack のチャット画面で '/now' と入力すると。。

![image](https://qiita-image-store.s3.amazonaws.com/0/120590/9aaa2728-d4a8-a0d0-0480-da3d971e047a.png)

Azure Function から 以下のように応答してくれる。

![image](https://qiita-image-store.s3.amazonaws.com/0/120590/e4bac3d1-0f96-d14e-680c-bc3b4403fadf.png)
Podfileの書き方変わったし、Podfileをきれいにまとめて書く。


cocoapodsのversion 1.0にupdateしたらPodfileの書き方が変わるので、ついでにPodfileを書き換えまえす。


あと、PodfileはRubyで書かれてるということが分かれば、少しきれいに書ける！ということが最近わかったので備忘録として。


### 作り直すので削除！の前に現状のコピー取っておく！
pod 'PromiseKit', '3.0.1'...のあたりは別でファイルにコピーとっておきましょう！(๑˃̵ᴗ˂̵)و

### コピーできたらファイル消してpod init
```
rm -rf Podfile

pod init
```
podfile消して、pod initしたほうがちゃんとテンプレが作り直されるので、最新の形式に基づいて書ける。


ターゲットいっぱいあるのでアプリだと、

```
target 'ProjectName-iOS-AdHoc' do

end
```

がいっぱいある。

```
target 'ProjectName-iOS-Debug' do
	pod 'PromiseKit', '3.0.1'
end

target 'ProjectName-iOS-AdHoc' do
	pod 'PromiseKit', '3.0.1'
end

target 'ProjectName-iOS-Release' do
	pod 'PromiseKit', '3.0.1'
end
```

こんな風に複数のターゲットに同じPodをインストールする際に何度も書くのはよろしくない。(コピー漏れしそうだし。)


共通部分は定数にまとめて、各ターゲットはその定数をinstall。


```
# Uncomment this line to define a global platform for your project
platform :ios, '9.0'
use_frameworks!

# インストールするpodをまとめた定数
def install_pods
  pod 'PromiseKit', '3.0.1'
  pod 'FrameAccessor', '2.0'
  pod 'LUKeychainAccess', '1.2.5'
  ........
end

# あとは定数をinstall
target 'ProjectName-iOS-AdHoc' do
	install_pods
end

target 'ProjectName-iOS-AdHocRelease' do
	install_pods
end

target 'ProjectName-iOS-Debug' do
	install_pods
end

target 'ProjectName-iOS-Release' do
	install_pods,
	pod 'GoogleAnalytics', '~> 3.13'
end

target 'ProjectName-iOS-Store-AdHoc' do
	install_pods
end

target 'ProjectName-iOS-Store-Debug' do
	install_pods
end

target 'ProjectName-iOS-Store-Release' do
	install_pods
end

```

こう書けば、基本的にはinstall_podsの中に追加していけばOKだし、特定のtargetにだけ入れたいpodも探しやすい。

### 参考
[http://qiita.com/shn/items/e656fe5452e02c0b2853:embed:cite]

↑だと

```
def install_pods do
end
```

になってるけど、

```
syntax error, unexpected keyword_end, expecting end-of-input.
```

でて怒られたんだけど、

```
def install_pods
end
```

でOK。
定数宣言だからdoはいらないんだろうね。

でも参考記事ありがとうございました！(∀｀*)ゞ
Cloud9にGo言語でHelloWorldを実装・実行してみた

## 背景
Go言語勉強用の環境が欲しくて、Cloud9の環境を検証してみました。
せっかくなのでまとめておきます。

## １．Cloud9にWorkspaceの作成
テンプレートは「Blank」で作成。
2016/11/16時点での最新バージョンのGo言語がインストール済みでした。

```
$ go version
go version go1.7.3 linux/amd64
```

## 2.HelloWorldを実装
以下のコードを`hello.go`として保存。
拡張子を`go`で保存すると、エディタがGo言語向けに切り替わります。

```go
package main
import "fmt"

func main() {
	fmt.Print("hello, golang.")
}
```

## ３．実行
hello.goを開いた状態で、Cloud9のツールバーから実行。
Run > Run With > Go
![image](https://qiita-image-store.s3.amazonaws.com/0/113212/4f0efd09-d287-7f89-e2f4-503eb29fb2fd.png)
実行タブが表示されて、こんな感じで実行できます。
次からは「Run」ボタンを押せばOK。

## 4.ブラウザにHelloWorldを実装
コードを以下に変更。

```go
package main

import "fmt"
import "net/http"
import "os"

func viewHandler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprint(w, "hello,golang.")
}

func main() {
	http.HandleFunc("/", viewHandler)
	http.ListenAndServe(os.Getenv("IP")+":"+os.Getenv("PORT"), nil)
}
```

Cloud9でサーバーアプリを実行する場合は、IP:0.0.0.0/ポート:8080を指定する必要があるようです。
https://docs.c9.io/docs/run-an-application

`http.ListenAndServe("0.0.0.0:8080", nil)`
と実装しても動くのですが、せっかくなので環境変数を使って実装しました。
`http.ListenAndServe(os.Getenv("IP")+":"+os.Getenv("PORT"), nil)`

## ５.実行
![image](https://qiita-image-store.s3.amazonaws.com/0/113212/b16cf238-fce6-676d-7698-bbd0792359a8.png)
ブラウザに表示させることができました。

## 6.コード補完
まだ正式リリースではないですが、Go言語のコード補完も利用できました。
`Cloud9 > Preferences > Experimental > Go Code Completion`
で補完機能をONにすることができます。

※注意
ONにしただけでは機能が有効になりません。
一度タブを閉じて再度Workspaceを開き直すと有効になりました。

![image](https://qiita-image-store.s3.amazonaws.com/0/113212/47b495bd-1ce5-f78a-e8ba-72043c04b532.png)

ここまでできれば、学習に利用することができそうです。
Socket.ioを思いっきり勘違いしていた

ひょんな拍子にSocket.ioを使い始めたのですが、根っこで勘違いをしていたために、どうにも理解できないことだらけでいましたが、根っこがわかればほとんど氷解しました。

# TL; DR
* Socket.ioは（論理上も）**クライアント-サーバ型**
* 上りの通信相手はサーバのみ、下りの相手は適宜選択
* イベントは送った先でしか起きない

（いちおうの注記ですが、クライアント→サーバの通信を「上り」、逆を「下り」としています）

# 全体の枠組み
Socket.ioの応用例としていちばんメジャーなのがリアルタイムチャットということもあって、（もちろん物理的にクライアントとサーバがある構成だというのは明らかなのですが）論理的にはクライアント同士が直接やり取りしているものだと誤解していました。

実際には、Socket.ioの論理上も、クライアントはSocket.ioサーバと1対1で接続していて、サーバ側では接続を複数本持っている、というような構成です。クライアント同士がサーバそっちのけで通信しだす、というシステムでは全くありません。

# 通信のときに何が起きるのか
非同期の通信、そしてNode.js環境ということもあって、Socket.ioはイベントドリブンな構成となっています。

## 上りの通信
クライアントから送信する場合、クライアントがつながるのはサーバだけですので、emit[^1]する先の選択肢はもちろんありません。そして、クライアントからemitすると、サーバ側で対応したイベントが発生します。

## 下りの通信
サーバ側からはすべての接続が見えますので、送信先を選ぶことができます。「全接続」「Namespace単位」「room単位」と、それぞれにemitできます。サーバ側同様、届いたクライアントでは対応するイベントが発生します。

# PHPからemitする手段
PHPとSocket.ioを連携させる場合に、PHP側のライブラリも複数ありますが、**発想が違う**ことがあるので注意が必要です。

## elephant.io
elephant.ioは、Socket.ioに対して**クライアント**として働きます。つまり、emitする先はサーバの一択です。また、emitのたびに「Socket.ioサーバとのコネクションを確立→emit→切断」のような動きをしますので、かなり重いです。

## socket.io-php-emitter
Socket.ioには、Redisにあるpub/sub機能と連携するという設定があります。こうすることで、多数のSocket.ioサーバで負荷分散、のようなこともできるようになるのですが、このRedis経由でemitを行うのがsocket.io-php-emitterです。サーバサイドのSocket.ioと同様に動作しますので、emit先はクライアントになります（もちろん、誰に送るかも設定可能です）。


[^1]: 「イベントを起こす」ことに、fireやtriggerなどいろいろな動詞を使いますが、EventEmitterのあるNode.js界ではemitがよく使われるようです。
イングレスをより楽しむのに、知っておきたい無料オンラインツール

#はじめに
この記事を読まれているということは、イングレスをもっと楽しもうと考えているアクティブなエージェントさんなんじゃないでしょうか。
イングレスはスキャナーだけでなく他のツールを組み合わせると得られる情報が何倍にもなるので、エージェント活動が捗ること請け合いです。
もし使った事のないツールがありましたら是非使ってください。
普段筆者は通勤時や昼休みにオフィスの周りを活動範囲にしているヌルいエージェントですが、地域HOに参加させて貰ったりして、ゆるゆる楽しんでいます。
本記事は、イングレスをより楽しむのに筆者が見つけた無料オンラインツールを記載している備忘録です。
まだ使いこなせてないツールは、あえて記載していませんが、新しく発見したり使いこなせるようになったら追記していきたいと思います。

#マップ系オンラインツール
##Ingress Intel Map
[Ingress Intel Map](https://www.ingress.com/intel)
おそらくエージェントの誰もが知っているであろう公式オンラインツールです。
描画が重いのが残念ですが、万が一使っていないエージェントさんは、開いてみることをお勧めします。
IITCという拡張されたIntel Mapを使っている方も多いと思いますが、筆者はまだ使いこなせていないので理解ができたら追記したいと思います。

##Ingress UPC Reports Map
[Ingress UPC Reports Map](http://rank-info.net/ingress/ingressmap.html)
イングレスでは、レゾネーターに対して攻撃が加わるとメールで、ダメージレポートというメールが届きます。
ウザイのでチェックを外してしまった人も居るかも知れませんが、ダメージレポートから過去に自分がオーナーになった事のあるポータルなのか、レゾネーターだけを刺したことがあるポータルなのか推測することができます。
Ingress UPC Reports Mapは、GMailに接続して、ダメージレポートを読んで、マップ上に、UPC(Unique Portal Capture)を表示してくれるツールです。
Pioneerメダルを獲得するには、UPC数を稼ぐ必要がありますからツールを使って効率的に、過去に白ポータルからレゾネーターを配置したことの無いポータルを見つけましょう。
※2019/5/6 Psyduckさんからの指摘で追記
Gmail APIの仕様変更で、新規のメール読み込みが不可だそうです。
久しぶりに試してみましたが動作しないようです。

##Ingress Mission Map
[Ingress Mission Map](https://ingressmm.com/)
Spec Opsメダルは、ミッションのユニーククリア数によって貰えるメダルです。
近場のミッションを虱潰しに消化していくのも一つの手ですが、スキャナーに飾られるミッションメダルは綺麗に揃って欲しいですよね。
どのようなメダルなのかや順路などを確認できるツールが、Ingress Mission Mapです。
ツールで探したお気に入りのメダルを週末クリアしに行くのも楽しいと思います。

##Ingress Operation Preliminary
[Ingress Operation Preliminary](https://takanemu.github.io/cfsimu/)
手前味噌ですが、melponさんが、Githubで公開されていた、[Ingress Control Field Simulator](https://github.com/melpon/cfsimu)をフォークして、微調整したツールです。
作戦前に何枚CFが作られるのか、キーが何本必要なのか、手順はどうするのかなどを検討できます。
マップやポータルと連動している訳では無いので、少々使いにくいのですが、一手ずつ手順を辿って見えるので作戦参加者が事前に理解するのに最適だと思います。

#支援系ツール
##Zello Walkie Talkie
[Zello Walkie Talkie](https://zello.com/)
イングレスは、Google発祥のゲームなのでGoogle+やHang outなどGoogleのツールが多く使われる傾向にあります。
ただし、スキャナーを開いて作戦中に、いちいちハングアウトの画面を開いてチャットをする余裕は無いためトランシーバーのように通話できるZelloが便利です。
余談ですが、Zelloの通話は携帯電話のような全二重通信方式（双方向通話）では無く、半二重通信方式（片方向通話）になるため通話する際には、符牒を取り決めをしておくと便利です。
例えば、質問などの場合のように、返事が欲しい場合には、「（会話）＋送れ」にします。送れは回答してねという意味です。
単に相手に通話権を渡す場合には、「（会話）＋どうぞ」とします。
会話は終わりですよという場合には、「（会話）＋以上終わり」とします。
符牒は、チームで予め決めておきましょう。

##Agent Stats
[Agent Stats Web](https://www.agent-stats.com/)
[Agent Stats Android](https://play.google.com/store/apps/details?id=org.agentstats&hl=ja)
[Agent Stats iOS](https://itunes.apple.com/jp/app/agent-stats/id944221057?mt=8&ign-mpt=uo%3D4)
Agent Statsは、イングレスのエージェント情報画面のスクリーンショットからOCRで、情報を読み取って次のメダルを取得するには、どのくらいの時間が掛かるかなどを予測してくれるツールです。
毎日決まった時間に情報の更新を行えば、グラフから自分のエージェント活動の活発度を知ることが出来ますしメダルを取るために、どの活動を強化したら良いかもわかります。
Ubuntu 16.04 に noip を入れる

noip.com というDNSがあります。それをUbuntu 16.04 に入れたときのメモです。

2017/01/29 変更：もともと 14.04 向けの記事でしたが、個人的に16.10 に移行したので検証不能になり、変更しました。また、私の環境は都合により、16.10 ですが、たぶん、16.04 でも同じです。

発端は、EC2 で動かしているUbuntuのIPアドレスが停止の度に毎回変わるからです。
以下は、Amazon Linux でもやり方。
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/dynamic-dns.html


#### 1. アカウント作成
http://www.noip.com/free

#### 2. 以下に従ってインストール
http://www.noip.com/support/knowledgebase/installing-the-linux-dynamic-update-client-on-ubuntu/

```
$ wget http://www.no-ip.com/client/linux/noip-duc-linux.tar.gz
$ tar xf noip-duc-linux.tar.gz
$ cd noip-2.1.9-1/
$ sudo make install
```

#### 3. systemctl の設定ファイルをkaku

/etc/systemd/system/noip2.service に以下のように書きます。

```
[Unit]
Description = noip2 daemon

[Service]
ExecStart = /usr/local/bin/noip2
Restart = always
Type = forking

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

#### 4. noip を有効に

```
$ sudo systemctl enable noip2
$ sudo systemctl start noip2
```

5. on になっていることを確認

なんかエラーが出ているのですが、エラーログを見る限り、うまく更新できているようです。

```
$ sudo systemctl status noip2
● noip2.service - noip2 daemon
   Loaded: loaded (/etc/systemd/system/noip2.service; enabled; vendor preset: enabled)
   Active: active (running) since 日 2017-01-29 17:40:36 JST; 4min 38s ago
  Process: 7044 ExecStart=/usr/local/bin/noip2 (code=exited, status=0/SUCCESS)
 Main PID: 7045 (noip2)
    Tasks: 1 (limit: 4915)
   CGroup: /system.slice/noip2.service
           └─7045 /usr/local/bin/noip2

 1月 29 17:40:36 XXX systemd[1]: Starting noip2 daemon...
 1月 29 17:40:36 XXX noip2[7045]: v2.1.9 daemon started with NAT enabled
 1月 29 17:40:36 XXX systemd[1]: Started noip2 daemon.
 1月 29 17:40:36 XXX noip2[7045]: Unknown error 5 trying to set group[] at dynupdate.no-ip.com.
 1月 29 17:40:36 XXX noip2[7045]: Error info saved in /tmp/NO-IPLk5Nv3
```
動的に追加した要素にon()でイベントを設定する仕組みの簡単な説明

# 普通にイベントを設定

```html
<body>
    <input id="elem1" type="text" />
</body>
```

というHTMLで、

```javascript
$('input').on('click', function);
```

とした場合、`id="elem1"`のinputに対してclickイベントが設定されます。

# 動的要素へのイベントの設定

同じHTMLで、inputへのclickイベントの設定と、動的なinputの要素追加を行うとします。

```javascript
$('input').on('click', function); //1

$('body').append('<input id="elem2" type="text" />'); //2
```

単純に`$('input')`に対して.on()でイベントを設定した場合、
あとから追加した`id="elem2"`ではイベントが発生しません。

## 順を追って見ると

上記のコードは、

1. `$('input').on('click', function);`でinputにイベントを設定し、`id="elem1"`にclickイベントが設定される
2. `id="elem2"`のinput要素を追加

という順序で実行されます。

2.の時点でHTMLは

```html
<body>
    <input id="elem1" type="text" />
    <input id="elem2" type="text" />
</body>
```
となりますが、
**1.の時点では`id="elem2"`のinputは存在しないため、イベントは実行されません。**

## 解決方法

こういうときには、以下のように書くと動的に追加した要素でもイベントが実行されます。

```javascript
// $('input').on('click', function); //1
$('body').on('click', 'input', function); //1'

$('body').append('<input id="elem2" type="text" />'); //2
```

# 以下が本題

上記の解決方法に記載した書き方は、
**clickイベント自体は`input`ではなく`body`に設定されています。**

ですが、on()の第二引数にセレクタを設定しているため、
**body以下でinputをクリックした場合に実行されるイベント**
となり、動的に追加したinputに対してもclickイベントが実行されるようになります。

## どういうことか簡単に説明すると

それぞれのon()の引数による違いは、

```javascript
$(selector).on(event, function)
```

1. selectorのeventが発生した時に
2. functionを実行する

```javascript
$(selector).on(event, target, function)
```

1. selectorのeventが発生した時に
2. **eventの発生元がtargetであれば**
3. functionを実行する

ということになります。

### eventの発生元

JavaScriptでは、子要素で発生したイベントは親要素まで順に遡って発生します。

参考: [jQueryのバブリングと、「return false;」「e.stopPropagation();」「e.preventDefault();」について](http://blog.neo.jp/dnblog/index.php?module=Blog&action=Entry&blog=pg&entry=3107&rand=ef81c)

以下の書き方であれば、

```javascript
$('body').on('click', 'input', function)
```

bodyにclickイベントが設定されているのでイベントが発生し、
このclickは、inputをclickしたことから遡ってきたものなのでfunctionが実行される、
ということになります。

## ということは

```javascript
$('body').on('click', 'input', function)
```

とした場合、
**body自体をクリックしたり、input以外の要素をクリックした場合でもイベントは発生しています**。
ただ、発生元がinputではないため、functionは実行されていないだけです。


大抵はイベントを設定したい要素はある一定の範囲にしか無いと思うので、
単純に`$('body').on()`とするよりは、
できるだけ小さい範囲に設定した方がパフォーマンスの観点からも望ましいです。

例えば

```html
<body>
    <header>~~~</header>
    <section>
        <div id="input-form">
            <input type="text" />
        </div>
    <section>~~~</section>
    <footer>~~~</footer>
</body>
```

のような構成であるなら、

```javascript
$('#input-form').on('click', 'input', function);
```
というような形にしたほうが良いでしょう。

# 余談

## 確か

jQueryのイベント設定系のメソッドがon()に集約していったのも、
> `.live()`とか`.delegate()`とか`.bind()`いろいろあるけどわかりづらいから`.on()`だけにしようよ

みたいな流れがあったのも理由だったような。

```javascript
$('input').live('click', function)
```

としていても、内部では

```javascript
$('body').bind('click', 'input', function)
```

ってやってるのと同じで、

> inputに設定してるような書き方なのにinputに設定されないのはおかしくね？

みたいな感じだったなーと、記憶の片隅に残っています。ソースは忘れた。
Azure小ネタ集

# Azure 小ネタ集
Microsoftが出しているドキュメントや、MSの方から聞いたAzureを使用する上で注意することや知っておくといいことのまとめ。日々更新予定。

#Azure VM
##VM全般
- VMの課金は**分単位**の従量課金制
- VMの停止中に課金されないのは、あくまでコンピューティングの料金であり、VMのディスク容量や固定IPは課金が継続される。

##VMのディスクについて
- VMを作成するとマウントされるDドライブは**非永続な記憶領域**であり、VMをdeallocateするとDドライブ内は消滅する。

>**しかし**：Dドライブは永続ドライブに比べてIO速度が速い
>**なぜなら**：通常のディスクはストレージとVMを紐づけて接続するが、DドライブはVMがホストされているデータセンター内の同一物理マシンに置かれるため。（だからdeallocateするとホストされている物理マシンが移動するためドライブ内が消滅する）

- ストレージの最大容量は1ストレージアカウントにつき35TBまで。
- ストレージの課金対象はVHDのサイズではなく使用容量に対して。
- ストレージをフォーマットする際は**クイックフォーマットがいい**。(フルフォーマットするとディスクサイズを全て０埋めするので実際には使ってなくてもディスクサイズ全てが課金対象になる)
- プレミアムストレージはBLOBのみをサポートしている。冗長性もローカル冗長のみで、ドメイン名もマッピング不可なので完全にVMのディスク用。
- プレミアムストレージは通常のストレージと異なりフォーマットに関わらずVHDのサイズ全てが課金対象となる。

##VMの管理
- VMにはデプロイ時に自動的にエージェントが入る。

>ポータル内のブレードでハートビートモニタリングやExtension導入をするため

##VMスケールセット
- スケールセットとは複数のVMを１セットとして管理する方法。
- スケールセット内にあるVMには通常通りのRDP接続はできない。

> 理由：スケールセット内VMはサブネット内に配置され、個々に外部から接続されるパブリックなIPアドレスが振られないため。

- スケールセット内にあるVMにRDP接続する方法

 >1.スケールセットのサブネット内にパブリックIPを持たせたVMを１台デプロイし、そこにRDP接続して、さらにそのVM内でサブネットのスケーラブルVMにローカルIP指定でRDP接続する。（いわゆる踏み台）

 >2.スケールセット作成時に自動デプロイされるサブネットのロードバランサーにポート番号によるルーティング設定をして個々のVMに振り分ける。

- スケールセット作成時にはオーバープロビジョニングが既定で行われる。

> オーバープロビジョニング：プロビジョニングに失敗してもいいように多めにプロビジョニングして、後から数を合わせること。オーバープロビジョニング時の余分なプロビジョニングには課金されない。もちろんこれを無効にすることもできる。

#オンプレからクラウドへのP2V移行について

- Azureでサポートされる形式はVHDのみなのでオンプレがVHDXの場合はPowerShellコマンドで変換する必要がある。
- 移行前に**一般化**する必要がある。
- Azure Site Recoveryを使用してクラウドへ複製後、複製設定をオフにすると移行と同じようなことができる。

#VNet
##全般
- VNet内での名前解決は暗黙的に可。
- VNet外からの名前解決は暗黙的には不可。
- 受信セキュリティはNICとSubnetに対して設定することができる。

##可用性
- 可用性を組むときは上流にロードバランサー(LB)をデプロイ。
- LBは配下のVMがダウンした時にそのVMを接続候補から除外する。
- VMのダウンを検知するために(既定)正常性プローブがVMの死活を検知している。

>(既定)正常性プローブ:VMの死活を監視する仕組み。厳密にはVM内のAzureエージェントの死活を監視している。そのためVMは正常動作しているのにも関わらずエージェントがダウンした場合はVM全体がダウンしたと認識される。

- 上記問題を解決するためにカスタム正常性プローブというものがある。

> カスタム正常性プローブ：TCP/UDPによる特定ポートへのアクセスによって実際に監視を行いたいサービスに対して死活を監視する。

#Azure Machine Learning(ML)
- Azure MLの課金対象は実際に機械学習処理を行っている時間のみ。（モデル作成中は非課金）
- どのモデルを使えばいいか、はAzure MLチートシートを参考にする。
【Swift】メモ帳アプリのサンプルコード（画像追加）

# 概要
メモ帳アプリのサンプルコードです。

# 機能
* メモ追加
* メモ編集
* メモ削除
* メモ数表示（追加、削除、検索時に変更）
* メモ追加時間表示
* メモ検索（インクリメンタルサーチ）
* **画像追加**

# [前回](http://qiita.com/menomoto/items/74b097dc3083d4509e41)からの変更点
* メモに画像追加（Photoライブラリから画像選択）
* リファクタリング

# 実装内容（画像追加）
* 画像追加のカメラアイコンをナビゲーションバー右端に追加
 - UIBarButtonItemにUIBarButtonSystemItem.Cameraを追加
* 画像追加ボタンタップ時にフォトライブラリに遷移
 - UIImagePickerControllerを利用
* フォトライブラリで画像選択
 - UIImagePickerControllerDelegate
 - 画像選択完了時のdelegateメソッド（didFinishPickingMediaWithInfo）
* メモに選択した画像を表示
 - NSTextAttachmentに画像をセット
 - NSAttributedStringでUITextViewに追加
* メモ一覧に戻る
 - UIImageをNSDataに変換してNSUserDefaultsに保存
* メモ一覧で各行の右端に小さい画像を表示
 - NSUserDefaultsからNSDataを取得し
 - UIImageに変換後にcellのaccessoryViewにimageをセット

# github
https://github.com/menomoto/Sample_Apps/tree/master/imagePicker

# 結果
![サンプル](http://i.imgur.com/KbYQtmF.gif)
「いいね」というQiitaの釣り針に見事に釣られてみた

Qiitaに「いいね」が出来てContributionの仕組みが変わりましたね。
要は**コメント・編集リクエスト**も貢献になる。でも、**その貢献度合いは調整かけるかも**（故にw=0.5）ってことだと理解しました。ただ説明がイケてないのと、数式の書きっぷりが酷いので一応突っ込みポストってことで。Qiita運営に届け、この思い！と思って書いているうちに釣り針な気がしてきたけど、書き切ります。似たようなこと書こうと思った人絶対いると思う。

# Qiitaの考える「貢献」を汲み取ってみた
[ここ](http://blog.qiita.com/post/153200849029/qiita-like-button)に説明は書いてあるけど、要は技術コミュニティに貢献した度合いを数値化したいわけです。てことで、数式から読み取った貢献の原則が以下。

## 「貢献」の原則

1. 「投稿」「コメント」「編集リクエスト」を貢献のためのアクションとする
2. ユーザからの「いいね」でその価値（つまり貢献度合い）を計測する
3. 重み付け
 - 投稿とコメントの価値は2：１（上限なし）
 - 編集リクエストの価値は元の投稿・コメントに対する付加価値の10分の1（上限は10）
 - 付加価値の定義＝編集リクエスト反映後に、編集対象の投稿及びそのコメントに新たについた価値

操作とか背景とかもいいけど、もうちょい何がどうなってるのかスッキリ説明して欲しい。で、スッキリするための数式のはずが、、、

# 数式おかしくないですかー
- Σの範囲の書き方が妙。N(x)が集合ならn ∈ N(x)じゃないですかね。
- 式としては問題ないけど、できればn,m,nを全てi、または順にi,j,kにしたい気持ち
- Ln も記事はLAn, コメントはLCnとかで定義わけたい気持ち
- 重みが0.5はwなのに0.1は数字なのは何故。10も気になる気持ち
- Cmのmが添字に見えるので添字ではない記号はCMのように大文字にしたい気持ち

1つ目以外は問題ないと言えばない。でも、もうこれ絶対わかってやってるでしょ。突っ込み待ちでしょ。すごいモヤモヤするんで数式で書くなら正しく（できれば美しく）お願いします！

Qiita Blogの公式
![alt](https://qiita-image-store.s3.amazonaws.com/0/49543/8c2b2813-069f-a185-2e8b-214021879326.png)

参考：[Qiitaの新しいContribution算定ロジックを解読してみた](http://qiita.com/iida-hayato/items/f756d1d1dc75ed17c46b)
Rails5: production環境でのAutoloadの廃止

# Rails5の自動読み込みの仕様
## production環境でのAutoloadの廃止
<strong>下記のように自前でautoload_pathsに追加したパスはproduction環境では自動読み込みされません。</strong>

```ruby
# ./config/application.rb
config.autoload_paths += %W(#{config.root}/lib)
```

例えば、上記の設定を記述した上でlib以下のファイルに定義されている定数を呼んでみると、production環境ではエラーが起きてしまいます。↓

```ruby
# ./lib/test.rb
class Test
end
```

```ruby
development環境

$ RAILS_ENV=development bundle exec rails c

Test
=> Test
```
(development環境ではlib以下が自動的に読み込まれる)

```ruby
production環境

$ RAILS_ENV=production bundle exec rails c

Test
=> NameError: uninitialized constant Test
```
(production環境ではTestが読み込まれてない！！)


理由はシンプルで、Rails5からproduction環境でのみAutoloadが廃止になったからです。
development環境では自動読み込みされるため、知らないと事故になります。
参考) <a href=http://edgeguides.rubyonrails.org/upgrading_ruby_on_rails.html#autoloading-is-disabled-after-booting-in-the-production-environment>A Guide for Upgrading Ruby on Rails</a>

## app以下のファイルは今まで通り
app以下のファイルはproduction環境でも今まで通り自動読み込みされます。production環境で行なわれている自動読み込みは厳密に言うとAutoloadではなく、EagerLoadだからです。
app以下のようにデフォルトで自動読み込み設定してあるパスはRailsのソースコード上でちゃっかりEagerLoadの設定が記述されているため、Autoloadの仕組みが廃止されても未定義エラーになりません。

試しにapp以下のファイルに定義されているコードのそれぞれの環境での自動読み込みの違いを確認します。

```ruby
# ./app/models/hoge.rb
class Hoge
end
```

```ruby
test環境

$ RAILS_ENV=development bundle exec rails c

defined?(Hoge)
=> nil

Hoge
=> Hoge
```


```ruby
production環境

$ RAILS_ENV=production bundle exec rails c

defined?(Hoge)
=> "constant"

Hoge
=> Hoge
```

development環境では定数が実際に呼ばれるまで存在しないのに対し、production環境でははじめから定数が存在しており、EagerLoadされているのがわかります。

# 解決策

## 解決策1: EagerLoadの設定をする

```ruby
# ./config/application.rb
config.paths.add 'lib', eager_load: true
```

Railsのソースコードに書かれている自動読み込みの設定と同じ設定の記述法です。
この記述だと、development環境ではAutoloadされ、production環境ではEagerLoadされます。

## 解決策2: Autoloadをデフォルトでonにする

```ruby
# ./config/application.rb
config.enable_dependency_loading = true
```

Rails5のアップグレードガイドにはこちらのやり方が書かれていました。
development環境でもproduction環境でもAutoloadされます。


## 解決策3: Autoloadを使わない
RailsのアップグレードガイドのAutoload廃止の項目には下記のような記述があり、Autoloadするファイルを自分で設定することは稀であるという認識のようです。

```
For the vast majority of applications this change needs no action. But in the very rare event that your application needs autoloading while running in production mode, set Rails.application.config.enable_dependency_loading to true.
```

上記の文章からはEagerLoadを推奨しているのかAutoloadを使わないことを推奨しているのかわかりませんが、Matzさんが数年前にAutoloadは使うなという議論をしているので使わないという選択肢を選ぶのもいいかもしれないです。

参考) https://bugs.ruby-lang.org/issues/5653



# まとめ
Autoloadの是非はさておき、知らないでやると事故るので気をつけて下さい。
特に、development環境では気付くことができないのでとても厄介です。


# 参考資料
http://edgeguides.rubyonrails.org/upgrading_ruby_on_rails.html#autoloading-is-disabled-after-booting-in-the-production-environment
https://bugs.ruby-lang.org/issues/5653
CodeでAutoLayout制御


## Viewを中央に表示

```
// サイズ指定して生成
UILabel *centerLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 20)];
    centerLabel.text = @"center";

// Layout制約を決める前にaddSubviewを先にコール
[self.view addSubview:centerLabel];

// AutoLayoutを解除して置く
centerLabel.translatesAutoresizingMaskIntoConstraints = NO;

// Layoutの制約を定義    
NSLayoutConstraint *xConstrait = [NSLayoutConstraint constraintWithItem:centerLabel attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:1 constant:0];
    
NSLayoutConstraint *yConstrait = [NSLayoutConstraint constraintWithItem:centerLabel attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterY multiplier:1 constant:0];

// 定義した制約を追加
NSArray *constraints = @[xConstrait,yConstrait];
[NSLayoutConstraint activateConstraints:constraints];

```


## AutoLayoutで画面ごとにsizeを変わるbutton

```
// サイズ指定せずにボタンを生成
UIButton *closeButton = [[UIButton alloc] init];
// AutoLayoutを無効化
closeButton.translatesAutoresizingMaskIntoConstraints = NO;

// buttonの準備
closeButton.backgroundColor = [UIColor blackColor];
[self.view addSubview:closeButton];

// top    
NSLayoutConstraint *topConstCloseButton = [NSLayoutConstraint constraintWithItem:closeButton attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1 constant:20];
// left
NSLayoutConstraint *leftConstCloseButton = [NSLayoutConstraint constraintWithItem:closeButton attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeft multiplier:1 constant:20];
// bottom 
NSLayoutConstraint *bottomConstCloseButton = [NSLayoutConstraint constraintWithItem:closeButton attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeBottom multiplier:1 constant:-400];
// right
NSLayoutConstraint *rightConstCloseButton = [NSLayoutConstraint constraintWithItem:closeButton attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeRight multiplier:1 constant:-20];

// 制約の追加
NSArray * constArray = @[topConstCloseButton,bottomConstCloseButton,leftConstCloseButton,rightConstCloseButton];
    
[NSLayoutConstraint activateConstraints:constArray];
```

bottomとrightはconstantがマイナス値なのに注意！！



### ちなみに

制約の追加に

```
 [self.view addConstraints:constraints];
```

を使うこともできるが

```
-(void)addConstraint:(NSLayoutConstraint *)constraint NS_AVAILABLE_IOS(6_0); 

// This method will be deprecated in a future release and should be avoided.  Instead, set NSLayoutConstraint's active property to YES.
```

のように、iOS8~は非推奨になっているので早めに書き換えて置いたほうが良さそう。
OpenFlow on Cisco ASR9K

Cisco ASR9K で OpenFlow （のサブセット）がサポートされて、その White Paper の内容が非常に参考になるのでメモ。

* OpenFlow on ASR9K
    * PDF: https://supportforums.cisco.com/sites/default/files/asr9k-sdn-openflow-whitepaper.pdf

主な記載情報：

* サイジング（Table/Flow数）
    * 2.7 Flow Table Scale
* Match Field
    * 2.2 OpenFlow Matches
* Action
    * 2.3 OpenFlow Actions
* ユースケース
    * 5 Use cases

サイジングと Table Type に関してのみ、以下に抜粋：

# Number of OF Switches, Table and Table Types

システム上には複数（16個）のOpenFlow switch を定義可能。
システム全体で 50,000 flow をサポート。（Table Type = L2_ONLY/L3_V4 switch の場合）

> これは NP(Network Processor) １個での数字ということで、ひょっとしたらNP増やすと増加する？

サポートされる Table Types は以下４種類。
Key Size がそれぞれ 20-byte / 40-byte であり、Key Sizeが大きくなるとサポート可能なFlow数は減少する。

* L2_ONLY (key = 20-byte)
    * Supports L2 header matches.
    * Supports L2 actions.
    * Can be applied to ingress L2 interfaces.
* L2_L3 (key = 20-byte)
    * Supports L2 & L3 (IPv4/IPv6) header matches.
    * Supports L2 actions.
    * Can be applied to ingress L2 interfaces.
* L3_V4 (key = 80-byte)
    * Supports L3 IPv4 header matches.
    * Supports L3 IPv4 actions.
    * Can be applied to ingress L3 interfaces.
* L3_DS (L3 Dual Stack)  (key = 80-byte)
    * Supports L2 and L3 (IPv4/IPv6) header matches.
    * Supports L3 (IPv4/IPv6) actions.
    * Can be applied to ingress L3 interfaces.