OmniAICreator/Qiita-1.07M huggingface dataset:
LaBee Framework 初期起動プロセス実行方法

LaBee FrameworkはJavaによるWebシステム開発のデファクトスタンダードを目指す、ゼロから作られた国産のJavaフレームワークです。 海外製フレームワーク特有の難解さや情報不足による工数や人員の増大を解消しJavaのWeb開発を効率化する為に作られました。 LGPLライセンスでソースコードをオープンソース公開しており、個人・企業問わずどなたでも無償で利用出来ます
https://www.bee-wkspace.com/
![press.jpg](https://qiita-image-store.s3.amazonaws.com/0/137533/9ec50bce-b5dd-3ed3-f1f3-c6f5e9a4d106.jpeg)

#初期実行プロセス 

Webアプリケーション固有でプロパティ読み込み等の初期設定を行ないたい場合があります。そういう場合に以下の条件に沿ったクラスを作成するとLaBeeFrameworkシステムが初期起動した際に作成したクラスのプロセスが自動で実行されます。 

**初期起動プロセス実装条件**

|定義箇所 |概要|
|:--|:--|
|**@AppInitProcess**アノテーション付加|初期実行したいプロセスクラスには**@AppInitProcess****アノテーションを付加します。作成するクラスは設定ファイル等で ファイルの所在等を定義する必要は無く、****@AppInitProcess**アノテーションを付加するだけでLaBeeFrameworkが自動で当該クラスを 検索して実行します。初期実行プロセスクラスは複数存在しても構いませんが実行順は保証されません。 |
|**ProcessInterface**インタフェース実装 |初期実行したいプロセスクラスにはcom.bee_wkspace.labee_fw.core.base.ProcessInterfaceインターフェースの実装定義します。 |
|**startProcess**()メソッド実装 |初期実行したいプロセスクラスにはインターフェースで定義しているstartProcess()メソッドを実装します。初期実行処理は このメソッド内で行ないます。プロパティファイル読込みやポーリングスレッド起動などが考えられます。 |
|その他 |ProcessInterfaceインターフェースで定義しているその他メソッドを実装します。 |

**初期実行プロセス実装例 (抜粋)**

~~~
/**
 * 初期プロパティ読み込み処理
 */
@AppInitProcess
public class LaBeeConfigMng implements ProcessInterface {
    /** プロパティーファイル名 */
    private static String CONFIG_FILE = "config/LaBeeWeb.properties";
    /** メールサーバ接続情報 */
    private static MailServerContext mainServerContext;
    /*
     * (非 Javadoc)
     * 
     * @see
     * com.bee_wkspace.labee_fw.core.base.AppInitializerInterface#initCall()
     */
    @Override
    public void startProcess() throws Exception {
        try {
            Properties prop = SystemUtil.loadProperties(SystemInitializer.getClassLoaderMakedObject(), CONFIG_FILE);
            mainServerContext = new MailServerContext();
            mainServerContext.setServerHost(StringUtil.trim(prop.getProperty("MAIL_SERVER_HOST")));
            mainServerContext.setServerPort(StringUtil.trim(prop.getProperty("MAIL_SERVER_PORT")));
            mainServerContext.setMailAccount(StringUtil.trim(prop.getProperty("MAIL_ACCOUNT")));
            mainServerContext.setMailPassWord(StringUtil.trim(prop.getProperty("MAIL_PASSWORD")));
            mainServerContext.setSendersName(StringUtil.trim(prop.getProperty("MAIL_SENDERS_NAME")));
            mainServerContext.setSenderMailAddr(StringUtil.trim(prop.getProperty("MAIL_SENDER_ADDR")));
        } catch (MissingResourceException e) {
            throw e;
        } catch (Exception e) {
            throw e;
        }
    }
}
  
~~~
pythonでAAっぽく文字を表示する

![スクリーンショット 2016-09-05 11.17.19.png](https://qiita-image-store.s3.amazonaws.com/0/97678/1ae8a318-ae30-3838-edeb-ff48a655a89a.png)

こういう感じのやつ.




pyfigletを使う
https://github.com/pwaller/pyfiglet

```
from pyfiglet import Figlet
f = Figlet(font="slant")
msg = f.renderText("hello world")
print(msg)

```

これだけ.
Figlet(font="big")とか指定できる

![スクリーンショット 2016-09-05 11.18.08.png](https://qiita-image-store.s3.amazonaws.com/0/97678/30d48229-0239-f36b-0e0c-a596e5808293.png)
初见 React


###介绍

还是` react` 来说, 首先来 clone 下最新的 react 代码, `https://github.com/facebook/react`
接着我们来看下关于 react 的描述: 来自 readme:

```
React is a JavaScript library for building user interfaces.

Declarative: React makes it painless to create interactive UIs. Design simple views for each state in your application, and React will efficiently update and render just the right components when your data changes. Declarative views make your code more predictable, simpler to understand, and easier to debug.

Component-Based: Build encapsulated components that manage their own state, then compose them to make complex UIs. Since component logic is written in JavaScript instead of templates, you can easily pass rich data through your app and keep state out of the DOM.

Learn Once, Write Anywhere: We don't make assumptions about the rest of your technology stack, so you can develop new features in React without rewriting existing code. React can also render on the server using Node and power mobile apps using React Native.
Learn how to use React in your own project.


```

其他它的职责很简单, 就是来画 UI 的, 但是有什么不一样的呢.

- 声明指令, 通过 react 来画出的 ui ,它完全可以让 react 来接管其生命周期内的任何状态. 你不需要自己手动去维护它的状态, 这样就让 ui 上这个状态可控.
- 基于组件, 它把整个页面拆分到很多零散的组件, 通过 react 来维护状态, 然后完成一个完成负责的 UI. 逻辑都是在 javascript 里完成的.不需要担心其他的模板什么的技术.


###例子

```
var HelloMessage = React.createClass({
  render: function() {
    return <div>Hello {this.props.name}</div>;
  }
});

ReactDOM.render(
  <HelloMessage name="John" />,
  document.getElementById('container')
);
```

上面的例子, 理解起来就是, 我们通过 react. 创建了一个` HelloMessage` 对象, 而这个对象它的` render` 方法就是返回一个最后的` html`的` tag` 你可以看到是一个` div`, 而这个 `div`它又是可以接受参数的. 通过` this.props`就可以拿到指定名字的参数值, 可以想象成我们在玩 jquery 的时候也是会自己给某个` tag` 加一些自定义的参数. 这里` name="John"`就是一个自定义的参数.

然后找到当前页面上的`container` 这个元素,然后把由` react` 生产的内容补充到这个元素中, 相当于 jquery 那时候的` append`.

这个地方还用到了一个`JSX` 的东西, 它具体是什么呢, 就是我们在写 javascript 的部分通过一般普通的 html tag 写法来完成一个 component 的书写, 然后有专门的编译器会把它转化为 javascript. 详细[读这里](https://facebook.github.io/react/docs/jsx-in-depth.html)


###如何获取

有很多方法了. cdn, 官方的[start kit](), 或者 bower, 或者 npm.


### 贡献代码


### 下载编译 react

当前 react 完成基于 node 来完成编译的. 

#### 编译

```
# grunt-cli is needed by grunt; you might have this installed already
npm install -g grunt-cli
npm install
grunt build
```

最后在`build/` 文件中就是我们需要的 react 最终产物了.

基本上所有的日常工作都是有` grunt` 来完成的.
通过` grunt -h` 来查看更多.

```
# Build and run tests with PhantomJS
grunt test
# Lint the code with ESLint
grunt lint
# Wipe out build directory
grunt clean

```

另外

### Good first bug

可以让你了解如何贡献自己的代码整个流程,


### license

 代码采用 BSD, 文档是` Creative Commons licensed`.
Dockerで不要なコンテナとイメージを削除する

メモ

```bash
# 停止中コンテナの削除（起動中のコンテナはrmがエラーになるので細かいことを気にしなければこれで問題ない）
#docker rm $(docker ps -a -q)

# 停止中コンテナの削除（少し丁寧版？停止中のコンテナのみを削除）
docker rm $(docker ps -f status=exited -f status=created -f status=dead -f status=paused -q)


# 不要なイメージの削除（REPOSITORYが<none>の奴）
docker rmi $(docker images -f dangling=true -q)

# 最近のバージョンでは↓これでOK
docker system prune -a
```



# 今は prune で簡単にできる

```bash
# 停止中のコンテナや未使用ボリュームやイメージやネットワークを全部削除する
docker system prune -f

# 個別に削除したい場合は以下のようにすればOK
docker container prune -f
docker volume prune -f
docker network prune -f
docker image prune -f
```
ハンガリアン記法 メモ

# 注意

* ハンガリアン記法は一時期もてはやされていたが、現在は推奨されておらず、使用すべきではない。
* むしろ、多くの場合アンチパターン


# ハンガリアン記法とは？

* 変数名やクラス名などの識別子に、規則に則った接頭辞 (prefix) や接尾辞 (suffix) を付けるモノ。
* それらによって使用方法、型、スコープに関する情報を付け加える。
    * 例えば、文字列なら先頭に `s` を付けるとか、ポインターなら先頭に `p`, `lp` を付けるとか
* 多くの場合、型情報を接頭辞としてつける。
* 識別子を利用する側から、型など間違いがあることを視覚的に分かるようにすることを目的としていることが多い。


# なぜダメなのか？

## ソースコードの修正コストが上がる

* 識別子に型情報が直接的に入ることになるので、型を修正すると識別子を全ての使用箇所で修正しなくてはならない。
* 修正が追い付いていないと、実態とハンガリアンにズレが生じてきておかしなコードになる

## 命名測がしっかりしていれば、そもそも不要であり、むしろ冗長

* 本来識別子の名前は実態を正確に伝えるものであってほしいため、命名測がしっかりしていれば名前から型がおのずと決まるはずである。
* ハンガリアンがないと型が分からない場合は、命名方法がすでにおかしい可能性がある。

## そもそもハンガリアンを正確に覚えなければならない

* [ここ](https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%B3%E3%82%AC%E3%83%AA%E3%82%A2%E3%83%B3%E8%A8%98%E6%B3%95) や [ここ](https://ja.wikipedia.org/wiki/Leszynski%E5%91%BD%E5%90%8D%E8%A6%8F%E5%89%87) の一覧をパッと覚えられるならいいが・・・（私は無理でした）
* ハンガリアンは性質上、プリミティブ型の体系の異なる言語では変えないといけないので、言語の数だけ覚えなければならなくなる可能性がある。（JavaScript の Number みたいなのは面倒くさそうだ）


# ただ・・・

* 場合によっては必要な場合もある。
    * MFC や Win32 API では、ライブラリ側で利用されているため、故意に外すとそれはそれで一貫性を損なう。
* ただ、意味もなく（考えもせず）両手放しに利用していいものではない。
    * 『`goto` も必要な時もある』のと同じ様に、一定の技術レベルと、動機がないならやめておくべきだと思う。
* プロジェクト等のコーディング規約で既に決まっている場合はそれに従うべき。
* 有用なものもある
    * `C++` の `private` フィールドには `m_` を先頭につけるとか。


# ハンガリアン記法もどき

* ハンガリアンをハンガリアンだと認識して使っている場合はまだいいが、そうだと思っていない場合には注意が必要だと思う。

## `class` 名に `Class` とつける

* 何かの分類 (class) を取り扱う `class` でもない限りは使用すべきではない
* 少なくとも `class` であることを明示したいだけならば付けるべきではない

## 関数名に `Function` や `Command` を付ける

* 見ればわかる
* 関数名は『○○をする』と明記されているはずなので、そこに `Function` とつけるのは冗長。ほとんどの場合で何か処理を行うモノは関数以外にはあまり無いだろう。
* 関数に `Function` と付けても得られる情報はなにも増えない。


# 参考資料

* [ハンガリアン記法 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%B3%E3%82%AC%E3%83%AA%E3%82%A2%E3%83%B3%E8%A8%98%E6%B3%95)
crontabにおけるMAILFROM

# 結論

* RHEL/CentOS 6・7では使える
* Ubuntu 16.04 LTS / Debian Jessie では使えない
* 他のOSでは適宜cron実装とman crontabもしくはman 5 crontabで確認する

# 詳細

送信元メールアドレスを指定できるという機能で、ググると出てくることがある。

例: http://linux.die.net/man/5/crontab (2016-09-05時点)

> If MAILFROM is defined (and non-empty), it will be used as the envelope sender address, otherwise, ''root'' will be used.

(本当にrootなのか各ユーザからなのかは知らん)

ただ、自環境で使おうとして使えないということが多かった。

まずcron (crontab) と言っても千差万別。極端な安全寄りにはIEEE Std 1003.1あたりのcron仕様に準拠するもの以外は使えると見込めない、といった議論になるが、それだと概ね自分の環境で使えることが多いMAILTOもないため退行し過ぎという印象。

http://www.unix.com/man-page/posix/1p/crontab/

現実的にどこが分岐点かというと、Vixie cronと呼ばれる実装の4.1あたりのようだ。
Vixie cronは4.1でISC Cronとリネームされ、この４．１をベースにRHEL/CentOS系列 (Fedoraからだろうと思うが) 2007年に cronieというフォークを使うようになった。
上述のdie.netも「crontab - tables for driving cron (ISC Cron V4.1)」とある

> With the advent of the GNU Project and Linux, new crons appeared. The most prevalent of these is the Vixie cron, originally coded by Paul Vixie in 1987. Version 3 of Vixie cron was released in late 1993. Version 4.1 was renamed to ISC Cron and was released in January 2004. Version 3, with some minor bugfixes, is used in most distributions of Linux and BSDs.
>
> In 2007, Red Hat forked vixie-cron 4.1 to the cronie project and included anacron 2.3 in 2009.

(https://en.wikipedia.org/wiki/Cron)

ここで「自分の環境で使えない」理由はこの一文「Version 3, with some minor bugfixes, is used in most distributions of Linux and BSDs.」にある。
Vixie cron 3系を維持しているDebian/Ubuntu系統ではMAILFROMは存在しない。
Debianではsidレベルでもそうなので、何かの理由で4.1系統に移行しない理由があるのだろう (ライセンスや安定性だろうか。ここまでは流石に興味はない)

https://packages.debian.org/ja/sid/cron (2016-09-05時点で「パッケージ: cron (3.0pl1-128 など)」)

MAILFROMが重要かと言われればそんなことはないので調べ物はここで終わりにしとく。
Rundeck等の代替もある状況でもあるしcrontabは地雷源でもあるのでむしろcrontab自体を使うべきなのか自体から本当は考えたいところ。
vSphere Web Clientのクライアント統合プラグインのダウンロード

# 概要

vCenter 6.0までのvSphere Web Client用のクライアント統合プラグインのインストーラダウンロードURLについて。

# 詳細

vCenter 6.0までのvSphere Web Client利用時には[クライアント統合プラグインをインストール](https://pubs.vmware.com/vsphere-60/index.jsp?topic=%2Fcom.vmware.vsphere.upgrade.doc%2FGUID-CA16F78B-7890-4357-9760-AF8648806FE7.html)する必要がある。

通常の手順ではインストーラはインターネットから取得されるので、インストール対象環境がインターネット接続できない時は、あらかじめインストーラを取得しておく必要がある。インストーラの取得先は以下のナレッジに記載されている。

* [Upgrading VMware Client Integration Plug-in to the latest version (2145066) | VMware KB](https://kb.vmware.com/kb/2145066)

なお、vCenter 6.5では「[VMware拡張認証プラグイン(VMware Enhanced Authentication Plug-in)](https://docs.vmware.com/jp/VMware-vSphere/6.5/com.vmware.vsphere.vm_admin.doc/GUID-E640124B-BB55-4D29-AADD-296E01CF88C8.html)」で置き換えられている。

## 現時点での取得用URL

2018年5月14日時点では下記URLになる。

* vCenter Server 5.5:
    * For Windows: http://vsphereclient.vmware.com/vsphereclient/VMware-ClientIntegrationPlugin-5.6.0.exe
    * For Mac: http://vsphereclient.vmware.com/vsphereclient/VMware-ClientIntegrationPlugin-5.6.0.mac64.dmg
* vCenter Server 6.0:
    * For Windows: http://vsphereclient.vmware.com/vsphereclient/VMware-ClientIntegrationPlugin-6.0.0.exe
    * For Mac: http://vsphereclient.vmware.com/vsphereclient/VMware-ClientIntegrationPlugin-6.0.0.mac64.dmg
how to install tig

Download a tarball from http://jonas.nitro.dk/tig/releases or clone the Tig repository git://github.com/jonas/tig.git.

NB: Do not use tig-2.0.tar because it will fail to compile due to these issues https://github.com/jonas/tig/pull/283 and https://github.com/jonas/tig/issues/337

The quick and simple way to install Tig is:

$ make
$ make install
By default, tig is installed in $HOME/bin. To install tig elsewhere set prefix to the desired path:

$ make prefix=/usr/local
$ sudo make install prefix=/usr/local
Documentation files, such as manpages, are distributed in t
React组件定义和生命周期



`React`其实从目前的了解来看,我理解的它核心的东西就是一个`虚拟 DOM` 的概念, 通过修改虚拟 DOM 来刷新用户最终看到的 UI.

### 组件定义

通过` React.createClass()`我们就可以得到` react` 它的核心 -- 组件. 而对于这个组件, 它在 react 里如何定义, 以及它的生命周期. 下面我们展开讨论.

调用` createClass()`方法,需要传递一个对象, 这个对象必须包含一个` render()` 方法, 还有一切其他的生命周期方法.

	
	其实一个所谓`组件`,它就是一个`对象`, javascript 世界里的`对象`, 也就是我们常见的 hash.<sup>[1]</sup> 它必须包含一个` render` 方法, 同时可以有其他可选的生命周期方法. 
	
	[1], 其实这样的表示有些误差, 目前我们可以通过 es5,或者 es2015(es6)不同的语法来写这个 class, 但是终归它在跑之前还是要编译到 es5的语法里, 也就是各种 hash 的集合罢了.
	
	
####render

> ReactElement render()

这是一个必选的方法. 当它被调用的时候, 它会验证`this.props` 和`this.state`, 然后最终返回一个单一子元素. 这个子元素可以是原生 DOM 的虚拟展现形式(如<div/> 或者 React.DOM.div()), 也可以是我们自定义的复合的元素组件.


也可以返回一个 null 或者 false 来表明什么都不用渲染. 其实对于 React 它背后做的就是渲染一个`<noscript>`tag 来完成当前我们差分的逻辑. 当返回 null 或者 false 的时候 ReactDOM.findDOMNode(this)就会返回` null`.

这个`render()`函数必须是` pure` 什么意思呢, 不会去修改组件的状态,每次都应该返回同样的结果. 而且它不能够读取或者修改 DOM, 除非和当前浏览器发生交互. (如使用 setTimeout())当如果有这样的需求时最好使用` componentDidMount()`这样的方法或者生命周期里的其他方法,尽量保持` render()` 这个方法的纯洁性,


#### getInitialState

>object getInitialState()

在组件挂载之前被调用.主要是初始化`this.state`.

#### getDefaultProps
>object getDefaultProps()

只调用一些用来创建实例化这个类, 接着就会缓存起来这个. 所有属性都被 map 到` this.props`. 这个方法在创建实例之前调用, 然后所有实例共享当前的属性.

#### propTypes

>object propTypes

这个对象允许我们能够验证组件的属性在赋值给组件前

#### mixins

> array mixins

这个数据包含一些共享的方法可以用来在多组件间重用

#### statics

>object statics

这个使用声明一些静态函数的. 这样就能够直接在组件类上使用.

```
var MyComponent = React.createClass({
  statics: {
    customMethod: function(foo) {
      return foo === 'bar';
    }
  },
  render: function() {
  }
});

MyComponent.customMethod('bar');  // true
```

#### displayName

>string displayName

在 debug 的时候使用这个字符串. JSX 会自动 set 这个值.


### 生命周期方法

看看他具体生命周期方法:

#### 挂载 componentWillMount

>void componentWillMount()

#### 挂在完成 componentDidMount

>void componentDidMount()

#### 更新 componentWillReceiveProps

>void componentWillReceiveProps

#### 更新 shouldComponentUpdate

> boolean shouldComponentUpdate()

#### 更新 componentWillUpdate

>void componentWillUpdate()

#### 更新 componentDidUpdate

>void componentDidUpdate()


#### 卸载 componentWillUnmount


>void componentWillUnmount()
Dockerで起動したCentOS6.8 apache2.2 PHP5.3から S3をNFSっぽくマウントして利用する

ふつーはここでコンテナとして立ち上げたNFSServerに（以下略

今回も理想は理想として、現実に立ち向かっていかねばなりませんので進めます。
願わくばこのニッチなノウハウが誰かの役に立ちます様に。

マウントにはs3fsより速いらしいgolang製のgoofysを使います。

https://github.com/kahing/goofys


本当は信頼と実績のs3fsを使いたかったんですが、CentOS6.8ではどうしてもビルドできなかったというのが裏事情。
s3fsが要求するfuseを用意するのがどうにも手間なんですよね。
ソリューションをお持ちの方は教えてプリーズ。
てか、使えるならcentos7つかうべきなんだろうな〜。


では毎度おなじみDockerfile

```sh:Dockerfile
FROM centos:6.8
MAINTAINER furuyamah <furuyamah@isao.co.jp>

# 必要なものをインストール
# CentOS6.8のPHPは5.3なのでそのまま使う
# CentOS6.8のMySQLは5.1なので5.5をremiから入れる
# この辺はgoofys単体にはおそらく不要
RUN yum update -y && \
    rpm -ivh http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm && \
    rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm && \
    yum install -y --enablerepo=remi mysql compat-mysql51 && \
    yum install -y gcc ImageMagick-devel curl-devel && \
    yum install -y \
        httpd \
        httpd-devel \
        httpd-tools \
        php \
        php-cli \
        php-common \
        php-dba \
        php-devel \
        php-gd \
        php-mbstring \
        php-mcrypt \
        php-mysql \
        php-pdo \
        php-pear \
        php-pecl-apc \
        php-pecl-memcache \
        php-xml \
        php-xmlrpc && \
    pecl clear-cache && \
    printf "\n" | pecl install imagick-3.1.2 && \
    printf "\n" | pecl install pecl_http-1.7.6

# goofysに必要なものをインストール
RUN yum install -y golang fuse git syslog && \
    export GOPATH=$HOME/go && \
    go get github.com/kahing/goofys && \
    go install github.com/kahing/goofys && \
    mkdir /root/.aws
#AWSアクセスのためのキー
COPY credentials /root/.aws/credentials

WORKDIR /var/www
COPY docker-entrypoint.sh /docker-entrypoint.sh
ENTRYPOINT ["/docker-entrypoint.sh"]

EXPOSE 80
```

続いて実行されるdocker-entorypoint.sh


```:docker-entrypoint.sh
#!/bin/bash
set -e

# mount S3
# syslogd needs to running goofys in background.
/etc/init.d/rsyslog start
mkdir -p /mnt/s3/mount_point
/root/go/bin/goofys [S3のバケット名] /mnt/s3/mount_point -o allow_other,--file-mode=0666,--dir-mode=0777

# start httpd
/etc/init.d/httpd start

tail -f /dev/null
```

今回もバックグラウンドでsyslogdとgoofysを起動しています。
syslogdをあげているのは、goofysをバックグラウンドで起動するために必要なためです。
また、このままだと速攻でコンテナが終了するのでそれを防止するためにtailしています。
こんなんばっかだ...


```docker-compose.yml
apache-php:
  build: ./apache-php
  ports:
    - "80:80"
  volumes:
    - "../pub:/var/www"
  links:
    - memcached
  privileged: true
  cap_add:
    - SYS_ADMIN
    - MKNOD
  devices:
    - "/dev/fuse"

memcached:
  image: memcached:1.4
```

fuseを使うサービスのために、privileged,cap_add,devicesを追加しています。おまじない。


### ディレクトリ構成

AWS用のaccesskey格納ファイルが増えています。

```
project_dir
+- docker-compose.yml
+- apache-php
    +- Dockerfile
    +- credentials
```


### 起動

```sh
docker-compose up -d
```

### 停止

```sh
docker-compose stop
docker-compose rm -f
```



参考になれば。
Sidekiqで使うRedisの指定方法

Sidekiqで使うRedisの指定方法を、忘れる前にメモ。

```ruby
Sidekiq.configure_server do |config|
  config.redis = {
    'url' => 'redis://localhost:6379/5'  # /5はデータベースの番号
  }
end

Sidekiq.configure_client do |config|
  config.redis = {
    'url' => 'redis://localhost:6379/5'  # /5はデータベースの番号
  }
end
```

Redis Sentinelを使う場合

```ruby
Sidekiq.configure_server do |config|
  config.redis = {
    'url' => 'redis://mymaster/5',
    'sentinels' => {
      [ host: 'foo.example.com', port: 26379 ],
      [ host: 'bar.example.com', port: 26379 ],
      [ host: 'baz.example.com', port: 26379 ]
    }
  }
end

Sidekiq.configure_client do |config|
  config.redis = {
    'url' => 'redis://mymaster/5',
    'sentinels' => {
      [ host: 'foo.example.com', port: 26379 ],
      [ host: 'bar.example.com', port: 26379 ],
      [ host: 'baz.example.com', port: 26379 ]
    }
  }
end
```

Namespace (redis-namespace)を使う場合:

```ruby
Sidekiq.configure_server do |config|
  config.redis = {
    'url' => 'redis://localhost:6379/5',
    'namespace' => 'mynamespace'
  }
end

Sidekiq.configure_client do |config|
  config.redis = {
    'url' => 'redis://localhost:6379/5',
    'namespace' => 'mynamespace'
  }
end
```
[JavaScript]Devウェブ画面キャプチャーするライブラリー(wsc)を構築して見ました。

##**wscとは**
wsc(web screen capture)とはウェブの画面をキャプチャーして画像をダウンロードするライブラリーです。
（ライブラリーと呼ばれるレベルではないので、恥ずかしいですが・・・^ㅁ ^;）
先日、 ちょっと暇だったので、一つのライブラリーを構築してnpmに登録してみました。

##**概要**
それぞれのOSから提供しているキャプチャー機能があり、
素晴らしいツールを提供している画面キャプチャーのアプリケーションもたくさんあるんですが、
特にSWやPluginの設置がいらないし、どんどん自分が機能を追加して拡張できるので、構築しました。

##**・Ver.0.0.1の機能**
①現在のウェブ画面をキャプチャーリストに追加
②画像が欲しい他のウェブ画面をキャプチャーリストに追加
③キャプチャーリストに欲しい画面の画像をダウンロード
※ 現在のバージョンでは、XMLHttpRequestを通じて処理されているので、同じドメインしかできません。
今度、必要性によってCORS(Cross-origin resource sharing)を活性化させるように対応します。

詳しい使い方は🔗こちらをご参考してください。（まだ準備中）

##**・リマインダー**
このライブラリーの構成は以下の通りものすごく簡単です。
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/ae8a4872-9030-4549-3a2f-df5711fa91e9.png)

しかし、最初は、以下のようにnode.jsのCLIで開発しようと思いました。
開発者の方も利用者の方もお互いにWINWINできますね〜
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/add4e6c4-415d-4081-4f95-d0e2803f4f88.png)


しかし、色々問題が発生されました。

#####**問題 ① webpackのバインディングできない**
nodejs用で実行ファイル、CLIを立ち上げるためには、一番上に`#!/usr/local/bin/node`のラインが必要です。
しかしwebpackでバインディングすると、シンタクスエラーが発生されます。
しかもES6の部分をBabel-loaderのtransform compilerでコンパイルしてるんですが、
transform compileにもシンタックスエラーが発生されます。
結局shell scriptでコンパイルが終わったら一番上にコードを追加する方式で対応しました。

#####**問題 ② html2canvasライブラリーのパラメータを作れない**
html2canvasでウェブ画面をキャプチャーするため2つのモジュールを使いました。
特定ウェブのHTTPデータをScrapingする`request`モジュールと
Scrapingしたデータを簡単に接近できる`cheerio`モジュールです。
しかし、html2canvasでhtml要素を画像化するために必要ソースは
httpのデータ(String)ではなく、実際のhtml要素(Object)が必要らしいでした。
まだしっかり理解できなかったので、説明はできませんが、
そもそも画像化される構成を理解する必要がありました。

##**・次の課題**
課題①、なぜCLIのrequestモジュールは基本的にCORS(Cross-origin resource sharing)が活性化されているのかを調査
課題②、CORS(Cross-origin resource sharing)を活性化して他のドメインのウェブをScraping出来るように調整
課題③、画面をキャプチャーするまえ、画面の画像の確認画面と画像の上にテキストや矢印などを付けるツールを追加

##**まとめ**
今回は、html2canvasライブラリーを利用しましたが、GrountでBuildが必要なので、ドキュメントをちゃんとみてください。
また、webpackでのCLIは、結構辛いです。
案件のものではなく自分のスキールアップ及びリマインダーの記事でございます。（初心者ぽいなコードで格好わるいので恥ずかしいです；；；）
しかし、どんどん拡張して、よく利用されるように頑張りたいと思います。
ITサービスマネージャー 2013年度午後２　問２

#始めに
ＩＴサービスマネージャーの午後２の論文についてあれこれ書いてみようと思います
対象のシステムは[生命保険会社のシステム](http://qiita.com/triple4649/items/56d2b450f2b8b68bdfe5)をベースにしています

#問題文の解析する
![image](https://qiita-image-store.s3.amazonaws.com/0/136860/94bdf725-6a8e-5663-6f9a-32783a657b87.png)

#外部委託業務の具体例を考える
![image](https://qiita-image-store.s3.amazonaws.com/0/136860/7704a34b-5352-491b-adb2-c028473e62b7.png)

#[顧客や利用者に対するITサービスの品質に影響を与える]とは？
具体的に考えてみる

##顧客や利用者に対するITサービスの品質とは？
サービス要求のことだろうか？

##ITサービスの品質に影響を与えるとは?
「サービスレベル(SLA)が未達になったため、サービス要求が満たされない」ということを記述すればよいのだろうか？
例えば
「可用性が満たされないため、顧客満足度を達成することができなった」
論文を書くときは
「可用性」、「顧客満足度」を具体化する


#参考サイト

- [システム運用管理からITサービスマネジメントへ ― ITIL活用のすすめ - CAC ](https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=ITIL+%E5%A4%96%E9%83%A8%E5%A7%94%E8%A8%97)

- [［運用管理編］運用を丸投げにして安心してはいけない](http://itpro.nikkeibp.co.jp/article/COLUMN/20090902/336389/)

- [塩野義製薬株式会社におけるITILを礎とし たIT運用成熟度向上へ ... - Fujitsu](https://www.fujitsu.com/jp/documents/services/business/it-consulting/itil/article/vol56-5_paper09.pdf)

- [ITIL®の導入で効率的な運用を実現 - 日立製作所](http://www.hitachi.co.jp/Prod/comp/soft1/events/report/omw_200711/pdf/c-1.pdf)

- [「情報システム運用時の定量的信頼性向上方法」 に関する調査報告書](https://www.ipa.go.jp/files/000045091.pdf)
RESTful APIとは何なのか



# RESTful APIとは

RESTの原則に則って構築されたWebシステムのHTTPでの呼び出しインターフェースのこと。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/23101/1a93b788-14fb-576e-486c-e987d4399a70.png)
# RESTとは
REpresentational State Transferの略で、分散型システムにおける複数のソフトウェアを連携させるのに適した設計原則の集合、考え方のこと。Roy Fieldingが2000年に提唱した。
また、RESTを語るうえで避けては通れない「リソース(リソース指向アーキテクチャ(ROA))」という概念があるが、これは「[リソース指向アーキテクチャとは何なのか](http://qiita.com/NagaokaKenichi/items/0f3a55e422d5cc9f1b9c)」に投稿したのでそちらを参照していただきたい。

# RESTの原則

主に以下の4つの原則から成る。

* アドレス可能性(Addressability)
    * 提供する情報がURIを通して表現できること。全ての情報はURIで表現される一意なアドレスを持っていること。
* ステートレス性(Stateless)
    * HTTPをベースにしたステートレスなクライアント/サーバプロトコルであること。セッション等の状態管理はせず、やり取りされる情報はそれ自体で完結して解釈できること。
* 接続性(Connectability)
    * 情報の内部に、別の情報や(その情報の別の)状態へのリンクを含めることができること。
* 統一インターフェース(Uniform Interface)
    * 情報の操作(取得、作成、更新、削除)は全てHTTPメソッド(GET、POST、PUT、DELETE)を利用すること。

詳細は[リソース指向アーキテクチャとは何なのか](http://qiita.com/NagaokaKenichi/items/0f3a55e422d5cc9f1b9c)を参照。

# RESTful APIを使うメリット

1. URIに規律が生まれることで、APIを利用するサービス開発者が楽になる
2. URIに規律が生まれることで、API開発者もURIからソースのどの部分なのかが容易にわかる
3. ブラウザのアドレスバーにURIを入力すればリソースが参照できる
4. サーバ、クライアント間で何も共有しないことにより、負荷に応じたスケーラビリティが向上する。ステートレス性に値するもので、一番のメリットされている。
5. GET、POST、PUT、DELETE等のHTTP標準のメソッドを使うことで、シンプルで一貫性のあるリクエスト標準化が円滑に行える。統一インターフェースに値する。

# RESTful APIとREST APIの違い
RESTful API、REST APIと呼び方があるが、広義ではほぼ同じと考えて問題ない。

# 参考
[RESTful Webサービス](https://www.amazon.co.jp/RESTful-Web%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9-Leonard-Richardson/dp/4873113539)
[WEB+DB PRESS Vol.82](http://gihyo.jp/magazine/wdpress/archive/2014/vol82)
http://d.hatena.ne.jp/LukeSilvia/20091025/p1
[Web APIとは何なのか](http://qiita.com/NagaokaKenichi/items/df4c8455ab527aeacf02)
[RESTに対する７つの誤解](http://www.sakimura.org/2011/11/1289/)
Quantum Chemistry - Particle in a Box Wavefunction Plots

関連 http://qiita.com/7of9/items/d3a1799928734375f34f

CG分野で使われるSpherical Harmonics。自分の数値シミュレーション計算に用いたいと思い調べると、量子化学の講義にたどり着く。

短く分かりやすそうな159本のビデオを少しずつ消化中。

Quantum Chemistry - Particle in a Box Wavefunction Plots
https://www.youtube.com/watch?v=3p9jHJYCjII&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh&index=18

- [前回](http://qiita.com/7of9/items/c63d30f58e5f16d746d0)求めた式をdesmosで見てみる
- https://www.desmos.com/calculator/zqo7bncevb
- P(x)
  - wave function
  - 前回求めた式
  - 青の線
- D(x)
  - |プサイ(x)|^2の式
  - probability density function
  - 紫の線
- En
  - energy of the wave function
  - 緑の破線
- ヴィー(x)
  - potential energy
- xavg
  - 粒子の位置の平均値(average)
- xrms
  - 粒子の位置のroot mean square値
  - (補足) rmsは分かるがxrmsを求める意味は不明
- nの値の変化を見る
  - エネルギーの増加 (緑の破線の変化)
  - 波の数の増加
- Lの変化
  - 波長と振幅の変化
- m(mass)の変化
  - wave functionには影響しない
  - エネルギーに影響する
- hの変化
  - エネルギーに影響する
Quantum Chemistry - Normalization

関連 http://qiita.com/7of9/items/d3a1799928734375f34f

CG分野で使われるSpherical Harmonics。自分の数値シミュレーション計算に用いたいと思い調べると、量子化学の講義にたどり着く。

短く分かりやすそうな159本のビデオを少しずつ消化中。

Quantum Chemistry - Normalization
https://www.youtube.com/watch?v=EK6C6mpxP-g&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh&index=17


- 左上のグラフ (紫の線)
  - プサイ3(x)のグラフ
  - n=3の時のwave function
- その右のグラフ (ピンクの線)
  - |プサイ3(x)|^2のグラフ
  - probability density function
  - 粒子が存在する確率
- 緑の式
  - [前回](https://www.youtube.com/watch?v=uK60QAKooyM&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh&index=16)得られた式
- 紫の式
  - エネルギーの式
  - n=1,2,...
- Bをどうやって導出するか?
- 黄色の式
  - xからx+dxの間の粒子の存在確率
- 水色の式
  - 確率なので、領域全部で積分した時は1となる
  - Normalization
- オレンジの式
  - xが0以下、xがエル以上の時、プサイ(x)は0
  - この領域では粒子は存在しない (Box model)
- 右上の緑の式
  - 領域0からエルで積分をした値が1となる
  - プサイの定義 (左の緑の式)を代入した
  - ここでBsin()の複素共役(*付き)は、Bsin()に虚数単位iがついていないので、Bsin()となる
  - 紫の式が得られる
- ピンクの式
  - 三角関数の関係式
  - (補足) cos(2kx)を加法定理で展開して式変形すると得られる
  - この式を使って紫の式を変形したのが黄色の式となる
- 水色の式
  - 黄色の式の積分
  - 1項目は1の積分なのでxとなる
  - 2項目は-cos()の積分なので-sin()となり、内部のxにかかる値の逆数が係数となる
- オレンジの式
  - 積分にてエルと0を代入した
  - sin(2pi n)はつねに0
  - sin(0)は0
  - これらにより右辺の値はエルとなり、紫の式となる
- 緑の式
  - 紫の式から整理した値
  - Bが求められた
- ピンクの式
  - 左側の緑の式にBの値を代入した
- Bのことをnormalization constantと言う
技術英語 > Code reuse [hindered] by global data. > Code reuse is hindered by global data.

@ Code Complete (No. 11314 / 36077)
> Code reuse <font color=red>hindered</font> by global data.

文法的におかしい気がする。

Code reuse is hindered by global data.
が正しいかと。

http://eow.alc.co.jp/search?q=hinder
> 〔計画・仕事などの進行の〕妨げになる、邪魔になる
reducer の ノーマライゼーション

## 本来は実体を配列で保持するようなケースを、次のような構成に分ける
`reducer`が返すある状態を、**全体を保持するオブジェクト**と、**全体の各IDを保持する配列**に分ける。
全体を保持するオブジェクトのキーを指定して実体を手に入れる。まとまりをそのまま処理する場合は、全体の各IDを保持する配列に`map()`を適用し、必要な実体のリストを手に入れる。

## なぜ、こうするのか
redux のアプローチでは、情報を管理するストアはトップレベルに一つだけある。そしてこのストアは意味のあるデータの塊ごとに reducer を作成し、必要に応じて `combineReducers` することで合成することができる。擬似的には

```js
Store: {
 Products :: array,
 Cart :: array,
}
```

のような感じで、配列を使って表される。
アプリケーションを少し機能的にしようとするとすぐに、ProductsとCartの情報を組み合わせて何かしたくなるだろう。

```js
Products : [
  {
    id,
    price,
  },
]    

Cart: [
  {
    productId,
    quantity,
  },
]
```

Cartに入っているある商品の数量と、Productsで定めている価格から小計をコンポーネントで出したい時などが、それにあたる。
このような場合どうすれば良いのか。

### 情報をネストさせる
CartのプロパティにProductsのエンティティそのものを含めてしまったらどうだろうか。
これなら、Cartだけの情報で、小計の計算が可能になる。

```js
Cart: [
  {
    product: {
      id,
      price,
    },
    quantity,
  },
]
```

しかし、この方法では本来独立させておきたいProductとCartの情報をネストさせてしまうことで、構造が冗長かつProducts関連のアクションで対応すべきReducerの数が増えるので、場合によっては複雑になってしまうかもしれない。

[参考：How to create nested reducers? ](https://github.com/reactjs/redux/issues/316)

また、`ProductId = 1`の小計を出したいという状況では、その都度Cartの配列を走査して該当するものを抽出するというプログラムを書かなくてはならない。少々不便である。

### 情報をノーマライズする
上の例は、端的に言えば、

`小計 = Products[id].price * Cart[productId].quantity` とできたらそれで良い。情報をネストする必要もないのでシンプルさを保ったまま欲しい結果を手に入れることができる。これを実現するには、ProductsとCartのそれぞれを配列ではなくオブジェクトとして管理すれば良い。また、オブジェクトでは扱えない要素の順序関係については、別途要素のIDだけを保持する配列を用意する。

つまりこうなる。

```js:擬似ストア
State {
  Products: {
    byId: {
      1: {
        id: 1,
        price: 20,
      },
    },
    Ids: [
      1,
    ]
  },

  Cart: {
    byProductId: {
      1: {
        productId: 1,
        quantitiy: 20,
      },
    },
    productIds: [
      1,
    ]
  }
}

```

```js:小計が必要なコンテナコンポーネント内で
//商品IDが1の小計を返す関数
const getSubTotal = (state, id) => {
  const { Products, Cart } = state;
  return Products[id].price * Cart[productId].quantity;
}
```


[参考: Redux nested reducers or normalize state?](http://stackoverflow.com/questions/35572480/redux-nested-reducers-or-normalize-state)

## API
ある状態を管理する reducer が実装すべきAPIは次のようなものになる。

### reducer
#### xxxById :: (state = {}, action) => state

key に ID を持ち、value に実体を持つようなプロパティで構成されたオブジェクト。
通常は 配列 で保持するような情報を、`ByID[ID]`という形でDBのようにアクセスするため、オブジェクトで情報を保持している。

#### yyyIds :: (state = [], action) => state

あるオブジェクトの key のリスト。

### selector
#### getXxx :: (parentState, ID) => {}

xxxの実体を取得するための selector 。これを使う側は、xxxを手に入れるための具体的な実装を知る必要がない。実装では、`parentState.Xxx`から目的のオブジェクトを取得する。APIとして公開する。

#### getYyyIds :: parentState => []

リストを取得するための selector 。実装では、`parentState.YxxIds`を返却する。APIとして公開する。

## 親reducer
は階層構造を持てるので、任意のレベルでまとめ役としてのreducer（親reducerと呼ぶ）を持てる。親reducerでは、下位のreducerによって公開されたselectorを利用し、コンテナコンポーネント向けのAPIを公開する。このAPIは、UIインタラクションなどで渡されたID情報を活用しながら、下位のreducerで生成された各状態の関連を取りながら目的のデータを構築する。
MacDownのビルド



##ダウンロード先
http://macdown.uranusjr.com


##ソースコード
https://github.com/MacDownApp/macdown


##準備
1.GitHub Desktopをインストールしておく
https://desktop.github.com

$git --version
git version 2.7.4 (Apple Git-66)

2. cocoapodsをインストールしておく

3.Ruby Gemでbundlerをインストールしておく

##ビルド（macdownのフォルダでターミナル）
git submodule init
git submodule update
bundle install
pod install

※githubでは以下であるが、これではエラーになる。
bundle exec pod install

##xCodeでMacDown.xcworkspaceを開く
![スクリーンショット 2016-09-05 1.57.09.png](https://qiita-image-store.s3.amazonaws.com/0/139561/c178fd66-42e8-e0be-9be9-1cb368dc2e97.png "スクリーンショット 2016-09-05 1.57.09.png")


xCodeでビルドすると、以下のエラーが発生する
-fobjc-arc is not supported on versions of OS X prior to 10.6

MASPreferences-dummy.mに以下を設定
-fno-objc-arc
![スクリーンショット 2016-09-05 2.00.41.png](https://qiita-image-store.s3.amazonaws.com/0/139561/a3b9e1e6-2bae-358e-6ad0-4e48dee36d08.png "スクリーンショット 2016-09-05 2.00.41.png")

##実行
![スクリーンショット 2016-09-05 2.09.34.png](https://qiita-image-store.s3.amazonaws.com/0/139561/4485fda8-fa18-7afb-e044-dd8bdfb772ad.png "スクリーンショット 2016-09-05 2.09.34.png")
[Hyperledger fabric] init時に他のChaincodeのworld state (KVSの中身)を引き継ぐ

一応 [gist](https://gist.github.com/kkoiwai/d07311d040b7be5476b50d73662e994b)にも張っておいた。

仕組みは簡単。

* KVSの全ての値の組み合わせをjsonで返す関数 get_all を実装しておく。
* initの引数に、chaincodeのハッシュ値が指定されたら、そのchaincodeのget_allを呼び出し、KVSにコピーする。
* 今の時点では古いchaincodeを無効にするとかそういうことは省略。


これで途中でchaincode書き換えたいってことになっても大丈夫。

なお、jsonの読み書きに際しては[golang は ゆるふわに JSON を扱えまぁす!](https://www.kaoriya.net/blog/2016/06/25/)をめっちゃ参考にさせていただきました。

いろいろ自信ない部分がいっぱいなので突っ込み求めて晒しておきます。
## get_all関数

```migrate_worldstate.go
func (t *SimpleChaincode) Query(stub *shim.ChaincodeStub, function string, args []string) ([]byte, error) {
  if function == "get_all" {
		if len(args) != 0 {
			fmt.Printf("Incorrect number of arguments passed"); return nil, errors.New("QUERY: Incorrect number of arguments passed")
		}
		return t.get_all(stub)
	}
	return nil, errors.New("QUERY: No such function.")
}

func (t *SimpleChaincode) get_all(stub *shim.ChaincodeStub) ([]byte, error) {

	var tupples [][]string

	keysIter, err := stub.RangeQueryState("", "~")
	if err != nil {
		return nil, errors.New("Unable to start the iterator")
	}

	defer keysIter.Close()

	for keysIter.HasNext() {
		key, val, iterErr := keysIter.Next()
		if iterErr != nil {
			return nil, fmt.Errorf("keys operation failed. Error accessing state: %s", err)
		}
		tupple := []string{ key , string(val) }
		tupples=append(tupples, tupple)

	}

	marshalledTupples, err := json.Marshal(tupples)
	return []byte(marshalledTupples), nil
}
```

## init部分

```migrate_worldstate.go
func (t *SimpleChaincode) Init(stub *shim.ChaincodeStub, function string, args []string) ([]byte, error) {

  if len(args) == 1 {
		// migrate from old chaincode. args[0] should have chaincode address
		val, err := stub.QueryChaincode(args[0],"get_all", []string{} )
		if err != nil {
			return nil, errors.New("Unable to call chaincode " + args[0])
		}
		
		var states interface{}
		err = json.Unmarshal(val, &states)
		if err != nil {
			return nil, errors.New("Unable to marshal chaincode return value " + string(val))
		}
		
		for _, stateIf := range states.([]interface{}){
			state := stateIf.([]interface{})
			stateKey := state[0].(string)
			stateVal := state[1].(string)
			if stateKey == "" {
				return nil, errors.New("Unable to PutState: missing statekey [ " + stateKey +" , "+ string(stateVal) + " ]")
			}
			err = stub.PutState(stateKey, []byte(stateVal))
			if err != nil {
				return nil, errors.New("Unable to PutState [ " + stateKey +" , "+ string(stateVal) + " ]")
			}
		}
	}
	
	return nil, nil
}
```
Muninで外部サーバーを監視した際の備忘録

中途半端な調べ方をして無駄に詰まってしまってたので、備忘録として。

## 環境

### 監視元サーバー（VirtualBox）
```bash
OS
$ cat /etc/redhat-release 
CentOS Linux release 7.2.1511 (Core) 

apache
$ httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built:   Jul 18 2016 15:30:14
```

### 監視先サーバー（VPS）
``` bash
OS
$ cat /etc/redhat-release                                                             
CentOS Linux release 7.2.1511 (Core) 

nginx
$ nginx -v
nginx version: nginx/1.11.3

php-fpm
$ php-fpm -v                                                                          
PHP 7.0.9 (fpm-fcgi) (built: Jul 20 2016 17:59:09)

mariaDB
$ mysql --version                                                                     
mysql  Ver 15.1 Distrib 10.1.17-MariaDB, for Linux (x86_64) using readline 5.1
```


## 手順

・まずは下記参考サイトを参考に監視元サーバーのみで検証を行い、データが取得できるか試す。
http://www.server-memo.net/server-setting/munin/munin-install.html

・ここを参考に監視元サーバーのApacheとMySQL(MariaDB)の項目を追加してみたりするテスト。
http://d.hatena.ne.jp/yk5656/20140529/1402822603

・監視先サーバー追加まわりの設定を行う。
http://tech.basicinc.jp/munin/2013/08/11/munin_nginx_php-fpm/

・ポート開放はfirewalldのサービスにmunin-nodeを追加でOK。
munin-nodeインストール時にserviceとして追加されているはず。

```bash
$ sudo firewall-cmd --zone=public --add-service=munin-node --permanent
$ sudo firewall-cmd --reload
```

・グラフをクリックしまくって最大画面にした際、グラフが表示されなくなる不具合に遭遇すると思うので、下記サイトを参考に対処する。
http://d.hatena.ne.jp/pospome/20130221/1361447896
React, Redux, redux-saga, Immutable.jsで悩んだ部分メモ

###### ※随時更新

# 前提
- React
- Redux
- react-redux
- redux-saga
- redux-actions
- Immutable.js


# メモ
## redux-sagaでforEachを使うような処理をしたい場合

```js
import Range as range from 'immutable';
```

```js
// これでも良いのですがネストを深くしたくなかったのとcallbackはアロー関数で統一したいと思いました
function *foreachSaga() {
  range(1, max).forEach(function* (num) {
       yield call(generatoFunc, num); 
    }
  );
}
```

↓

```js
// mapを使いyieldに配列でわたす
function *mapSagaCall() {
  yield range(1, num)
    .map((num) => call(generatoFunc, num, body))
    .toArray();
}

// yield*を使うパターン
function *mapSagaAsterisk() {
  yield* range(1, num)
    .map((num) => generatoFunc（num, body))
    .toArray();
}
```


## Immutable.jsで対象がimmutableなデータかどうかチェックする

```js
const { Iterable, Map } = 'immutable';

Iterable.isIterable({}); // false
Iterable.isIterable('hoge'); // false
Iterable.isIterable(Map({})); // true
Iterable.isIterable(Map({xxx: 'xxx'})); // true
```


## ReduxのbindActionCreatorsでdispatchに関連付けてconnectでmapDispatchToPropsしたactionをそのままonClick等に指定したら以下のようなエラーがでました

クリックしてから実行されるまでも少し時間がかかっていました

```
Warning: This synthetic event is reused for performance reasons. 
If you\'re seeing this, you\'re %s `%s` on a released/nullified synthetic event. 
%s. If you must keep the original synthetic event around, use event.persist(). 
See https://fb.me/react-event-pooling for more information.
or
This synthetic event is reused for performance reasons. 
If you\'re seeing this, you\'re adding a new property in the synthetic event object. 
The property is never released. See https://fb.me/react-event-pooling for more information.
```

```js
// App.jsx
class App extends Component {
  render() {
    return <Content {...this.ptops} />;
  }
}

function mapStateToProps(state) {
  return {
    xxx: state.hoge,
  };
}

function mapDispatchToProps(dispatch) {
  return {
    action: bindActionCreators(Action, dispatch),
  };
}

connect(
  mapStateToProps,
  mapDispatchToProps,
)(App);
```

```js
// Content.jsx
function Content({ action }) {
  return (
    <div>
      <button onClick={action.update}></button>
    </div>
  );
}
```

↓

何故治ったのか根本的ところではわかっていないですが関数を作って中で実行したらWarningも出なくなり速度も改善されました。actionの引数にeventが渡されているのが余り良くなかったんだろうぐらいの認識です

```js
function Content({ action }) {
  return (
    <div>
      <button onClick={() => { action.update(); }}></button>
    </div>
  );
}

/* or */

function Content({ action }) {
  const handleClick = () => { action.update(); }
  return (
    <div>
      <button onClick={handleClick}></button>
    </div>
  );
}
```

## 親Componentから複数の子コンポーネントに渡されたfunctionの挙動

*明日書く*


# 参考
- [How to yield inside a forEach · Issue #306 · yelouafi/redux-saga](https://github.com/yelouafi/redux-saga/issues/306)
- [Is there any way to check if data is immutable? · Issue \#450 · facebook/immutable\-js](https://github.com/facebook/immutable-js/issues/450)
- [Event System \| React](https://facebook.github.io/react/docs/events.html#event-pooling)
- [react/SyntheticEvent\.js at master · facebook/react](https://github.com/facebook/react/blob/master/src/renderers/shared/stack/event/SyntheticEvent.js)
素人にはサーバーサイドJavaScriptは難しい

要するに、Python使いがノリでサーバーサイドJavaScriptに手出しして火傷し、Djangoに戻った話です
以下がその理由です。押し並べて経験の浅いものの理解なので、疑問点~~や私の知ったか~~等があれば是非指摘して欲しい
 1. 非フロントエンジニアから見ると、単純にJavaScriptが面白く無い
JavaScriptが美しくない。TS使えって話だが
あとキャメルケース主流だからスネークケース好き（もっと言うならPEP8好き）には違和感しか感じなかった
 2. SequelizeがDjangoのORMと比べ使い勝手で劣る
脳死migration自動生成使えないしコード汚いからキツかった
DjangoのORMを搭載するんだったら諦めてDjangoでいいだろうしなー
 3. Djangoみたいに使いやすいフレームワークが無い
Express系みたいなマイクロフレームワークはDjango使いには厳しいし、Sails使うならDjango使うし、MeteorはMongoアレルギーで触れられなかった
 4. よく考えたら今作ってるものにWebSocketが必要無かった
最初の内はWebSocket使わなくてもなんとかなるし、必要になる時には余裕も出来てるだろうし何とかなるかなって気がする~~そもそも成功するか否かはさておき~~

要するに、向いてない言語で開発するって大変って話です
ただ、~~使うかどうかはさておき~~最新のフロントエンドの技術も吸収出来たから良かったと思っています
~~ただもうJavaScriptは見たくないしSPAやSSRの良さが素人にはいまいち分からないので誰か教えてください~~
ransack+simple_formでカラムがNULLのものを絞り込むための記述


たとえば、`user_id`が`NULL`のものを検索するチェックボックスを作る場合の実装方法です。チェックボックスにチェックを入れたら、NULLのものに絞り込み、チェックが入っていない場合は、NULLのものNOT NULLのもの両方を検索します。

```haml
= f.input :user_id_null, as: :boolean, include_hidden: false
```

**[要注意]** この`include_hidden: false`がミソで、これがついていないとチェックボックスにチェックを入れずに送信すると、`NOT NULL`だけに絞りこまれてしまいます。デフォルトで絞りこまない仕様になってないのでご注意を。

ちなみに、これが使えるのはsimple_formのバージョン3.3.0からです！

https://github.com/plataformatec/simple_form/blob/v3.3.0/lib/simple_form/inputs/boolean_input.rb#L58

↑の変更が3.3.0から追加されました。
[PHP]SimpleXMLとエスケープ

#はじめに
PHPのSimpleXMLの動きがわりと不可思議なのでまとめです。

#テキストノードのエスケープ
SimpleXMLでテキスト入れるには大体3つくらいのやり方があります。

~~~php
$xml = new SimpleXMLElement('<root></root>');

$text = '"PHP&XML!"\(>_@)/';
/*1つめ*/
$item1 = $xml->addChild('item1');
$item1[0] = $text;
$this->assertEquals($text,$item1[0]);

/*2つめ*/
$text2 = $xml->addChild('item2')->{0} = $text;
$this->assertEquals($text,$xml->item2[0]);

/*3つめ*/
$item3 = $xml->addChild('item3',$text);
$this->assertEquals($text,$item3[0]);
~~~
このうち3つ目はアサートが通りません。
`addChild`の第二引数でテキストを入れた場合、
アンパサンドがなぜかエスケープしてくれません。不思議です。

2つ目は一行でエレメントの作成とテキストの入力ができて便利ですが、
返り値が当然SimpleXMLElementでなくテキストになるので注意です。

`$item[0]`で入力して、`$item[0]`で出力するのが安定です。

#属性のエスケープ
属性の入力は二通りあります。

~~~php
$xml = new SimpleXMLElement('<root></root>');

$text = '"PHP&XML!"\(>_@)/';

/*1つめ*/
$item1 = $xml->addChild('item1');
$item1->addAttribute('attr1',$text);
$this->assertEquals($text,$item1['attr1']);

/*2つめ*/
$item2 = $xml->addChild('item2');
$item2['attr2'] = $text;
$this->assertEquals($text,$item2['attr2']);
~~~
`addChild`の挙動を考えると`addAttribute`もエスケープに失敗しそうですが、
こちらは両方ともキチンとエスケープしてくれ、SimpleXMLに触れる人間を混乱に陥れます。

#XPathのエスケープ
存在しません。
関数が用意されてないので正規表現頑張ろう死のうってレベルではないです。
SimpleXMLのXPathは1.0なのでエスケープのまともな定義自体が存在していません。

次のようなコードを書くといずれ死にます。

```php
$target = current($xml->xpath('./haystack/book[title/text()="' . $needle. '"]'));
```

foreachで地道に探索しましょう。

```php
$target = null;
foreach($xml->xpath('./haystack/book') as $book){
 if ($book->title[0] === $needle){
   $target = $book;
   break;
 }
}
```

#終わりに
ちなみにエレメントや属性は次のように`unset`で削除できます。

~~~php
$target = $xml->item1;

/*属性の削除*/
unset($target['attr1']);

/*エレメントの削除*/
unset($target[0]);
~~~

`$input[0] = $text`のことなどを合わせて考えると、
SimpleXMLにはXMLを配列的に扱いたい的な雰囲気があります。
PHPのcomposerで、ローカルにあるGitプロジェクトをinstallする方法

# ローカルのGitプロジェクトをインストール
```json
{
    "require": {
        "php": ">=5.6.4",
        "daijinload/hoge": "dev-feature/fuga"
    },
    "repositories": [
        {
            "type": "vcs",
            "url": "../hoge/.git"
        }
    ]
}
```

requireのところも指定方法が違います。（バージョン番号指定の部分にブランチ名を指定したり、プレフィックスとして先頭にdev-が付くなど。）

```
"アカウント名/リポジトリ名": "dev-ブランチ名"
```

リリースタグをインストールする場合は、バージョン番号で良いのでしょうが、開発中はブランチだと思うので、上記のようになると思います。

# GithubなどのリモートサーバーのGitプロジェクトをインストール
```json
{
    "require": {
        "php": ">=5.6.4",
        "daijinload/php-tdd-sample": "dev-master"
    },
    "repositories": [
        {
            "type": "git",
            "url": "https://github.com/daijinload/php-tdd-sample.git"
        }
    ]
}
```

個人的に、Node.jsのnpmの指定方法のほうがしっくりくるのですが、ローカルインストール出来るだけ、ありがたいと思うことにします。。。
PowershellでYAMLを扱う（Import-YAML）

世間では `YAML` なるファイルフォーマットがナウいと聞いたので、素の Windows でも使えるように `Powershell` で使えるパーサを作ってみました。いつものように `JScript` でも良かったのですが、`Powershell` の勉強がてら。。。

いまいち powershell のモジュールの使い方が分かっていないのですが、とりあえず動くようになったので [github](https://github.com/asterisk9101/Import-YAML.git) に公開しました。
色々足りない部分(後述)があるので実装状況としては 50% も無いと思われます。

使用感は以下のような感じです。

```
PS D:\dev\Import-YAML> Import-Module .\Import-YAML.psm1 -verbose
詳細: パス 'D:\dev\Import-YAML\Import-YAML.psm1' からモジュールを読み込んでいます。
詳細: 関数 'Import-YAML' をインポートしています。
PS D:\dev\Import-YAML>
PS D:\dev\Import-YAML>
PS D:\dev\Import-YAML> cat .\test.yml
number: 123
string: C:\temp\hoge\fuga
boolean:  yes
boolean2: on
boolean3: true
array:
  - 1
  - 2
  - 3
# comment
flowstyle:
  {
    str: "hoge",
    num: 123,
    ary: [true, false, null]
  }
PS D:\dev\Import-YAML>
PS D:\dev\Import-YAML>
PS D:\dev\Import-YAML>
PS D:\dev\Import-YAML> $YAML = Import-YAML .\test.yml
PS D:\dev\Import-YAML> $YAML

Name                           Value
----                           -----
array                          {1, 2, 3}
number                         123
flowstyle                      {ary, str, num}
boolean2                       True
boolean3                       True
boolean                        True
string                         C:\temp\hoge\fuga


PS D:\dev\Import-YAML>
```

`JSON` に比べると Windows のファイルパスがそのまま書けるので、「読みやすく、書きやすい」というのも納得できます。
あとコメントが埋め込めるのも良いと思います。

YAML のデータは以下の形式でインポートされます。以下の形式以外は未対応です。

| YAML    | Powershell(.NET) |
|---------|------------------|
| string  | System.String    |
| decimal | System.Double    |
| boolean | System.Boolean   |
| datetime| System.Datetime  |
| null    | null(?)          |
| Sequence| System.Collections.ArrayList |
| Mapping | System.Collections.HashTable |

何となく見ての通りですが、できることは以下の通り

- 正の整数、文字列、真偽値、日付型、null、シーケンス、マッピングの解釈
- ネストしたシーケンス、マッピングの解釈
- ブロックスタイルとフロースタイルの解釈
- コメントの解釈（無視）
- etc.

逆に未対応は以下の通り

- 読みやすい形での構文エラーの通知
- decimal型各種データ型の解釈及び型宣言
- ブロックスタイル文字列の解釈
- アンカーとエイリアスの解釈
- etc.

まだヘルプもユーティリティも無いですが、テキストファイル1枚だけなので試運転程度であれば。
構文が平易で非エンジニアにも優しい感じなので、業務利用も視野に入れて作り込みたいところ。

# 参考資料
[PowerShell のモジュール詳解とモジュールへのコマンドレット配置手法を考える - tech.guitarrapc.cóm](http://tech.guitarrapc.com/entry/2013/12/03/014013)
[Rubyist Magazine - プログラマーのための YAML 入門 (初級編)](http://magazine.rubyist.net/?0009-YAML)
「マルチプル・テーブル」を解きました

# 問題

問題と模範解答はこちら。
https://codeiq.jp/magazine/2016/09/44882/

# 解き方

## 概要

テーブル上に任意の四角形を作り、四角形の左上端の位置と幅と高さから内部に含まれる数値の和を求める関数を作る。
探索は、左上端のx, y座標、幅、高さと４重のループの深さ優先探索を行う。

## 四角形内の数値の和の求め方

四角形内の数値の和の計算手法を工夫することで、計算量のオーダーを減らすことに成功しました。

* 各要素の和を単純に計算: `O(n^2)`
* 等差数列の和を各列に適用して計算: `O(n)`
* 下記の手法による計算: `O(1)`

任意の四角形の１列目の要素は、左上端の座標を`(x, y)`、幅を`n`とおくと、

```
xy, xy + y, xy + 2y, ... , xy + (n - 1)y
```

となり、２列目の要素は同様に

```
xy + x, xy + (x + 1) + y, xy + (x + 2)  + 2y, ... , xy + (x + n - 1)  + (n - 1)y
```

となる。
題位よりもともとわかっていたことだが、等差数列の規則性があることがわかる。
１列目の和は、`初項: xy, 公差: y, 要素数: n`と置くと、

```
S(1) = 1/2 * n * ( 2xy + (n-1) * y )
```

となる。
同様にm列目の和は、

```
S(m) = 1/2 * n * ( 2x * (y+m) + (n-1) * (y+m) )
```

となる。
次に、`S(1), S(2), ... , S(m)`の和は、上記の規則性より

```
Σ(k=1..m) S(k) = Σ(k = y..y+m) { 1/2 * n * ( 2xk + (n-1)k ) }
               = 1/2 * n * (2x + n - 1) * m + 1/2 * (2y + m - 1)
```

となる。

##　探索部分

効率的な探索方法は思いつかず、テーブルの`y = -x`とx軸に囲まれる部分を網羅的に探索する方法を取った。
（四角形内の数値の和を計算する方法では、網羅的に探索するより他にないのかなと。）

# コード

``` Ruby:multiple_table.rb
def area_sum(x, y, n, m)
  s, e = y, y + m - 1
  (n * (2 * x + n - 1) * m * (s + e) * 0.25).to_i
end

# F(k)を満たす四角形の個数を返す
#
# 基本的な考え方: k✕kのテーブル内を深さ優先探索する
def multiple_table k
  cnt = 0
  # NOTE: [*1..k]なんてやってしまうとArrayになってしまい非常に遅い
  #       Rangeで行う
  (1..k).each do |y|
    # NOTE: 当然だが片側だけ探索を行う
    (y..k).each do |x|
      # NOTE: x方向の探索範囲はyの値に反比例して少なくできるが、
      #       このbreak文と実行速度に大差なかったので、分かりやすいコードを採用した
      break if x * y > k

      n = m = 1
      bool = true
      while bool
        sum = area_sum(x, y, n, m)

        if sum == k
          # NOTE: 左端上部が (x, y) == (k, k) のときは、対称性からカウントを +1 する
          #       それ以外は +2
          cnt += x != y ? 2 : 1
          # NOTE: これ以上x軸方向に広げても確実にkを超えるので、
          #       幅を1に、高さを+1に変更して、探索を続ける
          n = 1
          m += 1
        elsif sum < k
          # NOTE: 和がkに満たないとき、四角形をx軸方向に１つ広げて探索を続ける
          n += 1
        elsif sum > k
          # NOTE: 和がkを超えてる時、幅１で超えたなら開始位置からの探索は諦める
          break if n == 1
          # NOTE: 幅を1に、高さを+1に変更して、探索を続ける
          n = 1
          m += 1
        end
      end
    end
  end
  cnt
end

while line=gets
	n = line.chomp.to_i
  puts multiple_table n
end
```
Mac用のIPMIアプリ@SoftLayer

#ここからダウンロードできました
http://downloads.service.networklayer.com/ipmi/mac/

<img width="351" alt="ipmi_mac_download.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/9a2e219f-fbe4-360d-b9a2-7d071db0f1c0.png">
gnuplotでひとつのスクリプトからPDFやらEPSやらLaTeXのソースファイルを作る話

**tl;dr: そんなスクリプトを書きました。**

[term.gnuplot](https://gist.githubusercontent.com/tueda/9233f5d50c1479fe68aaa546aff97a0c/raw/term.gnuplot)[^1] を使って、

```gnuplot:test.gnuplot
load 'term.gnuplot'

@SetTerm('test.pdf')

plot x**2 title ensuremath('x^2')

@UnsetTerm
```

プロットのコマンドが `@SetTerm('FILENAME')` と `@UnsetTerm` に挟まれてるのが重要。
指定した`FILENAME`の拡張子は適当に置き換わる[^2]。

これで、

```
gnuplot> load 'test.gnuplot'          # 普通にウィンドウにプロット
gnuplot> PDF=1; load 'test.gnuplot'   # 'test.pdf' を作る。
gnuplot> EPS=1; load 'test.gnuplot'   # 'test.eps' を作る。
gnuplot> TIKZ=1; load 'test.gnuplot'  # 'test.tex' を作る。
```

のようなことができる[^3]。また、内部で環境変数を見に行っているので[^4]、Unix シェルだと、

```sh
$ PDF=1 gnuplot test.gnuplot
```

なんてのもできたりする。


[^1]: gnuplot スクリプトの拡張子には `.plt` や `.gp` が使われてるらしいが、個人的にどうもしっくりこない…。
[^2]: なので `@SetTerm(ARG0)` と書いておくと、スクリプトファイル名の拡張子を `.pdf` などに置き換えた出力ファイルになる。
[^3]: 最近のgnuplotだと(cairoが使える場合は)`EPSCAIRO=1`や`PDFCAIRO=1`の方がきれいなグラフになる気がする。
[^4]: まさか環境変数に`PDF`や`EPS`や`TIKZ`なんて常日頃から設定してる人はいないとは思うが…。
[小ネタ]MySQL SQLでUTF8の4バイトを含む文字かどうか判別

とりあえず簡単にやりたい場合に

### クライアントがutf8の場合

```sql
select _utf8mb4'<判別したい文字列>' as result
```

- 例

```bash
$ mysql --default-character-set=utf8 -u <ユーザ名> -p -e "select _utf8mb4'寿司🍣' as result"
Enter password: 
+---------+
| result  |
+---------+
| 寿司?   |
+---------+
```

４バイト文字の部分が?になる。元の文字列と比較して一致しなければ４バイト文字を含むことに。
ただし、クライアントのcharacter-setがutf8mb4の場合は次の方法を使う。

### クライアントがutf8mb4の場合

```sql
select convert(_utf8mb4'<判別したい文字列>' using utf8) as result
```

- 例

```bash
$ mysql --default-character-set=utf8mb4 -u <ユーザ名> -p -e "select convert(_utf8mb4'寿司🍣' using utf8) as result"
Enter password: 
+---------+
| result  |
+---------+
| 寿司?   |
+---------+
```

- Booleanで結果を貰う場合(4バイト文字を含んでいれば1、含んでいなければ0)

```bash
$ mysql --default-character-set=utf8mb4 -u <ユーザ名> -p -e "select (convert(_utf8mb4'寿司🍣' using utf8) <> _utf8'寿司🍣') as result"
Enter password: 
+--------+
| result |
+--------+
|      1 |
+--------+

$ mysql --default-character-set=utf8mb4 -u <ユーザ名> -p -e "select (convert(_utf8mb4'寿司' using utf8) <> _utf8'寿司') as result"
Enter password: 
+--------+
| result |
+--------+
|      0 |
+--------+
```
Elasticsearchのインデックスサイズなどを確認する方法


[Indices Stats（公式ドキュメント）](https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-stats.html)

以下に、[Sense](https://www.elastic.co/guide/en/sense/current/index.html)を使う方法とターミナルを使う方法を併記します。
Senseで確認すると整形した状態で出力されるので確認が楽です。

# 全体の統計情報を見る
Sense

```
GET _stats
```

ターミナル

```
$ curl localhost:9200/_stats
```

# 特定のインデックスの統計情報を見る
Sense

```
GET my_index/_stats
```

ターミナル

```
$ curl localhost:9200/my_index/_stats
```

# 複数のインデックスの統計情報を見る
Sense

```
GET my_index1,my_index2/_stats
```

ターミナル

```
$ curl localhost:9200/my_index1,my_index2/_stats
```

# インデックスサイズを見る
Sense

```
GET my_index/_stats/store
```

ターミナル

```
$ curl localhost:9200/my_index/_stats/store
```

# indexingの情報を見る
Sense

```
GET my_index/_stats/indexing
```

ターミナル

```
$ curl localhost:9200/my_index/_stats/indexing
```

## document_typeを指定すると詳しく見れる

例えばtype=facilityとtype=job_offerがある場合

Sense

```
GET my_index/_stats/indexing?types=facility
GET my_index/_stats/indexing?types=job_offer
```

ターミナル

```
$ curl localhost:9200/my_index/_stats/indexing?types=facility
$ curl localhost:9200/my_index/_stats/indexing?types=job_offer
```

## document_typeをカンマで区切ると複数のタイプを並べて見れる

Sense

```
GET my_index/_stats/indexing?types=facility,job_offer
```

ターミナル

```
$ curl localhost:9200/my_index/_stats/indexing?types=facility,job_offer
```

# さいごに
今回は[Parent-Child Relationship](https://www.elastic.co/guide/en/elasticsearch/guide/current/parent-child.html)を使っておりParentとChildそれぞれのインデックスサイズ（store）を確認したかったのですが、どうやらそれはできない模様でした。
process.titleを変えて、psコマンドの表示名を変える

Nodeのprocessパッケージにtitleというプロパティがある

[process.title - Node.js v6.5.0 Documentation](https://nodejs.org/api/process.html#process_process_title)

titleに任意の値をセットすることで、psコマンドでの表示名を変えることができる。

参考：[【ps・kill】実行中のプロセス表示と強制終了](http://qiita.com/shuntaro_tamura/items/4016868bda604baeac3c)

### 例

```js
// hoge.js
process.title = 'hoge process';

// + なんらかのサーバを立てる処理
```


```
$ ps

  PID TTY           TIME CMD
29384 ttys000    0:02.40 hoge process
```

<sub>PIDは適当</sub>