OmniAICreator/Qiita-1.07M huggingface dataset:
OutLook VBA 二重にフィルタをかける方法


```MailItemDblFilter.BAS
Public Sub MailItemDblFilter()
    Dim myNamespace As Outlook.NameSpace
    Dim myContacts As Outlook.Items
    Dim myItems As Outlook.Items
    Dim myItem As Outlook.MailItem
    Dim myitems2 As Outlook.Items
    Set myNamespace = Application.GetNamespace("MAPI")
    Set myContacts = myNamespace.GetDefaultFolder(olFolderInbox).Items
    Set myItems = myContacts.Restrict("[ReceivedTime] >= '01/16/2017' AND [ReceivedTime] < '03/18/2017'")
For Each myItem In myItems
    If (myItem.Class = olmail) Then
    If myItem.Subject Like "*ない*" Then
            Debug.Print myItem.Subject & ": " & myItem.ReceivedTime & ":" & myItem.Sender & ":" & myItem.Recipients.Item(1).Address
    End If
    End If
Next
End Sub
```

##今回のVBAは
OUTLOOK用のメールに複数の条件をかけるというプログラムです。
今回はDebug.Printでタイトルなどを抜き出していますが、msg形式で保存するようにするといいと思います。
[選択したメッセージを MSG ファイルまたは RTF ファイルとして保存するマクロ](https://outlooklab.wordpress.com/2010/11/18/%E9%81%B8%E6%8A%9E%E3%81%97%E3%81%9F%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92-msg-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%BE%E3%81%9F%E3%81%AF-rtf-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB/)

##どういう時に使うか
たとえば自分をA、相手をBとして「この2か月間のやり取りだけ保存したい」という時があると思います。
そういう時にこれをMSｇ保存にすると自動的に保存できます。

##Restrictに二重フィルタがかからない
今回苦労したのはどうやってもRestrictに二重に条件を付けることができないことでした。
そこで、日付だけぬきだし、IF文で条件をかけて絞り込むという方法で性交しました。


##Restrictで抜き出すとMailItemではない
見る人が見るとわかりますが、受信フォルダのアイテムは通常MailItemになるはずなんです。
ところが、Myitem.Classにすると
If (myItem.Class = olmail) Then
でわかるようにolMailになります。
ここを別のプロパティにするとさらに三重のフィルタがかけられます。
またLikeも使えます。ワイルドカード文字は* アスタリスク
です。
mysqlコマンドラインからSQLファイルを1トランザクションで実行する方法

複数行からなるSQLファイルがあったとして、それを一括で実行したいとします。

```sql:sqls_no_transaction.sql
insert into foo (...) values (...)
update foo set ... where ...
insert into bar (...) values (...)
update bar set ... where ...
```

これらを `mysql` コマンドラインから一気に流すわけですが、一気で流すなら明示的にトランザクション内で実行したほうが早いのは誰でも予想できると思います。

実際、ある40000行のupdate文を明示的にトランザクション内で実行した場合と、実行しない場合の実行速度を`time`コマンドで計測してみました。

- 明示的トランザクション内

```bash
$ time mysql < sqls_with_transaction.sql
real	0m21.692s
user	0m0.756s
sys	0m1.524s
```

- 明示的トランザクションなし

```bash
$ time mysql < sqls_no_transaction.sql
real	1m53.670s
user	0m0.916s
sys	0m1.432s
```

6倍近くの差が出てしまいました。差は歴然ですね。


さて、ここからが本題。
明示的トランザクション下で実行するのであれば、`begin;` 〜 `commit;` で　SQL文を囲めばよいわけですが、元のSQLファイルを修正できない（面倒な）場合はどうしたら良いでしょうか。

PostgreSQLのコマンドラインである`psql`であれば、`-1 (--single-transaction)`というオプションがあり、自動的に明示的トランザクション下でSQL文を実行してくれます。しかし、`mysql`にはありません。

そこで`sed`を使います。`sed`には`i`コマンド（指定行の前に行を追加）、`a`コマンド（指定行の後に行を追加）があるので、

```
cat sqls_no_transaction.sql | sed -e '1ibegin;' -e '$acommit;'
```

とすれば、先頭行の前に`begin;`、最終行の後ろに`commit;`が追加できます。

```sql
begin;
insert into foo (...) values (...)
update foo set ... where ...
insert into bar (...) values (...)
update bar set ... where ...
commit;
```

あとはこれをパイプで`mysql`に流すだけです。

```
cat sqls_no_transaction.sql | sed -e '1ibegin;' -e '$acommit;' | mysql
```

`sed`というと`s`コマンド（正規表現による置換）がポピュラーですが、ファイルの内容をちょっと一時的に加工したい場合に便利なツールなのだなと改めて実感しました。
使いこなすのは相当難しいとは思いますが。（笑）



追記: mac OS X上のsedはbsd系の実装なので、sedのコマンド指定方法が異なります。以下を使ってください。

```
cat sqls_no_transaction.sql | sed -e '1i\'$'\n''begin;' -e '$a\'$'\n''commit;' | mysql
```
local gulp 実行 

# 目的

 * npm -g install gulp したくない

## 出来るようになること

* npm -g install gulp なしで gulp実行

## 制限

npmのバージョンによりstartによる引数が受け取れない
 
## 設定

```./package.json
    "//": "You can do run the gulp command by locally version if you do run command just once following.(WIN) 'npm run-script gulpw'"
    "gulp" : "gulp",
    "gulpw" : "doskey gulp=npm run-script gulp -- $*"

```

上記が、local gulp設定の方法。
最近のWindowsには、doskeyというlinuxでいうaliasがきれるようなのでそれを使った内容となります。
以下のバッチファイルを用意して、実行可能環境を起動できるようにすると少し幸せです
__*ただし、この場合は、「gulp TASK名」で起動しないとパラメータエラーとなりますのであしからず__

```gulpw.bat
 start cmd.exe  /K "doskey gulp=npm run-script gulp -- $*"
```
サーバー接続時に、メッセージを表示！(/etc/motd)

# motdとは
motd = message of the day
/etc/motdに記述した内容は、ユーザーがログインした後に表示されます。
ユーザーに何かお知らせしたい時に記載するといった使い方をするみたいです。

下記URLで、好きな文字のデザインを行なって、motdに記載してみましょう。
http://patorjk.com/software/taag/#p=display&f=Graffiti&t=Type%20Something%20


# SSHログインしてみた
最初にサーバーの情報とか載せれば、誤ログインとか防げるのに使えるかもしれないですね！

<img width="960" alt="スクリーンショット 2017-03-21 23.15.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/168635/882af6bd-8ab2-e794-2ed0-4084f62bca04.png">

以上です！
稍微摸摸 Redcarpet 

![小試 Redcarpet](https://qiita-image-store.s3.amazonaws.com/0/41979/4675c13b-21c5-6525-c0fb-8428f2b85497.png)

一直想要自己弄弄看 Markdown 轉 HTML 這樣的功能，
今天就抽空摸了一下了

## Redcarpet

- GitHub - https://github.com/vmg/redcarpet
- RubyGems - https://rubygems.org/gems/redcarpet

稍微查了一下，這個是比較多人推薦的，
可以用很簡單的方式、達成轉換成 HTML 這個目的。

雖然這個 library 有其他更強大的功能 - 例如客製化自家用的 Markdown 標記，
但是這篇只會寫怎麼簡單地使用它。

## 範例的流程

### 環境

- ruby 2.3.2
- Rescarpet 3.4.0

### 步驟

- 安裝 Redcarpet
- 在 ruby 檔案引入
- 透過 command line 執行，匯出成 html
- 稍稍加強功能

## 安裝

```
$ gem install redcarpet
```

這樣就完成了

## 撰寫檔案

這時候可以開一個自己喜歡的資料夾，新增一個 ruby 檔案，
作為示範，就把檔案叫 `demo.ruby` 吧！

接著就可以先在這個檔案引入 `redcarpet`

```ruby:demo.ruby
require 'redcarpet'
```

### 初始化 Redcarpet 的 Markdown 物件

我們可以透過

```ruby
Redcarpet::Markdown.new(<renderer>, <extensions>)
```

這樣的方式初始化一個負責 Markdown 處理的物件

第一個參數 `renderer` 可以放入 `Redcarpet::Render::Base` 的子類別 render object
像這邊就可以放 `Redcarpet::Render::HTML` ，因為他是繼承於前面講的 Base （[參考](http://www.rubydoc.info/gems/redcarpet/3.4.0/Redcarpet/Render/HTML)）。

第二個參數 `extensions` 則是可以放入各種會需要指定的 extensions ，例如 `:autolink`、`:highlight` 等進階功能。

### 基本的成果 

```ruby:demo.ruby
require 'redcarpet'


renderer = Redcarpet::Render::HTML
# 如果不需要使用 extension 的話，可以這樣寫來初始化
markdown = Redcarpet::Markdown.new(renderer)

# 印出一個 markdown 字串轉換後的結果
puts markdown.render("# This is title \n http://qiita.com")
```
## 輸出

### 輸出成字串

```bash
ruby demo.ruby
```

存檔之後，在 command line （終端機畫面中） 用 ruby 的執行，就會印出

```text
<h1>This is title</h1>

<p>http://qiita.com</p>
```

### 把結果存入 html 檔案

```bash
ruby demo.ruby > index.html
```

用這樣的指令，就可以把印出的結果存進 `index.html` 這個檔案中。

### 基本成果截圖

用瀏覽器打開輸出的檔案之後，就會看到這樣的畫面：

==

<img width="296" alt="基本的結果" src="https://qiita-image-store.s3.amazonaws.com/0/41979/64170b2f-f212-0c35-4ca3-3f59017e01d2.png">

==

因為預設的 Markdown 是沒有辦法自動處理 URL 字串的，所以就算打出網址，處理後的結果這個部分還是字串。

## 加入自動轉換網址字串的 Extension

可以用 `:autolink` 這個 extension 來幫我們達成自動轉換網址字串的功能

```ruby:demo.ruby
require 'redcarpet'


renderer = Redcarpet::Render::HTML
extensions = { :autolink => true }

# 將 extension 加入初始化
markdown = Redcarpet::Markdown.new(renderer, extensions)

puts markdown.render("# This is title \n http://qiita.com")
```

### 輸出成字串

```text
<h1>This is title</h1>

<p><a href="http://qiita.com">http://qiita.com</a></p>
```

### HTML 檔案的結果

```bash
ruby demo.ruby > index.html
```

接著，在執行一次存成 `index.html`，
用瀏覽器開啟之後，就會看到這樣子的畫面：

==

<img width="321" alt="有加入 :autolink 的結果" src="https://qiita-image-store.s3.amazonaws.com/0/41979/331069ae-a911-d7c5-961d-a56d96b356a2.png">

==

就會看到有網址的地方，已經變成可以點擊的超連結了。

這篇到這邊告一個段落，再來繼續摸摸 Redcarpet 的其他功能！
VBA: C#(ASP.Net)向けのDtoメンバコード生成

#ASP.netのDtoコードを生成するための簡易関数
##前提
- postgreSQLとASP.Netを利用した、Dtoソースコードの生成が目標
- テーブル定義のExcelシートがあり、そこからVLOOKUP等で必要な順に並べ終えていること
- 型はVARCHARとINTEGERのみを想定（※）

（※表記が異なったり、DateTime等が必要な場合はソースコードの条件文(l.6～12くらい)を変更）

#想定
##このようなセル指定に対して
|　|A|B|C|D|E|F|G|
|:-------|:-------|:-------|:-------|:-------|:-------|:-------|:-------|
|1|論理名|物理名（DBカラム名）|型名|文字列長|Not Null|-|GetSourceCode|
|2|サンプル数値|sample_num|INTEGER| | | |(ここに簡易関数を指定)|
|3|サンプル文字列|sample_str|VARCHAR|1024|○| |(ここに簡易関数を指定)|

##こうなるのが目標
```C#:dtoSample.cs
    /// <summary>
    /// サンプル数値
    /// </summary>
    public int? sample_num { get; set; }

    /// <summary>
    /// サンプル文字列
    /// </summary>
    public string sample_str { get; set; }
```

##完成品
###引数
1. logicName: 論理名（日本語名、DBのコメントに記述する名前）
2. sourceName: 物理名（DB上のカラム名）
3. typeStr: カラムの型名
4. charLng(Optional): VARCHARの場合の文字列長
5. IsNotNullMark(Optional): Not Nullの場合のテーブル定義上の記号等(空でなければNot Nullとする)

###ソースコード
```VB.Net:GetDtoCode.bas
Public Function GetDtoCode(ByVal logicName As String, ByVal sourceName As String, _
                            ByVal typeStr As String, _
                            Optional ByVal charLng As Long = 0, _
                            Optional ByVal IsNotNullMark As String = "") As String
    Dim tempType As String
    
    If typeStr = "VARCHAR" Then
        tempType = "string "
    ElseIf IsNotNullMark <> "" Then
        tempType = "int "
    Else
        tempType = "int? "
    End If
    
    GetDtoCode = vbTab & "/// <summary>" & vbCrLf & _
                vbTab & "/// " & logicName & vbCrLf & _
                vbTab & "/// </summary>" & vbCrLf & _
                vbTab & "public " & tempType & sourceName & " { get; set; }" & vbCrLf
End Function
```

###実行結果
```Text:sample
// 出したいセルに以下のように指定
// 指定順は先述の引数の順になるようにする
G2セル(INTEGER): =GetDtoCode(A2,B2,C2)
G3セル(VARCHAR): =GetDtoCode(A3,B3,C3,D3,E3)

// 結果
"	/// <summary>
	/// サンプル数値
	/// </summary>
	public int? sample_num { get; set; }
"
"	/// <summary>
	/// サンプル文字列
	/// </summary>
	public string sample_str { get; set; }
"
```

これでG列の出力分をコピーしてテキストエディタで少し手直しすれば完成。
※ソースコードへの貼り付け前に、"(ダブルクォーテーション)を置換等で取り除いてください。
（ファイル出力できるようにすれば必要ない）
DBアクセスラッパー（JDBC + Kotlin）

こんにちは。
「[KotlinでJDBCをちょっといい感じに使える気がするライブラリを作った](http://qiita.com/devneko/items/47e30a7b91e5ee67f146)」を興味を持ったので、手を加えてさらに少し楽になるようにしてみました。 
GitHub: https://github.com/kkdd/devneko-kotlin-jdbc

select 機能（helper.query()）などに手を加え、":" で始まる変数名は、 AS() の指定で別名扱いに置換されます。
例： ```select(":abc") {AS("abc", "xyz")}``` ==> ```SELECT xyz AS abc```

下記の応用実行例では近傍地点検索（[MySQL (InnoDB) で空間検索 (st_within)](http://qiita.com/kkdd/items/2e26d9dd25673e52c1af)）と同様の検索を sqlite/spatialite で行いました。

### 基本機能使用例

```select.kt
rs = helper.query(tblname) {
  where("id > :id1") {
    AS("id1", 1)
  }
  select("id, name, :lon, :lat") {
    AS("lon", "X(geom)")
    AS("lat", "Y(geom)")
  }
  orderBy("lat")
}
while (rs.next()) {
/*  rs.get("id")
    rs.getString("id") */
}
```


```insert_update_delete.kt
val geom = "GeomFromText('POINT(%f %f)', ${SRID})"
helper.insert(tblname) {
    set("id", 1)
    set("name", "Uber")
    setAs("geom", geom.format(135.0, 40.0))
}

helper.update(tblname) {
    where("id = 2")
    set("name", "Amazon")
    setAs("geom", geom.format(135.0, 40.0))
}

helper.delete(tblname) {
    where("id = 3")
}
```

### 応用実行例

```console
$ brew cask install java
$ brew install sqlite libspatialite kotlin
$ wget https://bitbucket.org/xerial/sqlite-jdbc/downloads/sqlite-jdbc-3.16.1.jar
$ kotlinc -classpath ".:sqlite-jdbc-3.16.1.jar" ./src/main/kotlin/net/devneko/kjdbc/*.kt
$ kotlinc -classpath ".:sqlite-jdbc-3.16.1.jar:net/devneko/kjdbc" spatialite.kt
$ kotlin  -classpath ".:sqlite-jdbc-3.16.1.jar:net/devneko/kjdbc" SpatialiteKt

 | id | name    | geom             | dist     |
 +----+---------+------------------+----------+
 | 1  | Google  | POINT(135 40)    | null     |
 | 4  | Amazon  | POINT(135 39.99) | 1110.345 |
 | 3  | Twitter | POINT(135 39.98) | 2220.689 |
 | 2  | Apple   | POINT(135 40.02) | 2220.696 |
```



```spatialite.kt
Class.forName("org.sqlite.JDBC")
var conn: Connection? = null
var stmt: Statement? = null
var rs: ResultSet? = null
val dbname = "spatialite-test.sqlite"
val url = "jdbc:sqlite:" + dbname
val config = SQLiteConfig().apply {
  enableLoadExtension(true)
}

conn = DriverManager.getConnection(url, config.toProperties())
stmt = conn?.createStatement()
stmt?.executeQuery("SELECT load_extension('mod_spatialite')")

rs = stmt?.executeQuery("select count(name) from sqlite_master where name='spatial_ref_sys'")
if (rs!!.getInt(1)==0) {
    stmt?.executeQuery("SELECT InitSpatialMetadata(1)")
}

val SRID = 4326
val RE = 6378137.0
val DEG = 0.017453292519943295
val tblname = "company"
val helper = SqlHelper(conn)

val dist = 3000.0
val rad = dist/RE/Math.cos(pnt[1]*DEG)/DEG
val pnt = arrayListOf(135.0, 40.0)
val mbr = "BuildCircleMbr(${pnt[0]}, ${pnt[1]}, ${rad}, ${SRID})"
val pointCenter = "GeomFromText('POINT(${pnt[0]} ${pnt[1]})', ${SRID})"
rs = helper.query(tblname) {
  where("MBRContains(${mbr}, geom) and dist <= ${dist} or dist IS NULL")
  select("id, name, :geom, :dist") {
    AS("geom", "AsText(geom)")
    AS("dist", "Round(Distance(geom, ${pointCenter}, 1), 3)")
  }
  orderBy("dist")
}
while (rs.next()) {
/*  rs.get("id")
    rs.getString("id") */
}
```
[めも]pixi.jsなどで、Error: WebGL: texImage2D: Conversion requires pixel reformatting.が発生する場合[Firefoxのバグ]

バグを拾ったようなので、暫定めも。
手元環境:
Firefox:52.0.1
PIXI.js:4.4.2

#現象：texImage2D()などが呼ばれると、Firefoxで、"Error: WebGL: texImage2D: Conversion requires pixel reformatting."などがコンソールに出力される
※Firefoxのバージョンによって、メッセージは変わります。(ver51あたりから?)

旧バージョンの場合:
Error: WebGL: texImage2D: Incurred CPU-side conversion, which is very slow.
など。(別のメッセージも含めて3行位出るらしいです)

##発生個所
pixi.jsの、1939行目
`Texture.prototype.upload`の`gl.texImage2D()`


#原因：Firefoxのバグと思われる(未解決)
おそらく画面側と画像のカラーフォーマットが一致しないのが原因ですが、未解決。
詳細はBug 1246410を参照して下さい。
(Firefoxのソース上、テクスチャのtypeがGL_UNSIGNED_BYTEの場合は、formatがRGBA以外では一致しません。なので、screen.colorDepthが24になった場合は一致しなさそうです。)

ただし、pixi.js側も、画像のフォーマットをTextureに反映していないようなので、
(別のIssueになると思いますが) この辺りも気になる所。
基本的に、format: GL_RGBA、type: GL_UNSIGNED_BYTEになると思います。コード内の場所によって、premultiplyAlphaがtrueになることも。

##関連バグ
[Bug 1246410 - Low performance of texImage2D with canvas and WebGL](https://bugzilla.mozilla.org/show_bug.cgi?id=1246410)

##おそらく同件のバグ
[Firefox Nightly: Error: WebGL: texImage2D: Chosen format/type incured an expensive reformat: 0x1908/0x1401 #9109](https://github.com/mrdoob/three.js/issues/9109)

[Firefox Errors when rendering Video in WebGL #2991](https://github.com/pixijs/pixi.js/issues/2991)

他多数。(#9109の下の方に、並んでいます)

#再現方法
画像を表示する。

例えば、
pixi.jsのダウンロードページにある、[Basic Usage Example](https://github.com/pixijs/pixi.js#basic-usage-example)を実行するなど。
※`app.stage.addChild()`を実行するとエラーが出力されるはずです。

エラーの発生個所:
`Texture.prototype.upload()`の、`gl.texImage2D()`

※`SpriteRenderer.prototype.flush()`の、`gl.drawElements()`でも、別のエラーが発生するので注意。
> Error: WebGL: drawElements: This operation requires zeroing texture data. This is slow.

発生個所を調べるために使ったコードは、こんな感じ:
>
```test.js
var app = new PIXI.Application(800, 600, { backgroundColor: 0x1099bb});
document.body.appendChild(app.view);
>
var img = PIXI.Sprite.fromImage('img/img1.png');
app.stage.addChild(img);
```

>
```index.html
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <meta http-equiv="content-style-type" content="text/css" >
    <meta http-equiv="content-script-type" content="text/javascript" >
    <title>Document</title>
</head>
<body>
<script src='lib/pixi.js'></script>    
<script src='test.js'></script>    
</body>
</html>
```
React + Flow で安心して event.target.value を使う

# TL;DR
`onChange`の引数に`Event`ではなく`SyntheticInputEvent`を使う
https://github.com/facebook/flow/issues/218

# これまでのやり方
たとえばこんな、テキストを入力して反映するだけのコンポーネント。

```js

/* @flow */
import React from 'react'

class InputField extends React.Component {
  
	state: { text: string }

	constructor(props) {
      super(props)
      this.state = { text: '' }
    }

	handleChange(e : Event) {
      const text = e.target.value // error!
      this.setState({text})
    }

	render() {
      return (
        <input type="text" value={this.state.text} onChange={this.handleChange} />
      )
    }
}

React.render(
  <InputField />,
  document.body
)

```
これは許されない。

```shell-session

14:  const text = e.target.value
                           ^ property `value`. Property not found in
14:  const text = e.target.value
                  ^ EventTarget
```
`EventTarget`に`value`プロパティはないとのこと。
なるほど、これぞ型安全。
事前に問題を発見し、実行時例外を未然に防ぐことができる。
素晴らしい、ありがとう、やっぱり静的型付は最高だぜという話はさておき、それではどうやって`value`にアクセスするのか。

例：愚直にHTMLInputElementであることを確認する

```js

handleChange(e : Event) {
  const target = e.target;
  if (target instanceof HTMLInputElement) {
    this.setState({text: target.value}})
  }
}

```

例：自前でEventの型を用意する

```js

declare type ElementEventTemplate<E> = {
  target: E
} & Event

declare type InputEvent = ElementEventTemplate<HTMLInputElement>

....

handleChange(e : InputEvent) {
  const text = e.target.value
  this.setState({text}})
}

```

例：いっそHTMLInputElementにキャストする

```js

handleChange(e : Event) {
  const text = ((e.target: any):HTMLInputElement).value
  this.setState({text}})
}

```
痛々しくて見てられないので以下略。

# これからのやり方
この`Event.target.value`についてはかなり前から議論されていたようで、v0.35から`SyntheticInputEvent`に`target`が追加され、`HTMLInputElement`を参照できるようになった。
https://github.com/facebook/flow/commit/167b126b81ead513274678e4895f769525d6decb

`HTMLInputElement`には`value`が定義されているので、これで何の問題もなく`SyntheticInputEvent.target`から`value`へ直接アクセスできるようになる。

```js

handleChange(e : SyntheticInputEvent) {
  const text = e.target.value // No error!
  this.setState({text})
}

```
条件分岐したり、キャストしたり、小技を噛ませてflowのエラーを回避する必要がなくなり、分かりやすく簡潔なコードになった。

# まとめ
型のある世界で幸せに生きよう。
【初心者投稿-6】progate_有料会員の壁

#昨日までのおさらい
* 休日に勉強するの案外きつい！(予定が入ると夜の学習タイム取れない)
* 要するに平日の夜はサラリーマンにとって、習慣化のゴールデンタイム
* progateのhtmlとcssの初級に関しては要素の理解は出来た！

※実戦での使い方は別

#Progate有料会員の壁
今日から道場コースでガシガシコーディングしていくぞ～！！
まずやってみると全然わからんｗ
要素はわかってもその使い方がわからない。特にfloat!どこからどこがfloat:left;？

んで、答え見て無事ヘッダー作り完了！
「次こそは！！」と意気込んでいたら
"次からの道場コースは有料会員のみ"の文言が…

Progateの無料で学び倒すしかないか…

#学習の記録
* Progate4日目
* 今日の勉強時間：45分
* 総学習時間：4時間55分
* 今日学んだこと：「HTML&CSS 学習コース 初級編」道場コース　1コマ目終了！floatをする時は一直線上にしたいすべての要素のCSSにfloatをしなきゃダメなのね！
* 今日の感想：Progate×無料でしっかりマスターするための作戦を再度練ります！
MS HoloLens でハリボテのデモを作る

最近 HoloLens の紹介を兼ねたソリューションの提案を行う機会が増えていますが、
実際にプロトタイプまで実装する時間はなかなかなく、
せめてはと、簡単に用意できるハリボテのデモをやってみました。

# できるもの

こんな感じのデモです。

<img width="704 height="396" src="https://qiita-image-store.s3.amazonaws.com/0/38837/599a1198-fe62-ec44-8a27-f819c0ec9d5b.jpeg" />

予め用意したイメージをフレームレスでペタペタ貼り付けておく静的なデモができます。
GIF とか APNG とか動くのであればアイデア次第で見栄え良くできるかも？

# 作り方

## イメージの準備

イメージを用意します。
下記は iOS の Google Calendar のスクリーンショットをトリミングしました。

<img width="310" height="340" src="https://qiita-image-store.s3.amazonaws.com/0/38837/49ce6d22-e016-04c7-c466-b9195bae4078.png" />

__※カレンダーの内容は適当なダミーデータです。__

スクリーンショットを使う場合は、PC のスクリーンショットを利用するより、
スマホアプリのスクリーンショットから切り出したほうが良いです。

HoloLens の UI/UX を踏まえると、
PC のように、情報が詰め込まれている画面より、
スマホのようにある程度情報を絞った画面の方が適しているというのが理由です。

スマホはタッチで操作する前提で UI 設計されているという点もマッチしますね。

## HoloLens にイメージをアップロード

デバイスポータルから作成したイメージを HoloLens に取り込みます。
デバイスポータルの設定方法については、MS 公式ドキュメントをご参考ください。

* HoloLens で Device Portal をセットアップする  
https://docs.microsoft.com/ja-jp/windows/uwp/debug-test-perf/device-portal-hololens

１. デバイスポータルから File Explorer を選択
  
<img width="1291" alt="dp_01.png" src="https://qiita-image-store.s3.amazonaws.com/0/38837/fc6c51fe-d272-296f-df09-c5087b537765.png">

２. User folders から CameraRoll を選択
３. 最下部 Upload a file to this directory からイメージを選択してアップロード

<img width="1310" alt="dp_02.png" src="https://qiita-image-store.s3.amazonaws.com/0/38837/06871b18-2109-70a2-da39-6d60cd0b95bc.png">


## HoloLens でイメージを貼り付ける

１. HoloLens プリインの Photos アプリを起動します。

![photos_01.jpg](https://qiita-image-store.s3.amazonaws.com/0/38837/2a482fe9-5fc6-22fc-7005-1a007a583a8d.jpeg)

２. アプリが起動すると先程アップロードした写真が出てくるので選択します。

![photos_02.jpg](https://qiita-image-store.s3.amazonaws.com/0/38837/a777ff17-6cfb-4dfc-3b80-2fae0dc00fc5.jpeg)

３. 写真が表示されたら、右上 Pin ボタンをタップします。

![photos_03.jpg](https://qiita-image-store.s3.amazonaws.com/0/38837/f716ffad-7060-339e-d68f-b144f547c898.jpeg)

４. イメージ単体が別ウィンドウになって自由な位置に置けるようになるので好きな場所に設置します。

イメージを置いたら、下部の Adjust でサイズを調整し、問題なければ Hide Menu で下部メニューを非表示にします。
すると、イメージだけが空間に浮いている状態にできます。

![photos_04.jpg](https://qiita-image-store.s3.amazonaws.com/0/38837/78c76278-40b5-5acc-4062-d9f739f955cf.jpeg)

他にも必要なイメージがあれば選択してピン留めしていきます。

複数イメージをアップロードした場合は連続していますので、
アプリ下部の Previous, Next を使って切り替えるのが楽だと思います。

また、配置が終わったあとは Photos アプリは Remove してしまっても大丈夫です。

# HoloLens 画面の共有

基本的に HoloLens は HMD をかぶっている当人しか画面が見えないので、
デモの際はデバイスポータルで Live Streaming して画面を共有したほうが良いです。
PCブラウザに表示した映像をスクリーンやディスプレイに出力する格好です。

１. デバイスポータル左部の Mixed Reality Capture をクリック
２. Live preview をクリック

弊ネットワーク環境ではあまり安定せずしばしば切断されますが、
その際は一旦 Stop live preview をクリックして一旦停止した後再接続すれば復帰します。

ちなみに、デバイスポータルを使う以外の方法だと、
Windows Store に MS 公式の HoloLens (UWP) アプリがあり、これでも live streaming が可能です。
ただし、なぜか日本向けのストアだとまだ公開されていないので、Windows OS の設定から一時的に国を米国に変更する必要があります。

<img width="600" height="460" src="https://qiita-image-store.s3.amazonaws.com/0/38837/09e18afe-6e84-aca8-f7a6-d95f12733166.png" />

# 所感

というわけで、HoloLens を通してみると、
会議室の利用状況がひと目でわかるというシンプルなデモを行ってみました。

ハリボテではありますが、
実際に HoloLens をかぶって利用するとそれなりに未来感が感じられてやっぱり楽しいですね！＼(^o^)／
変数名自体を取得する

http://qiita.com/mpyw/items/43e7d2e17f1c4507b363
http://qiita.com/khsk/items/6fbf1f5a84250ec294df
なんか目に入ったので、もっと普通にやってみた。


```php
	/**
	* 変数名を返す
	* @param mixed 値は使わない
	* @return String @paramの変数名。直接値を入れたときはnull
	*/
	function getVarName($var){
	    $b = debug_backtrace(null, 1)[0];
	    return preg_match(sprintf('|%s\(([^\)]+?)\)|', $b['function']), preg_replace('/[[:space:]]/', '', implode('', array_slice(file($b['file']), $b['line']-1))), $m) ? ($m[1][0]==='$' ? $m[1] : null) : null;
	}
	
	getVarName($hoge); // '$hoge'
	getVarName('fuga'); // null
	getVarName($this->foo); // '$this->foo'
	getVarName (
		$bar
	) ; // 改行とか入れてもいける
```

どんなスコープからでも呼べる、はず。

問題点その1：1行でgetVarName()を2回呼ぶと1回目の値が返る。

```php
	// 1回目は'$a'だが2回目も'$a'になる。
	getVarName($a);getVarName($b);
```

問題点その2：変数名に')'が入ってるとそこで切れる。

```php
	getVarName(${'varN)ame'}); // '${'varN'になる
	getVarName($closure()); // '$closure('になる
```

その1は呼び出された行と回数を保持しておけばどうにかなるだろうけど面倒なのでやめた。
その2は正規表現をがんばればどうにかなるだろうけど面倒なのでやめた。
続き誰かよろ。

これ以上正確にしようとするなら構文解析しないと無理かな？
クライアントサイドJSをnode.jsでテストする

#ゴール
クライアントサイドJavaScriptの、とくにDOMとか触らない部分をnode.jsでテストするのがゴールです。バッドノウハウかもしれませんが、大げさな作業もいらないので、軽くやるくらいなら問題無いと思います。

#前提条件

- npmインストール済

#作業

まずプロジェクト作ります。

```bash
$ mkdir hello-node
$ cd hello-node
$ npm init
```
`npm init`後対話形式でプロジェクトの設定を聞かれますが、連打して終わせます。次にtestするために`mocha`を`npm install --save mocha`でインストールします。すると、package.jsonは次のようになります。

```json
{
  "name": "hello-node",
  "version": "0.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "mocha": "^3.2.0"
  }
}
```
`npm test`でmochaがtestディレクトリにあるテストを実行するようにpackage.jsonを書き換えます。

```json
@@ -4,7 +4,7 @@
   "description": "",
   "main": "index.js",
   "scripts": {
-    "test": "echo \"Error: no test specified\" && exit 1"
+    "test": "./node_modules/.bin/mocha test"
   },
   "author": "",
   "license": "ISC",
```

test用のファイル`calc-test.js'をtestディレクトリに作ります。

```js
var assert = require("assert");

describe("calc", function() {
  it("add", function() { assert.equal(4, 1 + 3);});
  it("sub", function() { assert.equal(3, 4 - 1);});
  it("sub_", function() { assert.equal(2, 4 - 1);});
});
```
`npm test`するとちゃんとテストが走って、次のように標準出力されます。

```
> mocha test



  calc
    ✓ add
    ✓ sub
    1) sub_


  2 passing (7ms)
  1 failing

  1) calc sub_:

      AssertionError: 2 == 3
      + expected - actual

      -2
      +3
```

testが実行できることが確認できました。ここでsrcディレクトリを作って、そこに最終的にクライアントサイドで使う予定のjsファイル(ファイル名は`bird.js`)を作ります。

```js
var Bird = function() {};
Bird.prototype.say = function() {
  return "ka-ka-";
};

try { module.exports = Bird;} catch(e) {};
```

ブラウザには`module`なんて編集は定義されてないので、try-catchでエラーを黙らせます。それでは、これをテストするファイル`bird-test.js`を作ります。

```js
var assert = require("assert");
var Bird = require("../src/bird");
describe("animal", function() {
  it("say", function() {
    assert.equal("ka-ka-", new Bird().say());

  });
});
```
`npm test`すると、`bird-test.js`で定義したテストも実行されて、次のように標準出力されます。

```
> mocha test



  animal
    ✓ say

  calc
    ✓ add
    ✓ sub
    1) sub_


  3 passing (7ms)
  1 failing

  1) calc sub_:

      AssertionError: 2 == 3
      + expected - actual
```

最後に`hello-node`ディレクトリ上に次のHTMLファイルを作ってブラウザで開きます。

```html
<html>
  <head>
  <title>hello</title>
  <script src="./src/bird.js"></script>
  </head>
  <body>
  </body>
</html>
```
ディベロッパーツールのコンソールで動作することを確認します(画像はChrome)。
<img width="262" alt="d2f26ccd39c9624aaba1fe8479a98b5c.png" src="https://qiita-image-store.s3.amazonaws.com/0/227/4c8d244d-72e6-82d8-5d17-9cb9dae8b561.png">
このときのディレクトリの構成は次のようになっています。

```
.
├── index.html
├── node_modules
│   └── mocha
├── package.json
├── src
│   └── bird.js
└── test
    ├── bird-test.js
    └── calc-test.js
```
Let's Encryptを使ってSSL証明書を自動更新する(AWS/Amazon Linux/Apache)

#Let's Encryptとは
詳しい説明は[こちら](https://letsencrypt.jp/)。要は、

- 無料で
- 自動更新できる
- SSL証明書導入システム

#環境
- AWS Amazon Linux
- Apache 2.4.23

#手順
全部rootでやってますが、適宜読み替えてください。
##Let's Encryptのインストール
```sh:terminal
sudo curl https://dl.eff.org/certbot-auto -o /usr/bin/certbot-auto
sudo chmod 700 /usr/bin/certbot-auto
```
あるいは[各種パッケージ管理システムを使ってインストール](https://letsencrypt.jp/usage/install-certbot.html)。

##証明書の作成
```sh:terminal
sudo /usr/bin/certbot-auto certonly --webroot -w /var/www/html --email test@example.com --debug -d test.example.com
```
- 必要があれば、関係するパッケージが更新・インストールされる。その場合は、再度上のコマンドを入れないといけないかも。
- dオプションでドメインを指定するが、`-d example.com -d test.example.com`のように複数指定できる。最初に記述したドメインがコモンネームになる。
    - ちなみに、指定するすべてのドメインは、このサーバに向いたAレコードを持っていないといけない。
    - wオプションでドキュメントルートディレクトリを指定する。ドメインごとに別のドキュメントルートディレクトリを指定したいときには、-dオプションの直前に-wオプションを書けば良い。
- すべて完了すると、 下記のパスに証明書と鍵が発行される。

```
/etc/letsencrypt/live/test.example.com/fullchain.pem 
/etc/letsencrypt/live/test.example.com/privkey.pem
```
##証明書の指定
ここは、通常のApacheの指定と変わらない。nginxでも同様でしょう。例えば下記のような感じ。

```sh:terminal
sudo vi /etc/httpd/conf.d/ssl.conf
```

```text:/etc/httpd/conf.d/ssl.conf
SSLCertificateFile /etc/letsencrypt/live/test.example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/test.example.com/privkey.pem
```

で、サーバ再起動。ブラウザで開いて確認しましょう。

```sh:terminal
sudo service httpd restart
```

##自動化
Let's Encryptは３ヶ月しか有効期限がないので、自動更新するとよい。更新のためのコマンドをcronする。
まず、下記のコマンドが正常に動作し、証明書が更新されるかをテスト。

```sh:terminal
sudo /usr/bin/certbot-auto renew --post-hook "sudo service httpd restart"
```

renewは、すべての証明書を更新するコマンド。--post-hookオプションで指定したコマンドは、renew後に実行される。ただし、renewは期限が迫らないうちは、実行がスキップされ、その場合はpost-hookも実行されない。
いまは証明書を発行したばかりなので、下記のように表示されれば、問題なし。

```sh:terminal
-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/test.example.com.conf
-------------------------------------------------------------------------------
Cert not yet due for renewal

The following certs are not due for renewal yet:
  /etc/letsencrypt/live/test.example.com/fullchain.pem (skipped)
No renewals were attempted.
No hooks were run.
```

OKなら、cronに登録する。まずcronが動いているか確認しよう。

```sh:terminal
/etc/rc.d/init.d/crond status
```

cronに登録するファイルを作成し、以下を記入する。
※`crontab -e`は[つかっちゃだめ](http://d.hatena.ne.jp/ozuma/20120711/1342014448)。ぜったい。

```sh:terminal
sudo vi /etc/cron.d/letsencrypt
```

```text:/etc/cron.d/letsencrypt
00 16 * * 2 root /usr/bin/certbot-auto renew --post-hook "service httpd restart"
```
この例では、毎週火曜の１６時にrenewが起動する。
設定が終わったら、実際に起動して更新されるか、期限３０日前の火曜に確認しよう。


# ちなみに最近は…
Wordpressを構築するときなどは、上記のようなゼロからの構築はあんまりしていなくて、
[Kusanagi](https://kusanagi.tokyo/)のプロビジョニング過程で自動的にLet's Encryptが設定される、というのを利用しています。超ラク。
Kusanagiは無料、簡単、速いという三拍子揃っていて素晴らしいのでWordpress構築時にはみんな使うと良いと思う。
Rustで実行時間の計測

## 最初に
`#[bench]`使えとか言われそうですけど、stable でも使えるし許して！ :stuck_out_tongue_closed_eyes:
※`rustc 1.16.0 (30cf806ef 2017-03-10)` (stable) で動作確認しています。

## やってみる
#### 特に何も考えず
```Rust:test.rs
use std::time::{Duration, Instant};
use std::thread::sleep;

fn main() {
  let start = Instant::now();
  // 1.234秒休んでみる
  sleep(Duration::from_millis(1234));

  let end = start.elapsed();
  println!("{}.{:03}秒経過しました。", end.as_secs(), end.subsec_nanos() / 1_000_000);
  // 1.234秒経過しました。
}
```
[std::time::Instant::now()](https://doc.rust-lang.org/std/time/struct.Instant.html#method.now)で計測開始時間を取得。
[elapsed()](https://doc.rust-lang.org/std/time/struct.Instant.html#method.elapsed)で計測開始からの経過時間を取得という流れです（形式は[std::time::Duration](https://doc.rust-lang.org/std/time/struct.Duration.html)）。
Durationはas_secsで秒を、subsec_nanosで秒未満の経過時間をナノ秒（1ナノ秒＝1/1,000マイクロ秒＝1/1,000,000ミリ秒）単位で取得します。
簡単ですね！ :blush:

#### マクロにしてみる
```Rust:test2.rs
use std::time::{Duration, Instant};
use std::thread::sleep;

macro_rules! measure {
  ( $x:expr) => {
    {
      let start = Instant::now();
      let result = $x;
      let end = start.elapsed();
      println!("計測開始から{}.{:03}秒経過しました。", end.as_secs(), end.subsec_nanos() / 1_000_000);
      result
    }
  };
}
fn main() {
  let x = 824;
  measure!({
    sleep(Duration::from_millis(x));
  });
  // 計測開始から0.824秒経過しました。
  // measure!(sleep(Duration::from_millis(x))); <- これでも可
}
```
#### ベタ書きなたらい回し関数で計測（上記マクロを使用）
```Rust:tarai.rs
fn tarai(x: i32, y: i32, z: i32) -> i32 {
  if x <= y {
    return y;
  } else {
    tarai(tarai(x - 1, y, z), tarai(y - 1, z, x), tarai(z - 1, x, y))
  }
}
fn main() {
  // Rustではブロックは式なので複文でも問題なし。
  let tarai_result = measure!({
    println!("たらい回し始め！");
    tarai(15, 10, 0) // <- この行に;（セミコロン）を付けてしまうと、
                     //    計測ブロックが()を返す＝tarai_resultの値が()になるので注意！
  });
  // 結果も受け取れます。返却値がある関数を計測しやすくなるかな？？
  println!("たらい回した結果は{}でした。", tarai_result);
}
```
ansible_localの「`playbook` does not exist on the guest: ...」を何とかする方法


Windows環境のvagrantでansible_localを使うときには以下のような書き方をするかと思います。

```rb:Vagrantfile
 : 
 config.vm.provision "ansible_local" do |ab|
   ab.playbook = "provision/playbook.yml"
 end
 :
```

すると以下のようなエラーに遭遇するはずです。

```bash
$ vagrant provision
==> default: Running provisioner: ansible_local...
`playbook` does not exist on the guest: /vagrant/provision/playbook.yml
```

これを解決するにはVagrantfileに以下のフォルダー同期設定を追加すると良いです。

```rb:Vagrantfile
  config.vm.synced_folder ".", "/vagrant"
```
【エラー】The program yum-complete-transaction is found in the yum-utils package

# はじめに
yum install しようと思ったら、表記のエラー？が出た！
一応このままでのインストールはできたけど。。。。
気になるので少し調べました！


# 原因
**実行中のyumのトランザクションが残っていることが原因でした。。。**
そういえば、最近yum updateしたらセッション切れてそのまま放置してた。。。
NW障害で、yumの処理も途中になっていたわけでした・・・！


# 対処法
**トランザクションを終了する！！**

1.yum-utilsをインストールする（一応エラー？の箇所も載せてます↓）

```
# yum install yum-utils

読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * epel: ftp.riken.jp
 * extras: ftp.iij.ad.jp
 * ius: mirrors.kernel.org
 * updates: ftp.iij.ad.jp
依存性の解決をしています
There are unfinished transactions remaining. You might consider running yum-complete-transaction, or "yum-complete-transaction --cleanup-only" and "yum history redo last", first to finish them. If those don't work you'll have to try removing/installing packages by hand (maybe package-cleanup can help).
The program yum-complete-transaction is found in the yum-utils package.
```

2.トランザクション処理コマンド実行！！
実行すると、なんかなってる！！

```
# yum-complete-transaction --cleanup-only

読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * epel: ftp.riken.jp
 * extras: ftp.iij.ad.jp
 * ius: mirrors.kernel.org
 * updates: ftp.iij.ad.jp
Cleaning up unfinished transaction journals
Cleaning up 2017-03-20.20:47.53
```

この後になにかyum install してみて、何も表示されなければOK!!
Google Cloud Video Intelligence API を試す。

## はじめに

　元々GoogleではCloudVisionという画像解析用APIが提供されていましたが、今回は動画解析APIが公開されました。（ベータ版）
　アルファ版の利用には申請が必要ですが、デモ版であれば特に登録不要で利用可能です。
早速試してみましょう。

## デモ版

　デモ版は下記リンクから利用可能です。
[Cloud Video Intelligence](https://cloud.google.com/video-intelligence/)

　下記画像のAnimalsはデモ版用に提供されている動画なのでそのまま利用できます。これを用いて分析すると「Labels」/「Shots」/「API」の三種類の結果が出力されます。

<img width="1362" alt="スクリーンショット 2017-03-21 午後7.25.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/63356/c4ad5ce8-a3f7-ebaa-c46a-b2e2fd7815d8.png">

　
#### Labels
　Labelsは動画全ての中で得た要素とその信頼度を表すスコアです。
<img width="1195" alt="スクリーンショット 2017-03-21 午後7.27.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/63356/edd03206-8fff-fac8-8649-c8fe9eb7dc0e.png">

#### Shots
　Shotsは動画の中でシーンが切り替わる毎に、自動で区切られそのシーンごとに要素と信頼度を表すスコアが出力されます。これはすごい！
<img width="1199" alt="スクリーンショット 2017-03-21 午後7.27.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/63356/6d1aa4a8-1d72-74fe-f70d-65f3b8a75d2c.png">

#### API
　こちらは実際に使用する際のAPIへのリクエストと、レスポンスが表示されます。
<img width="1204" alt="スクリーンショット 2017-03-21 午後7.27.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/63356/cbed4c58-621d-9e2d-b54a-0208e2c73f8c.png">

## 別の動画を試す

　GoogleCloudStorageへの登録は必要ですが、自分で用意した動画を試すことも可能です。GoogleCloudStorageにアップロード動画リンクのバケット名以下をコピーして「Custom Google Cloud Storage」のURL欄に貼り付けます。
　**※分析を行うためにはGoogleCloudStorageにアップロードした動画を必ず公開状態にする必要があります。**

　今回は、下記動画を試してみましょう。
[検証用動画](https://storage.googleapis.com/sample-contents/peoplemarket.mp4)


#### Labels

　人間が見ても違和感がないレベルで、出力されていますね。またMetropolitan area, Urban areaが出力されていることから、画像のオブジェクト単体で判断しているわけではなさそうです。
　
<img width="1177" alt="スクリーンショット 2017-03-21 午後8.03.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/63356/6e543ed5-73bd-8242-e200-84962f8c3da2.png">

#### Shots
　
　これは動画のシーンが、遠目からの交差点を写したシーンから、アップでのシーンに切り替わる瞬間の２枚を示したものですが、「Shot Changes」にもきっちりと認識されています。
　それぞれの「Shot Labels」を比較すると、取得したラベルも異なっています。
　面白いのが、後者のシーンで「Taxicab」が取得できていますが、パッと見るとタクシーは出現していないように見えます。しかしよく見ると動画5秒付近で、三輪タクシーが横切っていることが確認できます。これは一般的なタクシー（車）ではなくバイクで牽引しているようなものなので、おそらく物体の形状からでなく文字列抽出も行って判断しているんでしょうか。

<img width="1181" alt="スクリーンショット 2017-03-21 午後8.04.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/63356/474274b2-145d-9044-dab8-eb1f30c9801b.png">
<img width="1176" alt="スクリーンショット 2017-03-21 午後8.04.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/63356/58d9fe82-9670-0dcc-bfb7-1695f1cfa23e.png">

## 今後

　特定のケース、例えば「動画が短い」かつ「対象オブジェクトが少ない」など条件が重なると全く取得できない場合もありましたが、殆どの動画に対してはすぐにでも実用可能なレベルで精度が高いと感じました。
　既にアルファ版の申請開始しているので、興味のある方は是非申請して利用してみてください。
CSSで斜めのボーダーをつくる


こういうボーター付きのボタンをCSS onlyで作りたい場合。
```linear-gradient```を応用する。

![btn.png](https://qiita-image-store.s3.amazonaws.com/0/77729/ba1fabcb-46ef-ca61-e174-01bf6e462699.png "btn.png")

```CSS:button.css
.button{
	background: repeating-linear-gradient(45deg, #145e99, #145e99 10px, #088eb6 10px, #088eb6 20px);
}

```

サイズ指定の意味はこんな感じ。0px~10pxが濃い青（#145e99）で、10px~20pxを薄い青（#088eb6）で指定している。

![btn2.png](https://qiita-image-store.s3.amazonaws.com/0/77729/f6e01591-a52a-d15c-672e-d15a635e72cb.png "btn2.png")


`45deg`を`90deg`や`180deg`にすると、ボーダーの向きを変えることができる。


## ボーダーが1pxの場合/間隔がずれる場合

下のようにずれる場合は、%とbackground-sizeでボーダーの間隔を指定する。

![btn3.png](https://qiita-image-store.s3.amazonaws.com/0/77729/cac081b0-f3f9-771e-04f5-80cb9aa262aa.png "btn3.png")

（正）

```CSS:button.css
.button{
	background-image: linear-gradient(-45deg, #145e99 25%, #088eb6 25%, #088eb6 50%, #145e99 50%, #145e99 75%, #088eb6 75%, #088eb6);
	background-size: 4px 4px;
}

```

こうすることで端数が出ず、等間隔のボーダーが作れる。



### 参考
https://css-tricks.com/stripes-css/
http://stackoverflow.com/questions/23878398/diagonal-stripes-in-css-that-are-1px-wide
Cloud9で+Python(2.7)+Flask+SQLAlchemy+MySQL環境セットアップ

Cloud9にデフォで入っているPython2.7を使います。(事情あってあえて3を使いません)
MySQLもデフォで入っているやつを使います

#まずはインストール
```
$ sudo pip3 install virtualenv
$ sudo pip install flask
$ sudo pip install flask-sqlalchemy
$ sudo pip install flask-wtf
$ sudo apt-get update
$ sudo apt-get install python-msqldb
$ sudo easy_install mysql-python
```
https://gist.github.com/gothedistance/ab3f16ac7f9fff73738b53c7e7a5d1e5
https://community.c9.io/t/python-mysqldb-import/10284
http://yuizho.hatenablog.com/entry/2013/06/26/012044

#MySQL-CTLでMySQLに接続
###起動
```
$ mysql-ctl start
```
###ログイン
```
$ mysql-ctl cli
```
###ストップ
```
$ mysql-ctl stop
```
http://qiita.com/ao_love/items/31b660ab53bee959c940


#文字コード回り
Python(2.7)はこれが一番面倒でした。Python3はデフォでutf8なのでこの作業は必要ありません

###DBデフォルト文字コード確認
```
$ show variables like 'character%';
```
###DBデフォルト文字コード変更
```
$ alter database DB名 default character set utf8;
$ set character_set_server = utf8;
```
http://interu.hatenablog.com/entry/2013/11/19/120322
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1438139079

###テーブルに対して文字コード変更
```
$ alter table テーブル名 default character set utf8;
```
http://kzworks.at.webry.info/200903/article_14.html


###全てのpythonファイルに文字コード指定
pythonファイルの冒頭に追加
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-

http://uxmilk.jp/8851
http://osksn2.hep.sci.osaka-u.ac.jp/~taku/osx/python/encoding.html

###全てのpythonファイルで文字列を扱う際は頭にuをつける
http://stackoverflow.com/questions/38494772/flask-unicodedecodeerror


#DB URI設定 
pythonファイル冒頭でimport osした後

servername : os.getenv('IP')
password:''(空パスワード)
username: os.getenv('C9_USER')
dbport:3306
database: つくったDB名


http://kzky.hatenablog.com/entry/2015/07/05/Flask-SQLAlchemy
https://community.c9.io/t/setting-up-mysql/1718
http://stackoverflow.com/questions/33790932/cloud9-connecting-a-mysql-database-to-python
Stripeでプラン情報をまとめて管理する


## プランの一括作成

`stripe.plans.create()`でプランを作成できるので、forEachとかでまわせば一気に複数のプランを投入できる。


```js
var stripe_secret = "sk_test_XXXXXXX"
var stripe = require("stripe")(
  stripe_secret
)


var plans = [{
  amount: 5000,
  interval: "month",
  name: "[TypeA]Basic",
  currency: "jpy",
  id: "typea_basic",
  metadata: {
    'cat_description': '基本的なプランです。',
    'cat_name': 'TypeAプラン',
    'transfer': '50GB',
    'site_limits': '1',
    'short_name': 'Basic'
  }
},{
  amount: 50000,
  interval: "month",
  name: "[TypeA]Advanced",
  currency: "jpy",
  id: "typea_advaned",
  metadata: {
    'cat_description': 'ワンランク上のプランです。',
    'cat_name': 'TypeAプラン',
    'transfer': '100GB',
    'site_limits': '2',
    'short_name': 'Advanced'
  }
},{
  amount: 40000,
  interval: "month",
  name: "[TypeB]Advanced",
  currency: "jpy",
  id: "typeb_advaned",
  metadata: {
    'cat_description': 'ワンランク上、サイト数に特化したプランです。',
    'cat_name': 'TypeBプラン',
    'transfer': '50GB',
    'site_limits': '10',
    'short_name': 'Advanced'
  }
}]

plans.forEach(function(plan,i){
  stripe.plans.create(
    plan,
    function(err, customer) {
      if (err) {
        console.log(err)
      }
    }
  )
})
```


## プラン一覧を取得する
`stripe.plans.list()`を使ってStripeに登録されているプラン情報を取得できる。

```js
var stripe_secret = "sk_test_XXXXXXX"
var stripe = require("stripe")(
  stripe_secret
)


stripe.plans.list(
  {},
  function(err, plans) {
    if (err) {
      console.log(err)
    }
    plans.data.forEach(function(plan, i){
      console.log(plan.name)
      price = plan.amount.toString().replace(/([0-9]+?)(?=(?:[0-9]{3})+$)/g , '$1,')
      console.log(price + ' ' + plan.currency.toUpperCase())
      console.log(plan.metadata.cat_description)
      console.log('')
    })
  }
)
```

### 実行結果
```bash
$ node index.js
$ node index.js 
[TypeA]Basic
5,000 JPY
基本的なプランです。

[TypeB]Advanced
40,000 JPY
ワンランク上、サイト数に特化したプランです。

[TypeA]Advanced
50,000 JPY
ワンランク上のプランです。

```

### Tips:価格は「数字」＋「通貨単位」で返ってくる
価格は`plans.data[].amout`に金額が、`plans.data[].currency`に通貨単位が入っています。

なので以下のようにしてやることで、`40,000 JPY`のように表示できます。

``` js
price = plan.amount.toString().replace(/([0-9]+?)(?=(?:[0-9]{3})+$)/g , '$1,')
console.log(price + ' ' + plan.currency.toUpperCase())
```

## 作成時期で絞り込む
`stripe.plan.list()`はプランの作成時期で絞り込むことができます。

```js
stripe.plans.list(
  {
    created: {
      gte: 1490092834
    }
  },
  function(err, plans) {
    if (err) {
      console.log(err)
    }
    console.log(plans)
  }
)
```

`created`の中には`gt`,`gte`,`lt`,`lte`の4つが使えます。
「新しいプランのみ登録可能にしたい場合」や「まだ申し込みさせたくないプランがある場合」などは、この`created`を駆使すると良さそうです。

## その他
planの中にmetadataとして追加情報を与えることができます。
「metadataの値で検索する」ということはできませんが、「一覧で表示して、そこから選んでもらう」というシンプルなモデルであればStripeのmetadataにプランの情報を詰め込んで管理するのも1つかなと思います。

## 検索したい場合は・・・
Stripen APIからplanのJSONを取得して、ElasticsearchやDynamoDBあたりにインデックスさせるバッチを裏側でまわしておくといいかなと思います。

個人的にはプランに関する情報は全てStripe側にもたせて、検索や比較などをさせたい時は都度APIから取った値を別サービスに放り込む形が二重管理になりにくくて良いかなという気がします。
さくらVPS(Ubuntu16.02)で操作ミスにより管理者権限をもつユーザーが皆無になって詰みそうになった話

#環境
・Ubuntu16.02
・さくらVPS

#状況
タイトルの通り、操作ミスにより管理者権限を持つユーザが皆無になってしまいました。sudo実行ができず、しまいにはsshでリモートアクセスもできなくなってしまい、頭が真っ白の状態です。

#操作ミスの内容

```
usermod -G sftp adminUser
```

のようなコマンドでuserのグループを上書きしてしまったことが原因です。
sudoグループの権限が上書き抹消されてしまい、adminUserのsudo権限が失われてしまいました。

#困ったこと
シングルユーザーモードで起動すれば、root権限でターミナルを実行できるわけですが、さくらVPSでシングルユーザーモードの起動方法が分かりませんでした。まずGRUBが立ち上がらないので、にっちもさっちもいかない状態が続きました。

なお、CentOSであればさくらの[公式サイトで解説](https://help.sakura.ad.jp/hc/ja/articles/206055782-%E3%81%95%E3%81%8F%E3%82%89%E3%81%AEVPS-CentOS-%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%AB%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%A2%E3%83%BC%E3%83%89)があるのですが、Ubuntuはデフォルトではないので、解説なしです。メールにて問い合わせをしましたが、自己責任であり、サポートはしかねます、、という回答でした（当然の対応です（泣）)

#対処

##対処の手順
対処の手順としては以下の流れです。
1)GRUBを起動する
2)Advanced Option for Ubuntuを編集する
3)recovery mode 
4)root権限でユーザー権限を変更
5)復活

以下、詳細

##1)GRUBを起動する

1-1)さくらVPSのコントロールパネルにアクセス。
1-2)強制再起動
1-3)以下２つのコンソールを両方立ち上げます。
 ①VNCコンソール（HTML5版)
 ②シリアルコンソール(β版)
1-4)VNCコンソールの方で、GUIから「再起動」。画面右上の設定からです。
1-5)再起動時にシリアルコンソールを見ていると、GRUBが立ち上がります。こちらで作業をします。(GRUBは一定時間経過すると消えてしまうので早めに下記2-3までの作業をする）

※もっと良い方法があるかもしれません。。。

##2)Advanced Option for Ubuntuを編集する

2-1)GRUBを立ち上げる
2-2)「Advanced Option for Ubuntu」にカーソルを合わせる
2-3)キーボードで「e」を押す
2-4)編集画面が現れるので「ro」と書いてある部分を全て「rw」に変更する(私の場合は計6箇所）
2-5)末尾に「linux single init=/bin/sh」を追記
2-6)「Ctrl + X」を押す

▼参考URL
[Ubuntu10.04でシングルユーザーモードでログインする方法](http://blog.kakakikikeke.tk/2012/04/ubuntu1004.html)

##3)recovery mode
recovery　modeを実行。

##4)root権限でユーザ権限を実行

4-1)recovery　mode実行後は、VNCコンソールの方を見る
4-2)recovery modeでrootを選択
4-3)画面下部にroot権限でコンソールが立ち上がる
4-4)usermodかgpasswdでユーザーに権限を追加。

