OmniAICreator/Qiita-1.07M huggingface dataset:
(失敗報告)Macでsnmposter

SNMPシミュレータにはいくつかありますので、いくつか使って比較をしたいと思います。
今回はsnmposterをいうSNMPエージェントシミュレータを使ってみます。
ただ、今回は上手く動作させることができませんでしたので、失敗報告になります。

# 環境

MacBook
OS: OS X El Capitan
snmpd: Version: 5.6.2.1
snmpwalk: Version: 5.6.2.1

# 前提ソフトウェア

wgetがインストールされていない場合はインストールしておく。

```
brew install wget
```

# インストール

Virtualenvの設定

```
virtualenv /snmposter
source /snmposter/bin/activate
```

TwistedSNMPのインストール

```
wget http://downloads.sourceforge.net/project/twistedsnmp/twistedsnmp/0.3.13/TwistedSNMP-0.3.13.tar.gz
tar -xzf TwistedSNMP-0.3.13.tar.gz
cd TwistedSNMP-0.3.13
python setup.py install
```

pysnmpのインストール

```
wget http://downloads.sourceforge.net/project/twistedsnmp/pysnmp-se/3.5.2/pysnmp-se-3.5.2.tar.gz
tar -xzf pysnmp-se-3.5.2.tar.gz
cd pysnmp-se-3.5.2
python setup.py install
```

snmposterのインストール

```
pip install snmposter

```

# ファイルの準備 

macbook.snmpwalkの準備

```
snmpwalk -c public -v 1 localhost > macbook.snmpwalk
```

agents.csvの準備

```agents.csv
/Users/butada/Documents/snmpost_test/macbook.snmpwalk,127.0.1.11
```

# 実行(失敗)

snmposterの起動に失敗してしまいました。

```
(snmposter) $ sudo snmposter -f ./agents.csv 
Starting /Users/butada/Documents/snmpost_test/macbook.snmpwalk on 127.0.1.11.
Traceback (most recent call last):
  File "/snmposter/bin/snmposter", line 11, in <module>
    sys.exit(launcher())
  File "/snmposter/lib/python2.7/site-packages/snmposter/scripts.py", line 35, in launcher
    factory.start()
  File "/snmposter/lib/python2.7/site-packages/snmposter/snmposter.py", line 80, in start
    faker = SNMPoster(a['ip'], a['filename'])
  File "/snmposter/lib/python2.7/site-packages/snmposter/snmposter.py", line 109, in __init__
    self.add_oid_value(oid, type_, value)
  File "/snmposter/lib/python2.7/site-packages/snmposter/snmposter.py", line 158, in add_oid_value
    self.oids[oid] = v2c.ObjectIdentifier(value[0])
  File "/snmposter/lib/python2.7/site-packages/pysnmp/asn1/univ.py", line 415, in __init__
    base.SimpleAsn1Object.__init__(self, value)
  File "/snmposter/lib/python2.7/site-packages/pysnmp/asn1/base.py", line 114, in __init__
    self.set(value)
  File "/snmposter/lib/python2.7/site-packages/pysnmp/asn1/base.py", line 218, in set
    value = self._iconv(value)
  File "/snmposter/lib/python2.7/site-packages/pysnmp/asn1/univ.py", line 512, in _iconv
    return oid.OID( value )
  File "/snmposter/lib/python2.7/site-packages/pysnmp/asn1/oid.py", line 22, in __new__
    return cls.fromString( values )
  File "/snmposter/lib/python2.7/site-packages/pysnmp/asn1/oid.py", line 50, in fromString
    "Malformed OID %r"%(value,)
ValueError: Malformed OID 'NET-SNMP-MIB::netSnmpAgentOIDs.16'
```

# 今後

ループバックの作成が必要なのかもしれなので、そのポイントで次回は調査する。

# 参考資料 

https://github.com/cluther/snmposter
callのシンタックスシュガー

