OmniAICreator/Qiita-1.07M huggingface dataset:
angularjsでui-layoutを使ってsplit barで画面分割された綺麗なSPAを作る

以前に[Angular Material で split bar を実現する](http://qiita.com/NakagawaAtsushi/items/c3f89a6fa33805d723fd)というしょぼい記事を書いたが、もっと簡単綺麗にスプリットバーを実現するライブラリを発見したので紹介したい。
というか、以前からいろいろあるのは知っていたが、AngularMaterialを使っている以上、余計なライブラリを入れずにMaterialだけで完結させようとしていたが、どうやらPCデスクトップ向けのSPA画面をMaterialの思想に準拠して作るのは多分に無理がある気がしてきたので、よそのライブラリを導入することにした。

---

**ui-layout**
[ui-layout](https://github.com/angular-ui/ui-layout)
angular-uiに属するプロジェクトで、開発が今も続いている。
AngularMaterialとui-routerと同居させてしばらくたつが、とくに副作用なく正常に動作している。

まずライブラリをインストール

```cmd:
bower install angular-ui-layout
```

HTMLのヘッダーで指定

```html:index.html
<script src="bower/angular-ui-layout/src/ui-layout.js"></script>   
<link rel="stylesheet" href="bower/angular-ui-layout/src/ui-layout.css">
```

モジュールで指定

```js:index.js
angular.module('MyApp', ['ui.layout'])
```

お望みのレイアウトを記述

```html:index.html
<div ui-layout="{flow:'row', dividerSize:8, disableToggle:true}"
    style="overflow-x: hidden; overflow-y: hidden;">      
    <div ui-layout-container size="100px" style="overflow-x: hidden; overflow-y: hidden;" ></div>
    <div ui-layout-container="central" style="overflow-x: hidden; overflow-y: hidden;"></div>
    <div ui-layout-container size="10px" style="overflow-x: hidden; overflow-y: hidden;"></div>
</div>
```
これで完成。
ポイントがいくつかある。
一点目はui-layoutに含まれるui-layout-containerのうちどれか一つに"central"を指定すること。ウィンドウ全体をリサイズするとcentralに指定したdivのサイズが変化する。centralがどこにもないと動きがおかしくなる。
もう一点はWindowsではoverflow:hidden;を指定しないとスクロールバーがちらつくので、スクロールバーが必要なdiv以外は全て指定すること。レイアウトを入れ子にしていくとこの現象が顕著になる。もちろんスタイルシートに書いてしまってもいい。

---

以上なのだが、angularMaterialとui-routerとの同居例もあげておく

```html:angularMaterialと同居
    <div ui-layout-container>
        <div layout="row">
            <div flex align="center">hoge</div>
            <div>hage</div>
            <div>hoge</div>
        </div>
    </div>
```
ui-layoutの下でangulaMaterialのlayoutを使っているが全く問題ない。
ちなみにanuglarMaterialのlayoutは横幅を指定するのは便利だが、縦については100%に広げることができない。
よって縦のレイアウトはdividerSize:0のui-layoutで行い、細かい横のレイアウトはanuglaMaterialのlayoutにさせるといい。

```html:ui-routerと同居、親
    <body ng-controller="IndexController">
        <div ui-view></div>
    </body>
```

```html:ui-routerと同居、子
<div ui-layout="{flow:'row', dividerSize:8, disableToggle:true}">      
    <div ui-layout-container size="100px"></div>
    <div ui-layout-container="central">               
        <div ui-view></div>
    </div>
    <div ui-layout-container size="100px"></div>
</div>
```

```html:ui-routerと同居、孫
<div ui-layout="{flow:'column', dividerSize:8, disableToggle:true}">                
    <div ui-layout-container></div>
    <div ui-layout-container></div>
</div>
```
こんなかんじ。
画面の切り替え等含め驚くほど完ぺきに動作してくれる。
圧縮コマンドの代替としての StreamRelay.jar

`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar`
⇔
`StreamRelay.bat`

### 圧縮コマンドの代替

圧縮コマンドは、入力ファイル→(圧縮された)出力ファイルなので、
「local」の入力ソース(実体)にファイル、「remote」の出力ソース(実体)に圧縮ファイルとすればいい

データの方向は、「local」から「remote」なので「Request」。
圧縮は、データを加工することになるので、ストリームの方向は Write方向
よって「remote」の「Request」に、圧縮処理を指定すればいい

つまり、アルゴリズムとして gzip を選択する場合は、

入力ソース(実体)と、出力ソース(実体)を↓のように指定する
`-LocalInputFile a.txt -RemoteOutputFile a.txt.gz`

そして、「remote」の「request」方向に圧縮と↓のように指定する
`-RemoteRequestGZIPCommpress`

よって、gzip圧縮
`gzip.exe a.txt`
⇔
`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 0 -RemotePort 0 -LocalInputFile a.txt -RemoteOutputFile a.txt.gz -RemoteRequestGZIPCommpress`

### 伸張コマンドの代替

伸張コマンドは、(圧縮された)入力ファイル→(伸張された)出力ファイルなので、
「local」の入力ソース(実体)に圧縮ファイル、「remote」の出力ソース(実体)に結果ファイルとすればいい

データの方向は、「local」から「remote」なので「Request」。
伸張は、加工されたデータを元に戻すことになるので、ストリームの方法は Read方向
よって「local」の「Request」に、伸張処理を指定すればいい

つまり、アルゴリズムとして gzip を選択する場合は、

入力ソース(実体)と、出力ソース(実体)を↓のように指定する
`-LocalInputFile a.txt.gz -RemoteOutputFile a.txt.out`

そして、「local」の「request」方向に伸張と↓のように指定する
`-LocalRequestGZIPCommpress`

よって、gzip伸張
`gzip.exe -d a.txt`
⇔
`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 0 -RemotePort 0 -LocalInputFile a.txt.gz -RemoteOutputFile a.txt.out -LocalRequestGZIPCommpress`

### 圧縮/伸張アルゴリズムの一覧とリアルタイム性

ver6.4
- deflate
- GZIP
- BZIP
- Xz
- Pack200
- LZ4
- ZLIB

ZLIBは JDK7 以降の [java.util.zip.Deflater.SYNC_FLUSH](https://docs.oracle.com/javase/7/docs/api/java/util/zip/Deflater.html#SYNC_FLUSH) なので、通信のリアルタイム圧縮に使えると思う

### 圧縮/伸張アルゴリズムの一覧とリアルタイム性(ver8.4以降)

ver8.4以降では、「SYNC_FLUSH」オプションに仕様変更した。

`-RemoteRequestGZIPCommpress=SYNC_FLUSH`

みたいな感じ。

### 圧縮/伸張アルゴリズム(Zlib/Deflate/Gzip)(ver8.4以降)

[ver8.4以降、Zlib/Deflate/Gzip を厳密にした。](http://rocketeer.dip.jp/sanaki/free/free119.htm#DEFLATEZLIBGZIP)

---
### 目次へ戻る

[目次というか最初の一歩](http://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f)
MySQLのみでAES_ENCRYPTによる暗号化と復号と部分一致検索

MySQLのみで、AES_ENCRYPT関数による暗号化と復号を行う方法をまとめます。
また、暗号化されたカラムへの部分一致検索も実施したいと思います。

# 環境
centos 6系
mysqld 5.6系

# テーブル
以下のようなスキーマが前提とします。

```
CREATE TABLE IF NOT EXISTS `customer` (
  `cus_id` int(10) NOT NULL AUTO_INCREMENT COMMENT 'キーID',
  `cus_name` varchar(300) NOT NULL,
  PRIMARY KEY (`cus_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
```

# データの登録
データをパスワードでAES暗号化→保存できるようにHEXで変換します。

```
insert into customer
(cus_name)
values
(HEX(AES_ENCRYPT('山田 太郎', 'password***')));

>以下のようなデータが登録されます。
>cus_id, cus_name
>1, 57A7306667A3E36142D49930278BCF84
```

# 復号してアプリケーションで表示できるように
UNHEX→デコード→utf8に再変換します。

```
select
  convert(
    AES_DECRYPT(UNHEX(cus_name), 'password***')
    USING utf8
  )
from
  customer

>convert( AES_DECRYPT(UNHEX(cus_name), 'password***') USING utf8 )
>山田 太郎
```
復号に成功！

# 部分一致検索
「山田」の部分一致検索を行います。

```
select
  *
from
  customer
where
  convert(
    AES_DECRYPT(UNHEX(cus_name), 'password***')
    USING utf8
  )
  like '%山田%'

>cus_id, cus_name
>1, 57A7306667A3E36142D49930278BCF84
```

上記だと、検索はできたましたが暗号化文字列が出力されます。

# 検索＆復号
上記を組み合わせてみます。

```
select
  convert(
    AES_DECRYPT(UNHEX(cus_name), 'password***')
    USING utf8
  )
from
  customer
where
  convert(
    AES_DECRYPT(UNHEX(cus_name), 'password***')
    USING utf8
  )
  like '%山田%'

>convert( AES_DECRYPT(UNHEX(cus_name), 'password***') USING utf8 )
>山田 太郎
```

これで部分一致検索と複合ができました。
MySQL側でやるべきか＆性能面で問題ないかは検証が必要かと思います。

# 参考
https://dev.mysql.com/doc/refman/5.6/ja/string-functions.html
https://dev.mysql.com/doc/refman/5.6/ja/encryption-functions.html
ASP.NET Core アプリでVueJsを使います


## 既存コンポーネント

```
1. Visual Studio
2. .Net Core SDK
3. vue-cli
```

## ASP.NET Core ウェブアプリのプロジェクト作成

Visual studioを開いて、新規Asp.Net Coreウェブアプリプロジェクト作成

![asp.core.png](https://qiita-image-store.s3.amazonaws.com/0/181951/1ac785e3-d188-2bee-3a29-db0b07163414.png)

次は`webpack`を使いますので、`bower`のコポーネントを削除

```
.bowerrc
bower.json
bundleconfig.json
```

## Vueインストール

とりあえず、`vue-cli`をインストールしておきます。

> `nodejs`と`npm`をインストールしていない方は先にインストールのが必要となります。

```bash
$ npm install vue-cli --global
```

では、`vuejs`の基本パッケージを作成しましょう。

```bash
cd [Aps.net Core project folder]
vue init webpack
```

インストール内でデフォルトの設定をします。
アプリを起動してみましょう。

```bash
npm install
npm run dev
```

![vueapp](https://kloudsolutions.files.wordpress.com/2017/02/vuejs-with-aspnet-core-01.png?w=1258)

## VueとAsp.Net インテグレート

両方の設定を更新するのが必要となります。

### Vueの設定

はじめに、`aspnet-webpack`のnpmパッケージをインストールする。こちらは、VueとAsp.netのコミュニケーションが必要なものである

```bash
npm install aspnet-webpack --save
```

インストールが終わったら、`config/index.js`の中身を更新する。`assetsRoot`の設定は`wwwroot`になります

```js
...
module.exports = {
  build: {
    env: require('./prod.env'),
    index: path.resolve(__dirname, '../wwwroot/index.html'), // Set the location of index.html to wwwroot
    assetsRoot: path.resolve(__dirname, '../wwwroot'), // Set the location for compiled static files to wwwroot
...
```

最後は、Asp.Netプロジェクトのrootに`webpack.config.js`を作成する

```js
"use strict";

var isDevBuild = process.argv.indexOf('--env.prod') < 0;
var devConfig = require("./build/webpack.dev.conf");
var prodConfig = require("./build/webpack.prod.conf");

module.exports = isDevBuild ? devConfig : prodConfig;
```

### Asp.Netの設定

`aspnet-webpack`は`aps.net core`の`nuget`パッケージ[Microsoft.AspNetCore.SpaServices](https://www.nuget.org/packages/Microsoft.AspNetCore.SpaServices/)となります。
[Microsoft.AspNetCore.SpaServices](https://www.nuget.org/packages/Microsoft.AspNetCore.SpaServices/)を`nuget`でインストールしましょう。

```nuget
Install-Package Microsoft.AspNetCore.SpaServices
```

最後、設定してみる

```startup.cs
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory oggerFactory)
{
  ...

  if (env.IsDevelopment())
  {
    ...

    // Setup WebpackDevMidleware for "Hot module replacement" while debugging
    var options = new WebpackDevMiddlewareOptions() { HotModuleReplacement = true };
    app.UseWebpackDevMiddleware(options);
  }
  else

  ...

  app.UseMvc(routes =>
  {
    routes.MapRoute(
      name: "default",
      template: "{controller=Home}/{action=Index}/{id?}");

    // Setup additional routing for SPA
    routes.MapSpaFallbackRoute(
      name: "spa-fallback",
      defaults: new { controller = "Home", action = "Index" });
  });
```

では、`debug`してマジックを見て見ましょう。

## 以上の設定がうるさいくてならない方は　⬇︎

```bash
npm install -g yo generator-aspnetcore-spa
npm install -g webpack
mkdir web
cd web
yo aspnetcore-spa
# default setting with (vue)
dotnet run
```

`tada`できますね〜〜〜


--- 
参考：https://blog.kloud.com.au/2017/02/14/running-vuejs-on-aspnet-core-apps/

> 外国人で日本語はそんなに正しくないですね。〜＿〜　誰か直してくれば嬉しです。(；´∀｀)
6. [Solved]K5 仮想ネットワークトラブル解消編

このページは、
FUJITSU Cloud サービス K5 を使ってみる - Qiita
http://qiita.com/ynott/items/a256669c692625c5fd25
の「6. K5 仮想ネットワークトラブル解消編」のページです。

# 1. トラブルが発生していたのは、
「仮想ネットワーク」の部分

![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/9c127186-4ff0-2f8d-7bdf-2498e769c387.png)

http://qiita.com/ynott/items/0071ee9f683513bd5597 で上げていたように、
以下の手順で「(1)内部ネットワークの作成」の部分で詰まるという状況でした。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/563e2fa9-a8e9-fc74-bfbc-0b83c78a3857.png)


サポートデスクに問い合わせて、いくつかのことが分かりました。

1. [仮想ネットワーク作成] --> [サブネット]で「仮想ネットワークアドレス」の指定が甘いとNG
2. [仮想ネットワーク作成] --> [サブネット詳細]でDHCPを有効にして「IPアドレス割当プール」の指定が甘いとNG  

というものでした(バリデーションチェックがいけてなかった。という意味でもありますが)。

こちらの2つについては解消されています(と書いてテストしてみたら微妙に再現するので(笑)、皆さん気をつけましょう)。
＃どうも、APIエラーでも、仮想ネットワークを作りに行っているようだ。

特に2つ目にはまってしまっていて、サブネットの仮想ネットワークアドレスで、CIDRで指定しているのだから、DHCPの割りあてられるIPの可変の部分だけ指定すればいいよね、と思って以下のように指定しました。しかし、この指定はNGのようです(現在はエラーが返るようになっています)。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/45767b6d-485b-dd05-71d6-db7131b20083.png)

# 2. 対応策(サブネット詳細部分)
以下のように指定しましょう(DNSサーバーはお好みで)。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/74d43c77-3713-e777-4ff0-bcc1f98456e8.png)

# 3. UI的な注文

仮想ネットワーク名が、17文字までしか表示されない。それ以上は短縮表示

例えば、east-1a_internal-070 という仮想ネットワーク名を付けたら、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/f0040c40-9a52-97b0-e079-9cd4871ca69d.png)
のように短縮されてしまい、

east-1a_internal-070
east-1a_internal-080
east-1a_internal-090
がどれも同じに見えてしまう...。

名前の表示が広げられるといいのに。
Rmarkdownで日本語PDFを出力する

#はじめに

Rmarkdownで日本語を含むPDFを作成する際、躓きやすいポイントと対処方法を紹介する。

Rmarkdownを未だ導入していない人は
http://gihyo.jp/admin/serial/01/r-markdown/0002
あたりを参考にして欲しい。

RMarkdownを使えば、

-  Markdown記法を中心としつつ、数式にTeX記法、メタデータにYAML記法と、柔軟且つ容易でキレイなテキストの作成が可能
-  Rコードが自動着色される
-  Rコード実行結果の添付される
-  html, docx, pdfなど適宜出力形式を選択できる

といったメリットがある。

このうち、PDFの出力は、TeX環境の事前準備が必要な上、日本語の取り扱いが若干トリッキーなのだ。

#参考にしたWebサイト

-  [miyazakikenji: R Markdown に日本語pdf](https://miyazakikenji.wordpress.com/2015/08/14/r-markdown-%E3%81%AB%E6%97%A5%E6%9C%AC%E8%AA%9Epdf/)
-  [トライフィールズ: Ubuntu,R knitrで日本語のPDFを出力するための設定](http://www.trifields.jp/how-to-set-up-for-outputting-a-pdf-of-the-japanese-at-knitr-in-ubuntu-1404-and-r-1615)
-  [コタの科学日記: pandoc + xelatex で日本語 PDF を作る](http://cotaro-science.blogspot.jp/2017/03/pandoc-xelatex-pdf.html)

#Rmarkdown環境の用意

http://gihyo.jp/admin/serial/01/r-markdown/0002
を参照

#TeX環境の用意

メジャーなTeX環境には

-  TeX Live
    -  世界的に最もメジャー
    -  昨今では日本語組版も十全に行える
-  MikTex
    -  RStudioオススメ
    -  日本語対応はほどほどらしい
-  W32Tex
    -  日本で最もメジャー
    -  日本語組版も安心
    -  インストール後、PATHを通す必要がある(Windows)

などがある。
今回はTeX Live 2016を用いた。
インストーラは日本語でも動き、簡単にインストールできる。
ただし、3時間以上かかるので、時間があるときに行うことを勧める。

#YAMLでLaTeXエンジンを選ぶ

Rmarkdownで利用できるLaTeXエンジンには

-  pdflatex
    -  日本語不可
-  xelatex
    -  日本語可
-  lualatex
    -  日本語可

の三種類。
実用上はxelatexかlualatexとなる。
xelatexはlualatexよりも出力が3倍程度速いらしい(http://cotaro-science.blogspot.jp/2017/03/pandoc-xelatex-pdf.html)

##xelatexを用いる場合

.Rmdファイル**冒頭**に以下のYAMLを記載する。
YAMLには他にもタイトルや著者などのメタデータを記入できる。

```yaml
---
output:
  pdf_document: 
    latex_engine: xelatex 
header-includes: 
  - \usepackage{bookmark} 
  - \usepackage{xltxtra} 
  - \usepackage{zxjatype} 
  - \usepackage[ipa]{zxjafont} 
---
```

ネット上では`  - \usepackage{bookmark}`を読み込まない例も見受けられたが、当方ではこれがないと失敗した。

または、

```yaml
---
output:
  pdf_document: 
    latex_engine: xelatex 
documentclass: bxjsarticle
classoption: xelatex,ja=standard
geometry: no
---
```

でもよい。

##lualatexを用いる場合

.Rmdファイル**冒頭**に以下のYAMLを記載する。

```yaml
---
output:
  pdf_document: 
    latex_engine: lualatex 
documentclass: ltjsarticle 
---
```

#グラフに日本語が含まれる場合

[トライフィールズ: Ubuntu,R knitrで日本語のPDFを出力するための設定](http://www.trifields.jp/how-to-set-up-for-outputting-a-pdf-of-the-japanese-at-knitr-in-ubuntu-1404-and-r-1615)を参照


#.Rmdファイルの文字コード

SJISで特に問題はない。
UTF-8(BOMなし)も使える。
UTF-8(BOMあり)はYAMLを正常に読み込まなくなる。

#レンダリング

```r
require(rmarkdown)
render("test.Rmd", output_format = "pdf_document")
```

とすれば、"test.pdf"ファイルが作成される。
Bluemix IaaS ログイン入り口で、メニュー・バーが異なる件のメモ


この入り口 https://console.ng.bluemix.net/ からログインして、Bluemix IaaS へ進むと SoftLayerから慣れ親しんだ Devices から始めるメニューが表示されません。
![スクリーンショット 2017-05-26 9.33.52.png](https://qiita-image-store.s3.amazonaws.com/0/42829/9cc02874-a291-181a-3852-ba09f82cafbf.png)

Devices や Storage のメニューは、左はしの３本線をクリックすると、Devices から始まるメニューが出ます。
![スクリーンショット 2017-05-26 9.42.03.png](https://qiita-image-store.s3.amazonaws.com/0/42829/6ef109c9-3b4b-af00-db0b-48fed89c7d63.png)

こちら表示例
![スクリーンショット 2017-05-26 9.31.45.png](https://qiita-image-store.s3.amazonaws.com/0/42829/6726cd4b-891a-6377-c4c7-869aa3547a3d.png)


旧SoftLayer の入り口 https://control.softlayer.com/ の 「**Login With IBMid**」からログインした場合は、
![スクリーンショット 2017-05-26 9.33.37.png](https://qiita-image-store.s3.amazonaws.com/0/42829/dd266bf6-60f5-a07b-333c-cea3ca2ed98b.png)

次の画面の様に、トップページに横一列のメニューが表示されます。
![スクリーンショット 2017-05-26 9.33.07.png](https://qiita-image-store.s3.amazonaws.com/0/42829/f15be6d7-e92e-65a8-9cf0-b1cbcf8dd6bf.png)
アニメーション付きのボタンを実装するためのテクニック

林です。

個人的な話ですが10日ほど入院していまして、
入院というのは、人生で初めて経験しましたが、死ぬほど暇なんですね。

暇な時間を使って、dribbbleにありそうなアニメーション付きのボタンを実装してみました。
無事インターネットのある世界に戻ってきたので、公開します。


![LoadingButtoonTop.gif](https://qiita-image-store.s3.amazonaws.com/0/1777/ede4275b-3d99-a37e-c2fa-e1b98a9e9992.gif)

https://github.com/hayashi311/HRProgressButton

# ベースはUIControl

基本的なところから。
自前のボタンを実装する時は`UIButton`ではなく、`UIControl`を継承します。
`UIButton`ではないですよ。`UIControl`です。

自前のUIコンポーネントを実装する時に、機能豊富なクラスを継承すると、不要な機能を殺すために苦労する羽目になりがちです。
必要最小限のクラスを使うのが結局のところ近道になります。

# 押下時の表示変更は`isHighlighted`をトリガーに

`GestureRecognizer`とか、`setAction:`とか使わない
毎回、`isSelected`をトリガーにしようとして、「変わらない...」となりますが、正しくは`isHighlighted`です

この辺り、手を抜くとアプリのクオリティが低く見えるので、面倒でもやったほうが良い。

![LoadingButtoonTap.gif](https://qiita-image-store.s3.amazonaws.com/0/1777/ece3e4d5-8ef2-e7a6-2e9d-cc0cffa312ae.gif)

# ローディング的なアニメーションには`CAReplicatorLayer`

一つの`CALayer`を元に`Layer`を量産してくれる`CAReplicatorLayer`

```swift
replicatorLayer.instanceCount = 3
```

だと
![Indicator3.gif](https://qiita-image-store.s3.amazonaws.com/0/1777/1ffbf387-254e-19f4-b14d-82ba25b04204.gif)

こうで

```swift
replicatorLayer.instanceCount = 10
```

だと
![Indicator10.gif](https://qiita-image-store.s3.amazonaws.com/0/1777/e9630c11-30d8-7c55-3077-4093b69b9730.gif)

こういうことです。

元のLayer追加したアニメーションは、同時に、あるいは指定の時間分ずれてすべての要素に追加されます

同時

```swift
replicatorLayer.instanceDelay = 0
```
![Indicator10sync.gif](https://qiita-image-store.s3.amazonaws.com/0/1777/a8d6cd34-8be9-4373-0096-562049954ba4.gif)

タイミングをずらす

```swift
replicatorLayer.instanceDelay = 0.1
```
![Indicator10async.gif](https://qiita-image-store.s3.amazonaws.com/0/1777/107cf875-f236-4e65-6ca2-0ef80e4bba7d.gif)

便利ですね。

# 表示、非表示の時にも少しアニメーションを入れる

ローディングが始まる時

```swift
// アニメーション前
circleLayer.transform = CATransform3DMakeTranslation(0, 6, 0)
circleLayer.opacity = 0.5
// アニメーション
circleLayer.transform = CATransform3DIdentity
circleLayer.opacity = 0.5
```
![loadingButtonStart.gif](https://qiita-image-store.s3.amazonaws.com/0/1777/b4f41b80-d253-55f0-4727-bf7789308365.gif)

終わる時

![loadingButtonStop.gif](https://qiita-image-store.s3.amazonaws.com/0/1777/4cfbf350-cd5c-228b-3c31-8261c757dbdd.gif)

[画像]
ドットを表示のタイミングで縦に数ピクセルずらしていますが、それだけでそれっぽくなります。
`CAReplicatorLayer`を使っているので、各ドットの表示がずれるのもずるいですね。

# 1度に2つのプロパティを変化させる

経験則ですが、1度に2つのプロパティを変化させるとずるい感じになるんですよね。

ドットはopacityとbounds
![Prop1.gif](https://qiita-image-store.s3.amazonaws.com/0/1777/dc536ce0-8ae3-0cce-5c3e-15ad49ec8305.gif)

タップした時にはtransform(scale)とbackgroundColor
![LoadingButtoonTap.gif](https://qiita-image-store.s3.amazonaws.com/0/1777/ae3aab53-934a-5c86-1427-82053ebe5681.gif)

背景はboundsとbackgroundColor
ドットの表示アニメーションはopacityとtransform(translation)
![loadingButtonStart.gif](https://qiita-image-store.s3.amazonaws.com/0/1777/93bfdd6a-954d-983a-ac7a-ceed562d02fc.gif)


ライブラリとしては未完成ですが、公開しているので遊んでみてください :)


https://github.com/hayashi311/HRProgressButton

![LoadingButtoonTop.gif](https://qiita-image-store.s3.amazonaws.com/0/1777/ede4275b-3d99-a37e-c2fa-e1b98a9e9992.gif)
git 差分ツールをWinMergeにする

# 日付
2017-05-26
# 経緯
Windowsマシンの環境を再構築する時に
まいどまいど設定を忘れるのでメモ。
# .gitconfigに設定します
[user]/.gitconfig
# 以下の内容をコピペ
[user]と[core]は関係ないけどメモなので残しておく。

```
[user]
	name = XXX
	email = XXX@AAA.co.jp
[core]
	editor = code
	autocrlf = false
[diff]
	guitool = WinMerge
[difftool "WinMerge"]
	path = C:/Program Files/WinMerge/WinMergeU.exe
	cmd = \"C:/Program Files/WinMerge/WinMergeU.exe\" -e -u \"$LOCAL\" \"$REMOTE\"
[merge]
	tool = WinMerge
[mergetool "WinMerge"]
	path = C:/Program Files/WinMerge/WinMergeU.exe
	cmd = \"C:/Program Files/WinMerge/WinMergeU.exe\" -e -u -dl \"Original\" -dr \"Modified\" \"$MERGED\" \"$REMOTE\"
[mergetool]
	keepBackup = false
```
特定のDateから指定した日付分のRangeを返させる

Railsのクエリ検索で３ヶ月以内に更新されたものを調べる時に

```.rb
Post.where(updated_at: (date - 3.months)..date))
```

のようなことをよくするので、`Date#range`という `Range`クラスを返すメソッドを定義してみた。

```.rb
class Date
  def range(duration)
    Range.new([(self + duration),self].min, [self + duration, self].max)
  end
end
```

これでさっきの検索が

```.rb
Post.where(updated_at: date.range(-3.months))
```

にできます。
RailsにBootstrapを導入して練習


参考元
http://i-b-c.jp/how/cloud9/rubyrails%E3%81%B8-bootstrap-%E5%B0%8E%E5%85%A5/

http://keruuweb.com/rails-bootstrap-sass%E3%82%92%E5%B0%8E%E5%85%A5%E3%81%99%E3%82%8B/


まず適当に新しいアプリケーションを作成

```
rails new hello_bootstrap
```



bootstrapのgemをインストール
Gemfileを開いてgem追加

```
vi Gemfile
```

``` Gemfile
gem 'bootstrap-sass'
```


```
bundle install
```

app/assets/stylesheets/application.cssを
~/application.scssにリネーム

以下のコードを追加

``` ~/application.scss
@import "bootstrap-sprockets";
@import "bootstrap";
```

続いて
app/assets/javascripts/application.jsに以下のコードを追加

```app/assets/javascripts/application.js
//= require bootstrap-sprockets
```

以上でbootstrapの設定は完了

適当にviewをつくり確認していく

```
rails g controller home top
```

```top.html.erb
<div id="header" style="background:black;">header</div>
<div class="row">
	<div class="col-sm-4" style="background-color:blue">Main 1 </div>
	<div class="col-sm-4" style="background-color:yellow">Main 2 </div>
	<div class="col-sm-4" style="background-color:red">Main 3 </div>
</div>
```

上記のコードはdotinstallから参照
モンテカルロ法で円周率近似

粒子フィルタを調べていたら、モンテカルロ法なるものが出てきました。そこで、基本の勉強にと円周率(pi = 3.1415...)をJavascriptで近似してみました。

[Wikipedia - モンテカルロ法](https://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%B3%E3%83%86%E3%82%AB%E3%83%AB%E3%83%AD%E6%B3%95)

## コード
```javascript:pi.js
const points = process.argv[2];
let innerPoints = 0;
for (var i = 0; i < points; i++) {
  const point = { x: Math.random(), y: Math.random() };
  const distance = Math.sqrt(Math.pow(point.x, 2) + Math.pow(point.y, 2));
  if (distance < 1) innerPoints +=1;
}
const probability = innerPoints / points;
console.log(`pi = ${4 * probability}`);
```

## 実験
### サンプル数 : 1000
```sh
$ node pi.js 1000
pi = 3.072
```

### サンプル数 : 10000
```sh
$ node pi.js 10000
pi = 3.1312
```

### サンプル数 : 100000
```sh
$ node pi.js 100000
pi = 3.14572
```

### サンプル数 : 1000000
```sh
$ node pi.js 1000000
pi = 3.144628
```

### サンプル数 : 10000000
```sh
$ node pi.js 10000000
pi = 3.1401728
```

### サンプル数 : 100000000
```sh
$ node pi.js 100000000
pi = 3.14142492
```

## 結論と思い出
当たり前のことですが、サンプル数を増やすと円周率の近似精度が高くなることが分かります。ところで関係のない話ですが、小学生のころに塾で円周率を暗記する遊びが流行っていたのを思い出しました。今やっとその暗記の努力が日の目をみたように思います。円周率の近似精度が高くなっているのが一目でわかるので。今は`pi: 3.14159265358979323846264338...`と26桁まで思い出すことができました。
【シェル芸奥義】tputを使ってみる【エスケープシークエンス】

シェル芸を極めてみる。

# TL;DR

- echo（POSIX系のターミナル）はエスケープシークエンスで色とか座標とか変えられる
- C言語だとncursesとかが近い
- tputはそのエスケープシークエンスをラップしてくれてる

# echoでエスケープシークエンスって？

シェルのechoにはエスケープシークエンス（特殊文字）で色やカーソルの座標を変えることができます。
たとえば以下のコマンドを実行してみてください。

```shell-session:shell
$ echo -e '\e[31m HelloWorld'
```

ね？赤色になったでしょう。つまりは、バックスラッシュeとmで番号を挟むとそれに対応した文字色や背景色、カーソル位置なんかを弄れたりするのです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/154157/5501557c-ef7f-1ed8-b1e3-93eb34eab679.png)

ちなみに以下をみれば他にもいろいろと弄れることがわかります。色の変更も点滅も下線とかも。

[http://misc.flogisoft.com/bash/tip_colors_and_formatting](http://misc.flogisoft.com/bash/tip_colors_and_formatting)

# で、tputって？

例えばさっきの場合は人によって赤色にならなかった方も居るかもしれません。ていうのも、ターミナルエミュレーターの種類によって微妙にエスケープシークエンスの書き方が違ったりするからです。しかもさっきのだと見にくい。圧倒的に呪文。
ということでさっきの呪文をラップして（使いやすいようにして）くれてます。
つまりは、tputコマンドを実行するだけでさっきの謎呪文と同じ効果が得られるのです。
それじゃあ再び以下のようにコマンドを実行してください。

```shell-session:shell
$ tput setaf 1 && echo 'HelloWorld'
```

ね？赤色になったでしょ。っていうわけでtputをechoと同じコマンド行で実行したり同じシェルスクで実行したりすると、次から標準出力が装飾できるようになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/154157/30421211-5475-46fd-2825-e0b3d545129d.png)

# tput装飾一覧

|色番号|色|
|:-:|:-:|
|0|黒|
|1|赤|
|2|緑|
|3|黄色|
|4|青|
|5|マゼンタ|
|6|シアン|
|7|白|

```
$ tput setaf <色番号> #文字色を色番号にする
$ tput setab <色番号> #背景色を色番号にする
$ tput cup <y座標> <x座標> # 上からx行目左からy文字目にカーソル移動
$ tput bold #太字
$ tput clear # clearコマンドと同じ効果
$ tput sgr0 # 装飾解除
$ tput cols # ターミナルの横幅を文字数で出力
$ tput lines # ターミナルの縦幅を文字数で出力
$ tput civis # カーソル非表示
$ tput cnorm # カーソル表示
```

あと詳しいことは`man terminfo`を読めばとても詳しく書いてあります。またターミナルによって対応していないものは変化がないので注意。

それでは快適なシェルの旅をお楽しみください！
XCode8 + OpenCV3.1.1以降のUIImageToMat,MatToUIImageでMach-O Linker Error

今回ハマった件
=
XCode8.3.1 + Swift3.1　+　OpenCV3.2の環境でopencvをpodでプロジェクトにインストールした状態でWeb上で紹介されているOpenCVのサンプルを色々と修正し、あとはMach-O　Linker エラー を残すのみとなったのですがこれについて結構ハマりました・・・。
内容はUIImageToMat関数とMatToUIImageのリンクエラーです。
結局の所 opencv2/imgcodecs/ios.hに定義されているのに、3.1.1以降では実体の部分が入らないみたいです。

2017/06/24 追記
includeに以下のように素直に追加するだけでもいける場合があるようです。
私の入れた時は無理だったと記憶してたんですが、インストールするフレームワークを作成した時のコンパイルオプションとかに依存するかもしれません。

```OpenCVWrapper.mm
#import <opencv2/imgcodecs/ios.h>
```

で、まあ当初私の行った無理くりバージョンは以下です。

UIImageToMatとMatToUIImageの実体は探すと以下にあります。
https://github.com/opencv/opencv/blob/master/modules/imgcodecs/src/ios_conversions.mm

今回はめんどくさかったのでのソースをそのままプロジェクトに入れてやりました。
で、先頭のimport郡の中の、precomp.hppがないとエラーになるのですが、ここも強引にコメントアウト。

```ios_conversions.mm(変更前)
#import <ImageIO/ImageIO.h>
#include "opencv2/core.hpp"
//#include "precomp.hpp" →コメントアウト
```

そしておもむろにBuild Clean→Build。

これでエラーが出なくなりました・・・。

まあ本記事のエラーだけでなく、実際はSwift3の文法に書き換えたり、iOS10からdeprecatedになった関数の置き換えをしたりとかなりめんどくさかったのですが・・・orz

何かの足しになれば・・・
React+ExpressでSSRしたJSONデータをクライアントに渡す

# やりたいこと
サーバサイドレンダリングで出力したJSONをクライアントサイドのJavaScriptから読み込みたい。

# 構成
- Node.js
- Express + express-react-views

# 書き方
ExpressのViewとしてexpress-react-viewsを利用しているためJSX表記。

1. JSON.stringify()でJSONを文字列化。
2. そのままJavaScriptコードを書くとJSXがparseしてしまったりするので、dangerouslySetInnerHTMLで埋め込む。

```
render: function () {
    var somelist_json = JSON.stringify( this.props.list );
    somelist = 'var somelist = ' + somelist_json';
    return (
      <head>
      <script dangerouslySetInnerHTML={{__html: somelist}}></script>
      </head>
    );
}
```

これでクライアントサイドJSはsomelistを読み出すことができるようになる。

# 参考
- http://qiita.com/hmarui66/items/4f75e624c4f70d596873
- https://stackoverflow.com/questions/23616226/insert-html-with-react-variable-statements-jsx
機械学習チュートリアルまとめ

# まず第一に
今の段階で自分の開発環境は
Python3.5.1
Anaconda
TensorFlowが入っているものとする。

この３つの入れかたは
[前回のサイト](http://qiita.com/knight0503/items/e47695b84d89f4e9a40d)
からいけるものと仮定して

他に必要になった場合
追加追加でライブラリを入れて行く。

# 自分の現状の知識
機械学習って何？？？→ちんぷんかんぷん
全くなにもわからない。→アルゴリズムの書き方や進め方すら意味が不明
→数学的な要素もしらない
→そもそもPythonってどうやって書くの？という段階

→目標としてはそんな何一つ現状がわからない人間が簡単な機械学習をできるようにすることを目指す


# 役に立ちそうなスライド or サイト
[初心者御用達機械学習スライド](https://www.slideshare.net/unnonouno/jubatus-casual-talks)
→機械学習のイメージがつかみやすい　アルゴリズム的観点はない。

#Pythonチュートリアルのリンク集
[Python入門](http://www.tohoho-web.com/python/index.html)
[Pythonチュートリアル](http://docs.python.jp/3.5/tutorial/)
[Python-izm](http://www.python-izm.com/contents/basis/string.shtml)
→コードを作りながら実際に理解する
# tensorflowチュートリアルのリンク集
[TensorFlowのTutorialをざっくり日本語訳していく](http://qiita.com/qooa/items/3719fec3cfe764674fb9)
[TensorFlowチュートリアル - ML初心者のためのMNIST（翻訳）](http://qiita.com/KojiOhki/items/ff6ae04d6cf02f1b6edf)
[TensorFlowのチュートリアルをやってみる（1）](http://www.mwsoft.jp/programming/tensor/tutorial_beginners.html)
[TensorFlowのチュートリアルをやってみる（2）](http://www.mwsoft.jp/programming/tensor/tutorial_mnist.html)

[機械学習を始めたい方に見て欲しいTensorflow入門資料まとめ
](https://freelance.levtech.jp/guide/detail/59/)→熟読
# 機械学習チュートリアルのリンク集
[機械学習giyo.jp](http://gihyo.jp/dev/serial/01/machine-learning/0001)
[VS-Mac]VisualStudio for Mac (Cocoa)でNSTextFieldのChangeイベント

VisualStudio for Mac Cocoa App.用の個人的な備忘録その２。


## 概要
* ViewにTextFieldとラベルを追加。
* TextFieldのテキスト編集に連動してラベルのテキストが変更される。

## 利用するAPI:
* [NSTextField](https://developer.apple.com/reference/appkit/nstextfield)
* [XamarinのWorking_with_Text_Controls](https://developer.xamarin.com/guides/mac/user-interface/standard-controls/#Working_with_Text_Controls)
によると、「Changed」「EditingBegan」「EditingEnded」の３つのイベントが利用出来るらしい。  [Displaying Data and Responding to Events](https://developer.xamarin.com/guides/mac/application_fundamentals/databases/#Displaying-Data-and-Responding-to-Events)のComboBoxのChangedイベントを参考にNSTextFieldで試してみた。

## ソリューションの新規作成
省略

## InterfaceBuilderで編集
1. ViewControllerのViewにTextFieldとLabelをドラッグ
2. 適当にサイズ変更
3. ウィンドウリサイズでマージンを設定したい場合は、ステータスバー「Add New Constraints」でRed I-Beamを変更。  （参照：[Hello, Mac  Creating the Interface](https://developer.xamarin.com/guides/mac/getting_started/hello%2C_mac/#Creating_the_Interface)  7.）
![NSTextField01.png](https://qiita-image-store.s3.amazonaws.com/0/182396/7479c50e-66ec-9ebe-9fb6-3eb290aa13f9.png)

4. AssistantEditorにViewController.hを表示して、TextFieldを**Ctrlキーを押したままドラッグ**。  Connection:Outlet  Name:TextField1  Type:NSTextFieldとしてConnect![NSTextField02.png](https://qiita-image-store.s3.amazonaws.com/0/182396/a984b918-89f8-89ad-923d-801bf2b482ad.png)

5. 同じく、ラベルをドラッグ。  Connection:Outlet  Name:Label1  Type:NSTextFieldとしてConnect
6. Outletが追加されたViewController.h![NSTextField03.png](https://qiita-image-store.s3.amazonaws.com/0/182396/77101f8a-7b4e-70b8-0657-faca1b46f590.png)

7. SaveしてVisualStudioへ戻る。

## コードの編集（ViewController.cs）
ViewDidLoad()を以下に変更

```
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            // Do any additional setup after loading the view.
            TextField1.Changed += (sender, e) =>
            {
                Label1.StringValue = TextField1.StringValue;
            };
        }
```
ラムダ式によるイベント記述ができるようだ。

## 実行画面
![NSTextField04.png](https://qiita-image-store.s3.amazonaws.com/0/182396/a5821183-4df6-2a9f-c86c-f481a606ad63.png)
TextFieldの文字列入力に連動してラベルが変化する。

## Reference:
1. Xamarine - Developers - Guides - Mac - Standard Controls - [Working with Text Controls](https://developer.xamarin.com/guides/mac/user-interface/standard-controls/#Working_with_Text_Controls)
2. Xamarine - Developers - Guides - Mac - Application Fundamentals - [Working with Databases](https://developer.xamarin.com/guides/mac/application_fundamentals/databases/#Databases-and-ComboBoxes) - Databases and ComboBoxes - [Displaying Data and Responding to Events](https://developer.xamarin.com/guides/mac/application_fundamentals/databases/#Displaying-Data-and-Responding-to-Events)


## License:
Copyright (c) 2017 grayhead0603
Released under the [MIT license](http://opensource.org/licenses/mit-license.php)
Kali Linuxでシャットダウンに90秒かかる問題の解決

Kali Linuxのデスクトップ環境を使っていると、シャットダウン時に次のようなメッセージが表示されてシャットダウン完了まで90秒待たされることがあります。

```
(1 of 2) A stop job is running for ...r Manager for UID 131 (42s / 1min 30s)
(2 of 2) A stop job is running for ...r Debian-gdm (42s / 1min 30s)
```

これはベースのDebianのバグのようで、Debianでも同じ状況が起こるようです。

解決策は「[#843090 - open-vm-tools-desktop: shutdown hangs 90s after a VM window resize - Debian Bug report logs](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=843090)」にある通り、`/etc/gdm3/daemon.conf`に次のように1行追記すればシャットダウン時に待たされることはなくなります。

```:/etc/gdm3/daemon.conf
[daemon]
# Uncoment the line below to force the login screen to use Xorg
WaylandEnable=false
```

と思ったんですが、やっぱりシャットダウン時に待たされてました（2017/06/26追記）。困った。

```:/etc/systemd/system.conf
DefaultTimeoutStopSec=30s
```

でシャットダウン時間を30秒にしました。
ltsvのアクセスログをシェルで見やすくした

(Apacheの)LTSVで吐かれたアクセスログがとても見にくかったので、コマンドで見やすくしたよ。

### やったこと

* 行の間に改行を二つ入れた
* LTSVのキー部分を青く出力するようにした

### 希望

* 特に何も入れずにプリインストールされてるものだけでやりたい

### コマンド
```
text=`tail ltsv_access_log | sed -e 's/.*/&\n\n/g' -e 's/\([A-Za-z0-9_]*\):/\\\\e\[34m\1\\\\e\[m:/g'`
echo -e "$text"
```

秘密のアクセスログしか手元にないのでスクショは無いです。
多分、 `echo -e` 以外にいい感じに色をつけて出すコマンドがあるんだろうなぁと思ってます。
go-githubを利用してGithub Enterpriseにアクセスする

GoでGitHub APIを利用する際は、公式の<a href="https://github.com/google/go-github">go-github</a>というパッケージが便利です。

しかし、このパッケージではデフォルトで GitHub へアクセスするよう指定されており、GitHub Enterpriseにアクセスすることができません。

わたしの参画しているプロジェクトで、<a href="http://qiita.com/mi-bear/items/0b4b892e2c793ef9241c">go-githubを使ってGitHub Enterpriseにアクセスしたい</a>ということがありました。
今回はそこで採用されている方法を紹介します。

## GitHub上で公式のリポジトリをforkする
GitHub EnterPriseではなくGithub上で、公式のリポジトリをforkします。

Forkしたいプロジェクトまで行って、右上にある「Fork」ボタンを押すと、自分のGithubアカウント上でリポジトリが作成されます。

<img width="407" alt="スクリーンショット 2017-05-25 23.54.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/133879/3d5c4a14-3a5d-8164-190c-875a27170ce2.png">


通常共有されていないリポジトリに対して書き込むことはできません。
一方、forkしたリポジトリは自由に更新することができます。

このGitHub上でforkしたリポジトリに変更を加え、GitHub Enterpriseにアクセスできるようにします。


## forkしたリポジトリに変更を加える

forkしたリポジトリ内にある、github.goというファイルの`defaultBaseURL`という部分を変更します。

```github.com/{user-name}/go-github/github.go
 const (
	defaultBaseURL = "https://{your-organization-address}/api/v3/"
```

## GitHub Enterprise上のプロジェクトでimportする
importするパッケージを、google/go-githubではなく、forkして変更を加えたものにします。

```main.go
package main

import(
    "github.com/{user-name}/go-github/github"
)
```

あとはforkしたリポジトリを`go get`すればOKです。
これでGitHub Enterprise にアクセスできるようになります。
[WPF][XAML] デザインモード時のみ有効な背景色を設定する

WPFのUserControlの背景は基本的に透明にしているが、デザイナーモード時のみ見やすい背景色を設定したい場合の設定方法メモ

# 設定例

```xml:XAML
<UserControl x:Class="TestPrj.View.TestCtrl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:TestPrj.View"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <d:DesignerProperties.DesignStyle>
        <Style TargetType="UserControl">
            <Setter Property="Background" Value="LightGray"/>
        </Style>
    </d:DesignerProperties.DesignStyle>
    <Grid>
        <TextBlock Text="hogehoge"></TextBlock>
    </Grid>
</UserControl>
```

`<d:DesignerProperties.DesignStyle>...</d:DesignerProperties.DesignStyle>` の間に
デザイナーモード時のみ有効な任意のStyle設定を追加できます。

今回は背景色のみですが、Style内に同様に任意のプロパティ設定を追加できます。
ただし、たくさん設定する場合はViewModelごとデザイナーモード用のものに入れ替えたほうがよいかもしれないです。
（MVVMフレームワークを使用しているならViewModelLocatorなどに切り替え機能があるはずかと思います）

# 参考
[visual studio 2010 - Design-time-only background color in WPF? - Stack Overflow](https://stackoverflow.com/questions/9076419/design-time-only-background-color-in-wpf)
Hyで書いたライブラリをPyPIに登録する備忘録

[これ](https://github.com/koji-kojiro/hylang-hycc)を作った時に試行錯誤した備忘録です．
**`setup.py`の内容やファイルの構成のうち通常のPythonと異なる部分のみ記述しています．**

# Hyからの使用のみ想定している場合

```bash:ファイルの構成
.
├── hoge
│   ├── __init__.hy
│   ├── fuga
│   │   ├── __init__.hy
│   │   └── fugafuga.hy
│   └── hogehoge.hy
└── setup.py

1 directories, 5 files

```

```py:setup.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from setuptools import setup

config = {
    'install_requires': ['hy'],
    'packages': ['fuga', 'fuga.hoge'],
    # __init__.pyが無いのでfind_packagesはダメ

    'package_data': {
        'fuga': ['*.hy'],
        'fuga.hoge': ['*.hy'],
    },
    # 通常は.pyファイルしか含まれないので.hyが含まれるように指定してあげる
}

if __name__ == '__main__':
    setup(**config)

```


# Pythonからも使用したい場合
`setup.py`でエントリーポイントを設定する場合もこちら

```bash:ファイルの構成
.
├── hoge
│   ├── __init__.py # トップレベルのみ .hyではなく.pyに
│   ├── fuga
│   │   ├── __init__.hy
│   │   └── fugafuga.hy
│   └── hogehoge.hy
└── setup.py # setup.pyはおなじでOK

1 directories, 5 files

```

```py:hoge/__init__.py
import hy as _hy
# import hyでももちろんいい
# hyをimportするとimportフックで.hyをimportできるようになる
```

# その他
## PyPIにアップロード
当たり前ですがPythonのときと全く一緒です．ちなみに[`python setup.py register`ではなくtwineを使いましょう](http://qiita.com/tokyo-noctambulist/items/cafcbd589e39d45d693f#_reference-33fef58df783468e02a7)．`setup.py`を使うやり方は[TestPyPI](https://testpypi.python.org/pypi)では現役ですが[本番PyPI](https://pypi.python.org/pypi)では現在は使用できません．

## PythonとHyを混在させる場合
Pythonのソースがあるところにはもちろん`__init__.py`が必要．ちなみにCで書いた拡張を併用する場合も`__init__.py`が必要です．
dockerでMovableTypeを構築(MariaDB)

MySQLではなく、MariaDBでMovableTypeを構築する案件があり、
MovableTypeのテクニカルサポートに問い合わせたところ、
「MariaDB に関しては、現状では MySQL 互換であり、基本的な動作に支障はなく動作報告あり。
ただ、推奨環境外とのことで、100%動くことが保証されるわけではない。」ということで
じゃあDockerでさくっと試してみよう！ということでやってみました。

# 結論

以下のレポジトリにdocker-composeファイルやらなんやらをアップしています。
https://github.com/gk9187/docker-movabletype-mariadb
data/apache/MT配下にダウンロードしたMovableTypeを展開し
docker-compose build -> upすると、http://localhost/cgi-bin/
でMTの初期設定画面が閲覧できます。

データベースは初回起動時にdatabase/init.sqlを流し込んでいます。
docker-composeでwebからdbへlinkしているので、MTの初期設定時、
データベースの接続先(IP or HostName)はdbとすることで
名前解決できて接続できるようになっています。

perlのモジュールを色々入れる必要があるので、buildに結構時間が
かかります。

ちなみにMTは6.3.3で試しており、以下からダウンロードしました。
https://github.com/movabletype/movabletype/releases/tag/mt6.3.3

# 解説
## 環境

CentOS 6
DB MariaDB 5.5
MT 6.3.3で確認
Apache 5.4

※バージョンに縛りがあったので上記の通りにしましたが、
　docker-hubにmariadbのイメージが上がっていたので、
　本当はそっちを使った方がよいかも。。
　https://hub.docker.com/_/mariadb/

## 全体図

コンテナ―として以下のようにWEBとDB２つ立ち上げています。
![docker-mt-abst.png](https://qiita-image-store.s3.amazonaws.com/0/71987/9dd155af-2fe0-c819-2c8b-2b92abe5a009.png)

## WEB

docker-composeファイルでは、webという名前をつけて80ポートを公開し
dbとリンクしているのみです。

## DB

dockerを落としたあと、再起動するときにinit.sqlを流したくなかったので
init.shにそのあたりの処理を書いています。
初回接続時は/initializedというファイルをおいて、次回以降は
このファイルが存在したらinit.sqlを流さないようにしました。



# 総括

さくっとやるつもりが、mariadbを自分で構築するようにしてしまったのでさくっとは終わらなかった。
docker-hubで先に検索しておけばよかった。
docker-hubに挙がっているものは、指定ディレクトリに置いたファイルを自動でSQLとして実行してくれるみたいなので、今回の初期化sqlも流せたので。。

コンテナを削除するとデータがすべて消えて構築し直しになるので、
もし本運用するためにはデータの永続化を考えないといけない。

軽く情報収集した感じだと、
・volumeを使う。でもパーミッションで罠があるかんじ(マウントしたvolumeは1000:1000になる)
・データコンテナー？というのがあるらしい。
　dockerを削除してもデータが消えずに他のコンテナからマウントできるとかなんとか
　https://docs.docker.com/engine/tutorials/dockervolumes/#data-volumes

コンテナーのデータ永続化はそもそも性質的に向いてないし、
やろうとすると色々と難がありそう。
Xamarin.iOSで入力欄がソフトウェアキーボードに隠れないようにする

#初めに
iOS向けの画面を作成している際に、TextFieldなりTextViewなりがSoftwareKeyboardに隠れてしまう残念な現象に遭遇したため、対応結果を残しておきます。

ソースコードは下記に置いております。
https://github.com/dyoneda/SoftKeyboard/

多いに下記記事を参考にさせて頂きました。
【Swift】UITextField, UITextViewがキーボードで隠れるのを防ぐ(UIScrollViewを使わずに)
http://qiita.com/ShinokiRyosei/items/06fb30983236d6342b28

#実装
***ViewDidLoad***メソッドで、キーボードの表示/非表示を各々ハンドルします。
移動量は、ソフトウェアキーボードの高さと、画面下端から対象コントロールの下端までの差分にしておくと、入力コントロールがソフトウェアキーボードの直上に来ていい感じです。
今回はIsFirstResponderプロパティーでフォーカスが当たっているコントロールを取得しています。

```csharp
var nsObject = NSNotificationCenter.DefaultCenter.AddObserver(UIKeyboard.WillShowNotification, n =>
{
    var cgRectValue = (n.UserInfo[UIKeyboard.FrameBeginUserInfoKey] as NSValue).CGRectValue;
    var d = (n.UserInfo[UIKeyboard.AnimationDurationUserInfoKey] as NSNumber).DoubleValue;

    var active = this.View.Subviews.FirstOrDefault(u => u.IsFirstResponder);
    var diff = this.View.Frame.Height - active?.Frame.Bottom ?? 0f;

    UIView.Animate(d, () =>
    {
        var transform = CGAffineTransform.MakeTranslation(0f, -(float)Math.Max(cgRectValue.Height - diff, 0f));
        this.View.Transform = transform;
    });
});
```

```csharp
nsObject = NSNotificationCenter.DefaultCenter.AddObserver(UIKeyboard.WillHideNotification, n =>
{
    var d = (n.UserInfo[UIKeyboard.AnimationDurationUserInfoKey] as NSNumber).DoubleValue;
    UIView.Animate(d, () =>
    {
        this.View.Transform = CGAffineTransform.MakeIdentity();
    });

});
```
なお、***AddObserver***メソッドの戻り値のNSObjectは、***ViewWillDisappear***メソッドでハンドラー解放の際に利用するので保持しておきましょう。


```csharp
this._removeObjects.ForEach(NSNotificationCenter.DefaultCenter.RemoveObserver);
```
いろいろなユーザー名

|名前の例|説明|使われる場所|RFC|
|:--|:--|:--|:--|
|username@domain.example.com|メールアドレス||[RFC5322](https://tools.ietf.org/html/rfc5322) ([Google翻訳](https://rfcs.web.fc2.com/rfc5322.html))|
|username@realm.example.com|Network Access Identifier (NAI)|RADIUSなど|[RFC7542](https://tools.ietf.org/html/rfc7542) ([Google翻訳](https://rfcs.web.fc2.com/rfc7542.html))|
|NETBIOS-NAME\USERNAME||NTドメイン、Active Directory|
|username@upn-suffix.example.com|User Principal Name (UPN)|Active Directory|
|UID=jsmith,DC=example,DC=net|Distinguished Name (DN)|LDAP|[RFC4514](https://tools.ietf.org/html/rfc4514) ([Google翻訳](https://rfcs.web.fc2.com/rfc4514.html))|

##メールアドレス
[RFC5322 Section 3.4.1](https://tools.ietf.org/html/rfc5322#section-3.4.1) ([Google翻訳](https://rfcs.web.fc2.com/rfc5322.html)) のaddr-specの定義より抜粋します。

```
   addr-spec       =   local-part "@" domain

   local-part      =   dot-atom / quoted-string / obs-local-part

   domain          =   dot-atom / domain-literal / obs-domain

   domain-literal  =   [CFWS] "[" *([FWS] dtext) [FWS] "]" [CFWS]

   dtext           =   %d33-90 /          ; Printable US-ASCII
                       %d94-126 /         ;  characters not including
                       obs-dtext          ;  "[", "]", or "\"
```

FWSはfolding white space, CFWSはコメントやFWSが発生する場所を表します。以下[RFC5322 Section 3.2.2](https://tools.ietf.org/html/rfc5322#section-3.2.2) ([Google翻訳](https://rfcs.web.fc2.com/rfc5322.html)) より抜粋します。

```
   FWS             =   ([*WSP CRLF] 1*WSP) /  obs-FWS
                                          ; Folding white space

   ctext           =   %d33-39 /          ; Printable US-ASCII
                       %d42-91 /          ;  characters not including
                       %d93-126 /         ;  "(", ")", or "\"
                       obs-ctext

   ccontent        =   ctext / quoted-pair / comment

   comment         =   "(" *([FWS] ccontent) [FWS] ")"

   CFWS            =   (1*([FWS] comment) [FWS]) / FWS
```

##NAI
[RFC7542 Section 2.2](https://tools.ietf.org/html/rfc7542#section-2.2) ([Google翻訳](https://rfcs.web.fc2.com/rfc7542.html)) のnaiの定義より抜粋します。

```
   nai            =   utf8-username
   nai            =/  "@" utf8-realm
   nai            =/  utf8-username "@" utf8-realm

   utf8-username  =  dot-string

   dot-string     = string *("." string)
   string         = 1*utf8-atext

   utf8-atext     =  ALPHA / DIGIT /
                     "!" / "#" /
                     "$" / "%" /
                     "&" / "'" /
                     "*" / "+" /
                     "-" / "/" /
                     "=" / "?" /
                     "^" / "_" /
                     "`" / "{" /
                     "|" / "}" /
                     "~" /
                     UTF8-xtra-char

   utf8-realm     =  1*( label "." ) label

   label          =  utf8-rtext *(ldh-str)
   ldh-str        =  *( utf8-rtext / "-" ) utf8-rtext
   utf8-rtext     =  ALPHA / DIGIT / UTF8-xtra-char
```

ちょっとずつ定義が違いますが、Active Directoryを使っている環境では、ここに出て来るのが全部出てきて複雑なことになりがちです。幸運を祈る。
一定間隔でCommitするシェルスクリプト


###はじめに
シェルスクリプトの初心者が書いたコードなので使用にあたっては自己責任でお願いします.

###書いた動機
こまめに`commit`するのを忘れ,
問題が発生したときにかなり前の`commit`した内容からもってこなければならない...
という状況が発生したためとりあえず自動で`commit`しておこうという発想.

###環境
macOS Sierra 10.12.3で実行.
まず事前に`Git`をインストール後ログインしていて,
`remote`や`branch`など一通り済んでいることを確認してください.

###コード
```AutoCommit.sh
#!/bin/sh
while true
do
VAR_DATE=$(date '+%D/%T')
git add a.txt
git commit -m "$VAR_DATE"
git push origin master
sleep 10
done
```

上の例だと`a.txt`が`add`されます.
(事前に`branch`に`add`している場合は抜かしても大丈夫かもしれないです).
また`commit`される際のコメントは日付になっています.
`sleep`の後は10秒ごとにループするという意味です.
(もちろん実用上はもう少し長くとるべきですが...)

###実行
`chmod u+x AutoCommit.sh`で実行権限を与えたあとに
`./AutoCommit.sh`を(`.git`がある)作業ディレクトリで実行してください.
実行している間はTerminalが操作できないので
`Command+N`などで新しいTerminalを開くと良いです.
FacebookOAuthのコールバックにパラメータを指定しようとしたらwhitelist設定で弾かれてどハマリした

`http://hogehoge.com/oauth/callback?redirect_path=hogehoge.com`
のようにコールバックにパラメータを付けての表示を出し分けようと思ったのだが
礼儀正しく以下のように「有効なOAuthリダイレクトURI」の項目を設定していたところ
ログインに弾かれてどハマリした。


Facebookログイン > 有効なOAuthリダイレクトURI

![image.png](https://qiita-image-store.s3.amazonaws.com/0/52847/c4dd2795-cba3-8027-17f8-67fdd0c41878.png)



エラー
![image.png](https://qiita-image-store.s3.amazonaws.com/0/52847/6cc0585c-b619-34dd-0baa-5e1de5217805.png)


## 解決方法

1. 設定 > アプリドメイン を **空欄にする**
2. Facebookログイン > 有効なOAuthリダイレクトURIを **空欄にする**
3. 設定 > プラットフォームを追加 > サイトURL に **対象環境のルートURLを設定する**

1. 設定 > アプリドメイン
![image.png](https://qiita-image-store.s3.amazonaws.com/0/52847/f67ae038-5b4c-d41f-b75b-b4f777435ab7.png)


2. Facebookログイン > 有効なOAuthリダイレクトURI
![image.png](https://qiita-image-store.s3.amazonaws.com/0/52847/8a7ae9a5-098d-ae42-bfde-468f377340c4.png)

3. サイトURL
![image.png](https://qiita-image-store.s3.amazonaws.com/0/52847/d0db5ab8-c7d1-1075-6e2c-6481c0ec18c6.png)

を対象環境のURLだけ設定しておけばよかった。

ちなみに **「有効なOAuthリダイレクトURI」 は設定済みの状態から空欄にしようとすると以下のようにエラーになって詰む** ので
![image.png](https://qiita-image-store.s3.amazonaws.com/0/52847/5126dbef-d1ca-5fe9-ebc2-9063d31d68a1.png)



その場合は**新しいFacebookアプリを作成**するとデフォルトが空欄のままなので、そのままにしておくことで設定しなおすことができる。


参考：
https://stackoverflow.com/questions/32551192/how-to-add-multiple-facebook-callback-urls
Azure に Kubernetes セットアップしてサービス毎にデプロイできるCI/CDパイプライン作ってみた

マイクロサービスを実施したいお客様がいる時に、頻繁に聞かれることは、「連携するサービスがあるのだが、それぞれのサービスを個別にデプロイしたい。」このような、要望に答えるテクニックとして、[Consumer Driven Contract](https://martinfowler.com/articles/consumerDrivenContracts.html) と言う手法があります。私も前から知っていましたが、実物を見たことがありませんでした。だから、それをGo言語で試してみて、それを含んだCI/CDのサンプルを作成してみました。

デプロイする先としてAzure上の Kubernetes　を使っています。Azure上のKubernetesには馴染みがある人は少ないと思うので、Kubernetesのインストール、セットアップから、つまづくポイント、Kubernetesってなに？と言う人のための簡単なデモも一緒に作ってあります。
CI/CDの構築の場所としては、Visual Studio Team Servicesを使っています。このサービスは、日本では相当広まっていないですが、私的には快適すぎて手放せず、私がこのサービスを紹介したお客様はみんな喜んで使ってくれています！

最後に、Pactのイメージってなかなかわかないと思うので、Pact-Goのデモ動画もつけています。
動画はすべて私の解説入りなので、おひまなときにでもどうぞ！

あと、ここで、作ったサンプルはすべてGitHubで公開しています。PactをDockerにパックするための、Dockerfileや、k8sのyamlなども置いています。

# Kubernetes を Azure上にセットアップする
ポータルを使って、デプロイ。再セットアップが可能な、ARMテンプレートコードの落とし方。
Azureでは、K8sをデプロイするのに３つの方法がありますが、文末のPPTを参考にしてください。

[![1. Zero to Kubernetes on Azure](http://img.youtube.com/vi/tr32mFHiQvg/0.jpg)](http://www.youtube.com/watch?v=tr32mFHiQvg)
ここで使われているサービスプリンシパルは削除済みです。

# 基本的な Kubernetes の使い方

デプロイや、ローリングアップデートなど

[![2. Kubernetes basic operation on Azure](http://img.youtube.com/vi/GzQG_LItfBs/0.jpg)](http://www.youtube.com/watch?v=GzQG_LItfBs)

# Azure Container Registryと　シークレットの扱い

K8sでのシークレットの扱い

[![3. Kubernetes Secret management with Azure Container Registry](http://img.youtube.com/vi/O21keTzKjcM/0.jpg)](http://www.youtube.com/watch?v=O21keTzKjcM)

# VSTSでの、CI/CDパイプライン

基礎的なセットアップです。yamlファイルの書き換えは、Replaceタスクと言う
タスクで実施します。詳細はパワーポイントを参考に！

[![4. Kubernetes CI/CD pipeline with VSTS](http://img.youtube.com/vi/SbjYEf9F1oI/0.jpg)](http://www.youtube.com/watch?v=SbjYEf9F1oI)

# Consumer Driven Contract Pact-go のサンプル

Pact-Goを使った、ConsumerDrivenContract。
ちなみに、実際に動かすには、PactBrokerをどこかにデプロイして、
テストを動かす時に、環境変数(PACT_BROKER_URL)に、そのURLを指定してください。

[![5. Consumer Driven Contract Pact-Go on Azure kubernetes](http://img.youtube.com/vi/VvSWRFXYxvA/0.jpg)](http://www.youtube.com/watch?v=VvSWRFXYxvA)

# リソース
サンプルソースがはいったGitHubリポジトリ
[Pact on kubernetes](https://github.com/TsuyoshiUshio/PactOnKubernetes)

発表資料
[獲れたて OSS x DevOps 自動化三昧を満喫セヨ](https://doc.co/sL22eV)
AWS wordpressドメイン変更方法

wordpressはデータベースにドメインの情報が保存されているためドメイン変更後アクセスしてもデータベースのドメインが変わらなければ前のドメインにアクセスしようとします。
なのでデーターベースのドメインを変更するためのツールを使用します。
使用したツールは「**Search Replace DB**」
DB内の文字列を置換してくれて、さらに**他に関連する情報も**置換してくれるツールです。
つまりSQLだけの置換では危険とのことです。以下の2つが危険な理由です。
・wp_optionsテーブルなどでurlの長さなどのデータを持っている
・プラグインやテーマなど壊れる可能性が出てくる


#使用した環境（バージョン）
|名前|バージョン|
|:----|:------------------:|
|amazon linux|-|
|apache|2.4|
|wordpress|4.7.5|
|Search Replace DB|3.1.0|
　

#wordpressドメイン変更方法

##1.ツール入手
ツールダウンロードしZIP形式になっているので解凍します。解凍後の名前は「Search-Replace-DB-master」になります。

```
#wget https://github.com/interconnectit/Search-Replace-DB/archive/master.zip
#unzip master.zip
```

##2.準備
wordpressの公開されているディレクトリ(wp-config.phpがあるディレクトリ)に解凍した「Search-Replace-DB-master」を`mv`コマンドで移動させます。
1.※ブラウザでアクセスした際にwp-config.phpをもとに勝手にdatabaseに接続するための情報が駄々洩れになりますので注意！！先にWAFやポートセキュリティなどで自分しかアクセスできないようにするのを推奨
2.※「Search-Replace-DB-master」を`mv`コマンドでファイル名を変更することを推奨。
3.※バックアップ（データーベースとwordpressディレクトリ）をバックアップすることを推奨（この記事ではやりません）
4.※apacheが読めるように権限を変更すること。

##3.ブラウザ開いてアクセスします

`http://[ドメインやIPアドレス]/[2.※で変更したディレクトリ名]`
以下のサイトが開きます（1.※に記述したように勝手にデーターベース名とパスワード名を**平文**で表示されてしまいます。）
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/134267/d64c9566-2bfb-0df6-4bb0-bd27088a1dea.png)

##4.テスト実行、本番実行
web画面の一番上の**replace**の欄に変更前のドメインをいれ**with**の欄に変更後のドメインをいれる

```
例：変更前のexample.com を 変更後のexample1.comにしたい場合
replace　example.com　with　example1.com
```
Actionsにある`dry run`でテスト実行し結果が表示されます。良ければ、`live run`で本番実行させます

これで終わりです。

#参考サイト
[参考サイト](https://www.infoscoop.org/blogjp/2014/08/14/use-search-and-replace-for-wordpress-when-moving/)
nginx初心者です。　リダイレクト設定しているかどうかの確認

nginx初心者です。
macでターミナルを使用しています。

SSL認証のため一時的にhttpsへのリダイレクト設定を解除したいです。
nginxでリダイレクト設定がされているかどうか調べて、されていたら解除。SSL認証後再度設定したいと考えています。
リダイレクト設定しているかどうかの確認は、どう書いたら良いのでしょうか？？
教えて下さい。
UILabelの高さ計算時に気をつけること

#はじめに
テキスト量によって、ラベルの高さ計算をしてラベルの高さの制約をセットする事がありますよね。


boundingRectメソッドで高さ計算できます。
ラベルの横幅、高さを指定します。

```
//UILabelにAttributedTextをセットして高さ計算
let boundingRect = label.attributedText!.boundingRect(with: CGSize.init(width: label.bounds.size.width,
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　height: CGFloat.greatestFiniteMagnitude),
 　　　　　　　　　　　　　　　　　　　　　　　　　　　　options: .usesLineFragmentOrigin, context: nil)
```


#問題
上記で計算した高さを持って、ラベルの高さの制約を設定したけど、
ラベルの上下に余計なスペースができてしまったり、高さが足りなくて見切れたりという事があります。
iPhone5だとうまく行くけど、iPhone6だとうまくいかないーなんて事があります。

#原因
大抵の原因は、計算時の「横幅が正しくない」です。
print文などで、出力して確認してみてください。

計算時のラベルのwidthが、AutoLayout適用前のwidth、
つまりStoryboard上に置いたUILabelのwidthになっていたりします。
なので、StoryboardのViewControllerのサイズと違うデバイスサイズで見るとうまくいかなかったりします。

#計算前にAutoLayoutを適用させる
まず最初にやる事は、viewにAutoLayoutを適用させます。

```
override func viewDidLoad() {
    super.viewDidLoad()
    self.view.layoutIfNeeded()

    //何らかの処理
}
```

viewやviewのsubViewsの制約が適用されて正しい横幅になります。

ただ、UITableViewCell上に置いたラベルの高さ計算の場合、これだけではだめで、
セルの横幅も設定してあげます。
tableViewの以下のデリゲートメソッドで、セルのframeをセットします。

```
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

 let commentCell:CommentCell =   tableView.dequeueReusableCellWithIdentifier("CommentCell") as! CommentCell
 //セルに正しい横幅を設定する 
 commentCell.frame = CGRectMake(0,0, self.tableView.width, commentCell:commentCell.frame.height)
 //セルを更新する
 commentCell.configure()

}
```

セルの横幅が正しい値でセットできたら、セルの更新メソッドなどの最初に
self.layoutIfNeededを実行してください。  

```
//カスタムセルの更新メソッド　実際は引数にラベルに表示する文字列などのデータを渡す
func configure() {
 //セルの横幅が正しい状態で、AutoLayoutを適用する
 self.layoutIfNeeded()
 
 //ラベルの横幅が正しくなるので、この後高さ計算を行い、ラベルの制約を更新する
 
}

```

セルのsubviewであるラベルなどにAutoLayout適用後の正しいwidthがセットされて、
ラベルの横幅が正しい値になります。
boundingRectメソッドに指定する横幅が正しくなり、
高さ計算が期待した値になります。

#まとめ
ラベルの高さ計算がうまくいかない時の確認事項とやる事

1. 計算時のwidth(ラベルの横幅)が正しいかを確認
2. widthが期待している値と違ったら、ラベルの親ViewにAutoLayoutを適用させる
3. TableViewCell上のラベルの場合は、セルに正しいwidthを指定しつつ、AutoLayoutを適用する

以上、ラベルの高さ計算時にうまく行かなくて困った時は、
まずラベルの横幅を確認してみてください。