OmniAICreator/Qiita-1.07M huggingface dataset:
mruby-requireのrun_test.rbでmrubyをビルドするDockerfile

# モチベーション

mruby-require に付属しているrun_test.rbでmrubyをビルドしてみたい！

# Dockerfile

*途中のcurlのパッケージビルドがやたらと長いので気長にビルドしてください。*

```
FROM ubuntu:latest
MAINTAINER Yoshihiko Yamanaka
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
RUN sed -i.bak -e "s%http://archive.ubuntu.com/ubuntu/%http://ftp.jaist.ac.jp/pub/Linux/ubuntu/%g" /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y --force-yes build-essential git zlib1g-dev libssl-dev libreadline-dev libyaml-dev libxml2-dev libxslt-dev ruby2.0 ruby2.0-dev rake bison
RUN apt-get install -y --force-yes libtool pkg-config autotools-dev autoconf automake cmake
RUN apt-get install -y --force-yes vim

# build curl
WORKDIR /root
RUN mkdir curl
WORKDIR /root/curl
RUN apt-get build-dep -y --force-yes curl
RUN apt-get -b source curl
# なぜかインストール出来ないパッケージがあるが、&>2 /dev/null | true でエラーを回避して、ビルドを次にすすめる。
RUN dpkg -i `ls *.deb` &>2 /dev/null | true
RUN apt-get install -y --force-yes libpcre3-dev

# making mruby-require 
RUN apt-get install -y --force-yes clang-3.5 lldb-3.5
RUN ln -s /usr/bin/clang-3.5 /usr/bin/clang
WORKDIR /root
RUN git clone https://github.com/mattn/mruby-require
WORKDIR /root/mruby-require
RUN ruby run_test.rb
VOLUME /root/mruby-require
```

# まとめ

Dockerを使ってmruby-requireのrun_test.rbを使ってmruby-requireの組み込まれたmrubyを作成しました。
UIの下だけボーダーを描く