▼例

```
usermod -G adm,dialout,cdrom,plugdev,lpadmin,sudo,<userName>
```

※2-3〜２−５の作業をしない場合、この段階でエラーが発生します。エラー内容は、「cannot lock /etc/passwd; try again later.」で/etc/passwd/を編集できない状態です。これは、コンソールをreadonlyで起動していることが原因で、2-3〜２−５の処理で書き込み権限を付与しています。

4-4)その後再起動。

##5)該当ユーザでアクセスし、sudo実行できることを確かめる。復活！
cellForRowAtで高さの確定するUITableViewCellの高さをUITableViewAutomaticDimensionで確定する

UITableViewCellの高さをAutolayoutで確定させる場合、UITableViewの高さ系のdataSourceにUITableViewAutomaticDimensionを指定します。
この方法の問題は、
`func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell`
の中で高さの変わりうる値を渡した場合にその値を考慮しない高さになることです。
例えば複数行を想定したUILabelのあるUITableViewを作った場合

```swift
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(indexPath: indexPath)!
    cell.label = multiLineText
    return cell
}
```

のように指定しても、セルの高さは1行の時の高さが返ってしまいます。
このようになるのは、`cell.label`の代入タイミングから高さの計算タイミングまでにセルのレイアウトが更新されないことにあります。

