OmniAICreator/Qiita-1.07M huggingface dataset:
PHPからFluentdにログを投げるためのライブラリを作りました。

---
(追記)
この記事でやった内容は、本家のfluent-logger-phpに取り込まれました。
https://github.com/fluent/fluent-logger-php

なので本記事はもう役に立たないです。
一応消すのもアレなので残しておきます。
(追記ここまで)

----

：作ったというよりcloneして改良しただけです)

`dqneo/fluent-simplelogger`という、PHPからFluentdにログを投げるためのライブラリをpackagistで公開しました。

https://packagist.org/packages/dqneo/fluent-simplelogger
https://github.com/DQNEO/php-fluent-simplelogger

## インストール方法

下記のようなファイルを用意して`composer install`すればOKです。


```json:composer.json
{
    "require": {
        "dqneo/fluent-simplelogger": "0.0.4"
    }
}
```

## 使い方

本家`fluent-logger-php`と全く同じです。

`DQNEO\Fluent\Logger`クラスは`Fluent\Logger\FluentLogger`と仕様が同じなので差し替えて使うことができます。(実装が同じなので速度も同じです。)

```php
<?php
require_once __DIR__ . '/vendor/autoload.php';

use DQNEO\Fluent\Logger;

# FluentdにTCPで接続する場合
$logger = new Logger("localhost","24224");

# FluentdにUnix Domain Socketで接続する場合(こちらの方が高速)
$logger = new Logger("unix:///var/run/td-agent/td-agent.sock");
$logger->post("debug.test", ["hello"=>"world"]);
```

メリットがあるとすると、PSR-4に対応してるので `vendor/autoload.php`を読みこむだけで済むところです。


## 作った背景

既存の(本家?)ライブラリで https://github.com/fluent/fluent-logger-php という素晴らしいプロダクトがあり、便利に使わせもらっていました。

