OmniAICreator/Qiita-1.07M huggingface dataset:
golangでjsonとyamlを変換

https://qiita.com/daichirata/items/5d751a8a4544434c27b0
これを見て衝撃を受けて、書かずにはいられなかった。

yamlのアンカーとエイリアスには対応してないらしい。

```go:yj.go
package main

import (
	"flag"
	"fmt"
	"io/ioutil"
	"os"

	"encoding/json"
	"github.com/ghodss/yaml"
	yaml2 "gopkg.in/yaml.v2"
)

func main() {
	var (
		jsonFlag bool
		yamlFlag bool
	)
	flag.BoolVar(&jsonFlag, "json", false, "bool flag")
	flag.BoolVar(&yamlFlag, "yaml", false, "bool flag")
	flag.Parse()

	buf, err := ioutil.ReadAll(os.Stdin)
	if err != nil {
		panic(err)
	}

	m := make(map[string]interface{})
	err = yaml.Unmarshal(buf, &m)
	if err != nil {
		panic(err)
	}

	if yamlFlag {
		d, err := yaml2.Marshal(&m)
		if err != nil {
			panic(err)
		}
		fmt.Printf("%s", d)
	}

	if jsonFlag {
		d, err := json.Marshal(&m)
		if err != nil {
			panic(err)
		}
		fmt.Printf("%s", d)
	}
}
```

## ビルドと実行

```sh
go build yj.go

cat <<EOD | ./yj -yaml | ./yj -json
{
    "glossary": {
        "title": "example glossary",
        "GlossDiv": {
            "title": "S",
            "GlossList": {
                "GlossEntry": {
                    "ID": "SGML",
                    "SortAs": "SGML",
                    "GlossTerm": "Standard Generalized Markup Language",
                    "Acronym": "SGML",
                    "Abbrev": "ISO 8879:1986",
                    "GlossDef": {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
                        "GlossSeeAlso": ["GML", "XML"]
                    },
                    "GlossSee": "markup"
                }
            }
        }
    }
}
EOD

echo 

cat <<EOD | ./yj -json | ./yj -yaml
---
glossary:
  title: example glossary
  GlossDiv:
    title: S
    GlossList:
      GlossEntry:
        ID: SGML
        SortAs: SGML
        GlossTerm: Standard Generalized Markup Language
        Acronym: SGML
        Abbrev: ISO 8879:1986
        GlossDef:
          para: A meta-markup language, used to create markup languages such as DocBook.
          GlossSeeAlso:
          - GML
          - XML
        GlossSee: markup
EOD
```
Localizable.stringsファイルをソートするスクリプト