多くの場合は


```swift
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(indexPath: indexPath)!
    cell.label = multiLineText
    cell.layoutIfNeeded()
    return cell
}
```

のようにcellの代入タイミングで更新をかけていると思います。
しかし、この方法にも問題があります。
それは一回目の横幅が想定するよりも小さい値になることです。

実際にprintを仕込むと分かりやすいのですが、

```swift
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(indexPath: indexPath)!
    cell.label = multiLineText
    print(cell.bounds)
    print(cell.contentView.bounds)
    cell.layoutIfNeeded()
    print(cell.bounds)
    print(cell.contentView.bounds)
    return cell
}
```

のログを見ると

```
//1回目
(0.0, 0.0, 320.0, 48.0)
(0.0, 0.0, 320.0, 47.6666666666667)
//2回目
(0.0, 0.0, 414.0, 45.0)
(0.0, 0.0, 414.0, 44.6666666666667)
```

と表示されています。（iPhone7p）
つまり一回目は横幅320px、2回目は414pxの横幅として計算されているのです。
これが一見問題にならないのは、高さは3px程しか変わらないためです。
より高いセルやiPadでの検証時には気がつくことが多いと思います。

これはdequeueReusableCellが初回は生成、2回目からはリサイクルをする挙動のためで生成直後はTableViewに貼られていないのでlayoutIfNeededを呼んでも意図したサイズにならないことが原因です。