これはこれで便利で安定していて何も問題はないのですが、PSR-4に対応していなかったのと、自分が使わなそうなクラスファイルが多数あったので、もうちょっと抽象度の低くて薄いやつが欲しいなと思っていました。
例えば`ConsoleLogger`,`FileLogger`,`HttpLogger`というクラスがあって、ログをFluentdに送る代わりに出力先を標準出力やファイルやHTTPサーバに切り替える、ということができるのですが、今どきはこういう用途なら [monolog/monolog](https://packagist.org/packages/monolog/monolog) を使えばいいかなと。

なのでFluentdと関係のないクラスを思い切って削除しました。
あとabstractクラスとかInterfaceも廃止して具象クラスに統合しました。

結果、クラスファイルが4つになってだいぶ見通しがよくなったと思います。

https://github.com/DQNEO/php-fluent-simplelogger/tree/master/src

## 謝辞

もとのライブラリを作ったchobi_eさんとsotarokさん、その他メンテナのみなさんに感謝いたします。
Macでふとシェルコードを逆アセしたいと思ったら


objdumpを使う為に、binutilsをインストールする

```
brew install binutils
```

おもむろに以下を叩く

```
gobjdump -b binary -m i386 -M intel -D shellcode.bin
```

-b binaryを指定することで、headerのないバイナリファイルでも読み込んでくれる
-M intelでintel記法でアセンブリが出力される
-m i386で対象のアーキテクチャをx86として指定している
-D 全てのセクションをディスアセンブリする

ついでに16進数+ASCIIでみたいと思ったら

```
od -tx1c shellcode.bin 
```
Githubを2段階認証に設定した状態でログインできなくなった場合

 Google Authenticatorを使っていたのですが、携帯を買い替えた際に設定が消えてしまったので再度設定をしなおしたところ、何か間違えていたらしく、ログインできなくなってしまいました。

このような場合、リカバリコードを保存してあれば代わりに使うことができますが、私は紛失していました。

同様の対処は[ヒャッハー!Githubから締め出しくらったぜぇ!](http://zafiel.wingall.com/archives/9732)に詳しいのですが、こうなると元のアカウントを復帰させることはできません。


```
Warning: For security reasons, GitHub Support cannot restore access to accounts with two-factor authentication enabled if you lose your phone and don't have access to your recovery codes.
```

[About Two-Factor Authentication](https://help.github.com/articles/about-two-factor-authentication/)にもあるように、githubではアクセス権を復旧しないと明言されています。

取れる手は別名アカウントの再取得のみです。今度はリカバリコードもきちんと保存しました。
1点困ったことが、すでにgithubのアカウントに関連付けられているメールアドレスでは新規アカウントの登録ができません。

これは[問い合わせページ](https://github.com/contact)から英語で問い合わせを送る必要があります。私の場合、問い合わせに使ったメールを旧アカウントから削除してもらい、新規アカウントを作ることができました。
ArduinoをEthernetでWR702Nモバイルルーターに接続してRESTクライアントにする

Arduino Uno用のEthernetシールドにWiznet W5100 チップを搭載した[W5100](http://www.amazon.co.jp/dp/B00LJM3ROO/)が安く買えました。セットアップした[WR702Nモバイルルーター](http://qiita.com/masato/items/2310cc7d05c325f65f95)と一緒に使いArduinoをRESTクライアントとして使うサンプルを書いてみます。[Ethernet library](http://www.arduino.cc/en/reference/ethernet)を使ったサンプルはたくさん見つかるのでArduinoをネットワーク接続する勉強にはちょうど良いです。

## MACアドレスの生成

[W5100](http://www.amazon.co.jp/dp/B00LJM3ROO/)にはMACアドレスが付いていません。ArduinoのスケッチではMACアドレスを指定する必要があるため別途用意します。
[Random MAC address generator for Arduino Ethernet Shield (static MAC generator)](http://blog.crox.net/archives/91-Random-MAC-address-generator-for-Arduino-Ethernet-Shield-static-MAC-generator.html)の記事に[https://ssl.crox.net/arduinomac](https://ssl.crox.net/arduinomac)というMACアドレスを生成してくれるサイトの紹介がありました。以下のようにMACアドレスを生成してコードのサンプルまで書いてくれます。

``` c
// 90:A2:DA:89:C8:50
// MAC address generated by https://ssl.crox.net/arduinomac/
// see http://blog.crox.net/archives/91-MAC-generator.html

byte mac[6] = { 0x90, 0xA2, 0xDA, 0x89, 0xC8, 0x50 };
```

## HTTPクライアントライブラリ

Arduino用のHTTPクライアントライブラリはいくつか見つかりました。

* [interactive-matter/HTTPClient](https://github.com/interactive-matter/HTTPClient)
* [amcewen/HttpClient](https://github.com/amcewen/HttpClient)
* [nmattisson/HttpClient](https://github.com/nmattisson/HttpClient)
* [csquared/arduino-restclient](https://github.com/csquared/arduino-restclient)

REST APIを実行することが主な用途のため[csquared/arduino-restclient](https://github.com/csquared/arduino-restclient)を使うことにします。

### csquared/arduino-restclient

ライブラリをリポジトリからlibrariesディレクトリに`git clone`します。

``` bash
$ cd ~/Documents/Arduino/libraries
$ git clone https://github.com/csquared/arduino-restclient.git RestClient
```

arduino-restclientのリポジトリにある[simple_GET.ino](https://github.com/csquared/arduino-restclient/blob/master/examples/simple_GET/simple_GET.ino)を例にしてMeshbluからstatusを取得するスケッチを書きます。

```cpp:~/Documents/Arduino/MesubluStatus/MesubluStatus.ino
#include <Ethernet.h>
#include <SPI.h>
#include "RestClient.h"

RestClient client = RestClient("meshblu.octoblu.com");

void setup() {
  Serial.begin(9600);
  byte mac[6] = { 0x90, 0xA2, 0xDA, 0x11, 0x34, 0x7E };
  Ethernet.begin(mac);
  Serial.println("Setup!");
  String response;
  int statusCode = client.get("/status", &response);
  Serial.println(response);
}

void loop() {
}
```

コンパイルしてArduinoに書き込みます。シリアルモニタを実行するとMesubluのステータスを取得します。

```
Setup!
{"meshblu":"online"}
```

![mesublu-status.png](https://qiita-image-store.s3.amazonaws.com/0/43745/283db22e-d07e-547a-c1ad-9566eddb5ce7.png)
phantom cssを試す

[PhantomCSSでViewの回帰テスト - Qiita]というブログ記事が使い方を知るのに参考になった✨
そして、私の場合は、css触るまえから
「coffee machine dialog_1.fail.png」が生成される





```
		<style>
			body {
				padding:80px;
			}
			.mug {
				font-size: 180px;
				color: #666;
			}
		</style>



```


色の差異もみるみたい！color: #ccc;に変わえると、
差分を認識してくれました。

![cappuccino success_2.fail のコピー.png](https://qiita-image-store.s3.amazonaws.com/0/26891/e0391d8c-a50c-b797-c894-8a530ed43a08.png)




pull requestを送る前やデプロイ前に、
自分でdiffを確認できる良い手段かもしれないです。
実践に利用してませんが....





参考URL
[PhantomCSSでViewの回帰テスト - Qiita]
http://qiita.com/awakia/items/faf502259efba09df7a5

[PhantomCSSのgithub]
https://github.com/Huddle/PhantomCSS/pulls

[phantom css tutorial]
http://www.jonathan-petitcolas.com/talks/2013-09-19-introduction-to-phantomcss.html#/

[pantom-cssに関するruedapさんのブックマーク]
http://b.hatena.ne.jp/ruedap/phantom-css/
IPython Qt Consoleを使いたい


# IPython Qt Consoleを実行するのに必要なもの
Windowsだと、よく使われるようなパッケージが最初から入っている[WinPython](https://winpython.github.io)っていう便利なものがあるんで、IPython Qt Consoleもなんのパッケージの追加もなく使えるようになっている。
Macだと自分でパッケージをインストールしないといけないので使えるようにするまでがなかなか大変。
IPython Qt Consoleを起動しようとするとエラーメッセージが表示されるので必要なパッケージを確認できる。

```bash
$ ipython qtconsle
...
ImportError: 
    Could not load requested Qt binding. Please ensure that
    PyQt4 >= 4.7, PyQt5 or PySide >= 1.0.3 is available,
    and only one is imported per session.
```

必要なのはPyQt4, PyQt5, PySideのいずれか。

# PyQt5をインストール
まずは下のサイトを参考に最新のPyQt5のインストールを試みる。

[PySide(Qt4)とPyQt(Qt5)に必要な環境変数をセットする](http://qiita.com/FGtatsuro/items/10c37e7fe196245a150a)
PyQt5はpipでインストールできないのでHomebrewでインストールする必要があるらしい。

[Installing PyQt5](http://pyqt.sourceforge.net/Docs/PyQt5/installation.html)
公式サイト

とりあえず依存するパッケージを調べてみると、

```bash
$ brew info pyqt5
...
==> Dependencies
Required: qt5 ✘, sip ✘
```
qt5とsipをインストールしてからPyQt5をインストール。

```bash
$ brew install qt5
...
$ brew install sip
...
$ brew install pyqt5
```

# IPython Qt Consoleの起動
もう一度起動を試してみると、今度は別のエラー。

```bash
$ ipython qtconsole
...
ImportError: No module named 'pygments'
$ pip install pygments
...
$ ipython qtconsole
...
ImportError: No module named 'zmq'
$ pip istall pyzmq
...
$ ipython qtconsole
```
pipでpygmentsとpyzmqをインストールしてようやく起動できた。

***
MacにもWinPythonみたいなのがあるといいんだけど。
Amazon Linux(EC2) ホスト名の変更


**1. hostsファイルの修正**

```bash:/etc/hosts
127.0.0.1   localhost localhost.localdomain
```
となっているのを

```bash:/etc/hosts
127.0.0.1  example.com  localhost localhost.localdomain
```
とする。

**2. networkファイルの修正**

```bash:/etc/sysconfig/network
NETWORKING=yes
HOSTNAME=localhost.localdomain
NOZEROCONF=yes
NETWORKING_IPV6=no
IPV6INIT=no
IPV6_ROUTER=no
IPV6_AUTOCONF=no
IPV6FORWARDING=no
IPV6TO4INIT=no
IPV6_CONTROL_RADVD=no
```

となっているので、```HOSTNAME```を修正する。

```bash:/etc/sysconfig/network
NETWORKING=yes
HOSTNAME=example.com
NOZEROCONF=yes
NETWORKING_IPV6=no
IPV6INIT=no
IPV6_ROUTER=no
IPV6_AUTOCONF=no
IPV6FORWARDING=no
IPV6TO4INIT=no
IPV6_CONTROL_RADVD=no
```

**3. 再起動する**

```bash
reboot
```

または

```bash
init 6
```

**※一時的にホスト名を変更したい場合**

```bash
hostname xxxx
```
とする。
doctrineでidが生成されるタイミング

PostgreSQLとMySqlで、persistした後のidが取得できるタイミングが違ってたのでメモ。

# サンプル

## Order.php

```php
/**
 * Order
 */
class Order extends \Eccube\Entity\AbstractEntity
{
    /**
     * @var integer
     */
    public $order_id;

    /**
     * @var integer
     */
    public $total;
...
```

## order.dcm.yml

```yaml
Eccube\Entity\Order:
    type: entity
    table: dtb_order
    id:
        order_id:
            type: integer
            nullable: false
            unsigned: false
            id: true
            generator:
                strategy: AUTO
    fields:
        total:
            type: integer
            nullable: true
```


# テストコード

```php

$Order = new Order();
$Order->setTotal(100);

$app['orm.em']->persist($Order);
$id1 = $Order->getOrderId();

var_dump($id1);

$app['orm.em']->flush();
$id2 = $Order->getOrderId();

var_dump($id2);
```

# Mysqlの場合

```php
NULL
int(1)
```

# PostgreSQLの場合

```php
int(1)
int(1)
```



のようになりました。

PostgreSQLだとpersistのタイミングでIDを取得できるようです。
シーケンスとオートインクリメントの違いかな。
herokuでjava

# herokuでjava

herokuでjavaを使ってみました。

以下の`Web Framework Benchmarks`というページでjavaのservletがなかなかいい数字出していたので、今運用しているrailsの処理で重い処理をjavaで書きなおしてみようというモチベーションです。
http://www.techempower.com/benchmarks/#section=data-r10&hw=peak&test=query

# 導入方法

## 手順１：Introduction

まず、herokuのjavaの導入ページに行きます。
https://devcenter.heroku.com/articles/getting-started-with-java#introduction

![image](https://qiita-image-store.s3.amazonaws.com/0/38174/515963f4-9605-3b18-0218-184f5f3e5fe2.png)

- 最初に、heorku accountの作成（これは当たり前ですが必要です）
- javaのjdkのインストール（これも当然）
- mavenのversion3をインストール(Gradleが良かったんですが指定があるのでMavenにしました）

Herokuのヘルプページがいつのまにかわかりやすくなっていて、数ステップの手順をいくつか組み合わせた、説明になっていて、うまくいったら、「紫」ボタン、うまくいかなかったら「白抜き」のボタンを押すという流れになっています。

とりあえず、手順１は特に説明することはないです。

## 手順２：Set up
herokuのToolbeltというツールをPCにインストールします。
その後、herokuコマンドでherokuにログインします。

![image](https://qiita-image-store.s3.amazonaws.com/0/38174/f8d03116-c3ff-887a-51ab-45ad5aa08561.png)

## 手順３：Prepare the app
ローカルマシンの適当なディレクトリ（一応作業用のファイルを置いてもよさそうなところ）に移動して、`git clone`コマンドで、元ネタになるプロジェクトを落としてきます。
gitが入っていなかったら入れましょう。
このプロジェクトのひな形にはある程度サンプルが実装されているので最初に取っ付くのには便利です。

![image](https://qiita-image-store.s3.amazonaws.com/0/38174/0f5a99a7-6956-0998-dac4-22edce242c7b.png)

## 手順４：Deploy the app
手順３で落としてきたサンプルをすぐにherokuにデプロイします。
`heroku create`コマンドでherokuにアプリ登録して、`git push heroku master`でアプリケーションがデプロイされます。
この時点でサンプルのソースを見ていないので若干不安になると思いますがご安心ください。
herokuに既にアプリケーションをいくつか登録している人は、上限数に達しているというエラーになるかもしれませんが、その場合は不要なアプリケーションを消すと登録できるようになります。
`heroku ps:scale`コマンドは念のためやっておきました。
`heroku open`でブラウザが自動で立ち上がって`hello`っぽいメッセージが表示されます。

![image](https://qiita-image-store.s3.amazonaws.com/0/38174/672d0b4e-9922-e41f-247d-a6af273005e6.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/38174/9f2b2735-e911-64fb-46d5-1c2736dfa9f3.png)

# この後の手順
View logs, Define a Procfile, Scale the app, Declare app dependenciesについてはなんとなく読んでおけばOKだと思います。ちょっとProcfileについてはサンプル以外の方法で起動させてようとした場合は修正が必要そうですが、今回は単純なサーブレットを実装したいので試していません。

# 今後の作業
次は、IntelliJでMainクラスを動かすやり方と、Mysql(実際はMariaDB)に接続してみたいと思います。
Rubyで始めるプログラミング入門　第2回　〜HelloWorldとコメント〜


# Hello World

プログラミング言語を学ぶ際の最初のステップとしてHello Worldを表示させるというものがあります。
早速Rubyでやってみましょう。

```ruby:hello_1.rb
puts("Hello World")
```

と入力し、ファイル名を「hello_1.rb」として保存してみてください。

その後、ターミナルで保存したフォルダ（ディレクトリ）まで移動し、

```
$ ruby hello_1.rb
```

を実行すると

```
Hello World
```

と表示されたはずです。これでHello Worldを達成しました！

といってもこれで終わってしまっては味気ないので、他のパターンのHelloWorldもやってみましょう。
下記の二つを作成し、それぞれ実行してみてください。


```ruby:hello_2.rb
p("Hello World")
```


```ruby:hello_3.rb
print("Hello World")
```

さていかがでしょうか？

それぞれHelloWorldは表示されたと思いますが、printを使ったhello_3.rbだけ改行されずに表示されたはずです。

putsもpもprintも文字列を表示する点で似てはいるものの、実はそれぞれ細かい点で挙動が違います。

## コメントについて
ちょっと説明のためにコメントについて説明させていただきます。
先ほど作成したhello_1.rbを下記のように先頭に#をつけてみてください。

```ruby:hello_1.rb
#puts("Hello World")
```

これを保存して実行すると今度はHello Worldが表示されなくなったはずです。
行の冒頭に#をつけるとコメントとして認識されるようになり、処理を行わなくなります。
（厳密に言うとマジックコメントとよばれるものもあったりしますが、まずはコメントにすると処理をしなくなるのかぁ〜と認識していただければと思います）

他にも

```ruby:hello_1.rb
=begin
puts("Hello World")
=end
```

といった=beginと=endで囲んでコメント化する方法もあります。

 #=>を利用し、コピペしても大丈夫なよう下記のようにコメントとして表示結果を合わせて表示することがよくあります。今後この記述をよく使いますので、覚えておいてください。

```ruby:hello_1.rb
puts("Hello World")
 #=>Hello World
```

次回はputs,p,printの違いやメソッドについて扱いたいと思います。

## おまけ：ターミナルの使い方とか

ターミナルの基本的な使い方は
[【保存版】Macでターミナルで使える基本のコマンド８選](http://qiita.com/KENJU/items/77a2dc1b6a60697b1133)
がとても参考になります。

ディレクトリ移動が面倒でしたら、Finderの設定を変更して、直接対象ディレクトリでターミナルを開くのも便利です。

「システム環境設定」→「キーボード」→「ショートカット」→「サービス」→「フォルダに新規ターミナル」「フォルダに新規ターミナルタブ」にチェックを入れます。すると対象のフォルダからターミナルを開くことができます。
droidkaigi

# droidkaigi

http://droidkaigi.github.io/

## スライド

1. [Activity, Fragment, CustomView の使い分け -マッチョなActivityにさよならする方法-](http://www.slideshare.net/yanzm/droid-kaigi2015-yanzm)
1. [開発を効率的に進めるられるまでの道程](http://www.slideshare.net/TakaoSumitomo/ss-47393000)
1. [CardboardのUXをカメラで向上する](http://www.slideshare.net/KenichiTakahashi2/cardboardux-droidkaigi-2)
1. [絶対落ちないアプリの作り方](http://www.slideshare.net/fumihikoshiroyama/ss-47472394)
1. [ゲームアプリケーションのアップデートサイクル](http://www.slideshare.net/kentaroiizuka/droidkaigi)
1. [アプリの企画、プロトタイプからリリースに至るまで](https://speakerdeck.com/chocomelonchan/droidkaigi)
1. [初学者に嬉しいAndroid開発環境](http://www.slideshare.net/hiroyukikusu/droidkaigi2015androidmvc)
1. [大容量データのダウンロード戦略](https://speakerdeck.com/misyobun/da-rong-liang-detafalsedaunrodozhan-lue)
1. [Android学ぶ君へ。生き抜くためのナレッジ共有](http://www.slideshare.net/shinobuokano7/android-47395733)
1. [進化するランタイムART](http://www.slideshare.net/kmt-t/art-47396171)
1. [新言語KotlinでAndroidプログラミング](https://speakerdeck.com/ntaro/xin-yan-yu-kotlindeandroidpuroguramingu-number-droidkaigi)
1. [ARTのメモリ管理](https://speakerdeck.com/haru067/20150425-droidkaigi)
1. [Bitmapは怖くない。](https://speakerdeck.com/wasabeef/android-bitmaphabu-kunai)
1. [つかえるGradleプロジェクトの作り方](http://www.slideshare.net/MakotoYamazaki/20150425-droidkaigi-gradle)
1. [モバイルにおける電力最適化のための1プラクティス](http://www.slideshare.net/suguruoho/droid-kaigi)
1. [アプリを公開する前に、最低限知っておきたいセキュリティ事項](http://www.taosoftware.co.jp/blog/wp-content/uploads/2015/04/98fb763db77cdfecf79a1387877d3c87.pdf)
1. [デザイナーがXMLを書くことでできる改善しやすいアプリ開発](https://speakerdeck.com/yulily100/tesainakaxmlwoshu-kuahurikai-fa-huro)
1. [JellyBeanとKitKatで実現するマテリアルデザイン](https://speakerdeck.com/androhi/jellybeantokitkatdeshi-xian-surumateriarudezain)
1. [Material Designを取り入れたデザインリニューアル](http://www.slideshare.net/yuki930/ss-47398513)
1. [僕らのデータ同期プラクティス](http://www.slideshare.net/Nkzn/ss-47398311)
1. [Android と SELinux](http://www.slideshare.net/sola1980/androidse-linux)

## リポジトリ

http://qiita.com/mochico/items/0b9198c7b183c4b8cb67
バッチファイルからPythonスクリプトを実行

# 概要
バッチファイルからPythonのスクリプトを実行する。
メインの処理はPythonスクリプトで行う。
バッチではファイルかフォルダを受け取り、Pythonのスクリプトに渡す。

# 準備
runBatPyフォルダ
┣・runPythonScript.bat
┗・PythonScript.py
PythonScript.pyは実行するrunPythonScript.batと同じ場所に置きます。


# サンプルコード：runPythonScript.bat
```
cd /d %~dp0
C:\Python27\python.exe PythonScript.py %*
cd
pause
```
ファイルなどを受け取ってそれらのパスをPythonScriptに渡します。
何も投げない場合もエラーが出たりはしません。

## `cd /d %~dp0`
カレントディレクトリを実行したバッチファイルのディレクトリにする。

## `C:\Python27\python.exe PythonScript.py %*`
左から順番に

* `C:\Python27\python.exe`
環境変数がを設定してない、変更したくないという事もあると思うので直接通します。

* `PythonScript.py`
pythonで実行したいスクリプトファイル

* `%*`
runPythonScript.batにドラッグ＆ドロップされたファイルやフォルダのパスの全てをこれで見れる。
それをPythonScript.pyに渡している。
`%*`以外にも受け取ったものは`%1～%9`で見れるがこの方法は９つまでしか見れない。

## 複数の変数をPythonScriptに渡したい
`C:\Python27\python.exe PythonScript.py %* %IN%`
これで%IN%の値も一緒にPythonScript.pyに渡される。


# サンプルコード：PythonScript.py
```
import sys
if __name__ == "__main__":
 param = sys.argv
 for p in param:
  print p
```
## `if __name__ == "__main__":`
スクリプトファイルとして実行された時にのみif文の中を処理する。

## `sys.argv`
argv[0] はスクリプトの名前
それ以降が `%*`で渡されたパスが入っている。
[Python 27のリファレンスから引用](http://docs.python.jp/2/library/sys.html)
> Pythonスクリプトに渡されたコマンドライン引数のリスト。
argv[0] はスクリプトの名前となりますが、フルパス名かどうかは、OSによって異なります。
コマンドライン引数に -c を付けて Pythonを起動した場合、 argv[0] は文字列 '-c' となります。
スクリプト名なしでPythonを起動した場合、 argv[0] は空文字列になります。
標準入力もしくはコマンドライン引数で指定されたファイルのリストに渡ってループするには、 fileinput モジュールを参照してください。
Linuxのブートプロセスを追うときに見るべきファイル(x86_64編)

4.0というか4/25時点のLinusツリーのHEAD

リアルモードでbzImage(vmlinuz)の先頭から呼ばれる場合(LILOから呼ばれるときだっけ？)

* arch/x86/boot/header.S
    * 圧縮されたカーネル(bzImage)の先頭にあるコード(setup.elf)のうちの一つ
    * エントリポイント_startがある
    * mainを呼ぶ
* arch/x86/boot/main.c
    * mainがある
    * いろいろハードウェアを初期化する
    * go_to_protected_modeを呼ぶ
* arch/x86/boot/pm.c
    * go_to_protected_modeがある
    * setup_idtとかsetup_gdt等でプロテクトモードへ入る準備をする
    * protected_mode_jumpでcode32_start(startup_32がある場所)へジャンプする
        * startup_32は0x100000にあるはず？

GRUB2から呼ばれる場合はここから。すでにプロテクトモードになってるはず。

* arch/x86/boot/compressed/head_64.S
    * ブートローダ(GRUB2)から最初に呼ばれるエントリポイントstartup_32がある
        * エントリポイントはarch/x86/boot/compressed/vmlinux.lds.Sに書かれている
    * 64bitモードに入るときのエントリポイントstartup_64もここにある
    * 解凍ルーチンと圧縮されたカーネルを移動しdecompress_kernelを呼ぶ
* arch/x86/boot/compressed/misc.c
    * カーネル解凍ルーチン(decompress_kernel)等がある
    * 解凍した後はstartup_64に戻る
* arch/x86/boot/compressed/head_64.S
    * 解凍したカーネルの先頭にジャンプする
    * エントリポイントはstartup_64
        * arch/x86/kernel/vmlinux.lds.Sにかかれている
* arch/x86/kernel/head_64.S
    * startup_64がある
    * initial_code(x86_64_start_kernel)に飛ぶ
* arch/x86/kernel/head64.c
    * x86_64_start_kernelがある
    * x86_64_start_reservationsを経由してstart_kernelを呼ぶ
* init/main.c
    * start_kernelがある
    * rest_init経由でcpu_startup_entry(kernel/sched/idle.c)を読んでidleループ(cpu_idle_loop)に入る

# 参考文献

* [vmlinux - Wikipedia](https://ja.wikipedia.org/wiki/Vmlinux)
* [Amazon.co.jp： 新装改訂版 Linuxのブートプロセスをみる: 白崎博生: 本](http://www.amazon.co.jp/dp/404891393X)
* [linux/Documentation/x86/boot.txt](http://lxr.linux.no/linux/Documentation/x86/boot.txt)
* [http://tjworld.net/wiki/Linux/Kernel/BootProcess](Linux/Kernel/BootProcess – TJworld)
Windows用のコマンドラインインストーラScoop

- http://scoop.sh/
- https://github.com/lukesampson/scoop

# scoopのインストール

PowerShellを開き、署名されていないPowerShellスクリプトの実行権限を変更。scoopをインストール。

```
PS> set-executionpolicy unrestricted -s cu
PS> iex (new-object net.webclient).downloadstring('https://get.scoop.sh')
```

以降の操作はPowerShellでなくても良い。

# gitをインストールしてみる

デフォルトでインストールできるアプリの一覧 https://github.com/lukesampson/scoop/tree/master/bucket 

例えばgitをインストールするなら、

```
> scoop install git
```

とする。git本体は`%LOCALAPPDATA%\scoop\apps\git`に展開され、`%LOCALAPPDATA%\scoop\shims`というディレクトリにgit.exe, git.ps1, git.shimというファイルができる。これらはAliasというかショートカット的なもののようだ。なお、このショートカット的なもののみを提供する[shimexe](https://github.com/lukesampson/shimexe)というのもある。

# gvimをインストールしてみる

標準のbucketにCUI版のvimしか入っていない。gvimは[bucket-extras](https://github.com/lukesampson/scoop-extras)に入っているのでこれを使えるようにする。

```
> scoop bucket add extras
checking repo...ok
...
extras bucket was added successfully

> scoop bucket list
extras
> scoop install gvim
installing gvim (7.4)
...
gvim (7.4) was installed successfully!
```

# status, update

`scoop update`でscoop自体とbucketsのアップデートを行う。`scoop update アプリ名`または`scoop update *`で各アプリのアップデートを行う。

```
> scoop status
scoop is out of date. run scoop update to get the latest changes.
everything is ok!

> scoop update
updating scoop...
updating extras bucket...
scoop was updated successfully!

> scoop status
scoop is up-to-date.
updates are available for:
    nodejs: 0.12.1 -> 0.12.2

> scoop update nodejs
(ログ流しちゃった）
nodejs was updated from 0.12.1 to 0.12.2
```

# Chocolateyとの違い

https://github.com/lukesampson/scoop/wiki/Chocolatey-Comparison

新たなアプリをscoopを使ってインストールしたい場合、必要なのはマニフェストと呼ばれる1つのJSONファイルだけで、それをローカルにおいてもgithubやgist上においても良い。bucketも、単にマニフェストを置いたgithubのリポジトリなので簡単に作れる。

たまに%PATH%を書き換えるので、コマンドプロンプトを起動しなおす必要がある。
Apple Watch アプリ申請・審査の注意点メモ





# iTunes Connectでの申請

**不正バイナリエラー**
Watch用アプリアイコン画像にアルファチャンネルが含まれていると、iTunes Connectでビルドが不正なバイナリと判定されます。
OrganizerではSubmitが成功するので、送信後まで不正と気付かず。


# Appleによる審査

**Watchアプリアイコンが円型に見えないとリジェクト**
Watch用のアプリアイコン画像の背景色を黒 (#000000) で申請したところ、審査でリジェクトされました。
「Apple Watchで表示した際に、アイコンが円型に見えない」というのがリジェクト理由でした。
 
![rejected.jpg](https://qiita-image-store.s3.amazonaws.com/0/17330/09698a26-2e6b-2488-eedb-995fb48d498e.jpeg)
※説明のため、ぼかしを入れています   
 
 
**Watchアプリが時計機能のみだとリジェクト**
「時間を表示するというコンセプトのアプリ」はリジェクトされました。それはApple Watchに元々入っている機能だ、と見なされたようです。
時計以外に機能を付ければ審査に通るのかどうか、これから検証してみたいと思います。
（ちなみに実際に申請したアプリは、時刻をアラビア数字でない特定の数字で、WKInterfaceLabel・システムフォントで表示するというものでした。）

【4.30 追記】
時計機能+"特定の数字"の説明ページという構成で審査に再提出しましたが、改めてリジェクトされました。
「App Store Review Guidelinesが改訂されました。条項10.7によってアプリを差し戻しますので、別のコンセプトでトライして下さい」というAppleからの回答でした。


## 参考記事
Apple Watchアプリ作成、申請時の注意点まとめ
http://qiita.com/takashings/items/484fc389c46d8ad04e96
Apple Watchアプリ申請時にハマったこと
http://qiita.com/koogawa/items/85e80d03c49daf80ce3a
ifort > remark #8291 の警告を表示しない > -diag-disable 8291

[参考](http://d.hatena.ne.jp/leetmikeal/20130206/1360132140)

一般公開されているFortranコードをコンパイルしようとすると指数の桁指定で警告がたくさんでる。

```
... remark #8291: Recommended relationship between field width 'W' and the number of fractional digits 'D' in this edit descriptor is 'W>=D+7'. 1102 FORMAT ('VAL=',D11.5)
```

とりあえずの対応として、参考ページの方法を用いた。

```
$ ifort -diag-disable 8290 -diag-disable 8291 tmp.f 
```
8291を消したら8290として警告がでたので、両方警告を切った。
Macのターミナルで"$ Julia"では起動できない問題

理由はわかりませんが、Juliaを起動しようとMacのTerminalで
```$ Julia```
と入力してもJuliaは起動しません…。
というわけで、bashrcで登録します。

```$ vim .bashrc```
でbashrcを開いて
```alias julia='exec '/Applications/Julia-***.app/Contents/Resources/julia/bin/julia''```
Junoとのバンドルの場合は、

```alias julia='exec "/Applications/Juno.app/Contents/Resources/app/julia/bin/julia"'```

を追加して保存。
次に、
```$ vim .bash_profile```
でbash_profileを開きます。
```source ~/.bashrc```
を追加して保存。
```$ source .bash_profile```
を入力して、再ログイン。これで解決。
Pythonでインスタンス変数が引き継がれて困る

## は？
本当に「は？」っていう感じでいまさらなのですが...

### 検証コード

問題のコード

```python
# -*- coding: utf-8 -*-


class Hoge():
    def __init__(self, data=[]):
        self.data = data

    def add_data(self):
        self.data.append(u"ʅ（´◔౪◔）ʃ")

if __name__ == "__main__":
    hoge = Hoge()
    hoge.add_data()
    hoge2 = Hoge()

    print hoge2.data[0]
```

実行すると、`ʅ（´◔౪◔）ʃ`が表示されます。

？？？？？？？

以下のようにするとhoge2にdataは引き継がれない

```py
# -*- coding: utf-8 -*-


class Hoge():
    def __init__(self):
        self.data = []

    def add_data(self):
        self.data.append(u"ʅ（´◔౪◔）ʃ")

if __name__ == "__main__":
    hoge = Hoge()
    hoge.add_data()
    hoge2 = Hoge()

    print hoge2.data


```

さらに、リストではなく文字列を入れるようにするとコンストラクタに引数を入れても引き継がれなかった


```py
# -*- coding: utf-8 -*-


class Hoge():
    def __init__(self, data=''):
        self.data = data

    def add_data(self):
        self.data = u"ʅ（´◔౪◔）ʃ"

if __name__ == "__main__":
    hoge = Hoge()
    hoge.add_data()
    hoge2 = Hoge()

    print hoge2.data
```

なぜだ...
コンストラクタの引数にデフォルト値を入れるとなぜかインスタンス変数を引き継ぐ？

原因はわからないけど、気をつけます。
原因を知っている方はコメントいただけると幸いです
git push HEAD:hoge で error: unable to push to unqualified destination

このエラーが出る：

```shell-session:
error: unable to push to unqualified destination: hoge
The destination refspec neither matches an existing ref on the remote nor
begins with refs/, and we are unable to guess a prefix based on the source ref.
error: failed to push some refs to <remote>
```

原因はdetachで作業してたからでした。
一度

```shell-session:
git checkout -B hoge
```
してから

```shell-session:
git push origin HEAD:hoge
```
でやったら行けました
Javascriptで配列内のオブジェクトの重複をチェックして値を取り出す

よく使うのでメモ

```js
// 重複チェック用オブジェクト
var uniqueUser = {};

Users.forEach(function(user) {
  if (!uniqueUser[user.id]) {
    uniqueUser[user.id] = user;
  }
});
```
iMovieで動画編集するときのハマりどころ

# タイトルを編集したのに動画で書きだすとデフォルトの文言のまま

なぜかタイトルを編集してもうまく反映されず、「名前」とか「概要」みたいな文言になってしまう現象。
何度保存しなおしてもダメなので、コンテンツライブラリから同じタイトルコンポーネントをドラッグ＆ドロップしてバグっているタイトルを上書きすると直った。

# 動画書き出し時に一番高い解像度を選択できない

共有時に解像度のセレクトボックスをクリックすると任意の解像度を選択できるが、
たまに一番高い解像度が選択できなくなる時がある。(グレーアウトしてdisabled状態)
その場合、一番高い解像度を選択できるムービーがあればそれを複製、
なければ新規に作成してそのような状態にして、(どういう条件でなるのかは不明...)
本来書き出したい動画コンテンツを全選択&コピー、上記で作成したムービーの末尾にペースト。
最後に先頭の不要なコンテンツを削除したらよい。

# フォント周りがつらい

とにかく全体的に挙動があやしい

**いきなり文字がでかくなったり小さくなったりする**
→ とりあえずリセットボタン押せばなんとかなる

**なぜかフォントサイズが変更できない**
→ 変更したい文章を全選択して右クリック → フォント → フォントパネルを表示 で表示されたフォントパネルから変更可能(ただし挙動不安定)

# 最後に

Appleさん頑張ってください...
mrbgemsでC++のAPIを呼ぶgemを作るには

# 背景

mrubyで画像処理をしてみようと軽く調べたら、Imagemagickが
OpenCLに対応しているらしく、それならこれを使えば、mrubyからOpenCLを
叩けてかっこいいと思った

さらに楽なAPIは、CよりC++な感じがした。これは昨今のOpenCVのAPIを頑なにPython APIで使えるもの調べれば調べるほどC++のみAPIが用意されていたり、より便利なAPIだったりといった状況を知らなければ、C++は例外が標準規格化される以前の時代に触っって、その後SIerのデスマでC++使えるはずの要員が軒並み、Cのコンパルすら自力で通せないなんて経験をしているからC++は極力敬遠したり、最近だとnode.jsサイドからのV8の追随作業で生じるnanもバージョンを上げないと吸収できない件などからあまり良い印象を受けていないかったので、迷わずCのAPIで作業を進めるところだった。

# 雑な対応メモ

```
MRuby::Gem::Specification.new('mruby-mrmagick') do |spec|
  spec.license = 'MIT'
  spec.authors = 'kaita hito'

  magick_cflg =  `Magick++-config --cxxflags --cppflags`.chomp!
  magick_cflg.gsub!(/\n/," ")
  #puts magick_cflg
  spec.cxx.flags << magick_cflg
  magick_libs = `Magick++-config --ldflags --libs`.chomp!
  magick_libs.gsub!(/\n/," ")
  spec.linker.flags_before_libraries << magick_libs
end
```

## spec.cxx.flags

spec.cxx.flagsへC++ APIのヘッダファイルのパスを追加。

## spec.linker.flags_before_libraries

こちらはCのAPIと同様にC++ APIのライブラリへのパスを追加。

# Link

- [mrbgemsの雛形を作る超便利ツールmruby-mrbgem-templateを使う - Qiita](http://qiita.com/kjunichi/items/128427532a29e231072f)
- [Node.js - nanに対応したのにnan,nanだ！ - Qiita](http://qiita.com/kjunichi/items/71968d504980f63be34a)

# 関連投稿

- [mrubyでmrbgemのテストで外部コマンドを使うには - Qiita](http://qiita.com/kjunichi/items/059423a39f82ef872703)

# 関連記事

- [mrubyで簡単に回転画像が生成出来るコマンドを作ろうとしている](https://abrakatabura.hatenablog.com/entry/2015/10/08/073442)
- [mruby-mrmagickをWindowsでもv7系のImageMagickに対応させた](https://abrakatabura.hatenablog.com/entry/2018/02/23/074159)
- [mruby-mrmagickにMrmagick#formatsを追加した](https://abrakatabura.hatenablog.com/entry/2018/02/27/230659)
- [mruby-mrmagickをGraphicsMagickに対応させた](https://abrakatabura.hatenablog.com/entry/2018/03/07/160617)
TP-LINKのWR702NモバイルルーターのClientモードをOSXから設定する

TP-LINKの[WR702N](http://www.amazon.co.jp/dp/B005NEU3WS/)は安価で機能が豊富なモバイルルーターです。接続モードがAP、Router、Repeater、Bridge、Clientと用意されています。特にClientモードは無線LANカードとして使えるのでArduioとEthernetケーブルで接続するとArduinoの安価なWi-Fi環境が作れます。ただしブラウザから使える設定画面が中国語です。[NodeMCU](http://www.nodemcu.com/index_cn.html)もそうですがIoTは中国語も読めないと困ることが多くなりそうです。日本語マニュアルが付属していますがWindows用なので参考にしながらOSXで設定をしていきます。

## OSXとEthernetケーブルで接続する

モバイルルーターの設定はホストマシンをEthernetケーブルで接続してブラウザから行います。MacBook Proを使っていますがEthernetポートがありません。[USB Ethernet LANアダプター](http://store.shopping.yahoo.co.jp/taobaonotatsujinpro/usbethernet1.html)を購入してモバイルルーターと接続します。

システム環境設定 > ネットワーク > USB Ethernet LANアダプターの設定を開きます。

![static-usb-lan.png](https://qiita-image-store.s3.amazonaws.com/0/43745/2efd3b0f-be1f-f3d2-2082-7b659d81a5b3.png)

* IPv4の設定: 手入力
* IPアドレス: 192.168.1.x (xは2-252の間の任意)
* ルーター: 192.168.1.253 (モバイルルーターのIPアドレス)


## モバイルルーターの設定

OSXからブラウザを開き`192.168.1.253`に接続してパスワードに`admin`を入力して下に見えるボタンを押してログインします。

![password.png](https://qiita-image-store.s3.amazonaws.com/0/43745/2268feb8-c73a-d149-2356-18e5a98c4631.png)

### 接続モードをClientにする

メニューから`工作模式`のリンクを開き接続モードを設定します。Clientモードをチェックして右下のボタンをクリックして次に進みます。

![client-menu.png](https://qiita-image-store.s3.amazonaws.com/0/43745/54ed72a0-5218-a0ba-897d-4e425f24b55e.png)

画面中央のボタンを押してアクセスポイントを検索します。

![search-ap.png](https://qiita-image-store.s3.amazonaws.com/0/43745/0889c990-edb7-8525-8163-76ea2e6cd170.png)

見つかったAPの一覧が表示されます。接続したいAPのリンクをクリックします。

![select-ap.png](https://qiita-image-store.s3.amazonaws.com/0/43745/7dc9d809-948b-3223-b959-d6c90f46ccb6.png)

アクセスポイントのパスワードを入力して、右下のボタンを押して次に進みます。

![ap-password.png](https://qiita-image-store.s3.amazonaws.com/0/43745/4efe8959-23dc-f8b3-cb11-bc5c5c084bb1.png)

設定変更の確認のためブラウザのアラートが表示されます。OKをクリックするとモバイルルーターが再起動して設定が反映されます。

![restart.png](https://qiita-image-store.s3.amazonaws.com/0/43745/a188ae60-3121-10cc-b54e-0906831be29b.png)


## DHCPからIPアドレスを取得する

OSXに戻りネットワーク設定を変更します。モバイルルーターからDHCPでIPアドレスを取得するようにします。IPアドレスがうまく取得できない場合はモバイルルーターの電源を入れ直して再起動すると成功するようです。

システム環境設定 > ネットワーク > USB Ethernet LANアダプターの設定を開きます。

![dhcp.png](https://qiita-image-store.s3.amazonaws.com/0/43745/4760a6fa-0036-74a5-110b-722f6419117e.png)

* IPv4の設定: DHCP サーバーを使用
UbuntuからLubuntuに変更する方法

古いPCにUbuntuを入れたものの、重くて使い物になりません。
[Ubuntu インストール（14.04　32bit版）記事参照](http://qiita.com/tagosaku324/items/aaafe88345318459ea57)
選択肢の一つとして、Lubuntu　を教えてもらいました。

古いPCにLubuntuを入れる場合、OS最初からインストールしなおしたほうがいいです。
Ubuntuを入れた後からLubuntuを入れることもできますが、Ubuntsuでインストールしたいろいろなものがそのまま入っています。
この記事ではUbuntuを入れた後からLubuntuをいれた失敗例です。

#Lubuntuについて
Lubuntuはデスクトップ環境LXDEを搭載している以外はUbuntuそのものという謳い文句。
比較的処理能力の低いパソコンでもスムーズに動くことを目的としているらしいです。
ちなみに、UbuntuはGnome搭載（Macっぽい感じ）でLubuntuのLXDEはXPっぽい感じらしいです。

（wikipediaより）
LXDE (Lightweight X11 Desktop Environment) はUNIXおよびLinuxやBSDのようなPOSIXプラットフォーム上で動作する、GPL下で配布されるオープンソースのデスクトップ環境である。

素直にLubuntuのインストールをするのであれば以下のサイトが参考になると思います。
[Lubuntu 14.04 LTS を Windows XP の代わりに インストールしてみた]
(http://server-setting.info/ubuntu/lubuntu-windows-xp.html)

すでにUbuntuを入れているのでLubuntuに切り替えるよう方法をやってみます。
今回は以下のサイトを参考にさせてもらいます。
* [Ubuntu Japanese Team](https://wiki.ubuntulinux.jp/UbuntuTips/Desktop/HowToIntroduceLxde)
* [UbuntuをLubuntu化する方法]
(http://rockword.seesaa.net/article/300936628.html)

unix画面を開いて、端末（LXTerminal)を起動して以下を実行します。
```
$ sudo apt-get install lubuntu-desktop
```

ほっとくとインストールが終わり、起動されますが、起動はUbuntuでした。
![スクリーンショット 2015-04-25 14.50.15.png](https://qiita-image-store.s3.amazonaws.com/0/39911/801957c7-fd61-f6b9-26ed-2587abd961a8.png)

画面の右上にある切り替えでLubuntuにします。
![スクリーンショット 2015-04-25 14.51.25.png](https://qiita-image-store.s3.amazonaws.com/0/39911/513ba0e8-9f68-a0c0-041a-e31de9779fe0.png)

これ切り替えてからログインをするとLubuntuの画面にログインされます。

・・・が、
ログイン画面までは結局Ubuntuなので起動はやっぱり重たい。。。
Ubuntu機能がそのまま入っているからでしょう。
なので、切り替える方式ではなく、まっさらからLubuntuをインストールすることにします。
気付きメモ


lxrで[livepatch-sample.c](http://lxr.free-electrons.com/source/samples/livepatch/livepatch-sample.c#L56)を見ててふと気づいた。確かにこういうやり方もあるな。

```c
#include <stdio.h>

struct test_struct {
        int n;
        char *str;
};

struct test_struct foo[] = {
        {
                .n = 10,
                .str = "hello, world",
        },
        {
                .n = 5,
                .str = "foobar",
        }, {}
};

int main(int argc, char **argv)
{
        for (struct test_struct *p = foo; p->str; p++)
                printf("%d: %s\n", p->n, p->str);

        return 0;

}

```

`gcc -std=c11 a.c`で。
Wordpressが更新できない

#Wordpress4.2が出ましたね。

本日、Wordpress4.2が出ました。そこで、バージョンアップしようとして更新と押すと・・・
FTP設定画面が出ます。

あれ？と。

なんでやねん。と。

色々調べると、何かしらの変更によって、アップデートを判定しているディレクトリやファイルへのアクセスが制限されているためchownをやり直しらしい。

めんどくさいので、他にないかと調べると、ありました。

[フィルターフック『filesystem_method』を使う](http://www.sandalot.com/wordpress%E6%9B%B4%E6%96%B0%E3%81%A7ftp%E5%85%A5%E5%8A%9B%E7%94%BB%E9%9D%A2%E3%81%8C%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AE%E5%AF%BE%E5%87%A6%E6%B3%95/)

```php:function.php
function set_fs_method($args) {
	return 'direct';
}
add_filter('filesystem_method','set_fs_method');
```
###### 出典：Webサイト sand a lot Web & Music Create "WordPress更新時にFTP情報入力画面が表示される場合の対処方法3つ"より

function.phpはhttp://mydomain.com/xxxx/wp-admin/ にある外観→テーマの編集→テーマのための関数（function.php）を開くとあるので、上記のコードを一番下の行に書き込んでもらって更新と押せばOKです。

その後そのまま更新ボタンを押すとダウンロードが始まるはずです。

非常に簡単ですね。

いきなりこんなことが起こったのかというとそんなことはなく、つい先日、サーバのアップデート作業を行ったので、その際何かしらアクセス権限が書き換わったのでしょうね。

セキュリティ強化の一環だとは思いますが、オープンソースである以上こういったことには気をつけておきたいですね。
セピアシェーダーを書いてみる

# 概要
前回作ったMonochromeシェーダーを応用してセピアシェーダーを作成しました

## サンプル
```shader:sepia.shader
Shader "Sprites/Sepia"
{
	Properties
	{
		[PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
		_Color ("Tint", Color) = (1,1,1,1)
		[MaterialToggle] PixelSnap ("Pixel snap", Float) = 0
	}

	SubShader
	{
		Tags
		{ 
			"Queue"="Transparent" 
			"IgnoreProjector"="True" 
			"RenderType"="Transparent" 
			"PreviewType"="Plane"
			"CanUseSpriteAtlas"="True"
		}

		Cull Off
		Lighting Off
		ZWrite Off
		Blend One OneMinusSrcAlpha

		Pass
		{
		CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#pragma multi_compile _ PIXELSNAP_ON
			#include "UnityCG.cginc"
			
			struct appdata_t
			{
				float4 vertex   : POSITION;
				float4 color    : COLOR;
				float2 texcoord : TEXCOORD0;
			};

			struct v2f
			{
				float4 vertex   : SV_POSITION;
				fixed4 color    : COLOR;
				half2 texcoord  : TEXCOORD0;
			};
			
			fixed4 _Color;

			v2f vert(appdata_t IN)
			{
				v2f OUT;
				OUT.vertex = mul(UNITY_MATRIX_MVP, IN.vertex);
				OUT.texcoord = IN.texcoord;
				OUT.color = IN.color * _Color;
				#ifdef PIXELSNAP_ON
				OUT.vertex = UnityPixelSnap (OUT.vertex);
				#endif

				return OUT;
			}

			sampler2D _MainTex;
			const float3 _mono = float3(0.298912, 0.586611, 0.114478);
			const float3 _sepia = float3(1.07, 0.74, 0.43);

			fixed4 frag(v2f IN) : SV_Target
			{
				fixed4 c = tex2D(_MainTex, IN.texcoord) * IN.color;
				c.rgb = dot(c.rgb, _mono) * c.a;
				c.rgb *= _sepia;
				return c;
			}
		ENDCG
		}
	}
}

```
## 出力結果
![loveyan](http://i.gyazo.com/02be563f45b026b6df9c699f9c7d03c1.png)

## 解説
前回のMonochromeのフラグメントシェーダーに
```
c.rgb *= _sepia;
```
を追加しただけです。
グレイスケールにセピア色の色調の比率(107, 74, 43)を乗算してやるだけで表現できます。
グレイスケールは色調の輝度のみを抽出したものなので、色々と応用範囲は広そうです。

### 参考
http://wgld.org/d/webgl/w054.html
コマンドの終了ステータスをプロンプトに表示する

コマンドの終了ステータスをプロンプトの先頭に表示する
`PS1="\$? "$PS1`

こんな感じ
`0 yuch4n@raspberrypi ~ $`

.bashrc に追記すると良いです
`echo 'PS1="\$? "$PS1' >> ~/.bashrc`
現在行もしくは選択範囲の逆インデント (アウトデント、デデント)


一部のメジャーモードでは思ったようにインデントを整えてくれないことがありますね。
`indent`の逆、`outdent`,`dedent`というものが標準関数に見つからなかったので以下を試してみます。
割り当てキーバインドは`Shift+TAB`にします。

```el
(defun my-outdent-dwim ()
  (interactive)
  (let* ((x-times (or current-prefix-arg 1))
         (offset (- (* c-basic-offset x-times))))
    (if mark-active
        (indent-rigidly
         (save-excursion (goto-char (region-beginning)) (point-at-bol))
         (save-excursion (goto-char (region-end)) (point-at-eol))
         offset)
      (indent-rigidly (point-at-bol) (point-at-eol) offset))))

(global-set-key (kbd "<S-tab>") 'my-outdent-dwim)
```

+ 範囲選択があり: 範囲全体のインデントを1つ戻す
+ 範囲選択がなし: 現在行のインデントを1つ戻す

`C-u NUM S-TAB`のように数字の引数を与えることで`NUM`分インデントを下げます。

+ `C-u 3 S-TAB`: インデントを3レベル分戻す

## 補足
`indent-rigidly`は`C-x TAB`に標準で割り当てられています。
面倒ですが`C-u -4 C-x TAB`とすることで同じような効果が得られます。
matplotlibのDocsetを作る

# Docsetの作り方
[Dash User Contributed Docsets](https://github.com/Kapeli/Dash-User-Contributions)
Docsetが標準で提供されていないものもたくさんあるが、
標準でないDocsetの作り方がいろいろ集めてある。
その中にmatplotlibのDocsetの作り方もあるので、ここに書かれている通りにやってみる。
# doc2dashのインストール
[matplotlib docset](https://github.com/Kapeli/Dash-User-Contributions/tree/master/docsets/matplotlib)
ここに書かれている手順は

- Htmlダウンロード:
	- `httrack "matplotlib.org/1.3.1/" -O "matplotlib" "+*matplotlib.org/*" -v`
- Docset作成:
	- `doc2dash -v -n matplotlib matplotlib/matplotlib.org/1.4.3`
- Set Info.plist to index page:
	- `dashIndexFilePath: index.html`
- アイコンを追加

# Htmlダウンロード
HTTrackというアプリケーションでmatplotlibの公式サイトからHtmlファイルをまるごとダウンロードするということらしい。
[HTTrack](https://www.httrack.com)
まずはHTTrackをインストールする必要がある。
Homebrewを使ってインストール。

```bash
$ brew install httrack
```
HTTrackがインストールできたらコマンドを実行。
URLは最新バージョンに置き換えて、

```bash
$ httrack "matplotlib.org/1.4.3/" -O "matplotlib" "+*matplotlib.org/*" -v
```
ダウンロードにはかなり時間がかかりそう。
4時間経ってもまだ終わっていないし、ダウンロード済みのサイズも450MBを超えた。
とりあえず、今回は諦めることにする。

# Docset作成
今度、時間があったときにもう一度作成を試みる。
Thymeleaf で不要な要素を削除する XSL

```xml
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns="http://www.w3.org/1999/xhtml" xmlns:html="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes" method="xml"/>

  <xsl:template match="node() | @*">
    <xsl:copy>
      <xsl:apply-templates select="node() | @*" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="*[@th:remove='all']" /><!-- th:remove=all 要素は削除 -->
  <xsl:template match="*[@th:remove='all-but-first']">
    <!-- th:remove=all-but-first 要素は最初を残して削除 -->
    <xsl:copy>
      <xsl:for-each select="@*">
        <xsl:copy/>
      </xsl:for-each>
      <xsl:apply-templates select="*[1]" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="*[@th:include] | *[@th:replace] | *[@th:text]">
    <!-- 中身が要らない要素はざくっと捨てる -->
    <xsl:copy>
      <xsl:for-each select="@*">
        <xsl:copy/>
      </xsl:for-each>
      <xsl:value-of select="translate(@th:*, '@$#{}', '')" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="comment()"><!-- コメントは Thymeleaf コメントに変換 -->
    <xsl:comment>/*<xsl:value-of select="." />*/</xsl:comment>
  </xsl:template>
</xsl:stylesheet>
```
cylinder関連の計算式 > r_va / r_v

cylinderについての式の整理

cylinderの半径R, 長さLに対して、EPSは以下のように定義する。

```math
EPS = \frac{D}{L} = \frac{2R}{L}
```
これより

```math
L = \frac{2R}{EPS}
```

V: volume
A: area
とする

r_vaの値は上のLの式より

```math
\begin{equation}
r_{va} = 3 \frac{V}{A} = \frac{3\pi R L}{2 \pi R + 2 \pi L} = \frac{3 \pi R * \frac{2R}{EPS}}{2 \pi R + 2 \pi \frac{2R}{EPS}}

= \frac{3R}{EPS+2}
\end{equation}
```

一方で、r_vの値は上のLの式より

```math
r_v = \sqrt[3]{\frac{3}{4} R^2 L} = \sqrt[3]{\frac{3}{4} R^2 \frac{2R}{EPS} } = \sqrt[3]{\frac{3}{2 EPS}}R
```

Rをr_vaで表して

```math
r_{va} = \frac{3R}{EPS+2}
```
```math
(EPS+2) r_{va} = 3R
```
```math
R = \frac{(EPS+2) }{3}r_{va}
```

以上より、r_{va}からr_vを以下のように計算できる

```math
r_v = \sqrt[3]{\frac{3}{2EPS}} \frac{ (EPS+2) }{3} r_{va}
```
mod_rewriteでログを書き出す

mod_rewriteがうまく動かない時があります。

なぜ動かないのか、ログを見るのが一番。

mod_rewriteのログを書き出す方法です。

```apache:httpd.conf
RewriteLog "/tmp/rewrite.log"
RewriteLogLevel 9
```

ログがガンガン溜まるので問題が解決したら削除したほうがよいかもしれないですね。

こちらの記事を参考にしました。ありがとうございます。
http://ms2.seesaa.net/article/168747804.html
FinderからショートカットでBridgeを開く


2016/07/17　さらに簡単に

```AppleScript:
tell application "Finder"
	try
		set myPATH to URL of (insertion location as alias)
	on error
		set myPATH to URL of item 1 of (selection as alias list)
	end try
end tell
tell application "Adobe Bridge CC" to do javascript ("new Document(" & quoted form of myPATH & ");")
```

一つだけある例外「検索ウインドウで何も選択していない」場合にも動作させるために…

```AppleScript:
tell application "Finder"
	try
		set myPATH to URL of item 1 of (selection as alias list)
	on error
		try
			set myPATH to URL of (insertion location as alias)
		on error
			set myPATH to URL of (desktop as alias)
		end try
	end try
end tell
tell application "Adobe Bridge CC" to do javascript ("new Document(" & quoted form of myPATH & ");")
```

ちっとださい。

---

URLエンコードで問題なく開けることが分かったので少し簡単に。

```applescript:BridgeOpen3.scpt
tell application "Finder"
	try
		set myList to selection as alias list
		if length of myList < 1 then
			set beginning of myList to target of window 1 as alias
		end if
		set myItem to URL of item 1 of myList
	on error
		return
	end try
end tell

tell application "Adobe Bridge CC"
	launch
	activate
	do javascript ("new Document(\"" & myItem & "\");")
end tell
```

師匠に教えて貰ってもう少し簡単に
今度は何も開いてない・選択していない場合Desktopを開く

```applescript:BridgeOpen3_1.scpt
tell application "Finder"
	try
		--選択をmyListにセット。使うのはリストのitem1のみなので、item1に希望のものが入っているようにする
		set myList to selection as alias list
		--何も選択していない場合は開いているウインドウかDesktopをリスト最上部にセット
		if length of myList < 1 then
			set beginning of myList to insertion location as alias
		end if
		--Bridgeに渡すためにURLエンコード
		set myItem to URL of item 1 of myList
	on error
		--検索ウインドウ等では何もしない
		return
	end try
end tell

tell application id "com.adobe.bridge6"
	launch
	activate
	do javascript ("new Document(\"" & myItem & "\");")
end tell
```

Finderツールバーに置いて使うタイプ。コンパイルしてアプリケーションとして保存したってください。

```applescript:BridgeOpen.app
tell application "Finder"
	try
		set myItem to URL of target of window 1
	end try
end tell
tell application id "com.adobe.bridge6"
	launch
	activate
	do javascript ("new Document(\"" & myItem & "\");")
end tell
```

Finderツールバーに置いて使うタイプ（選択しているものを判断）

```applescript:BridgeOpen.app
tell application "Finder"
	try
		set myList to selection as alias list
		if length of myList < 1 then
			set beginning of myList to target of window 1 as alias
		end if
		set myItem to URL of item 1 of myList
	on error
		return
	end try
end tell

tell application id "com.adobe.bridge6"
	launch
	activate
	do javascript ("new Document(\"" & myItem & "\");")
end tell
```
AndroidStudioからワイヤレスで実機ビルド for Mac


**追記: 20115/9/17**
*「4. adbコマンドで端末を接続する」*でうまく繋がらないときは `adb kill-server`と`adb start-server`でadbの再起動を試してみてください。
- - -

すごく便利なワイヤレスでの実機ビルドの方法。

他にもいくつかエントリがありますが、Mac環境で行われたものが少なかったり、
情報が分散されていて初心者にはちょっと不便だったので、一連の流れをまとめました。

基本的には、以下のエントリでとてもわかりやすく記載されています。

>無線LANを使ってAndroidアプリの実機デバッグを行ってみる。
>http://www.absolute-keitarou.net/blog/?p=874

#1.  ADT Bundleをダウンロード

残念ながらAndroidStudioが正式リリースされてからdeveloper.android.comのページからは、
ADT Bundle(Eclipse with ADT Plugin & Android SDK)がダウンロードできなくなっています。

ADT Bundleは以下から入手できます。
http://stackoverflow.com/questions/27449206/what-is-the-final-version-of-the-adt-bundle

ADT Bundleがダウンロードできたら、
SDKのフォルダだけをapplicationのディレクトリに移動します。

![adt-bundle-mac-x86_64-20140702_2.png](https://qiita-image-store.s3.amazonaws.com/0/41889/89151c56-1b06-a220-d5f0-66ec3cf38313.png)

#2. adbのパスを通す

もちろんこのままではadbコマンドは使えないので、
android SDKを置いたディレクトリにパスを通します。

.bash_profileを開きます

```bash
$ sudo vi .bash_profile
```

以下のようにパスを記述し、`:wq`で閉じます

```bash
export PATH="/Applications/android-sdk/tools:$PATH"
```

これで、adbコマンドが使えるようになります

```bash
$ adb -version
Android Debug Bridge version 1.0.31
```

#3. 接続している端末のIPアドレスを調べる

端末によって微妙に場所が違うようなので、適時、確認してください。
Nexus7では、**設定 > タブレット情報 > 端末の状態**にありました。

#4. adbコマンドで端末を接続する

```bash
# 任意のポート
> adb tcpip 5555
 
# 3で調べた端末のIPアドレス(+任意のポート番号)で接続する
> adb connect 192.0.2.0/24:5555
```

いくつかのエントリではこれで端末に接続できるとありますが、
残念ながら`device not found`となる場合があります。

```bash
> adb connect 192.0.2.0/24:5555
device not found
```

**device not found になった場合**
* * *
以下の参考リンクに原因と解決方法があります。

>http://stackoverflow.com/questions/6026948/cant-find-android-device-using-adb-devices-command

ここでは、解決方法だけを記述します。

実機ビルドしたい端末を接続した状態で、**このMacについて**を開きます。

![この_Mac_について_と_下書きを編集_-_Qiita.png](https://qiita-image-store.s3.amazonaws.com/0/41889/746e1400-160a-8c1c-3712-0a3f1ded5c27.png)

システムレポートを開きます。

![MacBook_Pro.png](https://qiita-image-store.s3.amazonaws.com/0/41889/ce931daf-67bf-129d-ba14-893ef1935b35.png)

左のツリーメニューから**USB**を選択し、対象の端末を選択します。
**製品ID**(nexus7の場合は0x4ee2)をメモします。

`~/.android/adb_usb.ini`を開きます。

```bash
$ vi ~/.android/adb_usb.ini
```

メモした端末IDだけを記述して`:wq`で閉じます。

```bash
0x4ee2
```

adbサーバープロセスを再起動します。

```bash
$ adb kill-server 
$ adb start-server
```

これで端末が正常に接続できるはずです。
"conected to~"と表示されたら成功です。

```bash
$ adb connect 192.0.2.0/24:5555
connected to 192.0.2.0/24:5555
```

#5. AndroidStudioで実機ビルドしてみる

これで設定は完了です。

USBケーブルで接続している端末を抜き、いつも通りAndroidStudioでビルドボタンを押してみましょう。

![buildbtn.png](https://qiita-image-store.s3.amazonaws.com/0/41889/92009c55-75bc-24e3-42d8-fbcc0c64bd7b.png)
![Choose_Device.png](https://qiita-image-store.s3.amazonaws.com/0/41889/e9eda2da-773e-65de-ded8-30b2145109c9.png)


すると、ちゃんと端末が認識されているはずです。
これでワイヤレスで実機ビルドができるようになりました。

#6. 端末の接続を解除する

実機での開発が終わったらadbサーバープロセスを終了します。

```bash
$ adb kill-server 
```



以上です。
SEO のための検索キーワード選定

SEO しようと思った／指示されたけど、どういったキーワードをターゲットにして対策すればよいかわからないとき。

1. 商品名、業種、事業内容、会社名などからキーワードをチョイス。あと、商品の一般名詞とか。
2. それらのワードでGoogle検索
3. 「関連キーワード」を眺めて、キーワード選出
4. WebマスターツールとかGoogleAnalytics で、キーワード選出。
5. 期間限定のキーワードは除外し、通年使えるワードで絞り込み。


あと、GoogleAdWords の、運用ツール →→→ キーワードプランナー
【EC-CUBE】APIを使ってみる

EC-CUBEにはあんまりメジャーじゃないですが、
2.12からAPIが導入されています。

##一番簡単なAPIを使ってみる

まず、管理画面のシステム設定＞パラメータ設定で「API_ENABLE_FLAG」というAPIを有効にするかどうかというフラグがあるので「true」に設定します。
（※上記設定は2.13から。2.12の時は設定切り替えができずデフォルトでtrueだったはず）

そして、ブラウザに下記のようなURLを打ち込んで実行します。
```
http://{EC-CUBEのサイトのドメイン}/api/xml.php?Operation=GetVersion&Service=abc
```
実行すると使用しているEC-CUBEのバージョンをXML形式で返してくれます。

## 試しにEC-CUBEのデモサイトで使ってみる
先ほど使用したのと全く一緒のURLを実行してみます。
```
http://demo.ec-cube.net/api/xml.php?Operation=GetVersion&Service=abc
```
![xml.png](https://qiita-image-store.s3.amazonaws.com/0/74416/b113c303-64ff-0ca9-e0ee-e1573df68ae3.png)
データが出力されました。
デモサイトは2.12.5みたいですね。

他のフォーマット形式も試してみます。
先ほどのURLの「xml.php」を「json.php」に変更します。
```
http://demo.ec-cube.net/api/json.php?Operation=GetVersion&Service=abc
```
![json.png](https://qiita-image-store.s3.amazonaws.com/0/74416/38a10f3f-6095-d88f-b6a6-1eb4a31fd33f.png)
データがJSON形式で返されてくるのが確認できました。

じゃあ、今度は「php.php」にしてみます。
```
http://demo.ec-cube.net/api/php.php?Operation=GetVersion&Service=abc
```
![php.png](https://qiita-image-store.s3.amazonaws.com/0/74416/38980efc-e2a7-e8c4-0459-42567327852a.png)
シリアライズされたデータが取得できました。

## 使用したパラメータを見てみる
```
Operation
```
APIの動作を指定します。今回でいえば「GetVersion」です。
他にもAPIのOperationに指定できる値はありますが……
「data/class/api/operations」をのぞいてみるといいかも。

```
Service
```
何に使うかよくわからない任意の文字列です。
必須項目なのですが何を渡しても問題ありません。
おそらく名称がサービスなので、
サービスを指定して何かやりたかったんだと思います。

## まとめ
デフォルトで用意されている動作だけではイマイチ使いにくいAPIではありますが
自分でAPIを作れるようになると別アプリとの連携が意外と楽になったりします。
2系を使用してかつ外部連携がありそうならば、こういう機能を覚えていてもいいのではないでしょうか。
Haskellで簡単に乱数を使ってみる

Haskellで乱数というとすぐにStdGenが出てきて面倒くさいイメージがありますが
再現性を気にせず手軽にランダムな値が欲しいだけなら難しいことを考える必要はありません

以下はモンテカルロ法で円周率を求めるプログラムです。
乱数生成に使っているのは[System.Random](https://hackage.haskell.org/package/random/docs/System-Random.html)の[randomRIO](https://hackage.haskell.org/package/random/docs/System-Random.html#v:randomRIO)という[Random](https://hackage.haskell.org/package/random/docs/System-Random.html#t:Random)クラスのメソッドです

```haskell
import System.Random

trial :: Int -> IO Int
trial inner = do
    x <- randomRIO (0, 1) :: IO Double
    y <- randomRIO (0, 1) :: IO Double
    if x ^ 2 + y ^ 2 <= 1
    then return (inner + 1)
    else return inner

experience :: [IO Int]
experience = iterate (>>= trial) (return 0) 

main = do
    inner <- experience !! 10000
    print $ 4 * (fromIntegral inner) / 10000
```

これで`x, y`には0から1までのランダムなDoulbeの値が入ります
円形をキープするUIViewのアニメーションはアフィン変換を使うべし

円形のUIViewを作る時はみなさんどうしているでしょうか？
基本的には`view.layer.cornerRadius = view.size.height/2;`
としていると思います。
この場合、拡大縮小のアニメーションをviewのframeを変更させて行うと、サイズに応じてcornerRadiusの値が高さの半分にならない為アニメーション中は角丸の四角になってしまいます。

円形をキープしつつ拡大縮小を行うにはアフィン変換を使ってアニメーションさせます。

```objc:CirleView.m

    //中心をとっておきます
    CGPoint center = self.center;
    //アニメーション後のサイズにviewを設定します
    self.frame = CGRectMake(0, 0, size.width, size.height);
    //中心をあわせます
    self.center = center;
    //この時点で円形にします
    self.layer.cornerRadius = size.width/2;
    self.layer.masksToBounds = true;
    //アフィン変換を使って大きさを0%にします
    self.transform = CGAffineTransformMakeScale(0, 0);
    
    [UIView animateWithDuration:0.5 animations:^{
        //中心を合わせながら元の大きさにアフィン変換を戻していきます
        self.center = center;
        self.transform = CGAffineTransformIdentity;
    }];
```

アフィン変換することで、viewの形を維持しながら変形出来ます。

またアニメーション時はcenterを上手に使う事で無駄な計算を省く事ができますよ！
一度大きさを指定してから0%にするのが気持ち悪い人はhiddenプロパティで囲む等の対応をしてもいいかも
RectTransform の操作方法


- Anchors

	Anchors は親オブジェクトのどこを基準として配置するかを設定します。
	
	Anchors の Min と Max に違う値を設定すると、レイアウトするときに便利です。
	親オブジェクトの幅と高さが変わった時に、子オブジェクトの位置と大きさも調整されます。

- Anchor Presets

	|キー|内容|
	|:---|:---|
	|optionキー|Anchors と Pos X/Y を設定する|
	|shiftキー|Anchors と Pivot を設定する|

- その他

	|ボタン|内容|
	|:---|:---|
	|□ボタン|Rotation と Scale を変更しても、操作用の矩形表示が変わらない|
	|Rボタン|Pivotを変更すると、見た目の位置も変わる|
std::string > at()メソッド > out_of_range例外を発生させることができる

引用: C/C++ セキュアコーディング 第2版 by Robert C. Seacordら
> at()メソッドは、添字演算子operator[]と同様に振る舞うが、pos >= size()の場合はout_of_range例外を発生させる。

try、catch(out_of_range&)でcatchできるとのこと。
std::string::operator[] > 境界検査を行わない | out_of_range型例外が発生しない

引用: C/C++ セキュアコーディング 第2版 by Robert C. Seacordら

> C++は一般に、ある操作が文字列の境界外のメモリを参照するとstd::out_of_range型の例外を発生させるが、（効率を最大化けるさせるため、）添字メンバーstd::string::operator[]を使った場合はその対象とならない (つまり境界検査を行わない)。

<hr>
http://ideone.com/DeirLK
にてサンプルコードを作ってみた。

- out_of_rangeの例外についてはideoneでは"Runtime error"が発生した
- string::operator[]の方は確かに例外が発生しない
basic_stringクラス > イテレータが問題になりやすい

引用: C/C++ セキュアコーディング 第2版 by Robert C. Seacordら

> basic_stringクラスを使用した場合に問題になりやすいのがイテレータである。
... イテレータに関連する問題については、以降の節でとりあげる。

<hr>

後ろの方も読んだけど、何が問題か現段階では理解できていない。