OmniAICreator/Qiita-1.07M huggingface dataset:
ActiveJobのログをマスクする

ActiveJobのパラメータにマスクすべき情報を設定している場合に使う。

HogeJob のログを消したい場合は

```ruby:config/initializers/active_job_logger_patch.rb
ActiveSupport.on_load :active_job do
  class ActiveJob::Logging::LogSubscriber
    private def args_info(job)
      if job.arguments.any?
        if job.class == HogeJob
          " #{job.class} arguments is masking"
        else
          ' with arguments: ' +
            job.arguments.map { |arg| arg.try(:to_global_id).try(:to_s) || arg.inspect }.join(', ')
        end
      else
        ''
      end
    end
  end
end
```

これでOK。
CS-Cart: テンプレートとコンポーネントの対応資料

コンポーネントとテンプレートの対応資料です。

## アカウント

design/themes/responsive/templates/blocks/my_account.tpl

<img width="437" alt="1.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/6edc1613-8639-2a46-1e15-41b1feef3893.png">
mysqlのDATE_FORMATで日付をスラッシュ区切りにして取得

mysqlでは日付はyyyy-MM-ddで格納されていますが、それを別の形式にして取得したいケースもあります。

アプリ側でやる手もありますが、SQL側でやるには[DATE_FORMAT関数](https://dev.mysql.com/doc/refman/5.6/ja/date-and-time-functions.html#function_date-format) が使えます。

ユーザテーブルの生年月日をスラッシュ区切りで取得するなら、下記のようにすればいけます。

```
SELECT DATE_FORMAT(birthday,'%Y/%m/%d') FROM User;
```
Subversion　ファイルの最初のコミットの日時をまとめて調べる

需要はさておき・・・

既存システムの追加改修をリリースするにあたって、

改修のあったファイルが既存への影響がある元からのファイルか、今回開発のために新規で追加されたファイルかをザックリ調べたかった。

svn logをしつつ、リビジョンを昇順にソートして、一番古いリビジョンを取り出し、そのレコードの日付部分とファイル名をechoするだけのスクリプト。

シェルスクリプトでも良かったのだが、例はPHPでのサンプル。

```php:sample.php
<?php

$files = array(
// 調べたいファイル ,
);

foreach ($files as $k => $v)
{
    $log = shell_exec("svn log ". $v ." | egrep '^r[1-9]' | uniq | sort | awk 'NR==1' | egrep -o '[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}'");
    echo $v . "\t" .  $log;
}

```
Ruby | first / last / begin / end / min / max の違い

## first

最初の要素を返す。それだけ。

```rb
[5,4,3,2,1].first

# => 5
```

## last

最後の要素を返す。それだけ。

```rb
[5,4,3,2,1].last

# => 1
```

## begin

範囲の中で、最初の要素を返す。(*2)
 first の Range 版みたいな感じだ。

```rb
(5..1).begin

# => 5
```

実は begin は first と同じだ。どちらでも書ける。(*1)

```rb
(5..1).first

# => 5
```

しかし普通の配列に begin は使えない。

```rb
[5,4,3,2,1].begin

# => NoMethodError: undefined method `begin' for [5, 4, 3, 2, 1]:Array
```

## end

範囲の中で、最後の要素を返す。(*2)
Range版の last みたいな感じだ。

```rb
(5..1).end

# => 1
```

実は end は last と同じだ。どちらでも書ける。(*1)

```rb
(5..1).last

# => 1
```

しかし普通の配列に end は使えない。

```rb
[5,4,3,2,1].end

# => NoMethodError: undefined method `end' for [5, 4, 3, 2, 1]:Array
```


# min

配列の中で、最も小さな要素を返す。
要素の順序は関係ない。

```rb
[5,4,-3,2,1].min

# => -3
```


# max

配列の中で、最も大きな要素を返す。
要素の順序は関係ない。

```rb
[5,4,30,2,1].max

# => 30
```

# 注釈

- *1) 厳密には引数を取る、取らないの違いがある。引数を渡さない場合は同じ動作になる。

- *2) Range の「最初の要素」は始端。「最後の要素」は終端と言った方が適切だ。Rubyの「範囲」の扱いはわりと複雑なので、この記事のコメントを参照してほしい。



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
JavaでCOMポートの一覧を取得(RXTX)

# JavaでCOMポート一覧を取得(RXTX)

## 動作確認環境
Windows 10 Pro 64bit
Java(TM) SE Runtime Environment (build 1.8.0_20-b26)

## 使用ライブラリ
RXTX

## 手順

### 1. 必要ファイルのダウンロード

**rxtx-2.1-7-bins-r2.zip**
[ここから](http://rxtx.qbang.org/wiki/index.php/Main_Page)、Download→安定版のrxtx 2.1-7r2をダウンロード

**rxtx-native-windows.jar.zip**
[ここの](http://java2s.com/Code/Jar/r/Downloadrxtxnativewindowsjar.htm)、「rxtx/rxtx-native-windows.jar.zip( 175 k)」からダウンロード

### 2.解凍

rxtx-2.1-7-bins-r2.zipを解凍。使うのは直下にある、
　RXTXcomm.jar

rxtx-native-windows.jar.zipを解凍。中に「rxtx-native-windows.jar」があるので更に解凍。使うのは以下、
　rxtxParallel.dll
　rxtxParallel64.dll
　rxtxSerial.dll
　rxtxSerial64.dll

### 3. ファイルコピー
RXTXcomm.jarを適宜配置。必要に応じてclasspath設定。

使用しているJavaランタイムのbinフォルダにdllをコピー。
32bit環境の場合は、「rxtxParallel.dll, rxtxSerial.dll」を使用。
64bit環境の場合は、「rxtxParallel64.dll, rxtxSerial64.dll」を「rxtxParallel.dll, rxtxSerial.dll」にそれぞれリネームして使用。


### 4. コード

```Java:sample.java
package com.tmeic.pdws.nwtm;

import java.util.Enumeration;
import gnu.io.CommPortIdentifier;

public class Test {

    public static void main(String[] args) {

        Enumeration portList = CommPortIdentifier.getPortIdentifiers();

        CommPortIdentifier port;
        while(portList.hasMoreElements()){
            port = (CommPortIdentifier)portList.nextElement();
            System.out.println(port.getName());
        }
    }
}
```
詳解 NewRelic で性能改善〜その３

[詳解 NewRelic で性能改善〜その２](http://qiita.com/wapa5pow/items/0a4132c62d807286af9d)の続きです。

今回はKey TransactionsのX-Ray Sessionsという機能でみれるThread Profilerの紹介です。

![x_ray_0.png](https://qiita-image-store.s3.amazonaws.com/0/30079/24e6e87f-c621-dcb3-4bfb-a66482d193fd.png "x_ray_0.png")

# ケース1: ある特定のAPIが遅いがソース上でどこが遅いのか確認したい

[その1のケース1](http://qiita.com/wapa5pow/items/e3ef018af270cc2ad014#%E3%82%B1%E3%83%BC%E3%82%B91-%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E5%BF%9C%E7%AD%94%E3%81%8C%E9%81%85%E3%81%84%E3%81%91%E3%81%A9%E3%82%82%E3%81%A3%E3%81%A8%E6%97%A9%E3%81%8F%E3%81%AA%E3%82%89%E3%81%AA%E3%81%84%E3%81%8B)で遅いAPIのざっくりどこで時間をとっているかわかりました。

しかし、もっと細かくソースコード単位でどこの処理で時間がかかっているのか見たい場合もあると思います。
その時に活躍するのが、[Key Transactions](https://docs.newrelic.com/docs/apm/transactions/key-transactions/key-transactions-tracking-important-transactions-or-events)と[X-Ray Sessions](https://docs.newrelic.com/docs/apm/transactions/x-ray-sessions/x-ray-sessions-traces-thread-profiles-key-transactions)です。

**Key Transactions**は、特定のAPIごとに、リクエストを別ページで追跡して詳細なログを見ることができます。
その特定のリクエストのプロファイラを表示してくれるのが、 **X-Ray Sessions**です。


-----------------------------------


それでは設定していきましょう。

今回は、/api/homeのAPIのパスをKey Transactionsとして追加してみようと思います。
以下のように①=>②=>③の順番でクリックします。②で気になるAPIをクリックして追跡します。今回の場合だとhomeのAPIです。

![transactions.png](https://qiita-image-store.s3.amazonaws.com/0/30079/0a5dc2be-00a7-0d05-bff5-709bfce735fd.png "transactions.png")

/api/homeのKey Transactionが出来るので、ウィザードに従いKey transactionsのページへ移動して見てみます。
このように特定のAPIのリクエストのみの情報が見れます。

![key_transactions_1.png](https://qiita-image-store.s3.amazonaws.com/0/30079/e20a3056-e9fe-e3bf-b99a-9f3e5a9edffb.png "key_transactions_1.png")

Key transactionによってAlertなども設定できますが、今回は、X-Rayで処理のボトルネックを調べてみます。

![x_ray_1.png](https://qiita-image-store.s3.amazonaws.com/0/30079/d437dbca-cd48-e1f2-a281-44a9ed6f7e17.png "x_ray_1.png")

![x_ray_2.png](https://qiita-image-store.s3.amazonaws.com/0/30079/9e0d304c-9da4-f3b2-f1d8-8454902a852f.png "x_ray_2.png")

これでX-Rayが設定できました。sampling_homeという名前で、最大1時間にわたって、50リクエスト追跡します。
アクセスがあるサーバならしばらくまつか、APIテストなどを該当のAPIにリクエストして50リクエストたまるのを待ちます。

たまったらsampling_homeを開いて、X-Rayをクリックし、Thread Profileを開いてみます。
実行された順番ごとにかかった時間のパーセンテージがのっているので詳しく、ボトルネックを見ることができます。（結構モザイクばっかりで見難くてすいません）
ただし注意しなければいけないのは、IO待ちやコンテキストスィッチなどでCPUが切り替わったときに待っている待ち時間もここに反映されているので参考程度にという形ではあります。

![x_ray_3.png](https://qiita-image-store.s3.amazonaws.com/0/30079/7c0ad59f-400c-7ac9-b561-ba4a915d16c3.png "x_ray_3.png")


# おまけ: たまたま遅いリクエストの原因を追求する

Key Transactionsにはもう１つ便利な機能があって、トラックしたリクエストの１つ１つの詳細を応答時間に応じて見ることができます。
これを使えば、多くのリクエストは早いけれども、時々遅いものがあるなどの場合を発見しやすく、その特定のリクエストだけをフォーカスして、どこの処理が遅くなっているか見ることができます。

さらに実行された **SQL** も細かく見れるので障害対応や遅いクエリの対応にかなり役立ちます。

![x_ray_4.png](https://qiita-image-store.s3.amazonaws.com/0/30079/46c86aac-1952-1271-f4ad-2633ff0b0e62.png "x_ray_4.png")

# 結び

これにて、その１〜３まで続いた**詳解 NewRelic で性能改善**は終わります。
New Relicは簡単に様々なメトリックスが見れ、空いた時間を本当に必要なサービス開発にさけるすばらしいツールだと思っております。
Unity uGUIs -ウグイス- コンポーネント装飾編

# Unity uGUIs -ウグイス- 1人でがんばりますカレンダー Advent Calendar 2015

この記事は[Unity uGUIs -ウグイス- 1人でがんばりますカレンダー Advent Calendar 2015](http://qiita.com/advent-calendar/2015/unity-uguis)の4日目の記事です。

さて、今日でとうとうネタ切れを迎えます・・・。明日からどうしようといった気持ちです。
まあなんとかします・・・・。


# みんなかったるい装飾周り

uGUIを使っていくとどうしても気になってくるのがデザイン周り。
一個一個ベタに設定をしていくこともあり、設定したのをコピペしてみたり・・・。
うーん、どうにも面倒臭さが抜けないですね。特に、中盤になってくると皆さんUIには自分のコンポーネントくっついてたりしませんか？

自分のコンポーネントをべたべたと貼り付けてしまってあーやだ。ってなる部分に関しては、先日のAuto Bindingが解決してくれることを願います（）

今回はデザイン周りについて作った機能を説明していきます。

# 一度にぱぱっと変更！！

な、な、なんと！uGUIsでは見た目を簡単に変更することができるようになります！
細かいプレビューは[2日目](http://qiita.com/Kogarasi/items/36b51f292de41a869370)のサンプルプロジェクトからご確認くださいまし！

イメージとしてはCSSみたいな感じの機能です。
この機能を使うことによってCanvas内からデザイン部分を切り出すことが出来ます。

**Auto Bindingでビジネスロジックを切り出し、コンポーネント装飾でデザイン部分を切り出し、これだけでもかなりシンプルな状態に持って行けるのではないでしょうか？**
いちいちデザインを変更するためにCanvas内をぐりぐりいじくり回さずとも良くなります！

ボタンのデザイン変えたいな〜、そう思ったら存在してるボタンをいちいち選択してデザイン変えてコピペしてという作業から解放されます。
ボタン用の装飾コンポーネントを作ってそいつに全部設定すれば全体に反映されるのです！！！驚き！！！

**ボタンが10個有っても100個有っても、一ついじるだけでOKです！**

そんなコンポーネント装飾でも問題点は沢山あります。
まずUIコンポーネント多いです・・・・
Button/Toggle/InputField/Slider/Scrollbarなどなど。
他にもTransition周りのが現状ではColor Tintのみだったりしているのでこれらも課題にあげています。
これらをしっかり解決して皆さんにお届けできたらなと思います！

今回は文章ベースな記事になってしまいましたが、暖かい目で見守ってくれたら嬉しいです（フラグ）
PostgreSQL(EUC-JP)→MySQL(UTF-8)にデータ移行する5ステップ

PostgreSQL上の文字コードがEUC-JPのデータをMySQLに移行する手順。

## 0.作業用のディレクトリを作る

作業しやすいように作業用のディレクトリをつくって、そこでファイル操作する。

```
mkdir pg2mysql-migration
cd pg2mysql-migration
```

## 1. 作業用PostgreSQL環境を作る

稼働中のサーバから持ってきたダンプを一旦取り込む用のPostgreSQL環境を作る。稼働中のDBから直接ダンプ出来る場合は、ここは飛ばし2へ進む。

Homebrewでインストール

```
brew install postgresql
```

適当な場所にDB用ディレクトリを作る

```
mkdir postgresql
```

DBを初期化する

```
initdb `pwd`/postgresql -E utf8
```

DBを起動する

```
postgres -D `pwd`/postgresql
```

データベースが起動しているか確かめる

```
psql -l
```

ダンプデータ取り込む用のDBを作る

```
createdb $db
```

DBが作られたか確認する

```
psql -l
```

ダンプデータをインポートする

```
pg_restore -d $db dump.sql
```

## 2.PostgreSQLから構造をダンプする

```bash
pg_dump --schema-only \
        --no-owner \
        --no-privileges \
        --disable-dollar-quoting $db > pg-schema.eucjp.sql
```

## 3.PostgreSQLからデータをダンプする

```bash
pg_dump --data-only \
        --no-owner \
        --no-privileges \
        --disable-dollar-quoting \
        --column-inserts $db > pg-data.eucjp.sql
```

`--column-inserts`をつけないと、MySQLにない`COPY`構文になり移行に不便なのでつけておく。

## 4.ダンプデータの文字コードをUTF-8に変換する

nkfコマンドを使って変換する。MacならHomebrewで入れておく。

```
brew install nkf
```

nkfが文字コードをどう認識するか確認する。

```console
$ nkf -g pg-schema.eucjp.sql
ASCII
```

```console
$ nkf -g pg-data.eucjp.sql
EUCJP-MS
```

nkfで文字コードをUTF-8へ変換する。

```
nkf -wx pg-data.eucjp.sql > pg-data.utf8.sql
```

なお、半角カナを維持する必要がないシステムでは`-x`オプションは不要。

## 5.MySQL互換の形式にSQLを書き換える

### スキーマファイルの書き換え

PostgreSQLのスキーマデータをコピーしてMySQL用のファイルを作る。

```
cp pg-schema.eucjp.sql mysql-schema.utf8.sql
```

書き換えてはMySQLにインポートしてみることを繰り返すので、テスト用のデータベースをMySQL上に作っておく。

```sql
CREATE DATABASE pg_migration_test DEFAULT CHARACTER SET utf8;
```

MySQLにインポートを試す。ファイルを修正する。インポートがうまくいくまでこれを繰り返す。

```console
$ mysql -uroot pg_migration_test < mysql-schema.utf8.sql
ERROR 1193 (HY000) at line 5: Unknown system variable 'statement_timeout'

...修正する...

$ mysql -uroot -e "DROP DATABASE IF EXISTS pg_migration_test; CREATE DATABASE pg_migration_test DEFAULT CHARACTER SET utf8;"
$ mysql -uroot pg_migration_test < mysql-schema.utf8.sql
ERROR 1064 (42000) at line 5: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog' at line 1

...修正する...

$ mysql -uroot -e "DROP DATABASE IF EXISTS pg_migration_test; CREATE DATABASE pg_migration_test DEFAULT CHARACTER SET utf8;"
$ mysql -uroot pg_migration_test < mysql-schema.utf8.sql

...修正する...
```

修正する内容は大体次のものになる:

> - 先頭のSET構文を削除します。
> - ALTER TABLE ONLY … のONLYを削除します。
> - CREATE INDEX … ON table_name USING btreeはUSING btreeをONの前に移動します。
> 
> [PostgreSQLのデータをMySQLに移行する - Qiita](http://qiita.com/artifactsauce/items/f9fdee98a258b349dc06)

他には、`::character varying`や`::bigint`を消し去ったりがある。

### データファイルの書き換え

PostgreSQLのスキーマデータをコピーしてMySQL用のファイルを作る。

```
cp pg-data.utf8.sql mysql-data.utf8.sql
```

viなどでデータファイルを開き、MySQL非互換な部分を修正する。
これも非互換な部分は、先頭のSET構文。
Swift on Linux: Getting Started ASAP

キター!

* [Swift is Open Source - Swift Blog - Apple Developer]

[Swift is Open Source - Swift Blog - Apple Developer]: https://developer.apple.com/swift/blog/?id=34

理念的にはオープンソースであることが最重要ですが、実地ではApple製品以外の環境も正式サポートされたことが大きいでしょう。これでやっと真の意味での汎用言語となったわけです。

というわけで、早速使ってみましょう。

## 下準備

* Ubuntu 14.04 LTS or Ubuntu 15.10 (64bit)

もちろんVMでも構いません。メモリー2GB、仮想ディスク16GBもあれば余裕です。ソースから debugugging symbol までサポートしたフルビルドをしたい場合は、打って変わってメモリー16GBでも足りず、さらに16GBほどswapを足してやっと事なきを得ましたが、バイナリーをダウンロードして使うのであれば最低限で事足ります。

* clangのアップデート(14.04 LTSのみ)

15.10では不要のようです。

````
$ sudo apt-get install clang-3.6
$ sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-3.6 100
$ sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-3.6 100
````

## ダウンロード

あとは

* https://swift.org/download/

からLatest Development Snapshot をダウンロードし、適当なところに解凍すれば準備完了です。ここでは配布物全体を`~/swift`においています。全部で90MB弱。clangなどが含まれていないとはいえ、意外とコンパクトです。

````
$ wget https://swift.org/builds/ubuntu1404/swift-2.2-SNAPSHOT-2015-12-01-b/swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04.tar.gz
$ tar zxvf swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04.tar.gz
$ mv swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04 ~/swift
````

なお、上記のtarball名は記事執筆現在のものなので、適宜読み替えて下さい。


## REPL

それではREPLから行きましょうか。

![](https://pbs.twimg.com/media/CVW_-qMUwAA5gCZ.png)

見ての通り、`~/swift/usr/bin/swift`で行けます。フルパスが面倒なら

````
$ export PATH=$HOME/swift/usr/bin:$PATH
````

とでもしておきましょう。

## import Glibc // 最低限文化的な環境

ご存知の通り、すっぴん、つまり何も`import`されていない状態のSwiftは、libcの関数さえ使えません。iOSなら最初に`import UIKit`、OSXなら`import Cocoa`と最初に書く(新規playgroundには最初から入っている)のはそのためですが、Linuxではどうしたらよいのでしょう?

````
import Glibc
````

だそうです。

以下のようにすると、クロスプラットフォームに出来ました。


````swift
#if     os(OSX)
import Cocoa
#elseif os(iOS)
import UIKit
#elseif os(Linux)
import Glibc
#endif

let pi = -2 * atan2(-1, 0)
print("pi = \(pi)")
````

playgroundやFoundationこそないものの、REPLも最初から用意されてますし、予想以上の完成度でした。`apt-get`一発でインストールできるようになるのも時間の問題でしょう。Ubuntu以外への移植もどんどん進んで欲しいですね。

Enjoy!

Dan the Man with too Many Platforms to Support
MFクラウド請求書APIを使用した雑感

#MFクラウド請求書APIを使用した雑感
結論からいうとAPI使用自体にかなり未完成感を感じました。

##アクセストークンの発行
・[MFクラウド請求書API スタートアップガイド](https://invoice.moneyforward.com/blog/api-startup-guide)と[github](https://github.com/moneyforward/invoice-api-doc)を見れば、わりとスムーズにアクセストークンの発行は可能だと思います。

##取引先API
・取引先検索のAPIはありません。
→一覧を取得し、eachで回してください。

###取引先一覧の取得
・ソートの指定はできません。
・取得フィールドの指定はできません。
##取引先の作成
・gitgubには都道府県が「必須」とありますが、実際は必須ではありません。また、実在しない都道府県の登録も可能です。
・レスポンスにある[id]と[departments][0][id]それぞれ役割があり、
取引先の変更・削除には[id]
請求書の登録には[departments][0][id]
を使用します。
(今現在取引先に[departments]が複数つくことはありません。)
##取引先の更新
・department[0][id]を渡すと[department]以下も更新できますが、指定しないと[partner]のみ更新されます。
(作成と同じく都道府県は任意です。)

##請求書API
検索はかろうじてできますが、かゆいところに手が届きません。
品目とリレーションがあるのかないのか謎です。

###請求書一覧の取得
・ソートの指定はできません。
・取得フィールドの指定はできません。
###請求書一覧の検索
・検索対象は検索文字列(q)と期間絞込対象(range_key)のみです、複数条件の検索はできません。
・検索文字列(q)と期間絞込対象(range_key)はOR検索になっています。
→◯◯クライアントの2015年1月売上計上の請求書を検索したい場合は、
一度「2015年1月売上計上の請求書を検索」しレスポンスの中から「◯◯クライアント」の請求書を自力で探すこととなります。
・請求書内の品目をkeyにして検索することはできません。
(◯◯品目の請求書、単価10000円の商品を持っている請求書等)
・ソートの指定はできません。
・取得フィールドの指定はできません。

###請求書の作成
・**[注意]**請求書APIから品目を追加すると、APIのレスポンスも正しく、請求書にも記載されますが、品目APIから取得・更新ができません。(管理画面からも見えません。)
事前に品目APIから登録を行い、items['n'][code]に品物APIの[code]のみを入力すればその他の情報を補完されます。
**[注意]**[id]でなく[code]です。

###請求書の更新
・**[注意]**[billing]以下は更新できますが、[items]以下は更新できません。
・[items]の追加、削除、別のitemsに置き換えを行いたい場合は、一度請求書を削除し、再度新規作成します。

##品目API
・取引先検索のAPIはありません。
→一覧を取得し、eachで回してください。
・レスポンスの[item_code]とgithubにある部分は、
実際には[code]が帰ってくるので注意してください。

##サポート体制
・フォードバックフォームはありますが、APIの仕様についてはgithubのissueから開発者に直接質問をする方式です。
・記述時現在では7issueありました。
・質問後1〜2日は待たないとレンポンスはないのでご注意ください。
##参考資料
[https://invoice.moneyforward.com/developer](https://invoice.moneyforward.com/developer)
LinuxのSystemログをAWS CLI+RubyでS3にアップロードするスクリプトを書いた


# はじめに

td-agentなんかが流行りの今、systemログをそのまんまバックアップしたいなんてのは誰もが"それほんとに後で使うのかよ？"と言いたくなると思うのですが、まぁ業務命令なのでやってみた次第。

# AWS CLI + Ruby

S3へファイルをアップロードさせるツールは、s3syncやs3cmdなどありますが、
純正のものを使っておいたほうが後々のAPIの変更にも強かろうと思い、AWS CLIをRubyからコールすることにした。
（AWS Ruby SDKもありますが、こちらもバージョンによってAPIの仕様がガラッと変わったこともあったので。あと、AWS CLIのほうが直感的に使える気が個人的にはしてます）


# 使い方など

実行サーバーはScientificLinux6.5。

## AWS CLIのインストール＆設定

こちらを参考に。

[CentOS6.5にaws-cliをインストール](http://rikuga.me/2014/02/14/centos6-5にaws-cliをインストール/)

## 実行

```
git clone git@bitbucket.org:FOURIER_INC/fanatic.git
cd fanatic
bundle install
bundle exec app.rb
```

## コード

特に説明するようなこともないかな。。
Rubyで書いているけど、Kernel#systemでシェルを実行しているだけ。

複数のサーバーで実行することを想定しているので、s3://#{バケット名}/#{ホスト名} 以下にログが保存されるようにしてる。


```app.rb
# 保存するログを格納しているディレクトリへのパス
target_dir_path = [
  "/var/log/httpd",
  "/var/log/mysql",
  "/var/log/messages"
]
target_file_path = [
  "/var/log/lastlog",
  "/var/log/maillog","
  ""/var/log/yum-log",
  "/var/log/secure"
]

# 保存するバケット名
target_bucket = "log-transfer"
# プレフィクス（サーバー名）
target_prefix = `hostname`.strip

# upload directories
target_dir_path.each do |path|
  next unless Dir.exist? path

  # "./test_dir" => "test_dir"
  dirname = path.split("/").last
  [
    "aws s3 sync #{path} s3://#{target_bucket}/#{target_prefix}/#{dirname}",
    "aws s3 ls s3://#{target_bucket}"
  ].each do |command|
    system command
  end
end

# upload files
target_file_path.each do |path|
  next unless File.exist? path

  filename = path.split("/").last
  [
    "aws s3 cp #{path} s3://#{target_bucket}/#{target_prefix}/#{filename}",
    "aws s3 ls s3://#{target_bucket}"
  ].each do |command|
    system command
  end
end
```

## まとめ

こういう実装が良いのかはわからないけど、シェルスクリプトをゴリゴリ書くの嫌だなぁと思う僕のような人にはRubyでサクッと書けるのはいいなぁと。
httpclientで疑似RESTを使用しPUT、DELTE etcを実現

ブラウザやサーバサイドでGet、Postを受付けない設定になっている場合、疑似RESTでputなどの代行ができます。ここではhttp_clientを使用してRESTに対応したデータの送信を記述します。
_methodに対応メソッドを指定してやれば良いので、下記のように記述することで代用できます。

```ruby:
httpclient.post(
  "https://xxxx/api/v3/projects/:id/issues/:issue_id",
  {'_method'=>'put',
  'private_token' => 'token',
  'state_event'=>'closed'
})
```
PHPでsendmailの例

# PHPでsendmailの例
送信時文字化けや、迷惑メール対策の個人的まとめ

```
//UTF-8環境
$mailfrom = mb_encode_mimeheader('送信元表記') . '<送信元アドレス>';

$header = "MIME-Version: 1.0\n"
	  . "Content-Transfer-Encoding: 7bit\n"
	  . "Content-Type: text/plain; charset=ISO-2022-JP\n"
	  . "Message-Id: <" . md5(uniqid(microtime())) . "@送信元ドメイン>\n"
	  . "From: ".$mailfrom."\n";
$message = mb_convert_kana($message, "KVa");
$message = mb_convert_encoding($message, "JIS", "auto");
echo $header;

if (!mail("宛先アドレス", "メールタイトル", $message, $header, "-f エラーの際の連絡アドレス")) {
  exit("error");
}
```
CafeSnapで使用しているライブラリ（Android編）

オールアバウトではCafeSnapというiPhone/Androidアプリを開発しています。

オールアバウト Advent Calendar 2015の4日目は、
Android版CafeSnapで使用しているライブラリを紹介したいと思います。

写真投稿アプリを作る場合、どのようなライブラリが使えるのかの参考になれば幸いです。

## CafeSnapってどんなアプリ？
こだわりのコーヒー、オシャレなインテリア、独自のコンセプト……
CafeSnap（カフェスナップ）は“個性の光るカフェ”が楽しく探せる、カフェアプリです。

こだわりの条件でカフェを検索したり、カフェの写真を投稿したりと、
カフェの写真をベースにしたコミュニケーションに重点を置いたアプリです。

http://cafesnap.me/

## 使用しているライブラリ
### [Android Design Support Library](http://developer.android.com/intl/ja/tools/support-library/index.html)
Google I/O 2015で発表されたMaterial Designを実現するためのサポートライブラリ。
以前は、サード・パーティのライブラリを使ってMaterial Designを実装していましたが、
最近ほとんどのUIコンポーネントをこちらに置き換えました。
ボタン、ナビゲーションなど多くの箇所で使っています。

### [Volley](https://android.googlesource.com/platform/frameworks/volley/)
通信処理を実装するためのライブラリ。
画像以外のシンプルな通信処理はすべてVolleyを使用して実装しています。

### [Picasso](http://square.github.io/picasso/)
画像を色々処理できるライブラリ。
Webサーバー上の画像を表示したり、画像を丸くトリミングしたりしています。

### [Twitter4J](http://twitter4j.org/ja/index.html)
JavaでTwitterAPIを簡単に使うためのライブラリ。
Twitterログイン、写真投稿時のTwitter投稿に使用しています。

### [Facebook Android SDK](https://developers.facebook.com/docs/android/getting-started)
FacebookAPIを簡単に使うためのライブラリ。
Facebookログイン、写真投稿時のFacebook投稿に使用しています。

### [Calroid](https://github.com/roomorama/Caldroid)
シンプルでカスタマイズしやすいカレンダーViewライブラリ。

### [Crashlytics](https://fabric.io/)
クラッシュレポートを送信するためのライブラリ。
Twitter社に買収されてからは、Fabricに統合されています。
導入がすごい楽で、Web上のコンソールがかっこいい。

### [StickyListHeaders](https://github.com/emilsjolander/StickyListHeaders)
セクションつきのListViewライブラリ。
Androidでは、iPhoneみたいに簡単にカテゴリ分け用のセクションがつけれないので、
それを補完するために使っています。

### [ShowcaseView](https://github.com/amlcurran/ShowcaseView)
アプリの使い方などのコーチマークを簡単に実装できるライブラリ。
初回起動時に、少し分かりにくい画面の使い方の説明を出すために使っています。

## さいごに
以上、CafeSnapで使用しているライブラリでした！
CafeSnapは素敵なカフェに出会えるアプリです。
カフェ好きな人はもちろん、そうでない人もぜひダウンロードして一度使ってみてもらえるとうれしいです。

http://cafesnap.me/
【ITMS-90535】Xcode7でUpload to App StoreをしたらGoogleMapsSDK関係のエラーが出たときの対処法

Xcode7でアプリを審査に提出するためSubmitした際にITMS-90535が出たときの対処法です。
ネットではいろんな解決法が混在しており、いろいろ試したが半日以上はまってしまったため、自分が解決できた方法をまとめます。

#背景
GoogleMapsSDKforiOSを利用したアプリを開発中、Xcodeを6から7に上げ、iOS9でアーカイブしたipaを「Upload to App Store」すると、以下のようなエラーが出るようになった。
> ERROR ITMS-90535: "Unexpected CFBundleExecutable Key. The bundle at 'Payload/PgapIos.app/GoogleMaps.bundle' does not contain a bundle executable. If this bundle intentionally does not contain an executable, consider removing the CFBundleExecutable key from its Info.plist and using a CFBundlePackageType of BNDL. If this bundle is part of a third-party framework, consider contacting the developer of the framework for an update to address this issue."

要約すると、
>想定外のCFBundleExecutableキーが含まれているため、GoogleMapsSDKforiOSのinfo.plistから「CFBundleExecutableキー」を取り除き、「CFBundlePackageType」を「BNDL」にしてや

とのことらしい。Xcode6では出なかったので、Xcode7(iOS9SDK)でアーカイブしたipaファイルでのみ発生するっぽい。
ちなみにGoogleMapsSDKforiOSのinfo.plistは、GoogleMaps.bandleの中にあります。

#試したこと
**「info.plistの中から「CFBandleExcutable」という文字を消して、「CFBundlePackageType」を「BNDL」に変更したら解決した！」→　...が、ダメ...！**

いくつかのサイトで、上記のような方法で解決した、という声が上がっていたため、試してみました。Xcodeのエラー文でも同じようなことをいってますし。
ちなみにこれ、試してみると、確かに「ITMS-90535」のエラーは消えました！！...が、これをしてしまうと、なぜか私の場合、iTunesConnectのビルドが「処理中」のまま１日以上経っても終わらない、という現象が起きました。
iTunesConnectのビルドの「処理中」がなかなか終わらない、という話はちょくちょく聞きますが、Xcode6でsubmitするとすぐに反映されるため、上記の対応が影響な様子。実際にこれに関してさらに追加でネットで調べてみると、一部の記事で同じような現象になっている人もいるようでした。



**「cocoaPodsで最新のGoogleMapsSDKforiOS入れたらいけたやで〜」→　...が、ダメ...！**
上記のような書き込みも見かけました。使っているGoogleMapsSDKも古くなってきてたのが原因かな？と思ったので、試してみました。が、この場合は、「ITMS-90535」が結局出てしまいました。

#解決した方法
**「GoogleMapsSDKforiOSのinfo.plistをXcodeで開き、以下の変更を行う**

- 「Executable file」を右クリックで「Cut」する
- 「Bundle OS Type code」の「Value」が「BNDL」になっていることを確認する

上記の変更を加えると、「ITMS-90535」も出ず、かつiTunesConnectでも「処理中」がすぐ終わり、無事審査に出せるようになりました。
”あいうえお”(文字列) == 0が真 の謎


かなり前、少し悩んだことがあった。
以下の処理をみていただきたい。

<?php
if ("あああ" == 0) {
&nbsp;&nbsp;&nbsp;&nbsp;echo "真です。";
} else {
&nbsp;&nbsp;&nbsp;&nbsp;echo "偽です。";
}
?>

これの実行結果は
「真です。」
となる。

納得がいかないが、PHPは文字列と数値を比較演算子で解釈する場合、
文字列を数値に変換して比較するというルールがある。
文字列に含まれる数値との比較をしているらしい。

上記のケースは数値を含まないので0である。
検証してみたが数値が含まれる場合、最も前に現れた数値を採用するみたいだ。
例えば
"ああ67ああ1いい27"
という文字列の場合、67として解釈・比較される。

ということで文字列と数値を比較する可能性がある場合、
下記のように三重等号(===)で比較すると確実ですね。

<?php
$letter = "あいうえお";
if ($letter === 0) {
&nbsp;&nbsp;&nbsp;&nbsp;echo "真です。";
} else {
&nbsp;&nbsp;&nbsp;&nbsp;echo "偽です。";
}
?>

この実行結果は型が異なっている為、
「偽です。」
となる。
CSVとかTSVとか作るときにかっこいいやりかた

```php
$csv = "";

foreach ($rs as $r) {
  foreach ($r as $val) {
    $csv .= $val . ",";
  }
  $csv .= "\n";
}
```
っていうのよく見るけど

```php
$rows = [];

foreach ($rs as $r) {
  $row = [];
  foreach ($r as $key => $val) {
    $row[] = $val;
  }
  $rows[] = join(',', $r);
}

$csv = join("\n", $rows);
```

ってすれば最後判定しなくてええんやで


array_values でええやんけ　って思うけど　まあサンプルだから
実際はもうちょっといろいろ面倒なことやってるでしょ


要は、逐次結合じゃなくて配列詰んでループ後にjoinしよ、というお話
Macにhomebrewでansibleをインストールした際の設定ファイル(ansible.cfg)に関して


以前、以下の記事を書いた。
[Macにhomebrewでansibleをインストールした際のインベントリファイル(inventory file)に関して](http://qiita.com/banrui/items/8deb5b4460e6b2791251)

次に、設定ファイル(ansible.cfg)を触ってみたくなる。
ただ、こちらもどこに置かれるのか分からない。

###対応方法

おそらく、'inventory file'のデフォルトの場所と同じことが想像できるので、書いてみる。

```bash
$ vi /usr/local/etc/ansible/ansible.cfg

hostfile=~/original_hosts
```

対象となるIPアドレスを記述

```
$ echo 192.168.30.11 > ~/original_hosts
```

`ansible`実行


```
$ ansible 192.168.30.11 -m ping                                
Error reading config file: 
File contains no section headers.
file: /usr/local/etc/ansible/ansible.cfg, line: 1
'hostfile=~/original_hosts\n'
```

何かがおかしいらしい。

###解決方法

ansible.cfgの書き方など何も調べずに書くのはやはり良くない。
以下を追加。

```
$ vi /usr/local/etc/ansible/ansible.cfg
[default]                             
hostfile=~/original_hosts
```

`ansible`を再実行

```
$ ansible 192.168.30.11 -m ping                                
192.168.111.111 | success >> {
    "changed": false,
    "ping": "pong"
}
```


無事に解決。
PHPでカリー化、部分適用、関数合成、そしてMaybeモナドなど

最初はMaybeモナドだけ作ろうと思っていたところ、fmapも欲しいし、そうするとFunctorかなー、fmapがあるなら <$> <*> もあった方がいいかなー、それだとFunctor => Applicative => Monad => Maybe にした方がいいなー、とか考えてこうなった。



```php
class Curry
{
    protected $value;

    public function __construct(callable $f)
    {
        $this->value = self::curry($f);
    }

    public static function curry(callable $f)
    {
        $ref = new \ReflectionFunction($f);
        $count = $ref->getNumberOfParameters();

        if ($count === 0)
            throw new \InvalidArgumentException('Cannot curry none arguments function');

        $args = array_fill(0, $count, null);
        $prev = function($a) use ($f, &$args, $count){
            $args[$count - 1] = $a;
            return call_user_func_array($f, $args);
        };
        for ($i = $count - 2; $i >= 0; $i--){
            $prev = new static(function($a) use ($prev, &$args, $i){
                $args[$i] = $a;
                return $prev;
            });
        }
        return $prev;
    }

    public function __invoke($a)
    {
        if ($this->value instanceof Curry){
            $count = 1;
        }else if (is_callable($this->value)){
            $ref = new \ReflectionFunction($this->value);
            $count = $ref->getNumberOfParameters();
        }

        $args = func_get_args();
        $params = [];
        for ($i = 0; $i < $count; $i ++){
            $params[] = array_shift($args);
        }
        $ret = call_user_func_array($this->value, $params);

        if ($args){
            return call_user_func_array($ret, $args);
        }else{
            if (is_callable($ret) && !($ret instanceof Curry))
                return new static($ret);
            else
                return $ret;
        }
    }

    /*
     * alias of __invoke
     */
    public function apply()
    {
        return call_user_func_array($this, func_get_args());
    }

    public function compose(callable $f)
    {
        return new static(function ($a) use ($f){
            return $f(call_user_func_array($this, func_get_args()));
        });
    }
}
```


一応検索して
http://qiita.com/kumazo@github/items/3c337c6d51f023ae59ac
http://qiita.com/yuya_takeyama/items/e14758907ca905386114
この辺のカリー化のコードを見たんだけども、どうも関数実行時にうまいこと帳尻を合わせている感がある。これだとせっかくカリー化しても合成するときにうまくいかないんじゃないかな？と思って引数ひとつの関数に愚直に分解した。


そしてモナド。
OOPとしてMaybeの実装は色々あるけれど、たぶん重要なのは引数の順番と部分適用。

```php
$result1 = $maybeValue1->maybe($default, $callback);
$result2 = $maybeValue2->maybe($default, $callback);
$result3 = $maybeValue3->maybe($default, $customCallback);
```

これでもいいんだけど

```php
$withDefault = maybe($default);
$withCallback = $withDefault($callback);

$result1 = $withCallback($maybeValue1);
$result2 = $withCallback($maybeValue2);
$result3 = $withDefault($customCallback, $maybeValue3);
```

が本来の使い方じゃないだろうか。



そんなわけで部分適用 や fmap を実装したモナドを書いた。
https://github.com/nishimura/laiz-monad


部分適用する場合、型推論がないので型をコメントに書くのは必須かもしれない。
CircleCIにJava JCE(Java Cryptography Extension)を適用する


JavaのCipherでAES256を利用するには、JCEが必要です。
http://qiita.com/mizuki_takahashi/items/cc26a7fd51aa04396e92

CircleCI環境でも同様に `machine.post` でJCEをダウンロードしてポリシーを書き換えることで動作するようになります。
※postでないと `JAVA_HOME` がexportされてないので注意

```
machine:
  java:
    version: oraclejdk8
  post:
    - curl -L --cookie 'oraclelicense=accept-securebackup-cookie;'  http://download.oracle.com/otn-pub/java/jce/8/jce_policy-8.zip -o /tmp/policy.zip
    - unzip -o /tmp/policy.zip -d /tmp
    - sudo mv -f /tmp/UnlimitedJCEPolicyJDK8/US_export_policy.jar $JAVA_HOME/jre/lib/security/US_export_policy.jar
    - sudo mv -f /tmp/UnlimitedJCEPolicyJDK8/local_policy.jar $JAVA_HOME/jre/lib/security/local_policy.jar
```
Macにhomebrewでansibleをインストールした際のインベントリファイル(inventory file)に関して


Macでansibleを実行しようとした際に、`inventory file`がどこにあるのか気にあったので確認。

| ソフトウェア |バージョン|
|:----------|:------------|
| Vagrant|1.7.2|
| Ansible|1.9.4|


####Mac上にansibleを導入する場合は以下を参考
[Mac から Vagrant1.7 へ ansibleを実行した際のメモ（SSH Error解決含む）]()

###AnsibleをMacから実行

CentOSなどで、`Ansible`をインストールした際は、`/etc/ansible/hosts`の場所に`inventory host file`が置かれているというのは、よく目にする。

では、Macどうか。

```bash
$ ansible 192.168.30.11 -m ping                                                                               
ERROR: Unable to find an inventory file, specify one with -i ?
```

もちろん、`inventory file`を指定しないとエラーがでる。
しかし、今回はMacに`brew`でインストールしたため、`inventory file`のデフォルトの場所が分からなかったで、対応してみた。

####解決方法

```bash
$ mkdir /usr/local/etc/ansible
$ vi /usr/local/etc/ansible/hosts
```

対象となるIPアドレスを記述

```bash:/usr/local/etc/ansible/hosts
192.168.30.11
```

再度、実行

```bash
$ ansible 192.168.30.11 -m ping                                
192.168.111.111 | success >> {
    "changed": false,
    "ping": "pong"
}
```

無事に解決。

### デフォルトの`inventory file`の場所に関して

```bash
ansible --help
```

helpを実行すると、`inventory file`を指定するオプション部分に以下のように書かれている。

```bash
-i INVENTORY, --inventory-file=INVENTORY
                      specify inventory host file
                      (default=/usr/local/etc/ansible/hosts)
```

結構、悩んだのだが、ヘルプを最初にちゃんと読めばよかった。
RPGツクールMVのメモリ事情

#Pixi.jsの二つのモード
Pixi.jsはWebGL、Canvasの二つのモードで動きます。
そのどちらが使われるか、によって、メモリ事情が異なってきます。
Canvasモードの場合、メモリマネジメントの結構な部分をブラウザが行ってくれますが、WebGLモードの場合は、ほとんどこちら（JavaScript）まかせです。
どちらのモードを使うかは、環境によって決定されていて、

* モバイルの場合ー＞強制的にCanvasモード
* それ以外の場合ー＞可能ならばWebGLモード

となっています。
現状のRPGツクールMVのエンジンには、メモリ管理にまつわる問題を二つ抱えています。

#メモリブロート（メモリをため込む）問題
* Canvasモード：影響度はブラウザ依存
* WebGLモード：深刻

ImageManagerには、一度読み込んだ画像は使いまわす、キャッシュの仕組みがあるのですが、それを空にするメソッドがどこからも呼ばれていない問題です。

##Canvasモード時の挙動
Chrome系ブラウザの場合、Canvasオブジェクトが作られても、まるまる画素を保持しいているわけではありません。ある程度の複雑さになるまで、どこに何を描画したのかという、ベクタ的に保存しています。
Canvasの内部表現がSVGになっている、と想像していただけるとわかりやすいと思います。よってChrome系ブラウザでは問題になりづらいです。

一方Edgeは、Canvasが作成されるとまるまる画素を確保します。作りたびにです。この場合は、メモリブロートは深刻な問題たりえます。

このように、 **内部実装がブラウザによって異なるため、動作が読めません** 。

##WebGLモード時の挙動
WebGLの場合、モバイル時には深刻な問題になりますが、モバイルではCanvasモードで強制起動するため、モバイル時でかつChrome系ブラウザを使ってる限り、問題は起こりにくいです。

PCで動かす際は、PCのメモリ、GPU性能に依存します。
PCの場合、GPUメモリに入りきらなかったテクスチャはメインメモリに退避します。また、メインメモリ自体も、足りなくなったらスワップ等駆使して可能な限り動作しようとします。よって、Pictureがうん百枚、といった環境ではない限り、問題になりにくいです。

また、GCが管理するメモリの中に、GPUが管理するメモリは入っていません。OpenGLの仕様上、利用可能メモリをとる手段がないので仕方ないのですが、GC管理メモリは余裕があるのに、GPU管理メモリがいっぱいいっぱい、という可能性もあるわけです。
本来ならばGPU側メモリは手動で開放すべきなのですが、それをするには、結構手をいれないと難しいのが現状です。

#メモリリーク問題
* Canvasモード：不明
* WebGLモード：致命的

有志の調査で明らかになったのですが、遠景（Parallax）を使用して、ウインドウ開閉やマップ移動を繰り返した場合、結構な確率でメモリ不足に陥ります。
これはTileSpriteの実装の問題です。ウインドウ開閉を行うと、内部で再生成が発生し、PIXI.Texture.fromCanvasというAPIが呼ばれます。

これが曲者になっていまして、このAPI、与えられたCanvasをキーにしてキャッシュを行います。そのうえ、キーとなるCanvasは、呼び出しもとによって、テクスチャが再生成されるごとに毎回作り直しているのです。

つまり、ウインドウ開閉を行うごとに、使われないゴミがたまっていく、メモリリークが発生します。

#メモリとの闘い
以上のように、GCがあっても、メモリに関する問題はけっこう起きます。
本当に、気を付けたいものです！！
Validation で "The archive did not contain <.. bcsymbolmap> as expected." が出た時の対処法


Xcode 7.1.1 で validation, submit 時に遭遇して調べた時のメモ。

# 原因
"bit code を含む" にチェックが入っていたため発生していました。

![Screenshot 2015-12-04 13.39.27.png](https://qiita-image-store.s3.amazonaws.com/0/27210/ed66d96c-413a-03e1-1f4a-0f572aeb0956.png "Screenshot 2015-12-04 13.39.27.png")

# 解決法

"Include bitcode" のチェックを外します。

参考：
https://forums.developer.apple.com/thread/14729
PHP用 Google Feed API が完全に廃止されてしまった時の対応方法

# はじめに
2015年12月02日にGoogle Feed APIが突如として利用できなくなり、
RSSフィードが表示されないという事態に陥った方が多いかと思います。(12/4現在は復活した模様)
筆者もその一人で急ぎ代替手段を探しましたが、調査当時は対応方法が見つからなかったり
古いバージョン(1.0系)RSSでの取得方法だったりと、欲しい代替手段を中々見つけられませんでした。

今回調査して得られた様々な対応方法を組み合わせ Google Feed API を使わない
RSS表示方法をどうにか確立出来たので、代替手段を探してる方向けに共有いたします。
JQueryを使った方法もありますが、prototype.jsを使っているページがあると競合により表示されなくなるので使用しませんでした。

実装前提は以下のとおりです。
> 言語: PHP5.4
> RSSバージョン: 2.0
> json,javascript も使用

# 処理の流れ
1. RSSフィードを取得してjsonファイルで保存 (rss.php)
2. フィードのjsonファイルを読み込みid=feedが指定されたhtmlタグを整形 (loadrss.js)
3. ページアクセス時にjsを読み込ませる (hoge.html)


```rss.php
<?php
        //時差表記
        date_default_timezone_set('Asia/Tokyo');
        // 言語を日本語に設定
        mb_language("ja");
        // 文字エンコードを設定
        mb_internal_encoding("UTF-8");
        // RSSのソース元
        $feed_url = "http://~~~~~~~~~~~"; <=※ここに、今まで使っていたRSS取得のURLを格納する
        $rss = simplexml_load_file($feed_url);
        //RSSフィードの取得指定数
        $rss_num = 4;
        // RSSフィードの分だけループ
        $i=0;
        foreach ($rss->channel->item as $item) {
                //詳細・リンク・日付を、変数に格納する
                $json[$i]['desc'] = (string)$item->title;
                $json[$i]['link'] = (string)$item->link;
                $json[$i]['date'] = (string)$item->pubDate;
                //指定数になったら、取得を止める
                $i++;
                if($rss_num <= $i) break;
        }

        $fp = fopen('feed.json', 'w');
        fwrite($fp, json_encode($json));
        fclose($fp);
?>

```

```loadrss.js
var data = new XMLHttpRequest();
data.open("GET", "feed.json", true);

data.onload = function() {
        var json = JSON.parse(this.responseText);
        //出力先要素(ID指定)を変数に格納
        var container = document.getElementById("feed");
        //フィードの分だけループ
        for (var i = 0; i < json.length; i++) {
                var entry = json[i];
                var div = document.createElement("li");
                var a = document.createElement("a");a.href = entry.link;
                a.target = "_blank" ;
                a.appendChild(document.createTextNode(entry.desc));
                div.appendChild(a);
                container.appendChild(div);
        }
}
data.send(null);
```
```hoge.html
<html lang="ja">
<head>
<script type="text/javascript" src="loadrss.js">
</script>
</head>
<body>
<ul id="feed"></ul>
</body>
</html>
```
cronスケジュールでrss.phpを毎時実行に設定すれば、1時間ごとに自動的に最新情報が読まれます。

```
/etc/crontab
0       *       *       *       *       hoge    php /path/to/rss.php
```
実行タイミングはお好みでどうぞ。
生のNode.jsからjadeを使う

ExpressなどのWebフレームワークを使わずに、生のNode.jsからjadeをテンプレートエンジンとして使うのはあまり見ないので（日本語では）自分用の覚え書き。

まずは、jadeファイル。

```jade:hello.jade
doctype html
html(lang='ja')
  body
    h1= title
    p!= content
    p access : #{n}
```

- タグ名= 以降をnode.jsとして動作させる。（変数の中身はタグごとそのまま表示される。タグはエスケープされてて安全。）
- タグ名!= 以降をnode.jsとして動作させる。（変数の中身のタグはちゃんと機能する。なるべく使わないほうがいい。XSS対策の知識が必要。）
- #{変数名} 普通の文字列の中に#{}で変数を扱える（タグもそのまま表示される。）
- !{変数名} ソースには書いてないけどタグがエスケープされない方。（XSS対策が必要な方。）

これらの変数に対してNode.jsから値を渡したい。↓

```coffeescript:server.coffee
http = require 'http'
settings = require './settings'
server = http.createServer()

jade = require 'jade'
pages = {}
pages.hello = jade.compileFile __dirname + '/hello.jade', 
  pretty: true

n = 0
server.on 'request', (req, res) ->
  n++
  res.writeHead 200, 'Content-Type': 'text/html'
  res.write pages.hello
    title: "Hello World!"
    content: jade.render('string of jade')
    n: n
  res.end()

server.listen(settings.port, settings.host)
console.log 'server listening ...'
```

```coffeescript:settings.coffee
exports.port = 1337
exports.host = '192.168.1.適当'
```
jadeに関するところは２箇所。まずはココ↓。

```coffeescript
jade = require 'jade'
pages = {}
pages.hello = jade.compileFile __dirname + '/hello.jade', 
  pretty: true
```

まずは`'jade'`を`require`する。

`jade.compileFile()`関数はjadeファイルをHTMLにコンパイルする。その際、コンパイル元の変数の部分にはまだ何も値が反映されていない状態。後でそれらを代入できるように、生のHTML文字列ではなく、関数として返す。
使い方は以下。

`jade.compileFile(<FILENAME>[, OPTIONS])`

オプションに`pretty: true`を指定すると、生成されたHTMLがちゃんと改行やインデントされて見やすくなる。
デフォルトでは全てを１行に纏めて記述されたHTMLの文字列が生成されるので注意。
jadeの記述ミスがあって、HTMLを読まなきゃいけない時とかメンドイから。
あとはこのHTML文を返す関数を`pages.hello`で保持する。

次にココ↓。

```coffeescript
  res.write pages.hello
    title: "Hello World!"
    content: jade.render('string of jade')
    n: n
```

`res.wirte`で`page.hello()`関数の結果（さっきの翻訳結果のHTMLが返る）をクライアントに送信する。
で`page.hello()`関数に引数としてローカルオプションを渡してる。
ここでjadeで変数を書いていた部分に値を代入できる。
オブジェクトの各プロパティがそれぞれjadeに書いていた変数を指す。
`content:`の`jade.render('string of jade')`関数はその場でjadeを書くためのAPI。
この例だと、`<string>of jade</string>`が生成される。
使い方は以下。

`jade.render(STRING[, LOCALS])`

Expressの`res.render()`と似ているが、ファイルを渡すのではなく、その場でjadeを書く。
`jade.compile()`と違ってHTML文を返す関数を返すのではなく、HTML文を文字列で返す。
`jade.compile()`でもらった関数は後で何度でもローカル変数の値を変更してそれを反映させて表示させることができるが、`jade.render()`は文字列を返すので後でローカル変数の値を変更してももはや意味はない。
毎度毎度コンパイルしてレンダリングさせればローカル変数を与えられるが、コンパイル1回でHTMLを保持してあとはレンダリングするだけの`jade.compile()`のほうパフォーマンスがよさそう？
はじめてのrailsをHerokuで動かすまでのまとめ


はじめてのruby on railsだったので自分のためにまとめてみました。

とりあえずローカルで動くものを作る
（ドットインストールは未読、あとで読む）
・http://www.atmarkit.co.jp/ait/articles/1402/27/news042.html
・http://www.atmarkit.co.jp/ait/articles/1402/28/news047.html
・http://www.atmarkit.co.jp/ait/articles/1403/28/news035.html
・http://dotinstall.com/lessons/basic_rails_v2

あたらしいgemをインストールして使ってみる
（flickrが面白そうだったので選んでみた）
・http://easyramble.com/flickr-api-with-ruby-flickraw.html

ローカルのgitリポジトリでソース管理
・http://www.backlog.jp/git-guide/intro/intro1_1.html

ここまで約２時間。速い速い。

Herokuを使う準備
・http://kuranuki.sonicgarden.jp/2009/05/rubypaasherokurails.html
・http://morizyun.github.io/blog/beginner-rails-heroku-tutorial/
・http://gam0022.net/blog/2013/09/17/run-rails4-on-heroku/
　（Rails4のアプリをHerokuで動かす）
・http://qiita.com/satton_maroyaka/items/2631db410764784e305c
　（herokuのpostgreSQLのDBにローカル環境からSQLを実行する。）

これも簡単だった！合計３時間。まじ神。すげー！

※見返してコケたことがあったので４点追記。

１）Gemfileとconfig/database.ymlを書き換える

```
Gemfile の　gem 'sqlite3' を下記に


group :development, :test do
  gem 'sqlite3'
end
group :production do
  gem 'pg'
  gem 'rails_12factor'
end


config/database.yml　の production の設定を下記に

production:
  adapter: postgresql
  encoding: unicode
  database:
  pool: 5
  username:
  password:
```

２）postgresqlが入っていなければ入れる

```
gem install pg
```

ここらへんで困ったときはここで解決しました（ありがとう）
http://qiita.com/youcune/items/

あと、一生懸命英語読むことw



３）.gitignoreも変える

```
# Ignore the default SQLite database.
/db/*.sqlite3
/db/*.sqlite3-journal
```

４）上記をやったら、あとはコミットを忘れないようにするw







できたもの。
https://shizuoka-artsaward.herokuapp.com/top/index/
↑しずおかアプリコンテスト用に作りましたw
https://secure-wildwood-3289.herokuapp.com/index/

よく使うコマンド
参照：http://railsdoc.com/rails　（古いのもあるから注意する）

```
起動
$ rails server

gemファイル編集後のbundle
$ bundle install
$ bundle install --widthout production

モデルを作る
$ bundle exec rails generate model user name:string department:string
$ bundle exec rake db:migrate

コンソールに入る
$ bundle exec rails console

DBコンソールに入る
$ rails dbconsole

config/routes.rb編集後
$ rake routes

gitにコミットする
$ git add .
$ git commit -m "modify hogehoge"

herokuにソースをpushする
$ git push heroku master

herokuにDBの変更を反映する
$ heroku run bundle exec rake db:migrate

herokuページをひらく
$ heroku open

herokuのログを確認する
$ heroku logs -t

herokuのデータベース操作
$ heroku pg:psql
＊Type \q and then press ENTER to quit psql.
```
Arduinoで3GでIoTする - フィクション 

最近は[SORACOM](https://soracom.jp/)さんのようにIoTに特化した形でのMVNOさんなんかも出てきていますが、クラウドとの通信手段がWiFiだったり、センサー情報の集約先が[Raspberry Pi](https://www.raspberrypi.org/)だったりという例が多く、Arduino + 3Gという組み合わせは(本当は王道であるべきだと私は思っているのですが)悲しいかな、ほとんど目にしません。
そこで、こんな組み合わせでIoTできたらいいな、ということで以下は私の妄想ベースのフィクションです。フィクションですので技適うんぬんの話はナシということでよろしくお願いします。

## 環境
今回は3G通信シールドとして、Vstoneロボットショップさんで取り扱いのある[elecfreaks社](http://www.elecfreaks.com/wiki/index.php?title=3G_shield)の[3Gシールド](https://www.vstone.co.jp/robotshop/index.php?main_page=product_info&products_id=4370)を使ってみます。vstoneさんのホームページにも記載がある通り、「技術基準適合を受けておりません」ことに留意が必要です。価格も手ごろ、ATコマンドでRESTfulなウェブサービスにアクセスでき(httpでも、httpsでも)、SMSの送受信もできる優れものです。

## うまく行かない例
さて、前述の3Gシールドを購入してもマニュアルがある訳でなし、elecfreaks社のホームページを見ても、シールドのスペックや回路図は丁寧に説明があるものの、Arduinoに乗っけた時にどうする、という話は皆無なので、ハマる人多数かと思われます。
で、Arduino Unoの上に乗っけます。で、やらないといけないのは添付されたジャンパピンを正しく刺すことです。
![450px-3G_Shield_Dimensions.jpg](https://qiita-image-store.s3.amazonaws.com/0/19248/233ab5d3-4001-0486-f30f-45286b0c2381.jpeg)
左上にD0からD7、TX, RX (書かれていませんがGND)ピンがあるので、PCとつないでいるUnoでは唯一のハードウェアシリアルは使えなくなってもいい(スケッチは送り込んだ、デバッグも終わった)、というのであればRXは0番ピンなので、D0のRXと真ん中のピンをショートするように、D1のTXと真ん中のピンをショートするようにジャンパピンをさします。...というのは説明としては正しいのですが、実際にはPC上でシリアルモニタ見ながら動作確認しないと開発がはかどらないので、ソフトウェアシリアルを使うというのであれば、例えば、D2をRX, D3をTXにして、

```3g.c
#include <SoftwareSerial.h>

SoftwareSerial mySerial(2, 3);

void setup()  {
  mySerial.begin(4800);
  mySerial.println("AT");
}
```

こんな感じでできそうな気がするのですが、結果はダメ。ボーレート115200bpsから9600bpsくらいまであれこれ試してみても、受信データ(とおそらく送信データも)文字化けが半端ない。応答がこの文字列なら次はこうして、みたいな通信プログラムは見事に動作せず、でした。

## うまく行った例
そういう訳で、ここらあたりがソフトウェアシリアルの限界だろう、ということで、Arduino Uno(純正)を使うことをあきらめ、Arduino Megaを使うことにします(以下の写真で使っているのは互換機ですが)。
Serial1はピン19がRX、ピン18がTX、以下Serial2、Serial3がそれぞれ用意されているので、ここではSerial1を使ってみるようにします。まずはMega側の18(TX1)にここでは赤いジャンパワイヤを、19(RX1)には白いジャンパワイヤを刺しておきます。
![20151128_000355.jpg](https://qiita-image-store.s3.amazonaws.com/0/19248/23fcb75a-315d-992d-93b0-5b3842bce2fe.jpeg)

3Gモジュール側はD0からD7のどこでもよいので、先ほどのジャンパワイヤの先(白いジャンパワイヤはRXなのでRXのどれか、赤いジャンパワイヤはTXなのでTXのどれか)に刺しておきます。
![20151128_000341.jpg](https://qiita-image-store.s3.amazonaws.com/0/19248/6ae9cba5-48d4-ce4e-7271-44804a56a27b.jpeg)

ただ、ジャンパワイヤが干渉して、3GシールドをMegaの上に直接載せられないので、ピンソケットを別途用意して、文字通り底上げを図っておきます(下の写真は反対側から撮るべきでした)。
![20151128_000545.jpg](https://qiita-image-store.s3.amazonaws.com/0/19248/ce415c82-7206-569d-9a2a-71a21c37aff8.jpeg)

Unoでは思うように動作しなかったスケッチもMegaでは思った通りに動作しました。

## 最後に
実際にどんなスケッチで動作させたのか、気になる方も少なくないかと思いますが、そちらはまた別途ということで。
mindmup > .mupファイル > JSONファイルのようだ

最近よく使うマインドマップサービス
https://www.mindmup.com/


[試しに作ったファイル](https://atlas.mindmup.com/yasokada/tmp_151204/index.html)

上記のマップに対応する.mupファイルをダウンロードした。

```.mup
{
  "title": "tmp_シーケンス例_151204",
  "id": 1,
  "formatVersion": 2,
  "ideas": {
    "1": {
      "title": "5分",
      "id": 2,
      "ideas": {
        "1": {
          "title": "5分未満",
          "id": 7,
          "ideas": {
            "1": {
              "title": "0点",
              "id": 14
            }
          }
        },
        "2": {
          "title": "5分経過",
          "id": 8,
          "ideas": {
            "1": {
              "title": "10点",
              "id": 15
            }
          }
        }
      }
    },
    "11": {
      "title": "10分",
      "id": 3,
      "ideas": {
        "1": {
          "title": "10分未満",
          "id": 10,
          "ideas": {
            "1": {
              "title": "20点",
              "id": 16
            }
          }
        },
        "2": {
          "title": "10分経過",
          "id": 11,
          "ideas": {
            "1": {
              "title": "50点",
              "id": 17
            }
          }
        }
      }
    },
    "21": {
      "title": "15分",
      "id": 6,
      "ideas": {
        "1": {
          "title": "15分未満",
          "id": 12,
          "ideas": {
            "1": {
              "title": "60点",
              "id": 18
            }
          }
        },
        "2": {
          "title": "15分経過",
          "id": 13,
          "ideas": {
            "1": {
              "title": "100点",
              "id": 19
            }
          }
        }
      }
    }
  },
  "links": []
}
```

.mupファイルというのはJSONファイルなのだろう。

そうだとしたら、何かの理由でwww.mindmup.comのサービスが終わったとしても.mupファイルリーダーを自作すれば中身の復旧はできそう。
【Android】シークバーの大きさを変える

SeekBar の大きさを変える方法でちょっと詰まったのでメモ
LinearLayout.LayoutParamsを使うといいみたいです

``` java
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(200, 50);
SeekBar seekBar = new SeekBar(this);
seekBar.setLayoutParams(lp);
```

#参考
http://stackoverflow.com/questions/6343116/seekbar-programmatically
rbenvからのrailsインストール

#前提条件
rbenvが使えるようになっている
bundlerがインストールされている
rbenv globalが設定されている

##railsのプロジェクトフォルダを作成
```mkdir project; cd project```

##ローカルで使うrubyのバージョンを設定
```rbenv local 2.2.3```

##Gemfileの作成
```bundle init```

##作成されたGemfileの編集
```rb:Gemfile
gem 'rails'
```
最新バージョンのrailsで良いならコメント外すだけでインストールされる

##インストール先を指定してbundle install
```bundle install --path=vendor/bundle --binstubs=vendor/bin```

##使用DBにmysqlを指定してrailsプロジェクト作成
```rails new . --database=mysql```

##Gemfileが上書きされるので、bundle install
```bundle install```

##.gitignoreにコミットしなくても良いファイルを追加する
```:.gitignore
/vendor/bundle
/vendor/bin
```
line monitor > 消費電流の確認(151205) > USBシリアル > 5.2V / 20mAから40mA

line monitor
http://qiita.com/7of9/items/028556c5a819a6a8de96


## USBシリアルの電流計測

9600bpsにてデータ通信中にCHARGER Doctorで計測した。

- VE488 (Wiretek)
  - 5.2V
  - 0.02A (20mA)

- USB-RS232 (TFTEC JAPAN)
  - 5.2V
  - 0.02A (20mA)

- SRC06-USB (バッファロー)
  - 5.17V
  - 0.04A (40mA)

思ったよりも消費電流が少ない。

突入電流などで実際の表示よりも多い時はありそう。オーダーが１桁上がる程度と考えて良いのだろうか？

VI変換のOPアンプをかまして、デジボルの最大電圧キャプチャをすれば突入電流を計測できるのだろうか?
TabLayout のタブの見た目をカスタマイズする

## 目的

こんな感じのタブにしたかったので、TabLayout で作ったタブの見た目をカスタマイズする方法を調べました。

![tabsample.png](https://qiita-image-store.s3.amazonaws.com/0/31477/d24fa0d2-fe21-2cb3-75ff-48db1f2f4c0e.png)
イメージ画像

## やること

- タブのアイコンのサイズと色を変える
- タブのテキストのサイズと色を変える
- タブ選択時に背景を塗りつぶす
- タブ選択時にアイコンを変える

## タブのレイアウト

```xml:res/layout/fragment_main.xml
    <android.support.design.widget.TabLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:tabTextColor="@color/accent"
        app:tabSelectedTextColor="@color/white"
        app:tabTextAppearance="@style/TabText"
        app:tabBackground="@drawable/tab_color_selector" />
```

- `app:tabTextColor="@color/accent"` テキストの色
- `app:tabSelectedTextColor="@color/white"` テキストの選択時の色
- `app:tabTextAppearance="@style/TabText"` テキストのスタイル
- `app:tabBackground="@drawable/tab_color_selector"` 背景

## タブのテキストのスタイル

```xml:res/layout/styles.xml
<resources>
    <style name="TabText" parent="TextAppearance.Design.Tab">
        <item name="android:textSize">14sp</item>
        <item name="textAllCaps">false</item>
    </style>

</resources>
```

- `<item name="android:textSize">14sp</item>` 文字サイズ
- `<item name="textAllCaps">false</item>` 大文字にしない

## タブ選択時に背景を塗りつぶす

```xml:res/drawable/tab_color_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/accent" android:state_selected="true"/>
    <item android:drawable="@android:color/transparent"/>
</selector>
```

`android:state_selected="true"` を指定して選択時の色を指定します。

## タブ選択時にアイコンを変える

選択時の背景色でアイコンが見えなくならないように別の画像を表示するようにします。

```java:MainFragment.java
tabLayout.addTab(tabLayout.newTab().setText(R.string.title_tab_1).setIcon(R.drawable.tab_icon_selector_1))
```

アイコンを tab_icon_selector_1 に設定してタブに追加します。

```xml:res/drawable/tab_icon_selector_1.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/tab_icon_1_selected" android:state_selected="true"/>
    <item android:drawable="@drawable/tab_icon_1"/>
</selector>
```

`android:state_selected="true"` を指定して選択時に画像 `tab_icon_1_selected` を表示します。

## タブのアイコンのサイズ

```xml:res/layout/design_layout_tab_icon.xml
<?xml version="1.0" encoding="utf-8"?>

<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
           android:layout_width="39dp"
           android:layout_height="39dp"
           android:scaleType="centerInside"/>
```

元々のレイアウトを上書きできるようなので、同じレイアウトの名前で `layout_width` と `layout_height` を書き換えたものを作成します。

```java:TabLayout.java
if (mIconView == null) {
    ImageView iconView = (ImageView) LayoutInflater.from(getContext())
            .inflate(R.layout.design_layout_tab_icon, this, false);
    addView(iconView, 0);
    mIconView = iconView;
}
```
ちなみにこの部分で inflate されています。

## 所感

android:state_selected を指定して状態によって変わる drawable が作ることが出来るのが便利だと思いました。

レイアウトの xml ファイルでなんでも変えられるものだと思っていましたが、意外と色んな方法でやる必要がありました。

もっと簡潔な方法があれば教えていただけると助かります。
swfはスタックマシン

スタックマシンが欲しくて、散々探したらflashがスタックマシンだった。
スタックマシンの実装は、本当に無い。
flashのアクションスクリプトのバイナリーがスタックマシンで動いている。
そのバイナリーを書き換えれば、自分のコードが動く。
jsdoに、その実装を置いている。
[jsdo](http://jsdo.it/ohisama1/o1DP)
Pythonでアニメを順に見る

# PyPIでライブラリを揃える

```shell-session
pyenv local 2.7.10
pip install Animapy
pip install py-applescript
```

# あとは下記スクリプトを実行

```py:anime_play.py
import os
import applescript

from animapy import anime

search = raw_input('search: (string) ')
index = int(raw_input('index: (integer) '))

qt_play = applescript.AppleScript('''
	on run {arg1}
		tell Application "QuickTime Player"
			open URL arg1
		end tell
	end run
''')

qt_close = applescript.AppleScript('''
	tell Application "QuickTime Player" to close window 1
''')

def play(s):
	for ep in anime.searchAnimes(s, quant=1):
		if ep == '': continue
		url = hasattr(ep, 'hd') and ep.hd or ep.normal
		print('starting to play %s' % ep.title)
		return qt_play.run(url)
		
while(1):
	play('%s %03d' % (search, index))
	raw_input('Enter to next index movie: ')
	qt_close.run()
	index+=1
```

# 説明
1. スクリプトを実行しローマ字でアニメのタイトルを入力しエンター
2. 話数を整数で入力する
3. エンターを押すたびに次の話数が再生される
4. ^Cとかで終わる

注意: Macユーザー向けになっちゃった。