# 解決策

要するにはセルの生成から高さの計算までの間にセルを正しいサイズにすれば良いのですが、それを行えるのがUItableViewCell側の
`systemLayoutSizeFitting(_ targetSize: CGSize, withHorizontalFittingPriority horizontalFittingPriority: UILayoutPriority, verticalFittingPriority: UILayoutPriority) -> CGSize`
になります。
このメソッドはautolayout計算後のサイズを返すメソッドで、これをorverrideしサイズを計算する前に横幅を合わせてあげれば良いわけです。
具体的には以下のようになります。

```
  override func systemLayoutSizeFitting(_ targetSize: CGSize, withHorizontalFittingPriority horizontalFittingPriority: UILayoutPriority, verticalFittingPriority: UILayoutPriority) -> CGSize {
    contentView.bounds.size = targetSize
    contentView.layoutIfNeeded()
    return super.systemLayoutSizeFitting(targetSize,
                                         withHorizontalFittingPriority: horizontalFittingPriority,
                                         verticalFittingPriority: verticalFittingPriority)
  }
```

targetSizeの横幅はセルの乗るUITableViewの横幅を含んでいるので一度このサイズにcontentViewをセットしたあと、layoutIfNeededを呼びます。
この時点で正しいセルのサイズになっているので、ここでsuperのsystemLayoutSizeFittingを呼べば正しく計算されたサイズが返されます。
UITableViewAutomaticDimensionはこの値を参照して高さを計算するので、これで意図した動作になるはずです。
[React] Warning: `value` prop on `input` should not be null.

