OmniAICreator/Qiita-1.07M huggingface dataset:
【Laravel5.3】url(), redirect()使用時にURLが変わる場合の対処方法

## 使用環境
- php7
- Laravel5.3
- Apache2.4

※上記を使用していますが、他Laravelバージョンでも応用可能かと思います。

## 問題点
プロキシサーバを通したあとの処理で、__『`url()`, `redirect()`を使用するとURLが変わってしまう』__という問題が発生した。

たとえば`url('/user')`とした際に、希望としては`http://example.co.jp/user`というURLを取得したいにもかかわらず、`http://hoge01.example.co.jp/user`とプロキシサーバからサーバへアクセスするためのURLが使用されてしまう。

`url()`、`redirect()`や、AuthまわりのReferrer機能をそのまま使用したい…


## 解決法
`url()`を探ると`UrlGenerator.php`の`to()`で絶対URLを取得している様子。

ということで、
`vendor/laravel/framework/src/Illuminate/Contracts/Routing/UrlGenerator.php`の`to()`をoverwriteできれば解決しそうです。

### `app/Providers/AppServiceProvider.php`の`register()`を修正
```app/Providers/AppServiceProvider.php
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        $url = $this->app['url'];
        $this->app->singleton('url', function () use ($url) {
            return new CustomUrlGenerator($url);
        });
    }
```

### `app/Providers/`へ`CustomUrlGenerator.php`作成（2017/3/26修正）
```app/Providers/CustomUrlGenerator.php
<?php
namespace App\Providers;

use Illuminate\Routing\UrlGenerator;

/**
 * Class CustomUrlGenerator
 * @package App\Providers
 */
class CustomUrlGenerator extends UrlGenerator
{
    /**
     * Create a new manager instance.
     *
     * @param Illuminate\Routing\UrlGenerator $url
     */
    public function __construct(UrlGenerator $url)
    {
        parent::__construct($url->routes, $url->request);
    }

    /**
     * Generate an absolute URL to the given path.
     *
     * @param  string $path
     * @param  mixed $extra
     * @param  bool $secure
     * @return string
     */
    public function to($path, $extra = [], $secure = null)
    {
        // First we will check if the URL is already a valid URL. If it is we will not
        // try to generate a new one but will simply return the URL as is, which is
        // convenient since developers do not always have to check if it's valid.
        if ($this->isValidUrl($path)) {
            return $path;
        }

        $scheme = $this->getScheme($secure);

        $extra = $this->formatParameters($extra);

        $tail = implode('/', array_map(
            'rawurlencode', (array) $extra)
        );

        // Once we have the scheme we will compile the "tail" by collapsing the values
        // into a single string delimited by slashes. This just makes it convenient
        // for passing the array of parameters to this URL as a list of segments.
        
        // Original
        //$root = $this->getRootUrl($scheme);
        $root = 'http://example.co.jp';

        if (($queryPosition = strpos($path, '?')) !== false) {
            $query = mb_substr($path, $queryPosition);
            $path = mb_substr($path, 0, $queryPosition);
        } else {
            $query = '';
        }

        return $this->trimUrl($root, $path, $tail).$query;
    }
}
```


### まとめ
これで__url(), redirect()__を無事プロキシサーバを通す前のURLで取得できました。

`$root = 'http://example.co.jp';` は少し雑かもしれませんが、現時点ではこれで問題は特に起きていません。
`getRootUrl()`に手をいれるのもありかも知れません。

上記を行わずともプロキシサーバを通す前のURLを取得する方法がありましたら、教えていただければ幸いです。:bow_tone1:
ionic コマンド一覧

自分用のメモ ＆ 翻訳
(一部、翻訳済)

```
  _             _          
 (_)           (_)         
  _  ___  _ __  _  ___     
 | |/ _ \| '_ \| |/ __| 
 | | (_) | | | | | (__     
 |_|\___/|_| |_|_|\___|  CLI v2.2.1

Usage: ionic task args


=======================
Available tasks: 
(use --help or -h for more info)


   start  ..........  指定されたPATHで新しいIonicプロジェクトを開始する
   serve  ..........  アプリの開発、またはテストのためのローカルサーバーの起動
   setup  ..........  ビルドツールを使用してプロジェクトを設定 (beta版)
   generate  .......  ページとコンポーネントの生成
   platform  .......  Ionic appへプラットホーム追加
   run  ............  接続されたデバイスでIonicプロジェクトを実行
   emulate  ........  シミュレータまたはエミュレータで、Ionicプロジェクトをエミュレートする
   build  ..........  特定のプラットフォームのIonicプロジェクトをビルド

   plugin  .........  Cordovaプラグインの追加
   resources  ......  Automatically create icon and splash screen resources (beta)
		      Put your images in the ./resources directory, named splash or icon.
		      Accepted file types are .png, .ai, and .psd.
		      Icons should be 192x192 px without rounded corners.
		      Splashscreens should be 2208x2208 px, with the image centered in the middle.

   upload  .........  Upload an app to your Ionic account
   share  ..........  Share an app with a client, co-worker, friend, or customer
   lib  ............  Gets Ionic library version or updates the Ionic library
   login  ..........  Login to your Ionic account
   io  .............  Integrate your app with Ionic Cloud services
   security  .......  Store your app's credentials for the Ionic Cloud
   push  ...........  Upload APNS and GCM credentials to Ionic Push
   package  ........  Use Ionic Package to build your app
   config  .........  Set configuration variables for your ionic app
   service  ........  Add an Ionic service package and install any required plugins
   add  ............  Add an Ion, bower component, or addon to the project
   remove  .........  Remove an Ion, bower component, or addon from the project
   list  ...........  List Ions, bower components, or addons in the project
   info  ...........  List information about the users runtime environment
   help  ...........  Provides help for a certain command
   link  ...........  Sets your Ionic App ID for your project
   hooks  ..........  Manage your Ionic Cordova hooks
   state  ..........  Saves or restores state of your Ionic Application using the package.json file
   docs  ...........  Opens up the documentation for Ionic

```
WindowsにNode.jsをインストール

Visual Studio 2017でNode.jsの開発をするため、WindowsにNode.jsをインストールする手順です。

#環境
Windows 7 Professional SP1 64bit
※以前にnodist v0.7.2をインストールしていてこの時はアンインストール済み

#手順
公式サイトからインストーラーをダウンロード
https://nodejs.org/en/

