OmniAICreator/Qiita-1.07M huggingface dataset:
All About ACS: IBM i Access Client Solutionsの紹介とパッケージング

#IBM i Access Client Solutions(ACS) とは何か
IBM i 用のクライアントソフトは「IBM i Access family」として提供されています。
 [IBM i Access](https://www-01.ibm.com/support/docview.wss?uid=isg3T1026775 "IBM i Access")のサイトでファミリーのメンバーが確認できます。

プラットフォームに特化したクライアントには Access for Windows と Access for Linux がありました。
Access for Linux は既に廃止され、Access for Windows も Windows 8.1 を最後に、それより新しい Windows をサポートしていません。さらに2019年4月30日にサポートサービスが終了になります。

後継となるのが Access Client Solutions、通称「ACS」です。
ベースとなる部分はJavaで書かれていて、Java が動く環境ならどこでも、これまで動かなかった Mac での利用も可能です。
ACS の 1.1.8.0 以降は Java 8 以降が必要になりました。

# ACSのパッケージ構成
ACS は 下記の 4つのパッケージで構成されます。
通常は Java 上の Base Package を使い、ODBC など OS ネイティブコードでの DB アクセスをする場合に、Windows/Linux Application Package を利用します。Windows 上の 5250セッションを EHLLAPI で操作する場合は EHLLAPI を導入します。

## Base Package
通常 ACS と呼べば、通常この部分を指します。今回の一連の記事でも特に明示しなければ、この部分を示すこととします。Java で実装されていて、プラットフォームを問わずに動きます。
Host-on-Demand(HOD) ベースの 5250、データ転送、DB2 for i の操作などが可能です。

## Windows Application Package
Windows に特化した部分です。ODBC、.Net、OLE DB といったWindowsのネイティブコードで実装する必要があり、Javaでは実装できない部分を提供します。
[サイト](https://www-01.ibm.com/support/docview.wss?uid=isg3T1026805) では、下記が記載されています。

> * Connectivity to DB2® for i using ODBC, .Net, OLE DB and XDA
> * Programming Toolkit for accessing IBM i system objects
> * Support for TLS/SSL connections

そのため、Windows 10 や Windows 2016 で IBM i Access を使いたい場合は ACS を使うことになります。
また、Access for Linux は既に入手できないようになっています。Linux で IBM i Access を使いたい場合は、やはり ACS を使うことになります。

## Liux Application Package
Liux に特化した部分です。ネイティブコードで実装する必要があり、Javaでは実装できない ODBC を提供します。
[サイト](https://www-01.ibm.com/support/docview.wss?uid=isg3T1026805) では、下記が記載されています。

> * Connectivity to DB2® for i using ODBC
> * Full support for 64-bit ODBC data types
> * TCP/IP connectivity
> * Installation and usage guide

rpm と deb の両方の形式で提供されています。

## PASE Application Package
IBM i のPASE環境で稼働するオープンソースソフト用のDBCSドライバーです。
英文ですが、こちらに説明があります。
[ODBC driver for the IBM i PASE environment](https://www.ibm.com/support/pages/odbc-driver-ibm-i-pase-environment)


# EHLLAPI

5250セッションをプログラムで操作したい場合、ACS では iAW や PCOMM でも利用できた EHLLAPI を使うことができます。
この場合、ACS EHLLAPI を導入します。

***
2019-02-18 

- リンク切れなど情報の更新
- EHLLAPI を記載
2020-04-24 PASE Application Package を記載
***
「All About ACS」では IBM i に対する新しいクライアント「IBM i Access Client Solutions」の情報をいろいろ提供していきます。
[記事一覧はこちら](http://qiita.com/6onoda/items/2dc925586d8d3b8644f2)で確認いたけます。

許可の無い転載を禁じます。
この記事は筆者の個人的な責任で無保証で提供しています。
当記事に関してIBMやビジネスパートナーに問い合わせることは、固くお断りします。
***
ESLintのno-restricted-syntaxでfor-ofだけを許可

ESLintで[airbnb-base](https://www.npmjs.com/package/eslint-config-airbnb-base)を~~使ってます。~~ 以前まで使ってました (追記参照)。


ES2015のfor-ofを使おうとすると、`no-restricted-syntax`としてエラーになってしまいます。以下の記事がとても参考になりました。
[ESLint対応物語 ~no-restricted-syntax~](http://qiita.com/putan/items/0c0037ce00d21854a8d0)

事情はわかりましたが、それでも僕はfor-ofを使いたい！
しかし`for-in`とかは禁止で良いので`no-restricted-syntax`自体を無効にはしたくない！

ってことで、for-ofだけを許可する方法です。

まずairbnb-baseの大元の設定を確認。今回はこのファイルでした。

```node_modules/eslint-config-airbnb-base/rules/style.js
    // disallow certain syntax forms
    // http://eslint.org/docs/rules/no-restricted-syntax
    'no-restricted-syntax': [
      'error',
      {
        selector: 'ForInStatement',
        message: 'for..in loops iterate over the entire prototype chain, which is virtually never what you want. Use Object.{keys,values,entries}, and iterate over the resulting array.',
      },
      {
        selector: 'ForOfStatement',
        message: 'iterators/generators require regenerator-runtime, which is too heavyweight for this guide to allow them. Separately, loops should be avoided in favor of array iterations.',
      },
      {
        selector: 'LabeledStatement',
        message: 'Labels are a form of GOTO; using them makes code confusing and hard to maintain and understand.',
      },
      {
        selector: 'WithStatement',
        message: '`with` is disallowed in strict mode because it makes code impossible to predict and optimize.',
      },
    ],
```
この部分を自分の.eslintrcに転記して、不要な部分を削除すればOK
僕はyamlで書いてるので、分かりやすいようにコメントアウトにしてみました。

```yaml:.eslintrc.yml
  # for-ofは認める
  no-restricted-syntax:
    - error
    - selector: 'ForInStatement'
      message: 'for..in loops iterate over the entire prototype chain, which is virtually never what you want. Use Object.{keys,values,entries}, and iterate over the resulting array.'
    # - selector: 'ForOfStatement'
    #   message: 'iterators/generators require regenerator-runtime, which is too heavyweight for this guide to allow them. Separately, loops should be avoided in favor of array iterations.'
    - selector: 'LabeledStatement'
      message: 'Labels are a form of GOTO; using them makes code confusing and hard to maintain and understand.'
    - selector: 'WithStatement'
      message: '`with` is disallowed in strict mode because it makes code impossible to predict and optimize.'
```

最初は「大元の`no-restricted-syntax`で設定済みのselectorのうち`ForOfStatement`だけを無効にする」のかと思ったんですが、そうではなく「自分で`no-restricted-syntax`を書いた場合は大元の`no-restricted-syntax`は全部キャンセルされて自分の設定だけが使われる」ということなんですね。

`no-restricted-syntax`だけでなく、他のルールでも同様なはず。たぶんESLint自体の仕様として誰かがまとめてるとは思うんだけど、見つからなかったです :sweat_smile: 

ではまた。

## 2017/10/31 追記

[airbnb-base](https://www.npmjs.com/package/eslint-config-airbnb-base)のルールは厳しすぎて、本件以外にも色々と面倒臭い要素が多くて時間をどんどん浪費することに気づきまして、使うのやめました！

今は[standard](https://www.npmjs.com/package/eslint-config-standard)使ってます。何より「セミコロン書かない」ってところに惚れました！もうね、セミコロン書かないだけで効率が全然上がる(笑)
OGPにつけるprefix属性とは何か調べてみた。

OGPの設定をする時に何となくつけていた
prefix属性について一体何なのか調べてみました。（これ↓）
尚、html5版のOGPに関する内容です。

```html
<head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# article: http://ogp.me/ns/article#">
```

## prefix属性とは
html5ではRDFa Core 1.1およびRDFa Lite 1.1が使用できます。
RDFaのガイドラインではprefixとは語彙を指示します。

つまり「これからOGPを使いますよ。」と宣言しています。
この記述によって下記のようなmetaにproperty属性でOGPの設定を記述することができます。

```html
<meta property="og:title" content="タイトル名">
```

## prefix属性を付ける位置
prefix属性をhtmlタグをつける派とheadタグにつける派で論争が湧き起こっているようですが
RDFaのガイドライン上、
property属性の親要素にprefix属性が記述されていれば問題ないので
どちらも正しい使い方と考えて良いと思います。
ただしfacebook OGPのガイドラインではheadタグにつけることを推奨しているので
facebookの仕様に明確に従う場合は、headタグにつけることが良いようです。


---
参考元
HTML+RDFa 1.1
https://dev.w3.org/html5/rdfa/
RDFa 入門
http://www.baldanders.info/spiegel/archive/rdfa/
Windows10環境でSpring FrameworkでWEBサービスを開発するためにSpring Tool Suite(STS)をインストールする。

# Spring Tool Suite(STS)をインストールする手順
- https://spring.io/tools/sts/all

注意点：インストールする環境のJAVAが64bit版と32bit版で、インストールするSTSは違います。環境にあったものをダウンロードしてインストールします。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/192219/c3dabfd4-203e-4e70-2aeb-c87bdbae2560.png)

ダウンロードができたら、ZIPファイルを展開します。
「sts-bundle」というフォルダの中の「sts-*.*.*.RELEASE」⇒「STS.exe」を実行します。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/192219/33f6114e-0628-853d-032d-d76957e216a2.png)

ワークスペースを設定します。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/192219/e3dbe01a-3813-d50f-d6d6-1d4280a6c67f.png)

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/192219/cf99f6cf-89a7-6be2-0b2e-9c41ee1f692e.png)

問題なければツールが起動します。
Jena＆SPARQLで取得したデータを変数ごとに見たい時の覚書。

#Jena＆SPARQLでググッてみると…
大抵こういう風に書いています。

```java:JenaSample.java
String queryString = "(SPARQL)";
Query query = QueryFactory.create(queryString);
QueryExecution qe = QueryExecutionFactory.sparqlService(service, query);
ResultSet results = qe.execSelect();
ResultSetFormatter.out(System.out,results, query);
```

結果は一覧表で表示され、めでたしめだたし。
と、言いたいところですが…変数ごとに値を取得したいときはどうしたらよいのかしら？

#ResourceクラスとLiteralクラス
例えば、食品成分LOD　SPARQLエンドポイントに要求した場合。
[食品成分LOD](http://osakanabiyori.github.io/RDF/)

SPARQLはこんな感じ。

```SPARQL:SPARQL
PREFIX schema: <http://schema.org/>
PREFIX rdf:    <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX cc:     <http://creativecommons.org/ns#>
PREFIX dc:     <http://purl.org/dc/elements/1.1/>
PREFIX xsd:    <http://www.w3.org/2001/XMLSchema#>
SELECT DISTINCT ?name ?calories ?sodiumContent ?nutritionType ?title
WHERE {
	?s schema:category "魚介類";
	   schema:name ?name;
	   schema:nutrition ?nutrition;
	   cc:attributionName ?attributionName.
	?nutrition schema:calories ?calories;
	           schema:sodiumContent ?sodiumContent;
	           rdf:type  ?nutritionType.
	?attributionName dc:title ?title.
}
LIMIT 10
```

Javaではこう取り出してみる。

```java:JenaSample2.java
Query query = QueryFactory.create(queryString);
QueryExecution qe = QueryExecutionFactory.sparqlService(service, query);
ResultSet results = qe.execSelect();
while (results.hasNext()) {
	QuerySolution qs = results.next();

	RDFNode node = qs.get("s");
	Resource resource = node.asResource();
	System.out.println(resource.getURI());

	RDFNode node2 = qs.get("calories");
	Literal literal = node2.asLiteral();
	System.out.println(literal.getInt());
}
```
ソースを解説すると…
1. SQLでのResultSetの様にhasNext()でのループが可能。
2. 結果１つ分をQuerySolutionオブジェクトとして取得
3. 各変数の値はRDFNodeオブジェクトで取得
4. データはリソースならasResource()、リテラルならasLiteral()で取得
5. Resource又はLiteralオブジェクトのgetterで値が取得可能。


私が調べた範囲では、このように取得できるようです。
もし、使い方が間違っていたらご指摘ください。m(_"_m)
Azure Skillsで「Azure Paas上のDevOps」を受講しました

# 「Azure Paas上のDevOps」を受講してみた
「Azure Paas上のDevOps」はVSTSを利用したCI/CD環境の構築やTDD（テスト駆動型開発)等のDevOpsを学習するカリキュラムです。流行のDevOpsを勉強しようと思い受講してみたのですが、個人的に難易度高めでした・・・。

[**Azure Skill 日本語コース ※現在新規エンロールメントできないようです。**](https://blogs.technet.microsoft.com/mpn_japan/2017/04/27/azure-free-online-course-in-japanese/)

「Azure Paas上のDevOps」には5つのモジュールが用意されています。ちょっと少なめかなと思いきや内容はかなり濃くハンズオンまでついてくるので全部受講した後のやってやった感は高めです。それではモジュールごとに内容を説明していきたいと思います。


### モジュール１：開発運用のコア値を理解する
DevOpsについての基本的概念について説明しています。DevOpsを利用する価値やメリットについて言及しています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/93820/94056ecd-f9a8-3cb6-e739-e7f5b7d7b778.png)

### モジュール２：本番環境に合わせて標準化された環境を展開および構成します
「コードのインフラストラクチャ」と「コードとしての構成」をベースにARMテンプレートやDSCを学びます。Windows PowerShell DSCについては別途学ぶ機会が必要になるかもしれません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/93820/d9d81ce0-4de3-00f1-8679-7f813fc77363.png)


### モジュール３：プロダクションに自動的にビルドしてデプロイします 
自動ビルド、自動配置、継続的な配達を学びます。急にDockerやパッケージ管理が出てくるので急に難易度があがります。ここで初めてハンズオンが出てきます。VSTSを利用したCI/CDの環境構築と手法について実地で学べるのでぜひやりましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/93820/162d491b-662c-a39e-2fbf-9879a6431add.png)


### モジュール４：生産前と生産中に自動的にテストします
自動テストやTDD（テスト駆動型開発)について学びます。ここでもハンズオンラボがあるのでぜひ受講しましょう。ハンズオンラボの内容は動画を見るよりも効果的だと個人的に思いました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/93820/4600cf82-4040-daf5-ab65-20895a808c3c.png)


### モジュール５：生産から継続的に学び、業績を向上させます
アプリケーションのパフォーマンス監視や仮説駆動型開発について学びます。運用フェーズに入ってからのDevOpsを学ぶ感じですね。このモジュールのハンズオンラボはApplicationInsightの利用方法について説明が細かく記載されているのでぜひ受講しましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/93820/531cc905-1e68-b038-26b7-36a4abaa554c.png)

**このモジュール全体に対していえることですがハンズオンラボの内容が秀逸なので動画やドキュメントよりもハンズオンラボを優先的にきちんと受講してDevOpsを体に染み込ませたほうがいいです。理屈も大切だけどDevOpsは実地で得られる理解のほうが大切に思います。**

# 総評
一通り受講すればDevOpsについて体型的に学ぶことができます。ハンズオンラボもあるので実際に触りながら学ぶこともできます。アセスメントの確認テストは動画の内容から出題されるものも多かったので動画は倍速でかまわないのでちゃんと見たほうがいいです。

「Azure Paas上のDevOps」のカリキュラムは比較的新しめなので動画コンテンツにメディアインデクサ機能がついていたりと「Azureの基礎」の時よりかはリッチでした。ただ、日本語の翻訳がおかしい箇所が結構あります。例えばコードの自動化するツールの「puppet」がそのまま「人形」と訳されていたり、「仮説主導型開発」の3つのプロセスが「ビルド・尺度・学習」と説明されていたりと少し混乱する内容でした。他にも沢山ありますがここら辺は新しめのカリキュラムなので洗練されていないのだろうなぁという感じはします。

さて先に色々と言い訳を書きましたがDevOpsって中々難しくて最終試験は正答率60%で不合格でした・・・。不合格だったのでデジタル終了証明書も発行されませんでした。最終試験の再受験はできないようでして多分次回のカリキュラムまでお預けになる感じだと思います。うーん、悔しい。

# 告知
**「Azureもくもく会」**で**「Azure Skills」**を集中して勉強してみませんか？
月1回マイクロソフト社SGTオフィスのセミナールームをお借りして実施しています。

## [Azureもくもく会とは](https://azure-moku2.connpass.com/)
筆者が主催しているAzureに関する作業をもくもく行うコミュニティです。
勉強会やセミナーは沢山ありますが、そこで得た知識を深堀する機会ってないと思います。 後でやろうと思って積んでいる知識をもくもく会で深堀してみませんか？
基本的に自分が興味のあるサービスについてもくもく作業をします。 時には参加者と情報共有してみたり、解らないことがあったら相談できる場所です。

<a href="https://azure-moku2.connpass.com/"><img title="Azureもくもく会@東京 - connpass" src="http://capture.heartrails.com/400x300/cool/1500605413046?https://azure-moku2.connpass.com/" alt="https://azure-moku2.connpass.com/" width="400" height="300" /></a>
[Magento２]レイアウトXMLに指定できる位置の値一覧

element name or dash (-)と言われているもの。

|code|説明| 
|:-------|:----------------|
|page.top|After Page Header|
|top.container|After Page Header Top|
|columns.top|Before Main Columns|
|page.bottom|Before Page Footer|
|page.bottom.container|Before Page Footer Container|
|cms_footer_links_container|CMS Footer Links|
|compare-link-wrapper|Compare Link Wrapper|
|content|Main Content Area|
|content.aside|Main Content Aside|
|content.bottom|Main Content Bottom|
|main|Main Content Container|
|content.top|Main Content Top|
|minicart.addons|Mini-cart promotion block|
|before.body.end|Page Bottom|
|footer|Page Footer|
|footer-container|Page Footer Container|
|header-wrapper|Page Header|
|header.container|Page Header Container|
|header.panel|Page Header Panel|
|after.body.start|Page Top|
|sidebar.additional|Sidebar Additional|
|sidebar.main|Sidebar Main|
Kill Line in Vim

日本語入力を快適にするため、インサートモードでは、 Emacs のキーバインドで操作できるようにしている。

`C-k` で Emacs の `Kill Line` 的な操作をするためには、下記の設定を `~/.vimrc` に書けばOK

```vim:~/.vimrc
inoremap <C-k> <C-o>:call setline(line('.'), col('.') == 1 ? '' : getline('.')[:col('.') - 2])<CR>
```

ただこれだと一回ノーマルモードに戻ってしまうので、 `autocmd InsertLeave` などのフックがあると発動してしまう。課題。

```vim:~/.vimrc
autocmd InsertLeave * call system('fcitx-remote -c')
```
[javascript]画面上でクリックした位置にある重なっている要素を取得する

メモメモ。
ブラウザの画面上をクリックした際に、クリック位置にある要素の重なり的に下にある要素を取得する必要があったので。
JQuery使用。

１．クリックした位置を取得する
２．クリックした位置の祖先ノードを取得する
３．祖先ノードのクリックしたい位置にある要素をelementFromPointで全て取得する
４．３で取得した要素から目的の要素を探して、操作を加える

```ts
        protected clickEvent(event: Event) {
            let hiddenElementList = [];
            const mouseLeft = event.pageX;
            const mouseTop = event.pageY;
            // クリックしたコメントが所属するノードの一番祖先のノードのdocumentを取得する
            const ownerDocument = $(event.currentTarget)[0].ownerDocument;
            let overlapElement: HTMLElement = null;
            // mousedownした位置にあるすべての要素とその要素のvisibilityの設定を確保する
            for (let checkTarget: HTMLElement = null; checkTarget !== ownerDocument.documentElement; checkTarget = overlapElement) {
                // 指定したウインドウ上の位置にあるHTMLElementを取得する（重なりの一番上の要素が取得される。visibilityがhiddenの要素は取得されない）
                overlapElement = <HTMLElement>ownerDocument.elementFromPoint(mouseLeft, mouseTop);
                if (overlapElement === null && overlapElement !== undefined && overlapElement !== checkTarget) {
                    hiddenElementList.push({
                        Element: overlapElement,
                        Visibility: overlapElement.style.visibility
                    });
                    overlapElement.style.visibility = "hidden";
                    continue;
                }
                break;
            }
            // mousedownした位置にあるすべての要素をから目的の要素を探す
            hiddenElementList.forEach((value, index: number) => {
                let element = value.Element;
                element.style.visibility = value.Visibility;
                // ここで条件で検索する。例えばidとか
                if($(element).attr("id") === "") {
                    // ここで目的の要素を操作する。
                }
            });
        }

```

こんな方法もあるよーという意見がほしいです。
以上。
簡単に変数同士の相関係数を可視化する

# 相関係数の一覧を表示する
[kaggleのタイタニックの犠牲者データ](https://www.kaggle.com/c/titanic)を使って、相関係数の一覧をheatmapを使って表示してみる
数値の値でしか確認できないので注意

```py3:corr.py
# lib install
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline 

train = pd.read_csv('./train.csv')
train.head()
```
![2017-07-25_122911.png](https://qiita-image-store.s3.amazonaws.com/0/107187/dbca8f30-6d4d-e8df-ced4-82eb23d92837.png)

``` py3:corr.py
plt.figure(figsize=(8, 6)) #heatmap size
sns.heatmap(train.corr(), annot=True, cmap='plasma', linewidths=.5) # annot:値を表示するかどうか linewidths: しきり線
```

![2017-07-25_123429.png](https://qiita-image-store.s3.amazonaws.com/0/107187/0bbda061-0f38-7383-e0d0-af9f85ed098f.png)

この例の場合、生き残ったかどうかが重要なので、Survivedの列を確認すると相関がある変数を見つけ出せますね

参考：[Seaborn Heatmap](http://seaborn.pydata.org/generated/seaborn.heatmap.html)
[C/C++] ポインタ

```c

#include <stdio.h>

int main() {

	short **pp;
	short *p;
	short data = 3;

	p = &data;
	pp = &p;

	//変化する前のDATA
	printf_s("%d \n", data);
	
	*p = 5;
	printf_s("%d \n", data);

	**pp = 10;
	printf_s("%d \n", data);

	return 0;
}
```
sql serverでbulk insertに失敗した際に、行を特定する書き方


以下のように書くと、エラー内容だけでなく、エラーを起こした行がキャッチできるので、内容を特定しやすい


```sql
BEGIN TRY
BULK INSERT テーブル名 FROM 'ファイルパス'
WITH (ファイル構造情報)
END TRY
BEGIN CATCH
SELECT
        ERROR_NUMBER()    AS ErrorNumber,
        ERROR_SEVERITY()  AS ErrorSeverity,
        ERROR_STATE()     AS ErrorState,
        ERROR_PROCEDURE() AS ErrorProcedure,
        ERROR_LINE()      AS ErrorLine,
        ERROR_MESSAGE()   AS ErrorMessage;
END CATCH
```
【ざっくり】KMeansによるクラスタリング

#概要
* 目的：購買履歴などから顧客をクラスタリングして、それぞれの特徴を把握
* 方法：KMeansによるクラスタリング
* アウトプット：各クラスタの人数、顧客クラスタ毎の特徴
* 利用分野：マーケティング

#アプローチ
1. データをdataframeに格納
2. クラスタ数の決定
3. KMeansでクラスタリング
4. クラスタリング結果を出力

#コード
```py3
import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
from collections import Counter

##dataframeを準備　df ###

num_clus = 4 #クラスタ数を設定
kmeans = KMeans(n_clusters=num_clus, random_state=0).fit(df)

print(Counter(kmeans.labels_)) #各クラスタの人数を出力

df['cluster_id']=kmeans.labels_ #元のdataframeにクラスタ番号を追加

for i in range(0,num_clus): #各クラスタの平均値を出力
    print(df[df['cluster_id']==i].mean())

```
kerasでpipelineを使ったGridSearchでハイパーパラメーターをチューニング

kerasで変数の重みは学習してくれますが、いくつのニューロン数がいいのか、何層必要か、学習率の最適値など、固定で渡すパラメーターも存在します。
今回は、これらのパラメーターをチューニングするのにscikit-learnのGridSearchに渡して探索してみます。
この例では、irisなどのデータでクラス分類をやる場合を想定して書いています。

# 準備
モデルを作るのに必要なライブラリの他に、以下を読み込んでください。

```python:
from sklearn.grid_search import GridSearchCV
from sklearn.pipeline import Pipeline
```
## モデルの構築を関数化する
変更したいパラメタを引数にした関数を作ります。
この例では、簡略化のために2レイヤー目以降のニューロン数は元のニューロン数のn乗根で出しています。

```python:
def create_model(self, evMethod, neurons, layers, learn_rate):
	# Criate model
	model = Sequential()
	model.add(Dense(neurons, input_dim=self.column_length, kernel_initializer='normal', activation='relu'))
	for i in range(1, layers):
		model.add(Dense(int(numpy.ceil(numpy.power(neurons,1/i))), kernel_initializer='normal', activation='relu'))
	model.add(Dense(3, kernel_initializer='normal', activation='softmax'))
	# Compile model
	adam = optimizers.Adam(lr=learn_rate)
	model.compile(loss='categorical_crossentropy', optimizer=adam, metrics=['accuracy'])
	return model
```
## モデルに渡す配列を準備する
すべて配列で渡す必要があります。

```python:
batch_size = [1000,300,100]
epochs = [10, 50, 100]
neurons = [20, 30, 45]
learn_rate = [0.001, 0.005, 0.01, 0.07]
layers = [1,3,5]
```

# 学習
## モデルをパイプラインに渡す
作成したモデルを`mlp`としてestimatorに追加します。初期値は使われないので適当。

```python:
estimators = []
estimators.append(('mlp', KerasClassifier(build_fn=self.create_model, epochs=10, batch_size=200, verbose=1)))
pipeline = Pipeline(estimators)
```
## Pipelineにパラメーターを渡す
```python:
param_grid = dict(mlp__neurons = neurons, mlp__batch_size = batch_size, mlp__epochs=epochs, mlp__learn_rate=learn_rate, mlp__layers=layers)
```

## GridSearchは通常の使い方と同じ
```python:
grid = GridSearchCV(estimator=pipeline, param_grid=param_grid)
grid_result = grid.fit(self.X, self.Y)
```

## 最適な組み合わせを表示
`best_estimator_`で一番良いモデルのパラメタを教えてくれます。精度も表示させます。

```python:
clf = grid_result.best_estimator_
print(clf.get_params())
accuracy = clf.score(self.X, self.Y)
print("\nAccuracy: %.2f" % (accuracy))
```

# 最適なモデルの保存
GridSearchを使うと数十倍の学習時間がかかりますので、一番良いモデルを保存するのもおすすめです。普通にモデル構築した場合と比べて呼び出しが特殊なので気をつけてください。

```python:
clf.steps[1][1].model.save('file to path')
```

この要領で、活性化関数など他の変数もチューニングできますので活用してみてください。

#追記：Randomized Gridsearch版
学習中にメモリオーバーになってしまったため、試行数を減らすべくただのGridSearchからRandomized GridSearchに変えました。
ほとんど関数名を置き換えるだけで動きます。パラメーターの組み合わせ数が多い場合、実行にはこちらのほうが現実的です。

```python:
grid = RandomizedSearchCV(estimator=pipeline, param_distributions=param_grid, n_iter=30)
```
Zabbix3.0でネットワーク機器を自動登録させる

Tenplateさえ作ってしまえば手動で登録しても大した手間ではないが、登録忘れがないように自動登録させたい。

# 前提
- Zabbix 3.0.9
- ネットワーク機器にてSNMPの設定がされている
- 監視対象のTenplateが作成済み

# 手順
## Discovery
- Name：任意の名前
- IP range：探索範囲の指定
- delay：探索の間隔
- Checks：どのような機器かを識別するためのルール 
- Device uniqueness criteria：取得した際の一意の値（あとで登録ホスト名として利用する方にチェック）

画像のように設定。
![イメージ040.png](https://qiita-image-store.s3.amazonaws.com/0/69745/20fb420c-5693-e0d3-c355-9537fbb3ae3d.png)


今回指定している値は下記のようなものが取れる。

```bash:junos
[ktoda@jumps ~]$ snmpwalk -v 2c -c xxxxxx ex2200-1 sysDescr
RFC1213-MIB::sysDescr.0 = STRING: "Juniper Networks, Inc. ex2200-48t-4g Ethernet Switch, kernel JUNOS 12.3R11.2, Build date: 2015-09-24 11:55:10 UTC Copyright (c) 1996-2015 Juniper Networks, Inc."
[ktoda@jumps ~]$ 
[ktoda@jumps ~]$ snmpwalk -v 2c -c xxxxxx ex2200-1 sysName
RFC1213-MIB::sysName.0 = STRING: "ex2200-1"
```

## Actions
右上の`Event source`で`Discovery`を選んで`Create action`

###Action
たぶん`Monitoring`の`Event`で表示される項目の設定。本質ではないので適当に設定する。

![イメージ041.png](https://qiita-image-store.s3.amazonaws.com/0/69745/d9804698-a3a6-cb08-f0e1-e8db14729545.png)

###Conditions
仕訳設定。画像の設定の場合、`sysDescr`を取得した際の値に文字列`JUNOS`があった場合に`Operations`が実行される。

![イメージ042.png](https://qiita-image-store.s3.amazonaws.com/0/69745/efc67047-9c92-cd44-fd2b-005e4ffd12b2.png)


###Operations
`Conditions`でマッチしたホストに対するActionを設定する。
- Add host:ホストを登録
- Add to host group:ホストグループに加える
- Link to template:監視Tenplateを指定
- Set host inventory mode:`Inventory`をSNMPによる自動取得にしたいので、`Automatic`を指定


![イメージ043.jpg](https://qiita-image-store.s3.amazonaws.com/0/69745/ed30cb0c-0ea5-a848-a95f-9450089617f6.jpeg)

あとは、時間がたてば登録される。

#その他
別の機種も自動登録したい場合には、条件とオペレーションを分けた`Actions`を複数作ればよい。

#関連リソース
https://www.zabbix.com/documentation/3.0/manual/discovery
Vimのspellチェックでハイライト色を変更したい

# 編集

間違ったスペルに下線、間違ったキャメルケースに下線と太字を設定する

```vim:.vimrc
set spell
set spelllang=en,cjk

hi clear SpellBad
hi SpellBad cterm=underline
hi clear SpellCap
hi SpellCap cterm=underline,bold
```

# 結果

Before

<img width="276" alt="before.png" src="https://qiita-image-store.s3.amazonaws.com/0/15000/fbe17c05-81df-5026-a3f0-d3add7cba908.png">

After

<img width="268" alt="after.png" src="https://qiita-image-store.s3.amazonaws.com/0/15000/cfee9985-4402-1371-f8e6-573110253d86.png">
Python > 数値で並べ替えて英字で並び替え > sorted()使用

[CheckIO (Python) > The Most Wanted Letter 試してみた > もっとも頻度が高いアルファベットの探索 > collectionsのCounter使用](http://qiita.com/7of9/items/99c9f9731b34f6183f93)
の課題の関連情報を見ていて、以下のsuggestionを受けた。

> Let's suppose you got a list like this (maybe dict.items()):
[("a", 2), ("b", 4), ("c", 5), ....]
1
Then you can get the answer with advanced sorting:
sorted(array, key=lambda x: -x[1], x[0])
1
And the required letter will be the first.

sorted()は使ったことがなかった。

参考: http://akiyoko.hatenablog.jp/entry/2014/09/26/235300

http://ideone.com/GoQ3Md

```py
alist = [ ("b", 2), ("z", 5), ("a", 5), ("c", 4) ]
alist = sorted(alist, key=lambda x: (-x[1], x[0]))
print(alist)

```

```txt:run
[('a', 5), ('z', 5), ('c', 4), ('b', 2)]
```
VS2017のインストーラーがループする

#Please Update Visual Studio Installer Endless Loop

https://developercommunity.visualstudio.com/content/problem/30271/please-update-visual-studio-installer-endless-loop.html

ようは、一回全部閉じてから、管理者モードでupdateツールを実行しましょうってこと。

または
https://www.visualstudio.com/ja/downloads/?rr=https%3A%2F%2Fsupport.microsoft.com%2Fja-jp%2Fhelp%2F4015967%2Ftroubleshooting-visual-studio-2017-installation-and-upgrade-failures

ここからインストーラーを再ダウンロード。
Windows10環境でSpring FrameworkでWEBサービスを開発するためにJDK8をインストールする。

# ダウンロード
- http://www.oracle.com/technetwork/java/javase/downloads/index.html

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/192219/31e83105-011f-88ef-bde9-386ae114905e.png)

Windows版のJDKを選択してダウンロード。（200MBくらいある）

ダウンロードできたら実行し、ウィザーどに従いインストール。
（特にデフォルトの設定のままでインストールして問題なし。）

インストールが完了したら終了。

Java Platform Standard Edition 8 Documentation
http://docs.oracle.com/javase/8/docs/
O'Reillyの紙の本を持っていると電子書籍版が無料で貰えた話

先日こういう記事を見つけました
[O'reilly の書籍を買ったら，ワンコインでePubゲットできる件](http://blog.livedoor.jp/ipats/archives/25046503.html)
[O’Reillyの書籍を買って，ワンコインでePubゲットしてみた](http://nanoappli.com/blog/archives/6951)
どうやらO'Reillyの紙の本を持っていると, $4.99で電子書籍版(但し英語版)を買えるという話らしいです.
しかもDRMフリー!!

なるほどこれは買わない手はないですね.
という事で早速[O'Reillyのホームページ](https://www.oreilly.com/)に行ってみました.
手続きの為にまずアカウントを作りました. その次に自分の持っている本を登録する画面に行きたいと思います.

<img width="1013" alt="Screen Shot 2017-07-25 at 10.37.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/144917/b8f14885-602f-0e98-4898-4268f22db4c6.png">

registeredの所を押すと...

<img width="1028" alt="Screen Shot 2017-07-25 at 10.37.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/144917/b61add7a-bbe0-2df2-fd43-943df47bbd09.png">



...はい

404が出ました.
え, 登録できないの？
マジで？

という事で, O'Reillyにメールを送ってみました.
内容はざっくり言うと以下のような感じです.

> 紙の本の日本語版を数冊持っていてeBook upgradeをしようとしたんですが, なんか404出て登録できないんですけどどうしたら良いっすか？

すると, 1日も経たないうちに以下のような返信が来ました(一部名前等の表記は消しています).

> Hello
> 
> Thanks for reaching out. We've recently discontinued the "Register Print Books" feature on the website, as well as the "$4.99 Ebook upgrade" deal tied with it. Not to worry, I'm happy to provide any ebook version of a print book you own to your account free of charge. I've added the ebooks you purchased to your account for you.
> 
> Have a great day,
> 
> O'Reilly Customer Support

一応Google翻訳を掛けた方も載せておきます

> こんにちは
> 
> お問い合わせいただきありがとうございます。我々は最近、ウェブサイト上の "Register Print Books"機能とそれに関連する "$ 4.99 Ebook upgrade"取引を中止しました。心配しないで、私はあなたのアカウントに無料であなた自身のプリントブックの電子ブック版を提供することを嬉しく思っています。購入した電子書籍をアカウントに追加しました。
> 
> すてきな一日を、
> 
> O'Reillyカスタマーサポート

......O'Reillyさん太っ腹すぎませんか？
実際にアカウントを確認してみました.

<img width="1068" alt="Screen Shot 2017-07-25 at 10.46.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/144917/20a59db0-8fe3-888b-8d3a-05a66d7c10fb.png">

本当に追加されていました.......
ただ, これは今後はこういうサービスになったという事なのか, 今回だけの特別措置なのかは不明です(そもそもこの本を本当に持っているかどうかの確認はされていませんし).
後で調べてみると, [この方](http://support.oreilly.com/oreilly/topics/404-error-when-attempting-to-register-a-book-purchase)のように同じ事をして頂いている方も居ました.
メールの内容も殆ど同じなので, もしかしたらWebページの更新が出来ていないだけとかなのかも知れません.

調べているとこんな記事も出てきました.
[米オライリーがDRMフリーの電子書籍の販売を停止、サブスクリプション制に移行へ](http://internet.watch.impress.co.jp/docs/yajiuma/1068373.html)
もしかしたらこれに関連しているのかも知れませんね.

以上です.
最後にもう一度言っておきますが, これは今回限定なのかも知れません.
今後いつこれが無くなるかは分かりません.
そもそも公式でアナウンスされている訳では無さそうですし.
ですので, もし興味がある方はなるべく早めに問い合わせてみるのが良いかと思います.
sync-settingsを使っていてマシン毎にユーザー名が違うの人のatom-racer設定

## ちょっとした問題

gistでAtomの設定を同期してくれる[sync-settings](https://github.com/atom-community/sync-settings)が便利で、家でちょろっと設定弄ったら会社のAtomに反映みたいにしてるんですが、[atom-racer](https://github.com/edubkendo/atom-racer)は絶対パスで指定しないと駄目みたいだったのでそのまま使うことができませんでした。家と会社でユーザー名が違うので、設定をリストアするたびに以下のような`<username>`になってる部分を再設定しないといけません。

```cson:config.cson
  #...
  racer:
    racerBinPath: "/Users/<username>/.cargo/bin/racer"
    rustSrcPath: "/Users/<username>/.rustup/toolchains/nightly-x86_64-apple-darwin/lib/rustlib/src/rust/src/"
  #...
```

## 解決

こういうものには、`init.coffee`に書くと良さげです。（`init.coffee`を開くには、コマンドパレットを`cmd-shift-p`で開いて`Application: Open Your Init Script`でターン）ここにはAtomの新規ウィンドウができるたびに流れる処理を書くことができるので、AtomAPIの`atom.config.*`で動的に設定してあげます。

例えば以下で今の`<username>`で設定されるようにできます。

```coffee:init.coffee
#...
atom.config.set 'racer.racerBinPath', process.env.HOME + '/.cargo/bin/racer'
atom.config.set 'racer.rustSrcPath', process.env.HOME + '/.rustup/toolchains/nightly-x86_64-apple-darwin/lib/rustlib/src/rust/src/'
#...
```

`init.coffee`もsync-settingsで設定同期されるので大丈夫ですね〜

## 参照

- [Rustをはじめよう！ Rustの環境構築 Atom & SublimeText](http://qiita.com/nacika_ins/items/044c87fd8bd1d7c41191)
[メモ] Volumio2のイメージを作成(Virtualbox+Vagrant使用)

## 概要
- VirtualBox+Vagrantで、ラズパイ向けの Volumio のイメージをビルドする
- 参考:: github [volumio/Build](https://github.com/volumio/Build)


## 環境
- Vagrant環境
    - ホスト機: Windows 10 64bit
    - Virtualbox 5.1.22r115126
    - vagrant 1.9.2
    - ゲストOS: `bento/ubuntu-16.04` 

## 手順
1. Vagrant 環境を作る
2. 適当なフォルダを作って、以下の内容で、`Vagrantfile`を生成

	```rb:Vagrantfile
	VB_NAME="Ubuntu16.04-Volumio2-Image-build"
	VM_MEMORY=2048
	VM_CORES=2

	Vagrant.configure("2") do |config|
	  config.vm.box = "bento/ubuntu-16.04"
		config.vm.provider "virtualbox" do |vb|
			#   vb.gui = true
			vb.name   = VB_NAME
			vb.memory = VM_MEMORY
			vb.cpus   = VM_CORES
		end

		config.vm.provision "shell", inline: <<-SHELL
			#whoami # => root
			
			# APTキャッシュサーバがあれば。
			# echo 'Acquire::http::Proxy "http://apt-cache-server:3142";' | tee /etc/apt/apt.conf.d/02proxy
			#
			apt-get -q update -q
			#DEBIAN_FRONTEND=noninteractive apt-get -q -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" upgrade
			apt install -y git squashfs-tools kpartx multistrap qemu-user-static samba debootstrap parted dosfstools qemu binfmt-support qemu-utils
		SHELL

		config.vm.provision "shell", privileged: false, inline: <<-SHELL
			#whoami # => vagrant 
			cd ${HOME}
			git clone https://github.com/volumio/Build.git ./Build
			cd ./Build
			time sudo ./build.sh -b arm -d pi
			time bzip2 -9v ./Volumio*.img
			cp -fv *.bz2 /vagrant
		SHELL
	end
```

3. git bashを開いて、`vagrant up`する
4. 待つ

	```shell-session
	...
	...
	==> default: Squash file system created
	==> default: Cleaning squash environment
	==> default: Unmounting Temp Devices
	==> default:
	==> default: real       13m16.552s
	==> default: user       8m57.140s
	==> default: sys        0m36.632s
	==> default:   ./Volumio-2017-07-24-pi.img:
	==> default:  9.865:1,  0.811 bits/byte, 89.86% saved, 2936012800 in, 297607150 out.
	==> default:
	==> default: real       0m54.987s
	==> default: user       0m53.608s
	==> default: sys        0m1.040s
	==> default: 'Volumio-2017-07-24-pi.img.bz2' -> '/vagrant/Volumio-2017-07-24-pi.img.bz2'
	real    16m39.332s
	user    0m0.000s
	sys     0m0.000s
```

5. `Vagrantfile`のフォルダに、`Volumio-2017-MM-DD-pi.img.bz2`みたいのができているはず。[Etcher](https://etcher.io)とかでmicroSDにやく。


## その他
- `time sudo ./build.sh -b arm -d pi` のとこで、`-v 2.0`(例)と追加すると、バージョンがつけられる。 
- `nano /volumio/app/plugins/system_controller/i2s_dacs/dacs.json` にうまくデバイス追加で、メニューに出てくる
- 安いI2Sデバイスを買ったんだけど、Volumio現バージョン2.201(13-06-2017)のカーネルv4.4.xでは未対応のため... これで作成すると、Kernel v4.9.31が使用される。

    ```shell-session
volumio@volumio:~$ uname -a
Linux volumio 4.9.31+ #1005 Thu Jun 8 12:55:36 BST 2017 armv6l GNU/Linux
```
Windows10環境にEclipse Java EE IDE for Web Developersをインストールする。

# 準備
### Eclipseをインストールする。
- https://www.eclipse.org/downloads/

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/192219/89c02818-2eb0-d897-a0e3-fcc99ef37669.png)

『eclipse-inst-win64.exe』のようなプログラムがダウンロードされるので実行。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/192219/97a809b4-84da-a54d-1ffe-78a812576761.png)

とりあえず、『Eclipse IDE for Java EE Developers』を選択。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/192219/0356c8cf-cd03-3a5d-8a55-44909168c516.png)


『INSTALL』実行

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/192219/5a15c381-c869-1b9c-cb45-34715aef4327.png)

それなりに待つ。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/192219/87908fcb-0801-1f9a-4418-348df2e0d405.png)

『LAUNCH』で起動する。
（起動中にWorkディレクトリなど聞かれるので適宜設定する。）

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/192219/2bb9b861-ed84-d3f3-4190-314ecfe5023e.png)

無事起動した。
paiza コーディングスキルチェック （うるう年を求める）

- paizaのコーディングスキルチェックでこう書いたら嫌な受講者なのだろうか…？

## 問題

- 問題は[このページのコーディングサンプル](https://paiza.jp/challenges/practice)にあります。
- 要はうるう年を判定せよという問題です。

## 私の回答

- うるう年判定の条件が参考に出てますが、問題自体は「入力された整数がグレゴリオ暦でうるう年であるか判定するプログラムを書いてください。」だけです。
- 条件は4で割り切れるとかありますが、結果2月29日が存在するのが「うるう年」ですよね。
- なんで、こんな回答です。

```python
import datetime


def leap(year):
    try:
        datetime.date(int(year), 2, 29)
        return True
    except Exception as inst:
        return False


input_lines = int(input())
for i in range(input_lines):
    year = input()
    is_leap = ("is a leap" if leap(year) else "is not a leap")
    print("{year} {is_leap} year".format(year=year, is_leap=is_leap))

```

- もちろん答えはあってます。

```
$ python leap.py < year.txt
1000 is not a leap year
1992 is a leap year
2000 is a leap year
2001 is not a leap year
```

## これって...

- 多分に素直じゃないですがｗ採用側はどう思うんでしょうね？
Froala(高機能wysiwyg editor)使ってみた

ライブプレビュー見ながら、更新できるようなやつを作って見ました。
コンセプトは素人がミスりにくい感じで、ある程度自由度の高いFroalaではありますが今回はその辺をあえて縛ってます。

heroku
＜完成系＞
・Editor Side
https://overwrite-froala.herokuapp.com/admin.php
Digest Auth認証
admin:pass
でログインできます。

・User Side(No Auth)
https://overwrite-froala.herokuapp.com/

なんか昔の人間なんで、サクッと行きたいので、npmとかは使わずでファイルをダウンロードしているとこだけ使います。本体のダウンロードはこちらから、
https://www.froala.com/wysiwyg-editor

githubにsample sourceあげてます
https://github.com/over-write/floara

# ファイル構成
* index.php -- ゲストが見るよう
* admin.php -- 管理画面というか編集画面（今回は簡単にダイジェスト認証をかけております）
* js/froala_editor.min.js -- 本体
* js/froala_editor.pkgd.min.js -- 同上
* js/jquery.js -- みんな大好き jQuery
* css/froala_editor.min.css --本体のCSS
* css/froala_style.min.css --同上
* css/style.css -- 見た目の調整用

今回Herokuにデプロイしようと思ったんだけどファイルの書き込みがなんか出来なかったので、データベースを使いました。
なんか書き込みが一回しかうまくいかないという・・・(以下略

ここを参考に！
[HerokuでPHP+MySQL - Qiita](http://qiita.com/yutaono/items/34bdc9383ce5870e7b8b)

```index.php
<script type='text/javascript' src='js/froala_editor.min.js'></script>
<script type='text/javascript' src='js/plugins/link.min.js'></script>
<script type='text/javascript' src='js/plugins/table.min.js'></script>
<script type='text/javascript' src='js/languages/ja.js'></script>
```
このように利用する機能は個別にJSをロードします。

```js:index.php
$('div#froala-editor').froalaEditor({
language: 'ja',
height:500,
linkAlwaysBlank: true,
tableEditButtons: ['tableRows'],
linkList: [
　　{
　　text: 'オーバーライト',
　　href: 'https://overwrite.jp',
　　target: '_blank',
　　rel: 'nofollow'
　　}
],
linkEditButtons: ['linkEdit', 'linkRemove'],
toolbarButtons:  ['insert','clear','undo', 'redo','insertLink'],
// Define new inline styles.
inlineStyles: 
　{
　'Big Red': 'font-size: 20px; color: red;',
　'Small Blue': 'font-size: 14px; color: blue;'
　},
});
```
ボタン系の制御やプルダウンで表示させる項目も設定できます。

なんか思いの外サクッと行かず、疲れたので、一旦ここまで。

こちらの方の記事もご参考になるかと思います！
http://qiita.com/pokkuri/items/83cc234bf57a6d5561ed
AWS ECR のリポジトリと、pullとpushするポリシーを作るコマンドを作りました。

# 経緯
ECRにrepositoryを作成する際に、いつも同じことを繰り返していたので、作りました。

* リポジトリそのもの
* pullできるpolicy
* pushできるpolicy

の三つが作られます。

# 使い方

https://github.com/ushios/ecr-factory

READMEにも書いてありますが、基本的にコマンドのオプションにリポジトリ名とAWSのクレデンシャルをセットするイメージです。

```console
$ go get github.com/ushios/ecr-factory
$ ecrf -id xxxxx -secret xxxx -name your_docker_repository_name
```

# 謝辞

エラー処理、存在確認、命名など大雑把ですので、それでもよければご使用ください。
Windows10環境にNginxをインストールする

# Nginxをダウンロードする

http://nginx.org/en/download.html

nginx/Windows-XXXの最新版をダウンロード

![nginx_download.png](https://qiita-image-store.s3.amazonaws.com/0/192219/7445560b-4d18-be56-7e45-0c77c53a4869.png)

今回は『nginx-1.10.3.zip』をインストールする。

ZIPファイルを展開するとこんな感じ。
（今回はCドライブ直下に置いた）

C:\nginx-1.10.3

![nginx_download.png](https://qiita-image-store.s3.amazonaws.com/0/192219/f93a4ddb-cd2a-0d5f-f68e-3215a1740b03.png)

『コマンドプロンプト(管理者）』を起動

![nginx_download.png](https://qiita-image-store.s3.amazonaws.com/0/192219/3fabebe6-fe07-f88a-a980-6a156b5c88e8.png)

『C:\nginx-1.10.3』へ移動し、『start nginx.exe』と入力してエンター。

ブラウザーに『localhost』と入力して画面が表示されれば起動完了。

![nginx_download.png](https://qiita-image-store.s3.amazonaws.com/0/192219/62300458-af3e-2103-2659-e46f72c73fe1.png)

終了するときは『nginx -s quit』で停止。
Vagrant 1.9.7 で CentOS7.3 の bento 使ったらエラーになったよ（解決済み）

# とりあえず
VagrntでCentOS6.7を常に愛用しているのですが、そろそろ7系も多少は触っておかねばと思いつつ、また少しハマルの巻。

> [Vagrant 1.9.7](https://www.vagrantup.com/)
> [bento/centos-7.3](https://app.vagrantup.com/boxes/search?utf8=%E2%9C%93&sort=downloads&provider=virtualbox&q=bento%2Fcentos-7.3
)

## いつもの手順
まずboxを追加する。

```text:
C:\vagrant>vagrant box add https://app.vagrantup.com/bento/boxes/centos-7.3
==> box: Loading metadata for box 'https://app.vagrantup.com/bento/boxes/centos-7.3'
This box can work with multiple providers! The providers that it
can work with are listed below. Please review the list and choose
the provider you will be working with.

1) parallels
2) virtualbox
3) vmware_desktop

Enter your choice: 2
==> box: Adding box 'bento/centos-7.3' (v2.3.7) for provider: virtualbox
    box: Downloading: https://vagrantcloud.com/bento/boxes/centos-7.3/versions/2.3.7/providers/virtualbox.box
    box: Progress: 100% (Rate: 735k/s, Estimated time remaining: --:--:--)
==> box: Successfully added box 'bento/centos-7.3' (v2.3.7) for 'virtualbox'!

C:\vagrant>vagrant box list
bento/centos-7.2   (virtualbox, 2.3.1)
bento/centos-7.3   (virtualbox, 2.3.7)
```

## Vagrantfile に
いっつもの定義を書いて…

```text:
config.vm.define :cent73 do |cent73|
  cent73.vm.box = "bento/centos-7.3"
  cent73.vm.network :private_network, ip: "192.168.11.222"
  cent73.vm.provider "virtualbox" do |v|
    v.customize ["modifyvm", :id, "--memory", 512]
  end
end
```

立ち上げると…

```
The executable 'powershell' Vagrant is trying to run was not
found in the %PATH% variable. This is an error. Please verify
this software is installed and on the path.
```

ほえ？なんじゃらほいと？powershellが実行できないとなと？

> https://github.com/mitchellh/vagrant-aws/issues/363

環境変数(PATH)にpowershellのpathを追加しろとのことなので追加する。

```
c:\Windows\System32\WindowsPowerShell\v1.0
```

これで問題なしと！！
brew install したライブラリを見失ったら brew link で直す

このようなケースでは `brew link` および `brew unlink` を利用すべきでした。
以下は悪い例です。

----

ImageMagick + RMagick を利用している Rails アプリが起動しなくなりました。
`brew upgrade` 時にリンクが消えた模様。

> * [ruby on rails - RMagick complaining about libMagickCore.5.dylib not found in OSX - Stack Overflow](https://stackoverflow.com/questions/19040932/rmagick-complaining-about-libmagickcore-5-dylib-not-found-in-osx/19040933#19040933)


ロードできないライブラリを探します。

```prettyprinted
% sudo find / -name "libMagickCore-6.Q16.4.dylib" -print
Password:
find: /dev/fd/****: No such file or directory
find: /dev/fd/****: No such file or directory
/usr/local/Cellar/imagemagick@6/6.9.7-10/lib/libMagickCore-6.Q16.4.dylib
/usr/local/Cellar/imagemagick@6/6.9.8-10/lib/libMagickCore-6.Q16.4.dylib
```

リンクを張り直します。

```prettyprinted
% ln /usr/local/Cellar/imagemagick@6/6.9.7-10/lib/libMagickCore-6.Q16.4.dylib /usr/local/lib/libMagickCore-6.Q16.4.dylib
```

この後、原因となったと考えられるアプリを `brew pin` 指定しました。




## 補遺

* [消してしまった Homebrew の過去バージョンをインストールし直してバージョンを固定する方法 - Qiita](http://qiita.com/DriftwoodJP/items/1bf05bc24b8e3bb0f6f4)
Visual Studio2017で作成したMVCプロジェクトに、StartUp.Auth.csが含まれない場合

Visual Studio2017でプロジェクトを新規作成した際に、StartUp.Auth.csが含まれていないことに後になって気づきました。

Visual Studio2015で作成した時はデフォルトで作成されていたので、Visual Studio2017では設定が必要ということを知りませんでした。

Visual Studio2017では、プロジェクトを新規作成する際に「認証の変更」＞[個別のユーザーアカウント]を設定する必要があります。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/77473/3614e05b-986c-25a5-3b2e-2f9c76b7cfc4.png)
codeception request 単体テスト

リクエストを送る

```
$this->getModule('Laravel5')->_request('POST', '/api/v1/users', ['name' => $name]);
```
レスポンスを得る

```
$this->getModule('Laravel5')->_getResponseContent()
```

ページを開く

```
$this->getModule('Laravel5')->_loadPage('POST', '/checkout/step2', ['order' => $orderId]);
```

もっと詳しい：http://codeception.com/docs/modules/PhpBrowser

追加,POST例：

```php

public function testAdd()
    {
        $this->laravelModule->_loadPage('GET', '/admin/useradd');
        //sentinelロールを取る（データベースから）
        $roles = Sentinel::getRoleRepository()->all();
        $content = $this->laravelModule->_getResponseContent();
        $this->assertContains('お名前', $content);
        $this->assertContains('部署名', $content);
        $this->assertContains('E-mail', $content);
        $this->assertContains('パスワード', $content);
         foreach ($roles as $role) {
            $this->assertContains($role->slug, $content);
        }
 }
```
作成,POST例：

```php

    public function testStore()
    {
        $this->userService = $this->tester->grabService(UserService::class);
        $department = DB::table('departments')->first();
        $role = DB::table('roles')->first();
        $request = [
            'department_id' => $department->id,
            'first_name' => 'テスト',
            'last_name' => '太郎',
            'password' => '12345678',
            'email' => 'test@test.com',
            'user_new_role_' . $role->id => 'on',
        ];
        $user = $this->userService->create($request);
        $this->tester->seeRecord('users', [
            'department_id' => $user->department_id,
            'first_name' => $user->first_name,
            'last_name' => $user->last_name,
            'email' => $user->email,
        ]);
        $this->userService->setRole($request, $user);
        $this->tester->seeRecord('role_users', [
            'user_id' => $user->id,
            'role_id' => $role->id,
        ]);
    }
```

削除、POST例：

```php
$this->laravelModule = $this->getModule('Laravel5');
...
...
public function testDestroy()
{
    //adminページ入ったことを確認
    $this->laravelModule->_loadPage('GET', '/admin/users');
    $content = $this->laravelModule->_getResponseContent();
    $this->assertContains('システム', $content);

　　//Post削除で確認
    $this->laravelModule->_loadPage('POST', '/admin/users/1', [
            '_token' => csrf_token(),
            '_method' => 'DELETE',
        ]);
    $this->laravelModule->_loadPage('GET', '/admin/users');
    $content = $this->laravelModule->_getResponseContent();
    $this->assertNotContains('システム', $content);
}
```

そのた、sentinelなど、shouldReceive()を使う

　onceを付けているので必ず1回だけ呼ばれないとエラーになります。またwithで引数の値も厳格に見てるので違うものが渡された場合はエラーになります。引数が何でも良い場合はwithAnyArgsなどを使います。

```
\Mail::shouldReceive('send')->andReturn(true);
```
oF雑多メモ

自分の記憶容量が残念BOYなので外部記憶としてココに残そう。
だれか電脳化早く。

[2020-02-15：更新]
最近またちょくちょく使っているのでここに残していく。

# v0.11.0

## ofJsonからstringに
stringstreamに一回流し込む。

```cpp
ofJson ofj;
ofj["hello"] = "world";
stringstream ss;
ss << ofj;
cout << ss.str() << endl;
```

## [win]日本語フォントの表示
フォントの読み込み設定に、使用範囲を定義する。

```cpp
ofTrueTypeFontSettings fontSettings("GenShinGothic-Regular.ttf", 20);
fontSettings.addRanges(ofAlphabet::Japanese);//日本語
fontSettings.addRange(ofUnicode::Space);//スペース
fontSettings.addRange(ofUnicode::Latin);//アルファベット等
fontSettings.addRange(ofUnicode::Latin1Supplement);//記号、アクサン付き文字など
fontSettings.addRange(ofUnicode::NumberForms);//数字？
fontSettings.addRange(ofUnicode::Hiragana);//ひらがな
fontSettings.addRange(ofUnicode::Katakana);//カタカナ
font.load(fontSettings);
```

そして文字列の前に `u8` をつける

```cpp
font.drawString(u8"あいうえお", 20, 20);
```

[【openFrameworks】ofTrueTypeFontで日本語のフォントを読み込む方法](https://www.atnr.net/how-to-load-japanese-font-with-oftruetypefont/)
[openFrameworksでUTF8を使う](https://junkiyoshi.com/insta20180605/)

---
# v0.9.8

## cv::imshow()でcv::Matの確認

addon:ofxCv

```cpp:cpp
cv::imshow("hoge", Mat);
```

oFのウインドウとは別に hoge というウインドウでMatを確認できる。
openCVならウン万回叩くやつだけど忘れてた。

## ofImageからcv::Matへの変換

addon:ofxCv

```cpp:cpp
ofImage img;
cv::Mat imgMat = cv::Mat(IMG_HEIGHT, IMG_WIDTH, CV_8UC3, &img.getPixels());
```

上記だとMatがうまく取れていなくて悩んでいたのだけど、ofxCvに便利関数あった。

```cpp:cpp
ofImage img;
cv::Mat camMat = toCv(img);
cv::cvtColor(camMat, camMat, CV_RGB2BGR);
```

oFではカラーチャンネルの順序がRGBだが、生openCVではBGRなのでcvtColor()で変換する必要がある。

[ofxCvでtoCvすると色がおかしくなる](https://teratail.com/questions/45000)
railsでページが表示されるまでの流れ（ルーティング→コントローラ→view）

railsでページが表示されるまでの流れは以下

* URLがリクエストされる
* ルーティングでコントローラが指定
* コントローラでアクションを呼び出す
* アクションからviewへ

# URLがリクエストされる→ルーティングでコントローラ指定

```ruby:routs.rb

Rails.application.routes.draw do
 get "home/top" => "home#top"
 # get URL => コントローラ名#アクション名
end

```
Rails.application.routes.draw do〜endがルートを設定する記述


# コントローラでアクションを呼び出す

## アクションとは

アクションというのはコントローラ上のメソッドでここでは下記のようなものを指す。

これでルーティングが

get "URL" => "コントローラ名#アクション名"

の場合下記のdef top内の処理を呼び出す。

```ruby:test
class test < test

def top
end

end

```
Rustでソートアルゴリズム (1)バブルソート・コムソート


## 概要
Rustの勉強の為にソートを実装してみることとする。
１回目としては、一番簡単なバブルソートを実装し、その発展形であるコムソートを実装する。

## 前提条件
Rustのバージョンは1.19.0とします。

```shell
% rustc --version
rustc 1.19.0 (0ade33941 2017-07-17)
```

## バブルソート
[Wikipediaでの説明](https://ja.wikipedia.org/wiki/バブルソート, "バブルソート - Wikipedia")

```rust:BubbleSort
fn sort<T: PartialOrd>(source: &mut [T]) {
    for i in 0..source.len() {
        for j in 1..(source.len() - i) {
            if source[j] < source[j - 1] {
                source.swap(j, j - 1);
            }
        }
    }
}
```

実行して見ましたが、やはり遅い……
1000要素で動かした場合、標準ソートと比べて30倍ぐらいの時間がかかりました。

## コムソート
バブルソートを改良したソートです。
[Wikipediaでの説明](https://ja.wikipedia.org/wiki/コムソート, "コムソート - Wikipedia")

```rust:CombSort
fn sort<T: PartialOrd>(source: &mut [T]) {
    let mut h = source.len();
    let mut is_swaped = true;

    while is_swaped || h > 1 {
        if h > 1 {
            h = h * 10 / 13;
        }

        is_swaped = false;
        let mut i = 0;
        while i < source.len() - h {
            if source[i] > source[i + h] {
                source.swap(i, i + h);
                is_swaped = true;
            }
            i += 1;
        }
    }
}
```

そこそこ速くなります。
1000要素で動かした場合、標準ソートと比べて倍ぐらいの時間で完了しました。
OUTLOOK Eｘpress死亡 「Windows 10 Fall Creators Update」で廃止・非推奨となる機能が明らかに

#ソース
[Features that are removed or deprecated in Windows 10 Fall Creators Update](https://support.microsoft.com/ja-jp/help/4034825/features-that-are-removed-or-deprecated-in-windows-10-fall-creators-up)
ja-jpでも英語

|廃止・非推奨|機能名|
|:-:|:-:|
|廃止|3D Builder app　Apndatabase.xml　Enhanced Mitigation Experience Toolkit (EMET)  ***Outlook Express***　　Reader app　　Reading List　　Syskey.exe  TCP Offload Engine  Tile Data Layer  Trusted Platform Module (TPM) Owner Password Management|
|非推奨|　IIS 6 Management Compatibility  IIS Digest Authentication　　***Microsoft Paint***  RSA/AES Encryption for IIS Sync Your Settings Image Backup (SIB) Solution  TLS RC4 Ciphers  Trusted Platform Module (TPM): TPM.msc and TPM Remote Management  Trusted Platform Module (TPM) Remote Management  Windows Hello for Business deployment that uses System Center Configuration Manager Windows PowerShell 2.0 |
|廃止及び非推奨|Screen saver functionality in Themes  System|


#ニュースソース
[「Windows 10 Fall Creators Update」で廃止・非推奨となる機能が明らかに](http://forest.watch.impress.co.jp/docs/news/1072053.html)
[さらばMSペイント？ 人気お絵かきアプリ、間もなく廃止か](http://www.afpbb.com/articles/-/3136855?cx_part=txt_topstory)

[「Paint 3D」を「ペイント」に戻す方法が早速発見される 2016/11/24](http://forest.watch.impress.co.jp/docs/serial/yajiuma/1031586.html)
これが前触れだったとは・・・
サイトネットワークのデータベーステーブルを空にするか削除する必要があります


## 状況

- WordPressを試しにマルチサイト化
- wp-configと.htaccessを元に戻す
- 再度マルチサイト化しようとしてタイトルのエラーが出て困った
- テーブルを空か削除って、どこのテーブルやねんといったところ

## テーブル確認

マルチサイト化した際に新しく作られたテーブルは以下の通り。
xxx_は自分のWP接頭辞で読み替えて下さい。

それぞれがなに目的のテーブルなのか調べる。下記サイトより抜粋です。
[WordPressCodex - データベース構造](https://wpdocs.osdn.jp/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E6%A7%8B%E9%80%A0#Table:_wp_blog_versions)

- xxx_blog_versions
> 各サイトの現行データベースのバージョン・ステータスが、テーブルwp_blogs_versions に格納され、各サイトの更新に合わせて更新される。

- xxx_blogs
> 作成された各サイトは、テーブルwp_blogsに格納される。

- xxx_signups
> ログイン登録プロセスによりサイトに登録されたユーザーを格納する。

- xxx_site
> メインのサイトのアドレス情報を含む。

- xxx_sitemeta
> 各サイトの機能情報はサイトデータと呼ばれ、wp_sitemetaに格納される。サイト管理を含むさまざまな設定情報がテーブルに保存される。

ふーん、なるほど（鼻ほじー
selectして中身見ると、xxx_sitemetaはデータが詰まっていて消すのが怖いなあといった感じ。

## テーブルバックアップ
データをいじる前はダンプを取りましょう。
自分ところは同じDBをWP接頭辞で使い分けているファットなDBなので、テーブル単位でダンプを取ります・・・

```バックアップ
mysqldump -u USER_NAME -p DB_NAME xxx_sitemeta xxx_site xxx_signups xxx_blogs xxx_blog_versions > dump.sql
```
## テーブル削除
うわああああああああああああ、ポチッとな

```テーブル削除
drop table xxx_sitemeta,xxx_site,xxx_signups,xxx_blogs,xxx_blog_versions;
```

## テーブルを元に戻す場合
自分の場合は何ともありませんでしたが、消したテーブルを元に戻したい場合はダンプからリストアします。

```リストア
mysql -u USER_NAME -p -D DB_NAME < dump.sql
```

## テーブル削除その後
WPにログイン＞ツール＞ネットワークの設置をたどると、タイトルのエラーはなくなり、マルチサイトの初回設定画面が表示されます。
0x80070422がでてWindows 10 の Windows Updateサービスが開始できなかった時の回復手順

#発端
つけっぱなしで放置して、戻ってきたらデスクトップから、編集中の画面が綺麗サッパリ無くなってて
ついカッとなって『Windows10 Update 止める 方法』とかで検索した事がある人は多いハズ。

私もそんな感じで、いつ頃かにWindows Updateを何とかして止めていたのですが、
その時どうやったか覚えてなくて回復方法がわからなくなってしまいました。

手動アップデートやら、[「Win Updates Disabler」（インプレスのサイト）](http://forest.watch.impress.co.jp/docs/review/736461.html)やらを使って修復を試しましたが、どうやら Windows Update サービス(wuauserv)が起動できないらしい。

管理ツールのサービス画面から、起動方法を変更しようとしても、エラーコード:0x80070422 が出てきて変更できない。

``HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\wuauserv\Start``
を0x00000004(無効)から0x00000002(自動)に変更しようとしても、やはりエラーがでます。

#権限の問題か！！
どうやってこの状態になったのかは分かりません（おそらくカッとなってやったはず）が、権限の問題さえクリアできれば大丈夫そうである。
[Microsoftコミュニティの情報](https://answers.microsoft.com/ja-jp/windows/forum/windows_10-update/windows-10-windows-update/a8a3a4cb-9d67-406e-8ae6-d25451c237d7)をみても、どの手順も権限のことには言及していない。

XPの頃はよく無理やりシステムファイルなんかをゴニョゴニョする手段としてセーフモードにお世話になりました。
しかし、今回はレジストリの値の変更だけなので、セーフモードではやっぱり解決できない。(試した)

regeditにいつからこんな機能がついたのか分かりませんが、レジストリのディレクトリキーに「アクセス許可」ができるようになっていました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/102207/2aefb4ba-e351-a570-a87a-fd2fb7592fa9.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/102207/9045abbd-b80a-ebdd-e371-6c470a77ba4c.png)

ここに自分のユーザーを追加してみると・・・普通に変更可能に！

こんなに簡単だったなんて。何時間も悩んで馬鹿を見た気分です。