## Webコンソールで警告がでた

> Warning: `value` prop on `input` should not be null. Consider using the empty string to clear the component or `undefined` for uncontrolled components.

```js
<input className="form-control"
       type="text"
       name="name"
       value={this.state.company.name}
       onChange={this.onChangeValue}
```
原因は上記フォームの `this.state.company.name` が `undefined` になっていた点
つまり、value属性に 'undefinded' を入れるなということ。

```js
  getInitialState: function() {
    return {
      company: {
        name: ''
      }
    }
  }
```
`getInitialState` で初期値で `''`（空文字）を入れて、value属性に `undefined` が入らないようにした。
新元号対応の勘所

#入力

- [ ] 和暦固定フィールド(年のみ入力)
- [ ] 旧元号がいつまで利用できるのか(経過措置など)

#演算

- [ ] 西暦変換後計算しているか
- [ ] 複数元号のある項目（例：誕生日）のソートは問題ないか

#出力

- [ ] 印字済みの「平成」という文字の消し方（*****,─── など）
- [ ] 「1年」なのか「元年」なのか

#OS

- [ ] アップデートがかかる前後で動作の変更はないか

#サードパーティ

- [ ] 元号変更に対応しているか

#オーバーレイ（印字済み帳票）

- [ ] 印字済みの「平成」という文字の消し方（*****,─── など）
- [ ] 1.明治 2.大正 3.昭和 4.平成 5.ＮＮ←これの発注

