OmniAICreator/Qiita-1.07M huggingface dataset:
npmまわりのゴタゴタで思うこと

# npmパッケージに関してゴタゴタがあった
- [npm パッケージの unpublish に関するゴタゴタの大まかなまとめ](http://uasi.hatenablog.com/)

# 何が起こったか
- left-padがunpublishになった影響で、それに依存していたbabelのビルドがぶっ壊れた。
 - 機能的には、文字の左側にスペースやら0埋めをするための小さなパッケージ。

→ 利用者が多いパッケージだったため、世界中に影響が拡大。

# 思ったこと
- 依存関係を持たないパッケージが最強。
- 依存関係がある場合でも、その数を絞れるだけ絞るべき。1個だけ、など。
- 大したコード量でもなく、更新もそうないパッケージは、自分のパッケージ内に完全に組み込んで依存関係を解消しておいた方が良い。
- jQueryは強かった。

# 別の方の記事
殆ど同意見。left-padがたった11行のコードで、依存などせず自分で簡単にかけるコードであることにも言及している。

- [NPMとleft-pad : 私たちはプログラミングのやり方を忘れてしまったのか？](http://postd.cc/npm-and-left-pad/)

> 関数はパッケージではない

> 関数は、パッケージや依存関係にするにはあまりに小さなものです。純粋な関数には結合作用はありません。つまり、関数とはただのコードのランダムなスニペットであり、それ以外の何物でもありません。

つまり、このようなパッケージという名の関数に依存するような関係にしてはならない、ということ。

# 更に別の方の記事
なんでこんなことになっているのかというお話。

- [JavaScriptの文化とleftpadの話とpadStartについて](http://yosuke-furukawa.hatenablog.com/entry/2016/03/27/152500)
よく忘れるJavaScript(&jQuery)まとめ

##よく忘れるJavaScriptまとめ


###■日付関連
```
現在の日付を取得
date = new Date();

現在の年を取得
date.getFullYear();

現在の月を取得
date.getMonth() + 1;

現在の日を取得
date.getDate();

現在の曜日を取得
date.getDay();

現在の時を取得
date.getHours();

現在の分を取得
date.getMinutes();

現在の秒を取得
date.getSeconds();
```

###■3桁ごとコンマ入り
```
var num = 1000;
num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
```

###■URLに含まれた文字列検索
```
if (window.location.href.indexOf("index") > 0) {
}
```

###■対象以外を押した時DIVを消す
```
$(document).on("click", function(e) {
  if ($(e.target).parents("DIVを指定").size() < 1) {
    $("DIVを指定").hide();
  }
});
```

###■文字列制限関連
```
$("document").on("keyup", "テキストフィールド", function(e) {
  var len = $(this).val().length; //入力された文字数
  max = 50; //制限文字数
  var str = $(this).val().substr(0, max); //入力された文字(50まで)
  if (len > max) { //制限より長いなら(オーバー)
    $(this).val(str); //50までの文字列(str)を入れる
    return false;
  }
});
```

###■onクラスが入ったliを探す
```
<ul>
  <li>1</li>
  <li class="on">2</li>
  <li>3</li>
</ul>

var idx = $("ul").find(".on").index("ul li");
if (idx > -1) {
  console.log($("ul li").eq(idx).html());
}

result : 2
```
決済システム導入時に使えるテスト用カード番号一覧

# 正常系


## カード番号

|カード会社|番号|
|-------|----|
| Visa  | 4242424242424242 |
| Master | 5555555555554444 |
| AMEX | 378282246310005 |

## カード番号以外

| 項目 | ルール |
|---|---|
| 名義 | 半角スペース、半角英字の任意の組み合わせ |
| 有効期限 | 未来の日付 |
| セキュリティーコード | 任意の3または４桁の数字 |


# 異常系

| 挙動 | 番号 |
|---|---|
|カード決済失敗|4000000000000002|
|セキュリティーコード違反|4000000000000127|
form作成時のurlの指定の仕方

<%= form_for @変数　do |f| %>
<% end %>

で NoMethodError in〜が出た時は
railsが勝手に別のURLを指定してしまっているから
明示的に指定する。


<%= form_for @変数, url: ~_path do |f| %>
<% end %>
Macアプリのアイコンがキャッシュで変わらない時の対処法

openframeworksでビルドしたMacアプリでアイコン(.icnsファイル)を変更しても変わらなかったのでメモ。
以下のディレクトリにあるキャッシュファイルを消す。(OSはOS X El Capitan 10.11.3)

```
/Library/Caches/com.apple.iconservices.store
```

ちなみにopenframeworksでアイコンを変更するにはProject.xcconfigの以下の変数を変更。

```Project.xcconfig
ICON_NAME_DEBUG = {filename}.icns
ICON_NAME_RELEASE = {filename}.icns
ICON_FILE_PATH = bin/data/ //(icnsファイルのディレクトリ)
```
XmllintでXmlの同名タグを絞る

以下のxmlがあるとする。

```xml:sample.xml
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <long name="aaa" value="12345" >いぬ</long>
    <long name="bbb" value="56789" >ねこ</long>
</map>
```
<br />

name="aaa" のvalue値「12345」を取得したい場合

```bash
value=`echo 'cat map/long[@name="aaa"]/@value' | xmllint --shell sample.xml |grep value= | sed 's/[^"]*"\([^"]*\)"[^"]*/\1/g'`
echo $value
```

結果

```bash
1234
```

<br />

name="aaa"の「いぬ」の値を取る場合

```bash
value=`echo 'cat map/long[@name="aaa"]' | xmllint --shell sample.xml | grep value= | sed 's/^.*<long.*>\(.*\)<\/long>.*$/\1/'`;
echo $value
```
結果

```bash
いぬ
```
Linuxでプロセス内の環境変数を確認する

既に起動済みのプロセス内の環境変数に何がセットされていたか確認したくなる時、ありますよね？

```
# cat /proc/{PID}/environ
```

こうすれば確認できるのですが、中身が `Null` 終端文字列の列なので読みにくい…ということで、 `tr` コマンドを使いましょう

```
# cat /proc/{PID}/environ | tr '\0' '\n'
```

こうすれば改行付きで環境変数一覧が出力できます。
Cygwinでgroovyshを使いたい

## 概要
Groovyには対話型モードとしてgroovyshが標準で付属されている。
UnixのシェルやWindowsのコマンドプロンプトで起動すると対話モードになり簡単にテストするときは便利に使うことができる。

しかし、WindowsのCygwin上で使うときはバックスペースや矢印キーを押下した時、正常に動作せず自分が入力した文字を突き抜けてカーソルが移動してしまう。
あまりにも不便でかと言ってコマンドプロンプトは使う気もないし、そもそもCygwin上にSDKMANで入れたものだから参照もしていなかった。
諦めてちょっとたまに試したいときはGroovyConsoleを使っていたのだが偶然解決策を見つけたので備忘録と共有を兼ねて

## 方法
Groovyとは全く関係ないがElixirの情報を調べていたら下記のページを見つけた。
[Cygwin環境下でElixirを使うときのバッドノウハウ](http://moccosblue.blogspot.jp/2014/12/cygwinelixir.html)
ElixirをCygwin出たいわモード使う時のノウハウだけど、groovyshと同じ問題が出るみたい。

>そんなときにはrlwrapを使うと、安直にまともな挙動を得ることができます。

なるほど、そうなのか
rlwrapを調べてみたけどよくわからん。各種対話系ツールの矢印キーとかをフックしてshellのように履歴参照できるようにするツールみたい。
とりあえず導入してみる。

babunを使っている場合pactでインストールできる。普通のCygwinの場合はapt-cyg使えるのかな？

```bash
pact install rlwrap
```

これで導入完了したのでgroovysh起動してみる。

```bash
rlwrap -A groovysh
```

お！起動する！矢印キーで業移動したりしないし、履歴参照まで出来る。
これは便利だ。
groovysh起動するたびにコマンド打つのは面倒なのでaliasに登録
.bashrcや.zshrcの最後尾に書きを記述

```bash
alias groovysh='rlwrap -A groovysh'
```

これでgroovysh起動するだけでrlwrapされたモードで立ち上がることになる。
あと、Cygwinでgroovysh立ち上げた時は--terminal=unixってオプションつけたほうがいいと聞いたので下記のように書いたほうがいいのかなぁ(違いがよくわかんない)

```bash
alias groovysh='rlwrap -A groovysh --terminal=unix'
```

ということで今まで苦難の日々を過ごしてきたが、布教活動がだいぶ捗るようになった。
How to run OVMFでこまったこと

How to run OVMFでこまったこと
---

[How to run OVMF](https://github.com/tianocore/tianocore.github.io/wiki/How%20to%20run%20OVMF)をそのままやったら手元の環境では動かなかったので、メモとして

- qemu

```bash  
$qemu-system-x86_64 -version
QEMU emulator version 2.5.0, Copyright (c) 2003-2008 Fabrice Bellard
```

- 問題点  
```bash 
bash$ qemu-system-x86_64 -L . -hda fat:hda-contents
```

ここでbiosとなるバイナリを指定しないと動かなかった,
とりあえず、hdaは今は使わないので消して

```bash
bash$ qemu-system-x86_64 -L . -bios bios.bin
```

これで起動するので、UEFI shellを起動するなりなんなり

[^1]: qemu-system-x86_64 -version QEMU emulator version 2.5.0, Copyright (c) 2003-2008 Fabrice Bellard
activerecord のtimestampにdefault設定をする


* 前提
	* rakeが使えること

#### table情報を作る
$ bundle exec rake db:create_migration NAME=create_monitoring_logs

#### ソース更新
$ vi db/migrate/YYYYMMDD014656_create_monitoring_logs.rb 

```
class CreateMonitoringLogs < ActiveRecord::Migration

CREATE_TIMESTAMP = 'DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP'
UPDATE_TIMESTAMP = 'DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'

  def up
    create_table :monitoring_logs do |t|
      t.integer  :level
      t.bigint  :app_time
      t.text     :body
      t.column :created_at, CREATE_TIMESTAMP
      t.column :updated_at, UPDATE_TIMESTAMP
    end
  end

  def down
    drop_table :monitoring_logs
  end

end

```

#### migrateする
$ bundle exec rake db:migrate



#### table情報を見てみる

$ show create table monitoring_logs;

```
| monitoring_logs | CREATE TABLE `monitoring_logs` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `level` int(11) DEFAULT NULL,
  `app_time` bigint(20) DEFAULT NULL,
  `body` text,
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |

```
* 結果
timestampsマジクソだった！
Node.js基礎　リンクまとめ

#内容
業務でよく使いそうなことが書いてあるところをまとめる

#とりあえず困ったら

公式リファレンス https://nodejs.org/en/docs/
最新バージョン https://nodejs.org/api/
バージョン4系 https://nodejs.org/dist/latest-v4.x/docs/api/
バージョン0.12系 https://nodejs.org/docs/v0.12.7/api/

#Nodeの依存関係
 * module.exports
ソースを追う時module.exportsやexports.xxxでモジュールを定義、requireで読み込まれるので、そこを追ってく。書き方いろいろある
http://www.yoheim.net/blog.php?q=20150101

 * node_modules
npmモジュールをグローバルとローカル両方入れてて片方だけカスタムしてる場合とかある。その時読み込まれるnode_modulesのロード順序
https://www.ryuone.com/diary/20110328.html
 * JSにおけるPrototype
最近のnodeはclassが使えるけど、古いモジュールはPrototypeで構成されてるのでそこらへんの基本も覚えたい
http://qiita.com/takeharu/items/809114f943208aaf55b3

#よく使う標準モジュール
npm installで入れなくても使える基本関数
```let module = require('{モジュール名}');```
で使う

###fs
ファイル入出力
https://nodejs.org/api/fs.html#fs_fs_readfile_file_options_callback

###child_process
コマンドexecしたり子プロセス立ち上げたり
https://nodejs.org/api/child_process.html#child_process_child_process

###process
プロセスの情報を取得したりいろいろする
https://nodejs.org/api/process.html

プロセスに対するシグナル受け取る
https://nodejs.org/api/process.html#process_signal_events
コマンドライン引数受け取る
https://nodejs.org/api/process.html#process_process_argv
プロセスが落ちないようにエラーハンドリング
https://nodejs.org/api/process.html#process_event_uncaughtexception

###util
その他いろいろ
https://nodejs.org/api/util.html
ハッシュ(Object)を詳細にダンプ
https://nodejs.org/api/util.html#util_util_inspect_object_options

#Ecma記法
最近のバージョンだとEcmaScript6に対応していたりするので、classやPromiseやlet、constが使えます
https://html5experts.jp/1000ch/16984/

#通信周り

###Socket.IO
 * 旧バージョンだけど基本的なところ説明している記事  
http://jxck.hatenablog.com/entry/20110730/1312042603
 * 公式 http://socket.io/docs/
 * ルーム管理 [Rooms and Namespaces](http://socket.io/docs/rooms-and-namespaces/#default-namespace)
 * Cluster化やマルチプロセス化 [Server#adapter(v:Adapter):Server](http://socket.io/docs/server-api/#server#adapter(v:adapter):server)  
↓拙作ですがCluster化sample  
https://github.com/natsuki-yamanaka/cluster_and_socketio

###httpモジュール  
https://nodejs.org/api/http.html#http_event_connect
↓記事みたいにローカルで簡単にサーバー立てられる
http://jxck.hatenablog.com/entry/20101022/1287765155

###Socket
UDP、TCPそれぞれでSocket作れる
https://nodejs.org/api/dgram.html#dgram_udp_datagram_sockets
http://takaheraw.hatenablog.com/entry/2013/01/04/115434

#非同期処理
非同期処理を単純に書いていくとコールバックのネストがどんどん増えていきいわゆるコールバック地獄になります。なので何かしらのライブラリで非同期処理を縦に流れる処理のように書くことが多いです。
ベストプラクティスは人によって違うし、Nodeのバージョンによっても変わっていくのでプロジェクトで採用されているものがあればそれに従うか、自分が選べるなら好みのものを選びましょう

###標準関数

v4くらいからは**Promise**や**yield**が標準で使えるので、それが多いかも
http://qiita.com/kidach1/items/d997df84a0ede39d76ad


###npmモジュール
標準が定まっていなかった0.x系はモジュールで非同期処理書くことが多かったです。
JSに非同期処理のライブラリが数多いので、自分が知っているものをいくつか挙げておきます

 * async.js  
昔自分のプロジェクトで採用されてた  
http://qiita.com/takeharu/items/84ffbee23b8edcbb2e21
 * JSDeferred  
https://cho45.stfuawsc.com/jsdeferred/
 * Q  
http://qiita.com/Awa_Dama/items/3f73ec4f5bf94bac2094
 * bluebird  
旧バージョンでもPromise的な書き方できる？  
http://bluebirdjs.com/docs/getting-started.html

#そもそもNode.jsって
何が特徴で、何がメリットか？記事古いけど現在Node.jsのコミッターしてる方の記事
http://www.iij.ad.jp/company/development/tech/activities/nodejs/

>処理が非常に短時間でイベント処理が重要なアプリ（よく言われるチャットアプリ）などでは、Node.jsはそのメリットを最大限に生かせる領域です。

言語の特徴として
 * ノンブロッキングIO
 * シングルスレッド・シングルプロセス
 * イベントループモデル

あたりを取り上げておきます。説明は長くなる+難しいので別記事で(書かないかもしれない)
ObjectMapperでJSONをSerializeする際のイロイロな設定

プロジェクトで使っているのがObjectMapper1系なので、1系前提。

適当なBeanを用意する。

```java
public class TestBean {

    private int id;
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}
```

## Serialize時の設定

### Serializeする際にnull以外のプロパティを対象にする

```java
    @Test
    public void Serializeする際にNULLじゃないプロパティのみが対象になる() throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);
        TestBean bean = new TestBean();
        String s = mapper.writeValueAsString(bean);
        // idはデフォルト値になる
        // nameはnullなのでSerialize対象外
        assertThat(s, is("{\"id\":0}"));
    }
```

### Serializeする際に空以外のプロパティを対象にする

```java
    @Test
    public void Serializeする際に空じゃないプロパティのみが対象になる() throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_EMPTY);
        TestBean bean = new TestBean();
        bean.setName("");
        String s = mapper.writeValueAsString(bean);
        assertThat(s, is("{\"id\":0}"));
    }
```

### Serializeする際にデフォルト値以外のプロパティを対象にする

```java   
    @Test
    public void Serializeする際にデフォルト値じゃないプロパティのみが対象になる() throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_DEFAULT);
        TestBean bean = new TestBean();
        bean.setName("tenten0213");
        String s = mapper.writeValueAsString(bean);
        assertThat(s, is("{\"name\":\"tenten0213\"}"));
    }
```

Deserialize時の設定もあるけど、多くて試すの面倒だから書かない。
プロジェクトでは、外部から送信されるJSONのI/Fに項目が勝手に追加される(恐ろしい…)ことがあるらしいので、知らないプロパティが来ても落ちないように以下のような設定をしている。

```java
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
```

一応pomも置いておく

```xml:pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.github.tenten0213</groupId>
    <artifactId>JasonSerializeSample</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.9</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.9</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>
```
ActiveRecordを使ってRails consoleからテーブル一覧がほしい



```
ActiveRecord::Base.connection.execute('show tables').map{|a| p a.first}
```

僕は開発中Rails consoleから移動せずにやりたい思っているので、
あれ、こんなテーブルあったっけ見たいな時に
ActiveRecordを使ってRails consoleからテーブル一覧がほしかった


executeでshow tablesを実行して、すると入れ子になってテーブル名が返ってくるので、mapして取り出す





。。。と思ったら、
投稿してすぐ気づいた。

これでいけた

```
ActiveRecord::Base.connection.tables
```

さすがActiveRecordさん。。。
オブジェクトを収めた配列の値に対してreduceメソッドを適用する

reduceメソッドを使った、配列の合計値の求め方。

```js
var array = [1, 10, 100]
array.reduce(function(a, b){ return a + b })
-> 111
```

配列の内容がオブジェクトで、特定の項目の合計値を求めたい場合は、return でオブジェクトを返す必要がある。

```js
var array = [{value:1},{value:10},{value:100}]

array.reduce(function(a,b){ return a.value + b.value }) //error
-> NaN

array.reduce(function(a,b){ return { value:a.value + b.value } })
-> Object {value: 111}

```

例）任意の要素の横幅(width値)を取得し、その合計値を返す。

```js
Array.prototype.slice.call(document.querySelectorAll(".testElement"))
    .reduce(function(a,b){
        return { clientWidth:a.clientWidth + b.clientWidth }
    })
-> Object {clientWidth: 1144}
```
[小ネタ]限界値テストのために100文字とか1000文字とか作る

限界値テストで100文字とか101文字とか1000文字とか作るときの方法

# 前提

+ Rubyインストール済み

# 100文字作る

以下を書いて保存。

```test.rb
100.times { puts "a" }
```

上記を使って文字列生成

```bash
# 100文字を標準出力。リダイレクトでファイルに保存
$ruby test.rb > 100.txt

# 確認.100文字
$cat 100.txt | wc -m
100
```

## 追記(20160325)

@jkr_2255  さんにコメントで教えて貰ったやり方でもできました。

```test.rb
print 'a' * 100
```

# 1000文字作る

数字を変えればいいだけ

```test.rb
1000.times { puts "a" }
```

```bash
# 確認
$ruby test.rb |wc -m
1000
```

# 区切りが見たい場合

上記だと同じ文字列なので文字が切れているかなど少し分かりにくいです。
（例えば1000文字登録して、確認画面で末尾の文字が切れていないかの確認)

その場合、以下のようにすれば0123..9という感じで区切りが分かります。

```test.rb
RANGE = 0..99

RANGE.each do |i|
  print i % 10
end
```

以下のように使えます。

```bash
# 文字生成
$ ruby test.rb
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789

# 文字数確認
$ruby test.rb |wc -m
100
```
ローカルとDockerと両方で同じRailsプロジェクトを使うdatabase.yml

docker-compose を使うと簡単に Ruby on Rails とデータベースサーバを別々に立ち上げて連携させられるのが便利だと感じます。
しかし、開発で何度も試すときに毎回 `docker-compose build` を待つのがたいぎい (広島弁) ので、そのままローカルでも動かせるように `config/database.yml` の `db` を環境変数にしました。
もっとエレガントな方法があったらお教え下さい。🙇🏽( **教えていただきました!** 追記します!)

元の `database.yml` では docker-compose 用に `host: db` としていました。

```yaml:(元)config/database.yml
development: &default
  username: postgres
  host: db
  adapter: postgresql
```

それを

```yaml:config/database.yml
development: &default
  username: postgres
  host: <%= ENV['DATABASE_HOST'] %>
  adapter: postgresql
```

としました。
これにより、環境変数 `DATABSE_HOST` により切り分けられ、docker したいときは `Dockerfile` を

```Dockerfile:Dockerfile
(前略)
ENV DATABASE_HOST db
```

と追記しておき、
ローカルで `rails server` したいときは

```sh
export DATABASE_HOST=localhost
```

としておけば両方使えました。

# 追記

コメントで @holidayworking さんに、次のように `config/database.yml` で `ENV.fetch()` というのを使えば環境変数 DATABASE_HOST が定義されていない環境では localhost に接続されるようになることを教えていただきました。ありがとうございました。

```yaml
host: <%= ENV.fetch('DATABASE_HOST', 'localhost') %>
```
ElectronでWebGL 2.0を動かす

# ElectronでWebGL 2.0を動かすには

```js
app.commandLine.appendSwitch('enable-unsafe-es3-apis');
```

を

```js
app.on('ready', function() {
```

の手前に入れる。

app.commandLine.appendSwitchにはChromeのオプションの手前の--(--enable-unsafe-es3-apis)を除いたものを指定することで[Electron公式のドキュメント](https://github.com/atom/electron/blob/master/docs/api/chrome-command-line-switches.md)以外のオプションも渡せる模様。

[![https://gyazo.com/1d793ae812376b6a224b31565b9ba0c6](https://i.gyazo.com/1d793ae812376b6a224b31565b9ba0c6.png)](https://gyazo.com/1d793ae812376b6a224b31565b9ba0c6)

# 関連記事

- [CI環境のNightmareでWebGLを動かす方法や、NightmareでWebGL 2.0を動かす方法 - non vorrei lavorare](http://abrakatabura.hatenablog.com/entry/2016/03/24/211619#)
- [Electronで自分のIPアドレスをLAN内のiPhoneに通知するには](/entry/2015/10/24/113659)
- [Raspberry Piの温度をgRPCを使ってElectronで作ったデスクトップマスコットに表示させた](/entry/2018/06/16/070747)
- [ElectronでWebGL(three.js)使ってデスクトップマスコット作った際に分かったこと](/entry/2016/01/09/134348)
- [ElectronでmacOSのDockやWindowsのタスクバーに独自のアイコンを表示するには - non vorrei lavorare](/entry/2018/08/20/202928)
- [Tensorflowのclassify_image.pyにElectronでGUIを被せてみた](/entry/2017/02/05/134054)
- [lisp版ElectronのCeramicを動かした](/entry/2015/09/08/071602)
UIButtonなどUIControlの同時タップをデフォルトで禁止するメソッド

UIButton等の同時タップをまとめて禁止する方法を調べた結果、exclusiveTouchの値を一括して変更する方法が複数存在しました。

- Method Swizzlingを利用する
- ビューの階層をたどって一つずつ変更する
- exclusiveTouchをオーバーライドして常にtrueを返す

Method Swizzlingを利用したくないしビューをたどるのも不格好、オーバーライドして値を決め打ちにするのはよろしくないので、Swiftで以下の方法を考えました。

```swift
var exclusiveTouchKey: UInt32 = 0
extension UIControl {
    public override var exclusiveTouch: Bool {
        get {
            let value = objc_getAssociatedObject(self, &exclusiveTouchKey) as? Bool
            return value ?? true
        }
        set {
            objc_setAssociatedObject(self, &exclusiveTouchKey, newValue, .OBJC_ASSOCIATION_RETAIN)
        }
    }
}
```

これを定義しておくだけでUIControlのexclusiveTouchがデフォルトでtrueになります。また、値を変更することも可能です。

exclusiveTouchをオーバーライドするのですが、associated objectがnilの場合（初期値）はtrueに設定して、exclusiveTouchをセットするとassociated objectに値が設定されfalseに変更することもできるようになっています。副作用が無いかは検証しきれていませんが、簡単な動作検証では正常に動作しました。
AD2 > Link > reference manual > 9. Features and Performances > Input impedance: 1M[ohm] | 24[pF]

@ [reference manual](https://reference.digilentinc.com/analog_discovery_2:refmanual#features_and_performances) 9. Features and Performances

> Input impedance: 1MΩ||24pF

そのうち24pFという値が重要になってくるかもしれない。

w2aewさんの関連動画
https://www.youtube.com/watch?v=SX4HGNWBe5M
6:30頃にコンデンサ関連の説明がある。
AD2 > Link > reference manual > 9. Features and Performances > Absolute Resolution:0.32mV / Accuracy: ±10mV±0.5%

@ [reference manual](https://reference.digilentinc.com/analog_discovery_2:refmanual#features_and_performances) 9. Features and Performances

> Absolute Resolution(scale ≤0.5V/div9)): 0.32mV
Absolute Resolution(scale≥1V/div10)):	3.58mV
Accuracy (scale≤0.5V/div, VinCM = 0V): ±10mV±0.5%
Accuracy (scale≥1V/div, VinCM = 0V): ±100mV±0.5%

0.5V/divではResolutionは0.32mVあるが、Accuracyは±10mV程度とのこと。

Band Elimination Filterによりハムノイズが±8mV程度になっている現状。
http://qiita.com/7of9/items/87501078665981bb1e58
Elixir関連のTwitterハッシュタグ

## [#elixirlang](https://twitter.com/search?q=%23elixirlang&src=typd)
汎用。

## [#elixir](https://twitter.com/search?q=%23elixir&src=typd)
他の色々なものと被るので、検索用としては実用性なし。特定範囲内、たとえば自分のtweet過去ログなどをあとで検索する用には使えるか。

## [#myelixirstatus](https://twitter.com/search?q=%23myelixirstatus&src=typd)
 #elixirlangより多いくらい投稿数があるこれはなんだろう。Elixir活動記録、みたいな？

## [#elixirlangjp](https://twitter.com/search?q=%23elixirlangjp&src=typd)
特に調べもせず使ってみたら、他に誰も使っていなかったやつ。現状、#elixirlangでも容易に全部読める流速だからね…。日本語圏については[Elixirで文字列検索](https://twitter.com/search?q=Elixir&src=typd)で良さげだけど、Twitterの検索はアカウント名が引っかかるクソ仕様なので(回避方法あったら教えて)、ある日突然辛くなる可能性はあり。
AD2 > Link > reference manual > 8. FPGA > AWG > Arbitrary Waveform Generator

@ [reference manual](https://reference.digilentinc.com/analog_discovery_2:refmanual#fpga) 8. FPGA

> Analog Signal synthesis (look-up tables, AM/FM modulation for AWG)

AWG: 電子工作のAWGではないのは確か。

> 1.1 Architectural Overview and Block Diagram
> …
> Signals in the Analog Output block, also called AWG

AWGという abbreviation の long form は reference manual にはないようだ。

<hr>

検索して見つけた。

https://www.signadyne.com/en/products/hardware/generators-digitizers/awgs/sd-awg-h3343f--arbitrary-waveform-generator-fpga

> Arbitrary Waveform Generator

任意波形生成
技術英語 > unsung hero / think something over

http://eow.alc.co.jp/search?q=unsung+hero
> unsung hero
> 縁の下の力持ち

BBC 6 minutes Englishのどこかのエピソードで出てきた。

<hr>

静かに 健やかに 遠くまで by 城山三郎

p104 ヒーローの条件
> 報われないのを承知の上でおそろしいほどの勤勉と努力の積み上げ
...

5つほどのヒーローの条件。時々見返して条件を満たしているか確認している。

これ([スーパー戦隊百科](http://www.super-sentai.net/sentai/))のヒーローとは違う。

<hr>

養生訓 by 貝原益軒

p140 五思をめぐらせて食事をする

> ...
> この食事は、もと農夫の勤労によって作り出した苦しみを、思いやらなければなりません。

<hr>

思い巡らす
http://ejje.weblio.jp/content/%E6%80%9D%E3%81%84%E5%B7%A1%E3%82%89%E3%81%99

> turn `<a matter>` over in one's mind
> think something over
> think of
GitHub 上の R パッケージのソースから関数の定義個所を見つける #rstatsj

某所の質問より

```
https://github.com/hadley/dplyr
↑から
%>% <- function(...){...} なってる箇所を発見したい（たぶんある）のですが、どうやって検索すれば楽でしょうか？
RじゃなくてGithubの使い方ですが。。。
```

できる！ R ならできるよ！ ということで **githubinstall** パッケージに追加してみた。

まずは **githubinstall** パッケージの最新版をインストールする。[^1]

```r:R
devtools::install_github("hoxo-m/githubinstall")
```

[^1]: もしすでに **githubinstall** をインストールしているなら `githubinstall::githubinstall("githubinstall")` でできる

例えば、**dplyr** の `mutate` 関数の定義箇所を見つけるには次のようにする。

```r:R
library(githubinstall)
gh_show_source("mutate", "dplyr")
```

質問にあった `%>%` の定義は

```r:R
#' @importFrom magrittr %>%
#' @export
magrittr::`%>%`
```

みたいに書かれているので見つからない。

もうちょっと改良する必要がある。

## 参考

- [⭐️GitHub API(JSON)を叩いて学ぶRでのリスト操作とストーキング事情（2015年版）](http://uribo.hatenablog.com/entry/2015/12/02/180004)
Lambdaによるstd::bind を使わないカリー化

スコット・メイヤー氏のEffective Modern C++によると、C++11 C++14でstd::bindを使う意味は殆ど無いらしい。理由はstd::placeholders_とかが可読性を下げるから。

```
  auto func = [](const int &x, const int &y ){ return x*y ;};
  std::cout << func(2,3) << std::endl;
```

こんなラムダがあったとして

```
  using namespace std::placeholders;
  auto bindCurried = std::bind(func, 2, _1);
  std::cout << bindCurried(3) << std::endl;
```

こーやってカリー化すると、プレースホルダーがマジ汚い。
_1はこれから作られる関数の第一引数という意味だが、混乱する。
で、カリー化したい場合に何をするかというと、ラムダをさらに使う。
キャプチャでラムダを受けて、定義しているラムダの中でラムダを実行し、引数を一つ埋めるが、一つは定義するラムダの引数をそのままキャプチャしたラムダに渡す。
（何言ってるのかもはやわからんが、以下を見れば一目瞭然）

```
  auto curried = [&func](const int &y){
    return func(2, y);
  };
  std::cout << curried(3) << std::endl;
```

あー。確かに。std::bind要らねーわ。
ただ、ムーブとテンプレート絡める時はC++11ではまだstd::bindを使わなければいけないことがあるらしいが、C++14ではそれもないらしい。
メモ: Jenkins 2

## 参考

* dockerの情報
    * [jenkinsci/jenkins](https://hub.docker.com/r/jenkinsci/jenkins/tags/)
    * [docker/README.md at master · jenkinsci/docker](https://github.com/jenkinsci/docker/blob/master/README.md)
    * [Jenkins 2.0 Overview](https://jenkins.io/2.0/)


## 起動

```yaml:docker-compose.yml
web:
  image: jenkins/jenkins:lts
  ports:
    - "8080:8080"
  volumes:
    - ./home/:/var/jenkins_home/
```

※ `image: jenkins` はdocker公式イメージ、`jenkins/jenkins`はjenkins社がメンテナンスしている。`jenkins/jenkins`のほうがおすすめの様子。

* `/var/jenkins_home/`に書き込めないとか表示された場合

```bash:(書き込めない場合)
chmod 777 ./home/
```

```bash:起動
docker-compose up -d
```

### mailhog との連携

* jenkinsコンテナからメール送信をするにはメールサーバーが必要。

```yaml:docker-compose.yml
version: '3'
services:

  web:
    image: jenkins/jenkins:lts
    ports:
      - 8080:8080
    volumes:
      - ./home/:/var/jenkins_home/

  mail:
    image: mailhog/mailhog
    ports:
      - "8025:8025"
      - "1025:1025"
```

## 画面

* 初期パスワードを確認

![j0.png](https://qiita-image-store.s3.amazonaws.com/0/25728/0cfb4f73-0122-e682-7385-ef384bb51da2.png)

* 初期パスワードを貼り付け

![j1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/388c7cc2-f8f1-08c6-fdd3-3070048429be.png)

* おすすめプラグインのインストールを選択した。

![j2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/301f7c57-2a38-dfbc-8855-b0148116128f.png)

* インストール完了まで数分待つ

![j4.png](https://qiita-image-store.s3.amazonaws.com/0/25728/00135d28-228e-f5ca-8ed5-52b2a8c6e993.png)

* adminユーザ。メールアドレスの入力必須

![j5.png](https://qiita-image-store.s3.amazonaws.com/0/25728/0ce6d70e-2307-4d52-add0-c6e6a90cb890.png)

* 完了

![j6.png](https://qiita-image-store.s3.amazonaws.com/0/25728/b92caa25-fede-52d0-d1a2-785689265cfe.png)


* トップページ

![j7.png](https://qiita-image-store.s3.amazonaws.com/0/25728/7f489565-512d-0a47-956f-1b964848fd8b.png)

* 新しいジョブの作成

![j8.png](https://qiita-image-store.s3.amazonaws.com/0/25728/a4fe8163-be74-a857-c52e-f76535189243.png)
Studio OneでVSTプラグインを読み込む

# Studio OneでVSTプラグインを読み込む

## Studio OneでVSTプラグインを使用するには
vstpluginはStudio One Professional/Artist用アドオンで使用可能
[バージョン別機能比較](http://www.mi7.co.jp/products/presonus/studioone/compare/)
[Studio One 3用アドオン](http://www.mi7.co.jp/products/presonus/studioone/addon/)


## VSTのダウンロード
無料のvstが公開されているので、適当なものをダウンロードする。
32bitと64bitがあるので、使用しているDAWのbit数を確認してからダウンロードする。
[無料でもいいじゃないか！使えるフリーVSTプラグイン(音源編)](http://ch.nicovideo.jp/lamemusic/blomaga/ar805982)

## VSTを置くロケーションの確認
[Studio One]->[オプション]
![160325_STO2_001.png](https://qiita-image-store.s3.amazonaws.com/0/111261/01e9e307-be2d-1f1e-b7dd-39387eaca8cd.png)

[ロケーション]->[VSTプラグイン]->[ロケーション]
VSTを置くロケーションを確認する
![160325_STO2_002.png](https://qiita-image-store.s3.amazonaws.com/0/111261/a0237560-6a28-e090-ac35-4ee1b1efbbfc.png)


## VSTを置くロケーションにVSTを配置
ダウンロードしたvst(.dll)を確認したロケーションに配置する
Studio One起動時にVSTが読み込まれるため、Studio Oneを再起動する
PictRubyの0.5を申請


iTunes Connect にROMを提出。順調に行けば2週間位だろうか。

[Bump 0.5 · ongaeshi/PictRuby@dd603ca](https://github.com/ongaeshi/PictRuby/commit/dd603cad73c72735abfe62748c197b2b5efe6b30)

## 更新履歴
- スクリプト
  - チャットボットを作成可能に
    - Chatクラスを定義してください
  - mruby-eval の追加
  - sample/10_irb.rb の追加
- その他
  - "Application supports iTunes file sharing" を有効に
  - アイコン、起動画面の更新

チャットボット作るの楽しい。チャットボットを利用してirbも作れた。

<img width="400" alt="pictruby-irb-02.png" src="https://qiita-image-store.s3.amazonaws.com/0/3885/b4cac003-ed06-917b-58ae-b0999e57a56c.png">

ソースも20行位で書けます。

```ruby
class Chat
  def welcome
    <<EOS
irb - Interactive Ruby Shell
EOS
  end

  def call(input)
    begin
      eval(input)
    rescue Exception => e
      e.message
    end
  end
end
```
node.jsによるコマンドラインツール

node.jsでコマンドラインツールを作るために覚えることはほとんどありません。
package.jsonにコマンドラインツールとして提供したいjsファイルを以下のように書くだけです。ここでは、実行するjsファイルを`cli.js`とします。

```package.json
"bin": "cli.js"
```

また、パッケージ名を名前を変えたい場合は、以下のようにも書くことができます。

```package.json
"bin": {
	"long-command": "cli.js"
}
```

`cli.js`の1行目に以下を記述します。

```
#!/usr/bin/env node
```

試しにコマンドラインで`1 2 3`と引数を渡すと`6`と表示される足し算をするコマンドラインツールをつくってみます。

```package.json
{
  "name": "sum",
  "bin": "cli.js"
}
```

```cli.js
#!/usr/bin/env node
'use strict';
const args = process.argv.slice(2);

function sum(args) {
	return args.reduce((sum, v) => {
		return sum + Number(v);
	}, 0);
}

console.log(sum(args));
```

あとは、`cli.js`に実行権限をつけて完成です。

```
./cli.js 1 2 3
// 6
```

簡単ですね。

引数のオプションを利用したい場合は、[sindresorhus/meow: CLI app helper](https://github.com/sindresorhus/meow)が便利です。
また、より複雑なことをしたい場合は、[sindresorhus/awesome-nodejs: A curated list of delightful Node.js packages and resources.](https://github.com/sindresorhus/awesome-nodejs#command-line-utilities)を見るといいと思います。node.jsのコマンドラインインターフェースのためのライブラリがまとまっています。
ubuntu15.10にしたらcronが動かない件

`Systemd`の`Timer`使えばいいらしい
https://wiki.archlinux.org/index.php/Systemd/Timers#As_a_cron_replacement

でも、書き直すは面倒なので

* 既存のcronからSystemdのTimerで動くようにしたい人は[systemd-crontab-generator](http://manpages.ubuntu.com/manpages/wily/man8/systemd-crontab-generator.8.html)
* 既存のcronをそのまま動かしたい人は[systemd-cron](http://manpages.ubuntu.com/manpages/wily/man7/systemd.cron.7.html)


とりあえず`systemd-cron`で動かすようにして、そのうちgeneratorつかって変換しようと思います。
今の人に知って欲しい少し昔のサーバー話


# ご挨拶

最近qiitaへ投稿を頑張ろうと思っている31歳プログラマー(恋人募集中)です。
大した経歴でも無いので何ですが、
『最近みないなぁ』と思いつつ何か琴線に触れれば知ってほしいツール等を紹介出来ればと思います。

※ 分類・ツール等はちょくちょく整理していこうと思います。

# OS編

ここは本当に名前を上げる程度で。
『並列にそれは並べちゃいかんだろ！』
とか思う方もいるかもしれませんがご了承下さい。
もし興味がある OS があれば使ってみてください。

* BSD 系
    * Solaris
    * FreeBSD
    * OpenBSD
    * NetBSD
* Linux 系
    * Slackware
    * Debian
    * Red Hat Enterprise Linux
    * Amazon Linux

もっと知りたい方は[こちら](http://distrowatch.com/)

# サーバー編

今では azure/AWS を筆頭に各種サーバーを自前で保つ必要がなくなってきましたが、
ほんの10年ほど前はまだ各社データセンターに実機でハードウェアを持って運用していました。
そんな時に使われていた仕組み・ツール等をここでは紹介したいと思います。

もちろん今でも意識せずにすんでいるだけで使われている物もあると思います。
もし興味を引くものがあればこちらも調べて見て下さい。

## バージョン管理

git のご先祖様

* Subversion
* CVS

## メール関連

* Sendmail
* qmail

## その他

* Heartbeat
    * 死活監視
* Samba
    * ファイルサーバー
* BIND
    * DNSサーバー
* Cobbler
    * PXEインストールで利用するイメージを管理するユーティル？
* OpenLDAP
    * LDAPサーバー
 

# その他

* ブートローダー
    * GRUB
    * LILO
* 仮想化
    * Jail
    * Xen
    * KVM
* ブラウザ
    * Lynx
    * w3m
* エディタ
    * ed
初心者が初心者なりに初心者向けに様々な言語を分類してみた

初心者です。プログラミングを勉強してみてどの言語を学ぶべきか色々迷ったため、様々な言語を調査、分類してまとめます。専門家の方から見たら至らない点があるかと思いますが、ご容赦ください。厳密な分類をする気はありません。
##この記事の方針##
高級言語と低級言語と機械語であるとか、静的言語と動的言語であるとか、そういう専門的な分類は、初心者が知っても役に立たない＆私もよくわからないため、詳しい方に解説を譲るとして、**その言語で何ができるのか**を重視して分類していきます。
##使い方で分類するプログラミング言語##
###フロントエンド言語###
HTML、CSS、JavaScriptのセット。
一応厳密に言えばHTMLとCSSはプログラミング言語ではなくマークアップ言語です。この３つの言語は、ブラウザ上にWebページを表示するために使用されます。ブラウザ上で動作する言語です。
###何でもできる言語###
C、C++
OSやプログラミング言語など何でも作ることができます。しかも実行は非常に速い。組み込みソフトウェアにも使われるます。何でもできる反面、できることが多すぎて煩雑になり、コードが長くなるのが難点です。
###だいたい何でもできる言語###
Java、C#
OSを作るためには使われませんが、だいたい何でもできる言語です。Javaは一般的なOS上で動かそうとすると重いのが難点です。
###主にサーバで使われる言語###
Ruby、PHP、Python、Perlなど
サーバの上で走らせる言語です。一般的なWebサービスにおけるサーバの役割は、ブラウザ上だけで完結できないことを実現することです。裏方を行う言語とも言えるかもしれません。日本だとRubyとPHPの２強。海外だとPythonも人気みたいです。
###アプリ開発に使われる言語###
Java(Android)、Swift(iOS)など
スマホアプリは端末ごとに必要な言語が決まっています。もしアプリを作りたければこれらの言語を学ばねばなりません。
###統計解析に用いられる言語（最近はやりの機械学習関連）###
R、Python、Juliaなど
Python以外は統計解析専門の言語です。機械学習は統計解析と密接にかかわるため、これらの言語が必要になります。
##まとめ##
プログラミングに詳しい方から見るとこれが抜けてる、というのがある気がしますが、一般的に使われている言語はだいたい入っているかな？　至らないところがあれば指摘していただければ幸いです。
expr の計算結果が0になる時は注意

## tl;dr

* `expr`の計算結果が0になる場合はexit statusが1になる
* 代わりに算術式展開 `$(( ))` を使う

## 概要
ある日、数千件のIDが書かれたファイルを読み込んでMySQLからデータを取得するお仕事がありました。対象のテーブルはID % 20の結果をテーブル名の末尾につけてたのでこんな感じのシェルを書いてました。

```users.sh
#!/bin/sh

set -eu

cat '/tmp/users.txt' | while read user_id
do
	mod=`expr $user_id % 20`
	mysql -uroot -proot -h 127.0.0.1 test <<-EOS
		select * from users_${mod} where id = ${user_id} or 1=1
	EOS
done

```

あー楽勝だわと思ってボーッとしてたらなぜかデータが足りないと。いやいや、数行しか書いてないしバグるわけ無いじゃん。一応何件かデータピックアップして計算したし。と思って、教えてもらったIDをチェックすると確かにデータがない(つд⊂)ｺﾞｼｺﾞｼ

`set -x` オプションつけてみると、あれ？mysql実行してなくね？。

```debug.sh
#!/bin/sh

set -eux

#cat '/tmp/users.txt' | while read user_id
#do
	user_id=20
	mod=`expr $user_id % 20`
	mysql -uroot -proot -h 127.0.0.1 test <<-EOS
		select * from users_${mod} where id = ${user_id} or 1=1
	EOS
#done

```

```debug.txt
[tmp ]$ sh users.sh
+ user_id=20
++ expr 20 % 20
+ mod=0
```

## 原因
同僚に教えてもらったのですが、`expr` は計算結果が0のときは exit statusが1になるので、 `set -e` をつけていたのでエラーも何も出さずに止まってました

```
The expr utility exits with one of the following values:
0       the expression is neither an empty string nor 0.
1       the expression is an empty string or 0.
2       the expression is invalid.
```

`0 = result false`だからexit statusが1なのかな？

## もうちょっと検証してみる

```
$ ret=`expr 20 % 20`
$ echo $?
1
$ echo $ret
0
$ ret=`expr 20 % 3`
$ echo $?
0
$ echo $ret
2

$ ret=$((20 % 20))
$ echo $?
0
$ echo $ret
0
$ ret=$((20 % 3))
$ echo $?
0
$ echo $ret
2
```

この辺でも言われてた
http://unix.stackexchange.com/questions/63166/bash-e-exits-when-let-or-expr-evaluates-to-0
Effective Python メモ　項目12　forとwhileループの後のelseブロックは使うのを避ける

https://www.oreilly.co.jp/books/9784873117560/
P23~25

# (pythonだけ）elseブロックの落とし穴！
通常、プログラミング言語におけるelseブロックは主に「上部のブロックが実装されなかったら、これを実行しなさい」という意味合いで使われていると思います。
しかし、pythonでは違います

```python
for i in range(3):
    print('Loop %d' % i)
else:
    print('Else block')

>>>
Loop 0
Loop 1
Loop 2
Else block
```
このように、forループが実行完了したあとにelseブロックが実行されています。
また、直前にbreakが実行された場合はelseブロックは実行されないという謎仕様

```python
for i in range(3):
    print('Loop %d' % i)
    if i == 1:
        break
else:
    print('Else block')

>>>
Loop 0
Loop 1
```

さらに、空のシーケンスをループすると、elseブロックがすぐに実行される

```python
for i in []:
    print('Never runs')
else:
    print('Else block')

>>>
Else block
```
さらにさらに、whileループの頭で失敗した場合はそのまま実行される

```python
while False:
    print('Never runs')
else:
    print('Else block')

>>>

Else block
```

# 謎仕様の使いみち
ループ後の情報を処理する場合に使いみちがある。
例えば、２つの数字が互いに素（公約数が１位外に無い）かどうかを調べる際に、あらゆる数字を試す道中で公約数が見つかる場合は素でないと判断できるが、最後までループを回しても見つからなかった場合は素であると判断できる。ここでこの仕様は役に立つ。

```python
a = 4
b = 9

for i in range(2, min(a, b) + 1):
    print('Tasting', i)
    if a % i == 0 and b % i ==0:
        print('Not coprime')
        break
else:
    print('Coprime')

>>>
Tasting 2
Tasting 3
Tasting 4
Coprime
```
ようは、前のブロックがbreak判定がある場合にしか役に立たないと思われる。

だったら別途ヘルパー関数を書くなりして、もっとスマートなやり方にするべきでしょう。

**結論なるべくループでelseブロックを使わないこと**
C言語　２次元配列を使ったmap移動ゲーム

C言語の構造体の勉強がてら作ったゲーム
２次元配列を用いてmapを作り、構造体で座標を処理する。

＊実行環境はwindows

ソースコード

```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#include <windows.h>

#define HPmin 0
	
	struct data{
		int  x;
		int  y;
		int hp;
	};

void map(struct data a,struct data b);
void GameStart();
void GameEnd();
	
int main(void){
	
	int key,flag = 1,num;
	int bx,by;
	struct data  pos = {2,2};
	struct data bpos;
				bpos.hp = 5;
	srand((unsigned)time(NULL));
	 bx = (int)(rand() / (RAND_MAX+1.0) * 5.0);
	 by = (int)(rand() / (RAND_MAX+1.0) * 5.0);
	bpos.x = bx;
	bpos.y = by;
	system("cls");
	
   	GameStart();
	map(pos,bpos);
	
		
	while(flag == 1){
		
		
		
		if(kbhit()){
			system("cls");
			key = getch();
			if(key == 0 || key == 224)key = getch();
			
		switch(key){
			case 0x48:	if(pos.y == 0)break;
						 pos.y--; break;
			case 0x50: if(pos.y == 4)break;
						 pos.y++; break;
			case 0x4b: if(pos.x == 0)break;
						 pos.x--; break;
			case 0x4d: if(pos.x == 4)break;
						 pos.x++; break;
		}
			num = 1 + (int)(rand()*(4-1+1.0)/(1.0+RAND_MAX));
			if(num == 1){
				bpos.x = (int)(rand() / (RAND_MAX+1.0) * 5.0);
				bpos.y = (int)(rand() / (RAND_MAX+1.0) * 5.0);
			}
				if(pos.x == bpos.x && pos.y == bpos.y){
					Sleep(300);
					Beep(830,100);
					Beep(880,100);
					 bpos.hp -= 1;
					 while(pos.x == bpos.x && pos.y == bpos.y){
					 bpos.x = (int)(rand() / (RAND_MAX+1.0) * 5.0);
					 bpos.y = (int)(rand() / (RAND_MAX+1.0) * 5.0);
					 system("cls");
					 }
				} 
				if(bpos.hp == HPmin)flag = 0;
		}
		map(pos,bpos);
		printf("\n\n (%d, %d) [8/2/4/6]>\n\n十字キーを使って%dを\n追いかけてください！\n1があなたです\n",pos.x,pos.y,bpos.hp);
	//	Sleep(10);
		system("cls");
	}
	GameEnd();
	
	return 0;
}

void map(struct data a,struct data b){
	
	int i,j;
    int  map[5][5];

	 
	 for(i = 0;i<5;i++){
		for(j = 0;j<5;j++){
		map[i][j] = 0;
		}
	}

	map[a.y][a.x] = 1;
	map[b.y][b.x] = b.hp;
	
	printf("\n\n");
	printf("    %d %d %d %d %d \n",map[0][0],map[0][1],map[0][2],map[0][3],map[0][4]);
	printf("    %d %d %d %d %d \n",map[1][0],map[1][1],map[1][2],map[1][3],map[1][4]);
	printf("    %d %d %d %d %d \n",map[2][0],map[2][1],map[2][2],map[2][3],map[2][4]);
	printf("    %d %d %d %d %d \n",map[3][0],map[3][1],map[3][2],map[3][3],map[3][4]);
	printf("    %d %d %d %d %d \n",map[4][0],map[4][1],map[4][2],map[4][3],map[4][4]);
}
void GameStart(){
	system("cls");
	printf("\n\n\n");
	printf("     GAME\n     Start!\n");
	Beep(600,200);
	Beep(900,200);
	system("cls");
}
void GameEnd(){
	system("cls");
	printf("\n\n\n");
	printf("     GAME\n     Clear!\n");
	Sleep(200);
	Beep(740,90);
	Beep(698,90);
	Beep(587,90);
	Beep(415,90);
	Beep(392,90);
	Beep(587,90);
	Beep(784,90);
	Beep(988,90);
	Sleep(1000);
	system("cls");
}
```

ゲーム開始時の音、十字キー操作など、追加したい機能を調べながら作ったので
シンプルなゲームとして、応用可能な状態です。
AWSのEC2のセキュリティのインバウンドのルールでIPを設定する場合は/32をつける

AWSのEC2のセキュリティグループでIPアドレス(211.123.456.789)でインバウンドのSSH接続を設定しようとしたら、
下記エラーが
**送信元は CIDR ブロックまたはセキュリティグループ ID にする必要があります。**

地味に嵌った
IPアドレスを指定する場合は/32（ユニキャスト）をつける。

例 211.123.456.789/32

今まではマイIPでやっていたので、エラーで嵌りました。
stylieでcssアニメーション


デモ：http://mo49.tokyo/qiita/20160324/fontScaleAnim.html

簡単なcssアニメーションであれば、stylieでつくるのが楽。
http://jeremyckahn.github.io/stylie/



以下はstylieで書き出す

```css:css

.fontScaleAnim {
  animation-name: fontScaleAnim;
  animation-duration: 1000ms;
  animation-fill-mode: forwards;
  animation-timing-function: linear;
  animation-iteration-count: infinite;
  transform-origin: bottom; /* topにすれば上からパタパタ降りてくるアニメーション */
}
@keyframes fontScaleAnim {
  0% {transform: scaleY(0) rotateY(0deg);}
  3.33% {transform: scaleY(0.0084) rotateY(0.0667deg);}
  6.67% {transform: scaleY(0.0336) rotateY(0.1333deg);}
  10% {transform: scaleY(0.0756) rotateY(0.2deg);}
  13.33% {transform: scaleY(0.1344) rotateY(0.2667deg);}
  16.67% {transform: scaleY(0.2101) rotateY(0.3333deg);}
  20% {transform: scaleY(0.3025) rotateY(0.4deg);}
  23.33% {transform: scaleY(0.4117) rotateY(0.4667deg);}
  26.67% {transform: scaleY(0.5378) rotateY(0.5333deg);}
  30% {transform: scaleY(0.6806) rotateY(0.6deg);}
  33.33% {transform: scaleY(0.8403) rotateY(0.6667deg);}
  36.67% {transform: scaleY(1.0083) rotateY(0.7333deg);}
  40% {transform: scaleY(1.09) rotateY(0.8deg);}
  43.33% {transform: scaleY(1.1549) rotateY(0.8667deg);}
  46.67% {transform: scaleY(1.2031) rotateY(0.9333deg);}
  50% {transform: scaleY(1.2344) rotateY(1deg);}
  53.33% {transform: scaleY(1.2489) rotateY(1.0667deg);}
  56.67% {transform: scaleY(1.2466) rotateY(1.1333deg);}
  60% {transform: scaleY(1.2275) rotateY(1.2deg);}
  63.33% {transform: scaleY(1.1916) rotateY(1.2667deg);}
  66.67% {transform: scaleY(1.1389) rotateY(1.3333deg);}
  70% {transform: scaleY(1.0694) rotateY(1.4deg);}
  73.33% {transform: scaleY(1.0081) rotateY(1.4667deg);}
  76.67% {transform: scaleY(1.0424) rotateY(1.5333deg);}
  80% {transform: scaleY(1.06) rotateY(1.6deg);}
  83.33% {transform: scaleY(1.0608) rotateY(1.6667deg);}
  86.67% {transform: scaleY(1.0447) rotateY(1.7333deg);}
  90% {transform: scaleY(1.0119) rotateY(1.8deg);}
  93.33% {transform: scaleY(1.0122) rotateY(1.8667deg);}
  96.67% {transform: scaleY(1.0145) rotateY(1.9333deg);}
  100% {transform: scaleY(1) rotateY(2deg);}
}
```

遅延処理もおまけ

```css:css
.delay100 { animation-delay: 100ms; }
.delay300 { animation-delay: 300ms; }
.delay500 { animation-delay: 500ms; }
.delay700 { animation-delay: 700ms; }
```
背景をエンドレスに動かす


デモ：http://mo49.tokyo/qiita/20160324/moveBg.html

dom用意

```html:html
<div class="bg_move"></div>
```

画像サイズと同じだけbackground-positionを動かす

```css:css
.bg_move{
	background-image: url('bg.jpg');
	height: 500px;
    animation: moveBg 5s infinite linear;
}
@keyframes moveBg{
    0%    { background-position: 0 0; }
    100%  { background-position: -256px 256px; }
}
```
htaccessで正規表現を使ったリダイレクト

サイトの移転や構成を変えた時に、新しいURLへ転送するために使用するリダイレクト。
Redirect(mod_alias)とRewrite(mod_rewrite)があるが、今回はRedirectを使った.htaccessの書き方。
mod_rewriteでも同じことができたり、より複雑な条件でリダイレクトさせることもできる。

# 基本の形
```apache
#普通バージョン
Redirect permanent 移転前パス 移転後パス
#正規表現を使うバージョン
RedirectMatch permanent 移転前パス 移転後パス
```

#正規表現を使ってリダイレクトさせる
##使用例①
###ディレクトリを分割して転送したい
####「西暦+月」でディレクトリを作っていたが…

- /201601/
- /201602/
- /201603/
- /201701/
- /201702/
- /201703/


####「西暦」「月」を分けたのでリダイレクトさせたい
- /2016/
    + /01/
    + /02/
    + /03/
- /2017/
    + /01/
    + /02/
    + /03/

####こんな感じで転送されるようにする
```html
http://foge.com/201601/inu.html
↓転送↓
http://foge.com/2016/01/inu.html
```
###リダイレクトの書き方
```apache:.htaccess
#同ドメインの場合
RedirectMatch permanent ^/([0-9]{4})([0-9]{2})/(.*)$ /$1/$2/$3

#ドメインも移転した場合
RedirectMatch permanent ^/([0-9]{4})([0-9]{2})/(.*)$ http://移転先ドメイン/$1/$2/$3
```
**([0-9]{4})**…4桁の数字
**([0-9]{2})**…2桁の数字
**(.*)**…すべての文字列

**$1**…ひとつ目のカッコの内容 (※上記の場合は、4桁の数字が入る)
**$2**…ふたつ目のカッコの内容 (※2桁の数字)
**$3**…みっつ目のカッコの内容 (※すべての文字列)

##使用例②
###特定のディレクトリやファイル以外を転送したい
このディレクトリ(ファイル)は転送したくない、というとき。
参考サイト: https://gist.github.com/nagasato/2288987

###リダイレクトの書き方
```apache:.htaccess
#hogehogeディレクトリ以外転送
RedirectMatch permanent ^/((?!hogehoge).*)$ http://移転先/$1

#/test.html以外転送
RedirectMatch permanent ^/((?!test\.html).*)$ http://移転先/$1

#条件を複数指定する場合
RedirectMatch permanent ^/((?!(hogehoge|fugafuga)).*)$ http://移転先/$1

```

##使用例③
###トップページだけを転送したい
http://ほげどっとこむ/
http://ほげどっとこむ/index.html
どちらでアクセスしても、
http://転送先/
に転送する。
ディレクトリ単位でもできる。

###index.html(index.php)のありなしを統一したい
いわゆるURL正規化と言われるやつ。

###リダイレクトの書き方
```apache:.htaccess
#トップページだけ転送・URL正規化
RedirectMatch permanent ^(/|/index\.html)$ http://転送先/

#特定ディレクトリのURL正規化
RedirectMatch permanent ^/gogogo(/|/index\.php)$ http://転送先/gogogo/
```

##使用例④
###拡張子を変えたい
例えばHTMLを全部PHPにしたときに。

###リダイレクトの書き方
```apache:.htaccess
#.htmlを.phpに
RedirectMatch permanent ^(.*)\.html$ 転送先/$1.php

```
ソート

# ソート種類
1. マージソート
2. バブルソート
 - 隣合う2つの数字を比較していく

[マージソート(しネジソート)](https://www.youtube.com/watch?v=YKa0UL09cAc)
[クイックソート](https://www.youtube.com/watch?v=rG4XYQ5hhMc)

http://www.wakuwakuacademy.net/itcommon/
Nimのプログラムをコンパイルしようとしたら ”error: size of array 'assert_numbits' is negative” とかいうエラーが出た話

nimとかいうPythonライクな構文の言語 (Pascalの方が近い？) があるという情報を聞いたので試してみようとしたら，ちょっとハマったのでメモ．

nimについては以下のリンク先が詳しいのでそちらを参照されたい．

[Nimの紹介 − Python風静的型付言語 〜コンパイラと型推論を添えて〜 - Blank File](http://h-miyako.hatenablog.com/entry/2015/01/13/201846)

コンパイルしようとしたら以下のようなエラーが出てきた．

```
c:\users\<user name>\nim>nim compile --run fib.nim
Hint: system [Processing]
Hint: fib [Processing]
CC: fib
CC: stdlib_system
In file included from c:\users\<user name>\nim\nimcache\fib.c:9:0:
C:\Nim\lib/nimbase.h:412:13: error: size of array 'assert_numbits' is negative
 typedef int assert_numbits[sizeof(NI) == sizeof(void*) && NIM_INTBITS == sizeof(NI)*8 ? 1 : -1];
             ^
In file included from c:\users\<user name>\nim\nimcache\stdlib_system.c:9:0:
C:\Nim\lib/nimbase.h:412:13: error: size of array 'assert_numbits' is negative
 typedef int assert_numbits[sizeof(NI) == sizeof(void*) && NIM_INTBITS == sizeof(NI)*8 ? 1 : -1];
             ^
Hint:  [Link]
gcc.exe: error: c:\users\<user name>\nim\nimcache\stdlib_system.o: No such file or directory
gcc.exe: error: c:\users\<user name>\nim\nimcache\fib.o: No such file or directory
gcc.exe: fatal error: no input files
compilation terminated.
Error: execution of an external program failed: 'gcc.exe   -o c:\users\<user name>\nim\fib.exe  c:\users\<user name>\nim\nimcache\stdlib_system.o c:\users\<user name>\nim\nimcache\fib.o  '

```

[ここ](https://github.com/nim-lang/Nim/issues/3258)によると自分の環境に元々入ってるMinGWじゃだめらしい．nimをインストールするときに一緒にインストールしたMinGWの中のgccを使ったらうまくコンパイルできた．めでたしめでたし．
Docker用LAMPコンテナー

以下の環境構築をすばやくできるDockerコンテナーを作成する為のメモ。

* Apache 2.2系
* PHP 5.5系
* MySQL 5.6系
* phpMyAdmin

# 用意するもの

* dockerがインストールされた環境(本手順ではバージョン1.8)
* Dockerfile
* httpd.conf (初期設定で良ければ無くてもOK)
* my.cnf (初期設定で良ければ無くてもOK)
* supervisord.conf

## Dockerfile

```bash:Dockerfile
FROM centos:centos6

RUN sed -i '/^ZONE/d' /etc/sysconfig/clock
RUN sed -i '/^UTC/d' /etc/sysconfig/clock
RUN echo 'ZONE="Asia/Tokyo"' >> /etc/sysconfig/clock
RUN echo 'UTC="false"' >> /etc/sysconfig/clock
RUN cp -p /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

RUN yum -y update

RUN yum -y groupinstall "Japanese Support"
RUN localedef -f UTF-8 -i ja_JP ja_JP.utf8
RUN echo 'LANG="ja_JP.UTF-8"' > /etc/sysconfig/i18n

RUN yum -y install python-setuptools
RUN easy_install supervisor

RUN yum install -y http://repo.mysql.com/mysql-community-release-el6-5.noarch.rpm
RUN yum install -y mysql mysql-server mysql-devel

RUN rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
RUN rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
RUN yum install -y httpd httpd-devel
RUN yum install -y --enablerepo=remi,remi-php55 phpMyAdmin
RUN yum install -y --enablerepo=epel libmcrypt
RUN yum install -y --enablerepo=remi,remi-php55 php php-devel php-pear php-mbstring php-xml php-mcrypt php-gd php-pecl-xdebug php-opcache php-pecl-apcu php-fpm php-phpunit-PHPUnit php-mysqlnd

RUN rm -f /etc/httpd/conf.d/welcome.conf
RUN rm -f /var/www/error/noindex.html
ADD httpd.conf /etc/httpd/conf/httpd.conf

ADD my.cnf /etc/my.cnf

ADD supervisord.conf /etc/supervisord.conf

EXPOSE 3306 80
CMD ["/usr/bin/supervisord"]
```

## httpd.conf

良さ気なものを用意

## my.cnf

良さ気なものを用意

## supervisord.conf

```bash:supervisord.conf
[supervisord]
nodaemon=true

[program:mysqld]
command=/sbin/service mysqld start

[program:httpd]
command=/sbin/service httpd start
```

# ビルド

lampディレクトリに用意したものを全て入れたとする。

```bash
$ cd lamp
$ sudo docker build -t lamp .
```

# 起動

```bash
$ sudo docker run -d -p 80:80 lamp
```

## 開発時に便利な初期設定

コンテナーにbashで入る。

```bash
$ sudo docker exec -it [コンテナー名] bash
```

とりあえず開発ツールを入れておく。

```bash
$ yum -y group install "Development tools"
```

ビルド時に入れてないのは、imageの容量が大きくなってしまうので。。。

# gitに用意した

「必要なもの」項目に該当するものをgitに用意した。
cloneすればどの環境でも呼び出せる！

https://github.com/chimao222/docker-lamp
Vagrant コマンドラインインターフェース POWERSHELL

#POWERSHELL

##command: vagrant powershell

PowerShellプロンプトをVagrantマシンの中に開く。

PowerShellをサポートしているマシンでのみ有効。サポートしない環境もある。

####オプション

<dl>
<dt>-c COMMAND / --command COMMAND</dt>
<dd>単一のPowerShellコマンドを実行し、stdout及びstdeerrを出力し、終了する。</dd>
ウォーターフォールとアジャイル開発

## ウォーターフォール
- 上流工程から下流工程へ順番に工程をこなしていく
- 基本的に後戻りはしない
- 大規模な開発で使われることが多い
- 仕様変更に弱い

## アジャイル開発
- 小さなサイクルでまわす
- アプリ等の小規模な開発に向いている

## 参考
- http://www.atmarkit.co.jp/ait/series/1674/
Stateパターン

振る舞いに関するデザインパターン

## 概要
state = ”状態”
状態がよく変わる処理を管理しやすくするデザインパターン

## クラス図
![クラス図](http://f.st-hatena.com/images/fotolife/t/tbpg/20120306/20120306021115.png)

## 登場するクラス
- 抽象クラス(State)
- 状態を表すクラスA(ConcreteStateA)
	- 抽象クラスを継承
	- 抽象クラスのメソッドをオーバーライド
- 状態を表すクラスB(ConcreteStateB)
	- 抽象クラスを継承
	- 抽象クラスのメソッドをオーバーライド
- 現在の状態を保持するクラス(Context)

## どういう時に使う？
main(contoroller)の処理で状態に応じてif文の分岐が多岐にわたる場合。

## メリット
状態がよく変わるプログラムを管理しやすくなる。

## コード例
天気(状態)によって、処理を変える場合のプログラム
天気を状態。
あいさつは処理とした場合の例

## ダメなコード例
```ダメなコード例
#!/usr/bin/ruby

class Weather
  # 天気の状態を保持する
  # 雨ならRainy
  def initialize(weather)
    @weather = weather
  end

  def ice_break
    if @weather == "Sunny"
      puts @weather
      puts "今日は晴れて、良い天気ですねー!!!"
    elsif @weather == "Rainy"
      puts "今日は雨がザーザーですね。"
    end
  end

  def choose_fastion
    if @weather == "Sunny"
      puts "なのでスニーカーを履こう"
    elsif @weather == "Rainy"
      puts "なので長靴を履こう"
    end
  end

  def switch_weather(weather)
    @weather = weather
  end
end

obj = Weather.new("Sunny")
obj.ice_break
obj.choose_fastion
puts "------" * 5
obj.switch_weather("Rainy")
obj.ice_break
obj.choose_fastion
```

### よくないところ
新しく状態を加える(例えば曇りを足す)場合、if文の分岐を全て見直さないといけない。ここでいうice_breakとchoose_fastionの中のif文。

## Stateパターン
```Stateパターン
#!/usr/bin/ruby

# State Pattern

# 抽象クラス
class State
  def ice_break
    # 実装されていなかったら例外を出す
    raise "not implemented error."
  end
  def choose_fastion
    # 実装されていなかったら例外を出す
    raise "not implemented error."
  end
end

class SunnyDay < State
  def ice_break
    puts "今日は晴れて、良い天気ですねー!!!"
  end

  def choose_fastion
      puts "なのでスニーカーを履こう"
  end
end

class RainyDay < State
  def ice_break
    puts "今日は雨がザーザーですね!"
  end

  def choose_fastion
    puts "なので長靴を履こう"
  end
end

class CloudyDay < State
  def ice_break
    puts "今日は天気悪いんですかねー..."
  end

  def choose_fastion
    puts "なのでなんでもよい"
  end
end

# 状況を保持するクラス
class Context
  def initialize
    @sunny = SunnyDay.new
    @rainy = RainyDay.new
    @cloudy = CloudyDay.new
    # 状況を保持
    @state = @sunny
  end

  def change_state(weather)
    if weather == "SunnyDay"
      @state = @sunny
    elsif weather == "RainyDay"
      @state = @rainy
    else
      @state = @cloudy
    end
  end

  def ice_break
    puts @state.class
    @state.ice_break
  end

  def choose_fastion
    @state.choose_fastion
  end
end

# Client(main)
obj = Context.new
obj.ice_break
obj.choose_fastion
puts "------" * 5
obj.change_state("RainyDay")
obj.ice_break
obj.choose_fastion
puts "------" * 5
obj.change_state("CloudyDay")
obj.ice_break
obj.choose_fastion
```


### 参考
* [RubyでStateパターン](http://tbpgr.hatenablog.com/entry/20120305/1330967432)
* [Stateパターンのどこがすごいのか、感心されたので、書いてみる](http://blog.goo.ne.jp/xmldtp/e/ad6b4d6777c85c3aca8048515ea9b369)