OmniAICreator/Qiita-1.07M huggingface dataset:
jQuery alternative メモ

# Umbrella

- 3K gzip+minify
- https://github.com/umbrellajs/umbrella
- 実装開始: 2015

# Bliss

- 3K gzip+minify
- http://blissfuljs.com/
- 実装開始: 2015

# Cash

- 3.5K gzip+minify
- https://github.com/kenwheeler/cash
- 実装開始: 2014

# Zepto
- 10K gzip+minify
- http://zeptojs.com/
- 実装開始: 2010

# MooTools

# Ki.js

# Sprint.js

# minified.js

- https://github.com/timjansen/minified.js/

# kimbo.js

- http://kimbojs.com/

# 備考
snack.js, xui, $dom など、開発終了と思われるものは除いています。

# 参考資料:

- https://nerdkrams.de/6-leichtgewichtige-jquery-alternativen-im-funktionsvergleich/
XCODEのAssistand Editorで関係ないファイルが開いたとき

##問題
XCodeのAssistant Editorで全然関係ないファイルが開いてしまったときにどうすればよいか。

##解決方法
<img width="299" alt="スクリーンショット 2017-01-27 13.27.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/22680/9d8ea76a-f752-0a42-7373-a8c57c404d6b.png">

AssistantEditorのここが Manual になっているのが原因。

Manualをクリックして出て来るメニューの Automatic にStoryboardのViewControllerが入っているはず・・。

<img width="236" alt="スクリーンショット 2017-01-27 13.32.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/22680/c3815916-8934-7250-ad14-af009713e433.png">
Cognos でファイルシステム（フォルダ）上にレポートを出力する方法

Cognos BI & Analyticsで、Cognosサーバーのファイルシステム(フォルダ)上にレポートをファイルとして出力する手順です。最近質問を受けたので、ついでに投稿しておきます。

##手順

Cognosサーバー上にレポートを出力したいフォルダを作成します。
この場合、C:\work\Cognos\Outputフォルダをベースにして、その下のdir01フォルダにファイルを出力しようとしています。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/e7b0fd79-2b0c-d9aa-8015-e8ec5e63ab77.png)

Cognos Configurationの「操作」→「グローバル設定を編集」を選択します。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/e16495c6-d5c0-370e-d886-95e776bb20e3.png)

アーカイブ・ファイル・システムのルートの場所に、以下のように先ほどのベースのディレクトリを指定します。
file://C:\work\Cognos\Output
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/d1836076-8f0b-a957-92e8-a3a9b4ddcd70.png)

Cognos Configurationを保存し、Cognosサービスを再起動します。
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/1953f7eb-3fb3-b89f-e05c-8a011b11242f.png)

Cognos Administrationを起動し、「設定」「ディスパッチャとサービス」から赤枠の「ファイル・システムの場所を定義」を選択します。
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/eec2cb90-ef5e-7932-d8aa-2a5ead349f35.png)

「新規作成」を選択すると以下の画面になるので、名前とファイル・システムの場所を指定します。
ファイル・システムの場所は、先ほどのベースのディレクトリの下に作成したディレクトリです。
![006.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/d7f43441-2336-a7c6-cd6c-9f290e4bed7f.png)

エントリーが作成されたので、閉じる。
![007.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/343edaa1-0c9d-ccbc-7942-6ffddc243ceb.png)

適当にレポートを作成して、オプションを選択して実行を行います。
![008.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/d9a9b864-547f-d016-4463-384a1aa5098f.png)

「詳細オプション」を選択し、以下の画面で「ファイル・システムに保存」が表示されるので、チェックします。
また、「ファイル・システム・オプションを編集」で細かな設定もできます。
![009.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/9049dc94-c628-0a4a-f3ee-19ed6bc0473c.png)

「ファイル・システム・オプションを編集」の設定画面です。必要な設定を行います。
![010.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/c73a41a3-3323-10b4-72db-37d74cd04a65.png)

実行を行うと、このようにContent Store上にも保存されます。
![011.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/416f6ff7-36e8-0052-230c-f18395030cd4.png)

先のCognosサーバー上のフォルダを見ると、以下のようにPDFのファイルが出力されています。
![012.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/5f4d9ae1-987c-f1e7-2e32-1fbc9593e6fa.png)


**Saving report output files outside of IBM Cognos software**
https://www.ibm.com/support/knowledgecenter/SSEP7J_10.2.2/com.ibm.swg.ba.cognos.ug_cra.10.2.2.doc/t_localfileoutputlocation.html#LocalFileOutputLocation
【Python入門】絶対に知っとくべきライブラリscipyの基本的な使い方

※こちらの記事は、プロスタ編集部が現在大変人気の高いPythonの文法記事を公開することで、皆様の学習にお役に立ちたい意図で投稿しております。