## json.() という記法
[rails/jbuilder: Jbuilder: generate JSON objects with a Builder-style DSL](https://github.com/rails/jbuilder)に
`json.(@message, :created_at, :updated_at)`
という記法が出てきた。

## json.() の機能

>   # Extracts the mentioned attributes or hash elements from the passed object and turns them into attributes of the JSON.
  #
  # Example:
  #
  #   @person = Struct.new(:name, :age).new('David', 32)
  #
  #   or you can utilize a Hash
  #
  #   @person = { name: 'David', age: 32 }
  #
  #   json.extract! @person, :name, :age
  #
  #   { "name": David", "age": 32 }, { "name": Jamie", "age": 31 }
  #
  # You can also use the call syntax instead of an explicit extract! call:
  #
  #   json.(@person, :name, :age)

とあるので、`extract!`と同じ

## .() はcallのシンタックスシュガー
[Ruby | 「call」メソッド の Syntax Sugar 「.()」 について - Qiita](http://qiita.com/tbpgr/items/71a2bac3ec53277387d8)

## ちなみにcallシンタックスシュガーのこんなやりとりも見つけた
[Feature #7346: object(...) as syntax sugar for object.call(...) - Ruby trunk - Ruby Issue Tracking System](https://bugs.ruby-lang.org/issues/7346)
HTMLタグの書式と各部の名称

|HTMLタグの書式|各部の名称|
|:-----------|:-----------|
|```<a href="index.html">ホーム</a>```|要素|
|```<a href="index.html">```|開始タグ|
|a|タグ名|
|href|属性|
|"index.html"|属性の値|
|ホーム|要素の内容(コンテンツ)|
|```</a>```|終了タグ|
変数名は英語でつける

変数名は原則として英語で、変数名が保存しているデータの中身がわかるような名前にします。
誰でも知っているような簡単な英語が良いです。

英単語が思いつかなくて困っても、英語辞書を引くのはお勧めしません。
難解な単語をつけがちだったり、辞書で引いても意味を忘れてしまったり、「一目でわかりやすい名前」にならないことが多いからです。
変数名に英単語をつけるには、次のようなものを参考にします。
-日常英会話の本など
-Excelなどの表計算ソフトの関数一覧ヘルプ
技術英語 > Can you [give me a picture of] what we might see at some of these sites? / Could you [give us a brief explanation of] ...? 

@ LOE > March 28, 2003
http://loe.org/shows/shows.html?programID=03-P13-00013

> Can you <font color=red>give me a picture of</font> what we might see at some of these sites?

<hr>
関連して思い出したのは

> Could you <font color=red>give us a brief explanation of</font> ...? 

LOE の別の archive で聞いた気がする。
Mac OS や UNIX 系サーバーに溜まった cron メールなどを削除する

Mac OS X の MAMP PRO などを使っていると、メールが変なところに送信されてしまい、Mac OS X 内でメールが溜まり、ターミナルで開くと、"You have new mail!" なんてメッセージが出てきます。

そんな時は、下記のコマンドでメールを確認し一括に削除できます。

# mail を起動してメールを確認

ターミナルを起動してメールを確認

```
$ mail
```

リストが表示されます。
念の為に内容を確認しましょう。
シンプルに、

```
[改行]
```
を連打してメールをすべて確認できます。
なんかのエラーかもしれないので、一応、確認しましょう。

# mail コマンドを終了

```
exit
```
で Mail を終了します。

# メールを削除

メールを一斉に削除します。

## 自分のユーザー名を確認

```
ls -al /var/mail
```

この結果の例:

```
total 0
drwxrwxr-x@  3 root  mail    102 Feb 28 04:38 .
drwxr-xr-x  36 root  wheel  1224 Feb 28 04:38 ..
-rw-------@  1 katz  mail      0 Mar  7 14:18 katz
```

私の Mac のユーザー名は「katz」であることを確認。このユーザー名を使いますので書き留めてください。

## メールを削除

メールを削除します。

```
cat /dev/null > /var/mail/[ユーザー名]```
```

これで Mac OS や UNIX 系 OS のメールを削除できます。

参考
http://blog.digital-squad.net/article/152808412.html
libsixelを使ってPythonでSixelを出力してターミナルにMatplotlibのグラフを出す。

# やること
[libsixel](https://github.com/saitoha/libsixel)にPython interfaceがあったので使ってみます。

# インストール
省略。

# やりかた
byte列からSixelデータに変換すれば良いのですが、それやろうとするとCのAPI使わなければならなそうだったので、実行時効率を捨てて手軽に実現します。

```py3
from libsixel.encoder import Encoder as SixelEncoder
from libsixel import SIXEL_OPTFLAG_WIDTH, SIXEL_OPTFLAG_HEIGHT
from tempfile import NamedTemporaryFile

def sixeldraw(width=None,height=None):
    with NamedTemporaryFile(prefix="sixel-") as fd:
        pl.savefig(fd,format="png")
        fd.flush()
        encoder = SixelEncoder()
        if width : encoder.setopt(SIXEL_OPTFLAG_WIDTH, width)
        if height: encoder.setopt(SIXEL_OPTFLAG_HEIGHT,height)
        encoder.encode(fd.name)

if __name__=="__main__":
    import matplotlib
    matplotlib.use("Agg")
    import pylab as pl
    import numpy as np
    x = np.linspace(0,1)
    y = x**2
    pl.plot(x,y)
    sixeldraw(640)
```

はい。一時的にファイル作ってグラフ画像を保存します。その画像ファイルをlibsixelのpython interfaceを使ってSixel形式で標準出力に出します。Sixel対応のターミナルを使ってれば画像がでます。

手抜き実装です。
mybatis-spring-boot-starter 1.1の変更点

2016年4月19日のリリースされた1.1(1.1.1)の変更点をまとめました。
なお、mybatis-spring-boot-starterの使い方については、[こちら](http://qiita.com/kazuki43zoo/items/ea79e206d7c2e990e478)をご覧下さい。

# 依存ライブラリの必須バージョン
mybatis 3.4+、mybatis-spring 1.3+が必須です。

# Mapperインタフェースのスキャン対象

バージョン1.0系では、Spring Bootアプリケーション(`@SpringBootApplication`を付与したクラス)が格納されているパッケージ配下に格納されているインタフェースが全てMapperインタフェースとしてスキャンされていました。この仕組みは便利な反面で、意図していないインターフェースがMapperインタフェースとしてスキャンされてDIコンテナに登録されてしまうという問題がありました。 
バージョン1.1系では、Spring Bootアプリケーション(`@SpringBootApplication`を付与したクラス)が格納されているパッケージ配下に格納されているインターフェースのうち、`@rg.apache.ibatis.annotations.Mapper`(mybatis 3.4で追加されたアノテーション)が付与されたインタフェースをMapperインターフェースとしてスキャンします。

> **Note:**
> バージョン1.0系と同じ動作にしたい場合は、`@MapperScan`を使用してスキャンするパッケージを明示的に指定してください。

> ```java:src/main/java/com/example/MybatisDemoApplication.java
> package com.example;
> // ...
> @MapperScan("com.example") // スキャンするベースパッケージを明示的に指定する
> @SpringBootApplication
> public class MybatisDemoApplication {
>     // ...
> }
> ```

# application.propertiesを使用したMyBatisの設定

バージョン1.0系では、MyBatis自体の動作を変更する場合は、MyBatis設定ファイルの`<settings>`タグ内に設定を指定する必要がありました。バージョン1.1系では、MyBatis設定ファイルを使わずに`application.properties`の中に設定を指定することができます。

```properties:src/main/resources/applicaion.properties
mybatis.configuration.map-underscore-to-camel-case=true
mybatis.configuration.default-fetch-size=100
mybatis.configuration.default-statement-timeout=30
```

は、

```properties:src/main/resources/applicaion.properties
mybatis.config-location=classpath:/mybatis/mybatis-config.xml
```
```xml:src/main/resources/mybatis/mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true" />
        <setting name="defaultFetchSize" value="100" />
        <setting name="defaultStatementTimeout" value="30" />
    </settings>
</configuration>
```

と同義です。

> **Note:**
> バージョン1.1.1では、残念ながらIDE上で`mybatis.configuration`配下のプロパティが補完されません。~~これは、https://github.com/mybatis/spring-boot-starter/pull/61 がマージされると解決されます。~~ これは、バージョン1.2（2017/1/2リリース）で解決されました。 :smile: 


# MyBatis設定ファイルのプロパティキー

バージョン1.0系では、`mybatis.config`でしたが、バージョン1.1系では、`mybatis.config-location`になりました。

* 1.1系の指定例

```properties:src/main/resources/applicaion.properties
mybatis.config-location=classpath:/mybatis/mybatis-config.xml
```

* 1.0系の指定例(1.1系では非推奨)

```properties:src/main/resources/applicaion.properties
mybatis.config=classpath:/mybatis/mybatis-config.xml
```

# mybatis.executor-typeのデフォルト値

バージョン1.0系では、`SIMPLE`固定でしたが、バージョン1.1系では、MyBatis設定の設定値(デフォルト値は`SIMPLE`)が適用されます。
【Rails】 jpostal.jpとjp_prefectureを使って郵便番号で住所を自動入力するようにする


## はじめに

ユーザーに住所を登録させたい時は頻繁にあると思います。
そんな時に逐一全ての住所を入れるのは面倒くさいと思うので、郵便番号を入れただけで自動で住所が入ってくれるようにしたいですよね。

今回は郵便番号を入力したら、自動で住所が入ってくれる方法を自分用まとめも兼ねて書いておこうと思います。

※補足
[Railsでjpostal.jpを使って住所を自動入力する](http://ruby-rails.hatenadiary.com/entry/20150112/1421029284)
という記事にほとんど書いてありますが、jp_prefectureを使うところだけ加筆しております。

## 今回使うもの

[jquery.jpostal.js](https://github.com/ninton/jquery.jpostal.js/)
郵便番号を入力すると、自動で住所を自動入力してくれるjQueryプラグインです。

[jp_prefecture](https://github.com/chocoby/jp_prefecture)

都道府県コードと都道府県名を変換するGemです。


## 動作時の環境

- Rails 4.1
- jquery.jpostal.js 2.7

## 前提

基本的には以下を参照していればできると思います。

[Railsでjpostal.jpを使って住所を自動入力する](http://ruby-rails.hatenadiary.com/entry/20150112/1421029284)


ただ上の記事にもありますが、jquery.jpostal.jsだとvalueがidのままだと属性がマッチしないので、value="東京都"のように日本語でもうまく対応させる必要があります。

今回は、上記事で言うところの **プルダウンの都道府県に対応する**の部分です。

jp_prefectureをつかっている場合は以下のような手順を踏むので紹介します。

なおプルダウン都道府県のところ以外は元記事と同じ手順だったため割愛させていただきます。

## 手順

### 1. view側のvalueに都道府県名が入るようにする

```slim
  = f.label :prefecture_id, '都道府県'
  = f.collection_select :prefecture_id, JpPrefecture::Prefecture.all, :id, :name
```

こうなっているかとおもいますが、これを

```slim
  = f.label :prefecture_name, '都道府県'
  = f.collection_select :prefecture_name, JpPrefecture::Prefecture.all, :name, :name, include_blank: true
```

と変えます。
そうすると、HTMLでは

```
<label for="address_prefecture_name">都道府県</label><br>
<select name="address[prefecture_name]" id="address_prefecture_name">
  <option value=""></option>
  <option value="東京都">東京都</option>
  <option value="埼玉県">埼玉県</option>
  <option value="神奈川県">神奈川県</option>
  <option value="千葉県">千葉県</option>
  <option value="茨城県">茨城県</option>
  <option value="群馬県">群馬県</option>
</select>
```

と表示されるかと思います。(address_のところはモデル名による)

### 2. View側に対応させるためにModelにメソッドを追加する

```app/models/address.rb
class Address < ActiveRecord::Base
  def prefecture_name
    JpPrefecture::Prefecture.find(code: prefecture_id).try(:name)
  end
  
  def prefecture_name=(prefecture_name)
    self.prefecture_id = JpPrefecture::Prefecture.find(name: prefecture_name).code
  end
end
```

上のメソッドを追加。細かいコードの意味は[README](https://github.com/chocoby/jp_prefecture)に書いてあるのでそちらを参照ください。

### 3. Controllerのストロングパラメーターを修正する

都道府県のIDをpermitしていたところをprefecture_nameに変更します。下記のようなイメージです。(実際には郵便番号や市区名などカラムがいろいろ入る)

```
private
def address_params
  params.requre(:address).permit(:prefecture_name)
end
```

## おわりに

UX向上をさせるためには住所自動入力といった、さりげない気遣いも必要だと思います。
もし参考になる方がいましたら幸いです。
iPhoneのカメラで撮った写真の解像度一覧

iPhoneのカメラで撮った写真の解像度を調べて一覧にしてみました

|                   | 背面カメラ     |  前面カメラ      |
|-------------------|-------------:|---------------:|
| **iPhone6s**      | 4032 × 3024  |  2576 × 1932   |
| **iPhone6s Plus** |        同上  |          同上   |
| **iPhone SE**     |        同上  |  1280 × 960    |
| **iPhone6**       | 3264 × 2448  |          同上  |
| **iPhone6 Plus**  |        同上  |          同上   |
| **iPhone5s**      |        同上  |          同上   |
| **iPhone5c**      |        同上  |          同上   |
| **iPhone5**       |        同上  |          同上   |
| **iPhone4s**      |        同上  |  640 × 480     |

## スクエア
スクエアサイズは縦横ともに短辺の方の幅となります。
（たとえば、iPhone6sの前面カメラ 2576 × 1932 なら、**1932 × 1932**）
最新のWikiデータをMySQLにDumpする


#### MySQLをインストール
※ インストール手順は省きます。

```
mysql> show variables like "chara%";
```
で全部utf-8なっていることを確認。

```
[mysqld]
...
character-set-server=utf8 #mysqldセクションの末尾に追加

[client]
default-character-set=utf8 #clientセクションを追加
```
ダメな場合は上記を/etc/my.cnfに追加。

#### xml2sqlをインストール
ダウンロードサーバがないので直接makeする。
https://github.com/Tietew/mediawiki-xml2sql

```
$ git clone https://github.com/Tietew/mediawiki-xml2sql.git
$ cd mediawiki-xml2sql
$ ./configure
$ make
$ sudo make install
```

#### wikiのdump用データをダウンロード
```
$ wget https://dumps.wikimedia.org/jawiki/latest/jawiki-latest-pages-articles.xml.bz2
$ bzip2 -d jawiki-latest-pages-articles.xml.bz2
```
データを以下のコマンドで変換

```
$ cat jawiki-latest-pages-articles.xml | sed -e 's/<dbname>.*<\/dbname>//' -e 's/<ns>.*<\/ns>//' -e 's/<parentid>.*<\/parentid>//' -e 's/<sha1>.*<\/sha1>//' -e 's/<model>.*<\/model>//' -e 's/<format>.*<\/format>//' -e 's/<redirect>.*<\/redirect>//' -e 's/<redirect.*\/>//' | xml2sql
```

```
mysql> select page.page_title from categorylinks left join page on categorylinks.cl_from = page.page_id where categorylinks.cl_to = '日本のタレント';
```
任意のコマンドを N 回実行する ntimes 作った

実は探せばあるんじゃないかと思いつつ。.
仕事中に欲しくなってとっさに作ったのでヘルプコマンドとかない雑な感じですが。

GitHub: [yuya-takeyama/ntimes](https://github.com/yuya-takeyama/ntimes)

## インストール

[GitHub のビルド済みのバイナリをあげています。](https://github.com/yuya-takeyama/ntimes/releases)
ダウンロードして適当にパスの通ったところにおいてください。

または Go をインストールしていれば go get でも大丈夫です。

```
$ go get github.com/yuya-takeyama/ntimes
```

## 使い方

```
$ ntimes 3 -- echo foo bar
foo bar
foo bar
foo bar
```

第一引数に繰り返し回数を指定し、`--` の後に実行したいコマンド及びその引数を指定してください。

## 使用例: レスポンスタイムのパーセンタイル値を得る

ここでは curl と、以前紹介した [`percentile`](http://qiita.com/yuya_takeyama/items/4285d4b75f02c67d90fc) を組み合わせます。

```
$ ntimes 100 -- curl -s http://YOUR_URL/ -o /dev/null -w "%{time_starttransfer}\n" | percentile
50%:    0.51
66%:    0.541
75%:    0.578
80%:    0.604
90%:    0.668
95%:    0.793
98%:    1.515
99%:    1.673
100%:   1.842
```

URL は自分が管理しているサーバ等、他人に迷惑のかからないものにしてください。
eccube3系 FTPでさくらの共有サーバにインストールする際の注意書き

eccube3系をFTPでインストールする際に、デフォルトのhtaccessでは、500番エラーが表示される。

どうやら、さくらサーバでの.htaccessのmod_rewriteの書き方が特殊らしい。

/html/ないの.htaccess は、デフォルトで

```
order deny,allow
allow from all
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !^(.*)\.(gif|png|jpg|css|ico|js)$ [NC]
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>
```
RewriteBaseの記述が必要になる。

```
order deny,allow
allow from all
<IfModule mod_rewrite.c>
    RewriteEngine On
　　RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !^(.*)\.(gif|png|jpg|css|ico|js)$ [NC]
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>
```
と記述することで、500番エラーは表示されなくなる。

ECCUBE3系 さくらサーバの共有サーバの場合に発生。
gitで自分のコミットしたコードの行数を数える

#目的
会社での業績評価や対外的なアピールのために、自分の書いたコード行数を説明しないといけないときがあります。
そのときにgitを使用している環境での自動計算コマンドを紹介します。

![スクリーンショット 2016-04-20 1.09.36.png](https://qiita-image-store.s3.amazonaws.com/0/34488/557c6b74-b80c-4a12-2c82-d22230ffa694.png)


#方法
1. .gitのあるフォルダに移動する
2. gitのコミット位置は最新のものにしておく
3. 以下のコマンドを実行する

```
git log --numstat --pretty="%H" --author='あなたの名前' --since=YYYY-MM-DD --until=YYYY-MM-DD --no-merges | awk 'NF==3 {plus+=$1; minus+=$2} END {printf("%d (+%d, -%d)\n", plus+minus, plus, minus)}'
```
（--authorは対象のユーザ名、--sinceと--untilには集計期間を指定してください。）

例：2015年10月1日から2016年3月31日までのコミット行数

```
git log --numstat --pretty="%H" --author='Night___' --since=2015-10-01 --until=2016-03-31 --no-merges | awk 'NF==3 {plus+=$1; minus+=$2} END {printf("%d (+%d, -%d)\n", plus+minus, plus, minus)}'
```
#結果
1234 (+612 -623)　のように左から、
合計行数（+追加行数 -削除行数）　が表示されます。


#注意
1. マージのコミットの行数は含みません（--no-mergesのオプションで除外しています。）
2. パイプ（|）以下のコマンドが算出と出力のための処理です。パイプ以下のコマンドを削ると内容が確認できます。

#参考
コミット行数でなく、リポジトリ内でどれだけ自分が書いた行数があるかを知りたいときは以下を参照してください。
「[そのgitリポジトリで自分の書いたコードの行数を数える。](http://qiita.com/kumagi/items/23db1b7b564db27b53e6)」
RxSwiftで開発中にハマった実装(Part 1)

#RxSwfitの開発で最近ハマったことをまとめてみた！(Part 1)
ここ最近の開発で詰まったあげく、解決するのに時間がかかってしまった実装についてまとめてみました

##ホームのタブをタップした際、そのタブに今いたら最上部までスクロールする実装!

![twitter.gif](https://qiita-image-store.s3.amazonaws.com/0/80383/4b3fc52e-ad63-8e08-853a-3fe89d2fd056.gif)

twitterなどのタイムラインタブをタップするとトップにスクロールする実装！
必要なものは
・１つ前に表示されていたタブのインデックス
・今表示されているインデックス
。。。だけ

**詰まったポイント**　->　どうやって`previousIndex`を取得するか！

はじめの実装

```swift:sample.swift
let currentIndex = Observable
    .of(
        homeButton.rx_tap.map { _ in 0 },
        notificationButton.rx_tap.map { _ in 1 },
        DMButton.rx_tap.map { _ in 2 }
    )
    .merge()
    .startWith(0)
    .shareReplay(1)

let previousIndex = currentIndex
    .takeLast(2)
    .take(1)
```

`index`が流れている`Observable`を`takeLast(2)`で最新の２個を取得し`take(1)`で古い方を取得できるんじゃないか！！

↓
↓
失敗

次に

```swift:sample.swift
let currentIndex = Observable
    .of(
        homeButton.rx_tap.map { _ in 0 },
        notificationButton.rx_tap.map { _ in 1 },
        DMButton.rx_tap.map { _ in 2 }
    )
    .merge()
    .startWith(0)
    .shareReplay(1)

let previousIndex = currentIndex
    .skip(1)
```

最新から`skip(1)`で一個スキップだ！！！

↓
↓
オペレーターの理解ミスwww

<img width="786" alt="Screen Shot 2016-04-20 at 12.39.38 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/80383/a5492997-9135-6750-a5fd-84fd472c1b5e.png">

はじめからn個をスキップ。

ここからが本番！
最初の一個飛ばしてindexをそろえて組み合わせれば！！！

```swift:sample.swift
let currentIndex = Observable
    .of(
        homeButton.rx_tap.map { _ in 0 },
        notificationButton.rx_tap.map { _ in 1 },
        DMButton.rx_tap.map { _ in 2 }
    )
    .merge()
    .startWith(0)
    .shareReplay(1)

Observable
    .zip(currentIndex, currentIndex.skip(1)) { $0 }
    .subscribeNext { (currentIndex, previsouIndex) in
        ...
    }
    .addDisposableTo(disposeBag)
```

これで`skip(1)`をして最初の１個を飛ばした`currentIndex`のストリームを普通の`currentIndex`のストリームと
`index` をそろえてペアに！

<img width="781" alt="Screen Shot 2016-04-20 at 12.43.53 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/80383/a0bcb077-25b9-78b5-978e-5bbf882cd640.png">

今の状態だと、画像上の黄色のAがない感じで一個手前にずれます！
なので、青の1と黄色のBがくっつきます！
これで無事今のindexと１つ前のindexを取得できて、ちゃんちゃん！

あとは`filter { $0.0 == $0.1 }`を`subscribeNext{}`の前に入れてあげると、Twitterのように、タイムラインにいる状態で、再度タイムラインタブをタップしたという状況だけで、なにかアクションを起こすことができます！

**Part 2では`rx_notification`でのキーボード処理でハマったことをまとめます！！**
evalとtoStringで関数を書き換える

Javascriptでは関数を変数のように扱うことが可能です。
つまり、
*「あ…ありのまま 今　起こった事を話すぜ！*
`function calc(a,b){ return a+b; }`
*と定義したと思ったら、いつの間にか*
`function calc(a,b){ return a-b; }`
*になっていた」*
という[状態](http://dic.nicovideo.jp/a/あ...ありのまま%20今%20起こった事を話すぜ!)にすることができます。

```
<script>
    function calc(a,b){
        return a+b;
    }
    window.onload=function(){
        console.log(calc.toString());
        var res0 = calc(1,2);
        calc = eval(calc.toString().replace("+","-"));
        console.log(calc.toString());
        var res1 = calc(1,2);
        console.log("calc(1,2)="+res0+",calc(1,2)="+res1);
    }
</script>
```

結果

```
[Log] 
function calc(a,b){ 
        return a+b;
    }
function calc(a,b){ 
        return a-b;
    }
calc(1,2)=3,calc(1,2)=-1 
```
[MacPorts] Uninstall MacPorts


You could find more information from [here](https://guide.macports.org/chunked/installing.macports.uninstalling.html).

```
1. Remove installed MacPorts.
sudo port -fp uninstall installed

2. Remove all remaining traces of MacPorts.
sudo rm -rf \
        /opt/local \
        /Applications/DarwinPorts \
        /Applications/MacPorts \
        /Library/LaunchDaemons/org.macports.* \
        /Library/Receipts/DarwinPorts*.pkg \
        /Library/Receipts/MacPorts*.pkg \
        /Library/StartupItems/DarwinPortsStartup \
        /Library/Tcl/darwinports1.0 \
        /Library/Tcl/macports1.0 \
        ~/.macports
```
SSH keyを4096bitで作成する

# SSH keyを4096bitで作成するには？

##コマンド

-bオプションで指定
```
ssh-keygen -t rsa -b 4096
```

## bitが違うとどうなるか？

4096bitになると2048bitの2倍の鍵の種類ができるというわけではない。
1bit増えるごとに2倍になるので
2を2048回かけた分だけ鍵の種類が増える。
よってその分だけ解読しづらくなる。
Alpineのユーザー追加にハマった話

#Dockerfile

```Dockerfile
#alpine-image
FROM alpine

#user
RUN echo 'root:root' |chpasswd
RUN useradd -m walrein \
	&& echo "walrein ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers \
	&& echo 'walrein:walrein' | chpasswd

```

なんてことをしていたんですが、

> [91m/bin/sh: /usr/sbin/useradd: not found

とか言われて検索したら

Best way to add user? #38
https://github.com/gliderlabs/docker-alpine/issues/38

このForumに助けられました

>So, two things here:  
There is a adduser that is handled by BusyBox. You are probably looking for adduser -S moxi.
You are trying to install a Debian package on Alpine. This won't work! You need either a musl compatible binary or a way to compile from source.

要はuseraddじゃなくてadduser使うんだよってことらしく


```Dockerfile
#alpine-image
FROM alpine

#user
RUN echo 'root:root' |chpasswd
RUN adduser -S walrein \
	&& echo "walrein ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers \
	&& echo 'walrein:walrein' | chpasswd

```

修正したら問題なくビルド出来ました
GCE(Google Compute Engine)を使ってみたい！〜ubuntuにnginxをインストールする編〜


前編(http://qiita.com/haradahirokikiki/items/5b88d34236a4395bd8d0) では、インスタンスのOSにubuntuを入れました。WEBサーバ構築のため、ubuntuでnginxを入れていきます。

WEｂサーバについてはこちら！
http://qiita.com/haradahirokikiki/items/336fc6ff5a5555ebb286

#Nginx
一日に数億リクエストを処理するような大規模サイトを中心に、近年急速にシェアを拡大しているWEBサーバだそうです。
どのWEBサーバを使うべきか、と周りに聞くと「流行りはNginx！！」とのことなので、Nginxを使うことにします。

# 作業開始！

1. 左タブのVMインスタンスをクリック。すると作成したインスタンスを見ることができる。
2. 一番右の項目 `接続` の `SSH` を押すとターミナルを開くことができる！ここからインストールスタート！


# インストール
[こちら](http://qiita.com/Qiita/items/c686397e4a0f4f11683d)を参考にしました。

上記Qiitaに書いてあるとおりの手順でやります。最初からキーなどという言葉が出てきて少し不安でしたが、この手順でやればできます！！

### nginxサイトが配布しているPGPキーを追加！
 `curl http://nginx.org/keys/nginx_signing.key | sudo apt-key add -` 
 
### リポジトリを一覧に追加
 
```
sudo sh -c "echo 'deb http://nginx.org/packages/ubuntu/ trusty nginx' >> /etc/apt/sources.list"
sudo sh -c "echo 'deb-src http://nginx.org/packages/ubuntu/ trusty nginx' >> /etc/apt/sources.list"
```
 

### nginxをアップデートした後に、nginxをインストール！
```
do apt-get update
sudo apt-get install nginx
```

これでインストールは完了！！と思ったら、nginxを起動させなくてはいけません。

### nginx起動！！
 `sudo service nginx start` 
 
 でOKです。
 
VMインスタンスの `外部IP` をクリックすると、自分のポートに飛べます。ここに **Welcome to nginx!** と書かれていれば成功！
Jenkinsでログインできなくなった場合

# アホでしょ？

って思うでしょう？でもいろいろ設定してるとなるんですw
今までで3回ぐらいはこういう状況になってるかなw
その度に、最初に探した記事を探してて最近（ぇ
探しにくいなと思って、メモることにしましたw

ないない！という感想だと思いますが・・w
プロジェクト毎にセキュリティ設定の時にうっかり自分か最低一人を管理者に設定することを忘れるとこうなるというw
あー前もそうだっと気づいた時にはすでに遅しというw

# 手順
* 一旦Jenkinsを停止させる。
* Jenkinsの ```config.xml``` を編集し、Securityを一旦消す。

```text:/var/lib/jenkins/config.xml
  <mode>NORMAL</mode>
// falseへ変更。
  <useSecurity>false</useSecurity>
// ここから
  <authorizationStrategy class="hudson.security.ProjectMatrixAuthorizationStrategy">
   :    :    
  </authorizationStrategy>
  <securityRealm class="hudson.security.SecurityRealm$None"/>
// ここまでを削除。
  <disableRememberMe>false</disableRememberMe>
```

* Jenkinsを再起動させる。

# 参考サイト

* [Jenkinsの設定まとめ](http://hrt0kmt.hatenablog.com/entry/2015/10/26/153722)
macOS Big SurでLaTeX環境整えた時のメモ(2020, x86_64/arm64対応)

##### はじめに

M1チップ搭載のMac miniを購入したため、記事を更新しました。アーキテクチャの変更に伴ってLaTeXのインストールにも多少変更がありましたが、ほとんどこれまでと同様にLaTeXをインストールすることができます。
事前にCommand Line Tools, homebrewをインストールしてあるものとしています。

##### 環境
* macOS Big Sur 11.0.1 (20B29)
* Xcode 12.2
* Homebrew 2.6.0 (arm64)

---

### Ghostscriptのインストール

既に[arm64対応](https://github.com/Homebrew/homebrew-core/pull/58493)がされているため、Homebrewでインストール。

```
brew install ghostscript
```

### BasicTeXのインストール

BasicTeXはMacTeXからGUIアプリケーション・ドキュメント・を排除したパッケージ（200〜300MB）である。
インストーラは[MacTeX](http://tug.org/mactex/morepackages.html)や[ミラーサイト](https://texwiki.texjp.org/?MacTeX#mirror)からダウンロードできる（[BasicTeX.pkg](http://www.tug.org/mactex/morepackages.html)）。

なお、TeXを利用するためには```/Library/TeX/texbin ``` にパスを通す必要があるが、上記のインストーラによって自動的にパスが設定される(```/etc/paths.d ```に追記される)ので、手動で行う必要はないと思われる。

##### ARMバイナリ（Universal）のインストール[^1]

そのままではx86_64版のみがインストールされている状態なので、ARM対応版バイナリ（Universal）をMacTeXの[About Arm](http://www.tug.org/mactex/aboutarm.html)の[BasicTeX-2020-Universal.pkg](http://www.tug.org/mactex/BasicTeX-2020-Universal.pkg)をインストールする。

### 標準パッケージをアップデートする

TeXLiveのパッケージマネージャである`tlmgr`から付属パッケージの更新をしておく。

```
sudo tlmgr update --self --all
```

### `latexmk`のインストール

BasicTeXには自動タイプセットを行ってくれる `latexmk` が含まれていないようなので、`tlmgr`からインストールしておく。

```
sudo tlmgr install latexmk
```

### 日本語環境に必要なパッケージをインストール

`uplatex`/`platex` やIPAフォントなどの日本語TeX環境に必要なパッケージをまとめたパッケージ `collection-langjapanese` をインストールする。

```
sudo tlmgr install collection-langjapanese
```

---

ここまでの作業で日本語における最小限のLaTeX環境は（一応）整う。以下は必要に応じてインストールするべきパッケージのインストールについて扱う。

### タイプライター（等幅）書体のインストール

 `\texttt{}` や `url`, `listings`, `verbatim` 環境などの等幅フォントを出力する箇所でエラーが起こるため、Courier書体のパッケージをインストールする。

```
sudo tlmgr install courier
```

### jlistingsをインストール

`listings` 環境中の和文フォントを綺麗に出力するため、 `jlisting.sty`をインストールする。
https://osdn.net/projects/mytexpert/downloads/26068/jlisting.sty.bz2/ からダウンロードしてきたディレクトリ（たとえば`~/Downloads`）に移動して、以下のコマンドを実行する[^2]。

```
cd ~/Downloads
bunzip2 jlisting.sty.bz2
sudo mv jlisting.sty /usr/local/texlive/2020basic/texmf-local/tex/latex/listings/
sudo mktexlsr
```

`texmf-local`以下のディレクトリが存在しない場合には自分で作成してください。

```
cd /usr/local/texlive/2020basic/
sudo mkdir -p texmf-local/tex/latex/listings
```

---

##### あとがき

思いのほかApple Silicon Macにもすんなりインストールできました。
先哲に感謝。

[^1]: Intel Macを利用している場合はこの作業は必要ないものの、x86_64/arm64のUniversal Binaryとしてインストールされるため問題があるわけではないと思われる。
[^2]: ダブルクリックで解凍しようとするとアーカイブユーティリティから怒られる（Catalinaのバグ？）ため`bunzip2`で解凍した。
CentOS7 + Zabbix3.0.1 + MariaDB インストール


#これでインストールするもの

CentOS7上

* Zabbix 3.0.1 ServerとAgentとWeb画面
* MariaDB 
* Apache HTTP Server

#インストール手順
(rootでやっちゃったのでsudo省略）

## ApacheとMariaDB
```
yum install httpd -y
yum install mariadb mariadb-devel mariadb-server -y

systemctl enable httpd
systemctl enable mariadb
```

## Zabbix 3.0.1 インストール

### YUMで
```
rpm -ivh http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm

yum install zabbix-server-mysql zabbix-web-mysql zabbix-web-japanese -y
yum install zabbix-agent -y
```

### DB準備 (MariaDB)
```
systemctl start mariadb
mysql -uroot
```

パスワードはとりあえずzabbixにします。書き換えてもおｋ

```
create database zabbix character set utf8 collate utf8_bin;
grant all privileges on zabbix.* to zabbix@localhost identified by 'zabbix';
quit;
```

```
cd /usr/share/doc/zabbix-server-mysql-3.0.1/
zcat create.sql.gz | mysql -uroot zabbix
```

### Zabbixのconf修正

パスワードがコメント化(#)されてるはずなので

```
vi /etc/zabbix/zabbix_server.conf

DBPassword=zabbix
```

時刻がコメント化+Rigaになってますので

```
vi /etc/httpd/conf.d/zabbix.conf

php_value date.timezone Asia/Tokyo
```

### 起動＆自動立ち上げ設定
```
systemctl start zabbix-server
systemctl enable zabbix-server
systemctl start zabbix-agent
systemctl enable zabbix-agent
systemctl start httpd
```

### Web画面にてインストール開始
ブラウザで開く 

```
http://接続アドレス/zabbix
```

(もし表示ができなかったら、下記のトラブルシューティング参照)


```
Next step -> Next step

userとpasswordに
zabbixを入力

Next step -> Next step -> Next step -> Finish
```

## これで終わり

ログインは**Admin / zabbix**です。
大小文字にはご注意。

接続して右上の人のアイコンを押していただくと、言語設定できます。（基本は英語）

##トラブルシューティング
もし途中ダメだったら下の奴らも確認しましょう
### Firewall : 80番ポート開き
```
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload
```

### SeLinuxのhttpd設定
```
setsebool -P httpd_can_network_connect=true
```

以上


和訳元：http://goos.co.kr/geek/1574053

>昔（とはいえ1ヶ月前）Zabbix3.0.1が出た頃、自分の個人サイトにメモっといた、とても簡単な内容ですが
>初投稿です。これからQiitaとMarkdownを使いこなせるように練習がてら移しておきます。
ビジネス的に印象が良く思われる人の特徴

おおむね下記の1,2,3が常に実行できてる人だと思います。
■あなたはなぜ仕事が遅いのか？仕事が早い人の5つの特徴を真似しよう
http://thestartup.jp/?p=16212

上記4,5が出来れば尚良し。

特に意思決定ができることが良いんじゃないかと。
で、「承知しました」の連絡だけで済ませず、ちゃんと個人でTodo管理して
意思決定したタスクに対して自分なり次に繋げる行動を取れる人が、重要視されるんじゃないかと思います。
HP製のEnvy 4500プリンタをCentOS6/CUIで利用する

# 経緯
[高度情報技術者試験](https://www.jitec.ipa.go.jp/1_11seido/db.html)ってご存じですか。
午前1, 午前2, 午後1, 午後2と4つ試験があって、それぞれ60%以上とらないと受からないアレです。
試験日が近づいても"直前で頑張ればどうにかなるだろ"とか思っちゃって、受験票が来てもなんのそのでスプラトゥーンとかやっちゃって、その結果下記画像のようなミラクルが起きます。
![いっつミラクル](https://qiita-image-store.s3.amazonaws.com/0/87944/906ebc36-ad05-1455-89dd-2f500ceb8d3b.png)
まあこれはNWの結果なんですけども。
先週末あったDBでも似たような事が起きそうでして、こう思ったわけです。
**ちゃんと勉強しよう**
## どうすれば勉強できるの
NWとDBと2つ試験を受けてみて気づいたんですが、NWは僕みたいにリバースプロキシをリバース**ド**プロキシとか変な覚え方しなければ電子書籍で事足ります。メモはさほど必要無いくらい。
一方でDBは正規化が分かっていればそれ以上は完全に国語の問題なので、キーワードとなる文章に線を引きたくなる。
"ただし顧客は1回の注文で複数商品を購入できるとする"とか見落とすと死にますし。
つまり前者はKindleで参考書籍でもポチれば事足りるけど、後者は紙で勉強した方が効率が良い。注目すべきポイントがずれてたのかどうかとか、引いた線からも分かるし。
そこで我らがEnvy4500さんの出番なわけです。**印刷して、お勉強。**
## ワシはこうした（する）
勿体ないお化け駆動型学習で行きます。略して"折角印刷したんだからこの分くらいはやっておかないと駆動型学習"。
IPAさんは凄く良い組織なので問題と解答は[ここ](https://www.jitec.ipa.go.jp/1_04hanni_sukiru/_index_mondai.html)から無料でゲット出来ます。
ここで得た問題を**毎朝6時にcronで自動印刷**したい。コマンドラインで印刷っていったらlpだっけ…Envy4500のドライバってあったっけかな…からのこの記事です。

# 目標とするもの
タイトルみて（GUIでの導入はわりと簡単らしいです。他あたって下さい。）

# つくりかた
## 用意するもの
* CentOS6の入った24時間動いてるサーバ
* Envy4500（ワイヤレス接続ONにしたもの）

## メモ
hplipというHP社製の印刷ツールをインストールする。
rpmパッケージが以下より入手出来る。
http://hplipopensource.com/hplip-web/install_wizard/index.html
ダウンロード方法は下記掲載画像参照のこと。
![hplip.png](https://qiita-image-store.s3.amazonaws.com/0/87944/4466deb0-4550-4a5e-d004-bc32c2efb9f1.png)

ただ上記rpmには下記圧縮ファイルには含まれるEnvy4500のppdファイルが何故か含まれていない💢
（この記事書いた一番の理由、これ以外この記事正直いらない）
http://hplipopensource.com/hplip-web/gethplip.html

ということで別途ダウンロードしておいてください。`sh hplip-3.16.3.run`で解凍＆インストール試行してくれます。不完全ですが依存性ライブラリのインストールも試みてくれるのでやっておくと良いかもしれません。
解凍後のhplip-3.16.3ディレクトリ中にあるppd/hpcups/hp-envy_4500_series.ppd.gzが必要なppdファイルです。

入手したrpmは`rpm -ivh`でインストールすると依存性解決しろと煩かったので

    yum -y install hplip-3.16.3_rhel-6.0.x86_64.rpm

でよしなにしてもらいます。ただこれじゃhp-checkが通らなく、実際には

    yum -y install usbutils cups cups-devel dbus notify-python

あたりも必要になってくるはずです。インストールしておくと良いと思います。dbusに関しては

    chkconfig messagebus on
    service messagebus start
    chkconfig cups on
    service cups start

をお忘れなく。
あとは

    hp-setup -i <プリンタのIPアドレス>

で対話的に、途中ppdファイルを求められる場面では`hp-envy_4500_series.ppd.gz`を指定してやればOKです。
初期設定のまま続行するとENVY_4500として登録されるはずなので、

    lpoptions -d ENVY_4500 -o number-up=2 -o sides=two-sided-short-edge -o fit-to-page -o media=A4

を設定してデフォルトのプリンタとして指定してやってください。
これでもう`lp sample.pdf`で印刷出来るようになっているはずです。
RealmのDelete Ruleを自前で実装してみた

# 問題点
現在（2016年4月19日）RealmにはDelete Ruleが存在しません。 
つまり、親に紐付いてる子がいたとして、親が消えても子は残ってしまうということです。

# 解決策
不要なデータはやはり持っていたくないので、今回自前で削除しました。
Blog（親）に複数のArticle（子）が紐付いているという設定です。

```swift
let realm = try! Realm()
try! realm.write {
  //子要素を消し終えてから親を削除する
  realm.delete(articles)   
  realm.delete(blog)
}
```
※子要素から削除する必要があります。

# 最後に
```swift
let realm = try! Realm()
  try! realm.write {
    for article in blog.articles {
      realm.delete(article)
    }
    //子要素を消し終えてから親を削除する
    realm.delete(blog)
}
```
ご指摘いただいたように、上記のようにループを回す必要はありませんでした。
Qiitaに書いてよかった。笑
【narou4j】Javaで小説家になろうの小説取得ライブラリをつくった

前回、なろうAPIのラッパーライブラリを作った。
[【narou4j】なろうAPIのJavaラッパーライブラリをつくった](http://qiita.com/pear510/items/6c050593f45174056005)

でも公式で提供されているなろうAPIをよくみたら、小説じたいの本文を取ってくるAPIがなかった（先に確認しとけよって話）
なので今回改めて小説本文も取ってこれるライブラリを作った。

# ダウンロード方法
[narou4j - Github](https://github.com/Nshiba/narou4j#download)のダウンロードの部分を参照してください

# 使い方
使い方は簡単

```java
Narou narou = new Narou();

// 小説の目次を取得
narou.getNovelTable(String ncode);

// 指定したページの本文を取得
narou.getNovelBody(String ncode, int page);

// 小説の目次と本文を取得（順番は目次順）
narou.getNovelBodyAll(String ncode);

// 小説の情報、目次、本文の全てを取得
narou.getNovelAll(String ncode);

// 指定した条件に当てはまる小説の情報、目次、本文の全てを取得（前回記事参照）
narou.getNovelsAll();
```

これでいけます。
ただ、最後の```getNovelsAll()```メソッドだけは最大取得件数を200件とかにしとくと結構時間かかるので注意。
今の実装だと進捗を確認するような機能がないので不便かな…必要だよね…

また、ランキング取得機能とランクイン取得機能も追加しました。

```java
Ranking ranking = new Ranking();

// 指定されたランキングタイプでランキングを取得
ranking.getRanking(RankingType type);

// 指定されたランキングタイプで指定日時のランキングを取得
ranking.getRanking(RankingType type, Date date);

// 指定された小説コードの過去のランクイン情報を取得
ranking.getRankinDetail(String ncode);
```

指定できるランキングタイプは、
* DAILY 日間
* WEEKLY 週間
* MONTHLY 月間
* QUARTET 四半期
の4つです。累計に関しては条件検索のほうで総合得点順で取得して対応してください。

以上です。

なにかバグや追加機能ありましたらissueやpull requestお待ちしてます！！
[narou4j - Github](https://github.com/Nshiba/narou4j)

それではみなさん、よきなろうライフを。
スクロールバーの幅を取得

スクロールバーの幅を取得したいと思ってググったが、ピンとくるものがなくて
試しに書いてみた。
画面上にスクロールバーがある場合とない場合で取得できる値が違かったり、
marginとborderの値を考慮しなければいけなかったり、案外面倒。
もっといい手はないものか。。。。

```js
function getScrollBarWidth() {

  if (!getScrollBarWidth.entity) {
    
    // 画面上に実際スクロールバーがあるときとないときとで違う。
    // あるときは30, ないときは16。=> bodyのmarginが0ならたぶん行ける。
    // http://daiiz.hatenablog.com/entry/2014/08/15/215916
    // getScrollBarWidth.entity = window.innerWidth - document.body.clientWidth;

    // 画面上に実際にスクロールバーが表示されてないと0px。あると13.6px。
    // => position: relativeだと29.6, absoluteだと13.6...どっちだよ！なおfixedだと0になる。
    // => たぶん、vwはbodyのwidthを取っているのでmargin分が増えている。
    // 強制的に縦長にしてやると値がとれる。一瞬なので描画もされない。
    // なお、calcの中の計算はスペースを入れないとバグるっぽい。知らなかったそんなの...
    // https://hail2u.net/blog/webdesign/scrollbar-width.html
    // なぜか↑このページと計算結果が違うっぽい。。。
    // でも自分の書いたほうは合っているっぽいし良いや。
    
    // これが完成形？
    var dummy = '<div style="position:absolute;height:9999px;width:calc(100vw - 100%);opacity:0;">x</div>';
    document.body.insertAdjacentHTML('beforeend', dummy);
    var element = document.body.querySelector('div:last-child');
    getScrollBarWidth.entity = document.defaultView.getComputedStyle(element, '').width;
    document.body.removeChild(element);
  }
  return getScrollBarWidth.entity;
}
```
Resources.Load怖い

簡潔に書きます。

Assets/Resources/の直下に「***aaaa.txt***」というファイルがあった時に

```lang:sample.cs
void HogeHoge()
{
    TextAsset text = Resources.Load<TextAsset>("aaaa");
}

void HogeHoge1()
{
    TextAsset text = Resources.Load<TextAsset>("AAAA");
}

void HogeHoge2()
{
    TextAsset text = Resources.Load<TextAsset>("AAAa");
}

void HogeHoge3()
{
    TextAsset text = Resources.Load<TextAsset>("AAaa");
}

void HogeHoge4()
{
    TextAsset text = Resources.Load<TextAsset>("Aaaa");
}

void HogeHoge5()
{
    TextAsset text = Resources.Load<TextAsset>("aaaA");
}

void HogeHoge6()
{
    TextAsset text = Resources.Load<TextAsset>("aaAA");
}

void HogeHoge7()
{
    TextAsset text = Resources.Load<TextAsset>("aAAA");
}

```
全部「***aaaa.txt***」を取得します。
以上。



2017.01.06追記
凄い今さらですが、上記はUnityEditor上での動作です。
Install WALA into Eclipse 4.5 (Mars) with JDK1.8 + JRE1.7 on Windows8

## WALA
I just note tips following the URL.
http://wala.sourceforge.net/wiki/index.php/UserGuide:Getting_Started

## Install list
- Eclipse 4.5
- JDK 1.8
- JRE 1.7

1. Install all requirement
1. Clone WALA `https://github.com/wala/WALA.git` into your eclipse
1. Don't forget those setting. To run codes, you set 1.7. To compile codes, set 1.8. It was the biggest point for me.
1. Set up your configuration in `com.ibm.wala.core project` , you need to copy the file `dat/wala.properties.sample` to `dat/wala.properties`
1. Make JLex.jar. and now you can try sample1 and you'll see a small window :)
redis_fdwのインストールから簡単な操作まで

PostgreSQL9.5にredis_fdwを導入し、Redis上の外部テーブルに対して簡単な操作を試してみます。
今回の手順では、PostgreSQL9.5とRedisがインストール済の環境を前提にしています。

# Hiredisのインストール
redis_fdwを導入するには、RedisのCクライアントライブラリである[Hiredis](https://github.com/redis/hiredis)をインストールする必要があります。

```bash
$ git clone https://github.com/redis/hiredis.git
$ cd hiredis/
$ make
$ su
# make install
# echo "/usr/local/lib" > /etc/ld.so.conf.d/hiredis.conf
# ldconfig
# ldconfig -p | grep hiredis
# exit
```

# redis_fdwのインストール
PostgreSQLのバージョンが9.5の場合は、9.5用のブランチ(REL9_5_STABLE)のredis_fdwを導入する必要があります。

```bash
$ git clone https://github.com/pg-redis-fdw/redis_fdw.git
$ cd redis_fdw
$ git checkout -b REL9_5_STABLE origin/REL9_5_STABLE
$ make USE_PGXS=1 PG_CONFIG=~/pgsql/9.5/pgsql-9.5.2/bin/pg_config
$ make USE_PGXS=1 PG_CONFIG=~/pgsql/9.5/pgsql-9.5.2/bin/pg_config install
```

- PostgreSQLのbinディレクトリにPATHが通っている場合は、PG_CONFIGの指定は不要です。
- PG_CONFIGを指定する場合、```~/pgsql/9.5/pgsql-9.5.2```の部分はPostgreSQLインストール先のパスで置き換えます。

# redis_fdwの登録と外部テーブルの作成
PostgreSQLとRedisを起動してから、psqlでPostgreSQLにログインし、キーとバリューを保持する簡単な外部テーブルを作成します。

```sql
-- redis_fdwをPostgreSQLに登録
CREATE EXTENSION redis_fdw;

-- Redisの外部サーバを定義 (Redisのアドレスとポート番号をオプションで指定)
CREATE SERVER redis_server
FOREIGN DATA WRAPPER redis_fdw
OPTIONS (address '127.0.0.1', port '6379');

-- Redis上の外部テーブルを作成
CREATE FOREIGN TABLE redis_db0 (key text, val text)
SERVER redis_server
OPTIONS (database '0');

-- Redisの外部サーバのユーザマップを定義
CREATE USER MAPPING FOR PUBLIC
SERVER redis_server
OPTIONS (password 'secret');
```

# Redis上の外部テーブルの操作
Redis上の外部テーブルに対して、簡単なSQLが想定どおりに動作することを確認します。

```sql
-- PostgreSQL9.3以降では、外部テーブルに対してINSERTなどの更新系SQLが実行可能
-- 10件のデータを挿入
INSERT INTO redis_db0
SELECT 'key' || num::TEXT, 'val' || num::TEXT
FROM generate_series(1, 10) num;

-- 検索条件どおりに1件検索できることを確認
SELECT * FROM redis_db0 WHERE key = 'key3';
 key  | val  
------+------
 key3 | val3
(1 row)

-- 1件のデータを更新
UPDATE redis_db0 SET val = 'val99' WHERE key = 'key9';

SELECT * FROM redis_db0 WHERE key = 'key9';
 key  |  val  
------+-------
 key9 | val99
(1 row)

-- 9件のデータを削除
DELETE FROM redis_db0 WHERE key <> 'key7';
DELETE 9

SELECT * FROM redis_db0 WHERE key = 'key9';
 key | val 
-----+-----
(0 rows)
```

また、Redisに直接接続して、上記操作で残った外部テーブルのデータ1件が見えることを確認します。

```bash
$ redis-cli KEYS "key*"
1) "key7"
```
MATLAB標準のlinter(mlint)をatomで使う

MATLABという、C言語に似た文法の行列計算が得意なIDEっぽいものがあります。
工学系だとけっこう大学でも使っているところ、多いのではないでしょうか。
ただしこのMATLAB、性能はいいのですがIDEあるいはエディタとしては微妙なところがあります。

そこで、最近はAtomを使っているのですが、デバッグでAtomとMATLABを行ったり来たりするのは非効率なので、linterを使ってある程度Atom内で済ませてしまいたいわけです。
そのためのAtom pluginの紹介と設定に関する記事です。


# 実行環境（動作確認しているバージョン）
MacOSX 10.10.5 Yosemite
MATLAB 2016a
Atom 1.7.2


# 下準備
まず、MATLABは標準のエンコードがSJISなので、Atomで編集するにはUTF8にしないといけません。
MATLABのUTF8化は、こちらの記事を参考にしました。

- [vimでMATLABのソースを書く](http://qiita.com/osakb/items/40fd35071819f4290ad3)

ちなみに、Windowsではこの方法じゃダメっぽいです(コメント欄参照)

この下準備が済んだら次行きましょう。


# Atomの設定
## Pluginのインストール

今回使うのは、`linter-matlab`というプラグインです。
これを動かすためには`linter`というプラグインも必要だとのことなので、この二つを入れましょう。

- [Linter](http://atomlinter.github.io/)
- [linter-matlab](https://atom.io/packages/linter-matlab)

まぁ、AtomからPackageのインストール画面開いて入れたほうが早いでしょうね笑

## Pluginの設定

MATLABには本体に付属しているlinter、`mlint`というやつがあって、それをAtom内で使えるようにするのがこの`linter-matlab`というプラグインです。なので、プラグインに`mlint`へのパスを教えてあげないと使えるようになりません。

Atomの`Preferences > Packages`から`linter-matlab`の詳細画面を開くと、`Settings`のなかに「Path to directory containing mlint」という入力欄が見つかります。
ここに、mlintのパスを入力すればOKです。簡単ですね。


肝心の`mlint`のパスですが、Macの方であれば

- `/Applications/MATLAB_R2016a.app/bin/maci64/`

にあると思います。上記ディレクトリを開いて`ls`とかやって`mlint`というディレクトリがあれば上のパスで大丈夫だと思います。


こうすると、これまでMATLABの画面の右端、スクロールバー周辺に出てきていた警告メッセージがAtom内でも見られるようになります。

やったね！！！
Genuino(Arduino) 101 でAquesTalkプロトシールドを使う時の注意点

Genuino 101にAquesTalkプロトシールドを付けて喋らせてみました。
Arduino IDE のバージョンは1.6.8 を使用しています。

AquesTalkプロトシールド基本キット
https://www.switch-science.com/catalog/1373/

シールドを101に付けた後、こちらのライブラリ( http://blog-yama.a-quest.com/?eid=970151 )で喋らせてみましたが、部分的にしか発声しなかったり、異常動作をしました。

で、いろいろ調べた結果 setup() で、Wire.begin() を呼び出すようにしたところ、上手く行っています。

```cpp
void setup() {
  Wire.begin();
```

Wire.begin() はAquesTalk クラスのコンストラクタの中からも呼ばれているはずなのですが、おそらく呼ばれるタイミングが悪いのか、異常動作となってしまっていたようです。
Processing 3でGIFアニメを作って保存する方法

![ジフジフジッフー！](http://cl.ly/332y0Y2h080p/export_02.gif)

最近個人的にProcessingにハマってます。面白いですよね、ジェネラティブ・アート。

作ったスケッチはやっぱりGIFアニメで保存して、サイトなどに載せたいですよね。スケッチをGIFアニメにできる「gifAnimation」というライブラリがあります。Processing 2以下までにしか対応してないと思ってたら、サラッとProcessing 3以上対応ver.がありました。


## ダウンロードとインストール
[extrapixel/gif-animation at 3.0](https://github.com/extrapixel/gif-animation/tree/3.0)

* `3.0`ブランチにて「Download ZIP」からファイル一式をダウンロードします
* Zipを解凍して、`gifAnimation`フォルダを、`~/Documents/Processing/libraries/`にコピーします
* 完了


## GIFアニメの作成方法
```java
// gifAnimationライブラリを読み込む
import gifAnimation.*;

// GifMakerクラスを呼ぶ
GifMaker gifExport;

void setup(){
  // いつも書いてるもろもろのコード
  frameRate(50); // 50fpsでアニメーションする

  // GIFアニメ出力の設定
  gifExport = new GifMaker(this, "export.gif"); // GifMakerオブジェクトを作る、第2引数にファイル名
  gifExport.setRepeat(0); // エンドレス再生
  gifExport.setQuality(10); // クオリティ(デフォルト10)
  gifExport.setDelay(20); // アニメーションの間隔を20ms(50fps)に
}

void draw(){
  // いつも書いてるもろもろのコード

  // GIFアニメ出力用のコード
  // 50fps * 3、つまり丸3秒録画する
  if(frameCount <= 50*3){
    gifExport.addFrame(); // フレームを追加
  } else {
    gifExport.finish(); // 終了してファイル保存
  }
}
```

だいたいこんな感じです。こんな感じで録画したのが、一番上に貼っているGIFです。リサイズやファイルサイズ調整はPhotoshopでやってますが。  
ちなみに、録画中はアニメーションの再生がめちゃくちゃ遅くなります。保存されるGIFアニメ自体は設定した通りの速度です。

その他のメソッドなどは[こちら](https://github.com/extrapixel/gif-animation/tree/3.0#documentation)にあります。

みんなもスケッチをGIFアニメで保存して公開しよう！
パッケージマネージャのProxyやSSL設定など

ディストリのソフト全体のパッケージマネージャや各種スクリプトのパッケージマネージャがありますが、Proxy環境下だったり、(透過Proxyであれなんであれ)SSLがMITMされてて検証NGになる状況で使うこともあります。

そこらの設定をなるべくまとめてみたいかなと(随時追加)

# gem
設定ファイル`~/.gemrc`

## SSL
以下の設定を設定ファイルに追加するとSSLの検証をスキップする

```text
:ssl_verify_mode: 0
```

またはリポジトリをhttpにしてしまう

```text
source 'http://rubygems.org'
```

参考[^1]

[^1]: http://dharampal.in/2012/06/28/bypassing-ssl-certificate-checks-during-gem-installation/ 

## Proxy
環境変数`HTTP_PROXY`もしくは以下の設定を行う[^2]

```text
http_proxy: http://example.com:1234
```

[^2]: http://d.hatena.ne.jp/taiyo/20080401/p3

# Node(npm)
設定ファイル`~/.npmrc`

## SSLとRegistry
リポジトリをhttpにしてしまうならば以下とする[^3]

```shell-session
registry=http://registry.npmjs.org/
```

SSL自体は以下のように証明書データを空にすることでも止められるらしい

```shell-session
ca=
```

そしてSSLの検証スキップは以下

```shell-session
strict-ssl=false
```


また、Node.js上のアプリ自体は、環境変数として

```shell-session
export NODE_TLS_REJECT_UNAUTHORIZED=0
```

と設定されてるとsslの検証をパスする様子[^4][^5]

[^3]: https://stackoverflow.com/questions/8874363/npm-install-without-ssl
[^4]: https://github.com/nodejs/node-gyp/issues/448
[^5]: http://qiita.com/dkkoma/items/7f22769f3b3b69bf1d5f

## Proxy
設定はある[^6]が、環境変数`HTTP_PROXY`も効く

```shell-session
npm -g config set proxy  "http://example.com:1234/"
npm -g config set https-proxy  "http://example.com:1234/"
```

設定としての記述はこう

```shell-session
proxy=http://<host>:<port>/
https-proxy=http://<host>:<port>/
```

[^6]: https://docs.npmjs.com/misc/config

## 番外:Python
node-gypでPythonが利用されるが、これは2.x系を指定する必要がある

以下で設定[^7]

```shell-session
npm config set python /path/to/executable/python2.7
```

これでもよい?この辺りの情報がどうも不明確...

```shell-session
python=python2.7
```

[^7]: http://shuzo-kino.hateblo.jp/entry/2015/06/15/234057 

### 引数での指定
これはPythonに限らないが、`npm config`で指定するkey/valueはオプションとして指定可能[^8]

```shell-session
npm --python=C:/Python27/python install ...
```

これは、`--<key>=<value>`という一般構文になっているとのこと

[^8]: http://qiita.com/akaneko3/items/f8207aad00c99ee3e12c

# Atom (apm)
参考[^9]に解説あり
設定ファイル`~/.atom/.apmrc`

## SSL
以下で無効になる

```text
strict-ssl = false
```

## Proxy
以下で設定

```text
proxy=http://<ID>:<password>@<address>:<port>
https-proxy=http://<ID>:<password>@<address>:<port>
```

備忘録としてのコピペだなぁ...

[^9]: http://april.fool.jp/blogs/2015/08/atom%E3%81%AEpackage%E3%82%92proxy%E3%81%AE%E8%83%8C%E5%BE%8C%E3%81%8B%E3%82%89%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%EF%BC%88windows-7%EF%BC%89/

# cURL
いろいろなシステムで使うので、影響する場合はある
ファイルは`.curlrc`

## SSL
未調査

## proxy
# Proxy

```config:.curlrc
#proxy-user = "(ユーザ名):(パスワード)"
#proxy = "http://proxy.xxx.co.jp:(ポート)"
```

---

# あとで整理する参考物
* http://qiita.com/tenten0213/items/7ca15ce8b54acc3b5719
* http://qiita.com/wakaba260/items/f7794cea3fac8c694dcf
* http://qiita.com/nullsnet/items/66590b0ff33e15db7532
* http://qiita.com/tomine3/items/5f660fe7bb8dda7cd663
(初心者)SNMPでMIBを取得する

SNMPの知識は有っても実際に使ったことがなかったので、MIBを取得するところまで実際に確認した。

# 環境

MacBook
OS: OS X El Capitan
snmpd: Version:  5.6.2.1
snmpwalk: Version:  5.6.2.1

# snmpdを起動する

confを書き換える前にバックアップを作成。

```
$ sudo cp /etc/snmp/snmpd.conf /etc/snmp/snmpd.conf.original
$ sudo vi /etc/snmp/snmpd.conf
```

snmpd.confを書き換える。

```
#Allow read-access with the following SNMP Community String:
rocommunity public

# all other settings are optional but recommended.

# Location of the device
syslocation data centre A

# Human Contact for the device
syscontact SysAdmin

# System Name of the device
sysName SystemName

# the system OID for this device. This is optional but recommended,
# to identify this as a MAC OS system.
sysobjectid 1.3.6.1.4.1.8072.3.2.16
```
※ https://kb.paessler.com/en/topic/41843-how-do-i-activate-snmp-on-mac-os-in-order-to-monitor-it-with-prtg より引用

snmpdデーモンを起動。

```
$ sudo launchctl load -w /System/Library/LaunchDaemons/org.net-snmp.snmpd.plist
```

プロセスが起動している。

```
$ ps -ef | grep snmp
    0  4999     1   0  9:25PM ??         0:08.93 /usr/libexec/snmpd -f
  501  5013  1356   0  9:36PM ttys002    0:00.00 grep snmp
```

# SNMPの応答を確認する

```
$ snmpwalk -c public -v 1 localhost
SNMPv2-MIB::sysDescr.0 = STRING: Darwin butada-mac.local 15.4.0 Darwin Kernel Version 15.4.0: Fri Feb 26 22:08:05 PST 2016; root:xnu-3248.40.184~3/RELEASE_X86_64 x86_64
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.16
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (525) 0:00:05.25
SNMPv2-MIB::sysContact.0 = STRING: SysAdmin
SNMPv2-MIB::sysName.0 = STRING: SystemName
SNMPv2-MIB::sysLocation.0 = STRING: data centre A
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (0) 0:00:00.0
<省略>
```

# snmpdを停止させる

```
$ sudo launchctl unload -w /System/Library/LaunchDaemons/org.net-snmp.snmpd.plist 
```

# 今後
サーバ等の管理のためにはSNMPは便利だが、OSデフォルトの状態では無効になっているので、管理対象を効率良く有効化する方法も併せて考えていきたい。

例えば以下の記事にあるようなWindowsのSNMP有効化は、実際にはスクリプトでしかもリモートからやれる方法を考えておかないと、数百台のサーバの管理にはなりませんので。
http://qiita.com/tukiyo3/items/7c53960b172d5a6cd31a

# 参考

https://kb.paessler.com/en/topic/41843-how-do-i-activate-snmp-on-mac-os-in-order-to-monitor-it-with-prtg

http://qiita.com/tukiyo3/items/7c53960b172d5a6cd31a
非エンジニア向けの最近のフロントエンドのお話

# はじめに
* 正確なことを言おうとすると、かえってまた混乱させてしまうのでざっくりな話をします。
* なのでツッコミどころはたくさんあると思いますが了承を

# 目的
* エンジニアではない人達向けにフロントエンド技術の概要や取り組んでいる事とかをざっくりわかったという状態を作る
 * エンジニアは自分で調べて、手元で少し動かしてみて確認すれば理解は進むと思うけど、エンジニアではない人達はなかなか難しいですよね
 * フロントエンドエンジニアに限らずですが、取り組んでいる内容や技術の理解があればお互いに仕事しやすくなるよね

# 用語
* 「フロントエンド」とは≒Javascriptで良いです

# 以前のフロントエンドをちょっと振り返る
## 自分が業界で働き始めた2007年ぐらいまで
* Javascript自体は存在していたが、各ブラウザの実装がバラバラで且つ、大した処理ができず、ユーザ的にも邪魔くさい挙動になっていた為、正直全然注目されなかったと思う
* この頃はガラケーで、モバイルにも使えないし更に使われなかった
* リッチデザインな表現をする場合は大体Flashが使われ、Action Scriptを主に使ってた
 * AdobeのFlashが買えず、Flexを勉強してみたりした。全然できなかったけど

## Ajax 
* JavascriptからHttp通信が可能になり、ページの表現が格段に上がった
* prototype.js、jQueryが流行って皆使った
 * DOMの操作もゴリゴリかけて、表現力が増した

# この辺から最近で取り組んでる内容
## フレームワーク登場(2010,2012年ぐらいからかな)
* jQueryのDOM操作をゴリゴリ、つらい。
* フロントエンドにもMVC的な考えが入ってきた
* いろんなフレームワークがクソ増えた
 * React.js（https://facebook.github.io/react/）
 * Angular.js（https://angularjs.org/）
 * Angular.js 2.0（https://angular.io/）
 * Backbone.js（http://backbonejs.org/）
 * Knockout.js（http://knockoutjs.com/）
 * Ember.js（http://emberjs.com/）
 * Ractive.js（http://www.ractivejs.org/）
 * Vue.js（https://jp.vuejs.org/）

## test codeもでてきた
 * KARMA (https://karma-runner.github.io/0.13/index.html)
 * mocha (https://mochajs.org/)
 * power-assert (https://github.com/power-assert-js/power-assert)

## CSSも効率的に管理しよう流れが入ってきた
 * Less
 * SASS

## モジュール管理(コンパイル)して使うという流れが入ってきた
 * Gulp（http://gulpjs.com/）
 * Grunt（http://gruntjs.com/）
 * Browserify（http://browserify.org/）
 * Webpack（https://webpack.github.io/）

## これらどう組み合わせて使ってるのか
### こんな感じ（だいたい枠の中から１つピックアップして使う）
![frontend.png](https://qiita-image-store.s3.amazonaws.com/0/106937/bcc786b1-8c81-9908-aabc-8d664b316a22.png)
### 簡単な説明
* altjsはAltnative javascriptでjavascriptの代替言語です。
 * より簡単に記述ができ且つテスタブルにすることができる
* test系はサーバサイド言語では当たり前ですが、unit test codeをjavascriptでも実現させている
* FW系はModel View ViewModelだったり、VirtualDOMという考えだったり色々とありすぎる
* 構文チェックはwordの誤字チェック
* CSS系はCSSもサービスがスケールすると管理が大変なので変数が使えるようなSASSがメイン？で使い効率化をしている

### 上記の図より：枠の中の要素を一つピックアップして使い、最後コンパイラーが丸っと変換してからプロダクションで使う！
* 例えば1：CoffeeScriptをメインに使って、Mochaでテストコード書いて、ESLintで規約を揃え、CSSはBEM記法とSASSで書く。最後にgulpでコンパイルしてプロダクションで使う
* 例えば2:React.jsでメインで使って、redux(flux)を活用して、power-assertでテスト書いて、ES6に準拠した記載にして、BABELでES5に変換して、Browsrifyでコンパイルして、最後gulpでまとめる

# なぜこんな複雑な感じになったのだろうか
* 個人的に複雑にしたくてしているわけでは無いよ
 * 世界的な流れです
* 元々が何も無い状態で世界のエンジニア達が改善を猛スピードで加えた結果かな
* webのトレンドがよりリアルタイム性を求められるようになり、必然的にフロントエンドの進化が求められた背景が関連してる？
 * ？html5とかwebsoketとかこのあたりの流れ

# まとめ的な感じ
* まだまだこの組み合わせが良いんじゃなかろうか的なデファクトはない気がするし、またパラダイムシフトが起きそうだけどある程度追いかけながら導入を見極めて行く必要がありそう
* フロントエンドはもはや完全なエンジニアリング
* やはり最近の流れにのった要件を実現させようとするとだいたいはモダンな仕組みは必須だし、スケール、運用という意味でも必須
* 大体の人はスーパーマンで無いので一夜にして習得は無理で地道な努力と時間的投資が必要