iOSの `Localizable.strings` をprefixルールで管理していて、昇順ソートした方がわかりやすそうだったのでpythonでスクリプトを書きました。 [python-localizable](https://github.com/chrisballinger/python-localizable)というライブラリを使います。

```python
# Usage: `python scripts/localization/sort_localizable_strings.py {Localizable.stringsへのフルパス}`

import sys
import localizable
import codecs
import os

args = sys.argv

if len(args) < 2:
    print('first arg should be filePath.')
    sys.exit()

filePath = args[1]

if os.path.isfile(filePath):
    strings = localizable.parse_strings(filename=filePath)
    strings = sorted(strings, key=lambda s: s['key'])
    txt = ''
    for s in strings:
        if s['comment'] != '':
            txt += "/*" + s['comment'] + "*/\n"

        txt += "\"" + s['key'] + "\" = \""
        txt += s['value'].replace('\n', '\\n').replace('\r', '\\r').replace('\"', '\\"') + "\";\n\n"

    f_output = codecs.open(filePath, 'w+',  'utf-8')
    f_output.write(txt)
    f_output.close()

    print('Sorted Localizable.strings')
else:
    print('Localizable.strings does not exist.')
```

以上。

python初心者なのでもっといい書き方があれば指摘お願いします :bow:
PythonのSVMで多クラス分類をする

## 記事の主旨

「SVMで多クラス分類がしたい。__手持ちのデータ__を手軽に分類したい」
そんな人のための学習リソースを集めた記事です。

既存のライブラリ（scikit-learnとLIBSVM）を使って、ちゃちゃっと分類しちゃいましょう。

## 事前知識

SVMによる多クラス分類には、代表的な２種類の手法があります。

- 1対1分類法（OvO：One versus the One）
- 1対他分類法（OvR：One versus the Rest）

今回はこれらを２つの手法を扱ったライブラリを使います。
詳しくは、以下の記事が参考になります。

>参考サイト:
>　・[SVMを使いこなす！ - 多クラス分類](https://qiita.com/pika_shi/items/5e59bcf69e85fdd9edb2#7%E5%A4%9A%E3%82%AF%E3%83%A9%E3%82%B9%E5%88%86%E9%A1%9E)

## scikit-learnでSVM (OvOとOvR)

### 1. scikit-learnライブラリをインストール
 - `pip install scikit-learn`でインストール

### 2. 簡単な事例でHello world!
>付属データセットを用いた事例:
>　・[OvOとOvRによる手書き文字の分類](https://qiita.com/sotetsuk/items/3a5718bb1f945a383ceb)
>　・[Jupyter Notebookを用いた手書き文字の分類](https://pepese.github.io/blog/python-ml-svm-multiclass/)

### 3. 手持ちのデータを当てはめる
>公式リファレンス:
>　・[sklearn.multiclass.OneVsOneClassifier(OvO)](http://scikit-learn.org/stable/modules/generated/sklearn.multiclass.OneVsOneClassifier.html)
>　・[sklearn.multiclass.OneVsRestClassifier(OvR)](http://scikit-learn.org/stable/modules/generated/sklearn.multiclass.OneVsRestClassifier.html)

## LIBSVMでSVM (OvOのみ)

### 1. LIBSVMライブラリをインストール
>・[LIBSVMライブラリのダウンロード＆インストール方法](
https://yoheikoga.github.io/2016/07/20/use-libsvm-by-python/)
>　（makeコマンドでインストールするところまで）
>・[LIBSVM - Github](https://github.com/cjlin1/libsvm)

### 2. 簡単な実装記事でHello world!
>簡単なテストデータを用いた事例:
>　・[SVM図解 + LIBSVM実装の手順とその解説](http://tkoyama1988.hatenablog.com/entry/2013/12/09/125143)

### 3. 手持ちのデータを当てはめる
>公式情報(英語):
>　・[公式サイト](https://www.csie.ntu.edu.tw/~cjlin/libsvm/)
>　・[公式FAQ](https://www.csie.ntu.edu.tw/~cjlin/libsvm/faq.html)
>公式情報の日本語訳
>　・[設定パラメータ表（日本語）]
(http://hy-adversaria.blogspot.jp/2011/04/pythonlibsvm.html)
>　・[公式FAQの日本語訳（一部）](http://blog.livedoor.jp/itukano/archives/51799171.html)

## 応用: 筆者がやったこと
### 1. 主成分分析に線形SVMを載せて描画
![](https://qiita-image-store.s3.amazonaws.com/0/162655/ac71ab00-2403-da85-6c00-102b15824a3e.png "PCA+SVM")

主成分分析(PCA)の第一主成分(PC1)と第二主成分(PC2)による超平面上に、線形SVMを描画しました。
PC1とPC2の寄与率が高い場合は、この図で色々と直感的な説明ができます。

>参考サイト:
>　・[Multilabel classification（公式）](http://scikit-learn.org/stable/auto_examples/plot_multilabel.html#sphx-glr-auto-examples-plot-multilabel-py)
>　・[Intro to scikit-learn](https://vene.ro/talks/scikit-learn-shef-19102012.html) の Multilabel classification

### 2. 線形SVMの特徴量の重みをパス図として描画

![](https://qiita-image-store.s3.amazonaws.com/0/162655/baadbe06-8a10-775d-2a2b-ebee5b8f3257.png "パス図")

多数の特徴量で構成した数式モデルを、パス図として描画しました。
視覚的にモデル式を説明したい時に使えます。

>参考サイト:
>　・[LIBSVMの学習モデルを用いた特徴量の重み計算スクリプト](http://sucrose.hatenablog.com/entry/2013/07/10/223952)
>　　（学習モデルの取得方法は[ここ](http://tkoyama1988.hatenablog.com/entry/2013/12/09/125143)に載ってます）
>　・[パス図描画ライブラリ「graphviz」- Examples](http://graphviz.readthedocs.io/en/stable/examples.html)
【Java】.gitignoreテンプレ

```
bin/
out/

### Java
*.class
*.jar
*.war
*.ear

### OS
Thumbs.db
.DS_Store

### Maven
target
!.mvn/wrapper/maven-wrapper.jar

### Gradle
.gradle
/build/
!gradle/wrapper/gradle-wrapper.jar

### Other
*.log
*.swp
*.bak

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.metadata

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr

### NetBeans ###
nbproject/private/
build/
nbbuild/
dist/
nbdist/
.nb-gradle/

### VSCode ###
.vscode

```
Carthageのupdateがうまくいかないときのメモ

# 問題 
### Carthageをアップデートしようとすると、今までできていたのに指定したバージョンを落とせない

`Cartfile内部`
`github "xmartlabs/Eureka" == 4.0.0`

`Cartfile.resolved内部`
`github "xmartlabs/Eureka" "2.0.0-beta.1"`

何故か書き換わる・・・

## 解決策
### キャッシュを削除するとうまく行った
rm -rf ~/Library/Caches/org.carthage.CarthageKit
CSS命名規則「BEM」を使うためのscss小技

※ 注意：各セレクターにはプロパティが入ってないとコンパイル結果には出てこないと思いますが、ここではすべて省略しています。

# 「&」で親セレクター継承

よくあるやつ

```scss
.block {
  &__element {
  }
  &--modifier {
  }
}
```

```css:コンパイル後
.block {
}
.block__element {
}
.block--modifier {
}
```

コンパイル後「.block」を親に付けたければ

```scss
.block {
  #{&}__element {
  }
  #{&}--modifier {
  }
}
```

```css:コンパイル後
.block {
}
.block .block__element {
}
.block .block--modifier {
}
```

## mixin化

[Mixinにしている情報](https://css-tricks.com/snippets/sass/bem-mixins/)を発見。
ここを元に。

```scss:mixin
@mixin e($element) {
  &__#{$element} {
    @content;
  }
}

@mixin m($modifier) {
  &--#{$modifier} {
    @content;
  }
}
```

使ったら

```scss
.block {
  @include e(element) {
  }
  @include m(modifier) {
  }
}
```

```css:コンパイル後
.block {
}
.block__element {
}
.block--modifier {
}
```

### 引数（セレクタ）を何個も持てるように調整。

```scss
@mixin e($elements...) {
  @each $element in $elements {
    &__#{$element} {
      @content;
    }
  }
}

@mixin m($modifiers...) {
  @each $modifier in $modifiers {
    &--#{$modifier} {
      @content;
    }
  }
}
```

使ったら

```scss
.block {
  @include e(element) {
  }
  @include e(foo, bar) {
  }
  @include m(modifier, baz) {
  }
}
```

```css:コンパイル後
.block {
}
.block__element {
}
.block__foo {
}
.block__bar {
}
.block--modifier {
}
.block--baz {
}
```

# 変数でセレクターの保存

Modifierの中のElementのスタイルを変えたい時

```scss
.block {

  &__element {
  }
  &--modifier {
    // ここで$__elementを書き換えたい。
  }
}
```

こうする

```scss
.block {
  $element: null;

  &__element {
    $element: &;
  }
  &--modifier {
    #{$element} {
    }
  }
}
```

```css:コンパイル後
.block {
}
.block__element {
}
.block--modifier {
}
.block--modifier .block__element {
}
```

上のmixin使うと

```scss
.block {
  $element: null;

  @include e(element) {
    $element: &;
  }
  @include m(modifier){
    #{$element} {
    }
  }
}
```

```css:コンパイル後
.block {
}
.block__element {
}
.block--modifier {
}
.block--modifier .block__element {
}
```

この場合引数は一つしか使えないので、複数使いたかったらこうする

```scss
.block {
  display: block;
  $elements: ();

  @include e(element1, element2) {
    $elements: append($elements, &);
  }

  @include m(modifier){
    @each $element in $elements {
      #{$element} {
      }
    }
  }
}
```

```css:コンパイル後
.block {
}
.block__element1 {
}
.block__element2 {
}
.block--modifier {
}
.block--modifier .block__element1 {
}
.block--modifier .block__element2 {
}
```

# 複数Elementに共通スタイルを当てる

mixinに複数セレクタ入れればできるけど、別の方法。

```scss
%elementCommon {
}

.block {
  @include e(element1) {
    @extend %elementCommon;
  }
  @include e(element2) {
    @extend %elementCommon;
  }
}
```

```css:コンパイル後
.block__element1, .block__element2 {
}

.block {
}
.block__element1 {
}
.block__element2 {
}
```

とりあえず以上。
増えたら追記します。
【凡ミス禄】カラム名をupdateにしたらDangerousAttributeErrorで怒られた

よっしゃ！scaffoldで基本機能出来たし、一式チェックしてみようかな～と思い、とりま新規投稿。
すると

```
ActiveRecord::DangerousAttributeError (update is defined by Active Record. 
Check to make sure that you don't have an attribute or method with the same name.):
```

怒られた！
そこで、こちらの親切な記事を参考にさせて頂きました。
[本厚木のエンジニアブログではある](URL "http://shonoooo.hatenablog.com/entry/2015/06/29/171915")

どうやら、カラム名には規約があるらしく、

```/db/schema.rb
  create_table "contributions", force: :cascade do |t|
    t.string "title"
    t.string "user_name"
    t.text "overview"
    t.text "category"
    t.date "update"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end
```
'update'はNGだそうな。
最終登録日時なのでupdateが適切かと思ったのですが、今回はmodifiedに変更したい。
なので、rename用の新たなマイグレーションファイルを作成。

```
$ rails g migration rename_Date_column_to_tests
```

そすると、

```db/migrate/20180205081916_rename_date_column_to_tests.rb
class RenameDateColumnToTests < ActiveRecord::Migration[5.1]
  def change
  end
end

```
change関数ができてるので


```db/migrate/20180205081916_rename_date_column_to_tests.rb
class RenameDateColumnToTests < ActiveRecord::Migration[5.1]
  def change
    #追記
    rename_column :contribution, :update, :modified
  end
end
```
（あれ？テーブル名って確かcontributionで設定したよな？うろ覚えだけど、まいっか！）
update　→　modifiedにrenameするべく、もう一度migrate。
```
$ rake db:migrate
```

・
・
・



```
ActionController::RoutingError (No route matches [GET] "/contribution"):
```

ルーティングエラー。
えーと、「テーブル名」ってそもそもなんだっけ？
とよくよく考えた結果、

```/db/schema.rb
  create_table "contributions", force: :cascade do |t|
省略
```

contributions

s抜けてましたね。

これで解決！
yesコマンドをいろいろ実装

# はじまり
yesコマンドに関する記事をたまたま読んだのでちょっとやってみた。
[Unixコマンド”yes”についてのちょっとした話 | コンピュータサイエンス | POSTD](http://postd.cc/a-little-story-about-the-yes-unix-command/)
私は標準入力のロックはやっていません。
print系の関数だと可変引数のサポートが邪魔しそうなので基本的にwriteを使っています。

# とりあえず
私のArchLinuxにビルトインのyesコマンド(GNU coreutils 8.29)

```bash
$ yes | pv -r > /dev/null
```

**8.63GiB/s**くらい

# C
gcc(7.3.0)で特に最適化とか入れてません

##バッファなし

```c
#include <unistd.h>

#define LEN 2

int main() {

    char yes[LEN] = "y\n";

    while (1) {
        write(1, yes, LEN);
    }
}
```

**4.44MiB/s**くらい
思ってたより遅い

##バッファ有り（8KB）

```c
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

#define BUFSIZE 8192
#define LEN 2

int main() {
    char *buf = malloc(BUFSIZE);

    int i;
    char yes[LEN] = "y\n";

    for (i = 0; i < BUFSIZE; i += LEN) {
        memcpy(buf + i, yes, sizeof(char) * LEN);
    }

    while (1) {
        write(1, buf, BUFSIZE);
    }
}
```
**8.85GiB/s**くらい
~~あれ、これ変なメモリに書き込んでるような~~
ビルトインのyesよりちょっと速いのはバッファサイズの関係かなと

# Python
3.6.4
## バッファなし

```py
import sys

while True:
    sys.stdout.write('y\n')
```

**14.2MiB/s**くらい
Cのバッファなしより速い

## バッファ有り(8KB)

```py
import sys

BUF_SIZE = 8192

yes = ''
while len(yes) <= BUF_SIZE:
    yes += 'y\n'

while True:
    sys.stdout.write(yes)

```
**4.07GiB/s**くらい
インタプリタの割に結構早い

# ~~本命の~~シェルスクリプトでやってみた

## バッファなし

```bash
$ while true; do echo y; done | pv -r > /dev/null 
```

**890KiB/s**くらい

## バッファ有り(8KBのファイル)

```bash
$ for i in `seq 4096`; do echo y; done > yes8kb.txt; while true; do cat yes8kb.txt; done | pv -r > /dev/null
```

**2.93MiB/s**くらい

## 無理矢理（1GBのファイルを作ってやってみた）
```bash
$ for i in `seq 524288`; do echo y; done > yes1mb.txt; for i in `seq 1024`; do cat yes1mb.txt; done > yes1g.txt; while true; do cat yes1g.txt; done | pv -r > /dev/null
```
***4.93GiB/s***くらい

# 感想
~~シェルスクリプト~~catコマンドが健闘
もっといい書き方がありそう
データ分析コンペに出場してみた(Kaggleの前に)

データ分析コンペに初めて出場してみたので忘備録

#出場したコンペ
データ分析コンペといえばKaggleだと思うけど，英語だし難しそう．
Titanicコンペというチュートリアルはやったけどその後止まっている人は多そう．
今回は[オプトDSL](https://deepanalytics.jp/)の引っ越し需要予測チャレンジに出場．
Kaggleと違って日本語で初心者にとってやりやすいと思う．
難点としては，kernelやdiscussionがないので知見が貯まりにくい．一人でやっている感じがする．

#コンペ結果
今回は引っ越しの需要を予測するコンペに出場し，36位/235位だった．１日3回サブミットできるコンペで41回もサブミットしている．．結構時間かけたので後半の失速が残念．

#やったこと
今回のコンペはデータが非常に綺麗でデータ量も少なく，初心者にとってはありがたかった．モデルはXgboostを決め打ちで使っていました．

特徴量抽出に関しては，既にある日付のデータから，年ラベル，月ラベル，週ラベル，日ラベルを取得してました．目的変数は基本的に動かさずに説明変数ばっかりいじっていました．(途中，六曜(仏滅とかのアレ)のデータも取得しましたがほとんど意味がありませんでした．)

クロスバリデーションも手法を何通りかいじって，ランダム抽出や時系列の並びを保存させた手法等を試しました．(結局時系列を守った形式で取得しました．)

#結果
・目的変数を調整するという考え方がなかったので反省．
・オンラインとオフラインのデータの違いに苦しめられた．

#まとめ
・Kaggleの前にDSLに挑戦してみても良いかも(最初の１ステップ目が難しいので)
・Xgboostのアルゴリズムは理解していなくてもコンペには出られる．
　(理解したほうが良いのはもちろん．)
・ハイパーパラメータのチューニングの前にデータ見ようぜ．
GetMappingでURLパラメータからValueを取得する～LocalDate編～

#GetMappingでURLパラメータからValueを取得する～LocalDate編～

- 自分のメモも兼ねて投稿しています。
- URL：http://localhost:8080/date/2018-02-02/2019-01-01
- 大事っぽいとこ
- 1.番はURLのパターンに合わせること（今回：2018-02-02）

    1. @DateTimeFormat(pattern = "yyyy-MM-dd")
    2. @PathVariable LocalDate from
    3. @PathVariable LocalDate to


```java
@RestController
@RequestMapping(value = "/date/{from}/{to}", method = RequestMethod.GET)

public class CsvController {

    @GetMapping
    public String get(@DateTimeFormat(pattern = "yyyy-MM-dd") @PathVariable LocalDate from,
                      @DateTimeFormat(pattern = "yyyy-MM-dd") @PathVariable LocalDate to) {
        return "fromDate:" + from.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))
               + "toDate:" + to.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
    }
}
Reactでルーティングを実装したのでメモ

SPAのサイトを制作したのですが、素人くさい感じに、display:none;やdisplay:block;で切り替えをしていたので、
Reactを使用し、ルーティングで切り替え実装を行ったので、メモします。

```js
const React = require('react');
const ReactDOM = require('react-dom');
const createReactClass = require('create-react-class');
const EventListener = require('react-event-listener');
const ReactRouter = require('react-router');
const Router = ReactRouter.Router;
const Route = ReactRouter.Route;
const IndexRoute = ReactRouter.IndexRoute;
const History = ReactRouter.History;
const Link = ReactRouter.Link;
const Route = ReactRouter.Route;
const Link = ReactRouter.Link;
const hashHistory = ReactRouter.hashHistory;
const IndexRoute = ReactRouter.IndexRoute;

var App = createReactClass({
  render: function () {
    var userId = this.props.location.query;
    console.log(userId);
    return (
      <div>
        <div>
          <p><Link to="/">Dashboard1111</Link></p>
          <p><Link to="a">Inbox2222</Link></p>
          <p><Link to="b">CalendarRoute3333</Link></p>
          <p><Link to="c">DashboardRoute</Link></p>
        </div>
        <div>
          { this.props.children }
        </div>
      </div>
    );
  }
});

var Index = createReactClass({
  render: function(){
    return (
      <div>
        <p>Index</p>
      </div>
    );
  }
});

var DashboardRoute = createReactClass({
  render: function(){
    return (
      <div>
        <p>DashboardRoute</p>
      </div>
    );
  }
});

var InboxRoute = createReactClass({
  render: function(){
    return (
      <div>
        <p>InboxRoute</p>
      </div>
    );
  }
});

var CalendarRoute = createReactClass({
  render: function(){
    return (
      <div>
        <p>CalendarRoute</p>
      </div>
    );
  }
});

ReactDOM.render((
  <Router history={hashHistory}>
    <Route path="/" component={App}>
      <IndexRoute component={Index} />
      <Route path="a" component={InboxRoute}/>
      <Route path="b" component={CalendarRoute}/>
      <Route path="c" component={DashboardRoute}/>
    </Route>
 </Router>
),document.getElementById('content')
);
```
Gitをソースコードからインストールする

#環境
-CentOS 6.9
-git 2.6.2

#目的
サーバー構築する際にいちいち調べるのが面倒なので自分用に1つにまとめるため。
[Gitの公式](https://git-scm.com/book/ja/v1/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-Git%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)が(個人的に)分かりにくいため。
デフォルトの1系でも問題ない方はしなくてもよい。2系での変更点は自分で調べてください。

#Gitを取得
使いたいGitのverを[こちらから](https://github.com/git/git/releases)取得。今回はlinuxのためtarファイル。

(2018/08/08 追記)`curl https://github.com/git/git/archive/v2.x.x.tar.gz`の方が楽ですね。
現行最新は2.18.0になります。

#Gitファイルの解凍
tarファイルを任意のディレクトリに保存して、解凍する。
`# tar xvf git-2.6.2.tar.gz`

#Gitの確認
まず、Gitが入っているか確認する。デフォルトだと1.7.1とか入っているはず
`# git --version`

#Gitの削除
古いGitを削除する場合。
`# yum remove git`
削除後に再ログインして、Gitの確認を行うと消えているはず。

#パッケージのインストール
Gitのインストールに必要なパッケージをインストールします。(公式に載っています)
`#  yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-ExtUtils-MakeMaker`

#Makefileの作成

**Makefile...ソースコードをビルドするために必要な環境が整っているかチェックしてくれる**

autoconfのインストール
`# yum -y install autoconf`

**autoconf...Configureスクリプト実行時にMakefileを自動生成してくれる**

##Configureスクリプトの作成
ConfigureスクリプトはMakefileを作ってくれます。
`# make configure`

GEN configureと表示されました。

##Configureスクリプトの実行
`# ./configure`

実行すると以下の感じになりました。
[root@xxxx git-2.6.2]# ./configure
configure: Setting lib to 'lib' (the default)
configure: Will try -pthread then -lpthread to enable POSIX Threads.
configure: CHECKS for site configuration
checking for gcc... no
checking for cc... no
checking for cl.exe... no
configure: error: in `/xxxx/yyyy/git-2.6.2`:
configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details

要はgccが入ってないと言われている。

##コンパイラのインストール
gccの確認。
`# rpm -qa|grep gcc`

コンパイラのインストール
`#  yum -y install gcc`

#ソースコードのコンパイル
実行ファイルの生成
`# make prefix=/usr/local all`

インストール
`# make prefix=/usr/local install`

最後にlinuxの再起動をして
`# git --version`
で、新しいGitの完成よ!!
スプレッド演算子を可変長引数に使用した場合、配列になる(スプレッド演算子じゃなくて残余引数？)

# 可変長引数にアクセスすると配列になっている

**私用のメモなので、駄文です。**

---

**2018/02/06追記**
以下の`...param`はスプレッド演算子ではなくて残余引数らしいです。
詳しくはコメント参照。

```javascript
function hoge(...param) { console.log(param); }
```

---

```javascript
function hoge(...param) { console.log(param); }

hoge('1', '2'); // ['1', '2']
hoge(['1', '2']); // [['1', '2']]
```

上記例でいくと、`param`が配列になってます。
なので、引数の1個目にアクセスしたいときは`param[0]`って書く必要がある。

スプレッド演算子は配列の要素を展開する役割もあるから困惑して「ん？」ってなりました。
例えば、以下のコードと上記のコードの違いがすぐには分からず戸惑いました。

**以下はスプレッド演算子について調査した時に参考にした[このページ](https://qiita.com/sanonosa/items/e6f503cbb95c8e6967f8)より引用しました。
可変長引数が配列になることも記述されています。**

```javascript
const data = [15, -3, 78, 1];
console.log(Math.max(...data));    // 78

// もう以下のように書く必要はありません
console.log(Math.max.apply(null, data));
```

あれ、Math.max()も引数を配列で受け取ってるの？って思っちゃいました。
冷静になるとそんなわけないですね・・・(実際に引数に配列を渡すと`NaN`になる)

多分、`Math.max`は引数を可変長引数で受け取ってない。
だから、引数は配列になってない。
関数の実態は以下のようになっていて、`arguments`でループ回してると推測。

```javascript
// argsは最初の引数しかアクセスできないけど、arguments[0]の形で引数全てにアクセスできる
function Math.max(args){ do_something(); };

//　引数を可変長配列で受け取っているから、内部スコープでは配列になる
function hoge(...param) { console.log(param); }
```

論理的な思考が全然できてなかったと反省。
PHP環境構築で個人的に詰まったところ（dllは存在するのに、何故か"Cannot load"と言われた）

Apache実行時につまったので、備忘も兼ねてメモ。
"xampp_start"実行時、以下のエラーを吐き続け、一向に解消しませんでした。

■エラー内容
`httpd.exe: Syntax error on line 521 of C:/develop/xampp/apache/conf/httpd.conf: Syntax error on line 17 of C:/develop/xampp/apache/conf/extra/httpd-xampp.conf: Cannot load C:/develop/xampp/php/php5ts.dll into server: \x8ew\x92\xe8\x82\xb3\x82\xea\x82\xbd\x83\x82\x83W\x83\x85\x81[\x83\x8b\x82\xaa\x8c\xa9\x82\xc2\x82\xa9\x82\xe8\x82\xdc\x82\xb9\x82\xf1\x81B`



・Cannot load C:/develop/xampp/php/php5ts.dll
「C:/develop/xampp/php/php5ts.dll」このdllが存在しないから、読み込めないよってエラーらしい。



しかし、ファイル自体は存在する。
原因不明で色々試しつつ、2日ほど経過したが、
結果、以下の32bit版のパッケージをインストールすることで解消した。

[Visual Studio 2012 更新プログラム 4 の Visual C++ 再頒布可能パッケージ](https://www.microsoft.com/ja-jp/download/details.aspx?id=30679)


このパッケージは環境構築時もいれていたのですが、その際は64bit版をいれていた。
今回ないと言われた「C:/develop/xampp/php/php5ts.dll」は、32bitだった。。。
dllの動作環境もしっかり確認しておく必要がある。

■bit数確認
`C:\develop\xampp\php>dumpbin /headers "./php5ts.dll" | findstr machine
             14C machine (x86)
                   32 bit word machine
`
※上記、Visual Studioのコマンドプロンプトを用いて、実行しています。
windows同士でSSH通信設定

### 

1,管理者権限でコマンドプロンプトを開く

2,SSHで使用するポートの設定
デフォルトはポート22ですが、この例ではポート20022を使用します。
下記の操作で、Windowsのファイアウォールがポート20022を通すように設定を行います。

管理者権限でコマンドプロンプトを起動し、下記のコマンドを実行します。

ルールの追加
netsh advfirewall firewall add rule name="sshd" dir=in action=allow protocol=TCP localport=20022 profile=private

3,ルールの確認
> netsh advfirewall firewall show rule name="sshd"

規則名:                               sshd
----------------------------------------------------------------------
有効:                                 はい
方向:                                 入力
プロファイル:                         プライベート
グループ:
ローカル IP:                          任意
リモート IP:                          任意
プロトコル:                           TCP
ローカル ポート:                      20022
リモート ポート:                      任意
エッジ トラバーサル:                  いいえ
操作:                                 許可
OK

4,windows版のSSHをダウンロードする
https://github.com/PowerShell/Win32-OpenSSH/releases

※v0.0.9.0より下のバージョンをダウンロードする。
　v0.0.9.0より上だと存在するファイルがない。
　対象ファイル名：install-sshlsa.ps1

5,sshd_configの修正
\#Port 22
Port 20022

\#Subsystem  sftp    sftp-server.exe
Subsystem   sftp    C:\OpenSSH-Win64\sftp-server.exe

6,インストール
このディレクトリをカレントディレクトリにして、管理者権限でコマンドプロンプトを起動し下記のコマンドを実行します。
> powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1
[SC] SetServiceObjectSecurity SUCCESS
[SC] ChangeServiceConfig SUCCESS
 Granting SeAssignPrimaryTokenPrivilege to NT SERVICE\SSHD   ... successful
sshd and ssh-agent services successfully installed

> ssh-keygen.exe -A
ssh-keygen.exe: generating new host keys: RSA DSA ECDSA ED25519

> powershell.exe -ExecutionPolicy Bypass -File install-sshlsa.ps1

> ssh-keygen.exe -l -f ssh_host_rsa_key -E md5
2048 MD5:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:** HOME-DEV-PC\rubytomato@home-dev-pc (RSA)

7,サービスの開始
管理者権限でコマンドプロンプトを起動し、netコマンドでsshdサービスを開始します。
sshdサービスが開始されると、同時にsftp-serverも使用できるようになります。
> net start sshd

sshd サービスは正常に開始されました。

8,クライアントの鍵を作成する。
　SSH用のフォルダを作成する
mkdir c:\Users\XXXXX\.ssh
※作成しなくても自動で作成される

9,鍵を生成する
PS C:\Users\XXXXX> ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (//.ssh/id_rsa): c:/Users/XXXXX/.ssh/id_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in c:/Users/XXXXX/.ssh/id_rsa.
Your public key has been saved in c:/Users/XXXXX/.ssh/id_rsa.pub.
The key fingerprint is:
48:--:--:--:0b:bf:0a:fd:ff:--:--:--:--:--:--:-- XXXXX@YOUR SERVER NAME
The key's randomart image is:
+--[ RSA 2048]----+
|        略       |
+-----------------+

10,鍵作成後、相手先の「authorized_keys」に作成した鍵「id_rsa.pub」を代入する。
type id_rsa.pub >> authorized_keys

11,WinScpの設定
ホスト名、ポート番号、ユーザ名、パスワードを入力する。
![WS000016.JPG](https://qiita-image-store.s3.amazonaws.com/0/162959/b6f21e07-c34f-39a9-d893-fc7376b453b0.jpeg)

12,秘密鍵(id_rsa)を指定する。
![WS000017.JPG](https://qiita-image-store.s3.amazonaws.com/0/162959/ebca6f92-e69d-26a5-6190-89213abc8ed3.jpeg)


以上を設定すれば接続まではいけますが、日本語表記の記載があるファイルについてはダウンロードができないです。。。
何かわかれば返信ください。
馬鹿の一つ覚え: httpd

#### httpdの再起動 (CentOS7)
```
$ sudo systemctl restart httpd.service
```

#### SELinuxが有効になっているサーバでの注意点
```
$ getenforce
Enforcing
$ cmp /var/www/html/data/foo /tmp/foo
$ ls -l /var/www/html/data/foo /tmp/foo
-rw-r--r--. 1 glire glire 20273 Feb  5 15:09 /tmp/foo
-rw-r--r--. 1 glire glire 20273 Feb  5 15:09 /var/www/html/data/foo
$ ls -Z /var/www/html/data/foo /tmp/foo
-rw-r--r--. glire glire unconfined_u:object_r:user_tmp_t:s0 /tmp/foo
-rw-r--r--. glire glire unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/data/foo
$ mv -i /tmp/foo /var/www/html/data
mv: overwrite '/var/www/html/data/foo'? y
$ ls -Z /var/www/html/data/foo    # このファイルはアクセスできない
-rw-r--r--. glire glire unconfined_u:object_r:user_tmp_t:s0 /var/www/html/data/foo
$ restorecon /var/www/html/data/foo    # ラベルuser_tmp_tをhttpd_sys_content_tに変更
$ ls -Z /var/www/html/data/foo
-rw-r--r--. glire glire unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/data/foo
```
ファイルを別なディレクトリから移動して公開する場合、ブラウザ側で Forbidden You don't have permission to access /data/foo on this server. と表示されてアクセスできないことがある。その場合はコマンド restorecon を用いて、セキュリティに関する拡張属性を書き換える必要がある。

#### Pythonで書かれたCGIで日本語を読み込む
```
<Directory "/var/www">
    AllowOverride None
    # Allow open access:
    Require all granted
    SetEnv PYTHONIOENCODING UTF-8
<Directory>
```
設定ファイル /etc/httpd/conf/httpd.conf の <Directory "/var/www"> に SetEnv PYTHONIOENCODING UTF-8 を書き込めばよい。

#### ディレクトリ毎の設定を行う.htaccessを利用
```
DocumentRoot "/var/www/html"

<Directory "/var/www">
    AllowOverride None
    Require all granted
</Directory>

<Directory "/var/www/html">
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>
```
ファイル .htaccess を有効にするためには /etc/httpd/conf/httpd.conf の <Directory "/var/www/html"> の中の AllowOverride None を上記のように AllowOverride All に変更する。有効になったことは .htaccess に自分の名前などのいい加減な文字列を書き込み /var/log/httpd/error_log に何らかのエラーが出力されることで容易に確認できる。
Apple公式iPhoneXマスク画像を使う非公式な方法

iPhoneXでスクリーンショットを撮ると、画面下のホームインジケーターは写りますが、画面四隅の丸角とセンサーハウジングは写りません。後者が画面に入っているのといないのとでは想像以上に印象が違って見えるので、iPhoneX対応する場合は解像度だけ合わせて検証してもあまり意味がないです。

…そういえば、iPhoneXのシミュレータには丸角とセンサーハウジングがちゃんと入ってるな…ということで、探してみたら、ありました！！

![iPhoneX_Frame.png](https://qiita-image-store.s3.amazonaws.com/0/141731/55a1a3e1-b815-9e64-da87-6f847292e113.png)

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/DeviceTypes/iPhone X.simdevicetype/Contents/Resources/framebuffer.pdf

※要Xcode9以上。
※パッケージの中のさらに中の中の…にあるので、Finderからは「パッケージの内容を表示」を何度か行う必要があります。

PNGではなくPDFというのがNeXTSTEPの血を受け継ぐmacOSらしいところではありますが、お好きなツールで透過PNG化して、ホームインジケーター入りのスクショと合成するなりして、デバッグプロジェクトに組み込んで検証して頂ければと思います。

ただ、シミュレータにはある「ベゼル(物理枠)」の位置は分からず。ないはずがないので、見つけた方はご連絡くださいませ。
HTML5の書き方_1(基礎)

# 絶対必要なもの
1.DOCTYPE宣言
　HTMLには複数種類がありどの仕様で書くかを宣言する
　●記述方法

```html:index.html
<!DOCTYPE html>
```

　●理由
　記述しないと表示モードによってはレイアウトがおかしくなる

2.charset 属性
　どの文字コードを使用するか宣言する
　●記述方法

```html:index.html
　　\<meta charset="UTF-8">
```

　●理由
　記述しないとスクリプト等が上手く動かない可能性がある

3.reset.css
　各ブラウザのデフォルトCSSをリセットする
　●記述方法(これをresst.cssで保存する)

```css:resst.css
    /*
　　YUI 3.18.1 (build f7e7bcb)
　　Copyright 2014 Yahoo! Inc. All rights reserved.
　　Licensed under the BSD License.
　　http://yuilibrary.com/license/
　　*/
html{color:#000;background:#FFF}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0}table{border-collapse:collapse;border-spacing:0}fieldset,img{border:0}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal}ol,ul{list-style:none}caption,th{text-align:left}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}q:before,q:after{content:''}abbr,acronym{border:0;font-variant:normal}sup{vertical-align:text-top}sub{vertical-align:text-bottom}input,textarea,select{font-family:inherit;font-size:inherit;font-weight:inherit;*font-size:100%}legend{color:#000}#yui3-css-stamp.cssreset{display:none}
```

　●理由
　各ブラウザのデフォルトCSSが違うため(リセットして書いたほうが書きやすい)

## あったほうがいいもの
1.lang 属性
　ブラウザの設定によっては上手くフォントが表示されないらしい
　●記述方法(日本語を指定しています)

```html:index.html
　　<html lang="ja">
```
　●理由
　なくても問題ないらしいけど書いておいたほうが無難

### 感想
初投稿
慣れてないとわかりずらいな

[次へ](https://qiita.com/2_MaYu_2/items/b8b4e7fdc03361adec4d)
EXCELでpostgresを接続サンプル


ODBC設定
追加ボタンを押す
![image](https://qiita-image-store.s3.amazonaws.com/0/197416/d3c796f6-2812-e389-1cfc-b63996708004.png)

postgresql Unicode選択

![image](https://qiita-image-store.s3.amazonaws.com/0/197416/58ed60ef-81bb-4990-d600-a83289f4e1a7.png)

入力して、保存
![image](https://qiita-image-store.s3.amazonaws.com/0/197416/c39a80fe-9346-03b4-c715-c555d9d5b85e.png)
※postgresql Unicodeがない場合、
http://www.cyber-funnel.com/postgres/index1156.html
上記URLを参照する

ソース：
Const SV = "127.0.0.1"
Const DB = "postgres"
Const PW = "postgres"
Dim CNN As Object
Dim RS As Variant
Set CNN = CreateObject("ADODB.Connection")
CNN.Open "Provider=MSDASQL;Driver=PostgreSQL Unicode;UID=postgres;Port=5432" & ";Server=" & SV & ";Database=" & DB & ";PWD=" & PW
'データ取得
Set RS = CNN.Execute("SELECT * from operation_log")
Dim CN As ADODB.Connection
Dim SQL As String
'接続
'レコードセットを取得
Set RS = New ADODB.Recordset
SQL = "SELECT * from operation_log"
RS.Open SQL, CNN, adOpenKeyset, adLockOptimistic, adCmdText

’テーブルのヘッダーとデータを出力する。
With Worksheets("Sheet1")
        .Cells.Clear
            RS.MoveFirst
        i = 1
        .Cells.Clear
        Do Until RS.EOF
            For j = 0 To RS.Fields.Count - 1
                If i = 1 Then .Cells(i, j + 1) = RS(j).Name
                If j <> 8 Then
                .Cells(i + 1, j + 1) = RS(j).Value
                End If
            Next j
            RS.MoveNext
            i = i + 1
        Loop
        .Columns("A:H").AutoFit
    End With
RS.Close
    ' レコードセット、データベースを閉じる
CNN.Close
Set CNN = Nothing
End Sub
Locale 設定警告の回避

### 問題
  VMのUbuntu16.04でPSQLでデータベースのデータをいじりしたいのですが、コマンドを起動する時にいきなり警告が出でいます。

```
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
	LANGUAGE = (unset),
	LC_ALL = (unset),
	LC_PAPER = "ja_JP.UTF-8",
	LC_ADDRESS = "ja_JP.UTF-8",
	LC_MONETARY = "ja_JP.UTF-8",
	LC_NUMERIC = "ja_JP.UTF-8",
	LC_TELEPHONE = "ja_JP.UTF-8",
	LC_IDENTIFICATION = "ja_JP.UTF-8",
	LC_MEASUREMENT = "ja_JP.UTF-8",
	LC_CTYPE = "UTF-8",
	LC_TIME = "ja_JP.UTF-8",
	LC_NAME = "ja_JP.UTF-8",
	LANG = "en_US.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to a fallback locale ("en_US.UTF-8").
```

### 原因

```
locale -a
locale: Cannot set LC_CTYPE to default locale: No such file or directory
C
C.UTF-8
en_AG
en_AG.utf8
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IN
en_IN.utf8
en_NG
en_NG.utf8
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US.utf8
en_ZA.utf8
en_ZM
en_ZM.utf8
en_ZW.utf8
ja_JP.utf8
POSIX

```
うん、JPは一応入っている。SSHのせいか

HostのMacで環境をチェックする

```
cat /etc/ssh/ssh_config
...
Host *
	SendEnv LANG LC_*
```
やはりそうですねよ。

### 解決

VMのenvironmentファイルを作成する。

```
sudo vi /etc/environment
```
に

```
LANG=en_US.utf-8
LC_ALL=en_US.utf-8

```

それでOK
windows 10 でタスクバーにフォルダを登録する方法





以下を開く

     %HOMEPATH%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

何もないところを右クリック x s でショートカット作成

explorer と打ってから、フォルダパスをコピペ

       explorer C:\shed

名前を適当に打つ
できたショートカットをタスクバーにドラッグ


ついでに `win+q` > `shed` でも 開けるようになるはず
【PHP】定義値（不正な値）のバリデーションの実装方法


# 定義値（不正な値）のバリデーション

↓こんなかんじの投票型のフォームがあるとする。（好きな動物は何ですかみたいな）
![form.png](https://qiita-image-store.s3.amazonaws.com/0/85815/5e91611c-73b4-d41a-4123-6c83cd7b5628.png)

もし、ツールとかで**input=value**を想定してない値（例えば**value="lion"**とか）に書き換えられた際に不正値として検知する必要がある。
フレームワーク使ってたら簡単なんでしょうけど自前で実装するときどう書けばいいかなって思って書いてみた。

# 実装例

```form.html
<!DOCTYPE html>
<html>
	<head>
		<title>Animals</title>
		<meta charset="UTF-8">
	</head>
	<body>
        <form method="post" action="/****.php">
		<h1>フォーム</h1>
		<button type="submit" name="animal" id="btn_dog" value="dog">いぬ</button>
		<button type="submit" name="animal" id="btn_cat" value="cat">ねこ</button>
		<button type="submit" name="animal" id="btn_other" value="other">その他</button>
		</form>
	</body>
</html>
```


```Validation.php
/**
 * animal項目の定義値
 *
 * @var array
 */
private $fillableValuesOfAnimals = [
    'いぬ'   => 'dog',
    'ねこ'   => 'cat',
    'その他' => 'other',
];


/**
 * animal項目のvalueに対する選択項目の定義値があれば定義名を返す
 *
 * @param string $animal
 * @return string|false
 */
public function retrieveAnimalsByValue(string $animal)
{
    return array_search($animal, $this->fillableValuesOfAnimals);
}
```


例えばですけど、
**``retrieveAnimalsByValue($post->animal)``**
こんな感じでvalueを投げて、もしvalueが定義してある値なら**``$fillableValuesOfAnimals``**の**key**が返ってきて、
定義されていない値（不正な値）なら**false**が返ってきます。
これでfalseじゃなければ正常値として判定する、って処理を書けば簡易ではあるが不正な値の検知が可能になる。

・・・

もっといい方法あると思うんだけどいかんせん思いつかないんす。うーむ
Mac OS で ImageMagick + im4java を動かすための準備


・Mac OS 10.13 High Sierra では X11 が標準で入っていないので個別インストール
参考：http://macperson.net/mac-x11-xquartz/

・ImageMagick ＋ im4javaライブラリで必要なコマンドを実行するためのライブラリを事前にインストール

brew uninstall jpeg
brew install jpeg
brew install libjpeg
brew install jpeg-turbo
brew uninstall jpegoptim
brew install jpegoptim

・ImageMagick は brew ではなくパッケージでインストール
/usr/local/Cellar/imagemagick/ 配下にバージョンフォルダがあったら brew で入れたものがあるのでアンインストール

brew uninstall imagemagick

・パッケージで ImageMagick をインストール
参考：http://cactuslab.com/imagemagick/
パッケージでインストールすると /opt/ImageMagick にインストールされる

・/usr/local/bin 配下に /opt/ImageMagick/bin の実行コマンドのシンボリックリンクを作る

cd /usr/local/bin/

ln -s /opt/ImageMagick/bin/animate animate
ln -s /opt/ImageMagick/bin/compare compare
ln -s /opt/ImageMagick/bin/composite composite
ln -s /opt/ImageMagick/bin/conjure conjure
ln -s /opt/ImageMagick/bin/convert convert
ln -s /opt/ImageMagick/bin/display display
ln -s /opt/ImageMagick/bin/identify identify
ln -s /opt/ImageMagick/bin/import import
ln -s /opt/ImageMagick/bin/mogrify mogrify
ln -s /opt/ImageMagick/bin/montage montage
ln -s /opt/ImageMagick/bin/stream stream

これで im4java へ /usr/local/bin を渡して実行すると変換メソッドが Mac でも動くようになる

参考：https://qiita.com/yaoki_dokidoki/items/2ec0540b67dcb4abd5cb
Visual Studio 2017 Visual C# による ActiveX コントロールの使い方

#はじめに
ActiveX コントロールは .NET Framework でも簡単に利用できます。ここでは Windows Forms デスクトップアプリケーションで自作 ActiveX コントロールを使う方法を紹介します。

ActiveX コントロールは自作しなくてもたくさんのものが知らないうちに市販アプリケーションなどといっしょにインストールされています。ただし、こういうものはプロテクトがかかっていたり、使い方がわからなかったりして、実際には利用できない場合が多いです。

#ActiveX コントロールの Visual Studio 2017 への登録
ActiveX コントロールは Visual Studio 2017 に登録しないと使えません。そして、デフォルトでは何も登録されていないので独自に登録する必要があります。

まず、Windows Forms デスクトップアプリケーションのプロジェクトを作成します。

- フォームデザイン画面で左側のツールボックスペインで右クリックしてコンテキストメニューを開きます。
- 「タブの追加」メニューをクリックして新しいタブをツールボックスに追加します。タブの名称は任意ですが、ここでは-
 「ActiveX コントロール」とします。
- 「ActiveX コントロール」タブで右クリックしてコンテキストメニューを開き、「アイテムの選択」メニューを実行します。
- ダイアログが開いたら「COM コンポーネント」タブを選択して、一覧から目的の ActiveX コントロールを探して OK ボタンをクリックします。
- ツールボックスの「ActiveX コントロール」タブに、その ActiveX コントロール が追加されます。

![ToolBoxAxControl.png](https://qiita-image-store.s3.amazonaws.com/0/62802/aa2aa7c2-3c76-8a01-3b19-880b4321a262.png)

Fig.1 ツールボックスの 「ActiveX コントロール」タブの表示例

#ActiveX コントロールの利用
ツールボックスに登録すれば、あとは他のコントロールと使い方はいっしょです。フォームに貼り付けてプロパティを設定して、必要なら ActiveX コントロールのメソッドを使用したり、イベントハンドラを実装したりして利用します。

Fig.1 でツールボックスに登録した ActiveX コントロールは [Visual Studio 2017 Visual C++ による MFC ActiveX コントロールの開発](https://qiita.com/tadnakam/items/65631b41d94739728d96) で作成したものです。Visual Studio のフォームデザイン画面に貼り付けると Fig.2 のような感じです。

![DesignForm_AxControl.png](https://qiita-image-store.s3.amazonaws.com/0/62802/3b5e562d-323a-f5a1-9afb-8bd5e8099ede.png)

Fig.2 ActiveX コントロールを貼り付けたデザイン画面

このプログラムを実行したときの表示例が Fig.3 です。

![Form_AxControl.png](https://qiita-image-store.s3.amazonaws.com/0/62802/bdd9414a-ef19-0c4f-c31a-f9b41c5412ec.png)

Fig.3 ActiveX コントロールを貼り付けたプログラムの実行画面

このプログラムのコードは次のようになります。axMFCAxCtrl21 と axMFCAxCtrl31 は ActiveX コントロールの変数名で、プロパティエディタの Name プロパティの値です。

```C#
using System;
using System.Windows.Forms;

namespace TestMFCAxCtrlCs
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// フォームがロードしたとき
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_Load(object sender, EventArgs e)
        {
            axMFCAxCtrl21.Caption = "MFCAxCtrl2 ActiveX コントロール";
        }

        /// <summary>
        /// ボタンがクリックされたとき
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            axMFCAxCtrl31.FillInterior();
        }
    }
}
```

-
frozen-string-literal に対応するときは << を += に変更するより元を配列として扱った方が良さそうです

# 配列に文字列を追加していってjoinするのは遅い？

`String#<<` メソッドで文字列に文字列を追加していくと破壊的になるので frozen-string-literal を有効にしたときエラーになります。そこで `<<` を `+=` に置き換えて新しい文字列を作り直すようにしたりしていましたが、変更箇所が多いとやや面倒なので元の変数を配列にして最後に join する方法で対処することもありました。これならたった二箇所の変更で済みます。ただこの配列にする方法は簡単な反面、なんとなく富豪的で遅くなっているような気がしていたので、ちゃんと速度を比較してみました。

# 結果

```ruby
RUBY_VERSION # => "2.5.0"
require "active_support/core_ext/benchmark"
def _; "%7.2f ms" % Benchmark.ms { 1000.times { yield } } end
_ { s = ""; 1000.times { s << rand.to_s }; s      } # => "1052.91 ms"
_ { s = []; 1000.times { s << rand.to_s }; s.join } # => "1012.97 ms"
_ { s = ""; 1000.times { s += rand.to_s }; s      } # => "3393.16 ms"
```

これでわかったのは遅くなってないということです。配列にしてjoinしても破壊的に追加する方法より遅くなってない、むしろちょっと速かったのは意外でした。一方で3番目の新しい文字列を作り直す方法はインスタンスを生成しまくっているせいか差がでてきてます。

# まとめ

バッファ的な文字列変数に断片をどんどん追加していくような処理を frozen-string-literal 対応させるときに、**速度が重要なとき**は `<<` を `+=` に置き換えるのではなく元の変数を配列にするのも一考です。
UnityADSで他のUDNアカウントのIDで広告表示をする方法

<h2>UnityADSで他のUDNアカウントのIDで広告表示をする方法</h2>
エディターのServiceウインドウからADSを使用する際にアカウントにログインが求められます。
ですが、まれにこのアカウントとは別のアカウントで管理されているADSのIDを使用したい場合があります。
Unity5.3.5の頃は、エディターのServicesでGameIDを指定することが出来ました。

<a href="http://alice3.net/wp-content/uploads/2018/02/ads1.png"><img class="alignnone size-full wp-image-4012" src="http://alice3.net/wp-content/uploads/2018/02/ads1.png" alt="" width="624" height="608" /></a>

UnityADSのアカウントがUDNアカウントに統一された影響でしょうか。Unity5.6.3ではServiceウインドウではIDの設定がありません。

<a href="http://alice3.net/wp-content/uploads/2018/02/ads563p4.png"><img class="alignnone size-full wp-image-4013" src="http://alice3.net/wp-content/uploads/2018/02/ads563p4.png" alt="" width="515" height="541" /></a>

Start関数などの中でInitializeを実行し、IDを指定できるのですが
ServiceウインドウでログインしたUDNアカウントが有効になり、そのUDNアカウントにてADSのインプレッションが計測されてしまいました。

```
void Start()
  if (Advertisement.isSupported) {
  Advertisement.Initialize("ここにIDを指定");
}
```
<h3>エディタ上で指定したアカウントと別のアカウントのIDを使用する方法</h3>
<a href="https://github.com/unity3d-jp/unityads-help-jp/wiki/Integration-Guide-for-Unity#%E3%82%B2%E3%83%BC%E3%83%A0%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E6%99%82%E3%81%AE%E3%82%AA%E3%83%BC%E3%83%88%E3%82%A4%E3%83%8B%E3%82%B7%E3%83%A3%E3%83%A9%E3%82%A4%E3%82%BA%E3%82%92%E7%84%A1%E5%8A%B9%E5%8C%96%E3%81%97%E3%81%9F%E3%81%84">ゲームスタート時のオートイニシャライズを無効化したい</a>

github上のインテグレーションガイドに記載がありました。エディタースクリプトを使用して無効化する必要があります。

```
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.Advertisements;

public class UnityAdsBuildProcessor : Editor
{
  [PostProcessScene]
  public static void OnPostprocessScene ()
  {
    AdvertisementSettings.enabled = true;
    AdvertisementSettings.initializeOnStartup = false;
  }
}
```

ポイントは「initializeOnStartup =false」です。これにより、エディタ上で指定したアカウントでのオートイニシャライズが無効になります。手動でIDを指定する必要がありますので、どこかのStartやAwakeなどで「Advertisement.Initialize("ここにIDを指定")」を行えば今度こそそのIDが有効になります。

上記のスクリプトと組み合わせて下記の手動イニシャライズを使用することでIDが有効になります。

```
void Start()
  if (Advertisement.isSupported) {
  Advertisement.Initialize("ここにIDを指定");
}
```
/etc/fstabとは　(自分メモ)

### /etc/fstab

/etc/fstabとは
〇自動マウント
〇OS起動時に反映される。
〇fstab 再起動コマンドもある

### /etc/fstab中身　例
bitnami@ubuntu:~/test$ cat /etc/fstab
\# /etc/fstab: static file system information.
\# <file system>                                 <mount point>   <type>  <options>       <dump>  <pass>
proc                                            /proc           proc    defaults        0       0
/dev/sda1                                       /               ext4    defaults        0       0
//192.168.0.1/XXXXXXXXX  /home/XXXXXXXXXXXXXXXXXXXXXXX  cifs    username=root,password=password    0       0
//192.168.0.1/OOOOOOOOO    /home/OOOOOOOOOOOOOOOOOOOOOOO  cifs    username=root,password=password    0       0

### アンマウント　umount
設定したマウントを外す場合
sudo umount /home/bitnami/test

### mount反映
mount -a

### 同じmount先が二つある場合以下のエラーが出る
bitnami@ubuntu:~/test$ umount //192.168.0.1/XXXXXXXXX/files
umount: cannot unmount //192.168.0.1/XXXXXXXXX/files -- //192.168.0.2/XXXXXXXXX/files is mounted over it on the same point

その場合、まずは新しいほうから削除する
sudo umount //192.168.0.2/XXXXXXXXX/files
削除後、古いものを削除する
sudo umount //192.168.0.1/XXXXXXXXX/files

### コマンド実行する場合
mount -t cifs -o username=#{administrator},password=#{password} //192.168.0.1/files /home/file
C#自アセンブリ(.exe)の親ディレクト下にディレクトリを作る方法。

以下はアセンブリファイルのあるディレクトリの親ディｋレクト下に,"Log"ディレクトを作成します。

```
DirectoryInfo dirInfo = Directory.GetParent(Assembly.GetEntryAssembly().Location);
DirectotyInfo dirBase = Directoty.GetParent(dirInfo.FullName);
DirectoryInfo dirTarget = dirBase.CreateSubdirectory("Log");
string fileName = string.Format("Data{0}.Log", DateTime.Now.ToString("yyyyMMddTHHmmss"));
string fullPath = Path.Combine(dirTarget.FullName, fileName); 
```

``` Utility.cs
using System;
using System.IO;
using System.Reflection;

namespace EUtility
{
    public class Utility
    {
        /// <summary>
        /// アセンブリ(.exe)のある親ディレクト下に指定した名前のディレクトを作成してそのパスを返します。
        /// たとえば bin\foo.exeから呼び出すとbinと兄弟レベルのディレクトを作成します。
        /// </summary>
        /// <param name="subDirName">サブディレクト</param>
        /// <returns></returns>
        public static string GetAssemblyParentSubPath(string subDirName)
        {
            if (subDirName == null)
                throw new ArgumentNullException("subDirName");

            DirectoryInfo dirInfo = Directory.GetParent(Assembly.GetEntryAssembly().Location);
            DirectoryInfo dirBase = dirInfo.Parent;
            string target = Path.Combine(dirBase.FullName, subDirName);

            if ( ! Directory.Exists(target))
            {
                Directory.CreateDirectory(target);
            }
            return target;
        }
        /// <summary>
        /// アセンブリ(.exe)のある親ディレクト下に指定した名前のディレクトを作成し,
        /// filenameを付加してfullpathを返します。
        /// </summary>
        /// <param name="subDirName">サブディレクト名</param>
        /// <param name="filename">ファイル名</param>
        /// <returns></returns>

        public static string GetAssemblyParentSubFile(string subDirName, string filename)
        {
            if (subDirName == null)
                throw new ArgumentNullException("subDirName");

            if (filename == null)
                throw new ArgumentNullException("filename");

            return Path.Combine(GetAssemblyParentSubPath(subDirName), filename);
        }
    }
}



```
SSHでeogのストライキにあったとき

sshでの作業中、ふと画像を確認したくなったときストライキは始まったのである…

>eog nyaaan.png

これ入力するじゃないですかーーー！！！

>Failed to connect to Mir: Failed to connect to server socket: そのようなファイルやディレクトリはありません
Unable to init server: Could not connect: 接続を拒否されました

ほぁあああ！？！？！？
何！？！？
どうしたの？？？？？
という悲しみの中、色々調べていたら、sshのXアプリなるものが起動出来てませんでした。。。

ssh接続後にも起動できるらしいのですが、私はうまくいかなかった(ぽんこちゅ)なので
一旦、接続を切ってXアプリを起動させながら接続し直します

やり方は簡単

>ssh -Y ユーザー名@host

これだけ「-Y」をオプション？として入れるだけです:relaxed:
TreasureDataで前月とか前々月とか指定したい

# 追記 ※以下のやり方はtime indexが使えないので結果的に無意味でした＼(^o^)／
詳しいことは中の人のコメント参照で

## TD_TIME_ADDはmonthで指定できない
http://docs.treasuredata.com/articles/udfs#tdtimeadd
どうやら月は28日だったり31日だったりと固定じゃないためできないらしい。
この問題は結構前から言われてますが、特にその後変化があるわけでもないようです。

## 代替案
TDがダメならHiveの関数を使えばいいじゃない、ということで
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF
`add_months()`を使ってみる

うーん、パフォーマンスは上がりませんが、現状取り得る手法としては悪くないと思います。

```sql
SELECT
add_months(from_unixtime(time), -3) --前前前月
```

使うとしたらこんな感じでしょうか？

```sql
WHERE
TD_TIME_RANGE(time,add_months('2018-02-01', -3),NULL,'JST')
```
CognosでCQMからDQMに変更した際、複数選択ができなくなった場合の対処法

## はじめに
CQMで作成したレポートをDQMに移行した場合に発生する事象の一つとして、複数選択を設定していたプロンプトが単数選択しかできなくなってしまうというものがあります。

基本的には複数選択を設定したプロンプトが持つパラメータを使用したフィルター式の記述方法によるものがですが、いくつかの原因と対処法がありますのでご紹介します。


## 1. 式条件
元のフィルター式が下記の場合
>[データアイテム1] = ?パラメーター1?

"="を使用している場合は、"in"に修正します。
>【修正案】
[データーアイテム1] in (?パラメーター1?)

パラメータ1が日付の範囲指定をするような場合は、"in_range"に修正します。
>【修正案】
[データーアイテム1] in_range ?パラメーター1?

## 2. 左辺配置
元のフィルター式が下記の場合
>?パラメーター1? in ('AAA','BBB','CCC')

上記のフィルター式のみで定義されるよりも、下記のように条件式を組み合わせて、パラメーター1に入ってくる値によって絞込みを行う対象を変化させるような使用方法のほうがイメージが合うかもしれません。

>((?パラメーター1? in ('AAA','BBB','CCC')) AND ([データアイテム1] = '新規'))
OR
((?パラメーター1? in ('DDD','EEE')) AND ([データアイテム1] = '継続'))

フィルター式の左辺側にパラメーター名が記述された式を定義するとレポート実行時に単数のものと評価され、プロンプトは単数選択しかできなくなってしまいます。
この場合は、式の右辺側にパラメーターを持ってきます。
>【修正案】
(('AAA' in (?パラメータ1?)) OR
('BBB' in (?パラメータ1?)) OR
('CCC' in (?パラメータ1?))) AND ([データアイテム1] = '新規'))
OR
(('DDD' in (?パラメータ1?)) OR
('EEE' in (?パラメータ1?))) AND  ([データアイテム1] = '継続'))

少し強引で、項目数が非常に多くなると採用するのに厳しい案ですが、これでプロンプトとしては複数選択が可能になります。


## 3. is Null、is not null 判定
一番厄介なのが\#2の発展で、パラメータに値が入っているかどうかを判定するフィルター式の場合です。

>?パラメーター1 is not Null
AND
[データアイテム1] = '継続'

DQMでは、この "is not Null" や、"is Null" と言った表現もレポート実行の際にパラメーターを単数のものとして評価してしまうみたいです。
単純に `Null in (?パラメーター1?)` のように前述の修正方法を適用させることはできないので、工夫が必要になります。

この記述をしている際の修正方法としては下記のようになります。

>【修正案】
([データアイテム1] = '継続')
OR
(('' in (?パラメーター1?)) AND ([データアイテム1] <> '継続'))


ここでのポイントは、3行目の記述となります。
### パラメーターが入っていない（プロンプトで選択されていない）場合
1行目で結果セットのうち、[データアイテム1]が"継続"の一部分をとってきます。
3行目では、パラメーター1がオプションで選択なしなので、結果セットの全件を取得し、そのうち「データアイテム1]が"継続"ではない一部分を取得します。
式全体としては、1行目 OR 3行目 の結果となるので、結果として全件の取得が可能です。

### パラメーターが入っている（プロンプトで選択されている）場合
こちらの1行目は先ほどと同じく、結果セットのうち、[データアイテム1]が"継続"の一部分をとってきます。
3行目では、パラメーター1に値が入ってくるので、前半部分で取得できる項目がなく、結果3行目としては取得0件になります。あえて、取得結果が0件になるように工夫してあげます。
そうすることでフィルター式の結果としては、1行目で絞り込まれた結果のみを取得することが可能となります。

これで、パラメーター1に値が入っている（is not Null）か入っていないか（is Null）で絞込みを実施するかを制御することが可能となります。


※ここでのフィルター式はすべて"オプション"の設定がされている前提となります。


##最後に

実際には、単一のクエリーで完結せずクエリー間のコンポーネント参照を実施している場合は必ずしもこの限りではなかったり、場合によっては交差結合を許可し対応する必要がある場合もあります。
ただ、その場合はレポート実行のパフォーマンスに与える影響をよく見極めて修正する必要があります。

CQMからDQMへの変更ではこういったレポート定義の修正も発生する可能性があることを事前に把握しておくが重要ですね。



========================================================
(参考情報)
[CognosでCQMからDQMに切り替えた時、どこを検証すればよいか](https://qiita.com/hayatoshi/items/0e39f4256f93e84a76b8)
AWS(EC2)上にお手軽にHackMDを構築する

#前提

公式（[docker-hackmd - docker hackmd image](https://github.com/hackmdio/docker-hackmd
)）で紹介されているdockerを使ったカジュアルな構築手順となります。

## docker-composeの導入
docker-composeが必要なのでインストール確認。
`docker-compose --version` と打ってみる。

もしインストールされていなければ
http://docs.docker.jp/compose/install.html
を参考にdocker-composeをインストールする

### エラー対処（Amazon Linuxの場合）
`ERROR: Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running?
If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.`
というエラーで怒られたので

https://qiita.com/DQNEO/items/da5df074c48b012152ee
を参考に、今操作しているユーザをdockerユーザグループに追加
RailsにCapybara + Seleniumを導入してChrome Headlessモードで実行する手順

Rails + Capybara + Selenium でフロントエンド側のテストを`Chrome Headlessモード`で実行する手順を残しておきます。

## 手順
- `Gemfile`に以下を追加

```rb
gem 'capybara'
gem 'selenium-webdriver'
gem 'chromedriver-helper'
```
- `bundle install`実行
- `spec_helper`に以下を追加

```rb
require 'selenium-webdriver'
require 'capybara/rspec'

# Capybara自体の設定、ここではどのドライバーを使うかを設定しています
Capybara.configure do |capybara_config|
  capybara_config.default_driver = :selenium_chrome
  capybara_config.default_max_wait_time = 10 # 一つのテストに10秒以上かかったらタイムアウトするように設定しています
end
# Capybaraに設定したドライバーの設定をします
Capybara.register_driver :selenium_chrome do |app|
  options = Selenium::WebDriver::Chrome::Options.new
  options.add_argument('headless') # ヘッドレスモードをonにするオプション
  options.add_argument('--disable-gpu') # 暫定的に必要なフラグとのこと
  Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)
end

Capybara.javascript_driver = :selenium_chrome
```
- これでheadlessモードで実行できます
- ※Chrome 59以上でないとheadlessモードは実行できません。。。

## chromedriverの更新方法
- 下記ファイルを削除します　
  - `.chromedriver-helper`
- その後`run chromedriver-update`実行で更新できます。
- ※ Gemfile で`chromedriver-helper` を入れている場合は
    - `bundle exec chromedriver-update`


## 追記
 - 2月9日
    - コードに簡単なコメントを追加しました

## 参照
https://github.com/teamcapybara/capybara#selenium
https://github.com/SeleniumHQ/selenium/wiki/Ruby-Bindings
https://developers.google.com/web/updates/2017/04/headless-chrome?hl=ja