参考サイト：[【Python入門】絶対に知っとくべきライブラリscipyの基本的な使い方](http://programming-study.com/technology/python-scipy/)

#【Python入門】絶対に知っとくべきライブラリscipyの基本的な使い方


Pythonには便利なライブラリが数多く存在し、scipyもそのうちの1つです。scipyは高度な科学計算を行うためのライブラリです。似たようなライブラリでnumpyが存在しますが、scipyではnumpyで行える配列や行列の演算を行うことができ、加えてさらに信号処理や統計といった計算ができるようになっています。

今回はscipyの基本的な使い方について説明します。

目次
1 scipyのインストール
1.1 numpyのインストール
1.2 scipyのインストール
2 scipyを使う
2.1 積分
2.2 行列演算

##scipyのインストール

###numpyのインストール

scipyを使うにはnumpyが必要ですので、最初にnumpyをインストールしておきましょう。
※[numpyのインストール方法](http://programming-study.com/technology/python-numpy/)

###scipyのインストール

続いてscipyをインストールします。scipyはpipコマンドでインストールすることができます。

```
pip install scipy
```

もしpipでインストールできない場合は以下のページからScipyをダウンロードし、ダウンロードしたファイルをpipコマンドでインストールしてください。

[http://www.lfd.uci.edu/~gohlke/pythonlibs/](http://www.lfd.uci.edu/~gohlke/pythonlibs/)

pipコマンド

```
pip install さきほどダウンロードしたファイルのパス
```

scipyにはいくつかのバージョンがあるので、自分のpythonやOSにあったバージョンをダウンロードしてください。例えば「scipy‑0.18.1‑cp36‑cp36m‑win_amd64.whl」というファイルはpython3.6、64ビットのWindows向けとなっています。

##scipyを使う

scipyをインストールしたら、さっそく使ってみましょう。ただ、scipyには数えきれないほどの機能があるため、とてもすべてを紹介することはできません。ここでは、よく使われるほんの一部の機能を紹介します。

###積分

scipyを使えば関数の積分（定積分）が簡単に行えます。積分をするにはscipy.integrateモジュールのquad()を使います。

```
from scipy import integrate  #必ず必要

変数1, 変数2 = integrate.quad(関数, 積分区間の始まり, 積分区間の終わり)
```

quad()は与えられた関数を[区間の始まり, 区間の終わり]の区間で定積分し、2つの値を返します。変数1には積分した結果が、変数2には積分計算をした際の誤差が返されます。

```
from scipy import integrate

#2x+5を表している
def func(x):
    return 2*x + 5

result, err = integrate.quad(func, 0, 5)

print('積分結果:{0}\n誤差:{1}'.format(result, err))
```

実行結果
>
積分結果:50.0
誤差:5.551115123125783e-13

難しいのでここでは省略しますが、定積分だけでなく2次元の積分や微分方程式などの高度な演算を行うこともできます。

###行列演算

行列の演算はnumpyでもできましたが、scipyを使えばより高度な演算ができます。行列の演算には線形代数用の機能をまとめたscipy.linalgを使います。

```
rom scipy import linalg
import numpy as np  #numpyを使う

narray = np.array([[1, 2], [3, 4]])  #numpyのarrayで行列を表現
inv_narray = linalg.inv(narray)

print('narrayの逆行列：\n{}\n'.format(inv_narray))

result_det = linalg.det(inv_narray)

print('inv_narrayの行列式:{}\n'.format(result_det))

inv_narray_norm = linalg.norm(inv_narray)

print('inv_narrayのノルム:{}'.format(inv_narray_norm))
```

実行結果
>
narrayの逆行列：
[[-2. 1. ]
[ 1.5 -0.5]]
inv_narrayの行列式:-0.49999999999999967
inv_narrayのノルム:2.73861278752583

scipyではこの他にも信号処理や画像解析、統計処理、フーリエ変換など高度な科学計算を簡単に行うことができます。その数は膨大でここではすべて説明できませんので、scipyをもっと使ってみたい方は公式ドキュメントなども参考にしてください。
[公式ドキュメント](https://docs.scipy.org/doc/scipy/reference/)

おすすめ記事
➡[Pythonの本・参考書の評判](http://programming-study.com/language/python-books/)
➡[Pythonを学びたい方は必見！おすすめスクールまとめ5選](http://programming-study.com/language/python-2/)
【Python入門】Pythonにおけるclassの使い方とは?

※こちらの記事は、プロスタ編集部が現在大変人気の高いPythonの文法記事を公開することで、皆様の学習にお役に立ちたい意図で投稿しております。

参考サイト：[【Python入門】Pythonにおけるclassの使い方とは?](http://programming-study.com/technology/python-class/)



Pythonはオブジェクト指向プログラミングをサポートしている言語です。そのためにはクラスを定義、作成することが必要です。Pythonのクラス定義は他の言語と比べると簡単に行えるようになっています。

今回は、Pythonにおける基本的なクラスの扱いについて説明します。

##クラスの定義

Pythonではクラスの定義にclass文を使用します。class文を使った定義の仕方は以下のようになります。

```
class クラス名:
```

class文の後にそのクラスの名前となるクラス名をつけて、最後に「:」を付け加えます。そのあとに一段落インデントを入れてクラス定義をしていきます。

```
class Test:
    pass  #何もしないクラスの場合はpassと記入する

test = Test()  #インスタンスを生成
```


##メソッド

クラスにはメソッドを定義することができます。メソッドの定義は以下のように行います。

```
class クラス名:
    
    def メソッド名(self):
        #メソッドの定義
```


メソッドは必ず1つ以上の引数を持ちます。また、引数のうち最初のものはselfという名前にすることになっています。メソッドを呼び出すには以下のようにします。

```
インスタンス.メソッド名()
```

```
class Test:


    def test_print(self):
        print('This is test')
        
test = Test()      #インスタンス生成
test.test_print()  #メソッド呼び出し
```

実行結果
>
This is test

##コンストラクタとデストラクタ

メソッドの中でも、インスタンスが生成されるときに自動的に呼び出されるメソッドのことをコンストラクタと言います。コンストラクタを定義するには「__init__」という名前のメソッドを作成します。

```
class Test:
    def __init__(self, 引数1, 引数2, ….):
        #コンストラクタの定義
```

__init__も必ずselfという引数が必要になります。それ以外にも引数をつけることができ、その引数はインスタンスを生成する際にクラスを呼び出す時の引数が渡されます。

```
class Test:
    def __init__(self, num):
        self.num = num;  #このクラスが持つ「num」変数に引数を格納
        
    def print_num(self):
        print('引数で渡された数字は{}です。'.format(self.num)) 
    
test = Test(10)   #ここで渡された引数が__init__のnumに渡される
test.print_num() 
```

実行結果
>
引数で渡された数字は10です。

コンストラクタとは逆に、インスタンスが不要になり削除される時に呼ばれるメソッドをデストラクタと言います。デストラクタは「__del__」という名前のメソッドで定義されます。

```
class Test:
    def __init__(self):
        print('コンストラクタが呼ばれました')

    def __del__(self):
        print('デストラクタが呼ばれました')


test = Test()  #インスタンスを生成
del test      #インスタンスを削除
```

実行結果
>
コンストラクタが呼ばれました
デストラクタが呼ばれました

##継承

Pythonのクラスも他のクラスを継承し、拡張することができます。クラスを継承する場合はクラス文に親となるクラスを指定します。親のクラスのメソッドを呼び出す場合はsuper()を使います。

```
class Test:
    def __init__(self, num):
        self.num = num;
        
    def print_num(self):
        print('引数で渡された数字は{}です。'.format(self.num))


class Test2(Test):  #Testクラスを継承
    def print_test2_info(self):
        print('このクラスはTestクラスを継承しています。')
        super().print_num()  #親クラスのprint_num()を呼び出す

test = Test2(10)
test.print_test2_info()
```

実行結果
>
このクラスはTestクラスを継承しています。
引数で渡された数字は10です。
Riotでnl2br

改行の入った長い文字列を表示するとなれば、PHPでいう`nl2br()`、Railsの`simple_format`のような、「改行文字を`<br>`タグに置き換えて表示」という処理がしたくなるものです。ただ、Riot標準では、そういう機能はなさそうです。

もちろん、Riotでも`innerHTML`に代入するような荒技を取れば、JavaScriptで生成したHTMLも、そのまま反映させることができます。ただ、そのようなコーディングをやっていると、XSSの危険もあるので、できれば避けたいものです。ということで、「Riot的に」`<nl2br>`タグを作ってみましたs。

## 実際のタグ

```html:nl2br.tag
<nl2br>
  <virtual each={text, i in texts}>
    <br if={i}>{text}
  </virtual>

  this.texts = opts.text.split('\n')
</nl2br>
```

[jsFiddleでの動作サンプル](https://jsfiddle.net/8nbo197o/)

## 動作内容
まずは、受け取ったテキストを`split`で改行ごとに区切って、配列にします。そして、`<virtual>`タグで`each`させて1つずつ出力していきますが、最初以外では出力の直前に`<br>`を入れることで、「もとの改行の位置に`<br>`を入れる」という処理となります。
Reactを用いた開発においてjQueryは絶対ダメな訳ではないという話

はじめてReactに触る人が真っ先に気になる質問の一つに
「ReactとjQueryは共存可能なのか?」 というものがあると思います。

ネットで調べると「使う場合は、DOMノードが現れたり削除されたりする、ライフサイクルメソッド(componentDidMount, componentWillUnmount, componentDidUpdate)の中だけでのみ使うようにする」
という回答が見受けられると思いますが、それが何故なのか、というところの情報があんまり見当たらなかったので、ここで解説してみようと思います。

###Reactのライフサイクル
詳しくは下記のサイトを見てみてください。
(React component ライフサイクル図)[http://qiita.com/kawachi/items/092bfc281f88e3a6e456]

Reactでコードを書いたことがないとなんのこっちゃって感じかもしれないので、一度Reactで簡単なアプリを作ってから見てみるのがよいかもしれません。

上記のライフサイクルを理解された前提で、要点をかいつまんで伝えたいのは以下の2点です。

1. コンポーネントがMountするまでは実際のDOMは存在せず、Virtual DOMとしてしか存在しない
2. コンポーネントがMountされた後に、Stateの変更が発生した際には、Reactは実際のDOMではなく、内部的に保持しているVirtual DOMオブジェクトを参照する。

###1.コンポーネントがMountするまでは実際のDOMは存在せず、Virtual DOMとしてしか存在しない
当たり前やろって感じのことかもしれませんが、Reactが描画をするまでは実際のDOMは存在していません。
このためMountするまでは直接DOM操作をしても空を切ります。

ですので、直接をDOMをいじりたい場合は、componentDidMount以降のタイミングで行う必要があります。

###2.コンポーネントがMountされた後に、Stateの変更が発生した際には、Reactは実際のDOMではなく、内部的に保持しているVirtual DOMオブジェクトを参照する。
componentDidMount以降であればいつでも安心して直接DOMをいじれるという訳ではありません。

componentDidMount後も何かしらのイベントでコンポーネントのStateの変更が発生し再描画されることがあると思います。
この時Reactは実際のDOMの状態などは感知しておらず(させることはできますが、それやるくらいなら最初からDOM操作はReact内部でのみ行いましょう)、内部的に保持しているVirtual DOMに対して、Stateの変更を反映し、それを描画することになります。

ですので、機能によりますが、直接DOMをいじったことが"なかったこと"になる可能性があります。

例として簡単な図を書いてみました。逆に分かり辛かったらすみません…。

![image](https://qiita-image-store.s3.amazonaws.com/0/150569/97087f9b-156f-32c3-892a-42ad5c4d1524.png)

このため、Reactで直接DOMを操作する時には、Stateの変更による影響がない箇所に限定して使用するべきです。

結論
------------------------------
"jQuery"というより"直接のDOM操作"に関してですが、

* DOMノードが現れたり削除されたりする、ライフサイクルメソッド内(componentDidMount, componentWillUnmount, componentDidUpdate)
* Reactによる状態操作と直接のDOM操作がバッティングしない

の要件を満たしていれば、基本的には安心して利用することができるでしょう。

余談
------------------------------
ただ、その他の観点として、パフォーマンス的な意味合いで、大きいサイズのライブラリを不用意に入れるな！
ということもあるので、その辺は気になるようでしたらベンチマーク取ったうえでjQueryをはじめとした、直接DOMをいじる系ライブラリの導入をするか検討してみてください。
rfc5766-turn-serverのRedis連携時のkeyの中に入れるvalueの生成方法

#結論
MD5("ユーザー名:realm:設定したいパスワード")で出てきた値がvalueです。

#例
>ユーザー名をhoge
>パスワード（credential）をhuga
>realmをexample.com

の場合

`MD5("hoge:example.com:huga")`

で生成した値を、Redisに

`set "turn/realm/example.com/user/hoge/key" "<生成した値>"`

で入れてあげればおk

##参考文献
https://www.ietf.org/proceedings/87/slides/slides-87-behave-10.pdf
ReactNative 0.40のiOSビルドでエラーが発生した際の対処法

# 問題の概要

0.39から0.40のアップデートにあたってiOS側のライブラリのimportの仕方に変更があったようで、ビルドに失敗するという事案が発生しています。

参考： [React/RCTLog.h React/RCTBridge.h are not found since I upgrade react-native to 0.40](https://github.com/facebook/react-native/issues/12042)

# 対処法

1. `shift + cmd + k`でCleanする
2. Edit Schemeで`Parallelize Build`オプションをオフにする
3. Libraries内の`React.xcodeproj`のみをあらかじめビルドする
4. アプリをビルドする

0.41rcでも同様の問題が発生しているようなので今後の展開も楽観視できないような状況です。アップデートしていない人は0.39で止めておいた方が良いかも知れません。
IntelliJ IDEA のヒープメモリを増やす

IntelliJを使っているがたまに重くなるのでヒープメモリを増やしてみたときのメモ。

macOS で試してるが

1. Help > Edit Custom VM Options...
2. ダイアログが出てきたらYes<br>
(macOSの場合)<br>
![20170127-120720.png](https://qiita-image-store.s3.amazonaws.com/0/33695/ef7a5d48-86da-8f89-ed9c-223f3f647ad2.png)
<br>
3. IntelliJのエディタで編集できる
<pre>
 # custom IntelliJ IDEA VM options
 -Xms128m
 -Xmx750m
 -XX:ReservedCodeCacheSize=240m
 -XX:+UseCompressedOops
</pre>
この **-Xmx750m** が最大で使用可能なメモリ

macOS版は .vmoptions ファイルは直接編集するのは駄目、らしい。

参考
[Configuring JVM options and platform properties](https://intellij-support.jetbrains.com/hc/en-us/articles/206544869-Configuring-JVM-options-and-platform-properties)
【備忘録】CentOS6.7+Python2.7+matplotlibでハマった

かなりハマってしまったので備忘録として残す。

参考
[Installing Tkinter for Python 2.7](https://www.centos.org/forums/viewtopic.php?t=46922)

##環境
  * CentOS6.7
  * Python2.7

##エラー
```matplotlib``` を利用しようとするとエラーがでる。
正確には```matplotlib```のバックエンドで使用している```Tkinter```のインポートでエラーが発生する。

```
import Tkinter

ImportError: No module named '_tkinter'
```

```
$ yum search tkinter

python2-tktable.x86_64 : TkTable wrapper for Python 2.x with Tkinter
python34-tkinter.i686 : A GUI toolkit for Python 3
python34-tkinter.x86_64 : A GUI toolkit for Python 3
tkinter.x86_64 : A graphical user interface for the Python scripting language
```
なるほど...```yum install tkinter```でいいじゃないかと思ったのだが、ここで問題となったのがCentOS6.7のデフォルトのsystem pythonは2.6とういこと。
システムのPythonが2.6ということはyumを含むRedhatのツールの多くはPython 2.6に依存している。
なので```yum install tkinter```をした所でPython2.7では使えないし、他のパッケージはPython3向けのものしかない。

結論としては、探し物は**IUC Community**リポジトリにあるらしい
IUCommunityリポジトリのインストール

```
$ wget https://dl.iuscommunity.org/pub/ius/stable/CentOS/6/x86_64/ius-release-1.0-14.ius.centos6.noarch.rpm
$ rpm -Uvh ius-release-1.0-14.ius.centos6.noarch.rpm
```

```
$ yum search tkinter

tkinter.x86_64 : A graphical user interface for the Python scripting language
tkinter27.x86_64 : A graphical user interface for the Python scripting language
```

あとは```yum install tkinter27```で終わり。
C言語では int 型のポインタを宣言するだけで、領域が確保されているのか

#### 概要
int型とuint8_t型のポインタで挙動が異なり、理由を調べようとしたが、キーワードが不明で行き詰ってしまったためアップ

追記：
皆様のコメントにより、解決致しました。

#### 問題となるコード

```c:
// コード1
int* iptr;
*iptr = 10;   // Segmentation Fault にならない
printf("%d\n",*iptr); // 10が出力
```

上でなぜ 10 が出力されるのか、わからない。
普通は、以下のどちらかで宣言している。

```c:
// コード2
int val = 10;
int* iptr1;
iptr1 = &val;

// コード3
int* iptr2;
iptr2 = (int *) malloc( sizeof( int));
*iptr2 = 10;
```

uint8_t 型でコード1 を書き直すと、Segmentation Fault になる。

```c:
uint8_t* uptr;
*uptr = 0x1; // Segmentation Fault
```

uint8_t 型だと、(教科書どおりの？）コード2 のやり方でないといけない。

#### 疑問点
int型では内部的に勝手に malloc が呼ばれているのだろうか。
int型はそもそもどこで定義されているのだろうか。



int 宣言などで調べても出てこないため、同じ疑問を持っている人が
いるかもしれないため、申し訳ありませんが投稿しました。
PHP コンストラクタ クラス　インスタンス

##**コンストラクタ**

<font color="red">**クラス名は最初は必ず大文字になる**</font>

|変数||
|:--|:--|
|**メンバー変数(フィールド)**|クラスのメソッド外で宣言された変数|
|**ローカル変数**|メソッド内で宣言された変数|

![2017012703.png](https://qiita-image-store.s3.amazonaws.com/0/95187/80e8937b-6e59-0a4c-ec4c-7aa4abe45a13.png)


```php:PHPの場合、__constructという名前のメソッドを作ることでコンストラクタになる
	public function __construct($name) 
		$this->name = $name;
	}
```

```php:コンストラクタ
	function __construct($n){
		$this->name = $n;
	}
```

![2017012702.png](https://qiita-image-store.s3.amazonaws.com/0/95187/e3812f85-2768-55e8-c041-9f7ccd2ba2b9.png)


```php:同じクラス内のプロパティとかメソッドにアクセスするときは、this->プロパティ名orメソッド名
$this->name = $name;
```


![2017012701.png](https://qiita-image-store.s3.amazonaws.com/0/95187/09e3182c-131b-4b91-4025-dad61c6e4970.png)

##**クラス　インスタンス**

```test:test21.php
<?php
// 継承
// 親クラス
class User {
	public $name;
	public $test = "テスト";
	public function __construct($name) {
		$this->name = $name;
	}
	// //final→override禁止
	// final public function sayHi() {
	public function sayHi() {
		echo "hi, i am $this->name!";
	}
}

// 子クラス
class AdminUser extends User {
	// プロパティをオーバーライド
	public $test = "Adminテスト";
	public function sayHello() {
		echo "hello from Admin!";
	}
	// override→子クラスで親クラスのメソッドを上書き。メソッドだけでなくプロパティも出来る
	public function sayHi() {
		echo "[admin]hi, i am $this->name!";
	}
}

$tom = new User ( "Tom" );
$bob = new AdminUser ( "Bob" );

$tom->sayHi ();
$bob->sayHi ();
$bob->sayHello ();
echo $tom->name;
echo $tom->test; // テスト
echo $bob->test; // Adminテスト
?>
```
ECSに登録したイメージをEC2上で動かすためのIAM（備忘録）


スポットリクエストなどで立てたまっさらなインスタンスにdockerを入れてECSで登録したイメージリポジトリからひっぱてきてコンテナを動かしたい時に設定する内容を忘れずに書いておく。

必要なもの
---

* ECSのリポジトリと連携が取れるIAM


どのIAMが必要か
---

以下のコマンドでプライベートなレジストリ(ECSのレジストリ）にログインするための`docker login`コマンド情報を得る。

```
aws ecr get-login --region us-east-1 
```

（regionに関しては自身の環境により変わると思います。）

うまくいけば、以下のようなレスポンスが得れる

```
docker login -u AWS -p "hogehogehoge"
```

もし、これが得られないのならばEC2に設定しているIAMにいかのポリシーが足りない


* AmazonEC2ContainerRegistryReadOnly


以上で認証が通ったので、イメージがpullできる。

~~~
docker pull "ECSに登録している自分のイメージ"
~~~
ログ監視スクリプト

# ログ監視スクリプト

## 目的
* ログファイルに特定の文字列が出力されたら、何か処理を実行したい。

## 裏の目的
* Qiitaに投稿してみたかった。

## 環境
* CentOS
* bash

## スクリプト
/var/log/messagesに、"error hogehoge"と出力されたら、touchコマンドで"/tmp/hogedetayo"を作成します。

```bash:logchecker.sh
#!/bin/sh
# 検出対象ログファイル
TARGET_LOG="/var/log/messages"

# 検出文字列
_error_conditions="error hogehoge"

# ログファイルを監視する関数
hit_action() {
	while read i
	do
		echo $i | grep -q "${_error_conditions}"
		if [ $? = "0" ];then
			# アクション
			touch /tmp/hogedetayo
		fi
	done
}

# main
if [ ! -f ${TARGET_LOG} ]; then
	touch ${TARGET_LOG}
fi

tail -n 0 --follow=name --retry $TARGET_LOG | hit_action
```

## 解説
実行したい処理は、上記スクリプト内の`touch /tmp/hogedetayo`の部分に記述してください。

tailコマンドのオプションについて。

    tail -n 0 --follow=name --retry $TARGET_LOG

-n : 末尾から表示する行数を指定。ここでは標準出力しないように"0"を指定。

--follow=name :ファイルの内容がどんどん増え続けているものと仮定し、 ファイルの最終部分の文字を読み続けようと無限にループする。 (-fと同じ)
name指定することで、ファイル末尾の追跡を、ファイルが remove された後に行う。tailコマンドは、ファイルが削除 (unlink や rename)されたことを確認すると、もう一度オープンしようと試みる。 (ログローテート対策)

--retry :tail がファイルを名前で追跡していて、ファイルがなくなったことを検知したら、 再オープンを成功するまで繰り返す。このオプションを指定しなければ、 tail は単にファイルが存在しないことを報告して以降のチェックを行わない。(ログローテート対策)

実際の利用では、スクリプトをバックグラウンドで動作させます。
`/usr/local/bin/logchecker.sh > /dev/null 2>&1 &`

## あとがき
文章力が欲しい
GitBucket でグループのリストをヘッダに表示するプラグイン作ってみました

需要はあるのかないのか。

## こんなかんじになりました

![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/111100/43892870-bab8-7f67-20b0-0494d36a4c87.png)

https://github.com/tomoki1207/gitbucket-groupsmenu-plugin

## インストール方法
[Release](https://github.com/tomoki1207/gitbucket-groupsmenu-plugin/releases)ページからjarをDLして、`GITBUCKET_HOME/plugins` フォルダに配置してください。
フォルダがない場合は新たに作成します。
その後GitBucketを再起動で完了です。

## なんでつくったのか
現在 グループ=プロジェクト という使い方をしており、グループの画面に飛びたいことがままあありまして。
通常の TOP画面 → Your profile → Groupsの中から選択 という手順はちょっと面倒だなというわけで作ってみました。
GitHubもOrganizationに行くのは同じ手順踏むと思うので、まぁいいかなとも思ってはいたのですが、もはやGitBucketはGitHubからは独立していく感じですしね。
あと、Scalaの勉強になればなと。

## 所感
先人の方々のソースを参考に進めたところ、それらと古き良きjQueryをツギハギしただけのPluginになってしまいました。
Scalaの勉強にはもっと重厚なPluginを開発しないとですね。
まぁ、こういう小さなPluginが氾濫してくるとコミュニティが活発っぽくていいですよね(?)。

ところで先人の皆さんは何を参考にPluginを開発したんでしょう。
PluginのJavaScriptが`plugin-assets`フォルダに配置されるとか誰も教えてくれなかったんですけど!
GitBucketのドキュメントとか本体のソースとかちゃんと読めってことですか、そうですよね。

## 参考
[GitBucketプラグインを作ってみよう](http://takezoe.hatenablog.com/entry/2016/08/06/202109)
[gitbucket community plugins
](http://gitbucket-plugins.github.io/)
MarkdownをPDFに変換する方法


# 目的

Markdownで書かれた文章を印刷したいです。

- Markdownそのままを印刷すると読みにくい
- htmlに変換して印刷しても読みにくい

この問題を解決します。

# 手段
## Chrome拡張 Markdown Preview Plus
[Markdown Preview Plus - Chrome ウェブストア](https://chrome.google.com/webstore/detail/markdown-preview-plus/febilkbfcbhebfnokafefeacimjdckgl?hl=ja)をインストールします。ChromeにMarkdownファイルをドラッグアンドドロップしてPDFに変換できます。

もらったMarkdownを変換して見た目を確認したい時に、手軽に変換できて便利です。

## Node.jsのツール [markdown-pdf](https://github.com/alanshaw/markdown-pdf)

```
npm -g install markdown-pdf
```

npmの代わりに[yarn](https://yarnpkg.com/)を使うと、なんと14秒でインストールできます。


```
markdown-pdf test.md
```
で実行ディレクトリに、`test.pdf`が生成できます。

どうも[Remarkable](https://github.com/jonschlinkert/remarkable)で一度htmlに変換してから、[PhantomJS](http://phantomjs.org/)を使ってPDFに変換しているようです。

### 警告

Nodeの7系だと

```
(node:19145) DeprecationWarning: Calling an asynchronous function without callback is deprecated.
(node:19145) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 2 end listeners added. Use emitter.setMaxListeners() to increase limit
(node:19145) DeprecationWarning: Calling an asynchronous function without callback is deprecated.
(node:19145) DeprecationWarning: Calling an asynchronous function without callback is deprecated.
(node:19145) DeprecationWarning: Calling an asynchronous function without callback is deprecated.
```

6系だと

```
(node:19234) Warning: Possible EventEmitter memory leak detected. 2 end listeners added. Use emitter.setMaxListeners() to increase limit
```

4または5系だと

```
(node) warning: possible EventEmitter memory leak detected. 2 end listeners added. Use emitter.setMaxListeners() to increase limit.
Trace
    at SeriesStream.addListener (events.js:252:17)
    at SeriesStream.Readable.on (_stream_readable.js:673:33)
    at SeriesStream.on (/Users/shigerunakajima/.config/yarn/global/node_modules/series-stream/index.js:12:38)
    at SeriesStream.once (events.js:278:8)
    at SeriesStream.Readable.pipe (_stream_readable.js:486:9)
    at SeriesStream.pipe (/Users/shigerunakajima/.config/yarn/global/node_modules/series-stream/index.js:22:30)
    at /Users/shigerunakajima/.config/yarn/global/node_modules/stream-from-to/index.js:101:25
    at /Users/shigerunakajima/.config/yarn/global/node_modules/mkdirp/index.js:48:26
    at FSReqWrap.oncomplete (fs.js:82:15)
```

警告が出ます。動くので気にしないで使いましょう。

# ダメだった方法
pandocを使ってWordに変換するのは、本当に体裁が残念です。
特にテーブルに対応していないのが悲しいです。

- [Markdownで印刷体裁が整備された文書を作成したくて、pandocを使ってみました - Qiita](http://qiita.com/u6k/items/915bd8edcdcfc317ba38)

# 参考
- [Convert Markdown to PDF without LaTeX - Software Recommendations Stack Exchange](http://softwarerecs.stackexchange.com/questions/3588/convert-markdown-to-pdf-without-latex)
- [Markdownでドキュメントを作成する « androidnote](http://androidnote.logdown.com/posts/156948-markdown)
- [Markdown なファイルを Windows で PDF で出力する（印刷する）方法 - 約束の地](http://obel.hatenablog.jp/entry/20160901/1472705563)
- [PandocでMarkdownからPDF化を試してみた - ARMERIA](http://betrue12.hateblo.jp/entry/2015/04/10/003830)
- [Markdown ファイルを PDF に変換する。 - Qiita](http://qiita.com/spiegel-im-spiegel/items/cdea4a17b44fb59d6320)
- [MarkdownをPDFに変換する「md-to-pdf」は痒いところに手が届く素敵ツール ｜ DevelopersIO](https://dev.classmethod.jp/tool/md-to-pdf/)
Scala でフィボナッチ数列のリストを作成してみる

Scala をちょっと勉強し始めたので，フィボナッチ数列のリストを作成する関数を作成してみました。
（追記：コメント欄が結構もりあがったので，あわせてご覧ください）
次の関数は引数で与えた数値をこえない数列を作成します。

```scala
def fib (l: Int) = {
  var list = List[Int]()
  var a = 0
  var b = 1
  while (b < l) {
    list :+= b
    val c = a
    a = b
    b = c + b
  }
  list
}
```

REPL でも十分打ち込める量だと思います。
REPL なら次のような感じで実行まで持って行けます。

```
scala> def fib (l: Int) = {
     |   var list = List[Int]()
     |   var a = 0
     |   var b = 1
     |   while (b < l) {
     |     list :+= b
     |     val c = a
     |     a = b
     |     b = c + b
     |   }
     |   list
     | }
fib: (n: Int)List[Int]

scala> fib (100)
res1: List[Int] = List(1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89)
```

余談ですが，仕事では Java や Swift をよく使っているので， Scala を使うことはあまりないのですが，たまに別の言語を触ってみると良い刺激になりますね。
Python requestsモジュールを使用してKINTONEにデータを書き込む

# フロー
1. KINTONEで入れ物を作る
2. Pythonからデータ送る
3. うれしい

# KITONEの入れ物
今回は、"Text1"というフィールドコードを持つアプリを作りました。

#Pythonからデータを送る
"abcde"というデータを書き込みます。

```python
#!/usr/bin/python
# _*_ coding: utf-8 _*_

import requests


URL = "https://◯◯◯◯.cybozu.com:443" # URL
APP_ID = "APP ID" # kintoneのアプリID
API_TOKEN = "API TOKEN" # kintoneのAPIトークン


class KINTONE:
    def PostToKintone(self, url, appId, apiToken):
        #KINTONE field code: Text1
        record={'Text1':{'value' : 'abcde'}} #書き込むフィールドコードとデータ
        data = {'app':appId,'record':record}
        headers = {"X-Cybozu-API-Token": apiToken, "Content-Type" : "application/json"}
        resp=requests.post(url+'/k/v1/record.json',json=data,headers=headers)

        return resp


if __name__ == '__main__':
    knt=KINTONE()
    resp=knt.PostToKintone(URL, APP_ID, API_TOKEN)

    print resp.text
```

アウトプットは

```shell-session
{"id":"1","revision":"1"}
```

となり幸せな気分になりました。
VirtualBoxのGuest Additionを手動でインストールする方法

# VirtualBoxのGuest Additionを手動でインストールする方法

1. VirtualBoxマネージャーを起動
2. Guest Addition をインストールしたい仮想マシンを起動
3. 仮想マシンのGUIを表示し、メニューから「デバイス」＞「Guest Addition CDイメージ の挿入...」を選択
4. コンソールにログイン、以下を実行

```sh:root
yum update
yum install gcc make kernel-devel bzip2
mkdir -p /media/cdrom
mount /dev/scd0 /media/cdrom
sh /media/cdrom/VBoxLinuxAdditions.run
```

[引用元：how-to-install-virtualbox-guest-additions-on-centos-via-command-line-only](http://unix.stackexchange.com/questions/18435/how-to-install-virtualbox-guest-additions-on-centos-via-command-line-only)

---
以上ですー
WordpressのPHP入門（Javascriptは知ってる人向け）

# 前提
Javascriptはまあなんとなく知ってる。
Wordpressは初めて。
PHPってJSに似てて、だいたいなんとなくわかる。
そんな人たちに向けた、
いかにさらっと読んでもらって、WordPressへのハードルを下げるかが目的の投稿です。

# 目次
- <?php 〜 ?>
- 変数の頭には$をつける
- if文
- echo
- print_r
- the_\*()とget_the_\*()の違い
- .でつなぐ
- -> って？
- => って？
- add_action()、add_\*()がやたら出てくる
- わからない関数が出てきたときは

# <?php 〜 ?>
PHPの記述をしたいところは、`<?php 〜 ?>`で囲う。
*.phpファイルなのに、わざわざ`<?php 〜 ?>`で囲う！

# 変数の頭には$をつける
変数でも配列でも同じく$を頭につける。

# if文
PHPにはif文に２種類の書き方がある。
## ｛｝ を使う場合。
通常はこちら。function.phpなど。

```php:if文
<?php
if(hoge) {

} elseif(hoge) {

} else {

}
?>
```
PHPの場合、`else if → elseif`。くっつけて書く。

## : を使う場合
この場合は、PHPが１行ごとに区切られるので、if文の中にHTMLが書ける。
テンプレートファイルに使うと便利。category.phpなど。

```php:if文
<?php if(hoge): ?>
  <div class="hogehoge1">asdfasdf</div>
<?php elseif(hoge): ?>
  <div class="hogehoge2">jkl;jkl;</div>
<?php else: ?>
  <div class="hogehoge3">jkl;jkl;</div>
<?php endif; ?>
```
最後は`endif;`でしめる。セミコロンも忘れぬよう。
endifもくっつけて書く。end ifじゃないよ。

# echo
echoは出力するときに書く。
デバッグするときにも便利。console.log的な。

```php:echo
echo $hoge;
```

# print_r()
echoは配列をそのまま出力できないので、配列の中身を確かめたいときは、print_r()を使う。
ほぼデバッグで使用。

```php:print_r()
print_r ($hoge);
```


## the_\*()とget_the_\*()の違い
get_\*は取得した値をPHPの記述で使いたい場合、
the_\*は取得した値をそのままHTMLで出力したい場合に使う。
Wordpress（だけ？）のthe_\*()という関数は、出力も含まれているので、echoがいらない。
下の２つはどちらも同じふるまい。

```php:sample1
echo get_the_title();
```

```php:sample2
the_title();
```

# -> って？
オブジェクトの関数や変数を利用するときに使う。
「の」と置き換えれば読みやすいかも。

```php:sample
$max_page = $wp_query->max_num_pages;
```

```php:sample
if( $tag_query -> have_posts() ):
```


# => って？
配列のkey,valueを指定するときに使う。

```php:sample
$args = array(
'alt' => $hoge,
'title' => $hoge,
);
```

配列の一番最後、「,」残っててもエラーにならないの不思議。


# add_action()、add_filter()がやたら出てくる
function.phpに何か機能を追加するとき、
調べるといつも最後にadd_\*(hogehoge,hogehoge)って書くように言われるけど、なにこれ？

```php:sample
add_action(フック,関数名);
add_filter(フック,関数名);
```
２つ引数があって、２つ目は関数名で前後に記述があるけど、１つ目のこれは何？
１つ目は、フックと呼ばれるもの。
フックはいつのタイミングで呼び出すかを設定する。すでに定められている。
（参考）
[WordPress Codex - アクションフック一覧](
https://wpdocs.osdn.jp/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3_API/%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%95%E3%83%83%E3%82%AF%E4%B8%80%E8%A6%A7)

[WordPress Codex - フィルターフック一覧](https://wpdocs.osdn.jp/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3_API/%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E3%83%95%E3%83%83%E3%82%AF%E4%B8%80%E8%A6%A7)

関数名は呼び出す関数を書く。()はいらないよ。
''でくくってるから、ややこしい。文字列かと思う。

# わからない関数が出てきたときは
[wp + 関数]でぐぐったら、誰かが解説してくれてる。

○WordPress マニュアル
[https://wpdocs.osdn.jp/Main_Page](https://wpdocs.osdn.jp/Main_Page)
検索するときは、関数名そのままだとひっかからない。なんで！
get_the_title()の場合は、`get the title`と_を抜いて検索。

WordPressマニュアルになかったらこちら。PHPのマニュアルで調べてみる。
○PHPマニュアル
[http://php.net/manual/ja/index.php](http://php.net/manual/ja/index.php)
Raspberry Pi のセットアップ - 2017年1月版

# Raspberry Pi ハードウェア

* [Raspberry Pi 2 Model B](https://www.raspberrypi.org/products/raspberry-pi-2-model-b/) （3 ではありません）
* SDカード 16GB(Class10)

# Raspbian の設定

## 起動用 SD カードの作成

Windows の PC で以下の手順を行う。

[Raspberry Pi](https://www.raspberrypi.org/) のサイトから、NOOBS を[ダウンロード](https://www.raspberrypi.org/downloads/noobs/)する。

今回は、以下のファイルをダウンロードした。

NOOBS
Offline and network install
Version:2.1.0
Release date:2016-11-29

ダウンロードした圧縮ファイルを解凍する。

解凍したファイルの中の"INSTRUCTIONS-README.txt"に書かれている以下の手順を行う。

1. フォーマットツールの SDFormatter を[ダウンロード](https://www.sdcard.org/downloads/formatter_4/eula_windows/)する
1. SDFormatter をインストールする
1. SDFormatter を起動し、"オプション設定"をクリックし、論理サイズ調整を"ON"にする
1. "フォーマット"ボタンをクリックする
1. フォーマットしたSDカードに、解凍した NOOBS ファイルをコピーする
1. SDカードを Raspberry Pi に差し込み、電源を入れる

## Raspbian のインストール

ここからは、Raspberry Pi での作業

NOOBS の画面が表示されるので、"Raspbian" にチェックを入れ、"Install" をクリックする。

画面下の"Language"、"Keyboard" はデフォルト（Language: English, Keyboard: gb）にしておく。

プログレスバーが 100% になるまで待つ。

約30分後、"OS(es) Installed Successfully" と表示されるので、"OK" をクリックする。

Raspberry Pi が起動して、自動的にログインし、ウィンドウシステムが起動され、まっすぐに伸びる道路の壁紙の画面となる。

画面左上の LXTerminal のアイコンをクリックして、LXTerminal を起動し、バージョンなどを確認してみると以下のようになっている。

```shell-session
$ cat /etc/debian_version
8.0
$ cat /etc/issue
Raspbian GNU/Linux 8 \n \l
$ echo $LANG
en_GB.UTF-8
```

## Locale, Timezone の設定

左上の Raspberry Pi のマークをクリックし、 "Preferences" - "Raspberry Pi Configuration" を選択して、設定画面を表示させる。

"Localisation" タブを選択し、"Set Locale" をクリックする。
以下のように選択し、"OK" をクリックする。
Language: ja(Japanese)
Country: JP(Japan)
Character Set: UTF-8

"Set Timezone" をクリックする。
以下のように選択し、"OK" をクリックする。
Area: Asia
Location: Tokyo

"Raspberry Pi Configuration" の画面の "OK" をクリックすると、リブートの確認画面が表示されるので、"Yes" をクリックする。

再起動後、ゴミ箱の文字が日本語で表示されている。

## キーボードの設定

デフォルトでは英語のキーボードになっているので変更する。
左上の Raspberry Pi のマークをクリックし、"設定" - "Raspberry Pi の設定" を選択して、設定画面を表示させる。
"ローカライゼーション" タブをクリックする。
"キーボードの設定" をクリックする。
以下のように選択し、"OK" をクリックする。
Country: 日本
Variant: 日本語

"Raspberry Pi の設定" の画面の "OK" をクリックする。

## フォントの設定

### フォントのインストール

MigMix フォントを使いたいので、以下のコマンドで MigMix フォントをインストールする。

```shell-session
$ sudo apt-get install fonts-migmix
```

### System Font の設定

左上の Raspberry Pi のマークをクリックし、 "設定" - "Appearance Settings" で設定画面を表示させ、"System" タブの "Font" を [MigMix 2M Bold 12] に設定する。

### LXTerminal のフォントの設定

"編集" - "設定" で設定画面を表示させ、[Migu 1M Regular 12] に設定する。

## 日本語入力の設定

今回は、Google 日本語入力のオープンソース版である [Mozc](https://ja.wikipedia.org/wiki/Google_%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%85%A5%E5%8A%9B#Mozc) をインストールする。
以下のコマンドを実行する。

```shell-session
$ sudo apt-get update
$ sudo apt-get install uim uim-mozc
```

正常に実行できたら、左上の Raspberry Pi のマークをクリックし、"Shutdown" - "Reboot" を選択し、リブートする。

再起動後、画面右上に　"Mozc" のアイコンが表示されている。

キーボードの "半角/全角" キーで、日本語入力の切り替えができるようになる。

参考
[Raspberry Pi 2 で日本語表示/入力できるようにする](http://dekirukana-dekirukana.hatenablog.com/entry/2015/12/12/005537)

以上で、基本設定は終了。
画像貼り付けてレビューできるFileStage

久々に、これは便利かもしれない！って思ったサービス！
まだちょっと触ってみただけですが、、、

https://filestage.io/

画像（webサイトのモックとか）をアップロードしてレビュワーを招待してレビューできるだけっぽいんですが、
さくっと使えて直感的でいいなって思いました。

---

こんな感じで画像の任意の場所にレビューコメント書けるみたいです

![image](https://qiita-image-store.s3.amazonaws.com/0/105934/f47f5779-5038-fa7f-3d7d-603c5cfda12a.png)

cacooとかでも似たようなことできそうですが、軽くてシンプルなのでいいな〜って思ってます！
Xcode 8.3 Beta は Swift 2.3 対応していません(2017/01/27)

# Xcode 8.1(8B62) では、iOS 10.2 用のビルドできません
開発環境によってはスケジュールにインパクトがある内容かと思いますのでメモ書いておきます。
開発用の iOS のバージョンを 10.2 にあげたところ、Xcode　でサポート対象外と出てビルドできなくなったので、新しい Xcode を入れることにしましたが、新しい Xcode では Swift 2.3 のプロジェクトのビルドができません。
以下詳細です。

## Xcode 8.3はまだBETA版しかありません
AppStore を見ても新しいバージョンがないので、以下よりベータ版(.xipファイル)をダウンロードしてインストール
[Xcode 8.3 beta](https://developer.apple.com/download/)

* 要Sierra (10.2)
* ダブルクリックで解凍→インストールされますが、現在の Xcode とは別インストールで継続して使えます。

## Xcode8.3 を起動すると、古いSwift対応しないという警告が出る

Swift3 にコンバートするか？→いいえ→サポートしてません

素直に Swift3 に移行すればいいのですが、プロジェクトのソースはともかく、Pod で拾ってきたファイル入れ替えたり、場合によっては書き直したり…ちょっと工数がかかると思いますので、ご利用は計画的に。
OS・ミドルウェアのサポート終了期限

OS・ミドルウェアのサポート終了期限について
RHEL関連のサポートについて

http://qiita.com/shogomuranushi/items/10df42a3c7037d588efc
をベースに、出典URLを追記します。

# Red Hat Enterprise Linux およびRHEL同梱ミドルウェア

## RHEL OS 
|OS version |サポート期限 |
|---------|------------|
|RHEL 5.x | 2017/3/31  |
|RHEL 6.x | 2020/11/30 |
|RHEL 7.x | 2024/6/30 |
|RHEL 8.x | 2029/5/31 |

 End of Production 3 (End of Production Phase)
https://access.redhat.com/support/policy/updates/errata



## OpenJDK (RHEL同梱)

|OS version |サポート期限 |
|---------|------------|
|OpenJDK 6 (1.6) | 2016/12|
|OpenJDK 7 (1.7) | 2020/6 |
|OpenJDK 8 (1.8) | 2026/5 |
|OpenJDK 11  | 2024/10 |

以下を参照してください。
https://access.redhat.com/ja/articles/1457743


## Tomcat (RHEL同梱)
RHEL5ではTomcat5、RHEL6ではTomcat6をサポート
RHEL7でのサポートは確認できませんでした
https://access.redhat.com/ja/solutions/2293581

|OS version |サポート対象Tomcat |
|---------|------------|
|RHEL 5.x | tomcat5  |
|RHEL 6.x | tomcat6 |
|RHEL 7.x | ? |
|RHEL 8.x |  削除 |

RHEL8ではtomcatは削除されています
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html-single/considerations_in_adopting_rhel_8/index#tomcat-removal_dynamic-programming-languages-web-servers-database-servers

#ミドル系
## PostgreSQL

初期リリースから5年サポート、その後はEoL

| Version|初期リリース日|サポート期限| 
|----|--------|-------|
|11 |2018/10 |2023/11|
|10 |2017/10 |2022/11|
|9.6 | 2016/9 |2021/9|
|9.5 | 2016/1 | 2021/1|
|9.4 | 2014/12|2019/12|
|9.3 | 2013/9|2018/9|
|9.2 | 2012/9|2017/9|

※9.3およびそれ以前は2019/3時点でサポート切れ
以下
https://www.postgresql.org/support/versioning/
Laravel Eloquentを既存テーブルで使う

# やりたいこと

既存プロジェクトでのLaravel( http://laravel.jp/ )の利用。
EloquentはLaravelで使えるORMだが、デフォルトでのテーブル構造が決まっているので
既存プロジェクトでルールから逸脱している場合には、そのままでは使うことができません。
とはいえ強力な機能なので、利用するための設定ポイントをまとめます。

# 環境

PHP 7.0
Laravel 5.3.29
MySQL 5.7

# 本題

早速ですが、以下が最終的なEloquent Modelの実装です。


```php
<?php

use Illuminate\Database\Eloquent\Model;

class Comment extends Model
{

    // 変更点1
    const CREATED_AT = 'registered_date';
    const UPDATED_AT = 'last_update';

    protected $table = 'comment_t';// 変更点2
    protected $primaryKey = 'comment_id';// 変更点3
    protected $fillable = ['body'];

    public function __construct(array $attributes = [])
    {
        parent::__construct($attributes);
    }
}

```

下記のようなテーブルを想定します。
Eloquentのデフォルトから考えると、テーブル名・主キー・登録日時・更新日時が変わっています。

```sql
CREATE TABLE `comment_t` (
  `comment_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `body` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `registered_date` datetime NOT NULL,
  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`comment_id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
```

詳細を見ておくと

```php:変更点1
    // 変更点1
    const CREATED_AT = 'registered_date';
    const UPDATED_AT = 'last_update';
```

登録日時・更新日時はクラス定数として定義されており、それぞれデフォルトでは

* created_at
* updated_at

となっています。それぞれの名称が異なる場合は上記のように定数を上書きします。

```php:変更点2
    protected $table = 'comment_t';// 変更点2
```

次はテーブル名です。プロパティ ```$table``` として定義されていて、
デフォルトではクラス名の複数形(今回だとcomments)となっています。

```php:変更点3
    protected $primaryKey = 'comment_id';// 変更点3
```

次は主キーの指定です。プロパティ ```$primaryKey``` として定義されていて、
デフォルトではidとなっています。


# まとめ

無事に既存テーブルでEloquentを使うことができました。
全体設計次第では利用しないこともありますが、強力な機能なので選択肢として持っていられるのは良い事ですね。
LaravelはAPIドキュメントがかなり使いやすいので、この他でも利用方法に困った時にはドキュメントを見てみると解決方法が見つかる事が多いです。ありがたい。
https://laravel.com/api/5.3/
DBとHTMLの連携からグラフを表示まで

下記のURLを元に、DBのデータをグラフ化してみる。
ひとまず環境は、windows にxammpをインストールする。
グラフ描写jsはmorrisを選択。

プラスで、DBの選択箇所をPHPで指定する。
参考URL:
http://516.jp/2547

a.png=選択画面
<img width="187" alt="a.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/160387/757a57ec-4bcc-7f9d-cb1f-2a74f93664bb.png">

b.png=グラフ表示画面
<img width="424" alt="b.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/160387/d79617ba-9e1d-6330-aea5-9bc9fe269eaf.png">

こちらがGITHUBのソースコード。
https://github.com/masayukisumi/DB_graph
Mac で SourceTree のインストールから GitHub 連携までまとめ

新しい作業環境で SourceTree をインストールし直してみたら、意外と GitHub の連携とかでつまづいてしまったのでまとめておきます。

# ダウンロード

1. [SourceTree をダウンロード](https://ja.atlassian.com/software/sourcetree)
2. アプリケーションディレクトリに移動。最近のバージョンだと実行時に移動するかどうか聞いてくれます。

# アカウント連携

1. 初回起動時はウィザードからアカウント連携可能。それ以外は「環境設定 > Accounts」から追加。![アカウント追加](https://qiita-image-store.s3.amazonaws.com/0/20994/38096f18-f5cf-64ed-e9f0-93dfae913bb5.png)
2. 「ホスト」を「GitHub」に設定
3. 「Connect Account」から GitHub ログインフォームが表示されるので、ログイン
4. 「プロトコル」は「SSH」を選択
5. 「キーを生成しました。」をクリック。日本語がおかしいけど気にしない。
6. PassPhrase の入力フォームが表示されますが、空白のままでも大丈夫です。というか面倒になるので自分は入れていません。。
7. 裏っかわで `.ssh/config`, `.ssh/xxx_GitHub.pub`, `.ssh/xxx_GitHub` が作成されています。 [^1]
8. 「OK」をクリック。この時、GitHub の[SSH keys](https://github.com/settings/keys)にキーがコピーされます。地味に便利。![スクリーンショット 2017-01-27 9.33.07+.png](https://qiita-image-store.s3.amazonaws.com/0/20994/662d0c99-fe81-0aad-085f-b3c98518e081.png)
 
[^1]: xxx には GitHub のアカウント名が入ります。

# GitHub からクローンする

「ウィンドウ > リポジトリブラウザを表示」からリモート(GitHub)のリポジトリをクローンできます。
Angular2 (ver2.0.x)で async/await機能を導入する

## 背景

Angular2のhttpモジュールを使っているとよくある話だと思いますが、このhttpモジュールで取得したデータを、変数に保存して直ぐに参照すると保存されておらず、undefinedなどの理由でエラーになることがありますよね。（特にconsole.logなどで参照してやりがち…）

このhttpモジュールのhttp通信は非同期処理で、戻り値はObservableまたは変換したPromiseオブジェクト。これが『将来的には格納される値』なので起こるようです。

上級プログラマの方は対処できると思いますが、私はそうでもないので、どうしよう？と思ってしまいました。

（更なる背景は、OAuth2のトークンを取得して直ぐ使いたい、ということだったんですが、それについては、[こちら](http://qiita.com/tamaex/items/ae1a978ddc2ff7b0eeee)）


## async/await機能が使える環境を構築する

そして、こういうときは待ち合わせ機能を記述しますが、Typescriptではasync/await機能が用意されていますので、これを使いたいところです。（書き方は[こちらの記事](https://sbfl.net/blog/2016/07/13/simplifying-async-code-with-promise-and-async-await/)と[こちらの本](http://azu.github.io/promises-book/)）

しかし、どうして、現時点（2016年12月〜2017年1月時点）では、ng newコマンドで作ったAngular2のデフォルトの環境では使えないので、少し設定を変更する必要があります。

async/await機能を使えるのは、
a) 開発環境Typescript 1.7以上　+ 実行環境 ES6
b) 開発環境Typescript 2.1以上　+ 実行環境 ES5

という条件ですが、現時点ではAngular2の環境は、Typescript 2.0.x + ターゲット実行環境 ES5ですので、a) か b) に合わせることになります。結論としては、a) は可能、b) は難しいようです。

a) の設定は、tsconfig.jsonで、コンパイルオプションであるtarget実行環境をes5からes6に変更することで実現できます。

```tsconfig.json（2016年12月時点）
{
  "compilerOptions": {
    "lib": ["es6", "dom"],
（中略）
    "module": "es6",
（中略）
    "target": "es5",
  }
}
```
この最後の"target"を"es6"にします。

[以前では、Babelを使ってさらにコンパイルをかける必要があったようです](http://qiita.com/ovrmrw/items/ff6c6a7f4a08e6bb0b01)が、今回は必要ではありませんでした。


もう一つの方法 b) は、設定ファイルだと以下の個所が該当します。

``` package.json（2016年12月時点）
  "devDependencies": {
    "@angular/compiler-cli": "^2.3.1",
（中略）
    "typescript": "~2.0.3"
  }
```

ところが、[ES5をサポートしたType script2.1](http://qiita.com/ohgiwk/items/aeb8a726e2b6bfc33a49)ですが、Angular2の環境で、単純にupdateすることができません。

2016年12月の時点では、Type Script 2.1に上げると[Angularがエラーになる](http://stackoverflow.com/questions/41363148/angular2-error-after-updating-to-typescript-2-1)、更に[Angular-cliがハングする](https://blogs.msdn.microsoft.com/typescript/2016/12/07/announcing-typescript-2-1/)という事象が報告されています。→文中の「Just don’t upgrade if you’re using Angular 2! Breaks Angular-cli (hangs while trying to build project).」です。
Codeigniter 2 x Scrutinizer CIでユニットテストを自動化するまで

この記事は[CodeIgniter Advent Calendar 2016](http://qiita.com/advent-calendar/2016/code_igniter)の16日目です。

# 概要
業務でレガシーなPHPアプリケーションを運用しており、改善のためにScrutinizer CIを導入しています。
Scrutinizer CIはソースコードの静的解析がメインの機能ですが、ユニットテストの実行もサポートしており、一番安いベーシックプランから利用できます。
導入までに何箇所か躓いたので、備忘録のために残します。

# 前提
 - GitHubでコードを管理している
 - Scrutinizer CIにリポジトリを登録している
 - Codeigniter 2.0.3を利用している

# CIUnitをインストール
CIUnitはCodeigniterでPHPUnitを使うためのツールです。
以下のURLにCodeigniter 2.0.3へのCIUnitのインストール方法が詳しく説明されています。
http://d.hatena.ne.jp/Kenji_s/touch/20110905/1315190819

# Scrutinizer CIで任意のPHPバージョンをインストール
任意のバージョンのPHPでアプリケーションを実行したい場合は、settings->configurationで以下の設定を追記します。
2017/01/27時点で、5.4.41からサポートしています。

```yml
build:
    environment:
        php: 7.0.6
```

参照:https://scrutinizer-ci.com/docs/build/environment

# PHPUnitをインストール(Composer)
リポジトリにcomposer.jsonがあると、自動的に`composer install`を実行してくれるので便利です。
Composerを使ってのPHPUnitのインストール方法は以下にあります。
https://phpunit.de/manual/4.8/ja/installation.html#installation.composer

# phpunit.xmlを作成
`./vendor/bin/phpunit`でユニットテストが実行できるように、以下のような設定ファイルを用意します。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<phpunit
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/4.5/phpunit.xsd"
        colors="true"
        backupGlobals="false"
        backupStaticAttributes="false"
        stopOnFailure="false"
        bootstrap="./applications/third_party/CIUnit/bootstrap_phpunit.php">
    <filter>
        <whitelist>
            <directory>./applications/</directory>
            <exclude>
                <directory>./applications/third_party/</directory>
                <directory>./applications/views/</directory>
            </exclude>
        </whitelist>
    </filter>
    <testsuites>
        <testsuite name="ControllerTests">
            <directory suffix=".php">./tests/controllers/</directory>
        </testsuite>
        <testsuite name="HelperTests">
            <directory suffix=".php">./tests/helpers/</directory>
        </testsuite>
        <testsuite name="LibTests">
            <directory suffix=".php">./tests/libs/</directory>
        </testsuite>
        <testsuite name="ModelTests">
            <directory suffix=".php">./tests/models/</directory>
        </testsuite>
        <testsuite name="SystemTests">
            <directory suffix=".php">./tests/system/</directory>
        </testsuite>
    </testsuites>
</phpunit>
```

# Scrutinizer CIでユニットテスト実行の設定をする

settings->configurationで以下の設定を追記します。

```yml
build:
    environment:
        timezone: 'Asia/Tokyo' # デフォルトUTC
    tests:
        override:
            -
                command: './vendor/bin/phpunit --coverage-clover=.coverage.xml'
                coverage:
                    file: '.coverage.xml'
                    format: 'clover'
                idle_timeout: 600 # タイムアウトの設定*
```

* 適宜変更してください。

# まとめ
 - データベースが関連するテストなどは、もう少し複雑な設定が必要と思います。
 - とりいそぎ、libraryやhelperなどの、外部APIとの関連がないクラスをテストしたい場合は、サクッと設定できて幸せになれます。
 - 長期的にソースコードを保守しなければならない場合、ソースコードの劣化に早く気づけるようなツールは必須ですので、やってみてください。
 - そのほか、指摘等あればお願いします。
Atomのlinter-phpで使用するPHPのバージョンをPHP 7にする

普段は[Atom](https://atom.io)でプログラミングをしています。
Atomの拡張プラグインには様々な便利なツールがありますが、中でもコードの文法などをチェックしてくれるlinter系のプラグインには大変お世話になっています。

自分は主にPHPを用いた開発を行っているので、lenter系でも特にPHPのソースコードの文法などをチェックしてくれる[linter-php](https://atom.io/packages/linter-php)を使用しています。

しかしある日、PHP7で下記のようなコントローラーを実装していると、constで配列の定数を宣言している箇所で、なにやらエラーが表示されていました。

```php
class ArticleController extends Controller
{
    const LABELS = ['tokyo', 'hokkaido'];
```

PHP5.6以降からは`const`で[配列定数が定義できるようになったのですが](http://php.net/manual/ja/language.constants.syntax.php)、どうやらlinter-phpでチェックされているのはそれ以前のバージョンのようでした。


今回はこのlinter-phpでチェックされるPHPのバージョンを7に対応するためにやったことを備忘録としてまとめたいと思います。

## 1. linter-phpのバージョンをアップデートする

単純にlinter-phpのバージョンが古い可能性があるので、まずはAtomの設定画面からプラグインのアップデートを行いました。
下記のような画面からlinter-phpのバージョンをアップデートしましょう :+1:

※すでにアップデート済みなのでこの画面の候補には出てきてないですが…
![image](https://qiita-image-store.s3.amazonaws.com/0/42852/663a9b67-6e3c-7837-9836-731ed50235f1.png)


## 2. linter-phpが使用するPHPのパスを書き換える

まず下記のようなコマンドでAtomの設定ファイルを開きます。

```
vi .atom/config.cson
```

そして、下記のような記述をするのですが、ここできちんとPHP 7のパスを書くようにしましょう。
パスを調べるには`which php`を実行します。
もしそもそもPHP 7がインストールされていなかったら、PHP 7のインストールからはじめましょう。

```~/.atom/config.cson
  "linter-php":
    executablePath: "/usr/local/opt/php70/bin/php"
```

これで、PHP 7の記述にもlinter-phpがチェックしてくれるようになります！
phalcon php save()の動き

phalcon php 3.0.3

# phalcon のsave()時のvalidation（検証）動作について
Users モデルのdeleted フラグに1(TRUE)をセットしたいというだけなので、SQL的にいうと

```sql

UPDATE Users SET deleted = 1 WHERE user_id = :user_id:
```

ってやりたいだけなので、

```
$user = new Users();
$user->user_id = 12345;
$user->deleted = 1;
$user->save();
```

とすると、email is requireみたいなエラーが沢山でてきます。

テーブル（モデル）構造にuser_id以外の項目に対して、not nullが付いている場合の動作です。not null がついていると勝手に入力チェックしているようです。
validationしてくれているってことですね。

たとえば、

```
$whiteList = ["deleted"];
$user->save(null, $whiteList);
```

としても結果は同じ。
このwhiteList(ホワイトリスト）は、実際にUPDATE文が実行されるときに他のフィールドはセットしないというだけであって、validationしないというものではありません。ちゃんとホワイトリストと関係なくvalidationします。

つまり、
モデル全体のvalidate
↓
saveのwhiteList参照しUPDATE/INSERT実行
ということ。


じゃ、validationしないでほしい、とおもって
modelに
skipAttribute=array();
を指定するとしなくなるのですが、これは全てにおいてValidationしなくなります。

ということで、このvalidationのことを考えて

```
$user = new Users();
$user->findFirst(1);
$user->deleted = 1;
$whiteList = ["deleted"];
$user->save(null,$whiteList);
```

これがベストなのかなと。
いったん１レコードすべて取得しておく。そうすることでvalidateを通過させる。

関係ないところはvalidateさせないほうがもっと高速な印象ありますが、いまのところ私の中でのベスト回答なのかなと。

もっとこうしたほうがいいよとか、ご意見合ったら伺いたいです。
【jQuery】画像の遅延読み込み

画像を大量に読み込むような場合、読み込むまでに時間がかかる。
読み込むまでの間、なにも表示されないと「壊れたかな？」と思ってリロードされる場合がある。
そうなると逆に負荷がかかり、余計に表示されなくなってしまう。

そこで、画像を表示する直前まで画像の読み込みをしないようにしてサーバ負荷を軽減する。
と同時に、ローディング中表示をすることによって余計な操作をさせないようにする。



#Lazy Loadの準備
jQueryのLazy Loadプラグインを使うことにする。
jQueryのプラグインなので、jQueryの後に読み込む。
同一サーバとの同時コネクション数に制限があるため、
スクリプトやCSSを外部から読み込む際は別サーバにした方がよい。
jQueryはGoogleのCDNを使ってみる。

`<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="js/jquery.lazyload.min.js"></script>`

#imgタグの設定
従来はimgタグのsrc属性で読み込む画像を指定していたが、LazyLoadプラグインではdata-original属性で読み込む画像を指定する。
src属性には、読み込み終わるまでに表示する画像を指定。今回はロード中画面を指定する。

`<img class="lazy" src="img/gif-load.gif" data-original="image/graph1.jpg">`

#プラグインの実行
読み込んだオブジェクトに対して遅延読み込みを実行させる。
オプションを指定できる。サンプルで指定したオプションは以下の通り。
effect・・・フェードイン
effectspeed・・・500ミリ秒
threshold・・・画像読み込みまでのピクセル数
`<script>
  $('.lazy').lazyload({
    effect: 'fadeIn',
    effectspeed: 500,
    threshold : 10,
  });
</script>`
シェルスクリプトを実行できるようになるまで(基本知識）

#はじめに
この記事では主に「これからシェルスクリプトをやりたい！」や「bashのことを勉強しはじめたい」向けの記事です。使用環境は、

```:バージョン
* macOS Sierra 10.12.2
* bash　3.2.57
```
です。
シェルの記事をこれから書いていきたのですが、実行したい！けどやり方は？ってなって別の人の記事を探すより、この記事があることを念頭においたらスムーズにこれから進むかと。

#シェル・シェルスクリプトとは
**シェル**とは、日本語で「殻」という意味で、OSの中核をなすカーネルを包み込みように存在し、ユーザーのコマンド入力を受けて、シェルに渡して、実行結果を表示します。

シェルにあらかじめ渡すコマンドをテキストファイルにしたものを**シェルスクリプト**といいます。
C言語と比較されがちですが、C言語はコンパイラ言語（コンパイルが必要）で、シェルスクリプトは**インタラクティブ言語（対話型）**であり、**シェルスクリプトはOS依存性がない**点が大きな違いだ。どっちで実装しやすいかは判断しないといけません。
bashは最も使われているシェルの種類の一つで、ash,shなどたくさん種類はあり、歴史を辿るとかなり長いです。(bashで十分です)
そもそもカーネルとは

>アプリケーションソフトウェアとコンピュータのハードウェアを結び付ける、階層型に設計されたオペレーティングシステム (OS) の中核となる部分である。
>　　　　　　　　　　　　　　　　　　_wikipediaより引用_


自分が使用しているシェルは以下のコマンドで確認でき、

```Bash:terminal
$ echo $SHELL #シェル変数SHELLの値を表示
```

または

```Bash:terminal
$ echo $SHELL #シェル変数SHELLの値を表示
```

で確認できまず。ちなみにシェルスクリプトではコメントを#使って書きます。bashのバージョンは

```shell-session:terminal
$ echo $BASH_VERSION 
```
で確認でき、以下でログインシェルを変更できる。


```Bash:terminal
$ chsh -s /bin/bash
```

※あまり変更する必要はないと思います。

# 実行の仕方
まず、テキストファイルを作成しないといけないが、vimなどのエディタで作る。
今回はHello!をterminal(シェルのUI)で表示するのが目的なので、

```Bash:terminal
$ vim hello.sh
```
で開き

```shell-session:hello.sh
#!/bin/sh #今回はshをつかうため、絶対パスを通す。

echo 'Hello!'
```
として、以下のコマンドで実行したが、実行権限はないため、実行権限を与える。

```Bash:terminal
$ chmod 744 hello.sh
```
で実行権限をもらったのち、実行する。これを知らない人はこちらの[記事](http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230728/?rt=nocnt)を読んで理解することをオススメする。
**これを忘れて「実行できない！」とドツボにはまってしまい、変な人に権限を知らぬ間に与えてセキュリティー的にも問題なので、初心者が多いので注意！**

```Bash:terminal
./hello.sh
```
これでHello!と表示されれば成功である。
./とカレントディレクトに実行パスが通ってないためである。

#まとめ
シェルスクリプトを実行までの手順は

- テキストファイルを作成(拡張子はshとするとわかりやすい)
- 実行権限をchmodで自分に付与
- 実行

である。この記事により、実行までの手順がわかったと思う。
VINモデルを使ってみる

##はじめに
NIPS2016でBest Paper Awardを受賞したValue Iteration Networksを早速使ってみる。

論文はこちら
http://papers.nips.cc/paper/6046-value-iteration-networks

今回使う著者らのgithubのコードはこちら。
https://github.com/avivt/VIN
Theanoを使っている。pythonは2.7系が必要。

今回は使わないがTensorFlow版のコードはこちら
https://github.com/TheAbhiKumar/tensorflow-value-iteration-networks
こちらはpython3.5系が必要。

##パソコン環境
OS:Ubuntu 14.04
GPU:GTX 1070
CUDA 8.0 RC
cuDNN 5.1
python 2.7.6
Theano 0.8.2
Matlab 2016b
MatlabBGL
など

##コードとdataの入手
まずコードをgit cloneする。

```
git clone https://github.com/avivt/VIN.git
```

data生成やtrainingのscriptは`scripts/`ディレクトリにあるらしい。

`make_data_gridworld_nips.m`がデータを生成するコード。Matlabのファイルとなっている。

```
matlab
```

でmatlabを立ち上げる。
子クラスに動的にクラスメソッドを生成させる

イメージ

```rb
module Parent
  module MethodList
    A = 1
  end
  
  class Hoge
    # ...
  end
end

module Child
  module MethodList
    B = 10
  end

  class Hoge < Parent::Hoge
    define_method_from_list MethodList
  end
end

Hoge.a # => 1
Hoge.b # => 10
```

特異クラスを利用することで解決することが出来る。

ポイントは以下。

- クラスメソッドは特異クラスのインスタンスメソッドとして定義される
- `define_method`はインスタンスメソッドを定義する

つまり、

- `Parent::Hoge`は特異クラスの特異クラスで`define_method_from_list`を定義する
  - メソッド`define_method_from_list`は`Parent::Hoge`の特異クラスのクラスメソッドになる
- `Parent::Hoge`の特異クラスで`define_method_from_list`を実行する
  - `Parent::Hoge`の特異クラスにインスタンスメソッドが生成される
    - メソッド`a`は`Parent::Hoge`のクラスメソッドになる
- `Child::Hoge`は`Parent::Hoge`を継承し、同じく特異クラスで`define_method_from_list`を実行する

とすれば良い。

```rb
module Parent
  module MethodList
    A = 1
  end

  class Hoge
    class << self
      class << self
        def define_method_from_list(list)
          list.constants.each do |elm|
            define_method(elm.downcase) do
              list.const_get(elm)
            end
          end
        end
      end

      define_method_from_list MethodList
    end
  end
end

module Child
  module MethodList
    B = 10
  end

  class Hoge < Parent::Hoge
    class << self
      define_method_from_list MethodList
    end
  end
end

p Parent::Hoge.a # => 1
p Parent::Hoge.b # => undefined method `b' for Parent::Hoge:Class (NoMethodError)
p Child::Hoge.a  # => 1
p Child::Hoge.b  # => 10
```
ps コマンドの出力を自分自身を除いて処理したい

```bash ps ax | pgrep firefox  |awk '{print $1}' | xargs kill 
```

```
|_>$ps ax | grep firefox
18273 ?        Sl    11:47 /usr/lib/firefox/firefox http://qiita.com/masalennon/items/96adc909ef0b71f85d6a
18357 ?        Sl     0:00 /usr/lib/firefox/firefox http://qiita.com/masalennon/items/96adc909ef0b71f85d6a
18362 ?        Z      0:00 [firefox] <defunct>
30092 pts/1    S+     0:00 grep --color=auto firefox

```

```
|_>$ps ax | pgrep firefox  |awk '{print $1}'
18273
18357
18362
```