OmniAICreator/Qiita-1.07M huggingface dataset:
Firebaseのデータベースから値を取得する



# Firebaseとは

Mobile Backend as a Service（MBaas）と呼ばれるクラウドサービスです。

Firebaseは2011年にアメリカで始まったMBaasですが，2014年Googleに買収されたことで一気に知名度が上がりました。

[Firebase](https://firebase.google.com/?hl=ja)

無料プランもあるので、個人開発者は始めやすいと思います。

# リアルタイムデータベースとは

簡単に説明すると、誰かがデータを更新すると自動で他の端末にも反映される。
更にオフライン動作も可能です。

リアルタイムデータベースはモバイルで使用すると、価値を感じやすいが、
今回はWebからアクセスする方法を理解します。

[Firebase Realtime Database | データをリアルタイムで保存して同期  |  Firebase](https://firebase.google.com/products/database/?hl=ja)

# Firebaseの設定

まずはテスト用に単純なデータを作成します。

<img src="https://qiita-image-store.s3.amazonaws.com/0/67320/9c498709-cdb0-6db2-b554-bf3533446ec9.png" width=50%>

ダッシュボードページで、「ウェブアプリにFirebaseを追加」をクリック

<img src="https://qiita-image-store.s3.amazonaws.com/0/67320/08dba9b7-9808-79d3-ab6b-8159221f4904.png" width=70%>

表示されるHTMLスニペットを使用するWebページに貼ります。
Firebaseにアクセスするため手続きです。

```html
<script src="https://www.gstatic.com/firebasejs/4.1.3/firebase.js"></script>
<script>
  // Initialize Firebase
  var config = {
    apiKey: "AIza....",
    authDomain: "YOUR_APP.firebaseapp.com",
    databaseURL: "https://YOUR_APP.firebaseio.com",
    projectId: "YOUR_APP",
    storageBucket: "YOUR_APP.appspot.com",
    messagingSenderId: "123456789" 
  };
  firebase.initializeApp(config);
</script>
```

## データを取り出す

```html
<p><div id="age"></div></p>
<p><div id="job"></div></p>
<p><div id="name"></div></p>
<script>
  var database = firebase.database();
  var dataRef = database.ref('/data');
  dataRef.once("value")
  .then(function(snapshot) {
    document.getElementById("age").innerHTML = snapshot.child("age").val();
    document.getElementById("job").innerHTML = snapshot.child("job").val();
    document.getElementById("name").innerHTML = snapshot.child("name").val();
  });
</script>
```

データが取り出せない場合はルールを変更して、誰でもアクセスできるようにしてみてください。実際に公開する場合は設定を変更してください。

<img src="https://qiita-image-store.s3.amazonaws.com/0/67320/c65581c6-fe7a-3e78-23ff-35f7f0d11cc4.png" width=50%>


詳細なデータアクセス方法は以下のリンクを参照してください。

[Namespace: database  |  Firebase](https://firebase.google.com/docs/reference/js/firebase.database)

# 参照

[第1回　一歩進んだMBaas，Firebaseとは？：スマホアプリ開発を加速する，Firebaseを使ってみよう｜gihyo.jp … 技術評論社](http://gihyo.jp/dev/serial/01/firebase/0001)
piculetコマンド

piculetのコマンドまとめ

## vpc単位でエクスポート 
```
piculet -e --ec2s vpc-12345678 -o ファイル名
```

## Dryrun
```
piculet -a --dry-run -r ap-northeast-1 -f ファイル名 --ec2s vpc-12345678
```

## 実行
```
piculet -a -r ap-northeast-1 -f ファイル名 --ec2s vpc-12345678
```
Raspberry PIでBME280をちょっと簡単に使う

# 概要
これまで[Raspberry PI](https://www.raspberrypi.org/)で[BME280](https://www.bosch-sensortec.com/bst/products/all_products/bme280)を使う方法の1つとして，[スイッチサイエンス社](https://www.switch-science.com/)が公開している[Pythonスクリプト](https://github.com/SWITCHSCIENCE/samplecodes/tree/master/BME280)が広く知られています．

その一方で，LinuxのIndustrial I/O Subsystem(以後Linux IIO)に準拠したドライバがBME280をサポートするようになりました．カーネルの標準機能として組み込まれており，Pythonが不要なこともあり使い方が簡単で応用もききます．

しかしLinux IIO経由でBME280を使える状態にするまでの，特に日本語の情報が今ひとつ不足しているようなのでここにまとめます．Linux IIOそのものについての情報は割愛します．

# 手順
BME280をi2cバスに接続している場合の手順について説明します．`/boot/config.txt`の末尾に以下の記述を追加して，リブートします．

    dtoverlay=i2c-sensor,bme280
起動したら`/sys/bus/iio/devices/iio:device0/name`を`cat`してみてください．

    pi@raspberrypi:~ $ cat /sys/bus/iio/devices/iio\:device0/name
    bme280
と出てきたら無事にBME280がカーネルに認識されました．

ここまでくればあとは簡単で，同様に`/sys/bus/iio/devices/iio:device0/in_temp_input`などを`cat`してみてください．

    pi@raspberrypi:~ $ cat /sys/bus/iio/devices/iio\:device0/in_temp_input
    31490
これが温度で実際は31.49度です．小数点が無く1,000倍の値が得られます．同ディレクトリにある他ファイルを参照することで湿度，気圧も得られます．まとめると以下のようになります．

|測定項目|ファイル名|備考|
|:---:|:---|:---|
|温度|`in_temp_input`|1,000倍の値が得られる|
|湿度|`in_humidityrelative_input`|1,000倍の値が得られる|
|気圧|`in_pressure_input`|単位はkPa(hPaにするには10倍する)|
他にもファイルがいくつかありますが，詳しく調べていません．

# 注意点
Linux IIOのBME280ドライバを有効にすると，i2cバスを握りっぱなしになるようです．有効にした状態でPythonスクリプトを走らせると，以下のようになります．

    pi@raspberrypi:~ $ python ./bme280_sample.py
    Traceback (most recent call last):
      File "./bme280_sample.py", line 139, in <module>
        setup()
      File "./bme280_sample.py", line 134, in setup
        writeReg(0xF2,ctrl_hum_reg)
      File "./bme280_sample.py", line 20, in writeReg
        bus.write_byte_data(i2c_address,reg_address,data)
    IOError: [Errno 16] Device or resource busy
同バスにBME280以外の他のデバイスも接続している場合は，Linux IIOを有効にしつつ同時利用することは難しいかもしれません．SPIバスのドライバもあるので，BME280をSPIバス接続に変えることを検討してみてください．

ただしこの場合は`/boot/config.txt`の記述も変えなければいけないはずで，これについては調べていません．

# 参考文献

* [Bosch BMP280 pressure sensor](https://www.raspberrypi.org/forums/viewtopic.php?t=167207&p=1077661)
* [Introducing the Industrial IIO subsystem](http://events.linuxfoundation.org/sites/events/files/slides/lceu15_baluta.pdf)
ComputeShaderで乱数の偏りを調べてみた

# 経緯
よく使うお手軽GPU乱数実装でパーティクルの位置を計算したら結構偏ってたので、以前から気になってたXorwowと比べてみた

## お手軽乱数実装
```glsl
float randSimple(float2 v)
{
    return frac(sin(dot(v.xy, float2(12.9898, 78.233))) * 43758.5453);
}
```
http://qiita.com/shimacpyon/items/d15dee44a0b8b3883f76

普段は引数に時間などの値を混ぜて使っていたので問題なかったが
今回は同じシードから同じ状態になる再現性が欲しかったので出力を入力にフィードバックするような使い方をしてたところ
かなり偏るように見えた



# 環境
windows10
unity5.6.1f1


# 比較

[![](http://img.youtube.com/vi/-rW1eDF6ztQ/0.jpg)](http://www.youtube.com/watch?v=-rW1eDF6ztQ)

上がお手軽乱数で、下がXorwow
１フレームに１回乱数を計算していて、白いラインがその値、１ピクセルずつ出現数分下に溜まっていくようにしています
思ってたよりもはるかに偏ってた！

# ソース

https://github.com/fuqunaga/GPURandTest

Xorwowはnobnakさんのを使わせてもらいました
https://github.com/nobnak/XorwowUnity
macOS Sierraのchromeで入力言語切り替えで落ちる件

# 問題
何かの拍子で、入力エリアで言語を切り替えるとchromeが即死する。
私の環境ではよくesaで中国語入力に切り替える瞬間に発生する。
一旦発生するとその後chromeを何度再起動しても同じ問題が発生する。

# 原因

macOS SierraのバグでIMのメモリアロケーションがおかしくなるらしいです。[^1]

# 解決

OS再起動？ふざけるな。
殺すべき相手を殺しましょう。
下記のやつを殺せば治ります。
<img width="588" alt="スクリーンショット 2017-07-10 19.47.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/10487/dde9e6ea-a86d-ed66-ca13-659e6cfed6b2.png">


[^1]: https://bugs.chromium.org/p/chromium/issues/detail?id=654695#c45
GVimでNeobundleからpluginがインストールされなかったのでvim.exeからインストールした話

##前提
Windows7 gvim(Kaori-Ya)
##困ったこと
以下ページ見ながらNeobundleを導入した。
[Windowsでgvimを使う(neobundleのインストール)](http://ylgbk.hatenablog.com/entry/2015/01/07/120000)

`gvim.exe` を立ち上げると、「インストールしますか」的なメッセージが出たので「はい」をクリックして、再起動した。
→　再度gvim.exeを立ち上げると、またインストールしますか的メッセージがでてきた。どうにもpluginがインストールされていないっぽい。困った。
##やったこと
bashでvim.exeを起動して、プラグインをインストールし、
再度gvimを起動。
##結果
無事すべてのpluginがインストールできた。よかったよかった。
PowerCMSでAbs2Relを使うときの注意メモ

出力されるファイル内のパスを相対パスに一括置換してくれる便利なプラグインですが、仕様的にハマることもあるので覚書を残しておきます。

## 置換する対象

- href, src, action属性内に記載されている絶対パスまたはルート相対パス
- 絶対パスの場合はウェブサイトURLとドメインが一致している場合のみ置換

つまり
```<p>http://example.com/</p>
<meta property="og:url" content="http://example.com/">```
は置換されず
```<meta rel="canonical" href="http://example.com/">
<link rel="stylesheet" type="text/css" href="/css/style.css">```
は置換されます。

## 置換するタイミング

- すべてのMTタグがパースされたあとで置換される

replaceモディファイア等で文字列の置換を行っても、さらにその後でAbs2Relの置換が行われます。
MTタグで工夫してAbs2Relの置換を回避するのは難しいようです。

## 置換対象から除外したい場合

- 拡張子単位での除外が可能
- ディレクトリ単位での除外が可能
- 除外したいパスが固定値の場合はそのパスだけ除外可能
- 除外したい部分をphpで記述する
- 除外したい部分をssiで読み込む

## index.htmlが補完される問題

同階層のディレクトリを指定するようなパスの場合、index.htmlに置換されて省略することができません。
http\://example.com/privacy.html 内で href="/" というような指定をした場合になります。URLの正規化をしたい時に困ります。
301リダイレクトでOKなら問題なし。

## まとめ

パスの指定が細かい場合やcanonicalの指定が必要ならregex_replaceで必要な部分だけ置換していく方がよさそうです。
Atom 1.18.0で頻繁にフリーズ (editor is not responding) する問題の解決方法

Atomのバージョンを1.18.0にしてから頻繁にフリーズするようになりましたが，[ここ](https://github.com/atom/atom/issues/14971)に載っていた方法で解決できました．

1. PreferencesからPackagesを選択．
2. Install Packagesの中から**github**を探して，Disableを押します．

これでフリーズしなくなりました．
PHP 7.0 で PHPUnit のカバレッジレポート出そうとすると Segmentation Fault

# 概要

Laravelの機能である `Observer` で、そこそこ複雑な処理をさせた状態で `php vendor/bin/phpunit` したら `segmentation fault (core dumped)` で死んだ。

で、PHPのバージョンを上げたら治った。謎。

# 環境

- PHP 7.0.4
- Laravel 5.1

```php
<?php

namespace App\Observers;

use App\Models\User;

class UserObserver
{
    public function created(User $user)
    {
        // そこそこ複雑な処理
        $user->hogehoge = bcrypt('fugafuga');
        $user->save();
    }
}
```

この関数内を処理を全てコメントアウトしたら動いた。

ちなみに `phpunit.xml` はこんな感じ。

```xml:phpunit.xml(一部）
<?xml version="1.0" encoding="UTF-8"?>
    <php>
        <env name="APP_ENV" value="testing"/>
        <env name="CACHE_DRIVER" value="array"/>
        <env name="SESSION_DRIVER" value="array"/>
        <env name="QUEUE_DRIVER" value="sync"/>
        <env name="DB_DRIVER" value="mysql"/>
        <env name="DB_HOST" value="127.0.0.1"/>
        <env name="DB_DATABASE" value="homestead_test"/>
        <env name="APP_HOST" value="http://localhost"/>
    </php>
    <filter>
        <whitelist>
            <directory suffix=".php">./app/Http/Controllers</directory>
            <directory suffix=".php">./app/Models</directory>
            <directory suffix=".php">./app/Services</directory>
            <directory suffix=".php">./app/Http/Middleware</directory>
        </whitelist>
    </filter>
    <logging>
        <log type="coverage-html" target="./storage/coverage" charset="UTF-8"
            yui="true" highlight="true"
            lowUpperBound="50" highLowerBound="80" />
    </logging>
</phpunit>
```

`php 7.1.4` にしたらエラー起こらなくなった。謎。
Rmarkdownをwordに出力する際のTeXコマンドの注意(\rm)

数式中で一部の文字をノンイタリック(ローマン体)にしたい場合がある。

$a_\mathrm{a}$

この時使えるコマンドには

```TeX
\rm
```

$$a_\rm{a}$$

```TeX
\mathrm
```
$$a_\textrm{a}$$

```TeX
\textrm
```
$$a_\mathrm{a}$$

があるが、`\rm`は古く推奨されないらしい。
そのせいか、Rmdをhtmlやpdfに変換する時はいいが、wordに変換すると、数式にならない。
適宜`\mathrm`や`\textrm`を使おう。
UISliderのThumbの表示領域(SizeやFrame)を計算するExtension

# はじめに
こんにちは:leaves:
※ [Apple UIKit UISliderからの引用](https://developer.apple.com/documentation/uikit/uislider) 
![UISlider](https://docs-assets.developer.apple.com/published/e0791617a4/14f9f16e-55c0-474a-ae62-f42ebf2cab33.png)
UISliderの**「Thumb」**や**「Track」**の矩形が欲しくなり、色々調べてたのですが、
なかなか見つからずに困っていました。今回はそのExtensionを書いてみたので共有したいと思います。
至らぬ点などコメント頂けたら幸いです。

# サンプル
※ **Thumb**の**Frame**や**Bounds**が取得できることで、**Thumb**に合わせてViewなどの部品などを動かしたりすることができます。
※ **Thumb**にオリジナルの画像を設定してもその矩形を取得することができています。

![Slider.gif](https://qiita-image-store.s3.amazonaws.com/0/128250/47e495dd-6ad5-568b-f4c9-1ceb45e829cc.gif)

# ソースコード
```swift
import UIKit

extension UISlider {

    var trackBounds: CGRect {
        return trackRect(forBounds: bounds)
    }
    
    var trackFrame: CGRect {
        guard let superView = superview else { return CGRect.zero }
        return self.convert(trackBounds, to: superView)
    }
    
    var thumbBounds: CGRect {
        return thumbRect(forBounds: frame, trackRect: trackBounds, value: value)
    }
    
    var thumbFrame: CGRect {
        return thumbRect(forBounds: bounds, trackRect: trackFrame, value: value)
    }
}
```

# さいごに
※ UISliderは設定画面などアプリを開発するにあたって、そんなに利用頻度は少ないかもしれないのですが、気になっていた事を今回調べる事ができたので良かったです。

※ この矩形計算は[IB上で範囲の確認ができるUISliderのタップエリアを拡大する実装](http://qiita.com/KikurageChan/items/6b71a6831848b37f5f46)で利用したくて書いてみました。こちらの記事も合わせて見ていただけると嬉しいです。

# 参考にさせていただいた記事
- [How to get the center of the thumb image of UISlider stackoverflow](https://stackoverflow.com/questions/1714405/how-to-get-the-center-of-the-thumb-image-of-uislider)

- [Apple Reference UISlider](https://developer.apple.com/documentation/uikit/uislider)

見て頂いてありがとうございます。
フロントエンドの開発環境


# インストール
## Homebrew
https://brew.sh/index_ja

## Node.js
https://nodejs.org/ja/
安定版のLTSを選択
## Yeoman
http://yeoman.io/
npm install --global yo
## Gulp
https://gulpjs.com/
npm install --global gulp-cli
## Bower
https://bower.io/
sudo npm install -g bower
# nodemon
https://nodemon.io/
npm install -g nodemon
#eslint
https://www.npmjs.com/package/eslint
npm install eslint --save-dev
#peer
https://www.npmjs.com/package/peer
npm install peer


# Yeomanの実行
yo
# aaaaa
npm install
bower install
CSSでタグ内のテキストを書き換える

<h1>概要</h1>
プラグイン等を使用していると、html側から編集できなかったりします。
そんなときにこの方法で、CSSからテキストを書き換えることができます。

```
#loginname {
    font-size:0;
}
#loginname:before {
    font-size: 14px;
    content: "ユーザ名";
}

```
<h1>説明</h1>
まず元からあるテキストを消します。
そして新しくフォントサイズを指定。
contentで書き換えるテキストを指定。
以上です。
とても簡単！
jQueryでidやclass、placeholder等要素名を指定

<h1>概要</h1>
プラグイン等を使用していると、html側から編集できなかったりします。
そんなときにこれで外部から属性を指定できます。

```
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
```

```
<script type="text/javascript">
    $(function(){
        $("div.text label").attr('id','loginname');
    });
</script>
```
<h1>説明</h1>
$("div.[divのクラス名] [タグ名]").attr('id','[付けたいid名]');

<h1>例</h1>
```
<div>
    <p>test1</p>
    <p>test2</p>
    <p>test3</p>
    <p>test4</p>
</div>
```
divにclass、pにidを指定する場合。

```
$(function(){
    $('div').attr('class', 'test_div');
    $('p').attr('class', 'test_p');
}
```
これでhtmlでいうと以下のような状態になります。

```
<div class="test_div">
    <p id="test_p">test1</p>
    <p id="test_p">test2</p>
    <p id="test_p">test3</p>
    <p id="test_p">test4</p>
</div>
```

<h2>最初と最後だけ指定する</h2>
pタグが複数並んでいますが、最初だけ、最後だけに指定したい場合は以下のように書きます。

```$('p:first').attr('class', 'test_p');```
```$('p:last').attr('class', 'test_p');```

<h2>要素番号を指定してクラスを追加する</h2>
最初や最後ではなく、2番目だけなんて時には以下のように書きます。
番号は0から始まるので、2番目の場合は"1"となります。

```$('p').eq(1).attr('class', 'test_p');```

<h2>奇数や偶数にだけ指定する</h2>
奇数には"odd"、偶数には"even"セレクタを使用します。

```$('p:odd').attr('class', 'test_p');```
```$('p:even').attr('class', 'test_p');```

<h2>連番で追加する</h2>
"test_p01"、"test_p02"、"test_p03"...
と、連番で追加したいときにはeachを使用します。

```
var i = 1;
$('p').each(function(){
    $(this).addClass('test_p'+i);
    i++;
});
```

<h2>直下の要素にだけ追加する</h2>
以下のように子要素がある場合。

```
<div id="test_div">
    <p>test1</p>
    <p>test2</p>
        <div>
            <p>test2-1</p>
            <p>test2-2</p>
        </div>
    <p>test3</p>
    <p>test4</p>
</div>
```

親要素のpタグにしか適用させたくないな...
というときに、#test_div直下のpタグと指定します。

```$('#test_div>p').attr('class', 'test_p');```

これで以下のように親要素#test_div直下のpタグにしか適用されません。

```
<div id="test_div">
    <p class="test_p">test1</p>
    <p class="test_p">test2</p>
        <div>
            <p>test2-1</p>
            <p>test2-2</p>
        </div>
    <p class="test_p">test3</p>
    <p class="test_p">test4</p>
</div>
```

<h1>補足</h1>
```$('p').attr('class', 'test_p');```
ではなく、
```$('p').addclass('test_p');```
のようにも書けますが、個人的には前者の方が分かりやすいと思っているので、
そちらを使用しています。
サービスアカウントを使ってG Suiteドメイン内のカレンダーにアクセスする

#内容
一般のアプリのように使用者に承認してもらってアクセスするのではなく、社内でのアプリ・サービスのバックエンドとしてG Suiteのドメイン内のカレンダーにアクセスする方法。
ドメイン外のカレンダーにはアクセスできない。

サービスアカウントのドメインへの認証はG Suiteの管理画面から行うため、管理者しか行うことが出来ません。

# 準備
## nuget

Google CalendarのAPIパッケージをインストールしておきます。

```c
 PM> Install-Package Google.Apis.Calendar.v3
```
## 認証id作成

Google cloud platformのdeveloper consoleにアクセス。
プロジェクトを作成し、左メニューのライブラリからGoogle Calendar APIを検索して有効にする。


左メニューの認証情報→認証情報を作成→サービスアカウントキーを選択し、サービスアカウント→新しいサービスアカウントを選ぶ。
サービスアカウント名を適当（ここでは"hogehoge"とする）に入力。役割はひとまずProject→オーナーを選択。[^1]
[^1]: この部分は要検証
キーのタイプはP12を選択。鍵ファイル（.p12）がダウンロードされるので保存しておく。


サービスアカウントの管理をクリックし、先程作成したサービスアカウントの右側のメニューから編集をクリック。
「G Suite ドメイン全体の委任を有効にする」のチェックを入れて保存する。


認証情報画面をリロードするとOAuth2.0 クライアントIDに「hogehoge のクライアント」が作成されているので右側の編集ボタンをクリック。
クライアント詳細ページのクライアントIDとサービスアカウントのメールアドレスを控えておく。


## G Suiteに登録

G Suite管理コンソール（ https://admin.google.com/ ）にログイン。
セキュリティ→APIリファレンスを開き「API アクセスを有効にする」にチェックを入れる。
同じくセキュリティ→詳細設定→「API クライアント アクセスを管理する」をクリック。

クライアント名に先ほど控えたクライアントID、1つ以上のAPIの範囲にスコープを入力して承認。

Calendar APIのスコープは下記のページの2つ。
https://developers.google.com/identity/protocols/googlescopes#calendarv3

ここでは"https://www.googleapis.com/auth/calendar" を入力。
ここのスコープは実際に書くプログラムと合わせる必要がある。

#コーディング
C#コンソールアプリで作成。example.comドメインの場合。

コードの説明はコメントに記載。

実行するとpiyo@example.com部分のアカウントのカレンダーに予定が作成され、作成者はmoge@example.com部分のアカウントになっているはずです。
カレンダーIDを指定すればドメイン内のカレンダーリソースにもアクセスできる。

```c# 
// 認証情報作成時にDLしたキーファイルを実行ファイルと同じ場所に配置。
var keyFilePath = "key.p12";    
var certificate = new X509Certificate2(keyFilePath, "notasecret", X509KeyStorageFlags.Exportable);
var serviceAccountEmail = "控えておいたサービスアカウントのメールアドレス"; 

var credential = new ServiceAccountCredential(
        new ServiceAccountCredential.Initializer(serviceAccountEmail)
        {
            Scopes = new string[] { CalendarService.Scope.Calendar },   // 管理コンソールで設定したのと同じスコープ
            User = "moge@example.com"   // G Suiteの管理者アカウントを設定する。このアカウントが実行したことになる
        }.FromCertificate(certificate));

// Create the service.
CalendarService service = new CalendarService(new BaseClientService.Initializer()
{
    HttpClientInitializer = credential,
    ApplicationName = "Calendar API Sample",
});

// ドメイン内のカレンダーを取得
var cal = service.Calendars.Get("piyo@example.com").Execute();
Console.WriteLine(cal.Id);

// ドメイン内のカレンダーに予定を作成
var schedule = new Event()
{
    Summary = "APIからのテストスケジュール",
    Start = new EventDateTime()
    {
        DateTime = new DateTime(2017, 7, 10, 12, 0, 0)
    },
    End = new EventDateTime()
    {
        DateTime = new DateTime(2017, 7, 10, 13, 0, 0)
    },
    Description = "詳細"
};

service.Events.Insert(schedule, "piyo@example.com").Execute();

Console.WriteLine("press Enter key...");
Console.Read();

```


#APIリファレンス

https://developers.google.com/google-apps/calendar/v3/reference/
CentOS7にインストールしたJenkinsにWindows PCを接続する

# CentOS7にインストールしたJenkinsにWindows PCをSlave接続しようとした際にいろいろ引っかかったのでメモ。

Jenkins -> グローバルセキュリティの設定
Enable Agent -> Master Access Controlをチェック

ノードを作って、起動方法を「WindowsサービスとしてこのWindowsスレーブを制御」にする

スレーブにするPCにはJavaとDotNet3.5をインストールしておく。

管理者のユーザー名、パスワードにスレーブにするPCのAdministratorグループのユーザー情報を入力
ホストにスレーブにするPC名を入力
サービスを実行するユーザーにUse Administrator account given aboveを選択

この時点のエラー
`ERROR: Message not found for errorCode: 0xC0000034
org.jinterop.dcom.common.JIException: Message not found for errorCode: 0xC0000034`

スレーブPCでRemote Registry Srviceが起動していない。
「サービス」を起動し、Remote Registryのプロパティを開き、[スタートアップの種類：自動]に設定
右クリックして「開始」

この時点のエラー
`ERROR: [2017-07-10 14:40:45] [windows-slaves] アクセスは拒否されました。解決方法の詳細については、http://wiki.jenkins-ci.org/display/JENKINS/Windows+slaves+fail+to+start+via+DCOM を参照してください。
org.jinterop.dcom.common.JIException: Message not found for errorCode: 0x00000005`

リンクを参考にファイアーウォールの設定をします。
https://wiki.jenkins.io/display/JA/Windows+slaves+fail+to+start+via+DCOM

この時点のエラー
`ERROR: Message not found for errorCode: 0xC0000001
org.jinterop.dcom.common.JIException: Message not found for errorCode: 0xC0000001
	at org.jinterop.winreg.smb.JIWinRegStub.winreg_OpenHKCR(JIWinRegStub.java:121)`
リンクを参考にレジストリの設定をします。
https://issues.jenkins-ci.org/browse/JENKINS-16418
具体的には
 HKEY_CLASSES_ROOT\CLSID{76A64158-CB41-11D1-8B02-00600806D9B6}
のOwnerをJenkinsで使うユーザーに変更し、そのユーザーのフルコントロールにする。
該当のエントリを右クリックし、「アクセス許可」->「詳細設定」->Ownerを変更
変更したオーナーをフルコントロールに設定

この時点のエラー
`ERROR: Unexpected error in launching an agent. This is probably a bug in Jenkins
org.jinterop.dcom.common.JIException: Service Logon Failure
	at org.jvnet.hudson.wmi.Win32Service$Implementation.start(Win32Service.java:149)
Caused: java.lang.reflect.InvocationTargetException`

スレーブのPCでServiceを開き、該当するjenkinsslaveのサービスのログオン情報をスレーブ用のものに設定しなおす。

これでスレーブとして接続されるようになりました。
CircleCIでexpoにpublishする


expoでみんなが簡単にアプリの最新状況が見られるように、masterにコードがpushされたときにexpoにpublishします。

[exp](https://docs.expo.io/versions/v18.0.0/guides/exp-cli.html)コマンドで `publish`  するだけです。 `exp publush` にはtokenというオプションもあるようなのですが


```
$ exp publish --help

  Usage: publish|p [options] [project-dir]

  Publishes your project to exp.host


  Options:

    -q, --quiet           Suppress verbose output from the React Native packager.
    -s, --send-to [dest]  A phone number or e-mail address to send a link to
    --non-interactive     Fails if an interactive prompt would be required to continue.
    -h, --help            output usage information
```


ちょっと調べてもトークンの生成方法がわからないので環境変数 `EXPO_ACCOUNT`, `EXPO_PASSWORD` でユーザ名とパスワードを設定します。

`exp://exp.host/@ku0522a/myapp` というフォーマットでURLが生成されるのでexpoから読み込んでもらうとだれでも簡単に最新版を確認できるようになります :raised_hands: 


```circle.yml
machine:
  node:
    version: 8.1.3
  pre:
    - "echo 'Host *' >> $HOME/.ssh/config"
    - "echo 'ForwardAgent yes' >> $HOME/.ssh/config"
    - "git config --global user.name 'Circle CI'"
    - "git config --global user.email 'ku0522a@gmail.com'"
  post:
    - npm install -g npm@3.x.x --progress=false
  environment:
    EXPO_ACCOUNT: 'ku0522a'
general:
  artifacts:
    - "build"
dependencies:
  cache_directories:
    - "node_modules"
  override:
    - npm install exp
    - ./node_modules/.bin/exp login -u "$EXPO_ACCOUNT" -p "$EXPO_PASSWORD"
    - npm install --progress=false:
        timeout: 600
database:
  override:
    - echo "Skipping DB section."
compile:
  override:
    - exit 0
test:
  override:
    - echo 'skipping test section.'
deployment:
  master_merge:
    branch: ['master']
    commands:
      - ./node_modules/.bin/exp publish
```
postgresのdatabaseファイルの更新

参照
http://qiita.com/blueplanet/items/58e511daa02b5684ec1d


こちらの記事そのまんまなんですが、今回9.4.1から9.6.3へのアップグレードが走って、結果

```
FATAL:  database files are incompatible with server
DETAIL:  The data directory was initialized by PostgreSQL version 9.4, which is not compatible with this version 9.6.3.
```

というエラーが出て起動しなくなりました。

ということで、先の記事にあるとおりやっていく


```bash
initdb /usr/local/var/postgres963 -E utf8
```

```bash
pg_upgrade -d /usr/local/var/postgres941 -D /usr/local/var/postgres963 -b /usr/local/Cellar/postgresql/9.4.1/bin/ -B /usr/local/Cellar/postgresql/9.6.3/bin/ -v
```

ここで以下のエラー。

```
connection to database failed: fe_sendauth: no password supplied
```


ここで参照
https://www.monotalk.xyz/blog/postgresql-connection-to-database-failed-fe_sendauth-no-password-supplied/

こちらを見ると全部trustにする、とあるので、

```
vim /usr/local/var/postgres941/pg_hba.conf
vim /usr/local/var/postgres/pg_hba.conf
```


編集して再度pg_upgrade


```
Upgrade Complete
----------------
Optimizer statistics are not transferred by pg_upgrade so,
once you start the new server, consider running:
    ./analyze_new_cluster.sh

Running this script will delete the old cluster's data files:
    ./delete_old_cluster.sh
```

無事完了したので起動。

```bash
pg_ctl -D /usr/local/var/postgres963 -l logfile start
```
「日本語ワードネット」を用いた複数キーワードの類語一括抽出方法

#はじめに

国立研究開発法人情報通信研究機構（NICT）で公開されている、「日本語ワードネット」という日本語の類語辞書があります。
http://compling.hss.ntu.edu.sg/wnja/

これを用いる事で、ある語に対しての類語が引ける訳なのですが、実際に実用するとなると、複数の語（キーワード）に対してまとめて類語を抽出したいといった要求が出てきます。
ですが、現状どのサイトを見ても「（１つの）キーワードに対して類語取れました、以上」と言ったものばかりだったので、複数キーワードに対して一括して類語抽出する手順についてまとめてみました。

#手順

##１．辞書のDL

まずは辞書を[サイト](http://compling.hss.ntu.edu.sg/wnja/)からDLします。
サイトのメニューから「リリース・ダウンロード」を選択します。
[Japanese Wordnet and English WordNet in an sqlite3 database]とあるリンクをクリックしてDLします。

##２．sqliteのインストール
[サイト](https://sqlite.org/download.html)よりDLしてインストールします。


##３．SQLの作成
sqliteで実行するselect文を列挙したSQLのファイルを作成します。

検索するといくつか記述方法があるようですが、今回は[こちら](http://d.hatena.ne.jp/antlabo/20120807/1344355386)のサイトを参考にしました。

但しこの際にselectする項目を"word2.*"とだけしてしまうと、連続でselect文を実行した場合、どこからどこまでが何のキーワードで検索した結果なのかが分からなくなってしまうため、適当なカラム名でキーワードも出力するようなselect文に拡張します。
（"適当なカラム名 AS キーワード"をselectに追加）

実際のSQLのイメージ
（以下'キーワード'を実際に検索したいキーワードに置き換えて下さい）

---
_select 'キーワード' as KEYWORD, word2.* 
from word as word1 inner join sense as sense1 on ( word1.wordid = sense1.wordid)inner join sense as sense2 on ( sense1.synset = sense2.synset) 
inner join word as word2 on ( word2.wordid = sense2.wordid and word2.lang='jpn')
where word1.lemma = 'キーワード' and word1.lang = 'jpn';_
***

上記のSQLを類語抽出したいキーワード分列挙したテキストファイルを作成します。
　**<FONT color="red">　→　※文字コードをUTF-8としないとsqliteで読み込めないので注意</FONT>**

##４．実行
コマンドラインで作成したSQLを実行します。

・コマンドラインを起動し、sqliteのインストール先のフォルダに移動

・sqliteを起動
　`sqlite3 データベース名`

・出力ファイルを指定
　`.output 出力ファイル名`

　　**<FONT color="red">→　※以降全てのコマンド入力の結果はコンソールに表示されないので注意</FONT>**

・SQLファイルを読込実行
　`.read SQLファイル名`

といった手順で、出力ファイルに結果が出力されます。

---
結果例）
「発注」と「労働」といったキーワードで実施した場合

_発注|157855|jpn|誂える||v
発注|162377|jpn|註文||v
発注|182242|jpn|頼む||v
発注|191970|jpn|オーダー||v
発注|203269|jpn|注文||v
発注|207209|jpn|発注||v
発注|217629|jpn|発註||v
発注|227948|jpn|オーダ||v
労働|159374|jpn|労働||n
労働|207938|jpn|労役||n
労働|228799|jpn|肉体労働||n
労働|159374|jpn|労働||n
労働|179519|jpn|バイト||n
労働|195552|jpn|雇用||n
労働|196648|jpn|働き口||n
労働|206010|jpn|アルバイト||n
労働|213311|jpn|仕事||n
労働|155790|jpn|就労||v
労働|159375|jpn|労働||v
労働|169181|jpn|勤労||v
労働|195589|jpn|働く||v
労働|220551|jpn|勤める||v
労働|230042|jpn|勤務||v
労働|159375|jpn|労働||v
労働|169181|jpn|勤労||v
労働|173457|jpn|立ち働く||v
労働|195589|jpn|働く||v_
[MySQL] index使われてないクエリをいい感じに炙りだしたい



以下の思惑をすべて満たしたい場合、どうしたらよいかと思い調べた。
(1) index使われてないクエリを炙りだしたい
(2) インデックス使ってないけど、テーブル行数少ないとか問題にならないようなものは出力させたくない
(3) 一時的でなくずっと設定しておいて、スロークエリログを監視しておきたい

[日々の覚書: MySQLのスローログ関連のパラメーターが評価される順番](https://yoku0825.blogspot.jp/2015/02/mysql.html)
読んだ。

以下の設定でいけそう。
`min_examined_row_limit` は今回初めて知った。
`log_throttle_queries_not_using_indexes` はちょっと残念だった。

```ini
(※) 任意の値

# スロークエリ有効
slow_query_log=1 (※)

# スロークエリログ出力先指定
slow_query_log_file=slow_query.log (※)

# 1秒以上かかるクエリをスロークエリログに出力
long_query_time=1 (※)

# インデックス使ってないクエリをスロークエリログに出力
log_queries_not_using_indexes=1

# 検査行が1000行以下の場合、スロークエリログに出さない
min_examined_row_limit=1000 (※)

# 一度スロークエリログ出力したら、1分はスロークエリログに出さない
# ただし、not_using_indexだけでなく、long_query_timeオーバーの方も出なくなるらしいので使わない。5.7だとどうか。
# log_throttle_queries_not_using_indexes=1
```
PHPでも過激な短絡評価がしたい！

[絶対どこかにあるだろうけど言語化の不自由と情報の海に埋もれてうまく検索できないシリーズ]

結果的にボツだこれ。

# 要件

jsなど幾つかの言語で可能な、論理和の返り値が最後の評価値になるやつがしたい。
単純に短絡評価で伝わるか。

[短絡評価 - Wikipedia]

```js

('' || 'test') // 'test'
('test' || '') // 'test'
(false || '') // ''

```

変数が1かギリギリ2個だけなら三項演算子でなんとかできるけれど…っと。

選択的代入とも言うらしい？

# <i class="fa fa-code"></i> コード

```php

<?php

function js_sce($callback = null, ...$args) {
    if(!is_callable($callback)) {
        $callback = function ($arg) {
            return !!$arg; // $arg == true
        };
    }

    foreach ($args as $arg) {
        if($callback($arg)) {
            return $arg;
        }
    }
    // ここ例外かreturn false null 悩むけどjsが最後の値なので。
    return array_pop($args);
}

var_dump(js_sce(null, 'test', 'example', 'year!')); // string(4) "test"
var_dump(js_sce(null, '','test', 'example', 'year!')); // string(4) "test"
var_dump(js_sce(null, null, 'example', 'year!')); // string(7) "example"
var_dump(js_sce(function($arg) {
    return $arg === 'year!';
}, null, 'example', 'year!')); // string(5) "year!"
var_dump(js_sce(null, null, '', false)); // bool(false)
var_dump(js_sce()); // NULL

```
(これ`array_filter`からの`array_shift`でほぼ似そう？)


できれば

```php
function js_sce( ...$args, $callback = null)
```
がいいけれど、可変長引数なら無理だよね。(`Fatal error: Only the last parameter can be variadic `)
呼び出す側が`...`使えばいいのかな？




## By the way

個人的なJavaScriptによる短絡評価の最頻パターンは以下だと思います。

```js
hoge.huga = hoge.huga || 'huni'
```

JSONで受け取ったデータの処理などに使う。

次点でES2015未満の関数のデフォルト引数か、複雑なデフォルト値の設定か。

とかく、hogeがちゃんとオブジェクトならhugaは未定義でも構わない。(左辺の評価時にエラーにならない)

が、PHPでは存在しないプロパティを読むと、Noticeエラーになる。

```php
<?php

error_reporting(-1);

$a = new Stdclass();

echo $a->tes; // Notice: Undefined property: stdClass::$tes 
```


仮に`||`の短絡評価時はセーフになったとしても、関数の引数になればもうそこでNGだろう。
だから、完成度が高い模倣ではないし、おもったより使えない気がする。

過去に何度か作ろうとして毎度ここで諦めてたような記憶もかすかにある。


# <i class="fa fa-book"></i> 参考

* [短絡評価 - Wikipedia]
* [PHP: 論理演算子 - Manual]
* [PHP: 関数の引数 - Manual]
* [論理演算子(&&, ||)の短絡評価 - Qiita]  
  過激派でした。
* [論理演算子 - JavaScript | MDN]
* [JavaScriptの「&&」「||」について盛大に勘違いをしていた件 - Qiita]


[絶対どこかにあるだろうけど言語化の不自由と情報の海に埋もれてうまく検索できないシリーズ]:http://qiita.com/khsk/items/44d7d23ead2a3385fb48

[短絡評価 - Wikipedia]:
https://ja.wikipedia.org/wiki/%E7%9F%AD%E7%B5%A1%E8%A9%95%E4%BE%A1

[PHP: 論理演算子 - Manual]:http://php.net/manual/ja/language.operators.logical.php

[PHP: 関数の引数 - Manual]:http://php.net/manual/ja/functions.arguments.php#functions.variable-arg-list

[論理演算子(&&, ||)の短絡評価 - Qiita]:http://qiita.com/gyu-don/items/a0aed0f94b8b35c43290

[論理演算子 - JavaScript | MDN]:https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Logical_Operators#.E3.82.B7.E3.83.A7.E3.83.BC.E3.83.88.E3.82.B5.E3.83.BC.E3.82.AD.E3.83.83.E3.83.88.E8.A9.95.E4.BE.A1


[JavaScriptの「&&」「||」について盛大に勘違いをしていた件 - Qiita]:http://qiita.com/Imamotty/items/bc659569239379dded55
定型メールを送信する Perl スクリプト

システム管理業務を行っていると、定型メールを送信するスクリプトを記述する必要が頻繁に発生します。その場合、以下の2つの要求を考慮する必要があります。

- 定型メールの雛形は、スクリプト本体のロジックからは分離しておきたい（コード可読性の向上のため）。
- しかし、雛形をスクリプトとは別のファイルに分離することはしたくない（後日の変更時に雛形ファイルを探す労力をかけたくないため）。

Perl スクリプトで、この2つの要求を同時に満たすため、筆者はしばしば「DATA ハンドラを使って雛形を分離する」という手法を使います。サンプルコードは以下の通りです。なお、DATA ハンドラ内に日本語などのマルチバイト文字列を記述する場合は、`use utf8;` を指定した上で、スクリプトを UTF-8 で保存する必要があります。

```pl
use Encode;
use HTML::Template;
use MIME::Entity;
use Net::SMTP;
use strict;
use warnings;
use utf8;

our $SMTPSERVER = 'localhost';

&sendnotice( 'helpdesk@example.net', 'alice@example.net', "Alice Example" );

sub sendnotice {
    my( $sender, $recipient, $name ) = @_;
    my $tmpl = HTML::Template->new_filehandle( \*DATA );
    $tmpl->param( name => $name, sender => $sender );
    my $msg = MIME::Entity->build( From => $sender,
                                   To => $recipient,
                                   Subject => '[NOTICE] Your disk usage',
                                   Type => 'text/plain; charset=utf-8',
                                   Encoding => 'base64',
                                   Data => &encode('utf8', $tmpl->output) );
    my $smtp = Net::SMTP->new( $SMTPSERVER );
    $smtp->mail( $sender ) &&
        $smtp->to( $recipient ) &&
        $smtp->data( $msg->as_string ) &&
        $smtp->quit;
}

__DATA__
<tmpl_var name="name"> 様

あなたのディスク消費量は、制限の90%を超えています。
至急、不要なファイルを削除してください。

-- 
<tmpl_var name="sender">
```

なお、MIME::Entity->build() を呼び出す時の Data パラメータに渡す値に対して encode する処理を忘れると、以下のようなエラーになって異常終了します。エラーメッセージと必要な修正との関係が分かり難くて、私も1時間ほどはまりました。

```
open body: Invalid argument at /usr/share/perl5/MIME/Entity.pm line 1878.
```

[定形メールを自動返信するスクリプト](https://gist.github.com/tsuchm/0b2d4f145ec364619eb9430291ef62d8)も書きましたので、必要な方はどうぞ。
SQL コマンド集memo

##口座テーブル
| 口座番号 | 名義 | 種別 | 残高 | 更新日 |
|:-:|:-:|:-:|:-:|:-:|
| 0642191 | アオキ　ハルカ  | 1  | 364055  | 2013-03-13  |
| 1039410  | キノシタ　リョウジ  | 1  | 259017  | 2012-11-30  |
| 1239855  | タカシナ　ミツル  | 2  | 650977  | NULL  |


残高が０より大きいデータを抽出
```select * from 口座 where 残高 > 0```

更新日が登録されていないデータを抽出
```select * from 口座 where 更新日 is null```

アオを含む名義のデータを抽出
```select 名義 from 口座 where like '%アオ%'```

更新日が2013年3月のデータを抽出
```select * from 口座 where 更新日 between '2013-03-01' and '2013-03-31'```

口座番号を降順に取得
```select * from 口座 order by 口座番号 desc```

更新日と残高を降順に11~20件のみ抽出。
ただし、残高が0円、または更新日の設定がないデータは除外する。
```select 更新日, 残高 from 口座 where 残高 > 0 and 更新日 is not null order by 残高, 更新日 desc limit 10 offset 10```

それぞれの残高から5000円ずつマイナスしてから0.3%足す。
```update 口座 set 残高 = ( 残高 - 5000 ) * 1.003```

2013年以前のデータを対象に、口座番号、更新日、通帳期限日を抽出。
通帳期限日は更新日の360日後とする。
```select 口座番号, 更新日, 更新日 + 360 as 通帳期限日 from 口座 where 更新日 < '2013-01-01'```

口座番号、名義、残高ランクを抽出。残高ランクは残高が30万未満をC、30万以上50万以内をB、それ以外をAとする。
```select 口座番号, 名義, 
case when 残高 < 300000 then 'C'
when 残高 >= 300000 and 残高 <= 500000 then 'B'
else 'A' end as 残高ランク from 口座```
クラウドサーバでTensorFlow　その7

#概要
クラウドサーバでTensorFlowやってみた。
tensorflowのinceptionで1000分類してみた。

#環境
クラウド idcf
linux debian-8.11
tensorflow 1.2
gpu 無し

#写真
![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/I/x/P/IxPe.jpg?t=1499672628)



#サンプルコード

```
var url = 'http://　/cgi-bin/test5.py';
var image = new Image();
image.onload = function() {
    canvas = document.getElementById('canv_original');
    canvas.width = 224;
    canvas.height = 224;
    ctx = canvas.getContext("2d");
    ctx.drawImage(image, 0, 0, 224, 224);
	var img = canvas.toDataURL('image/jpeg');
	$.ajax({
		url: url,
		type: 'POST',
		data: {
            img: img
        },
		dataType: 'json',
		success: function(data) {
			if (data.status)
            {
				$('#report').html('This is ' + data.num + '.');
			}
            else
            {
				$('#report').html('これは、分かりません');
			}
		},
        error: function(res) {
            alert('err');
        }
	});
}
image.src = "/assets/9/1/8/P/918PR.jpg";
```

#成果物

http://jsdo.it/ohisama1/IxPe
pythonでLagrange補間

大学の授業でLagrange補間を知ったのでPythonで実装してみました。

## 関数の補間とは
関数の補間とは離散的に得られている点から、それらをつなぐ連結的な関数を導き出すことです  
【離散的】  
![img1](http://imgur.com/QBLMIrO.png "img1")  
【連続的】
![img2](http://imgur.com/o6O9MTR.png "img2")


## Lagrange補間法とは
j=0,1,2…nに対してxjとf(xj)の値を既知のデータ点として設定した場合

```math
l_j(x) = \frac{(x-x_0)(x-x_1)…(x-x_{j-1})(x-x_{j+1})…(x-x_n)}{(x_j-x_0)(x_j-x_1)…(x_j-x_{j-1})(x_j-x_{j+1})…(x_j-x_n)}\\  
P_n(x) = \sum_{j=0}^{n}f(x_j)l_j(x)

```

という風になります。大事なところはlj(x)を求める際、ｊ番目を飛ばすということです。（0になってしまうから）  


## PythonでLagrange補間法  
以下のようになります。  

```Python:Lagrange.py
import numpy as np
import matplotlib.pyplot as plt

def lagurange(x,xp,fx):
    results = [];
    for l in range(len(x)):
        if(x[l] in xp):
            results.append(fx[np.where(xp==x[l])])
        else:
            result=0
            for j in range(len(xp)):
                lag = lx(x[l],j,xp)
                result += fx[j]*lag
            results.append(result)
    return results

def lx(x,j,xp):
    numerator,denominator = 1,1
    for i in range(len(xp)):
        if(i!=j):
            numerator *= x-xp[i]
            denominator *= xp[j]-xp[i]
    return numerator/denominator

def main():
    xp = np.arange(-10,10,3)
    fx = xp**3
    x = np.floor(np.arange(-10,10,0.1)*10)/10
    y = lagurange(x,xp,fx)
    plt.plot(x,y)
    plt.plot(xp,fx,"o")
    plt.show()

if __name__ == '__main__':
    main()

```  
原始的に何も考えずにそのまま実装したのでもっと効率の良い書き方があると思います。 
このプログラムでは関数y=x^3のxを3刻みのデータで既知とし、x=-10~10範囲で0.1刻みでLagrange補間を行っています。

既知のデータ点
![img4](http://imgur.com/kg4JrIG.png "img4")  
Lagrange補間後
![img5](http://imgur.com/gDRWPtL.png "img5")  
しっかりとy=x^3の近似ができていますね。
Cognos 特定のレポートは特定のノードでだけ実行したい

##概要
Cognosで、特定のレポートは特定のノードだけで実行するようにしたい、という要件が出る事があります。
例えば、超重いレポートは、レポートサーバー2のみで実行し、他の軽いレポートはレポートサーバー1で実行する事により、重いレポートの実行が軽いレポートの実行に影響する事を避けたいという要件です。
これは、レポート単位ではないのですが、パッケージ単位で、「パッケージルーティング」という機能により可能です。
下の図の様に、パッケージ1、パッケージ2に関連したレポートは、AP1ノード、AP2ノードのどちらからも実行可能ですが、実行すると実際の処理は、パッケージ1のレポートはAP1、パッケージ2のレポートはAP2に処理が振られ、専用のノードのCPU・Memoryリソースが使用されます。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/7af78a73-b207-d710-8dba-d4c5a3b06e9b.png)

##内容
この設定の手順を投稿しておきます。
誰かに問い合わせ受けた時に、このリンクをさらっとご紹介下さい。

振り分け対象のパッケージのプロパティを選択
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/8939b18d-3635-082a-9197-08f414653da9.png)

全般タブを下の方にスクロールし、「親エントリーから取得したルーティングセットをオーバーライド」をチェック。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/c2db91fb-9c88-db39-78dc-7837debfb8d0.png)
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/dcd6c8c4-f7e0-3a9f-a613-55e879597a7d.png)

「設定」をクリック
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/b779f8ac-da6b-3089-771e-29ddfe448904.png)

ルーティング・セットを入力ウィンドウからパッケージを選択し、赤枠の⇒を選択。
![006.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/ed4c8e16-c925-1b73-4d57-b1b0598fb876.png)

割り当てられたルーティング・セットにパッケージが表示された事を確認し、OK。
![007.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/517543be-0e7a-6d7f-8390-ec7d38693c6c.png)

OKを選択。
![008.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/18daf312-84bf-bd8a-0394-1d3600ff308a.png)

Cognos Administrationを起動し、設定タブのディスパッチャとサービスを選択し、振り分け先のディスパッチャーのプロパティを選択。
![009.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/06a57554-3a49-a360-5dd2-2791f657665a.png)

設定タブのカテゴリーを調整に選択し、「サーバー・グループ」に振り分けグループの名称(任意)を記載。OKを選択。
![010.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/5a6c468d-ee1d-2450-10ab-9054c11350af.png)

赤枠の「ルーティングの規則を指定」アイコンを選択。
![011.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/da5fdf12-3419-1262-f45b-ee426970c45d.png)

「規則を追加」を選択し、パッケージのルーティング・セットとサーバー・グループを選択。OK。
![012.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/36c0a4d2-56b9-d713-c71c-dfe01d4b5f56.png)


例えば、2台のレポートサーバーのうち、1台に大量のメモリーを積んでおいて、メモリーが少ないノードはCQM(互換モード)パッケージ用、メモリーが多いノードはDQM(動的モード)パッケージ用、というような使い方で、メモリーを効率的に割り振る事も可能です。

是非こういう機能がある事を覚えておいて下さい。
Repo


複数の git レポジトリを管理する repo というツール https://gerrit.googlesource.com/git-repo/ について調べた。Android や Automotive Grade Linux (AGL) のビルドに使われる。

## インストール

公式サイト? https://source.android.com/source/downloading#installing-repo によると

    curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
    chmod a+x ~/bin/repo

のようにダウンロードしてパスを通す。repo コマンドの中身は repo 本体をインストールする Python スクリプトのインストーラになっている。

## 環境作成

    repo init -u URL

によって環境を設定すると、現在のディレクトリで二つの事が起こる。

* .repo/repo に repo 本体をダウンロードする。
* .repo/manifests に URL から clone した git レポジトリを展開する。このディレクトリに manifest file が置いてある。
    * .repo/manifests/default.xml から manifest.xml にシンボリックリンクを張る。
    * .repo/manifests.git に .repo/manifests/.git と似たような物が作られる。

つまり自分で repo を別の目的で使うには manifest file を書いた git レポジトリを作り、repo init で参照すると良いという事になる。

ローカルの構成を変更する場合、.repo/manifests を編集してから commit し、revision を指定する。

    repo init -b revision

## ソースコードの同期 [repo sync](https://source.android.com/source/using-repo#sync)

    repo sync

で manifest file に書いてあるレポジトリとソースコードを同期する。具体的には以下の事を行う。

* 初めての repo sync の場合 git clone
* [git remote update](https://git-scm.com/docs/git-remote#git-remote-emupdateem)
    * リモートのコードをダウンロードする。
* [git rebase origin/(BRANCH)](https://git-scm.com/docs/git-rebase)

## その他

https://source.android.com/source/using-repo に色々なコマンドがある。

* `repo status`: repo の内容 (manifest revision) とローカルでの変更差分を表示する。
* `repo sync -d (project)` あるプロジェクトをトピックブランチから manifest revision に戻る。

## 自分で Manifest を作る

自分で複数の git repository を管理する manifest を書いてみる。例えば、github から propella/prolog と propella/AlligatorEggs という二つのプロジェクトをダウンロードし、それぞれ prolog と eggs に配置するには以下のようなファイル default.xml を一つだけ持つレポジトリを作成して、repo init -u の引数に指定すれば良い。(レポジトリがローカルにある場合はローカルパスで良い)

```xml
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
  <remote name="github" fetch="https://github.com/" />
  <project name="propella/prolog" path="prolog" remote="github" revision="master" />
  <project name="propella/AlligatorEggs" path="eggs" remote="github" revision="master" />
</manifest>
```

## Repo を使った開発

.repo/manifests を編集する。

    repo sync (project) # project だけ更新
    repo status # repo 内の更新状況
    repo branches # 現在の利用中のブランチ

以下を参考にした。

* manifest の文法: https://gerrit.googlesource.com/git-repo/+/master/docs/manifest-format.txt
* Android の例: https://android.googlesource.com/platform/manifest/+/master/default.xml
* AGL の例: https://gerrit.automotivelinux.org/gerrit/gitweb?p=AGL/AGL-repo.git;a=blob;f=default.xml
8GPUでKeras (TensorFlow1.2統合版)が使えるか試してみる

動作環境
- Ubuntu16.04.2 desktop amd64
- Nvidia GeForce GTX 680 を8枚

ではまず

nvida-smiの出力はこのような結果

![nvidia-smi-8gpu.png](https://qiita-image-store.s3.amazonaws.com/0/191466/cdf9cec0-769b-fc96-9b19-c328ae067e4a.png)

nvidiaドライバは動作している。

次に、以下のような簡単なKeras-tensorflowコードを用意して、

```
#!/usr/bin/env python3
import numpy as np

import tensorflow.contrib.keras as keras
from tensorflow.contrib.keras.python.keras.models import Sequential
from tensorflow.contrib.keras.python.keras.layers import Dense, Activation, Dropout
from tensorflow.contrib.keras.python.keras.optimizers import SGD
from tensorflow.contrib.keras.python.keras import backend as K

if __name__ == '__main__':

    x_train = np.random.random((1000, 20))
    y_train = keras.utils.to_categorical(np.random.randint(10, size=(1000, 1)), num_classes=10)
    x_test = np.random.random((100, 20))
    y_test = keras.utils.to_categorical(np.random.randint(10, size=(100, 1)), num_classes=10)

    model = Sequential()
    model.add(Dense(64, activation='relu', input_dim=20))
    model.add(Dropout(0.5))
    model.add(Dense(64, activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(10, activation='softmax'))

    sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
    model.compile(loss='categorical_crossentropy',
                                optimizer=sgd,
                                metrics=['accuracy'])

    model.fit(x_train, y_train,
                        epochs=1000,
                        batch_size=128)

    score = model.evaluate(x_test, y_test, batch_size=128)

    K.clear_session()
```


そして、実行してみる。

![keras-8gpu.png](https://qiita-image-store.s3.amazonaws.com/0/191466/c74ce460-e87e-879e-b83d-665cb276fe27.png)

8GPUを認識まではしている。


さてさて、次回のお楽しみ
Laravel5.2でCall to undefined method Illuminate\Foundation\Application::bindShared()

Laravel5.2でcomposer install後などに下記のエラーが出る事がある。

```
Call to undefined method Illuminate\Foundation\Application::bindShared()
```

#原因
Applicationクラスのメソッド名変更。bindShare()が5.2ではsingleton()に変わっているらしい。

#解決策
$app->bindShare()の呼び出しを$app->singleton()に変更すれば動く。

#参考
http://www.84kure.com/blog/2015/12/29/laravel-5-2%E3%81%A7illuminatehtmlserviceprovider%E3%81%AF%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E5%A4%96/
[自分用メモ] URLマークダウン生成ブックマークレット

自分用メモ。先輩からのtips

Qiita 記事などでurlを記述する際に、毎回 `[名前](URL)` と url をコピペするのは
しんどい。
そこで下記のようなブックマークレットを教えてもらったのでメモ。

```js
javascript:(function(){function%20o(s){var%20d=window.open().document;%20d.writeln('<textarea%20rows=15%20cols=80>'+s+'</textarea>');%20d.close()}%20o("["+document.title+"]("+location.href+")");})();
```

これを firefox のお気に入り（ブックマークツールバー）に登録して
クリックすれば別ウィンドウが開いて欲しいマークダウンが出てくる。
PythonからPythonファイルを読み込み使用する

# はじめに
最近、Pythonとscikit-learnで仕事をしている五石凪です。個人的にはPythonよりもRubyファンですが、今回紹介するものはPythonの仕様の中でも気に入っているものです。

# import
私のようなPython初心者は `import` はライブラリを読み込むもののイメージが強いです。ですが、`import`をしようすれば他のファイルに書かれたクラスやメソッドを読み込むことが可能です。

## 読み込みたいファイルが同じディレクトリにある場合

```python:helper.py
class Helper:
  def some_help():
    # 助けになるようなアルゴリズム
```

```python:app.py
from helper import Helper

Helper().some_help()
```

##読み込みたいファイルが違うディレクトリにある場合

```
Project
- helpers
  - helper.py
- app.py
```
のような場合

```app.py
from helpers.helper import Helper
```

または

```app.py
from helpers import helper
from helper import Helper
```

##読み込みたいファイルが他のファイルを読み込みたい場合

```
Project
- helpers
  - base_helper.py 
  - helper.py
- app.py
```

のような構造で、`helper.py`が `base_helper.py`の`BaseHelper`クラスを使用したい場合

```helper.py
from helpers.base_helper import BaseHelper
# from helpers import base_helper
# from base_helper import BaseHelper
# は何故だかわからないけどできなかった。わかる方教えて欲しい。
```
```app.py
from helpers.helper import Helper
```
ゴーファーくんとすごす素敵な夏

まずはじめに、Gopher オリジナルの作者は、Renee French さんですʕ◔ϖ◔ʔ

#ゴーファーくんのTシャツ作ったよ！
GO言語を勉強しているうちに、ゴーファーくんが好きで好きでたまらなくなり、気が狂ったボクは、今年の夏を一緒にすごせるゴーファーグッズを夜な夜な検索していました。
が！！意外にも心惹かれるグッズがなく、途方に暮れていました。

そんなある日、夢を見ました。
夢の中のゴーファーくんが「ʕ◔ϖ◔ʔ良いグッズがないのなら作っていただけないでしょうか？」とアドバイスをくれたのです！
ゴーファーくん・・・敬語じゃなくていいのに。。。と思っていると目が覚めました。

そして出来上がったTシャツが以下です！
デザインはまだ2種のみですが、ゴーファーくんの魅力を余すところなく表現できてると思います。

まずは写真を。
![2017-07-09 10_26_54-Settings.png](https://qiita-image-store.s3.amazonaws.com/0/179548/704be2e1-3d64-956d-4e3e-b13c009fd6ea.png)
![2017-07-09 10_27_53-Settings.png](https://qiita-image-store.s3.amazonaws.com/0/179548/d88cadf0-e58a-5a17-7a83-3d17185594e2.png)
![2017-07-09 10_28_38-Settings.png](https://qiita-image-store.s3.amazonaws.com/0/179548/cc19395e-ddf8-427c-d73c-6009064cc721.png)

続いてリンクを。
https://www.ttrinity.jp/shop/boxofficeworx/design/1827845
https://www.ttrinity.jp/shop/boxofficeworx/design/1823435


# か、かわいいぃぃぃぃいいいい！！
カーズ様のようにウィンウィンしたくなります。
ゴーファーくんと過ごす夏、プライスレス☆


//one
ログ解析を爆速で行うPythonテンプレ

# あらまし

仕事中、開発機から出力される、 **自分以外の人が入れた** フリーフォーマットなログを解析することがよくある。
毎回それに合わせてログ解析コードを書くわけだが、何度もログ解析をするうちに捗るテンプレートとテクニックができたので展開する。

# テンプレートコード

```py3
#!/usr/bin/env python3

import sys,re

for line in sys.stdin: # 標準出力から読み込む
    line = line.strip() # 行頭、行末の空白、改行は削っておく
    print(line)
```

たったこれだけ！

上記コードはPython3で書かれているが、Python2でもShebangと`print`関数が`print`文になる以外は変わらない。

# 使用例とテクニック

テンプレを用いて、行の解析や集計を行ってみる。

```py
#!/usr/bin/env python3

import sys,re # 標準入力、正規表現を扱う

# 行をまたぐ情報はここで宣言した変数に格納する。
hoge_count = 0

# 行ごとにループを回す
for line in sys.stdin:
    line = line.strip()
    # print(line) # デバッグ用、要らなければコメントアウトする

    # 特定の文字列で始まる行を探すなら、正規表現より.startwith()が便利
    if line.startswith('hoge'):
      hoge_count += 1

    if line.startswith('fuga'):
      # 次の行を先読みしたいなら、.readline()を呼ぶ
      next_line = sys.stdin.readline().strip()
      print("next to fuga =", next_line)

    # 空白やカンマ区切りは.split()を使う
    if line.startswith('moge'):
       moge_cols = line.split(' ')
       print("moge line cols =", moge_cols)

    # 複雑なマッチは正規表現を使う
    m = re.match('(.*)_muga_(.*)', line)
    if m:
       print("muga line left: ", m.group(1), "right:", m.group(2))

# 集計結果の出力
print("hoge_count =", hoge_count)
```

こんな入力を食わせてみる。

```:input.txt
hoge1
hoge2
fuga
next fuga
moge 1 2 3
left_muga_right
```

```shell-session:実行
$ python3 analyze.py < input.txt
```

こんな入力が得られる。

```:output
next to fuga = next fuga
moge line cols = ['moge', '1', '2', '3']
muga line left:  left right: right
hoge_count = 2
```

同じく、Python2でも同等のコードは記述可能である。

# まとめ

5分でログ解析を行うためのコードテンプレートとテクニックを紹介した。
Python3で記述したが、Python2でも可能である。
VB　疑問点

電卓を作成しようとしたのだが、共通化という壁が越えられない。

```
Public Class Form1

    Private Sub Label1_Click(sender As Object, e As EventArgs) Handles lblAnser.Click

    End Sub

    Dim eng_num(10) As String
    ' [ Zero, One, Two, Three, Four, Five, Six, Seven, Eight, Nine }
    Dim Zero As String = eng_num(0)
    Dim One As String = eng_num(1)
    Dim Two As String = eng_num(2)
    Dim Three As String = eng_num(3)
    Dim Four As String = eng_num(4)
    Dim Five As String = eng_num(5)
    Dim Six As String = eng_num(6)
    Dim Seven As String = eng_num(7)
    Dim Eigth As String = eng_num(8)
    Dim Nine As String = eng_num(9)

    Private Sub ButtonClick(sender As Object, e As EventArgs) Handles "btn" + "eng_num(0)" + ".Click"
     #ここが挑戦してる所
    End Sub

    Private Sub btnOne_Click(sender As Object, e As EventArgs) Handles btnOne.Click
　　　#ここが理想
    End Sub
End Class
```
ん～VB勉強して間もないですが、rubyとは違って共通化が難しく感じる。。

```
    Private Sub btnOne_Click(sender As Object, e As EventArgs) Handles btnOne.Click
        lblAnser.Text = lblAnser.Text & "1"
    End Sub

    Private Sub btnTwo_Click(sender As Object, e As EventArgs) Handles btnTwo.Click
        lblAnser.Text = lblAnser.Text & "2"
    End Sub

    Private Sub btnThree_Click(sender As Object, e As EventArgs) Handles btnThree.Click
        lblAnser.Text = lblAnser.Text & "3"
    End Sub

    Private Sub btnFour_Click(sender As Object, e As EventArgs) Handles btnFour.Click
        lblAnser.Text = lblAnser.Text & "4"
    End Sub

    Private Sub btnFive_Click(sender As Object, e As EventArgs) Handles btnFive.Click
        lblAnser.Text = lblAnser.Text & "5"
    End Sub

    Private Sub btnSix_Click(sender As Object, e As EventArgs) Handles btnSix.Click
        lblAnser.Text = lblAnser.Text & "6"
    End Sub

    Private Sub btnSeven_Click(sender As Object, e As EventArgs) Handles btnSeven.Click
        lblAnser.Text = lblAnser.Text & "7"
    End Sub

    Private Sub btnEight_Click(sender As Object, e As EventArgs) Handles btnEight.Click
        lblAnser.Text = lblAnser.Text & "8"
    End Sub

    Private Sub btnNine_Click(sender As Object, e As EventArgs) Handles btnNine.Click
        lblAnser.Text = lblAnser.Text & "9"
    End Sub
```
これを共通化したいと思い始めたが、まだ自分には早かったか。
ちなみにボタンのNameがbtnZero,btnOne、btnTwo,,,btnNineでそれぞれ定義しており
Textにはそれぞれ0~10までが入っています。
```
lblAnser.Text = lblAnser.Text & bntOne.Text
```
でメソッドの中身は軽く別の方法で取り出せてはいるが、、、問題の英語の部分をArrayでもってくるか、適当な変数で定義しておいて条件分岐でやるのか、もしくはFunction、Moduleを利用すべきか。
ふむ、、、わからぬ。

今後の課題として、
>変数の使い方が未だに理解できていないため、それを理解
>sub、Private Subなどクラス名？の意味の理解
>Dim使用時の宣言場所の判断

などなどやることが多い。
 **アドバイス等してもらえると助かります!**
以上疑問点でした。。
AWS SNS(Amazon Simple Notification Service)の通知設定をしてみる

今回CloudWatchでのアラーム通知先の設定を行うため、SNSの設定を試してみたので備忘録としてまとめておきます。

#SNS(Amazon Simple Notification Service)とは

サブスクライブしているエンドポイントまたはクライアントへのメッセージの配信または送信を調整し、管理するウェブサービス。

#SNSの通知設定を行う

まずはトピックの作成を行います。
AWSのサービス一覧　＞　SNSを選択　＞　サイドバーメニューから[Topics]　＞　Create topic

![SNSトピック作成00.png](https://qiita-image-store.s3.amazonaws.com/0/174392/85001e0e-d5fc-a841-75f0-6d168de38152.png)

[Topic name]と[Display name]を入力し、[Create topic]。

![SNSトピック作成.png](https://qiita-image-store.s3.amazonaws.com/0/174392/ad6d241a-fbef-b1ca-28ac-c81f87630221.png)

次の画面に出てくる[Topic ARN]の部分をコピーする。

![SNSトピック作成03.png](https://qiita-image-store.s3.amazonaws.com/0/174392/902e828c-f695-0311-d93b-aaf79460b97b.png)

続いてSNSトピックをサブスクライブする。
サイドバーから[Subscriptions] ＞　[Create Subscription]

![トピックのサブスクライブする01.png](https://qiita-image-store.s3.amazonaws.com/0/174392/61e20bde-f5aa-dd9e-26fa-2dd2868f5003.png)

[Topic ARN]トピック作成をした際にコピーした物を貼り付ける。
[Protocol]今回はEmailを選択。
[Endpoint]メールの通知を行いたい受け取り先を入力する。

![トピックのサブスクライブする02.png](https://qiita-image-store.s3.amazonaws.com/0/174392/e80d0f34-890a-6a78-28e7-950099c0e545.png)

受け取り先に指定したメールアドレス宛に、AWSから以下の図のような確認メールが届きます。
内容を確認して、問題なければ[Confirm subscription]をクリックして、SNSの通知設定は完了です。

![承認メール.png](https://qiita-image-store.s3.amazonaws.com/0/174392/ca6ca68b-7be3-abe8-d930-00f3d9bd1e02.png)

![承認成功.png](https://qiita-image-store.s3.amazonaws.com/0/174392/7d686888-14b0-ed55-f2e7-13045c245bd5.png)

#設定したメールアドレスにテストメールを送付する

設定したアドレスにテストメールを送ってみます！

サイドバー　＞　Topics　＞　先ほど作成したトピックにチェックを入れて　＞　Publish to topic

![テストメール.png](https://qiita-image-store.s3.amazonaws.com/0/174392/f2b11524-1042-a6d3-ec00-1906dbb01b4e.png)

Subject、Messageを入力しPublish messageするとテストメールが送信されます。

![テストメール02.png](https://qiita-image-store.s3.amazonaws.com/0/174392/32f373e7-2d40-4eb7-b714-d71eb73b5e24.png)

テストメールがきちんと届けば設定は完了。
これでCloudWatchでアラームの通知先に設定することも可能です。