![pic.png](https://qiita-image-store.s3.amazonaws.com/0/60014/85c132bd-94b1-31dd-0640-93971da60f3a.png)


上のアプリのButtonのように
一部だけBorderの線を足したい…。
ちょっと、試しに下線だけやってみました。

```hoge.swift
extension CALayer {
    
    // 下だけBorder
    class func drawUnderBorder(borderWidth: CGFloat, borderColor: UIColor, ui:AnyObject) -> CALayer{
        let border = CALayer()
        border.frame = CGRectMake(0.0, ui.frame.size.height-borderWidth, ui.frame.size.width, borderWidth)
        border.backgroundColor = borderColor.CGColor
        return border
    }
}
```
これで、赤い下線が足されるかと思います。

```HogeViewController.swift
"下にボーダーを足したいUI".layer.addSublayer(CALayer.drawUnderBorder(1.0, borderColor: UIColor.redColor(), ui: "下にボーダーを足したいUI"))

```
jQuery のイベントハンドラの順番を入れ替える


普通はイベントハンドラの登録順を調整すればこんなことをする必要はありませんし、jQuery の内部用 API を使うので将来動かなくなるかもしれません。（ライブラリが作る DOM 要素に、そのライブラリが登録するイベントハンドラより前に処理を挟みたくてしょうがなくやっています・・・。）

jQuery のプライベートなデータは `$._data()` で取得できるのですが、この中に jQuery 経由で登録されたイベントハンドラも入っています。

例えば `elem` という DOM 要素の `paste` イベントで「一番最初に実行される」ハンドラを追加したい場合は・・・

```js
// まずは末尾にハンドラを追加。
$(elem).on('paste', (e) => {
  // Do something...
});

// 末尾のもの（↑で追加したやつ）を先頭に！
const handlers = $._data(elem).events.paste;
handlers.unshift(handlers.pop());
```

ちなみに jQuery を介さず `addEventListener` で追加したイベントハンドラは対象外です。
CarrierWaveでユニットテスト時にurlをフェッチする

# 先に解決策

ここではRailsのファイル構成を想定

* CarrierWaveのasset_hostに適当なホスト指定（ex. http://test.statics.local）
* WebMockのstub_requestでそのホストを指定
* public以下を配信する小さなRackサーバーを実装
* stub_requestのto_rackでそのRackサーバーを指定

```rb:Gemfile
gem 'webmock', group: :test
gem 'mimemagic', group: :test
```

```rb:test/helpers/statics_server.rb
class StaticsServer
  def self.call(env)
    @root = Rails.root.join('public').to_s
    path = Rack::Utils.unescape(env['PATH_INFO'])
    file = @root + path

    if File.exists?(file)
      mime = MimeMagic.by_path(file)
      [ 200, {"Content-Type" => mime.type}, [mime.mediatype == 'text' ? File.read(file) : File.binread(file)] ]
    else
      [ 404, {'Content-Type' => 'text/plain'}, 'file not found' ]
    end
  end
end
```

```rb:test/test_helper.rb
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'

include WebMock::API
require File.expand_path('../../test/helpers/statics_server', __FILE__)

class ActiveSupport::TestCase
  # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
  fixtures :all

  # Add more helper methods to be used by all tests here...
  WebMock.allow_net_connect!
  stub_request(:get, /test.statics.local\/.*/).to_rack(StaticsServer)
end
```

```rb:config/initializers/carrierwave.rb
CarrierWave.configure do |config|
  #...
  config.asset_host = ENV['ASSET_HOST']
end
```

```rb:config/environments/test.rb
Rails.application.configure do
  #...
  ENV['ASSET_HOST'] = 'http://test.statics.local'
end
```

#問題

CarrierWaveで例えば

```rb
class User < ActiveRecord::Base
  mount_uploader :avatar, AvatarUploader
end
```

としてると

```rb
user = User.first
user.avatar.url
```

のようにアクセスできるが、
デフォだとホスト名なしで"/url/to/file.png"のような文字列が返ってくる。
（```storage :file```の場合）

ホスト名がないので以下のようにurlをフェッチすることができない。

```rb
require 'open-uri'
open(user.avatar.url) do |f|
  #...
end
```

asset_hostを設定すればホスト名がつくので

```rb
CarrierWave.configure do |config|
  config.asset_host = 'http://localhost:3000'
end
```

として```rails s```すればurlをフェッチできるけどめんどい。
なので適当なホスト名をつけたらアップロードファイルにプロキシしてくれるような機構がほしい。
PowerMockRunnerでTheoriesを使うと標準エラーが出る時の対策

PowerMockRunnerを使いながらTheoriesも使いたいときに標準エラーが出力されたので対処メモとして書きます。

・環境
junt      4.10
powermock 1.6.4
mockito   1.10.19

試しに作成したソースは下記のソースです。

```lang:PowerMockAndTheories.java
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.is;

import org.junit.experimental.theories.DataPoints;
import org.junit.experimental.theories.Theories;
import org.junit.experimental.theories.Theory;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.modules.junit4.PowerMockRunnerDelegate;

@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(Theories.class)
@PrepareForTest({System.class})
public class PowerMockAndTheories {

    @DataPoints
    public static TestFixture[] PARAMS = {
        new TestFixture("A", "B")
    };

    @Theory
    public void Theoriesを使うよ(TestFixture fixture) {
        // SetUp
        PowerMockito.mockStatic(System.class);
        PowerMockito.when(System.getenv(fixture.input)).thenReturn("B");

        // Test
        String actual = System.getenv(fixture.input);

        // Verify
        assertThat(actual, is(fixture.expected));
        PowerMockito.verifyStatic();
    }

    static class TestFixture {
        final String input;
        final String expected;

        public TestFixture(String input, String expected) {
            this.input = input;
            this.expected = expected;
        }
    }
}
```

ソースを実行するとIllegalArgumentExceptionの標準エラーが発生します。（テスト自体は成功します）
```
java.lang.IllegalArgumentException: Unable to determine method-name from description=Theoriesを使うよ(mock.PowerMockAndTheories); - ignored
	at org.powermock.modules.junit4.internal.impl.NotificationBuilder.determineTestMethod(NotificationBuilder.java:155)
	at org.powermock.modules.junit4.internal.impl.NotificationBuilder.testInstanceCreated(NotificationBuilder.java:265)
	at org.powermock.modules.junit4.internal.impl.PowerMockRunNotifier.testInstanceCreated(PowerMockRunNotifier.java:82)
```

ソースコードを見ているとテストメソッド名が変数に設定されていないようだったので、@Theoryの下に@Testを付けて実行すると標準エラーはでなくなりました。

```
    @Theory
    @Test
    public void Theoriesを使うよ(TestFixture fixture) {
        // SetUp
        PowerMockito.mockStatic(System.class);
        PowerMockito.when(System.getenv(fixture.input)).thenReturn("B");
```

標準エラーが出たままが気になる方は試してみてください。
（Parameterized.classを使えばいいだけの話かもしれませんが）
PowerMockRunnerとParameterizedを一緒に使おう

PowerMockRunnerを使っているとパラメータの値が異なるだけなのに、コピペしてテストメソッドを増やしてませんか？

@PowerMockRunnerDelegateを使うことでPowerMockRunnerを使いながらParameterizedランナーやTheoriesランナーを使うことができます。

Parameterizedランナーを使用する場合の定義の仕方は
`@PowerMockRunnerDelegate(Parameterized.class)`です。
たった1行追加するだけでParameterizedランナーが使えるようになるので、テストメソッドのコピペが不要になりますね。

サンプルソースは下記のようになります。

```lang:PowerMockAndParameterized.java
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.is;

import java.util.Arrays;
import java.util.Collection;

import org.junit.Test;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.modules.junit4.PowerMockRunnerDelegate;

@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(Parameterized.class)
@PrepareForTest({System.class})
public class PowerMockAndParameterized {

    private final String input;
    private final String expected;

    public PowerMockAndParameterized(String input, String expected) {
        this.input = input;
        this.expected = expected;
    }
    @Parameters
    public static Collection<Object[]> data() {
        return Arrays.asList(new Object[][] {
                {"A", "B"},
                {"B", "B"}
        });
    }

    @Test
    public void Parameterizedを使うよ() {
        // SetUp
        PowerMockito.mockStatic(System.class);
        PowerMockito.when(System.getenv(input)).thenReturn("B");

        // Test
        String actual = System.getenv(input);

        // Verify
        assertThat(actual, is(expected));
        PowerMockito.verifyStatic();
    }
}
```
UIの上だけ角丸にする実装

Buttonの上だけ角丸にしたかったので、いろいろ試してみました。
以下のExtensionを追加してください。

```hoge.swift
extension CAShapeLayer {

    // UIの上だけ角丸
    class func drawTopCornerRadius(radius: CGFloat, ui:AnyObject) -> CAShapeLayer {
        let corners: UIRectCorner = [.TopLeft, .TopRight]
        let maskPath = UIBezierPath(roundedRect: ui.bounds,
                                            byRoundingCorners: corners,
                                            cornerRadii: CGSize(width: radius, height: radius))
        let maskLayer = CAShapeLayer()
        maskLayer.frame = ui.bounds
        maskLayer.path = maskPath.CGPath
        return maskLayer
    }
}
```

角丸にしたいUIの .layer.mask に渡してあげるとできました。

```HogeController.swift
"角丸にしたいUI".layer.mask = CAShapeLayer.drawTopCornerRadius(10.0, ui: "角丸にしたいUI")
```
ホスト名を指定してアクセスできるようにする

Avahiを使う。


インストール方法

```
$ sudo apt-get install avahi-daemon 
```

ホスト名(/etc/hostname)が、raspberrypi なら、raspberrypi.local で接続できるようになる。

```
$ ssh pi@raspberrypi.local
```

が、自分の環境ではすでにインストール済みでした。。

```
$ uname -a
Linux raspberrypi 4.1.19-v7+ #858 SMP Tue Mar 15 15:56:00 GMT 2016 armv7l GNU/Linux
```
slack での検索マイクロ技

slack.app で検索する時、右上の Search 使うと `in:#general` とか手打ちしないとだめだが、そのチャンネルで ⌘(コマンド)+f すると、自動的にその時のカレントチャンネルが in: してくれる。

という技をさっき知った。

ちなみに

`/search` コマンドでも検索窓へ行けるがこの時は `in:#..` は自動でついてくれない。

だた、

`/search in:#general hoge`

と打てば全然問題ない。
名前付きパイプとdup2

子プロセスのstdoutとstderrを、名前付きパイプにつないで、
子プロセスの出力結果を親プロセスで読む。

以下の例では、子プロセス自体でstdoutとstderrに文字列を送って、
その後execし、別のプログラムを実行している。

```c:a.c
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>

const char Fifo[] = "/tmp/test.fifo";

void child() {

    // テストとして、5秒待っている。
    // ここで5秒待っているが、親プロセスの
    // openの処理が即座に終わっていることを確認して欲しい。
    // 仮に、親プロセスのopenを、ブロッキングモードで開いた場合、
    // 親プロセスのopenは、この5秒を待ってから終了する。
    sleep(5);

    printf("[%d]: fopen start.\n", getpid());
    FILE* fp = fopen(Fifo, "w");
    printf("[%d]: fopen end.\n", getpid());

    dup2(fileno(fp), STDOUT_FILENO);
    dup2(fileno(fp), STDERR_FILENO);
    fclose(fp);

    write(STDOUT_FILENO, "stdout test.\n", 13);
    write(STDERR_FILENO, "stderr test.\n", 13);

    execl("/bin/cat", "/bin/cat", "/tmp/test.txt", NULL);
    exit(1);
}

int main(void) {

    mkfifo(Fifo, 0666);

    pid_t pid = fork();

    if (pid == 0) {
        child();
    } else if(pid < 0) {
        return 1;
    }

    int fd;

    printf("[%d]: open start.\n", getpid());

    // openの処理は、O_NONBLOCKを渡すと、待たずに返ってくる。
    // O_NONBLOCKなしでopenした場合、書き込み側がopenしてくれるまで
    // ここでブロックされることになる。
    // 仮に、読み込み側が先にopenし、書き込み側が、
    // 何かの理由でopen出来なかった場合、デッドロックする。
    // 読み込み側も、openできなかった場合は書き込み側にkillを投げる等
    // 対策が必要。とにかくデッドロックの危険があることは意識すること。
    fd = open(Fifo, O_RDONLY | O_NONBLOCK);
    if (fd == -1) {
        printf("%s\n", strerror(errno));
        kill(pid, SIGKILL); // 本当はちゃんと、最初はterm投げてから、、とかやったほうが良い。。
        waitpid(pid, NULL, 0);
        return 1;
    }

    printf("[%d]: open end.\n", getpid());

    char msg[256];

    // 子をwaitpidで回収できた後、
    // readをした結果が0以下となるなら、
    // もう読むものは無いので、終了する。

    // 以下の結果の回収ループは、子が即座に終了した場合でも、
    // 1秒は待ってから終了する。

    // 子の開始と終了の時間がシビアに必要になる場合、
    // ノンブロッキングの処理をせずに、
    // デッドロックが起きないよう、細心の注意を払いながら
    // プログラムを書く必要がある。pollやselectを使って。

    while (1) {
        ssize_t r = read(fd, msg, 256);
        if (r > 0) {
            msg[r] = '\0';
            printf("msg=%s", msg);
        } else {
            if (pid == -1) {
                break;
            }
            if (waitpid(pid, NULL, WNOHANG) == pid) {
                pid = -1;
            }
            sleep(1);
        }
    }

    close(fd);

    return 0;
}

```

<pre>
[root@todanano ~]#
[root@todanano ~]# gcc a.c
[root@todanano ~]# ./a.out
[14417]: open start.
[14417]: open end.
[14418]: fopen start.
[14418]: fopen end.
msg=stdout test.
stderr test.
/bin/cat: /tmp/test.txt: No such file or directory
[root@todanano ~]#
[root@todanano ~]#
[root@todanano ~]# echo "abc123" > /tmp/test.txt
[root@todanano ~]#
[root@todanano ~]# ./a.out
[14421]: open start.
[14421]: open end.
[14422]: fopen start.
[14422]: fopen end.
msg=stdout test.
stderr test.
abc123
[root@todanano ~]# ll /tmp/test.fifo
prw-r--r-- 1 root root 0 Apr  1 17:35 /tmp/test.fifo
[root@todanano ~]#
[root@todanano ~]#
[root@todanano ~]#

</pre>

やっていることを見やすくするために、諸々エラーチェックを省いているので、
実際に使うときは、必要に応じてエラーチェックしてください。


2016/04/01 追記
ブロッキングの問題を考慮して、ノンブロッキングで読むようにした。
urllib2からの接続にTorを使う[Python][Mac]

## Torとは
TorはIPアドレスを自身のアドレスを他のアドレスに偽装することができます。
これは非常に良く出来ており、犯罪などに悪用されているほどです。
悲しいことに日本の警察では手がかりにIPアドレスしかない状態になると犯人をほぼ確実に見つけれれません。ここ最近のTorを使用していた犯罪者がよく逮捕されていますが、恐らくIPアドレス以外から手がかりを見つけたのでしょう。

##Torのインストール
Macの人は
HomeBrewからインストールできます。

```
brew install tor
```
HomeBrewのインストールコマンド

```

usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

```

## Torの起動

```
tor
```

100%起動できた場合、ターミナルに
```
Xxx XX XX:XX:XX.XXX [notice] Bootstrapped 100%: Done
```
と表示されます(Xは文字または数字)

## PythonからTorを使う。
Torは起動すると、socks:localhost:9050から接続することで使用できます。
Pythonではurllib2のみでは指定はできないのでPySocksを使用します。
インストールコマンドは

```
pip install PySocks
# or
sudo easy_install PySocks
```
Pythonから使用する場合のコード

```py
import urllib2, socket, socks

class Tor:
	def __init__(self):
		socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, '127.0.0.1', 9050)
		socket.socket = socks.socksocket
	def test(self):
		return urllib2.urlopen("https://api.ipify.org?format=json").read()
		
if __name__ == "__main__":
	Tor = Tor()
	ip = Tor.test()
	print ip # Torを経由したIPアドレスが表示される。
```
PHP開発環境用　メール送信内容をログに残す

開発環境用にメールの送信内容をログに残すようにしたので、備忘録を兼ねて

## 環境

OS:centOS6.7 (vagrant)
Apache:2.4
PHP5.5(php-mbstringもインストール)

## メール送信用のスクリプトを用意

[ここ](https://staff.washington.edu/curreri/send-email-log-file-instead-sending-it/)を参考に一部変更
/usr/local/bin/sendMaiDevに保存

```
#!/usr/bin/php

<?php
$logfile = '/var/tmp/mail/mail.log-'.date('Y-m-d'); //ログファイル名 1日ごとにファイルを分ける
shell_exec('touch '.$logfile);                      //ファイルが存在しないときのために、touchしておく
//* Get the email content
$log_output = "****" . date('Y-m-d H:i:s') . "****" . PHP_EOL;
$handle = fopen('php://stdin', 'r');

while(!feof($handle))
{
    $buffer = trim(fgets($handle));
    $log_output .= $buffer . PHP_EOL;
}
//* Write the log
//そのまま出力すると文字化けがひどいのでコンバート
//私の環境ではISO-2022-JPになってましたがご自身の環境に合わせて変えてください
file_put_contents($logfile, mb_convert_encoding($log_output, 'UTF-8', 'ISO-2022-JP'), FILE_APPEND);
?>
```

忘れずに実行権限を付与しましょう

`sudo chmod a+x /usr/local/bin/sendMaiDev`

## php.ini修正

php.iniの747行め付近、sendmail_pathを先ほど作成したスクリプトのパスにします

```
[mail function]
; For Win32 only.
SMTP = localhost
smtp_port = 25

; For Win32 only.
;sendmail_from = me@example.com

; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").
sendmail_path = /usr/local/bin/sendMaiDev

; Force the addition of the specified parameters to be passed as extra parameters
; to the sendmail binary. These parameters will always replace the value of
; the 5th parameter to mail(), even in safe mode.
;mail.force_extra_parameters =
```

修正したらApache再起動

`sudo service httpd restart`

以上でPHPから送信したメールがテキストファイルに出力されます。
【備忘録】Cakephp、componentのinitializeメソッド

コンポーネントAからコンポーネントBを呼び出した場合、コンポーネントBのinitializeメソッドは呼び出されない。
が、コントローラにおいて、

```controller.php
 public $components = array('Paginator', 'Session', 'コンポーネントB');
```

と記載していると、initializeが呼ばれる。これが何を意味するかというと、コントローラを次のように変更した場合：

```controller.php
 public $components = array('Paginator', 'Session');
```

コンポーネントAからinitializeメソッドを明示的に呼び出す必要が出てくる。
Raspberry PiにAsteriskをインストールする

### SDカードにイメージを書き込む

### 起動

### SDカードの使用領域の拡張

### IPアドレスを固定

#### /etc/dhcpcd.confを編集

    interface eth0
    static ip_address=192.168.XXX.XXX/24
    static routers=192.168.XXX.1
    static domain_name_servers=XXX.XXX.XXX.XXX

### Raspbian に asterisk と spandsp をインストール

    sudo su
    apt-get -y install asterisk libtiff5-dev
    cd /usr/src
    wget https://www.soft-switch.org/downloads/spandsp/snapshots/spandsp-20160212.tar.gz
    tar xvf spandsp-20160212.tar.gz
    rm -f spandsp-20160212.tar.gz
    cd spandsp-0.0.6
    ./configure
    make
    make install
    ldconfig


### /etc/asterisk/sip.confを編集
### /etc/asterisk/extensions.confを編集

### 設定内容の反映と確認

    asterisk -vvvvvr
    raspberrypi*CLI> module show like res_fax_spandsp.so
    raspberrypi*CLI> dialplan reload
    raspberrypi*CLI> sip reload
    raspberrypi*CLI> sip show peers
すぐ忘れちゃうCSS

普段使わないので
すぐ忘れちゃうので
コードで落書き

###■長いテキストをコンパクトに
```
width: 300px;
height: 30px;
line-height: 30px;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;

result : てすとですてすとで...
```

##マウスオバーして線を薄い→濃いに表示する
```
div {
  border: #ffffff 1px solid;
  transition: all .2s;
  -webkit-transition: all;
  -moz-transition: all .2s;
  -o-transition: all .2s;
  -ms-transition: all .2s;
}
div:hover {
  border: #000000 1px solid;
}
```

##margin/paddingの使い方
```
margin-top: 1px;
margin-left: 1px;
margin-right: 1px;
margin-bottom: 1px;
padding-top: 1px;
padding-left: 1px;
padding-right: 1px;
padding-bottom: 1px;

又は

margin: 1px 0 0 0;
padding: 0 0 1px 0;

4つの数字の左からtop/right/bottom/left順です。
```

##グラデーション
```
div {
  height: 340px;
  background: linear-gradient(#c9d5e1 0%, #ffffff 55%);
  background: -webkit-linear-gradient(#c9d5e1 0%, #ffffff 55%);
  background: -moz-linear-gradient(#c9d5e1 0%, #ffffff 55%);
  background: -o-linear-gradient(#c9d5e1 0%, #ffffff 55%);
}
```

随時追加...
【Git】ローカルの修正を前回のcommitまで戻す方法

#やりたいこと(想定シーン)
修正してaddしたり、または未addだったりの状態で、やっぱり修正必要なかったなぁって場合に前のcommit状態に戻したい。

#まとめて戻す方法
未add(ワーキングツリーのみ存在)、add済み(ワーキングツリー&インデックス存在)に関わらずこれですべて戻すことができる。

```
git reset --hard HEAD
```

#####解説
--hardオプションでインデックス、ワーキングツリー全てを戻す。
HEADは最新のcommit idのエイリアス。前回のcommitまで戻したいのだから、HEADを指定する。

※もちろんUntrackedは対象外。Untrackedを消したい場合は、コメントで教えてもらった「git clean -f」を使う。もしくは、「git add .」して一旦管理下に入れて上記を行う。

#ファイル単位で戻す方法
--hardオプションはファイルを指定できないため。

###対象がadd済みファイル(インデックス&ワーキングツリーに存在)
まずインデックスを戻して、次にワーキングツリーを戻す。

```
git reset HEAD <file>
git checkout <file>
```

###対象が未addファイル(ワーキングツリーのみに存在)
ワーキングツリーを戻す。

```
git checkout <file>
```

#参考
より詳細に知るにはこちらを見ることおすすめ
[[git reset (--hard/--soft)]ワーキングツリー、インデックス、HEADを使いこなす方法](http://qiita.com/shuntaro_tamura/items/db1aef9cf9d78db50ffe)
git > バージョンTagをどこまで残すのか > git タグの付け替え > $git tag v2.0 v1.0 > foo/barタグ / {old}/v0.3.2タグ

## バージョンタグが多い問題

gitでバージョン管理をしている中、ふと思った疑問。

> バージョンTagをどこまで残すのか。

SourceTreeの左側のメニューでタグというのがあるが、バージョンタグが増えていく中で、タグメニューの閲覧性が悪くなっている（３ページ分のタグがあるプロジェクトもある）。

v1.0.8 あたりの作業をしているなかでは v0.3.2 あたりのものはもはや不要と割り切って古いタグを消すかどうか。

古いタグは SourceTree のタグメニューに表示されないような機能がSourceTreeにあればいいようにも思う。

## tagの付け替え
gitタグの付け替えができるようだ。

http://blog.nambo.jp/2014/06/24/git-tag-rename/

> $ git tag v2.0 v1.0

リストの下の方にinactiveなタグ(古いバージョンタグ)がくるようにタグ名付けをしなおすかどうか。
そうして管理しておけばactiveなタグが上位に来て、スクロールしなくて済む。

## フォルダ

@mono0926 さんのコメントが非常に参考になります。
Pivotal Tracker | 使いにくい Pivotal を少しでも使いやすくする 幾つかの方法


## ダブルクリックでストーリーを開く ( Escで閉じる )

この鬼のように小さい三角ボタンを押さなくても。
ストーリー名をダブルクリックすれば開ける。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/3f3497d0-a5bc-dd25-92a4-7ac162f952d7.png)

あとは適当な領域をクリックしてから Esc キーを押すと、ストーリーを閉じられる。


## サイドバーを小さくする

左上のハンバーガーアイコン ( ![image](https://qiita-image-store.s3.amazonaws.com/0/90607/6b475bb4-36fc-35b4-dc90-5704a9770091.png) ) をクリックすると、メニューを小さく出来る。
画面を余裕を持って使える。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/538eed45-95ab-0283-76d6-f4612b461cef.png)

↓

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/22bdecc2-a996-38b1-4e3f-ec1418c01356.png)


## トグルのショートカット

それぞれ、ショートカットでタブを開閉できる。

- Shift + C : Current
- Shift + B : Backlog
- Shift + I : IceBox
- Shift + L : Label
- Shift + W : My Work

## My Work を使う

意外と便利なので使う。
自分が担当しているストーリーを一覧できる。

## 他のショートカットも使う

よろしければどうぞ。
`Shift + ?' でいつでもショートカット一覧が見られます。(種類は少ない)

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/0d869dfd-ccb5-a3c6-3298-b0289e49741b.png)

# 環境

- Mac OS X Yosemite
- Google Chrome 49.0.2623.87 (64-bit) 



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
AquesTalkフレームワークで音声合成 Objective-C編

[こちらの記事](http://qiita.com/nyaqu/items/2bb32c6c5cb065bca791)で、SwiftでAquesTalkまたはAquesTalk2フレームワークを使う方法を書きましたが、今回はObjective-Cで使う方法です。
AquesTalkフレームワーク自体はSwiftで書かれているので、幾つかの点を注意すればObject-Cからも簡単に呼び出せます。

**Objective-CからAquesTalk.frameworkを呼び出すときのポイント**

- EMBEDDED_CONTENT_CONTAINS_SWIFTをYesに
- 変数上(NSData型)に音声データを生成するsyntheメソッドが使えない

#導入方法
フレームワークの追加とヘッダのimportの他に、オプションの設定が必要です。
###**1. フレームワークをプロジェクトに追加**
AquesTalk iOSをダウンロードして、このzipファイルを展開しておきます。
ダウンロードしたパッケージ内のAquesTalk.frameworkを、
プロジェクトSetting画面＞Generalタブ＞Embedded Binariesに追加します。
この時、Copy items if neededをチェックし、フレームワークをプロジェクトにコピーする方が簡単です。

###**2. import**
使用するクラスの先頭でAquesTalkフレームワークをimportします。

```Objective-C:ViewController.m
#import "ViewController.h"
#import <AquesTalk/AquesTalk-Swift.h>
```

###**3. Build Settingの変更**
ターゲットSetting画面＞Build Settingsにて
`EMBEDDED_CONTENT_CONTAINS_SWIFT`をYesに変更します。
これをしていないと実行時に`dyld: Library not loaded: @rpath/libswiftCore.dylib`というエラーで落ちます。
ちなみに、この設定はSwiftの標準ライブラリをアプリバンドルにコピーするオプション設定です。

###**4. playメソッドをコール**
あとは、任意の場所にplayメソッドを記述するだけです。
引数の文字列には、漢字の文字列を記述できません。
かな表記の読み記号とアクセントなどで記述した[音声記号列](http://www.a-quest.com/download/manual/siyo_onseikigou.pdf)を指定します。

```Objective-C:ViewController.m
- (IBAction)obplayButton:(id)sender {
    [AquesTalk play:@"ゆっくりしていってね" speed:100 notification: nil];
}
```

#その他の機能

###**1. 話速を変える**
引数speedに50から200までの値を指定して話す速度を変更できます。値を小さくすると遅くなります。デフォルトは100で省略できます。

```Objective-C
[AquesTalk play:@"ゆっく'り/はっせーしま'す" speed:50 notification: nil];
```

###**2. 発声を止める**
メソッドstopの呼び出しで、発声の途中で終了することができます。

```Objective-C
    [AquesTalk stop];
```


###**3. 発声の終了タイミングを知る**
引数notificationにNSNotificationを指定すると、発声終了のタイミングでそのNotificationが発生します。これにより、発声終了時に何か処理を行うことができます。
次のコードは、発声開始時にラベルを"Playing..."にし、発声終了後"Done"にする例です。

```Objective-C:ViewController.m
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    // Notificationの登録　発声終了を検知しなければ不要 メソッド名やnameは任意で
    [[NSNotificationCenter defaultCenter]
     addObserver:self
     selector:@selector(daDone:)
     name: @"AquesTalkDaDoneNotify"
     object:nil];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:YES];
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

- (IBAction)play:(id)sender {
    //終了通知イベントの作成　name部分はNSNotificationCenterに設定した値に合わせる
    NSNotification *notifi = [NSNotification notificationWithName:@"AquesTalkDaDoneNotify" object:self userInfo:nil];
    onPlayLabel.text = @"Playing...";
    [AquesTalk play:@"ゆっくりしていってね" speed:100 notification: notifi];
}

- (void)daDone:(NSNotification*)notification
{
    onPlayLabel.text = @"Done";
}
```

###**4. その他**
他には、発声中の有無を返す`isPlay`メソッドがあります。
また、Swiftで使える、音声再生せずにNSDataにwavフォーマットのデータを返す`synthe`メソッドは使えません。これは、inoutを使った参照渡しの関数がObjective-Cから呼び出せないという現在の仕様によるものです。

#Links

[AquesTalk iOS 評価版ダウンロード](http://www.a-quest.com/download/index.html)
評価版は、ナ行、マ行がヌになる制限があります。個人が非営利で使う場合など、アクエストの個人利用の規定に従えば登録料のみで製品版のライブラリが入手できます。詳細はライセンスのページを参照。

[音声記号列仕様書](http://www.a-quest.com/download/manual/siyo_onseikigou.pdf)
playメソッドで読み上げる文字列（音声記号列）の書き方はここに規定されています。
Macでシェルスクリプトをダブルクリックで実行

### シェルスクリプトをダブルクリックで実行できると割りと便利なので、その方法をメモ

今回実行するスクリプト

```hello.sh
echo 'hello world!'
```

普通に実行しようとするとエラーがでるので実行権限を与える

```shell-session
# そのまま実行しようとすると権限で弾かれる

$ ./hello.sh

#-> zsh: permission denied: ./hello.sh

# 実行権限を与える

$ chmod +x hello.sh
$ ./hello.sh

# -> hello world!
```

`⌘`+`i` もしくは右クリックから`情報を見る`で`ターミナル`もしくは`iTerm`で開くを選択

これでダブルクリックでシェルスクリプトが実行できるようになる

```shell-session
$ /Users/username/path/to/script/hello.sh ; exit;
hello world!

[Process completed]
```

追記
拡張子を`.command`に変更する方法もあるらしい

```shell-session
# ファイル名を変更
$ mv hello.sh hello.command

# コピーする場合
$ cp hello.sh hello.command
```
Sublime text | 「複数選択」(マルチカーソル) で行き過ぎた時に、戻るショートカットは Ctrl + U

- Windows : `Ctrl + U`
- Mac : `Command + U`

**「Undo の U」**と覚えれば良い。

すぐ忘れるし、検索で引っかかりにくいのでメモ。

# 参考

 - http://www.buildinsider.net/small/sublimetext/02



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
Unityのログファイル（Editor.Log）を直接エディタで開く

Unityのコンソールではログの検索ができない（&情報少ない）ようなので、直接ログファイルを見ることにした。
<img width="1046" alt="スクリーンショット 2016-03-28 17.11.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/6380/bf6e1343-6643-373f-41ea-b9541540fb9f.png">
# Macのコンソールアプリで開く
UnityのConsoleウインドウ右上のメニューから「Open Editor Log」を選択。
<img width="238" alt="スクリーンショット_2016-03-28_17_11_12.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/6380/b6b780b5-fea6-353a-bfa2-24940e15b929.jpeg">

Macの場合、標準のコンソール（Console.app）でログが開かれる。
<img width="1066" alt="スクリーンショット 2016-03-28 17.11.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/6380/02af06c2-f5c7-066a-4eac-b853af04d88e.png">
検索もできるし、Unity自体が吐いたログも見れるみたい。
# Editor.Logをエディタで開く
検索するだけならコンソールアプリでも十分そうだけど、やっぱり慣れたエディタで触りたいのでログファイル本体を直接開くことに。

公式マニュアルによると「Editor.log」ってのが本体らしい。
http://docs.unity3d.com/ja/current/Manual/LogFiles.html

各環境での格納場所は以下のとおり。

| OS | パス |
|:------------|:------------|
| macOS       |        ~/Library/Logs/Unity/Editor.log |
| Windows       |        C:\Users\username\AppData\Local\Unity\Editor\Editor.log |

（XPはもうええやろ…）

macOSの場合。
<img width="771" alt="スクリーンショット 2016-03-28 17.12.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/6380/e63527c0-f25d-240f-e7ef-3995b6c2eb0f.png">

このEditor.logをお好みのエディタで開けばおk。
<img width="1092" alt="スクリーンショット 2016-03-28 17.30.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/6380/1d3540fa-aa26-c34a-4bfa-69f65dcb96a3.png">

当たり前だけど表示内容はコンソールアプリで開いたのと一緒。
yield + setTimeoutの謎を追う

## 子曰く

http://qiita.com/tanakahisateru/items/9b937989c0ef5345ff9e#comment-6ac9cbb42bac84c3eba4

これでsleep良い感じに書けるぜ。

```js
var co = require('co');

function sleep(ms) {
  return function (cb) {
    setTimeout(cb, ms);
  };
}

// var sleep = require('co-sleep');

co(function *() {
  for (var i = 0; i < 5; ++i) {
    console.log('message1 - ' + i);
    yield sleep(1000);
    console.log('message2 - ' + i);
    yield sleep(1000);
    console.log('message3 - ' + i);
  }
  return 'final value';
});
```

## 私、理解できず Node.js v4.2.6で試す

```
> function sleep(msec) {return function(cb){ console.log("xxxxx",cb);}}

> co(function*(){yield sleep(1000);}).then(function(){console.log("end")})
```

こうしてみたら、

```
xxxxx function (err, res) {
      if (err) return reject(err);
      if (arguments.length > 2) res = slice.call(arguments, 1);
      resolve(res);
    }
```

こんなん来ました。

## なるほど

https://github.com/tj/co/blob/master/index.js#L134-L143
要するにcoがyieldを処理するときにPromiseなFunctionを暗黙に渡してくるようです。

## Thunk? Thunk? モニカ?

```js
  return function (cb) {
    setTimeout(cb, ms);
  };
```

これにはthunkというシャレオツな名前が付いているのを知りませんでした。

https://github.com/tj/co#yieldables

を見るとcoが取り扱えるyieldableとしてthunkも入っており、上記でリンクした`thunkToPromise`がPromiseに変換してくれるようです。

## でも

悩むから、冗長ですがこう書こうと思いました。

```js
function sleep(ms) {
  return new Promise(function(resolve) {
    setTimeout(function() {
      resolve();
    }, ms);
  });
}
```
MAMPでApacheのアクセスログを表示する方法

- OSはMac OS x
- まずhttpd.confを編集
 - ```vim /Applications/MAMP/conf/apache/httpd.conf```
  - #CustomLog で検索
     - ```#CustomLog "/Applications/MAMP/logs/apache_access.log" combined```
      - と記述されている場所が見つかるのでコメントアウトを外す
- apache 再起動
 - GUIでもCUIでも
- localhost:8888以下の任意のファイルにアクセス

- less /Applications/MAMP/logs/apache_access.log
    - でログが記録されていることを確認
Bootstrap 4のCSSコンパイルをGulpで管理する方法

Twitter社製UI作成フレームワークBootstrapの最新版「[Bootstrap 4](http://getbootstrap.com/)」では、SassをベースにしたCSS設計が可能です。Bootstrap 4にデフォルトで準備されているタスクランナーはGruntですが、**簡潔な記述でかつ高速な処理が可能なGulpの方が今は人気で、Bootstrap 4のCSSコンパイルタスクもGulpで管理したい**ところです。本エントリーでは、Bootstrap 4のCSSコンパイルタスクをGulpで管理する方法を紹介します。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/27ea2fa0-b7be-5847-56fd-10e8cc767bb1.png)
▲ GulpとGruntをGoogleトレンドで検索した結果。赤がGulp。（カテゴリ:コンピュータ、家電製品）


#ソースファイルのダウンロードとGulpの準備
[ダウンロードページ](http://v4-alpha.getbootstrap.com/getting-started/download/)の[Source files]より、Sassを含むファイル一式をダウンロードし、任意の場所に展開します。展開した場所でターミナルを起動し、Gulpを使う準備をします。Gulpの基本的な設定方法については記事「[5分で導入！ タスクランナーGulpでWeb制作を効率化しよう - ICS MEDIA](https://ics.media/entry/3290)」を参照してください。

```bash
npm init -y
npm i -D gulp
```


Sassをコンパイルするためにgulp-sassをインストールします。

```bash
npm i -D gulp-sass
```

Bootstrap 4では、面倒なベンダープレフィックス付与を自動で設定してくれる「[Autoprefixer](https://github.com/postcss/autoprefixer)」を採用していますので、こちらも併せてインストールしておきます。Autoprefixerについては記事「[CSSベンダープレフィックス(-webkit-)を今この瞬間に辞める為のAutoprefixerの導入とお薦め設定](http://qiita.com/tonkotsuboy_com/items/377913c51b1ac00deffe)」を参照してください。


```bash
$ npm i -D gulp-autoprefixer
```

#CSSコンパイルタスク
環境の準備が終わったら、Bootstrap 4のCSSコンパイルをGulpで管理するためのタスクを記述します。`gulpfile.js`というJavaScriptファイルを新規作成し記述しておきます。

**Bootstrap 4のSassは複数のscssファイルから構成されています。各ファイルはscssフォルダ以下に格納されており、「bootstrap.scss」が全てのファイルをインポートしています**。したがって、bootstrap.scssをCSSにコンパイルし、Autoprefixerにてベンダープレフィックスを付与すればよいです。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/bf81983f-e133-4ca0-9f6e-f233b59c34ef.png)

▲ Sassファイル群

##CSSをコンパイルするタスク
では、Bootstrap 4のSassファイルをCSSにコンパイルする下記のタスクを作成しましょう。

1. SassをCSSにコンパイル
2. ベンダープレフィックスを付与
3. cssフォルダに出力

```js:gulpfile.js
// 必要なプラグインを読み込む
var gulp = require('gulp');
var sass = require('gulp-sass');
var autoprefixer = require('gulp-autoprefixer');

// Sassをコンパイルするタスク設定
gulp.task("default", function () {
	gulp.src('scss/bootstrap.scss') // コンパイル対象のSassファイル
		.pipe(sass())           // コンパイル実行
		.pipe(autoprefixer())   // ベンダープレフィックスの付与
		.pipe(gulp.dest('css/')); // cssフォルダに出力
});
```

タスクの記述後、下記コマンドにてSassファイルのコンパイルが行われ、cssフォルダに出力されます。

```bash
$ gulp
```


##ファイルの更新を監視し、Sassをコンパイルするタスク
Sassファイルを更新する度に手動でコンパイルを実行する必要があって不便です。そこで、Sassファイルの更新があった場合に自動でコンパイルが実行されるようにしてみましょう。

```js:gulpfile.js
gulp.task("default", function () {
	// scssフォルダを監視し、変更があったらコンパイルする
	gulp.watch('scss/*.scss', function() {
		gulp.src('scss/bootstrap.scss')
			.pipe(sass())
			.pipe(autoprefixer())
			.pipe(gulp.dest('css/'));
	});
});
```

#Bootstrap 4もGulpでタスク管理しよう
GruntとGulpはどちらが優れているというわけではありませんが、GulpはGruntに比べていくつか使いやすい点があります。人気もGulpの方が優っている今、Bootstrap 4もGulpでタスク管理するのがお薦めです。
Raspberry Pi セットアップマニュアル（備忘録）Part 4

今後の再セットアップやメンテ時に役立つよう、作業記録をマニュアル化したいと思い作成した自分用の備忘録メモ的な記事です。
##**Raspberry Pi セットアップマニュアル（備忘録）Part 4**
#####**〜VNC接続で画面共有〜**
-----
######使用機種・環境（2016年3月現在）
```
Raspberry Pi 2 B+
OS:Raspbian Jessie（NOOBS 1.8.0にてインストール）
microSDカード：32GB（class10）
USBキーボードとUSBマウス（インストールおよび初回起動時に必要）
USBメモリ(16GB) （外付けhdd的用途で使用予定）
micro USBケーブルとUSB電源アダプタ
※電源アダプタはスマホ充電用のものとかでOK。あるいはPCのUSB端子でもいける。

母艦PC／Mac mini (Late2012)
OS:OS X El Capitan 10.11.3
```
-----

#####**SSH接続〜TightVNCインストール**

Macのターミナルから、前回設定したsshで Raspberry Pi にログインする。

```cmd
~ (user名)$ ssh pi@192.168.1.210
pi@192.168.1.210 password:
```

引き続きMacのターミナル内で Raspberry Pi の操作。

まず _sudo apt-get update_ と _sudo apt-get upgrade_ を実行後、 TightVNC ( tightvncserver ) をインストールする。

```
pi@raspberrypi:~ $ sudo apt-get install tightvncserver
```

念のため再起動して少々時間を置いてから再びssh接続

```
pi@raspberrypi:~ $ sudo reboot
Connection to 192.168.1.210 closed
~ (user名)$ ssh pi@192.168.1.210
```

-----
#####**tightvncserver 初回起動と設定**

tightvncserver を起動。

```
pi@raspberrypi:~ $ tightvncserver
```


パスワードを設定。

```
You will require a password to access your desktop

Password: 任意のパスワードを作成して入力（半角英数8桁）
Verify: 確認のためもう一度入力
```

パスワード設定後、「view-only用のパスワードにしますか？」という旨の次の一文が現れる。

```
Would you like to enter a view-only password (y/n)
```

**ここでは n (no) を入力。**

y (yes) にすると view-only 用パスワードに設定されてしまい
共有画面上のデスクトップ操作できなくなるので注意！

設定完了後、次のような一文が表示され、末尾共有画面の番号が表示される。

```
New 'X' desktop is raspberrypi:1
```

**この場合 :1 になっている。Macからの接続の際に必要なので忘れないこと。**
（場合によって数字が:2など違うこともある）

#####**Macからの接続**

>Macからvnc接続するには
**vnc://192.168.1.210:590x**
というアドレスになる。
末尾 590x の **x の部分が先ほどの raspberrypi:1 の 1 になるので、5901**。

_Macのメニューバー > 移動 > サーバへ接続_
>サーバーアドレス欄に
_vnc://192.168.1.210:5901_

"192.168.1.210:5901 のパスワード" 入力のダイアログに変わるので、
先ほど設定した tightvncserver のpasswordを入力して接続。

![2016-03-28_16_09_59.png](https://qiita-image-store.s3.amazonaws.com/0/115994/c4f195ac-44e3-07d7-b0c1-dd51f1dea998.png)


以後、基本的にMacからは SSH でのターミナル操作をメインとし、必要に応じて画面共有で操作する。
なお、画面共有する場合は SSH 接続の度に

```
pi@raspberrypi:~ $ tightvncserver
```

を実行してして同じように接続する。

今回は以上。
シェルでメールアドレスの形式をチェックする（正規表現）

何故か結構苦戦してしまった。
やりたいことは下記設定ファイルを読み込んで、メールアドレス部分をチェックするというもの。

``` userlist.conf
user1 user1@test.co.jp
user2 user-2@test.co.jp
user3 user_3@test.co.jp
```

まずは失敗例

```test.sh
#!/bin/bash
LIST=./userlist.conf
while read F1 F2
do
  if [ $(echo ${F2} | egrep -e '[-\w\d_]+\@[-\w\d_]+\.+[-\w\d_]+') ]; then
      echo "match!"
  else
      echo "no match!"
  fi
done < ${LIST}
exit 0
```

実行結果は"no match!"が表示されてうまくいかない...

いろんなところをめぐって、最終的に成功したものはこちら

```test.sh
#!/bin/bash
LIST=./userlist.conf
while read F1 F2
do
  if [ $(echo ${F2} | egrep -e '^[a-zA-Z0-9_\.\-]+?@[A-Za-z0-9_\.\-]+$') ]; then
      echo "match!"
  else
      echo "no match!"
  fi
done < ${LIST}
exit 0
```

個人的にはうまくいかなかった箇所は@マークかな...とは思うのだが（@をつけると何故か失敗しだした）
成功したほうは大して変わりないように見える...（\w\dが問題だった？）

原因究明はおいおいということで
Deviseを使うときに書いていたaction_mailer.default_url_optionsの意味

**Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true**

のエラーが出てきたのでメモ。

## Document翻訳
元のDocument(http://api.rubyonrails.org/classes/ActionMailer/Base.html )から以下引用

> URLs can be generated in mailer views using url_for or named routes. Unlike controllers from Action Pack, the mailer instance doesn't have any context about the incoming request, so you'll need to provide all of the details needed to generate a URL.

(訳：mailerのviewでurl_forやルートを使ってurlを生成することができるけど、普通のコントローラと違って、メーラークラスに送られてくるリクエストには何もコンテキストを持っていない(つまりどのアクションとか、コントローラがそのリクエストを送っているか、とかもっと言えばホスト名とか！)ので、自分でその情報をmailerのviewに教えてあげないといけないよ！)


## 説明
ローカルの設定ファイルに

```lang:config/environment/development.rb
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
```
とおまじないのように書いていたと思いますが、

それは、deviseがpasswordの再設定のときなどに送るメールのviewにおいて「なんちゃら_url」とurlを取得するメソッドを使っていて、

しかしながら、
`「なんちゃら_url」＝ users/newなどのホスト名なしのurl`
を生成するだけ&Mailerに来るリクエストはホスト名を保持していないので、

hostを指定する必要があったということです。

## [結構重要な情報かも？] 余談 (何故私がはまったか)
- mailを送るところはほぼ全て自分で(deviseを使わずに)Mailerを実装しており、Mailerのviewで「_url」を使うのではなく、(host名などの情報を持っている)**コントローラ・モデルで**urlを生成してから、viewに渡すということをしていたので、host名を指定していなくても、正しいurlが生成されていた。

- passwordを再設定する箇所はdeviseのデフォルトのまま使おうとしたら、deviseの**viewにおいて**「_url」を使用していたので、エラーが出た

- つまり本記事タイトルは「Deviseを使うときに書いていた〜」ですが、(action_mailerのconfigなので当たり前と言えば当たり前なのですが)、本当は「ActionMailerのviewで、_urlメソッドなど、host名が必要なときに書いていた〜」が正しいです。
JINS MEME ACADEMIC PACKをアンドロイド端末で使用するときの注意

# JINS MEME ACADEMIC PACKは何気にアンドロイド端末でも使えるのですが、ちょっと今回はまった部分があるのでメモしておきます。

##### アンドロイド端末で使う手順は以下です。

1. USBメス to microUSBオス変換アダプタを事前準備（別売りでした。）。
　　こんなやつ↓
    ![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/108112/7d28614d-f633-97bd-f77c-8579af7281db.png)

2. 手持ちのアンドロイド端末に専用ソフトをインストール

3. ソフトを立ち上げてドングルを差し込む

今回はまったのは3の部分。

ドングルを差し込んでも何も起こらない。。。

小一時間ほど格闘したあげくなんと、問題はソフトの起動とドンブルを差し込む順番が重要ということでした。

**1.ソフトを起動**
**その後**
**2.（物理的に）ドングルを接続**

これで上手くいきました。


###### ちなみに当方の環境は以下
・Nexus5
・Android 4.4
El Capitan にアップグレードしたら LogMeIn Client にログインできなくなったときの対処

## 状況
MacOSX 10.11 にアップグレードしたところ、これまで動作していた LogMeIn Client アプリがこんなメッセージと共に突然接続できなくなりました。 
> Your Computer is offline. LogMeIn requires an Internet connection.

クライアントアプリがEl Captianに対応してないのか？などと思いながら、解決策をググったのですが、日本語情報がなかったのでこちらにまとめておきます。

## 解決方法
解決方法ですが、なんてことはないです。一度アプリで保存しているログイン情報を削除し、再度ログインするだけでした。

具体的には、以下の流れです。

1. アプリのメニューから設定（Preferences）を開く
2. Credential Handling の Login Credentials are saved と書いてある後ろの Clear をクリック
3. 設定を閉じ、再度ログイン情報を入力＆保存

分かってれば簡単です。

## まとめ
非常に簡単な初歩的な対処方法だったのですが、メッセージがオフラインになってる云々と言われてしまったものだから色々と回り道をしてしまいました。エラーメッセージって大事ですよね、と再認識した次第です。

## 参照元
以下のページを参照しました。
https://community.logmein.com/t5/Pro/LMI-Control-Panel-says-offline-but-I-have-internet/m-p/132967/highlight/true#M7929
ラズパイ３と最新のraspbian OSでMQTTゲートウェイFujiのラズパイ２(armv7)用バイナリが動きます


T/O (title only) なんですけど。貴重なラズパイ３を使って人柱になろうという人はいなさそうですし、多少はノウハウの共有という意味があるかと思われるので、試した結果を書きました。
なお、今後OSのサポート状況は変わると思われますので、なるべくタイムリーに更新しようと思いますが、一年と言わず半年放置されていたらこの記事の内容は信用しないでください。

## TL;DR

要するに、ラズパイ２用のバイナリコードはラズパイ３に最新(2016.3.18に更新)のRaspbian OSをインストールすれば動きます。Fuji（ https://github.com/shiguredo/fuji ）もそうでした。

## なんで大丈夫なのか

詳しくは知りません。新しいCPU自体が後方互換性を持っていて、既存の命令セットをサポートしているのは当然ですが、現在のRaspbian OSも新しいCPUで64bitのアプリケーションを動かす想定ではないのかもしれません。今後どうなるか注意していきたいと思います。

## 実際にやったこと

1. ラズパイ２で動作していたSDカードのraspbian Jessie Liteの2016.1の頃のイメージをそのままラズパイ３に刺してもOSがうまく起動しませんでした。
1. raspbianの最新版(2016.3.18)のJessie LiteのイメージをダウンロードしてきてSDカード（自分はTranscendの8GB Class 10のもの）に書き込みました。
	- Mac OSXならばddコマンドが使えます
	- 自分はWindows 10だったのでWin32DiskImager.exeを使いました
1. 最新のRaspbianだと起動すると自分のIPアドレスをアドバタイズするので、Mac OSXやWindowsにbonjourをインストールしてあれば raspberrypi.local というホスト名を指定してssh接続できます
	- ユーザー名はpi、初期パスワードはraspberryでつながります
1. Fujiのバイナリをとってきます
	- `wget https://github.com/shiguredo/fuji/releases/download/1.0.2/fuji-gw_1.0.2_raspi2_arm7.deb` raspi2_arm7 とありますが大丈夫です。
1. インストール
	- `sudo dpkg -i fuji-gw_1.0.2_raspi2_arm7.deb`
1. 起動してバージョン見てみましょう
	- `fuji-gw -v`


## 使ってみる

自分の例ですみませんが、以下のような設定を特に変えずに動くと思います。
- MQTTゲートウェイFujiでAWS IoTに繋いでみた http://qiita.com/kgbu/items/74b71e29ee606ac7614f

### 古いFujiのバイナリと設定は？

Fuji 0.3.0以前のバイナリ用の設定ファイルは最新のFujiでは修正が必要ですが、古いFujiのバイナリもそのままでラズパイ３で使えますので、これまでの設定をラズパイ３で引き継ぎたい場合はバイナリもそのままで多分大丈夫だと思います。ただし、私は全バージョン試せてはいません。
markdownの数字付きリストで連番にならない時の対応

# 解決したい問題

↓ こうしたいんだけど
> ![スクリーンショット 2016-03-28 15.51.36.png](https://qiita-image-store.s3.amazonaws.com/0/7039/9b71f808-15ac-362c-a425-63c365657d42.png)

↓ こうなってしまう（2と3の間に何か入れると連番がリセットされてしまう）場合の対処法
> ![スクリーンショット 2016-03-28 15.53.58.png](https://qiita-image-store.s3.amazonaws.com/0/7039/84e2fccc-a1d5-eeeb-07b4-90c5d6ddf46d.png)


# 対処法

以下のように、2と3の間の内容は、行頭にスペースをいくつか入れると（今回は半角空白4つ）、連番が続くみたい。

> 1. りんご
> 2. みかん
>  
>     \`\`\`
>     orange
>     \`\`\`
> 
> 3. るんるん
EC2インスタンスのログをログ収集サーバに集約しS3に保存する

## 構成
web1、web2のtomcatのログをcollect1に送り最終的にS3へ転送する設定をメモがてら記述します。

![AwsImage.png](https://qiita-image-store.s3.amazonaws.com/0/76157/c0728c1d-1af7-622b-c348-d1b27215da49.png)


## ログ送信側(web1、web2)の設定

前提：tomcatをインストール済み

1.td-agentをインストール

``` 
curl -L http://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
```

2.td-agentがログにアクセスできるようにtomcatログのgroupを変更

``` 
# chgrp td-agent /var/log/tomcat8/
```

3.書き込み権限は不要なので外しておく(※省略可)

``` 
# chmod g-w /var/log/tomcat8/
```

4.confに転送設定を記述する
下記の設定はjson形式で吐き出したカスタムデータ(sample.json)をmatch内のserverに
転送する設定となっています。
matchに記載されている属性とsourceのtagで関連付けしています。
match-serverに指定しているportはfluentdのデフォルトのポートを指定しています。
受信側と同じようになるように設定してください。

``` /etc/td-agent/td-agent.conf
<source>
 type tail
 format json
 path /var/log/tomcat8/sample.json
 tag tomcat.sample
 pos_file /var/log/td-agent/sample.pos
</source>
<match tomcat.**>
 type forward
 <server>
  host collect1のIPアドレスを指定
  port 24224
 </server>
</match>
```

5.td-agentを起動します。

```
# /etc/init.d/td-agent start
```

※起動に失敗するようでしたら、下記コマンドでログを確認してください。

```
cat /var/log/td-agent/td-agent.log
```

## ログ受信側(collect1)の設定

ここでは収集サーバ用に新規でEC2を立ち上げることを前提に記述しています。

EC2インスタンスの設定
・IAMロール（AmazonS3FullAccessなどs3に書き込み可能な権限付き）※後付け不可、インスタンスの作成時につけること
・セキュリティグループにlistenするポート（ここでは24224）をカスタム__UDP__で許可するように設定追加
 ※fluentd間がUDPでメッセージやりとりするため

1.td-agentをインストール
※out_s3プラグインは始めから含まれているようなので別途インストールは不要です。
2.confに転送されてきたログをS3にアップロードする設定を記述する

送信側でタグをtomcat.〜という形式で定義しているのでmatchでtomcatが引っかかるように設定してます。
s3_bucketにBucket名を設定してください。
なお、設定はリージョンが東京のものです。Tokyoと書いても設定できませんので正確な名称？を指定してください。
対応表は[こちら](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-regions-availability-zones.html)を参照してください。
buffer_pathにはs3に持って行く前のログをバッファリングしておくパスを定義しておきます。
送信側からのデータを正しく受信できれば/tmp/fluent/s3****.logみたいな形でログが出力されています。
またs3への転送が成功すれば/tmp/fluentの下はクリアされます。

``` /etc/td-agent/td-agent.conf
<source>
  type forward
  port 24224
</source>

<match tomcat.**>
 type s3
 s3_bucket sample-s3(ログをアップロードするs3の名称)
 s3_region ap-northeast-1
 s3_object_key_format %{path}%{time_slice}/%{index}.%{hostname}.%{file_extension}
 path logs/
 buffer_path /tmp/fluent/s3
 time_slice_format %Y%m%d-%H
 time_slice_wait 1m
 <instance_profile_credentials>
  retries 5
 </instance_profile_credentials>
</match>
```

いうまでもないことですが、最低限の設定なのでIAMロールの設定や穴あけなどはきちんと設計して設定する必要があります。

3.td-agentを起動します。

```
# /etc/init.d/td-agent start
```

これで送信側のサーバにアクセスしログを更新すると１時間くらい経過するとsample-s3のlogs配下にgzで圧縮されたログがアップロードされるようになります。
MySQLで残り続けるSQLプロセスを強制的に終了させるスクリプト


# スクリプトのありか
https://github.com/furu8ma/kill_sql_process/blob/master/kill_sql_process.sh

とても長い時間滞留し続けるクエリがあるけど、MySQL自体の設定を変更してタイムアウト値を短くすることはできない。そんな場合に使えるスクリプトです。


# 使い方
スクリプトをエディタで開いて、DB接続情報、タイムアウト(SQLの滞留時間)秒、対象とするクエリを変更してください。

```sh
DB_HOST="hogehoge_host01";
DB_USER="db_user";
DB_PASS="db_password"
GREP_STR="SELECT";
TIME_OUT="180";
```

とりあえず今はSELECT全部対象です。

ちなみに23行目の

```sh
echo $SHOW | $MYSQL | grep "$GREP_STR" > $TMP1
↓
echo $SHOW | $MYSQL | grep "$GREP_STR" | grep -v "hogehoge" > $TMP1
```

とかすれば除外条件を追加できます。

crontab等に設定して定期的にkillさせるといい感じです


だれかのお役にたてば。
よく使う Git コマンドめも

# 年がら年中やってる
* git status

# 作業したとき
* git add -p
* git commit -m "こめんと"
* git commit --amend

# やっちまった

## 間違ってaddしちゃった

```
git reset HEAD ファイル名 #addの取り消し
```

## CONFLICTした stash pop を無かったことにしたい

```
git checkout --ours .
git reset
git checkout .
```

# 別のブランチ持ってくるとき
* git fetch --prune
* git pull origin ブランチ名
* git branch hogehoge origin/hogehoge

# ブランチ操作
* git branch -a #ブランチ一覧
* git branch -d ブランチ名 #ブランチ削除
* git checkout -b ブランチ名 #新しいブランチを作って、そっちにcheckout

# リモートの確認

* git remote -v

# 作業中に別の修正依頼がきちゃったよ 

* git stash
* git stash pop

# リベース

## 衝突を解決
```
git add 衝突したファイル
git rebase --continue
```

## リベースをキャンセル

```
git rebase --abort
```
vimで方向キーがABCDを入力してしまう問題の解決

ubuntuでちょっとした設定ファイルを書き換える際にはvimを使っているのだけれど,方向キーでのカーソル入力が何か拍子にABCDと入力になってしまうことが度々あり不便なので原因を調べてみた。

***
[Vimで方向キー入力時にABCDが記述されるエラー対処(vdeep.net)](http://vdeep.net/vim-abcd)

どうやらvimはデフォルトでvi互換モードで起動されるので、その場合は方向キーではなくh,j,k,lでカーソルを動かさなければならないという事らしい、が今のところvim自体に不慣れなので方向キーでカーソル移動が出来るように設定をしたい。

##vimの設定

vimの設定はホームのディレクトリにある.vimrcに書く,自分の環境では無かったのでファイルを作成する。

```
$ touch ~/.vimrc
$ vi ~/.vimrc
```

vi互換モードのoffは

```lang:.vimrc
set nocompatible
```

だけでOK。
これで方向キーでアルファベットが記入される事がなくなる。

##Backspaceの有効化

方向キーが使えるようになったのはいいが互換モードを切ったせいか今度はBackspaceによる文字の消去が出来なくなってしまった。不便なので今度はこの設定をする。

.vimrcには互換モードのoffだけでなく色々な設定が記述できる。
Bacspaceの有効化は

```lang:.virmc
set backspace=indent,eol,start
```

これで無事有効化された。

### vi互換モード
そもそもvi互換モードって何だと思って調べてみると、どうやら単にvimの機能をviと同じように制限するもののようだ。つまり今までvimではなく実質的にはviを使っていたという事になる。

##あとがき
viやvimのカーソル移動は元々h,j,k,lキーに割り当てられているため、vimをマスターするためにはそっちを使ったほうがいいのだろう。
ただvimの操作は独特な部分が多いので、初めのうちは基本的な使用感は自分が慣れている設定にして気軽に使ったほうが結果的にvimの練習ははかどるんじゃないかと思う。

##参照記事
[starting - Vim日本語ドキュメント](http://vim-jp.org/vimdoc-ja/starting.html)
[vimで文字が削除出来ないと思ったらバックスペースが効かなくなった](http://qiita.com/omega999/items/23aec6a7f6d6735d033f)
[Vimで方向キー入力時にABCDが記述されるエラー対処(vdeep.net)](http://vdeep.net/vim-abcd)
MacでCalendar.appのエントリを取得したい場合にはキャッシュを強引に覗くのが手っ取り早い

MacでCalrndar.appのエントリを取得したい気分になるじゃろ？MacだからAppleScriptを使えば良いと思うじゃろ？死ぬほど遅いんじゃ。JXAでもやっぱり死ぬほど遅いぞい。

Core Dataうんぬんかんぬん詳しいことはおいといて、ちゃっちゃとカレンダーエントリを読みたいときには、SQLiteなキャッシュを読むのが手っ取り早いようです。

```
[takada-s@MBA Calendars]$ pwd
/Users/takada-s/Library/Calendars

[takada-s@MBA Calendars]$ ls -l Calendar\ Cache*
-rw-r--r--@ 1 takada-s  staff  6156288  3 28 13:30 Calendar Cache
-rw-r--r--@ 1 takada-s  staff    32768  3 24 15:34 Calendar Cache-shm
-rw-r--r--@ 1 takada-s  staff   576832  3 28 14:44 Calendar Cache-wal

[takada-s@MBA Calendars]$ file Calendar\ Cache
Calendar Cache: SQLite 3.x database
```

shmとwalはメタデータ的なものらしいので、ここではとりあえず気にしないことにしましょう。

このSQLiteファイルに対して、次のようなSQLをぶっこむと、極めて高速に指定期間内のカレンダーエントリ一覧を取得することができます。

```sql
SELECT
  ZNODE.ZTITLE, ZCALENDARITEM.ZTITLE, ZSTARTDATE, ZENDDATE
FROM
  ZCALENDARITEM, ZNODE
WHERE
  ZCALENDARITEM.ZCALENDAR = ZNODE.Z_PK
  AND
  ZCALENDARITEM.ZSTARTDATE > ?
  AND
  ZCALENDARITEM.ZENDDATE < ?
```
と思うじゃろ？時刻はUnixEpochと思いきや、2001/01/01 00:00:00を0とする謎エポックなんじゃ。これもCoreDataの仕様らしいぞい。というわけで、978,307,200秒のオフセットを考慮する必要があるようです。参考: http://stackoverflow.com/questions/10705062/behind-the-scenes-core-data-dates-stored-with-31-year-offset
Unity Texture周り　備忘録

-----
2018/03/29　追記

■ASTC
　・高圧縮率でキレイなテクスチャになる。
　・使えるのはA8以降のCPU
　・AndroidはETC2が良いかも？？

 　参考URL：カヤックさんのページ【Unity】Texture Format
　　http://techblog.kayac.com/unity_advent_calendar_2016_10

　・参考URL　ASTCの説明
　http://tsubakit1.hateblo.jp/entry/2016/09/28/235632


　・どの形式を選ぶかとても参考になる
　●Unity uGUI UIテクスチャフォーマット選択フローチャート
　https://qiita.com/KazuyaSeto/items/87d7e2fb1fdd1ffec585

----


テクスチャの容量を減らすのに色々ありそうなのでメモ

●基本的に画像サイズは２のべき乗（1920*1080を表示したければ2048*2048が画像サイズで画面に表示される部分は1920*1080にする）

●テクスチャ設定の**MipMap**のチェックをはずす

●テクスチャ設定の**Read/Write Enabled**をFalseにする。

●テクスチャのクオリティ設定を落とす（テクスチャによってはジャギが発生するがメモリは減る）
　メニューバーのEdit⇒ProjectSetting⇒Quality⇒Texture Quality をFullRes以外のものにする。

●iOSならPVRTC・AndroidならETCにする。（見た目の問題があるので下記の方のようにディザリング対応とか必要）
　■PVRTCフォーマットはテクスチャが正方形であることが必要
　http://www.cis.sojo-u.ac.jp/~izumi/Unity_Documentation_jp/Documentation/Manual/Textures.html
　http://tsubakit1.hateblo.jp/entry/20120814/1344956398

　■【Unity】テクスチャを高品質な16bit画像でインポートできる「unity-dither4444」
　http://paradre.com/post-693



●スプライトパッカー(Sprite Packer)を使用する。
　１．複数選択してTextureTypeをSprite2DUIにする
　２．PackingTagを入力
　３．すべてApply
　４．WindowでSpritePackerを選択

　詳細は**http://docs.unity3d.com/ja/current/Manual/SpritePacker.html**

# 用語メモ

■NPOTとPOT
　NPOT(Non Power of two)：**２の２乗でないテクスチャ**
　POT(Power of two)：**２の２乗のテクスチャ**

■MipMap
ミップマップ (mipmap)
MIP マップとも呼ばれる。(MIP は、英語の "much in little" を意味するラテン語 “multium in parvo” の略。) 同一イメージが徐々に低解像度になっていく一連のテクスチャのことで、1 つのイメージに何種類ものフィルタをかけることにより作成される。オブジェクトが近くに表示されるときには高解像度のイメージが使用され、オブジェクトが遠ざかるに従って (つまり画面での表示が小さくなるに従って) 低解像度のイメージが使用される。

■マテリアル
マテリアル (material)
サーフェスがどのように光を反射および発色するかを決定する属性。マテリアル (素材) には、エミッション属性 (ライトに依存せず発色)、アンビエント属性、ディフューズ属性、およびスペキュラ属性の 4 つの構成要素がある。反射の明るさは、強度の設定により決定される。

■スプライト
スプライトとは、コンピュータ上で動く図形を表現する際に、動かす図形と固定された背景とを別に作成し、ハードウェア上で合成することによって表示を高速化する手法のことである。主にコンピュータゲームなどで用いられている。

スプライト描画法では、それぞれ別に用意された図形をフレームバッファ内で重ね合わせ、ひとつの画面として表示させる。重ね合わせの位置はピクセル単位で指定でき、複数重なった場合に表示の優先順を指定することもできる。また、重ね合わせの際に指定する必要のあるデータは表示位置だけでよいので、処理や表示を高速にできる。

　「Unityで2Dゲームで使われる画像のことをSpriteと呼びます。
　PSD、TIFF、JPG、TGA、PNG、GIF、BMP、IFF、PICTが使用できます。
　スプライトを○○してください。と言われてもわかるように
　「画像のことはスプライト！」これだけは覚えておきましょう。」との事
　http://www.sbcr.jp/products/4797384437.html?sku=4797384437#supportDl

　http://docs.unity3d.com/ja/current/Manual/Sprites.html
　
　http://hiyotama.hatenablog.com/entry/2015/05/11/142628

　http://jokerscript.wiki.fc2.com/wiki/Unityの開発画面と用語説明

# Unity Texture
リンク
http://docs.unity3d.com/ja/current/Manual/class-TextureImporter.html

# テクスチャ関係リンク
　・OpenGL ES2.0 入門 基礎編（テクスチャのパラメータ）
　http://qiita.com/kazoo/items/27d2c18d14dbb99bebf3

　・なぜテクスチャサイズは2の累乗なのか
　http://variously.sblo.jp/article/68664570.html

　・Unity テクスチャ（Texture 2D）の基本設定
　http://upsnap.jp/archives/show/136

　・Unity|アプリを軽量化するためにデザイナーができること
　http://8450423.info/qun/unity_optpix_rbga4444/
　・Unity|アプリを軽量化するためにデザイナーができることその２
　http://8450423.info/qun/unity_atlas_diet/
　
　・Unity、Mobile端末向けの画一的なテクスチャ圧縮方法
　http://developers.mobage.jp/blog/texture-compression