#ないと思うけど...

- [ ] 元号略称の衝突（新元号略称がＭＴＳＨのどれかになる）のリスク

----

----



天皇の退位等に関する皇室典範特例法について
http://www.kantei.go.jp/jp/headline/taii_tokurei.html

Japan New Era Name Support Blog (Microsoft)
https://blogs.technet.microsoft.com/jperablog/

Era Handling for the Japanese Calendar　
https://msdn.microsoft.com/en-us/library/windows/desktop/ee923790.aspx

1. 新元号が確定
2. 新元号のグリフ (合字)
3. 符号位置の確定
4. 照合順序の更新
5. ICU (International Component for Unicode) の更新
6. グリフの作成
7. フォントの更新
8. アプリケーション、ツールの更新
PHP バージョン確認

コマンドプロンプトから
##**php -v**
<pre>
takahashi@TAKAHASHI-HP c:\users\takahashi\desktop\pleiades\xampp
# php -v
PHP 5.4.19 (cli) (built: Aug 21 2013 01:12:03)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
    with Xdebug v2.2.3, Copyright (c) 2002-2013, by Derick Rethans
</pre>

PHPから
##**phpinfo();**
<?php
phpinfo();
?>
![2017032201.png](https://qiita-image-store.s3.amazonaws.com/0/95187/7ee58915-1af4-dfc1-8abd-08befce20541.png)
Stack View

メモ書きですのであしからず
#stack viewのシンプルな使い方
・まずViewを置きます
<img width="1440" alt="スクリーンショット 2017-03-21 17.50.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/8109/57e0fcbb-dd3c-fc3b-719f-b59a1c54a156.png">

・３つぐらい並べます
<img width="1440" alt="スクリーンショット 2017-03-21 17.51.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/8109/599b205f-d079-4d38-eb38-457f703f9fee.png">

・３つのViewを選択状態にして下のアイコンを押します
<img width="1440" alt="スクリーンショット 2017-03-21 17.51.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/8109/ee7dffe9-e4af-afc1-d0f8-96466db9d1b7.png">

・するとこんな感じにStackViewになり、その配下にViewが並びます
<img width="1440" alt="スクリーンショット 2017-03-21 17.51.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/8109/158c7805-b9a7-9603-6c06-d9f8f5c66ef0.png">

・このままだとエラーが出るのでViewそれぞれに高さと横幅を設定してあげます
<img width="1440" alt="スクリーンショット 2017-03-21 17.52.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/8109/d555624d-6efe-fceb-7b5e-6ffe1d914176.png">

・ついでにStackView自身の位置も設定します
<img width="1440" alt="スクリーンショット 2017-03-21 17.52.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/8109/3a084677-9aff-c494-cc07-51662fbd4e2b.png">

・ここがStackViewのいいところ、横メニューにある「Spacing」を設定すると・・・
<img width="1440" alt="スクリーンショット 2017-03-21 18.10.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/8109/2b8af5c1-69f8-8abd-1184-6d00b3b2a472.png">

・あら不思議、それぞれの間にマージンが設定されました
<img width="1440" alt="スクリーンショット 2017-03-21 17.53.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/8109/8226aa20-ba7a-2855-205f-eff28aae51da.png">

ほんとの触りですが

##ついでに
縦に並んでいますがこれをそのまま横並びにもできます

・メニューのAxisを選択するとVericalとHorizontalが選べるので、これをHorizontalにすると・・・
<img width="1440" alt="スクリーンショット 2017-03-21 17.55.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/8109/7ddf274f-b820-8f63-ea08-d978c42c939c.png">

・簡単に横にできました
<img width="1440" alt="スクリーンショット 2017-03-21 17.55.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/8109/1ebb7575-ba0d-f827-cca4-ba37e1aec825.png">

簡単ですけど
最初の頃感動した思い出（しみじみ）