![111.png](https://qiita-image-store.s3.amazonaws.com/0/112075/a3008065-c441-1b59-9483-d2fb55559e57.png)

LTSと書いてあるほうをダウンロードしました。

ダウンロードしたファイル（node-v6.10.0-x64.msi）を実行します。
後はインストーラーの指示の通りインストールします。

以上でインストール完了なんですが・・・

#不具合
npmを実行するとエラーが発生・・・

```bat:
>npm -v
Error: EPERM: operation not permitted, mkdir 'C:\Program Files (x86)\Nodist'
    at Error (native)

3.10.10
```

どうやら以前にnodistをインストールしていたことが原因のようです。
以下のサイトに解決方法がありました。

nodist v0.8.0をアンインストールし、Node.jsをインストール
http://okakacacao.wpblog.jp/technology/uninstall-nodist080-and-install-nodejs

このファイルを削除することでエラーが出なくなりました。

```
C:\Users\（ユーザー名）\.npmrc
```
PowerShell で「例えばこんな感じで置換して」という指定をする

# Convert-String コマンドレットの -Example オプション

PowerShell 5 から `Convert-String` というコマンドレットが「例」を置換のパータンとして指定できるようになっています。

簡単な例を見てみます。

```ps1:Covert-Stringサンプル
"Taro Yamada" | Convert-String -Example "Jiro Suzuki=J.Suzuki"
```

この場合は「例えば`Jiro Suzuki`を`J.Suzuki`と置換するように、`Taro Ymada`を置換してくれ」という指定になります。結果は以下の通りです。

```ps1:結果
T.Yamada
```

もちろん正規表現を使って置換もできますが、例で指定することによって直観的に理解しやすくなるのではないでしょうか。


- 参考
 - Convert-String
        - https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.utility/convert-string#-example
 - Use the PowerShell 5 Convert-String Cmdlet
        - https://blogs.technet.microsoft.com/heyscriptingguy/2015/08/17/use-the-powershell-5-convert-string-cmdlet/
AWS Batchを使ってバッチ処理を実装してみた。

### 今回やりたかったこと
- 社内で適用しているセキュリティのSaaSサービスのアップデートの自動化をしたい
- 処理内容は、基本的にapiをコールしてこねこねしていくだけ

### Lambdaでいいのでは？
- SaaSが提供しているapiサーバーが、アクセス集中時だと5分経ってもレスポンスを返してくれない


そこでAWS BATCH

### AWS BATCHとは
- Job queueを受けた段階で、予め指定しておいたスペック(スペックが足りなかったら自動で最適なものを立ててくれるらしい？)のEC2を立ち上げてECRからコンテナイメージを持ってきてタスク実行してくれる
- スケジュールを設定して実行してくれる！とかは無さそう。

### アーキテクチャ
<img width="503" alt="スクリーンショット 2017-03-19 22.05.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/74698/815a693c-70a5-1bad-b9dd-07a8c2c92bcc.png">

Dockerfileはこんな感じ

```
FROM centos:latest
RUN curl -kl https://bootstrap.pypa.io/get-pip.py | python
RUN pip install awscli
RUN yum install -y git
ADD init.sh /opt/
CMD ["sh","/opt/init.sh","test"]
```

事前に処理実行に必要なコードだったりシェルスクリプトなんかは、ECRに含めておく。
シェルには、コードコミットから実行ソースをcloneするのに必要なssh key(事前にKMSとかで暗号化しておいたもの)、復号化処理、処理実行とかを書いておく。

あとは、Job queueを送ってあげれば、自動でEC2を立ち上げ、コンテナをマウントして最新のソースコードをcloneしてきて、処理を実行してくれます。
自動で立ち上がったEC2はタスク処理終了後(CMDのとこのやつ)、1時間単位の課金が切れるタイミング？で自動で削除されます。(立ち上がりっぱなしとかの心配なし！)

```
job queueに送信
aws --profile <profile> --region <region> batch submit-job --job-name <好きな名前> --job-queue <job queueの名前> --job-definition <定義したjob>
```

結果については、 Jobsの画面で確認することができます。
<img width="1030" alt="スクリーンショット 2017-03-19 22.17.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/74698/9309229d-acc4-6854-b9c3-27fc164c6f31.png">

### まとめ

先日参加した「JAWS-UG KOBE」のコンテナまつりでHiganWorks sawanobolyさんがElasticDockerRunって呼んでるって言ってました。
DockerImageを基にいい感じに実行してくれるが、逆にBatch?なのかって印象でした。
もし、スケジュール実行で定期的にbatch処理をしたい！とかでれば、lambdaなんかを使ってqueueに送信してやるといいかなぁと思いました。

### 追記
シェル内にkmsで暗号化したssh keyを含めているのですが、出来れば外出ししたい。。
パラメーターストアとかに出せるかと思ったのですが、文字数制限の関係で無理でした。
FRONTEND CONFERENCE 2017 資料まとめ

[FRONTEND CONFERENCE 2017](http://kfug.jp/frontconf2017/)に参加したのでそのまとめ
復習のためや聞けなかったセッションや行けなかったハンズオンもあったので資料を探してみました。
見つけれていないセッションの資料は見つけ次第更新します。
もし知っていたらコメントか編集リクエストくださいm(_ _)m

# セッション

* [あらゆる人のためのフロントエンド](https://speakerdeck.com/potato4d/arayururen-falsetamefalsehurontoendo-number-frontkansai)<br>
花谷拓磨(@Potato4d)さん
* [新ツールやサービスから考える、明日からのデザインフロー](https://speakerdeck.com/witch_doktor/xin-turuyasabisukarakao-eru-ming-ri-karafalsedezainhuro)<br>
深沢 幸治郎さん
* [エンジニアとデザイナーとの距離](https://www.slideshare.net/manabuyasuda1/ss-73215731)<br>
安田 学さん
* [HTMLスナップショット2016改](https://github.com/momdo/talk/blob/master/webtalk_2017-03-18.pdf)<br>
momdoさん
* [UIデザインから知る「持続可能なデザイン」](https://speakerdeck.com/ykazu/sustinable-frontend-design)<br>
山下 一樹さん
* [React/FluxベースのElectronアプリをリモートチームで開発した話](https://speakerdeck.com/kaiichiro/fluxbesufalseelectronapuriworimototimudekai-fa-sitahua)<br>
太田 絵一郎さん
* [ウェブを構成するUIの品質とHTML](http://masup.net/slide/frontconf2017/index.html#/)<br>
桝田 草一さん
* [スタンドアロンAMPのススメ](http://tech.mercari.com/entry/recommending-standalone-amp)<br>
石本 光司さん
* [Enduring CSS](https://www.slideshare.net/Takazudo/enduring-css)<br>
高津戸 壮(@Takazudo)さん
* [flowtype による型のある世界入門](https://www.slideshare.net/sairoutine/flow-73272518)<br>
さいさん
* [CSSフレームワークをつくろう！](https://speakerdeck.com/inc2734/csshuremuwakuwotukurou)<br>
キタジマ タカシさん
* [WebGL 2.0 時代の幕開け ウェブのグラフィックスはどう変わっていくのか](https://doxas.org/slide/frontkansai2017/)<br>
杉本 雅広さん
* フロントエンドの制作現場をレガシー化させないために<br>
後藤 知宏さん
* [いわゆる”フロントエンド”がない世界について考える](https://speakerdeck.com/hideokamoto/iwayuru-hurontoendo-ganaishi-jie-nituitekao-eru)<br>
岡本 秀高さん
* webの変遷から考えるUIの設計とその先<br>
榊原昌彦さん

# ハンズオン
githubリポジトリはハンズオン用のリポジトリのリンクです。

- [XDを使ってプロトタイプを作ろう](https://docs.google.com/presentation/d/1GGH4_I_bHQIGRc2lASXGXsvrBfaJoRF_mNDMjvUU-6E/edit#slide=id.g35f391192_00)<br>
Yasui Risaさん
- [sketchの基本操作を覚えて業務に活かそう](https://contiki9.github.io/FRONTEND-CONFERENCE-2017-sketch/)<br>
コンチさん
- [gulpで学ぶSassとpug](https://docs.google.com/presentation/d/1YzBks4o29ve9qq3UfLIDlHucmzc84OkE0SWF7Tr-Ckg/edit#slide=id.g35f391192_00)<br>
ショウノ シオリさん<br>
[githubリポジトリ](https://github.com/sshono1210/frontend-basic/tree/master)<br>
[コードペンのサンプル](https://codepen.io/sshono1210/pen/pepyMr)<br>
- [Reactで覚えるイマドキのフロントエンド開発](https://speakerdeck.com/fand/reactdexue-bu-imadokifalsewebkai-fa)<br>
アマギタカヨシさん<br>
[githubリポジトリ](https://github.com/fand/react-hands-on)<br>
- [Netlifyで作ったSPAやwebサイトを公開しよう](https://speakerdeck.com/hideokamoto/hurontoendokanhuarensu-2017-netlifyhanzuon)<br>
岡本 秀高さん
- Angular入門者ハンズオン<br>
奥野 賢太郎さん (armorik83)<br>
[githubリポジトリ](https://github.com/ng-japan/ng2-hands-on-seed/tree/master/courses/material-todoapp)<br>

# 感想
全体的に面白かったです！これで無料で参加できるのだから関西にお住まいの方は行かなきゃ損です！
あとセッションやハンズオンによっては満席になって聴講できない可能性もあるので絶対聞きたいセッションや参加したいハンズオンがある場合個人スポンサーもあります。
docker + node.jsでe6を試したメモ

`babel-node`を利用して、node.jsでもes6の記法を使えるようにする。
`node_modules`をignoreから外す。[*][*1]

## 環境

* docker17.03.0-ce
* ubuntu-16.04(仮想環境)
* vagrant1.9.2
* virtual box 5.1.18
* windows10


## ディレクトリ構造

```yaml
- express
  - Dockerfile
  - package.json
  - .babelrc
- project
  - src
    - app
      - app.js 
      - bin
        - www
- docker-compose.yml
```

## ファイル

```docker:express/Dockerfile
FROM node:7.7.3
WORKDIR /express/app
RUN npm init -y
RUN npm install babel-cli --save
RUN npm install express@5.0.0-alpha.5 --save
RUN npm install babel-preset-latest --save-dev
```

```json:express/package.json
{
  "name": "app",
  "version": "1.0.0",
  "description": "",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "babel-node ./bin/www"
  },
  "dependencies": {
    "babel-cli": "^6.24.0",
    "express": "^5.0.0-alpha.5"
  },
  "devDependencies": {
    "babel-preset-latest": "^6.24.0"
  }
}
```

```json:express/.babelrc
{
  "ignore": [],
  "presets": ["latest"]
}
```

```yaml:docker-compose.yml
version: '2'
services:
  express:
    build: ./express
    volumes:
    - ./express/package.json:/express/app/package.json
    - ./express/.babelrc:/express/app/.babelrc
    - ./project/src/app/bin:/express/app/bin
    - ./project/src/app/app.js:/express/app/app.js
    ports:
      - "3000:3000"
    command: [npm, run, start]
```

```js:project/src/app/app.js
import express from 'express';

const app = express();

app.get('/', (req, res) => {
  res.send('Hello World!');
});

module.exports = app;
```

```js:project/src/app/bin/www
#!/usr/bin/env node

import app from '../app';
import debug_module from 'debug';
import http from 'http';

const debug = debug_module('wmfwapp:server');

const port = normalizePort(process.env.PORT || '3000');
app.set('port', port);

const server = http.createServer(app);

server.listen(port);
server.on('error', onError);
server.on('listening', onListening);

function normalizePort(val) {
  const port = parseInt(val, 10);

  if (isNaN(port)) {
    // named pipe
    return val;
  }

  if (port >= 0) {
    // port number
    return port;
  }

  return false;
}

function onError(error) {
  if (error.syscall !== 'listen') {
    throw error;
  }

  const bind = typeof port === 'string'
    ? `Pipe ${port}`
    : `Port ${port}`;

  // handle specific listen errors with friendly messages
  switch (error.code) {
    case 'EACCES':
      console.error(`${bind} requires elevated privileges`);
      process.exit(1);
      break;
    case 'EADDRINUSE':
      console.error(`${bind} is already in use`);
      process.exit(1);
      break;
    default:
      throw error;
  }
}

function onListening() {
  const addr = server.address();
  const bind = typeof addr === 'string'
    ? `pipe ${addr}`
    : `port ${addr.port}`;
  debug(`Listening on ${bind}`);
}
```

## 参考

[ECMAScript6でNode.jsを動かす - babel-node][*1]
[babel-presets][*2]
[babel-node][*3]

[*1]:http://qiita.com/RyotaSugawara/items/af51321b4796d671bc01
[*2]:https://babeljs.io/docs/plugins/preset-latest/
[*3]:https://babeljs.io/docs/usage/cli/#babel-node
[C#] 文字列を空白で分割する（複数指定, 連続空白, 半角/全角空白対応）

WPFで検索バーを実装する際に半角/全角空白で分割する指定方法が必要だったのでメモ

基本的に `string.Split()` を使用すれば良いです。
連続空白の場合の対応として、データがない場合を無視する `StringSplitOptions.RemoveEmptyEntries` オプションを使用します。

さすがにユニコード空白は考えないことにしてますが必要なら足してください。

# 実装例

```csharp:サンプル
using System;

namespace hwapp
{
    class Program
    {
        static void Main(string[] args)
        {
            // 半角空白, 連続半角空白, 全角空白, 連続全角空白
            var text = "hoge foo  bar　Hoge　　Foo";

            SplitFunc1(text);
            SplitFunc2(text);
        }

        private static void SplitFunc1(string text)
        {
            var words = text.Split(new string[] { " ", "　" }, StringSplitOptions.RemoveEmptyEntries);

            foreach (var word in words)
            {
                Console.WriteLine($"[1] {word}");
            }
        }

        private static void SplitFunc2(string text)
        {
            var words = text.Split(new char[] { ' ', '　' }, StringSplitOptions.RemoveEmptyEntries);

            foreach (var word in words)
            {
                Console.WriteLine($"[2] {word}");
            }
        }
    }
}
```

```console:実行結果
[1] hoge
[1] foo
[1] bar
[1] Hoge
[1] Foo
[2] hoge
[2] foo
[2] bar
[2] Hoge
[2] Foo
```

# 参考
[StringSplitOptions 列挙型 (System)](https://msdn.microsoft.com/ja-jp/library/system.stringsplitoptions(v=vs.110).aspx)
apache 2.4 httpd.conf 設定

# apache 2.4 httpd.conf
## ロギング

### ELBのIPではなく接続元のIPを保存
	LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" elbcombined
### ELBからのヘルスチェック、ダミーコネクション、画像などのロギングをメインのログには出力しない。出力しなかったログを個別にロギング。
	SetEnvIf User-Agent "ELB-HealthChecker/2\.0" nolog
	SetEnvIf User-Agent "ELB-HealthChecker/2\.0" nologelb
	SetEnvIf User-Agent "internal dummy connection" nolog
	SetEnvIf Request_URI "\.(gif|jpg|png|css|ico|js)$" nolog
	SetEnvIf Request_URI "\.(gif|jpg|png|css|ico|js)$" nologcss
	CustomLog "logs/access_log" elbcombined env=!nolog
	CustomLog "logs/elb_access_log" elbcombined env=nologelb
	CustomLog "logs/css_access_log" elbcombined env=nologcss
## セキュア設定
	TraceEnable off
	ServerTokens Prod
	Header always unset X-Powered-By
	RequestHeader unset Proxy
	Header append X-Frame-Options SAMEORIGIN
	Header set X-XSS-Protection "1; mode=block"
	Header set X-Content-Type-Options nosniff
	Header always unset Etag
### HTTP Strict Transport Security（HSTS）を有効にする設定（追記 1/25）
	Header set Strict-Transport-Security "max-age=31536000;"
PowerShell で Project Euler 7

# 問題

* 本家：[Problem 7 - Project Euler](https://projecteuler.net/problem=7)
* 翻訳：[Problem 7 - PukiWiki](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%207)

> 素数を小さい方から6つ並べると 2, 3, 5, 7, 11, 13 であり, 6番目の素数は 13 である.
> 10 001 番目の素数を求めよ.

# エラトステネスの篩

```ps1
10001 |
    ? {$_ -ge 1} |
    % {$count = 0} `
      {
        $maxCount = $_
        $upper = [Math]::Max(11, [Math]::Ceiling($_ * ([math]::log($_) + [math]::log([math]::log($_)))))
        $skip = New-Object System.Collections.BitArray ($upper - 1)
        foreach($p in 2..$upper)
        {
            if ($skip.Get($p - 2))
                {continue}
            
            $count++
            if ($count -eq $m)
                {return $p}

            for($i = $p * $p; $i -le $upper; $i += $p)
                {$skip.Set($i - 2, $true)}
        }
    }
```

エラトステネスの篩は１～Xに存在する素数を列挙するアルゴリズムで、使う場合は、上限Xを指定する必要がある。上記プログラムではピエール・デザルト先生の下記公式を使って上限を見積もっている。

* $\pi(n) < n (\ln n + \ln (\ln n))$
    * $n \ge 6$ のとき成り立つ
    * $\pi$ : 素数計数関数
    * $\ln$ : 自然対数


# 以上

素数計数関数に関する不等式の研究があることを初めて知った。
PowerShell で Project Euler 6

# 問題

* 本家：[Problem 6 - Project Euler](https://projecteuler.net/problem=6)
* 翻訳：[Problem 6 - PukiWiki](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%206)

> 最初の10個の自然数について, その二乗の和は,
> $1^2 + 2^2 + ... + 10^2 = 385$
> 最初の10個の自然数について, その和の二乗は,
> $(1 + 2 + ... + 10)^2 = 3025$
> これらの数の差は 3025 - 385 = 2640 となる.
> 同様にして, 最初の100個の自然数について二乗の和と和の二乗の差を求めよ.

# 素直に

```ps1
100 |
    % {1..$_} |
    % {$a, $b = 0, 0} {$a += $_ * $_; $b += $_} {$b * $b - $a}
```

# 総和の公式を使って

```.ps1
100 |
    % {$_ * ($_ + 1) * ($_ - 1) * (3 * $_ + 2) / 12}
```

$(\sum_{k=1}^{n} k)^2 - \sum_{k=1}^{n} k^2$$ = \left( \frac{n (n + 1)}{2} \right)^2 - \frac{n (n + 1)(2 n + 1)}{6}$$ = \frac{n(n+1)(n-1)(3n+2)}{12}$

# 以上

おわり。
Apache ManifoldCFを動かしてみる

とりあえずこのページを読んで、動かしてみた。
http://blog.enjoyxstudy.com/entry/2015/01/27/000000

ちなみにログインするときのid/passwdはadmin/admin。

本家のページはこっち。
https://manifoldcf.apache.org/release/release-2.5/en_US/end-user-documentation.html

このページもそのうちお世話になるかも。少し情報が古そうだけれども。。
http://www.francelabs.com/blog/tutorial-for-combining-manifoldcf-and-solr-for-files-search/

英語版のManifoldCF in Actionを読んで見るかも。
https://github.com/DaddyWri/manifoldcfinaction/tree/master/pdfs
PowerShell で Project Euler 5

# 問題

* 本家：[Problem 5 - Project Euler](https://projecteuler.net/problem=5)
* 翻訳：[Problem 5 - PukiWiki](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%205)

> 2520 は 1 から 10 の数字の全ての整数で割り切れる数字であり, そのような数字の中では最小の値である.
> では, 1 から 20 までの整数全てで割り切れる数字の中で最小の正の数はいくらになるか.

# ユークリッドの互除法を使って

```.ps1
20 |
    ? {$_ -ge 1} |
    % {1..$_} |
    % {$acc = 1} {
        $min, $max = if ($_ -lt $acc) {$_, $acc} else {$acc, $_}
        while ($min -gt 0) {$min, $max = ($max % $min), $min}
        $acc = $acc * $_ / $max
    } {$acc}
```

$f(n) $$= \text{lcm}(1 \dots n) $$= \text{lcm}(\text{lcm}(1 \dots n -1), n) $$= \text{lcm}(f(n -1), n) $$= \frac{n}{\gcd(f(n -1), n)} f(n -1)$

* f(n) : 1からnまでの整数の最小公倍数
* lcm : 最小公倍数
* gcd : 最大公約数


# エラトステネスの篩を使って

```.ps1
20 |
    ? {$_ -ge 2} |
    % {
        $n = $_
        $skip = New-Object System.Collections.BitArray ($_ - 1)
        2..$_
    } |
    ? {-not $skip.Get($_ - 2)} |
    % {$acc = 1} {
        for($i = $_ * $_; $i -le $n; $i += $_)
            {$skip.Set($i - 2, $true)}

        for($i = $_; $i -le $n; $i *= $_)
            {$acc *= $_}
    } {$acc}
```

```math
f(n) = \prod_{p;\text{prime}} p^{\max(0, \lfloor \log_p n \rfloor)}
```

# おわり

ユークリッドの互除法の速さたるや。ちなみに次が成り立つ。

```math
\frac{n}{\gcd(f(n -1), n)} = \left\{
\begin{array}{ll}
p & (n = p^k;~ p \text{は素数}; ~ k \text{は正整数}) \\
1 & (\text{otherwise})
\end{array}
\right.
```
$.Deferredのresolve/rejectをすぐに返したいときの書き方省略方法

Promise(& Promise PolyFill)を使わずに、jQueryの `Deferred` を用いて非同期処理を書いているときに出くわしたのでメモ。

非同期的にしたくないときでも `.then()` をつなぎたいがために以下のように3行書いていました。

```js
a().then(() => {
  const defer = new $.Deferred;
  // 非同期の間でしたい処理
  defer.resolve();
  return defer.promise();
}).then(() => b());
```

ですが、以下のように書けば同じ動作をしてくれます。
2行減るのでちょっと見通しが良くなります。

```js
a().then(() => {
  // 非同期の間でしたい処理
  return (new $.Deferred).resolve();
}).then(() => b());
```

以上です。
プログラミングわからない人向けディープラーニング式アスキーアートオートトレーサー導入手順

Qiitaで書く内容じゃないなと思いつつ。

# 概要

ディープラーニング式AAオートトレーサー (以下、DeepAA) の導入方法をプログラミングわからない人向けに説明します。AAクラスタ、やる夫クラスタ向け。
DeepAAについての詳細はこちら↓
[ディープラーニングでアスキーアートを作る](http://qiita.com/OsciiArt/items/325714d8ab3f2b482ced)

# 環境

- Window 10 (64bit)

Windows 7 以降なら多分大丈夫です。

# 各種インストール

### 1. Python (Anaconda) をインストール
Anaconda installer archive
https://repo.continuum.io/archive/
から`Anaconda3-4.2.0-Windows-x86_64.exe`をクリックしてダウンロードする。
![Anaconda.png](https://qiita-image-store.s3.amazonaws.com/0/168784/9fee2e8d-9002-ec2c-8149-e0f653a0b242.png)
ダウンロードが終わったら実行してインストーラーに従ってインストールする。

### 2. 各種ライブラリをインストール
コマンドプロンプトを開く (windows の検索すると子に「cmd」と入力すると出てくる)。
以下のコマンドを実行する (それぞれの行の「$」より後の内容を入力してエンター)。

```bash
$ pip install keras==1.2.0
$ pip install tensorflow
```

### 3. PyCharmをインストール
PyCharm公式サイト (英語) からインストーラーをダウンロードする。
https://www.jetbrains.com/pycharm/
![pycharm.png](https://qiita-image-store.s3.amazonaws.com/0/168784/1c11645b-6803-243e-8a50-84f852feb32d.png)
ダウンロードが終わったらインストーラーに従ってインストールする。

### 4. DeepAAをインストール
githubのレポジトリ
https://github.com/OsciiArt/DeepAA
で、「Clone or Download」をクリック、続いて「Download Zip」をクリックしてDeepAAのzipをダウンロード。
![DeepAA.png](https://qiita-image-store.s3.amazonaws.com/0/168784/3873f824-a626-fb8b-e7fc-6c475f957b43.png)
ダウンロードしたら、解凍する。
解凍されたフォルダ `DeepAA-master` を好きなフォルダにおいてください。

### 5. **実行テスト**
Pycharmを起動します。初回起動では色々聞いてくると思いますが全部yesをクリックしましょう。
右上のメニューから[File]-[Open]をクリック。
![open.png](https://qiita-image-store.s3.amazonaws.com/0/168784/7c309667-94f6-f9ab-03ac-c4710d4d9d5f.png)
保存した「DeepAA-master」を選択します。
左のパネルから`deepaa_output.py`を選択してダブルクリック。
右に開いた画面上で右クリックし、開いたパネル上の`Run 'deepaa_output'`をクリック。
![execute.png](https://qiita-image-store.s3.amazonaws.com/0/168784/94c9fb46-aa5d-df45-d00d-d7130aac18f9.png)
AAの出力が画面下で始まったら実行成功です。

# 自分で用意した画像をAA化

### 1. 線画作成用のソフトをインストール
[こちら](https://onedrive.live.com/?authkey=%21APuDfORKnMld3YE&id=2A550F2DD4D15CFC%21116&cid=2A550F2DD4D15CFC)
から`AAConvert.7z`をダウンロード。
ダウンロードしたらファイルを解凍。
中の`AsciiArtConverter08.exe`を実行
(AA自動変換ソフトですが線画作成機能だけお借りします。)

### 2. 線画抽出
左上のメニューから[ファイル]-[イメージファイルを開く]をクリック。
用意した変換したい画像を選択。
`輪郭抽出プレビュー`をクリックして線画。その他パネル上のパラメータを調整してより良い線画抽出を行います。
線画が抽出出来たら、線画の上で右クリック、開いたパネル上の`輪郭線画像を保存する`をクリック。
保存先フォルダは「DeepAA-master」を選択して保存してください。

### 3. AA変換
PyCharmでdeepaa_output.pyの内容を設定します。
`# パラメータ`の内容を以下のように書き換えます。

17行目

```py
image_path = 'test_image.png' # 変換する画像を指定
```
の`test_image.png`を先ほど保存したファイルのファイル名に変更。

18行目

```py
image_width = 550 # 画像サイズの変換設定. 変換後の横幅を入力する. ''なら変換しない. 1st setting: 550
```
の`550`を変更してサイズを調整。数値は調整後の画像の横幅に当たります。

20行目

```py
multi_output = False # 1ピクセルずつ縦にずらして18個出力
```
の`False`を`True`に変更すると、画像を1ピクセルずつずらして18回一気に出力します(オプション)。
右クリックし、開いたパネル上の`Run 'deepaa_output'`をクリック。思った通りAAが出力されれば成功です。
PostgreSQLをローカルにインストールする

最近のPostgreSQLはJSONに対応したそうですね！
でももうサービスで入っててバージョンあげたくないよ！
よし、ローカルにいれて試そう！

今回は/home/ubuntu/workspace/user/にポート20000で建てるよ！出力は略すね！ごめんよ！
<pre>
$ cd /home/ubuntu/workspace/user/
$ wget https://ftp.postgresql.org/pub/source/v9.6.2/postgresql-9.6.2.tar.gz
$ tar xvzf postgresql-9.6.2.tar.gz
$ cd postgresql-9.6.2/
$ ./configure --prefix=/home/ubuntu/workspace/user/
$ make
$ make install
$ cd ..
$ bin/initdb data
$ bin/pg_ctl -D data -o "-p 20000" start                                                                                            
server starting
$ bin/createdb test -p 20000 
$ bin/psql test -p 20000
psql (9.6.2)
Type "help" for help.

test=# 
</pre>

よし！動いた！軽くJSONしてみようか？
<pre>
test=# select '{ "aa": 12 }'::jsonb;
   jsonb    
------------
 {"aa": 12}
(1 row)

test=# \q
$ 
</pre>

うん、動いてるね！！やった！

じゃあ遊ぶのは今度にしてDB止めようか！
<pre>
 $ bin/pg_ctl -D data stop
</pre>

またね！
HomebrewでMacにMongoDBをインストールした時のメモ


Qiita初心者なので、練習がてらの投稿です。

# 環境
Mac      : 10.11.5（OS X El Capitan）
Homebrew : 1.1.11
MongoDB  : 3.4.2

#参考URL
https://docs.mongodb.org/manual/tutorial/install-mongodb-on-os-x/

#インストール手順
## Homebrewのパッケージをアップデート
```
$ brew update
```

## MongoDBをインストール
```
$ brew install mongodb
```

参考URLを見ていただくと他にも

* TLS/SSLサポート付きのインストール
* 最新の開発用版のインストール

があるようですが、今回はそれらはやめておきます。
どれもエラーが出るようなので、Normalに **install mongodb**  を叩きます。

```
$ brew install mongodb
==> Downloading https://homebrew.bintray.com/bottles/mongodb-3.4.2.el_capitan.bottle.1.tar.gz
######################################################################## 100.0%
==> Pouring mongodb-3.4.2.el_capitan.bottle.1.tar.gz
==> Caveats
To have launchd start mongodb now and restart at login:
  brew services start mongodb
Or, if you don't want/need a background service you can just run:
  mongod --config /usr/local/etc/mongod.conf
==> Summary
🍺  /usr/local/Cellar/mongodb/3.4.2: 17 files, 266.6MB
```

##バージョン確認

```
$ mongo --version
MongoDB shell version v3.4.2
```

#設定ファイル
/usr/local/etc/mongod.conf

#MongoDBを実行する


##データ格納用ディレクトリの作成
まず最初にデータを保存するディレクトリを作成します。
デフォルトでは **/data/db** になっているようで、初期実行時にそのディレクトリにデータファイルが生成されるようです。

```
$ sudo mkdir /var/lib/mongodb
```

##ログファイルの作成
ログの出力先ファイルを作成します。

```
$ sudo touch /var/log/mongodb.log
```

##MongoDBを手動で起動
###フロントエンドで起動
先程作成した **データ格納用ディレクトリ** と **ログファイル**　を指定してMongoDBを起動します。
起動するとターミナルで待ち受け状態になります。

```
$ sudo mongod --dbpath /var/lib/mongodb --logpath /var/log/mongodb.log
```

停止する場合は ```Control + C```

###バックエンドで起動
``` --fork``` コマンドを付与します。

```
$ sudo mongod --fork --dbpath /var/lib/mongodb --logpath /var/log/mongodb.log
```

バックエンドで起動した場合はMongoシェルからの停止になります。

```
$mongo
> use admin
switched to db admin
> db.shutdownServer()
server should be down...
```

##MongoDBを自動起動に設定
MongoDBをインストールした際に ```To have launchd start mongodb now and restart at login: brew services start mongodb```
とあったので、

```
$ brew services start mongodb
==> Successfully started `mongodb` (label: homebrew.mxcl.mongodb)
```

```
$ brew services list
Name    Status  User Plist
mongodb started frog /Users/frog/Library/LaunchAgents/homebrew.mxcl.mongodb.plist
```

```
$ ls -l ~/Library/LaunchAgents
total 16
-rw-------  1 frog  staff  949  3 19 20:41 homebrew.mxcl.mongodb.plist
```

startの部分を ```stop``` 自動起動を停止できます。


##デフォルトポート
デフォルトのポートは **27017** になっており、
http://localhost:27017 
にアクセスすると ```It looks like you are trying to access MongoDB over HTTP on the native driver port.```
と表示されます。





##別ターミナルでMongoシェルを起動
通常ですとMongoのPATHが通っていると思うので、
以下のコマンドで起動します。

```
$ mongo
```

抜ける時は ```exit``` 

#HomebrewにてMongoDBの再インストールしたくなった時
```
brew uninstall mongodb
```

もし、アンインストール中に<font color="Red">Permission denied</font>エラーがでた時は

```
$ sudo chown -R $USER /usr/local
```

にてアンインストールを行い、データ保管用ディレクトリの削除を行う。

```
$ sudo rm -rf /var/lib/mongodb
$ sudo rm -rf /var/log/mongodb.log
```

とりあえずここまで(ﾟ￢ﾟ)
イベント付きなＵＩデザインパターンを並べる方法(am-coffee-time利用)

# この記事は古いです
最新は以下レポジトリでご確認できます
https://github.com/ampcpmgp/am-coffee-time


# 過去ログ


[am-coffee-time](
https://github.com/ampcpmgp/amdev/tree/master/modules/am-coffee-time)を0.6.2に上げたので、また共有してみます！

前回同様、ざっくりした動きをgifアニメーションにて。[実際のページはこちらより](https://ampcpmgp.github.io/amdev/modules/am-coffee-time/web/)


![mouse.gif](https://qiita-image-store.s3.amazonaws.com/0/85111/c9b0ad26-679e-1bbb-0e2c-28250a4fbf01.gif)


[前回の記事](http://qiita.com/Akira_for_work/items/01b20c9927944995fc18)ではnpmを使わない書き方をしていたので、逆に煩雑になってしまいました。
今回はnpm前提でかきます。

## TL;DR
am-coffee-timeとは、アサーションつきなＵＩデザイン一覧作成モジュールです。

このモジュールは、パターンを表示するページと、実際に動作するページの二つの世界を持ちます。

## 各ページの説明

### 親ページ（ツリーやアサーション結果を表示）
gifに「全パターン」と書かれている、ツリー上表記になっているページは、UIデザイン一覧を表示するページです。ここでは、以下のプログラミングを書くことで動作します。

list.html

```html
<test-list></test-list>
<script src="./list.js" charset="utf-8"></script>
```

list.js

```javascript
import generate from 'am-coffee-time/browser/generate'
const patterns = {
  '全パターン': {
    '動作フロー確認用': {
      '結果=成功': './index.html',
      '結果=失敗': './index.html'
    },
    'ID入力=melon': {
      'PW入力=google': './index.html',
      'PW入力=apple': './index.html'
    },
    'スイッチ[日本語(lang=ja) | 英語(lang=en) | 中国語(lang=ch)]': '多言語化(./index.html)'
  }
}
generate(patterns)

```
上記にて、表示が出来上がります。次に、上記のキーの部分（カッコがあるときはそのカッコ内）のデータが、値に指定されたＵＲＬを開くときに渡り、イベントを分岐させることが出来ます。


### 子フレーム(UIを持つページ)
gifでログイン画面が表示されているページになり、以下のactionオブジェクトで指定する各関数で値を受け取りイベントを発火できます。

```javascript
import Test from 'am-coffee-time/browser/Test'
import AutoEvent from 'am-autoevent/browser/AutoEvent-no-gen'
const autoEvent = new AutoEvent()
const $ = (selector) => document.querySelector(selector)
const actions = {
  lang: (type) => {
    autoEvent.wait(200).addEvent(() => {
      $('before-login > span:first-child').innerHTML = `<div>言語は ${type} です</div>` + $('before-login > span:first-child').innerHTML
    })
  },
  動作フロー確認用: () => console.log('動作フロー確認です'),
  結果: (値) => {
    if (値.match('成功')) console.assert(true)
    else if (値.match('失敗')) console.assert(false, '失敗です')
  },
  ID入力: (value) => {
    autoEvent
      .wait(400).setValue('[name="id"]', value)
  },
  PW入力: (value) => {
    autoEvent
      .wait(400).setValue('[name="pw"]', value)
      .wait(400).click('[name="check"]')
      .wait(400).addEvent(() => console.assert($('after-login'), 'after-login not found'))
  }
}
autoEvent.register()
Test.start(actions)
autoEvent.start(1, () => console.info('finished'))

```

console.assertで叩かれた値を見て、成功/失敗を見ています。
最後にconsole.info("finished")を打つことで、テストの終了を表します。

非同期処理を書くのが面倒だったのでautoEventを使いましたが、自身でpromiseなど使って書くのでも大丈夫です。


## 終わりに
最近仕事で、デザインパターン一覧を生成するツールとして使わせてもらっています。
次の役割としてはUIの振る舞い確認として、どういったアサーションをかけていけば良いか、やはり画像差分を出し目で見て確認することが必須なのか、色々議論しています。

ユニットテストでは判定できない部分を重点的に見ていくのかなと思っています！
[めも]Oracle JRE will no longer trust MD5-signed code by default (2017/4/18以降)

見つけたのでめも。

[Java SE Downloads](http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html)から引用
> Important planned change for MD5-signed JARs
Starting with the April Critical Patch Update releases, planned for April 18 2017, all JRE versions will treat JARs signed with MD5 as unsigned.

訳:
MD5で署名されたJARに関する重要な計画
4月の重要なアップデートパッチ(計画では2017年4月18日)以降、すべてのJREバージョンにおいて、MD5で署名されたJARは署名されていないものとして扱われるようになります。

----
詳細記事: [Oracle JRE will no longer trust MD5-signed code by default](https://blogs.oracle.com/java-platform-group/entry/oracle_jre_will_no_longer)

> This change affecting MD5-signed JARS will be enabled by default no sooner than with Oracle Java SE 8u131 which will be released with the April 2017 Critical Patch Update, as well as in the corresponding releases of Oracle Java SE 7, Oracle Java SE 6 and Oracle JRockit R28, which will be available to qualified customers through My Oracle Support.

対象バージョンは、早くても8u131以降。
Java SE 7、Java SE 6なども、同時にアップデートが提供される(サポート契約の内容による)。
[Visual Studio Code][C#] VSCodeでC#の環境を整える

WPFとかのプロジェクトを作っていますが。C# の文法などの確認を別環境でさっと確認したかったので、環境整備したメモ

SDKと拡張機能を入れるぐらいで使用できます。

# 個人的な感想 (2017/5/22 時点)

VSCodeでC#を編集する環境を作成はしてみたものの、Nugetパッケージ周りが弱いため
コンソールアプリでの最小構成確認でも通常のVisual Studioを使ったほうがよさそうな感じでした。

# 事前準備
## Visual Studio Code のインストール

[Visual Studio Code - Code Editing. Redefined](https://code.visualstudio.com/)

## .NET Core SDK のインストール

[.NET - Powerful Open Source Development](https://www.microsoft.com/net/core#windowscmd)

## Visual Studio Code のC#プラグインをインストール

```
ext install csharp
```

[C# - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=ms-vscode.csharp)

# 環境確認

dotnet コマンドでプロジェクトを作成

```
$ dotnet new console -o hwapp
$ cd hwapp
$ dotnet restore
$ dotnet run
```

## シンタックスハイライト

![image](https://qiita-image-store.s3.amazonaws.com/0/37721/77158b9e-23e2-54e7-8216-42968418b94f.png)

## シンタックスチェック

![image](https://qiita-image-store.s3.amazonaws.com/0/37721/76e3ef32-d49d-c639-55f1-5463312cdee6.png)

## コード補完

![image](https://qiita-image-store.s3.amazonaws.com/0/37721/223437ee-f0b9-d878-23fc-40d0b7abec53.png)

# 参考
[Visual Studio Code でサクッと C# のコンソールアプリをデバッグしよう - Mac 編 - Xamarin 日本語情報](http://ytabuchi.hatenablog.com/entry/2017/02/24/140000)
[JAWS-UG CLI] StepFunctions #3 ステートマシンの削除

前提条件
========


StepFunctionsへの権限
---------------------

StepFunctionsに対してフル権限があること。


AWS CLIのバージョン
-------------------

以下のバージョンで動作確認済

- AWS CLI 1.11.63

```bash:コマンド:
aws --version
```

結果(例):

      aws-cli/1.11.63 Python/2.7.10 Darwin/15.6.0 botocore/1.5.26

バージョンが古い場合は最新版に更新しましょう。

```bash:コマンド:
sudo -H pip install -U awscli
```


0. 準備
=======

まず変数の確認をします。

```bash:変数の確認:
cat << ETX

        AWS_DEFAULT_PROFILE: (0.1) ${AWS_DEFAULT_PROFILE}
        AWS_DEFAULT_REGION:  (0.2) ${AWS_DEFAULT_REGION}
        STEPF_STATEM_ARN:    (0.3) ${STEPF_STATEM_ARN}

ETX
```

結果(例):

      AWS_DEFAULT_PROFILE: (0.1) stepfunctionsas_full-prjZ-mbp13
      AWS_DEFAULT_REGION:  (0.2) ap-northeast-1
      STEPF_STATEM_ARN:    (0.3) arn:aws:states:ap-northeast-1:XXXXXXXXXXXX:stateMachine:<削除対象のステートマシン>

変数が入っていない、適切でない場合は、それぞれの手順番号について作業を
行います。


0.1. プロファイルの指定
-----------------------

プロファイルの一覧を確認します。

```bash:コマンド:
cat ~/.aws/credentials \
       | grep '\[' \
       | sed 's/\[//g' | sed 's/\]//g'
```

結果(例):

      iamFull-prjz-mbpr13
      stepfunctionsas_full-prjZ-mbp13

```bash:変数の設定:
export AWS_DEFAULT_PROFILE='stepfunctionsas_full-prjZ-mbp13'
```


0.2. リージョンの指定
---------------------

```bash:変数の設定:
export AWS_DEFAULT_REGION='ap-northeast-1'
```


0.3. ステートマシン名の決定
---------------------------

```bash:変数の設定:
STEPF_STATEM_NAME='<削除対象のステートマシン>'
```

```bash:コマンド:
STEPF_STATEM_ARN=$( \
        aws stepfunctions list-state-machines \
          --query "stateMachines[?name == \`${STEPF_STATEM_NAME}\`]".stateMachineArn \
          --output text \
) \
        && echo ${STEPF_STATEM_ARN}
```

結果(例):

      arn:aws:states:ap-northeast-1:XXXXXXXXXXXX:stateMachine:<削除対象のステートマシン>


1. 事前作業
===========


ステートマシンの確認
--------------------

```bash:コマンド:
aws stepfunctions describe-state-machine \
        --state-machine-arn ${STEPF_STATEM_ARN}
```

結果(例):



2. ステートマシンの削除
=======================

```bash:変数の確認:
cat << ETX

        STEPF_STATEM_ARN: ${STEPF_STATEM_ARN}

ETX
```

```bash:コマンド:
aws stepfunctions delete-state-machine \
        --state-machine-arn ${STEPF_STATEM_ARN}
```

結果(例):

      (戻り値なし)


3. 事後作業
===========


3.1. ステートマシンのステータス確認
-----------------------------------

```bash:コマンド:
STEPF_STATEM_STATUS=$( \
        aws stepfunctions describe-state-machine \
          --state-machine-arn ${STEPF_STATEM_ARN} \
          --query "status" \
          --output text \
) \
        && echo ${STEPF_STATEM_STATUS}
```

結果(例):

      DELETING


3.2. ステートマシンの不存在確認
-------------------------------

同名のステートマシンが存在しないことを確認します。

```bash:コマンド:
aws stepfunctions describe-state-machine \
        --state-machine-arn ${STEPF_STATEM_ARN}
```

結果(例):

      An error occurred (StateMachineDoesNotExist) when calling the DescribeStateMachine operation: State Machine Does Not Exist: 'arn:aws:states:ap-northeast-1:XXXXXXXXXXXX:stateMachine:<削除対象のステートマシン>'


完了
====
Oculus Rift CV1 設定

購入して大分経ちますが、よくミスするので、忘備録として記載する。
※水冷クーラーが液漏れしたり、SSDが２５６GBで足りんだろうということで
１TBにしたりとか色々あったので書く

### 手順

1. 新品のSSDを買ってくる(512GB以上)
2. PCにつける
3. マザーボードが認識しているかBIOSで確認する
4. windows10入れる
5. ネットワークドライバいれる
6. あとで聞かれるのでUSBドライバもいれる
7. ネットワークドライバとUSBドライバ以外はお好み
8. Oculus Software入れる
9. Oculus Softwareの手順にしたがって、RiftをUSBに差す

この手順でやらないと動かないか問題が発生する

### 床から目までの高さ

https://zigsow.jp/item/321777/review/319464

![howtallareyou.png](https://qiita-image-store.s3.amazonaws.com/0/1762/bd7c0bee-fc05-9618-2fc7-dd41179ea866.png)

Entering your height lets Rift set floor positon in VR. This makes your experience feel even more real.

あなたの身長を入力すると、VRは床の位置をVRに設定します。 これにより、あなたの経験はよりリアルになります。

床から目までの高さらしいので、目から頭の上までが９。５センチで身長が１７８センチなので
１６８に設定

### 自作PCの水冷クーラー

http://www.ecomasterjapan.com/lepa/Peripherals/CPU-Cooler/Liquid/Exllusion-240/product-information.html

この水冷クーラーを使ってたんだけど、1回目液漏れで２回目は動作しなくなった。
１回目はGPUが死ぬかと思ったくらい液漏れしていたけど、大丈夫で修理で新品交換してもらった。
２回目は動作しなくなり、PCがうなりだしCPUの温度が１００℃になったので、PCを強制で終了させました。

諦めて

http://www.scythe.co.jp/cooler/kotetsu.html

空冷で行こうかなと思ったんですが、ケースに収まりきらず

http://www.scythe.co.jp/cooler/apsalus4-120.html

これに落ち着きました。

### windows 10 問題が発生してエラーになる

https://product-guides.oculus.com/en-us/documentation/rift/latest/concepts/rgsg-1-sw-software-setup/

Installing the Oculus App
Download the Oculus app, and install it on your computer.
Download Oculus Setup from www.oculus.com/setup.
Launch the OculusSetup.exe file after it finishes downloading.
After the welcome screen, read and accept the Oculus Terms and Conditions.
Read and accept the Health & Safety Warnings.
Click Install Now.

Oculus Softwareをインストールしてない状態のWindows10にRift CV1(HMD)をUSBに差すと
問題が発生してWindows10は動かなくなる

HMDをPCのUSBに差す前にOculus Softwareをインストールせざるおえない。
最初は気づかなかったのだけど、最近頻発するので、何かと思えばそういうことだった。
p2インスタンス上にCUDA, cuDNNを用いたChainer環境を構築する

# やったこと
AWSのp2.xlargeにCUDA, cuDNNを利用可能なChainer環境を作成してみました。

## 前提
以下のバージョンを利用しました。（実施時点のものです）

||version|
|:--:|:--:|
|OS|Ubuntu14.04|
|pyenv|1.0.8|
|Anaconda|4.3.0|
|python|3.6.2|
|CUDA|8.0|
|cuDNN|v5.1|
|Chainer|1.2.21|

## 必要なライブラリのインストール
```
sudo apt-get install -y git gcc make openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev
```

## pyenvのインストール 
pyenvのインストールは以下を参考にしました。
http://qiita.com/y__sama/items/5b62d31cb7e6ed50f02c

```
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bashrc
```

## Anacondaのインストール
Anacondaのインストールは以下を参考にしました。
http://qiita.com/y__sama/items/5b62d31cb7e6ed50f02c

```
pyenv install -l | grep anaconda
pyenv install anaconda3-4.3.0
pyenv rehash
pyenv global anaconda3-4.3.0
echo 'export PATH="$PYENV_ROOT/versions/anaconda3-4.3.0/bin/:$PATH"' >> ~/.bashrc
source ~/.bashrc
conda update conda
python --version
```

## CUDAのインストール
```
wget https://developer.nvidia.com/compute/cuda/8.0/Prod2/local_installers/cuda-repo-ubuntu1404-8-0-local-ga2_8.0.61-1_amd64-deb
sudo dpkg -i cuda-repo-ubuntu1404-8-0-local-ga2_8.0.61-1_amd64-deb
sudo apt-get update
sudo apt-get install cuda -y
echo 'export CUDA_HOME=/usr/local/cuda' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${CUDA_HOME}/lib64' >> ~/.bashrc
echo 'export PATH=$PATH:${CUDA_HOME}/bin' >> ~/.bashrc
```

## cuDNNのインストール
別途nvidiaのサイトから取得。

```
mkdir .cudnn
tar xvzf ./cudnn-8.0-linux-x64-v5.1.tgz
mv ./cuda ./.cudnn
mv ./.cudnn/cuda ./.cudnn/5.1
sudo ln -s ~/.cudnn/5.1/include/cudnn.h /usr/local/cuda/include/cudnn.h
sudo ln -s ~/.cudnn/5.1/lib64/libcudnn* /usr/local/cuda/lib64/
sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*
```

## Chainerのインストール
```
pip install chainer
```

## 動作確認
```
mkdir mnist
wget https://raw.githubusercontent.com/pfnet/chainer/master/examples/mnist/train_mnist.py ./mnist
# GPU使用
time python ./mnist/train_mnist.py -g 0 -e 10
# GPU不使用
time python ./mnist/train_mnist.py -g -1 -e 10
```
実行時間に差が出たら成功です。
GetVersionEx()でコンパイルエラーになったときの対処方法

昔作ったVisual C++プロジェクトをVisual Studio 2017でビルドした時、GetVersionEx関数がコンパイルエラーになってしまった。

![eee.png](https://qiita-image-store.s3.amazonaws.com/0/112075/58c2981b-c426-d8ff-9b8b-5cae9c8a395e.png)

GetVersionEx関数は古い形式で将来廃止されるため使ってはいけないみたいです。

#環境
Windows 7 Professional SP1 64bit
Visual Studio 2017 Community

#対処

対処方法は以下のサイトの通りです。
http://piyomanilife.hatenablog.com/entry/2016/06/15/091232

VersionHelpers.h にある関数へ置き換えます。

例えばOSがWindows XP以降か判定するような関数を置き換えるには

```c:
/*------------------------------------------------
  WindowsXP以降か判別
--------------------------------------------------*/
BOOL IsWindowsXP()
{
	OSVERSIONINFO osinfo;

	// OS情報取得
	osinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
	if (!GetVersionEx(&osinfo))
		return(FALSE);

	// WindowXP以降か判別
	if (osinfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
	{
		if (osinfo.dwMajorVersion == 5)
		{
			if (osinfo.dwMinorVersion >= 1)
				return(TRUE);
		}
		if (osinfo.dwMajorVersion > 5)
			return(TRUE);
	}
	return(FALSE);
}
```

次のようにIsWindowsXPOrGreater関数に置き換えます。

```c:
/*------------------------------------------------
  WindowsXP以降か判別
--------------------------------------------------*/
BOOL IsWindowsXP()
{
	return(IsWindowsXPOrGreater());
}
```
Rundeckで参照権限追加（readonly,gest)


#投稿の目的
Rundeckで、アプリ開発者様に参照権限を追加する。
既に本番稼動しているRundeckを停止しないで、追加できることを目指す。

#背景
Rundeckインストール直後はadmin権限しかない。
危険かつ責任所在が不明確になるので、参照権限がないと後々面倒。

#手順
##1./etc/realm.propertiesにユーザ追加(guests)
admin定義の直下あたりに追加すると良い。

```/etc/realm.properties
guests:guests,user
```

この状態でもログインできるが、見れるプロジェクトが無い。
![スクリーンショット 2017-03-19 19.02.15.png](https://qiita-image-store.s3.amazonaws.com/0/10574/684aac34-fddd-e46c-c7c7-811575306628.png)

##2.guests権限を定義する。
###2-1.定義ファイル雛形を作る。(adminのコピー)
`# cp admin.aclpolicy guests.aclpolicy`

###2-2.guest.aclpolicyを編集
ポイントは「参照権限」と書いている行と「username:」でgusetを指定している部分

```guests.aclpolicy
description: Project settings for guest user.
context:
  project: 'XXXX_Test' # XXXX_Testは、参照権限を付与したいプロジェクト
for:
  resource:
    - allow: [read] # allow read/create all kinds 参照権限
  adhoc:
    - allow: [read] # allow read/running/killing adhoc jobs　参照権限
  job:
    - allow: [read] # allow read/write/delete/run/kill of all jobs参照権限
  node:
    - allow: [read] # allow read/run for all nodes参照権限
by:
  username: guests

---

description: Rundeck settings for guest user.
context:
  application: 'rundeck'
for:
  resource:
    - allow: '*' # allow create of projects
  project:
    - allow: '*' # allow view/admin of all projects
  project_acl:
    - allow: '*' # allow admin of all project-level ACL policies
  storage:
    - allow: '*' # allow read/create/update/delete for all /keys/* storage content
by:
  username: guests
```                

###2-3.ログインして確認
プロジェクトが見えるようになりました。
![スクリーンショット 2017-03-19 19.24.40.png](https://qiita-image-store.s3.amazonaws.com/0/10574/e21eeb87-ef9f-89eb-4192-7b022e03bb7b.png)
ジョブを選択しても右上に緑色「Run Job Now」のボタンがありません。**成功です!!**
![スクリーンショット 2017-03-19 19.26.33.png](https://qiita-image-store.s3.amazonaws.com/0/10574/3dc0494a-3b0c-eaa6-e0b2-592ed67e0792.png)
実行権限のあるユーザでログインしなおすと緑色「Run Job Now」のボタンが表示されます。
![スクリーンショット 2017-03-19 19.27.19.png](https://qiita-image-store.s3.amazonaws.com/0/10574/af886b7b-9c14-28e0-0989-26b32efb1316.png)

#結びに代えて
より良い方法ございましたらご教示願います。
Arduinoでサーボモータ制御


[Raspberry Pi でサーボモータ制御](http://qiita.com/lumbermill/items/218944f816bdb0483e3c) をやってみたんですが、PWMが安定していないのが、どうしても時々プルプル震えてしまいます。というわけで、Arduinoで再チャレンジ！

公式サイトのチュートリアルを参考にしてコードを書きます。ポテンションメータがなかったので、トグルスイッチで代用しています。

https://www.arduino.cc/en/Tutorial/Button
https://www.arduino.cc/en/Tutorial/Knob

出来上がったコードはこんな感じ。スイッチがONの時、OFFの時、それぞれで180度、0度の位置まで回転します。

```
#include <Servo.h>

Servo myservo;

const int buttonPin = 2;
const int servoPin = 9;
const int ledPin =  13;

int buttonState = 0;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
  myservo.attach(servoPin);
}

void loop() {
  buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {
    digitalWrite(ledPin, HIGH);
    myservo.write(0);
  } else {
    digitalWrite(ledPin, LOW);
    myservo.write(180);
    //delay(15);
  }
}
```

配線図はこちら。図を描くのが面倒なので写真(^^; 右上の3本線がサーボ(SG90 MicroServo)に繋がっています。赤がVcc、黒がGND、緑(サーボ側が橙)がPWMです。

![IMG_2449.jpg](https://qiita-image-store.s3.amazonaws.com/0/50780/79c24cee-4ee3-3453-97f4-f357b08cb9d9.jpeg "IMG_2449.jpg")

制御系はやっぱりArduinoの安定感が心地よいですね…。

https://youtu.be/8SVHnoTgDbA
Clipboard.js で複数のElementをクリップボードにコピーする

Clipboard.js で複数のElementをクリップボードにコピーする方法
Clipboard.jsの基本的な使い方は割愛。 Clipboard Link -> https://clipboardjs.com/

対象のElementをディープコピーし、新規に結合してElementを作成する。
ディープコピーする理由は、
ディープコピーせずに、そのまま結合するとHtml上のElement自体が結合してしまうため。




```
    <script src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/1.5.1/clipboard.min.js"></script>

    <!-- Copy 対象 その１-->
    <div class="copy_target">
        <input type="button" class="btn btn-primary" value="click1"><span class="glyphicon glyphicon-adjust"></span>
        <input id="foo" type="text" value="hello1">
    </div>
    <!-- Copy 対象 その２-->
    <div class="copy_target1">
        <input type="button" class="btn btn-primary" value="click2"><span class="glyphicon glyphicon-adjust"></span>
        <input id="foo" type="text" value="hello2">
    </div>
    
    <!-- Copy 格納場所-->
    <div id="copy_result" ng-show="false">
    </div>

    <button class="btn" data-clipboard-action="copy" data-clipboard-target=".copy_target">Copy</button>

```

```
    <script>
        var clipboard = new Clipboard('.btn', {
            target: function (trigger) {

                //XXX これだとHTML上のNodeを結合してしまう
                //#region OK without clone copy
                //var a = document.querySelector('.copy_target');
                //var b = document.querySelector('.copy_target1');
                //var parent_object = document.getElementById("copy_result");
                //parent_object.appendChild(a);
                //parent_object.appendChild(b);
                //#endregion
 
                //ディープコピーして結合する
                //#region OK
                var a = document.querySelector('.copy_target');
                var b = document.querySelector('.copy_target1');
                var copy1 = angular.copy(a);
                var copy2 = angular.copy(b);
                var parent_object = document.getElementById("copy_result");
                parent_object.appendChild(copy1);
                parent_object.appendChild(copy2);
                //#endregion
 
                return parent_object;
            }
        });
 
        clipboard.on('success', function (e) {
　　　　　　　　　//格納したコピー対象を消す。
            var parent_object = document.getElementById("copy_result");
            while (parent_object.firstChild) {
                parent_object.removeChild(parent_object.firstChild);
            }
            console.log(e);
        });
        clipboard.on('error', function (e) {
            console.log(e);
        });
    </script>


```
block を yield で処理するのか Proc に変換して処理するのかで block 内での self が異なる

最初のは yield での処理、その後は Proc オブジェクトに変換しての処理です。

```ruby
class Foo
  def self.dsl1
    new.instance_eval { |x| yield(x) }
  end

  def self.dsl2(&block)
    new.instance_eval(&block)
  end

  def self.dsl3
    new.instance_eval(&proc)
  end

  def self.dsl4
    new.instance_eval(&Proc.new)
  end
end
```
```ruby
Foo.dsl1 { p self }   => main
Foo.dsl2 { p self }   => #<Foo:0x002ac2f5ec84b0>
Foo.dsl3 { p self }   => #<Foo:0x002ac2f5ec8370>
Foo.dsl4 { p self }   => #<Foo:0x002ac2f5ec8208>
```
proc に変換して block を処理すると block のスコープが Foo のインスタンスになるからかなぁ？