OmniAICreator/Qiita-1.07M huggingface dataset:
TinyPNGのWeb APIを使ってサーバーサイドでImage Optimize


# 概要

いま運用中のウェブサイトの表示スピードを速くしたいために、画像のOptimizeをしようと思い立ったが、
cloneしてjpgminiとかでやるのはめんどうで気が引けるし、なんとかしてサーバー側でできないかと調べてみたところ、かの有名な [TinyPNG](https://tinypng.com) 様がなんと **Web API** をご用意して下さっていたので、これを使います。

すでにqiitaに記事があるかなぁと思っていたんですが、なさそうなのでメモとして残しておきます。

## 1. API KEY を取得する

TinyPNGの [Developpers](https://tinypng.com/developers) ページに行くと、名前とメールアドレスを入れる欄があるので、そこにデータを入力します。するとメールがくるので、貼ってあるリンクをたどってAPI KEYを取得します。

## 2. クライアントを選ぶ

TinyPNGは **REST API** のほか、**Ruby**, **php**, **node.js**, **python**, **java**, **.net** これらの言語でAPIを使うための
クライアントがあります。自分が使うのはPythonなので、今回のこの記事はPythonで書きます。

Pythonの場合は、`tinify` というクライアントがあるので、それをインストールします。

```tex
pip install tinify
```

こちらがAPI説明ページになってます。 https://tinypng.com/developers/reference/python

## 3. コードを書く

このクライアントを使うと、 **たった2行** でOptimizeできちゃいます。

```py
source = tinify.from_file("unoptimized.jpg")
source.to_file("optimized.jpg")
```

これだけ。 **Simple is The BEST** って感じでとてもいいですね。

ちなみにこの前にクライアントのimportとAPIキーの登録があります。

```py
import tinify
tinify.key = "Your API KEY"
```

### 3.1. サンプルコード

ためしに、現在のディレクトリにある `jpg` or `png` ファイルをoptimizeするコードを書いてみました（`py2.7`）

```py
#!/usr/bin/env python
# coding: utf-8

import os
import sys
import tinify

TARGET_DIR = "."
tinify.key = "###################################"

def get_images():

    result = []
    files = os.listdir(".")

    for file in files:

        if file.endswith(".jpg") or file.endswith(".png"):
                result.append(file)

    return result

def optimize(source, dest, target_dir):

    dest_path = os.path.join(target_dir, dest)

    if os.access(source, os.F_OK) != True:

        raise IOError("file not found: {}".format(source))

    optimizer = tinify.from_file(source)
    optimizer.to_file(dest_path)

    return


if __name__ == "__main__":

    images = get_images()

    # test optimize
    optimize(images[0], images[0], TARGET_DIR)
```

## 4. 注意事項

TinyPNGでは、無料ではひと月にアップロードできる画像は **500** 個だけのようですので、そこは注意が必要です。
Docker 内部で npm run  すると EXDEV を返され通らなくなる問題の解決方法

https://github.com/npm/npm/issues/9863

## 問題

`docker build` の中で `npm install` すると、下記のようなエラーが出て ret val != 0 となりコケる。

```
npm ERR! EXDEV: cross-device link not permitted, rename '/usr/local/lib/node_modules/npm' -> '/usr/local/lib/node_modules/.npm.DELETE'
```

上記は `npm` の例ですが、各所で発生し、阿鼻叫喚になっていた。
冒頭の github issues の長さでお察し

## 解決方法
`Dockerfile` 内に下記を記載

```dockerfile
RUN cd $(npm root -g)/npm \
		&& npm install fs-extra \
		&& sed -i -e s/graceful-fs/fs-extra/ -e s/fs\.rename/fs.move/ ./lib/utils/rename.js
```

## 原因

[ここ](https://github.com/npm/npm/issues/9863#issuecomment-231007622)までわかっている模様

* (docker の)aufs に固有の問題
* aufs では多くの子レイヤがあるため、ディレクトリの rename が難しい（すべての子レイヤから探しだして、変更しないといけない。 inode の rename も含む)。この操作はコスト高で、 aufs は実行することを（たまに）拒否して、 EXDEV を返す。
* EXDEV での copy/unlink の実行は、まあ、なんとかなる。
* fs.extra と fs-extra は EXDEV での copy にフォールバックする。このため、不幸にも上記に引っかかる。
* copy/unlink にフォールバックする代わりに、 mkdir/rename を再帰的に実行することができる。この処理は atomic ではなくなってしまう。これで十分かな？奇妙な npm の競合状況に出くわしたことがないので確かではないですが・・・

## おしまい
上記の通り、 atomic ではなくなってしまいますが、ほとんどのケースではうまくいくだろうとのことです。
特定の条件で絞ったprefetch_related可能なrelationのpropertyを作成する方法

# 特定の条件で絞ったprefetch_related可能なrelationのpropertyを作成する方法

あるモデルに特定の条件で絞ったprefetch_related可能なrelationを設定したい。

## はじめに

例えば、M:Nの関係のモデルX,Yがあるとする。

```py
class X(models.Model):
    name = models.CharField(max_length=32, null=False, default="")
    ctime = models.DateTimeField(auto_now_add=True, null=False)
    is_valid = models.BooleanField(default=True, null=False)


class Y(models.Model):
    name = models.CharField(max_length=32, null=False, default="")
    ctime = models.DateTimeField(auto_now_add=True, null=False)
    is_valid = models.BooleanField(default=True, null=False)

    xs = models.ManyToManyField(X, related_name="ys")
```

Yのあるオブジェクトに対して以下の条件で絞ったXの関連を取得したい。

- `-ctime(生成日時)` でorder by
- `is_valid=True` でfilter

直接書き下すと以下のようなもの

```
y.xs.all().filter(is_valid=True).order_by("-ctime")
```

## 要件

- モデルのインスタンスから対応する条件で絞ったrelationを取得したい
- この絞ったrelationはprefetch_relatedも可能になってほしい

例えば上で示した条件を満たしたrelationを取ってくるものを `valid_xs` という名前にしたとすると、以下の様にして使える。

```py
# instanceから
y.valid_xs  # =>  [X,X,X,X]

# prefetch_related (N+1 queryを抑制できる)
for y in Y.objects.all().prefetch_related("valid_xs"):
    print(y, y.valid_xs)
```

## 実装

`prefetch_related("valid_xs")` は難しかったので `prefetch_related(Y.prefetch_valid_xs())` で良い事にする。

以下の様な関数を定義。

```py
def custom_relation_property(getter):
    name = getter.__name__
    cache_name = "_{}".format(name)

    def _getter(self):
        result = getattr(self, cache_name, None)
        if result is None:
            result = getter(self)
            setattr(self, cache_name, result)
        return result

    def _setter(self, value):
        setattr(self, cache_name, value)

    prop = property(_getter, _setter, doc=_getter.__doc__)
    return prop
```

以下の様にモデルの定義を変える

```py
class X(models.Model):
    name = models.CharField(max_length=32, null=False, default="")
    ctime = models.DateTimeField(auto_now_add=True, null=False)
    is_valid = models.BooleanField(default=True, null=False)

    @classmethod
    def valid_set(cls, qs=None):
        if qs is None:
            qs = cls.objects.all()
        return qs.filter(is_valid=True).order_by("-ctime")

class Y(models.Model):
    name = models.CharField(max_length=32, null=False, default="")
    ctime = models.DateTimeField(auto_now_add=True, null=False)
    is_valid = models.BooleanField(default=True, null=False)

    xs = models.ManyToManyField(X, related_name="ys")

    @custom_relation_property
    def valid_xs(self):
        return X.valid_set(self.xs.all())

    @classmethod
    def prefetch_valid_xs(cls):
        return Prefetch("xs", queryset=X.valid_set(), to_attr="valid_xs")
```

以下の様にして使える。

```py
# instance から
Y.objects.get(id=1).valid_xs  # => [X,X,X,X]

# prefetch_related (N+1 queryを抑制できる)
for y in Y.objects.all().prefetch_related(Y.prefetch_valid_xs()):
    print(y, y.valid_xs)
```

参考

- [もう少しだけdjangoのprefetch_relatedについて考えてみる(条件付加したrelationのeager loading)](http://pod.hatenablog.com/entry/2016/07/13/224413)

自分で書いたblogだけれど。
VirtualBox ネットワークつながらない時

VitualBoxでproxyの設定もしたのに、なぜかネットワークにつながらない。
そんな時はネットワークアダプタの設定を見直してみる。

<img width="839" alt="スクリーンショット 2016-07-14 10.21.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/65876/5f4b0feb-ca0d-a24a-96fc-0df5a66fe624.png">

`Attaced to`が「未割り当て」は「ネットワークに接続できない」モードなので、それ以外の値を選択すること。


# 参考

[ネットワーク設定 | VirtualBox Mania](http://vboxmania.net/content/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E8%A8%AD%E5%AE%9A)
【UnityEditor】Sceneビューに文字を表示させる最小コード

#はじめに
SceneビューにGUIを出すやり方をすぐに忘れてしまうので学習もかねて記事にまとめました。


#ソースコード
```NewBehaviourScript.cs
using UnityEngine;
using UnityEditor;

[InitializeOnLoad]
public class NewBehaviourScript
{
    static NewBehaviourScript()
    {
        SceneView.onSceneGUIDelegate += (sceneView) =>
        {
            Handles.BeginGUI();
            GUILayout.Label("ほげほげ");
            Handles.EndGUI();
        };
    }
}
```


#ポイント
・BeginGUI()とEndGUI()で挟む
これを忘れるとGUIが表示されません


<br>
ちなみにコードを実行するとこんな感じに表示されます.
<img height = 150 src = "https://qiita-image-store.s3.amazonaws.com/0/44288/a71e95d3-64fa-5b14-3b44-68b5d6a1416b.png">
Sinatra と jpstock を使って簡単なAPIをつくる

既存のサービスとかであるかもしれないが、株価をjsonで取得できるAPIが欲しくて適当に作成

##1.構成

サーバー : CentOS6.7
Ruby : 2.3
sinatra  : 1.4.7
jpstock : 0.6.7
working directory : /root/api_stock

##2. 準備

データを取得するやつ

```tool.rb
#!/usr/bin/ruby
# coding: utf-8

require 'jpstock'
require 'curses'
require 'holiday_japan'
require 'json'

## calculate businness days

class Date
  def business_days(i)
    date = self
    i.times.each do |j|
      date -= 1
      date -= 1 while (date.wday <= 0 || date.wday >= 6) or (date.national_holiday?)
    end
    date
  end
end

## get share price

class Stock
  def  initialize(scode)
    @scode = scode
  end

  def get_code(scode)
    stocks = scode
    stock = JpStock.price(:code => stocks )
    name = JpStock.sector(:code => stocks )
      hstocks = JpStock.historical_prices(
      :code => stocks,
      :start_date => Date.today.business_days(24),
      :end_date => Date.today
     )
    last_day = hstocks[0].close
    this_day = stock.close
    rate = ((this_day - last_day)/last_day * 100).round(2)
    company =  "#{name.company_name}"
    price = "#{stock.close}"
    ration = "#{rate}"
   shash = {"会社名":company, "現在値": price, "前日比": ration}
   shash.to_json
  end

end
```

動かすやつ(GETのみ)

```s_api.rb
#!/usr/bin/ruby
# coding: utf-8

require 'sinatra'
require 'sinatra/reloader'
require 'json'
require_relative 'tool'

## set bind IP adress
set :bind, '192.168.0.1'
set :show_exceptions, false

## Get share info

get '/share/:id' do

   content_type :json
   num = params['id']
   sprice = Stock.new(num.to_i)
   astock = sprice.get_code(num.to_i)
  return astock
  
end

error do

  "Sorry!\s No exist share code number!!\n"

end

```

##3.デーモン化

thinを利用

```config.ru
config.ru

ENV['RACK_ENV'] = "production"

require File.expand_path '/root/api_stock/s_api.rb', __FILE__

run Sinatra::Application
```

```config.ym
 environment: production
 chdir: /root/api_stock
 address: 192.168.0.1
 user: root
 group: root
 port: 4567
 pid: /root/api_stock/thin.pid
 rackup: /root/api_stock/config.ru
 log: /root/api_stock/thin.log
 max_conns: 1024
 timeout: 30
 max_persistent_conns: 512
 daemonize: true

```

起動

```
#thin -s 2 -C config.yml -R config.ru start
```

確認

```
#curl 'http://192.168.0.1:4567/share/7974' | jq '.'
```

結果

```json

{
  "前日比": "9.69",
  "現在値": "23945.0",
  "会社名": "任天堂(株)"
}

```
ASP.NET MVC サービスで物理パスを取得する

# ASP.NET MVC サービスで物理パスを取得する


困って、試した順に書いてしまったので長い。結論はこうだ。

```csharp
using System.Web.Hosting;

var physicalPath = HostingEnvironment.MapPath(絶対パス or 相対パス);
```

2016-08-13 追記

アクションフィルタなら、このあたりを使ってもよさそう。

```csharp
filterContext.HttpContext.Request.PhysicalApplicationPath
filterContext.HttpContext.Request.PhysicalPath
```

以下、経緯につき冗長

### ビューで

Razor 他を使ってアプリケーションの絶対パスを取得するには `@Url.Content("~/Content/Site.css")` とすればよい。

[[BuildInsider] アプリケーションルートからの絶対パスを生成する - Url.Content／Action／RouteUrlメソッド［Razor］](http://www.buildinsider.net/web/bookaspmvc5/040303)

### コントローラで

次の方法で絶対パスを取得できる。

```csharp
using System.Web

string returnUrl = VirtualPathUtility.ToAbsolute("~/stuff/");
```

[[stackoverflow] how to use Url.Content(“~\stuff\hi.jpg”) in controller's code?](http://stackoverflow.com/questions/5243343/how-to-use-url-content-stuff-hi-jpg-in-controllers-code)


### サービスで

今回はコントローラが呼び出すビジネスロジック －ここではサービスと呼ぶけれども－ で取得したい。

- コントローラがサービスに `HttpContext` を引き渡す、というのは違うだろう。
- コントローラでパスを取得して、サービスに渡す、というのもピンとこない。

悩むなら、まずコントローラで取得しようと試したが、`VirtualPathUtility.ToAbsolute()` は、期待どおり動作しない。

念のため、`@Url.Content()` を試したが、こちらも「私の求めるパス」を返さない。

ここに至って、ようやく「絶対パス」ではなくて、「物理パス」が欲しかったんだと気付く。

探すものが間違ってたら見つからない。


### 確認した環境

- ASP.NET MVC 5
- Visual Studio 2015 Community
- Windows 10 (Insider Preview なし)
TOpenDialog の Option

#はじめに
　OpenDialogは便利ですが、実はOptionの中で細かく設定項目を規定できます。
　今回はその設定項目についてメモ書きしておきます

# Options  
- ofReadOnly  
　読み取り専用のチェックボックスがデフォルトでONになります
- **ofOverwritePrompt**  
　同名ファイルを上書きする際に、確認ダイアログが表示されます。必須です
- **ofHideOnly**  
　読み取り専用のチェックボックスが見えない状態になります。よく使います。
- ofNoChangeDir  
　保存時のカレントディレクトリを固定にします
- ofNoValidate    
　ファイル名に使えない文字のチェックを無効にします。つまり、どんなファイル名もつけることができます。  
　大体の場合はOFFになると思います。
- ofAllowMultiSelect  
　複数選択を許可します。場合によっては嬉しいOptionと思います。
- **ofPathMustExist**  
　ユーザーが存在しないディレクトリ・パスとファイル名を選択しようとするとエラーを表示します。  
　よく使います。
- ofFileMustExist  
　ユーザーが存在しないファイル名を選択しようとするとエラーを表示します。
Gradle+Jacoco+Jenkinsの構成でカバレッジが取れない

Jenkins動かしたらカバレッジが0になる。。。。。。

良いブログ主様がいたのでそのままやってみる
[参考資料](http://mshimomu.hatenablog.jp/entry/2016/01/17/142504)




```build.gradle 
apply plugin: 'java'
apply plugin: 'jacoco'
repositories {
    mavenCentral()
}

dependencies {
    testCompile 'junit:junit:4.+'
}

jacoco {
    toolVersion = "0.7.5.+"
}
```


* 上記のようにjacocoのversionを指定
* JaCoCo 0.7.5では以前のバージョンとexecファイルの互換性がない
* pluginのversionが2.0.0ならJaCoCo 0.7.5を使う


![graph.png](https://qiita-image-store.s3.amazonaws.com/0/97564/5e965fa1-bd1c-58c3-7fc8-7c8a7c94d5f3.png)


トレターーーーー
要望: 編集した記事のタイトル一覧(更新した順)がほしい

過去の記事を編集するとき、記事検索する必要があります。

過去の記事にたどり着くまで時間がかかります。
また、どの記事かド忘れてしまいます。

自分の投稿 ＞ ソート で`更新日順`がほしいです。
Dockerでお手軽に複数nodeのElasticsearch clusterを作成 & 好きなplugin追加

# 目的

- Elasticsearch clusterの複数nodeを跨いだshardsの動きを実際に確認したい
- VMを複数起動するのは面倒なのでdockerでさっくり試したい

# 環境

- MacOS X El Capitan (10.11.5)
- [Docker Toolbox](https://www.docker.com/products/docker-toolbox) 1.11.2

# 準備

- Docker Toolboxの導入などは、[こちら](http://qiita.com/akiko-pusu/items/a30db6332a77ed0ded09#インストールしてみる)の記事などをご参考ください
- docker machineのIPアドレスは192.168.99.100とします (Macだとデフォルトでこれになるはず)
- `docker`コマンドがすでに使える状態を前提で話を進めていきます

# 複数nodeでなくて良い、かつ、pluginの追加が必要ない時は

- 公式イメージをそのまま利用すれば良い
- コンテナ起動

```bash
$ docker run -d -p 9200:9200 -p 9300:9300 elasticsearch
```

- Elasticsearchが動いていることの確認

```bash
$ curl http://192.168.99.100:9200
{
  "name" : "Wong",
  "cluster_name" : "elasticsearch",
  "version" : {
    "number" : "2.3.4",
    "build_hash" : "e455fd0c13dceca8dbbdbb1665d068ae55dabe3f",
    "build_timestamp" : "2016-06-30T11:24:31Z",
    "build_snapshot" : false,
    "lucene_version" : "5.5.0"
  },
  "tagline" : "You Know, for Search"
}
```

- クエリをちょっと確認したいなどの場合はこれで十分と思われる
- pluginの追加はできない
- 追加でもう一台nodeを立ち上げてもnode同士のリンクはしてくれない (Dockerコンテナをリンクさせればできるらしいがやり方がわからなかった)

# 複数nodeのclusterを作成するには

Elasticsearchの設定に一行追加するだけでできるようになるので、Docker imageを自分で作成する。
ついでにkuromoji pluginも追加してみる。

## Dockerfileファイルの準備

- 公式イメージを流用
- Elasticsearchはzen discoveryを使ってnodeを探しているとのことなので、docker machineのIPを設定してあげることで他のコンテナ(node)が見つかるようになる(らしい)
- kuromoji pluginもインストール
  - 他のpluginも欲しい時は色々追加してOK
- ちなみにユーザーがrootのままでElasticsearchを起動すると、「rootで起動するな」とJava RuntimeExceptionが吐かれるので、elasticsearchユーザーに切り替えています

```:Dockerfile
FROM elasticsearch

ENV DOCKER_MACHINE_IP         192.168.99.100
ENV ELASTICSEARCH_CONFIG_FILE /usr/share/elasticsearch/config/elasticsearch.yml

RUN echo "discovery.zen.ping.unicast.hosts: [¥"$DOCKER_MACHINE_IP¥"]" >> $ELASTICSEARCH_CONFIG_FILE

USER elasticsearch
RUN plugin install analysis-kuromoji
CMD elasticsearch
```

## Docker imageの作成

- docker image名をここでは`trial/es`としていますが、自分のお好みで変更してください
- Dockerfileが置いてあるディレクトリにいる想定のコマンドです

```bash
$ docker build -t trial/es .
```

## コンテナを起動 & Elasticsearchの動作確認

```bash
$ docker run -d -p 9200:9200 -p 9300:9300 trial/es

$ curl http://192.168.99.100:9200
```

## もう一台コンテナを起動 & Elasticsearchの動作確認

- ポートが被らないように変更していることに注意

```bash
$ docker run -d -p 9201:9200 -p 9301:9300 trial/es

$ curl http://192.168.99.100:9201
```

## 2つのnodeがリンクしていることの確認

- `node.total`が`2`となっていれば成功

```bash
$ curl http://192.168.99.100:9200/_cat/health?v
 epoch      timestamp cluster       status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent 
 1468301909 05:38:29  elasticsearch green           2         2      0   0    0    0        0             0                  -                100.0% 
```

## pluginの動作確認

- kuromoji pluginの動作確認は[こちらの記事](http://d.hatena.ne.jp/Kazuhira/20160201/1454320930)を参考にやってみてください

# 最後に

- ダメなとこやわかりにくいところがあったら、遠慮なくコメントしてください。直します

# 参考にさせていただいた記事のリンク

- https://tech.recruit-mp.co.jp/infrastructure/docker-elasticsearch/
- http://qiita.com/jun-1/items/11edfe8fae71a3e958ce
- http://d.hatena.ne.jp/Kazuhira/20160201/1454320930
Rでfizzbuzz

#概要
Rでfizzbuzzやってみた。
#サンプルコード
```
for (i in 1:100)
{
    f <- ifelse(i %% 3 == 0, "Fizz", i)
    f <- ifelse(i %% 5 == 0, "Buzz", f)
    f <- ifelse(i %% 15 == 0, "FizzBuzz", f)
    cat(f)
    cat(" ")
}

```
#サンプルコード
```
zundoko　<- function() {
    str0 <- "ズン"
    str1 <- "ドコ"
    r <- runif(1, 0, 2)
    if (r < 1)
    {
        return(str0)
    }
    else
    {
        return(str1)
    }
}
i <- 0
j <- 0
while (j < 1) 
{
    s <- zundoko()
    cat(s)
    cat(" ")
    if (is.element(s, "ドコ")) 
    {
        if (i == 4) 
        {
            j <- 1
        }
        i <- 0
    }
    else
    {
        i <- i + 1
    }
}
cat("キ・ヨ・シ！")

```
laravelのhomesteadをプロジェクトごとにインストールする

自分の備忘録として

# 目的
vagrantの上に、プロジェクトごとにlaravelを使えるように、プロジェクトごとにhomestead環境を作る

# 前提
ローカルにcomposerインストール済み
ローカルでvagrant使える（virtualboxかVMwareある）
ローカルでphpが使える
（homesteadのboxのDLに時間がかかるので、回線環境がよいほうがいい）

# 全体の流れ

ローカルにて
・プロジェクトを作る
・homesteadインストール
・vagrantup

## プロジェクト作る
ローカルにて、プロジェクト（フォルダ）を作ります。
プロジェクトを作りたいフォルダ（例えば、/Users/egushin/work/）に移動して、

```command
composer create-project laravel/laravel pjname "5.1.*"
```

これで、/Users/egushin/work/にpjnameというフォルダができます。

## homesteadをインストールします。

### vagrantのlaravel用boxであるhomesteadを入れます。
この作業は、プロジェクトごとでなくても、一度マシンに入れてしまえば不要な作業

```command
vagrant box add laravel/homestead
```

### プロジェクトディレクトリに移動

```command
cd pjname
```

### homesteadを入れます。

```command
composer require laravel/homestead --dev
```

完了すると
Homestead Installed!
とおっしゃる

### vagrantファイルなどを生成する

```command
php vendor/bin/homestead make
```

これで、Vagrantfileなどが作られたはずです。

```command
vagrant up
```

これで、設定のホストまたは、IP（僕の場合は、192.168.10.10でした）にアクセスすると
下記画像

<img width="1504" alt="スクリーンショット 2016-07-14 9.10.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/118724/91b0a60d-c7d9-4212-00f7-af12f60194dd.png">


# その他設定をば

homestead.yamlとかをごにょごにょします。
Thunderbird が急に初期化されてて絶望しかけた

ある朝PCを立ち上げたら、Thunderbirdがおもむろにアカウント設定とか質問してきました。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/111100/991a653f-7802-8526-823d-3dcdaf5969a7.png)

現実逃避するためにPC再起動とかしたんですが当然このまま。
終わったな…と思ったのですが、バックアップのおかげで事なきを得た話です。

### バックアップからの復元
この現象は、どうもプロファイルがうまく読めなくなることで起こるようです。(なぜ読めなくなってしまうかは不明)
具体的には、`%APPDATA%\Thunderbird\Profiles\(プロファイルフォルダ)\pref.js` が破損してしまったことが原因のよう。
ちなみに、`(プロファイルフォルダ)` は、名前が`ランダム文字列.defalut`とかなっているフォルダです。

ということで、このpref.jsをバックアップしていたファイルと置き換えることで正常に動作するようになりました。

### バックアップ、しましょう
今回は何事もなく済みそうですが、これがバックアップしていなかったら、と思うとぞっとしませんね。
是非、定期的にバックアップを取るようにしましょう。
僕の場合は、`%APPDATA%\Thunderbird`をフォルダごと毎日バックアップするように設定しています。
Julialangで入れたpythonにモジュールを追加するには

# 背景

JuliaにはPythonを呼べるPyCallなるパッケージがある。
これを利用したPyPlot.jlや、PySym.jlなどあり、
matplotlibや、pysymはこれらのパッケージを入れると、自動的に
Julia内のPythonに該当のモジュールが追加される。

今回は、これを手動で行うことを調べた。

# pyimport_conda を使えば良い

よくよくPyCallのGithubのページを読むと書いてあった。

```jl
using PyCall
pyimport_conda("scipy", "scipy")
```

引数の意味は、よくわかってない。condaが分かる人なら
分かるのでは。

## 確認

```jl
@pyimport scipy.stats as stats
stats.hmean([1, 2, 4])
```

# 念のため

PyCallを入れる際に、明示的に利用したいPythonを指定している方は、
この方法は使えないと思われ、適宜、pipなりで使いたいモジュールを
入れる必要がありそう。

# 関連投稿

- [Blenderにpipを入れる - Qiita](https://qiita.com/kjunichi/items/a36fdc9db3876e068249)

# 関連記事

- [Julia言語で任意の点を散布図を描画するには](https://abrakatabura.hatenablog.com/entry/2016/11/12/081354)
- [1/7がつくる楕円をJulia言語でプロットする](https://abrakatabura.hatenablog.com/entry/2016/10/29/075535)
- [mruby-juliaでPythonもmrubyから呼び出せるようになった](https://abrakatabura.hatenablog.com/entry/2016/07/02/183532)
- [JulialangにHTTP2サーバーをさせたら](https://abrakatabura.hatenablog.com/entry/2015/12/10/070837)
- [aobenchをjuliaでやってみた](https://abrakatabura.hatenablog.com/entry/2016/07/15/074022)
- [Juliaで日本語のワードクラウドをやってみた](https://abrakatabura.hatenablog.com/entry/2018/06/24/102702)
Processing / ControlP5 > sliderの試用 > ControlEvent / " controller() has been deprecated (and is still available in the ControlP5 class) ...

```txt:動作環境
Processing 3.1.1
ControlP5ライブラリ
Windows 8.1 pro (64bit)
```

参考 http://qiita.com/akspect/items/6a574e12181c00125d40
参考 http://www.kasperkamperman.com/blog/processing-code/controlp5-library-example1/

## code

```java
import processing.serial.*;
import controlP5.*;

Serial myPort;

ControlP5 slider;
int sliderValue;
int numSerial = 5;
int curSerial = -1;

void setup() {
  size(500,500);
  slider = new ControlP5(this);
  slider.addSlider("COM")
    .setRange(-1, numSerial - 1)
    .setValue(-1)
    .setPosition(50,40)
    .setSize(200, 20)
    .setNumberOfTickMarks(numSerial + 1);
}

void controlEvent(ControlEvent theEvent) {
  if (theEvent.isController()) {
//     if (theEvent.controller().name() == "COM") {
     if (theEvent.getName() == "COM") {
       if (curSerial != slider.getValue("COM")) {
         curSerial = (int)slider.getValue("COM");
         print("Serial=");
         println(curSerial);
       }
     }
  }
}

void draw() {
  background(0);  
}
```

```
//     if (theEvent.controller().name() == "COM") {
```
の行は古いとのこと（下記）。getName()を見つけて対応した。

https://forum.processing.org/one/topic/controlp5-problem-27-4-2012.html
> " controller() has been deprecated (and is still available in the ControlP5 class) in favor of getter/setters methods, controller(String) is now available as getController(String)" 

参考 http://www.sojamo.de/libraries/controlP5/reference/controlP5/ControlEvent.html#getController--


## 動作

スライダーを動かすとCOMの値を変更する。
変更した時にコンソールに「Serial=-1」のような表示がされる。

これにより、複数のCOM接続の切替えをもくろんでいる。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/27c7d2af-5185-3184-f9d6-8886ad1b53b6.png)
技術英語 > if you're ever allowed to [jettison] the old code or refactor it, 

@ Code Complete (No. 3333 / 36077)

> and (2) if you're ever allowed to <font color=red>jettison</font> the old code or refactor it, ...

http://eow.alc.co.jp/search?q=jettison&ref=sa

> `2. 〔重荷になるもの・不要なものを〕取り除く
ExcelのCHAR関数の文字コードを調べてみた。

こんにちは!この間、ExcelVBAを久しぶりに触ってみました。
すると、セル内で改行するときにCHAR(10)と入力したので調べてみました。
なお、[エクセルの学校](http://www.excel.studio-kazu.jp/func/char.html)さんからの引用が多いです。

#CHAR関数まとめ
CHAR
• 読み：キャラクター
• この関数は 内部コードに対応する文字 に変換します
• コードとして、1から255までの数値、8481から39038までの数値が指定できます
• 下図の例 =CHAR(A4) は 48 が変換されて 0 と表示されます 

•他の例
=CHAR(9) → Tab (Tab)
=CHAR(10) → LF (Line Feed) 改行 → 応用例 → セル内で改行する (tp0046)
=CHAR(13) → CR (Carriage Return)
=CHAR(33) → !
=CHAR(34) → "
=CHAR(35) → #
=CHAR(36) → $
=CHAR(37) → %
=CHAR(38) → &
• 逆の関数 → 文字 を 内部コード に変換 → CODE 関数

$$\style{align: center; font-family: "Helvetica Neue",Helvetica,"ヒラギノ角ゴ ProN W3","Hiragino Kaku Gothic ProN","メイリオ",Meiryo,sans-serif}{\text{参考:エクセルの学校}}$$

#感想
便利で覚えといたほうがいいですね。
[エクセルの学校](http://www.excel.studio-kazu.jp/func/char.html)
自作ミュージックアプリで MPRemoteCommandCenter と MPNowPlayingInfoCenter が機能しなくて悩んだ

ロック画面に再生中楽曲の情報が表示されないという現象に悩まされました。結局のところ AVAudioSession のカテゴリーオプションを `.DuckOthers` としていたのが原因で、これは `.DefaultToSpeaker` にしないとだめなようです。

```swift
let session = AVAudioSession.sharedInstance()
do {
	try session.setCategory(AVAudioSessionCategoryPlayback, withOptions: .DefaultToSpeaker)
}
catch {}
```
Background Modes の `Audio, AirPlay and Picture in Picture` も有効にしておきましょう。
![](https://qiita-image-store.s3.amazonaws.com/0/3603/669050f1-c726-2af9-72a8-e3fe627ba9a8.png)


# MPRemoteCommandCenter, MPNowPlayingInfoCenter とは

それぞれ MediaPlayer フレームワークのクラスです。

- MPRemoteCommandCenter
ロック画面やコントロールセンターなどから音楽の遠隔操作をできるようにするためのイベントハンドラーです。`remoteControlReceivedWithEvent(event: UIEvent?)` を使うやり方もありますがこれは 7.0 までの古い仕組みらしく、よりモダンなこちらの方が便利だと思います。

- MPNowPlayingInfoCenter
再生中楽曲の情報を表示するためのクラスです。AirPlay している Apple TV でも使われます。

<img width=375 src="https://qiita-image-store.s3.amazonaws.com/0/3603/9f329d83-12bd-1cd2-9b6b-48dcafdb7540.png"> <img width=375 src="https://qiita-image-store.s3.amazonaws.com/0/3603/2862ff27-ec0b-6af6-0de1-b2a340c30cec.png">
ソートキータイプについて


参考: [【新機能】Amazon Redshift の Interleaved Sorting機能を試してみた ｜ Developers.IO](http://dev.classmethod.jp/cloud/aws/redshift-interleaved-sorting/)


# COMPOUND SORTKEY

* 通常のRDB等のインデックスの考え方に近い。
* 第１キーが検索条件に含まれていると早く絞り込めるが、第１キーが含まれていないとスキャンする範囲が広がる
* 検索項目が固定的（予測可能）でその項目を設定すればパフォーマンスが上がる。

# INTERLEABED SORTKEY

* ソートキーが多次元的に配置される
* いろんな検索項目（フィルタ条件）の組み合わせでもパフォーマンスを落とさずに検索範囲を絞り込むことができる。
* 検索項目が動的（予測できない）場合に効果を発揮する。
Turbolinks5のイベント


ローカル開発環境を bundle update したら Turbolinks が動かなくなって困ったのでいろいろ調べた。[^1]

Google で `turbolinks rails` のキーワードで検索してヒットするほとんどの記事に書いてある `page:xxxx` というイベントがまったく発生しなくなってることが判明。

## 記載時のバージョン

```
"version": "5.0.0"
```

## イベントの一覧

https://github.com/turbolinks/turbolinks

Readmeからイベントを抜粋（いまいち理解できない箇所はそのまま、かつ、意訳してるのでまちがってたら指摘please）

| イベント名 |  説明  |
|----------|--------|
|turbolinks:click|リンクをクリックしたときに発火。クリックされたelementがイベントターゲット。`event.data.url` からリクエスト先のURLを取得できる。Cancel this event to let the click fall through to the browser as normal navigation.|
|turbolinks:before-visit|ヒストリーの場合を除きページ遷移ときに発火。`event.data.url` からリクエスト先のURLを取得できる。イベントをキャンセルすることでページ遷移を中断することができる。|
|turbolinks:visit|ページ遷移が開始したら発火する。|
|turbolinks:request-start|ネットワークを通じてリクエストが発行される前に発火。 `event.data.xhr` から XMLHttpRequest オブジェクトにアクセス可能。|
|turbolinks:request-end|リクエスト完了後に発火。`event.data.xhr` から XMLHttpRequest オブジェクトにアクセス可能。|
|turbolinks:before-cache|現在のページをキャッシュにセーブする直前に発火。|
|turbolinks:before-render|現在のページをレンダリングする直前に発火。`event.data.newBody` から新しい<body>エレメントにアクセス可能。|
|turbolinks:render|ページのレンダリング完了直後に発火。このイベントはキャッシュされたページをレンダリングした場合、新しいページをレンダリング場合の２回発生？(This event fires twice during an application visit to a cached location: once after rendering the cached version, and again after rendering the fresh version.)|
|turbolinks:load|最初のページのロード時１回及び、Turbolinksによるページ遷移時に発火。`event.data.timing`から timing metrics にアクセス可能？(Access visit timing metrics with the event.data.timing object.)|


[^1]: 更新前 turbolinks (2.5.3) -> 更新後 turbolinks (5.0.0) 一気にバージョン上がってるの気づかなかった...
さくらVPS カスタムOSインストール

さくらVPSに、CentOS7(x86_64)をインストールする手順を記します。
###　目次
* カスタムOSのインストールの選択
* CentOSのインストール

### 手順
#### カスタムOSのインストールの選択
##### 1. コントロールパネルを開きます。
<https://secure.sakura.ad.jp/vps/#/login>
<img width="1678" alt="コントロールパネル" src="https://qiita-image-store.s3.amazonaws.com/0/64552/96ebc733-aac8-2fca-630b-06913b0e2d85.png">

##### 2. 一覧からOSインストールするVPSを選びます。
<img width="1680" alt="設定するVPSを選択" src="https://qiita-image-store.s3.amazonaws.com/0/64552/479b8607-4266-d3ce-7247-b178252a5480.png">

##### 3. 「OSインストール」-「カスタムOSインストール」を選択します。
<img width="1680" alt="OSインストールを選択" src="https://qiita-image-store.s3.amazonaws.com/0/64552/9cbd4178-fadb-8043-e0ce-13d38b1487dd.png">

##### 4. CentOS7x86_64を選択します。
<img width="1680" alt="CentOS7x86_64を選択" src="https://qiita-image-store.s3.amazonaws.com/0/64552/bc835e3e-1a1c-5755-1cca-86f711e0f05c.png">

##### 5. 「変更内容を確認する」ボタンを選択します。
<img width="1680" alt="変更内容を確認するボタンを選択" src="https://qiita-image-store.s3.amazonaws.com/0/64552/4f2e13bd-4941-b8e6-a461-de66251ce605.png">

##### 6. 「インストールを実行する」ボタンを選択します。
<img width="1680" alt="インストール実行" src="https://qiita-image-store.s3.amazonaws.com/0/64552/ba1f9481-0a84-dbea-ecc0-60ee9dac3729.png">

#### CentOSのインストール
##### 1. 「Install CentOS 7」を選択し、「Enter」キーを押します。
<img width="643" alt="インストーラの起動" src="https://qiita-image-store.s3.amazonaws.com/0/64552/fda19433-0eda-70be-eb01-0cf8104923b2.png">

##### 2. 「INSTALLATION DESTINATION」を選択します。
<img width="1280" alt="「INSTALLATION DESTINATION」を選択" src="https://qiita-image-store.s3.amazonaws.com/0/64552/40630b43-d437-c4a6-572b-5870ea3ade01.png">

##### 3. 「Virtio Block Device」を選択します。
<img width="1280" alt="「Virtio Block Device」を選択" src="https://qiita-image-store.s3.amazonaws.com/0/64552/b9b66750-d68e-dbe6-e1dd-918a99e529ac.png">

##### 4. 「Reclaim space」を選択します。
<img width="1283" alt="「Reclaim space」を選択" src="https://qiita-image-store.s3.amazonaws.com/0/64552/2bbc5422-6d68-d031-6416-381c582fff5c.png">

##### 5. 「Begin Installation」を選択します。
<img width="1280" alt="「Begin Installation」を選択" src="https://qiita-image-store.s3.amazonaws.com/0/64552/930d6618-73a7-f1d1-19b1-b15aaf08fa57.png">

##### 6. 「Begin Installation」を選択します
<img width="1278" alt="「Begin Installation」を選択" src="https://qiita-image-store.s3.amazonaws.com/0/64552/afd6533e-ac18-1a29-b29b-4bdb5d77b2f9.png">

##### 7. rootパスワードを設定します。
<img width="1279" alt="rootパスワードを設定g" src="https://qiita-image-store.s3.amazonaws.com/0/64552/52ce10f4-e12c-6db4-8a00-35474770991b.png">

##### 8. OSインストールが終わるのを待ちます。
<img width="1280" alt="待機中" src="https://qiita-image-store.s3.amazonaws.com/0/64552/1dc16c99-519a-4345-3480-db30e95855cc.png">
KerasでImageNetのハンバーガーと自転車を分類した

[ImageNet](http://www.image-net.org/)から取得した画像でデータセットを作って、分類してみた。

同じコードで、何故かうまく行く時と、そうでない時があって原因はよくわからない。[^1]
notebookはこちら：https://gist.github.com/juntaki/263d9c43c0509c6610bdf95a59867e99
[^1]: Kerasのバグ？
以下はノートの解説です。

## データのダウンロード

ImageNetで検索したURLリストを適当な場所に保存したら、画像をダウンロードする。
容量が異常に小さいものや、テキストファイルは失敗しているので捨てる。

~~~
cat ../urllist | xargs wget -T1
~~~

## 画像読み込み

Kerasに渡すにはRGB画像なら、[3(RGB), 50(縦), 50(横)]のようにする必要がある。
Image.open()で来たものは[50,50,3]となっているため、transpose()で順序を変更している。
引数は、[0,1,2]を[2,0,1]にするという意味。

~~~
    im_reading = np.array( Image.open(i).resize((50,50)))
    im_reading = im_reading.transpose(2,0,1)
~~~

## データセット作成

さらに、Kerasに入力するには、[サンプル、3,50,50(RGB画像)]のnp.arrayにしなければならないので、
空の配列にappendしていく形でデータセットを作成した。pythonのarrayと違って、最初に行列サイズを定義してやる必要がある。また、画像のdtypeはuint8なので、unsignedで揃えないとimshow()でうまく画像として表示できなくなる（学習だけなら支障はなさそうだが）[^2]。

[^2]: 読み込みにやたらと時間がかかるので、もっと良いやり方があるはず。格納のたびにメモリコピーが発生してしまっているかも、未確認。

~~~
image = np.empty((0,3,50,50), dtype=np.uint8)
...
    image = np.append(image, [im_reading], axis=0)
~~~

## 画像表示

入れ替えた順序を戻すと、表示できる。

~~~
plt.imshow( image[number].transpose(1,2,0) )
~~~

## データセット分割

scikit-learnにデータセットをトレーニング用とテスト用に分割する関数がある。
データセットは順番にappendしているので前後で綺麗にわかれてしまっているが、この関数を通せばランダムにピックアップして分割してくれる。

~~~
from sklearn.cross_validation import train_test_split
data_train, data_test, labels_train, labels_test = train_test_split(image, result, test_size=0.10, random_state=10)
~~~

## モデルの定義と学習

モデルの中身はコンボリューション層とMaxpoolingを適当に重ねてみたもの。

~~~
model = Sequential()
model.add(Convolution2D(96, 3, 3, border_mode="same", activation="relu" ,input_shape=(3, 50, 50) ))
model.add(Convolution2D(96, 3, 3, border_mode="same", activation="relu"))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Convolution2D(96, 3, 3, border_mode="same", activation="relu"))
model.add(Convolution2D(96, 3, 3, border_mode="same", activation="relu"))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Convolution2D(96, 3, 3, border_mode="same", activation="relu"))
model.add(Convolution2D(96, 3, 3, border_mode="same", activation="relu"))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.5))

model.add(Flatten())
model.add(Dense(512))
model.add(Activation("relu"))
model.add(Dense(10))
model.add(Activation("relu"))
model.add(Dense(2))
model.add(Activation("sigmoid"))
#model.summary()
model.compile(loss='binary_crossentropy', optimizer="adadelta", metrics=['accuracy'])
~~~

## 結果

2クラスの単純な分類だが、適当に選んだラベル付き画像を読み込んで、90％の精度を出せた。
LINQと匿名関数でほげ

C#、使ってるとけっこう楽しいよね。

```csharp
var elems = new string[]{ "a001", "a002", "ccc", "ddd", "a003", "fff", "ggg" };
Func<string, bool> f = (string s ) =>
{
    return ("a" == s.Substring(0, 1));
};


var result = elems.Where(x => f(x));

Console.WriteLine(string.Join(",", result));

```
【プログラマーのための数学】三角関数（sinθ，cosθ，tanθ ) - サイン、コサイン、タンジェント

## 目次
[プログラマーのための数学 - 目次](http://qiita.com/Esfahan/items/ab63e7c5bcf812dff2a9)

## 三角関数 sinθ，cosθ，tanθ
三角関数というのは、sin（サイン）、cos（コサイン）、tan（タンジェント）とかのことです。

どういう時に使うのかというと、直角三角形の2辺の長さと角度が与えられた時、残りの辺の長さを求めるためなどに利用します。

一言で言うと・・・

cosθ(コサイン)というのは、座標におけるx座標、
sinθ（サイン）というのは、y座標のことです。

**とりあえず、下記の方程式をとにかく覚えてください！**

![sct_001.gif](https://qiita-image-store.s3.amazonaws.com/0/105936/bbef36fd-ab1f-4104-ebfe-90fad416411b.gif)
出典：http://alg.cias.osakafu-u.ac.jp/webMathematica/HighSchool/tri_ratio/theme0.jsp

上図のような直角三角形があるとき、下記の方程式が成り立ちます。

```
sinθ = a / c
cosθ = b / c
tanθ = a / b
```

この方程式が成り立つのは、下記の条件の時だけです。

```
∠C = 90° 且つ 0°＜θ＜90°
```

`∠C`が`90°`であり、`θ`が`0°`以上`90°`以下であること、
つまり、直角三角形の場合のみ成り立ちます。



## 単位円を用いて三角関数を理解する
![vector_004.gif](https://qiita-image-store.s3.amazonaws.com/0/105936/6211b746-640d-8a42-58b1-be34047b2566.gif)
出典：[進研ゼミ](http://kou.benesse.co.jp/nigate/math/a13m0302.html)

上記の図のように、
単位円(半径1の円)の原点(円の中心)から引いた線の、x軸から原点方向への角度をθとしたとき、

```
点Pの座標 = (cosθ, sinθ)
sinθ = (点Pのy座標)
cosθ = (点Pのx座標)
```

となります。

つまり、こういこうことです。

![sct_002.png](https://qiita-image-store.s3.amazonaws.com/0/105936/1fdd4ccc-7b69-27fe-8a2a-12d3a0e0b25a.png)
出典：[東大生が教えるビジュアル数学](http://www24.atpages.jp/venvenkazuya/math1/trigonometric_ratio2.php)

繰り返しになりますが、
cosθ(コサイン)というのは、座標におけるx座標、
sinθ（サイン）というのは、y座標のことです。
上図のように、`(cosθ, sinθ)`という座標になります。

よって、x,yの座標を求める方程式は、下記ということになります。

```
xの座標 = sinθ = a / c
yの座標 = cosθ = b / c
```

この方程式は、[余弦定理](http://qiita.com/Esfahan/items/421619087c29cf0feed5)の話で、大活躍します。

以上


参考：
[公式不要！単位円を使ったcos,sin,tanの簡単理解](http://www24.atpages.jp/venvenkazuya/math1/trigonometric_ratio2.php)
[高校生の苦手解決Q&A](http://kou.benesse.co.jp/nigate/math/a14m0313.html)

[関連記事]
[プログラマーのための数学 - 目次](http://qiita.com/Esfahan/items/ab63e7c5bcf812dff2a9)
俺なりのNginxとhttpdの新婚生活

# 前書き

nginxとapacheを共存させるための備忘録です。

うざい記事ですがよろしくお願いします。

# 自己紹介

大阪を拠点に活動しているフロントエンドエンジニアです。HAL大阪2年生です。

Twitterやってます。

[@konojunya](http://twitter.com/konojunya)

## 新婚生活の登場人物

nginxくんとhttpdちゃん。

## 生活の場所

centosという名のエデン

# Nginxくん

yumなどでinstallしてください。

.confファイルを書き足します。

```
$ vim /etc/nginx/conf.d/hoge.conf
```

中身はこんな感じ

```
server {
	listen 80;
    server_name  hoge.com;

    location / {
            proxy_pass http://localhost:<portを指定>;

            proxy_redirect                          off;
            proxy_set_header Host                   $host;
            proxy_set_header X-Real-IP              $remote_addr;
            proxy_set_header X-Forwarded-Host       $host;
            proxy_set_header X-Forwarded-Server     $host;
            proxy_set_header X-Forwarded-For        $proxy_add_x_forwarded_for;
    }
}
```

ここまできたらnginxを立ち上げます。

```
$ sudo service nginx start
```

# httpdちゃん

同じくyumなどでinstallしてください。

.confファイルを書き足します。

```
$ vim /etc/httpd/conf.d/hoge.conf
```

中身はこんな感じ

```
<VirtualHost *:<さっき指定したport>>
  ServerName hoge.com
  DocumentRoot "/var/www/hoge"
  DirectoryIndex index.html index.php
  AdddefaultCharset UTF-8
  <Directory "/var/www/hoge">
    AllowOverride All
  </Directory>
</VirtualHost>
```

書いたら次はhttpd.confを書き換えます。

```
$ vim /etc/httpd/conf/httpd.conf
```

３か所ほどいじります。

### 1 - Listenを変えよう。

Listenを8080に変えましょう。

```
# prevent Apache from glomming onto all bound IP addresses (0.0.0.0)
#
#Listen 12.34.56.78:80
Listen 80 これを
Listen 8080　こうする

#
# Dynamic Shared Object (DSO) Support
#
# To be able to use the functionality of a module which was built as a DSO you
```

### 2 - DocumentRootを変えよう。

DocumentRootを/var/www/htmlになっているのを/var/wwwにかえる
（ここはもしかしたらしなくてもいいかもしれないです。）

```
# symbolic links and aliases may be used to point to other locations.
#
DocumentRoot "/var/www/html" ここを
DocumentRoot "/var/www" こうする
#
# Each directory to which Apache has access can be configured with respect
# to which services and features are allowed and/or disabled in that
```

### 3 - NameVirtualHostを変えよう。

NameVirtualHostを8080に変えましょう

```
#
# Use name-based virtual hosting.
#
NameVirtualHost *:80 ここを
NameVirtualHost *:8080 にしましょう
#
# NOTE: NameVirtualHost cannot be used without a port specifier
# (e.g. :80) if mod_ssl is being used, due to the nature of the
```


これであとはhttpdを動かせば、もう二人はメロメロなわけです。

```
$ sudo service httpd start
```

新婚さんファイトです( ´ ▽ ` )ﾉ
slを見たいけどディレクトリを汚したくない時のためのスクリプト

#slが見たかっただけなんです
どうしてもslを見たくて、作ってしまった。後悔はしていない。
コマンドを繋げただけだが、同じ気持ちになった誰かに貢献できれば幸いである。

```sh:sl.sh
curl -sl  http://www.tkl.iis.u-tokyo.ac.jp/%7Etoyoda/sl/sl.tar | tar xv && cd sl && make && ./sl && cd ..  && rm -rf sl

```

初歩的なワンライナーを書けた気がします
コードハイライトについてご指摘いただき修正しました
お名前.comで取得したドメインのサブドメインをさくらレンタルサーバーで使う

##さくらレンタルサーバーでの確認
1. サーバーコントロールパネルにログインする
2. 左のリボンの「サーバ情報とパスワード」の「サーバ情報の表示」を選択
3. 「* サーバに関する情報 *」の表のIPアドレスをメモする


##お名前.comでの設定
1. [ドメイン Navi](https://www.onamae.com/navi/domain.html)にログイン
1. 上の4つのタブの「ドメイン設定」から「DNS関連機能の設定」を選択
1. 変更したいドメインを選択し、「次へ進む」ボタンをクリック
1. 「DNSレコード設定を利用する」を選択
2. ページ中段の入力フォームに入力する
![form.png](https://qiita-image-store.s3.amazonaws.com/0/95469/4600afd3-106f-2b83-7263-00af80e41da3.png)
    - ホスト名には作成したいサブドメイン
    - VALUEにはさっきのさくらレンタルサーバーのIPアドレスを入力して
    - 追加する
6. 一番下の「確認画面へ進む」をクリック
7. 確認ページに遷移するので、一番下の「設定する」をクリック
8. このページが出て
![loading.png](https://qiita-image-store.s3.amazonaws.com/0/95469/4a60ded6-c329-7534-f4f7-fc140a75ba84.png)

9. 「お手続きを受け付けました。お名前.com会員情報のメールアドレス宛に申請・変更内容を記載したメールを送信します。」と表示されたページがでれば完了

##さくらレンタルサーバーでの設定
1. 左のリボンの下の方の「ドメイン設定」から「ドメイン設定」を選択
![スクリーンショット 2016-07-14 1.08.27.png](https://qiita-image-store.s3.amazonaws.com/0/95469/37dc913d-c533-c4f7-1265-5eeaabddbc48.png)

2. 赤い「新しいドメインの追加」ボタンをクリック
3. 「5. 他社で取得したドメインを移管せずに使う・属性型JPドメインを使う（さくら管理も含む）」を選択
![スクリーンショット 2016-07-14 1.07.56.png](https://qiita-image-store.s3.amazonaws.com/0/95469/a21189d8-3db3-e6f6-e06a-9bf2ea6515bc.png)

4. 「他社で取得された独自ドメインのサブドメインを追加」にお名前で作成したサブドメインを入力
![スクリーンショット 2016-07-14 1.09.31.png](https://qiita-image-store.s3.amazonaws.com/0/95469/55abe3aa-3542-6845-4911-28348375dbec.png)
5. 「＊送信する＊」
6. 確認画面に遷移するので、「＊送信する＊」
7. 「ドメイン追加 完了」ページが出たら「>>詳細設定にすすむ<<」を行う
![スクリーンショット 2016-07-14 1.11.17.png](https://qiita-image-store.s3.amazonaws.com/0/95469/57e6b282-4c94-7784-236d-25caf8c138d3.png)
8. 特に何も設定しないが「2. マルチドメインの対象のフォルダをご指定ください」だけ自分のフォルダを指定する必要がある。
9. 入力したら「送信」
10. このページがでたら終わり
![スクリーンショット 2016-07-14 1.17.45.png](https://qiita-image-store.s3.amazonaws.com/0/95469/77306675-5569-f08b-5228-c0f891e23365.png)

おつかれさまでした。
【Objective-C】mailCore2をCocoaPodsで導入

### iOSアプリでメール送信機能をつけたい場合にはCocoaPodsで公開されているmailCore2を利用するのが便利。ネイティブアプリからメーラーの機能を使ってメールの送受信ができる。今回は送信機能を実装した際の自分用メモ。

### 前提条件
* CocoaPodを導入済みであること

### 導入方法
* Podfileに以下を記述

```Podfile
pod 'mailcore2-ios', '~> 0.6'
```

* ターミナルで以下を実行

```cmd
pod update


---
Update all pods
For more information see http://blog.cocoapods.org
and the CHANGELOG for this version http://git.io/BaH8pQ.

Analyzing dependencies
Downloading dependencies

Installing mailcore2-ios (0.6.4)
Generating Pods project
Integrating client project

Pod installation complete! There are 11 dependencies from the Podfile and 13 total pods installed.
```

* 実装内容

```sendMail.m
- (void)sendMailBySample {

    MCOSMTPSession *smtpSession     = [[MCOSMTPSession alloc] init];
    smtpSession.hostname            = HOST_NAME;   // SMTPサーバのアドレス
    smtpSession.port                = SMTP_PORT;   // ポート番号
    smtpSession.username            = USER_NAME;   // メールサーバのユーザ名
    smtpSession.password            = PASSWORD;    // メールサーバのパスワード
    smtpSession.authType            = MCOAuthTypeSASLPlain;
    smtpSession.connectionType      = MCOConnectionTypeStartTLS;

    [smtpSession setCheckCertificateEnabled:NO];

    MCOMessageBuilder *builder      = [[MCOMessageBuilder alloc] init];

    // 送信元メールアドレス
    MCOAddress *sourceAddress       = [MCOAddress addressWithDisplayName:DISPLAY_NAME
                                                                 mailbox:SOURCE_ADDRESS];
    // 送信先メールアドレス
    MCOAddress *destinationAddress  = [MCOAddress addressWithDisplayName:nil
                                                                 mailbox:DESTINATION_ADDRESS];

    [[builder header] setFrom:sourceAddress];
    [[builder header] setTo:@[destinationAddress]];
    [[builder header] setSubject:[NSString stringWithFormat:@"Subject"]];
    

    [builder setHTMLBody:Body];

    NSData *messageBody = [builder data];
    
    MCOSMTPSendOperation *sendOperation = [smtpSession sendOperationWithData:messageBody];

    [sendOperation start:^(NSError *error) {
        if(error) {
            [self popAlertWithMessage:@"送信結果" message:@"送信に失敗しました"];
        } else {
            [self popAlertWithMessage:@"送信結果" message:@"送信に成功しました"];
        }
    }];
}
```

### 所感
githubからmailcore2をcloneしてソースを取り込み自前実装する方法もあったが、CocoaPodsを利用したほうが楽だったことに気づいた。
Javaで新元号に対応する

新元号に対応したjdkは今後リリースされるはずだけど、そんな簡単にアップデートできない方（自分含む）に。

# 前提
* Oracle JDK 8u92
* $JAVA_HOME設定済み
* 諸々文字コードはutf-8

# 確認用コード
```java:JapaneseEra.java
import java.text.*;
import java.util.*;

public class JapaneseEra {
  public static void main(String[] args) throws ParseException {
    DateFormat df = new SimpleDateFormat("GGGGy年M月d日", new Locale("ja", "JP", "JP"));
    System.out.println(df.format(new Date(System.currentTimeMillis())));
    System.out.println(df.parse("平成28年7月14日"));
    df.setLenient(false);
    System.out.println(df.parse("平成28年7月14日"));
  }
}
```

対応前に実行すると、

```
$ javac JapaneseEra.java; java JapaneseEra
平成28年7月14日
Thu Jul 14 00:00:00 JST 2016
Thu Jul 14 00:00:00 JST 2016
```

まあそうですね、と。

# 新元号に対応する
## 仮に
* 新元号は「機板」
* 2014/03/15 09:00:00+0900から

## その1. 新元号の開始日時をエポックミリ秒にする
1394841600000。
「unix timestamp」なんかでググるか、java.util.Date#getTime()なんかでも変換できるはず。

## その2. 新元号をUnicodeに変換する
```
$ echo "機板" | native2ascii
\u6a5f\u677f
```

## その3. $JAVA_HOME/jre/lib/calendars.properties を編集
calendar.japanese.erasに平成までの定義があるから、そこに新元号を追加。

* nameはその2.のUnicode
* abbrは略称
* sinceはその1.のエポックミリ秒
編集前後のdiffは

```
    	name=Meiji,abbr=M,since=-3218832000000;  \
    	name=Taisho,abbr=T,since=-1812153600000; \
    	name=Showa,abbr=S,since=-1357603200000;  \
   -	name=Heisei,abbr=H,since=600220800000
   +	name=Heisei,abbr=H,since=600220800000; \
   +	name=\u6a5f\u677f,abbr=K,since=1394841600000
    
    #
    # Taiwanese calendar
```

## その4. 確認用コードを再実行する
```
$ javac JapaneseEra.java; java JapaneseEra
機板3年7月14日
Thu Jul 14 00:00:00 JST 2016
Exception in thread "main" java.text.ParseException: Unparseable date: "平成28年7月14日"
	at java.text.DateFormat.parse(DateFormat.java:366)
	at JapaneseEra.main(JapaneseEra.java:10)
```
* 現在のエポックミリ秒は新元号でフォーマットされる
* 平成28年は存在しない（ことになった）から、不正な日付を厳密にチェックするとこける

# その他
* Java6でも同じ方法で大丈夫
* Tomcat等起動中のプロセスに反映するのは再起動が必要だった気がする
* 文字化けする場合はnative2asciiの時に-encodingつけるとか

# 追記
確認用コードでは元号の妥当性を確認するのに```DateFormat#setLenient(false)```ってしてるけど、つまり今の元号で書かれた未来の日付は改元後にパースできなくなる可能性がある。
パース対象によって厳密なチェックが必要か、あるいは```DateFormat#setLenient(false)```で可能かどうか要件に応じて決める必要がある。
Ruby入れたくない人がsassのコンパイルをローカルでする方法

 元ネタ様はこちら。つまりrubyじゃなくてexeが作れるんだよ！

[Windowsで軽量高速なSASS「sassc」を使う＋自動コンパイルする \- Qiita](http://qiita.com/tkosuga@github/items/d8351233e9dcef46bc18)

VisualStudio(2015 Community)がある環境前提。
適当なプロジェクトで以下のコマンドを叩く。

```
git clone https://github.com/sass/libsass

cd libsass
git clone https://github.com/sass/sassc
```

つまり、まずlibsassプロジェクトをcloneして、そのプロジェクトの中にsasscプロジェクトをcloneするという事。こんな事してるのは初めて見たな…
そして`\libsass\sassc\win\sassc.sln` を開いてビルドすると`\libsass\sassc\bin\sassc.exe`にexeが出来ますよと。exe単体で動くっぽいから取り扱い楽でいいね。
そして`sassc.exe inputfile > outputfile.css`で動いてくれる。標準出力に出力するから注意かな。
ヘルプは`sassc.exe -h`。パラメーター無しで起動すると沈黙する。

```
Usage: sassc.exe [options] [INPUT] [OUTPUT]

Options:
   -s, --stdin             Read input from standard input instead of an input file.
   -t, --style NAME        Output style. Can be: nested, expanded, compact, compressed.
   -l, --line-numbers      Emit comments showing original line numbers.
       --line-comments
   -I, --load-path PATH    Set Sass import path.
   -P, --plugin-path PATH  Set path to autoload plugins.
   -m, --sourcemap         Emit source map.
   -M, --omit-map-comment  Omits the source map url comment.
   -p, --precision         Set the precision for numbers.
   -v, --version           Display compiled versions.
   -h, --help              Display this help message.
```

エラーがあったのでそのメモも。
先頭数行がこんなcssで

```css:hoge.sass
@import url(https://fonts.googleapis.com/css?family=Inconsolata);
body { 
	margin-left:0;
	margin-top:0;
	margin-bottom:0;
	margin-right: 300px;
```

こんなエラーが出て怒られた

```
 > .\sassc.exe .\sass.sass                    
Error: Invalid CSS after "body{": expected "}", was "{" on line 3 of sass.sass
>> body{ {
   -----^
```

かなり困ったけど、ファイルの拡張子が`scss`である必要があるっぽい。つまり上記のファイルは`hoge.sass`から`hoge.scss`にすればオッケー。

おわり
<Swift> 隠れUIBarButtonItemを出現させる

# TL;DR

非公開APIを呼び出すことで、UIToolbarの下記Itemが使えるようになります（通常は利用不可）。

* Safariの「進む」「戻る」「上」「下」ボタン
* 地図の「現在地」ボタン

# UIToolbarの画像問題

アプリ内ブラウザを作るときに、頭を悩ませるのが、UIToolbarの「進む」「戻る」ボタン画像の調達・設定です。

ネットには使えそうな画像がたくさん転がっているものの、実際に当ててみると微妙にサイズが違ったり、線の太さが意図したものと違ったりで苦労します。

そこで、コードですべてをまかないたくなりますが、UIBarButtonItemでは、「進む」「戻る」などの基本的なものは、UIBarButtonSystemItemとして公開されていません（代わりになぜか「ゴミ箱」などが公開されています…）。

__今回は、これらを使えるようにUIBarButtonItemをいじってみます。__

# UIBarButtonItemを拡張

```Swift
extension UIBarButtonItem {
    enum HiddenItem: Int {
        case Arrow = 100
        case Back = 101
        case Forward = 102
        case Up = 103
        case Down = 104
    }
    
    convenience init(barButtonHiddenItem: HiddenItem, target: AnyObject?, action: Selector?) {
        let systemItem = UIBarButtonSystemItem(rawValue: barButtonHiddenItem.rawValue)
        self.init(barButtonSystemItem: systemItem!, target: target, action: action)
    }
}
```

# Toolbarに設定

```Swift
        let items =
        [
            UIBarButtonItem(barButtonHiddenItem: .Arrow, target: nil, action: nil),
            UIBarButtonItem(barButtonHiddenItem: .Back, target: nil, action: nil),
            UIBarButtonItem(barButtonHiddenItem: .Forward, target: nil, action: nil),
            UIBarButtonItem(barButtonHiddenItem: .Up, target: nil, action: nil),
            UIBarButtonItem(barButtonHiddenItem: .Down, target: nil, action: nil)
        ]
        
        self.navigationController?.setToolbarHidden(false, animated: false)
        self.setToolbarItems(items, animated: false)
```

#  標準ボタンの出現！


<img src=https://qiita-image-store.s3.amazonaws.com/0/119686/5b434f03-884f-6825-0e48-63b5bfd6c354.png width=300px>

あとは、可変、固定スペースを入れて調整してあげればいいだけですね。
【プログラマーのための数学】三角比

## 目次
[プログラマーのための数学 - 目次](http://qiita.com/Esfahan/items/ab63e7c5bcf812dff2a9)

## 三角比
三角比とは、直角三角形の辺の長さの比のことです。
sinΘ, cosΘ, tanΘか、下記の表のような値で表します。
直角三角形において、直角部分以外の1つの角度がわかれば、三角比が決まります。
(辺の比がわかるのであって、三角形の大きさはわかりません)

## 有名角
下記は、よく使われる三角比の値の表です。
これらは有名角と呼ばれます。

| θ | 0° | 30° | 45° | 60° | 90° | 120° | 135° | 150° | 180° |
| :-- | --: | --: | --: | --: | --: | --: | --: | --: | --: |
| sin∠θ | 0 | 1/2 | √2/2 | √3/2 | 1 | √3/2 | √2/2 | 1/2 | 0 |
| cos∠θ | 1 | √3/2 | √2/2 | 1/2 | 0 | -1/2 | √2/2 | -√3/2 | 1 |
| tan∠θ | 0 | 1/√3 | 1 | √3 | nil | -√3 | -1 | -1/√3 | 0 |

例えば`cos∠60°`は`1/2`となります。

```
cos∠60° = 1/2
```


## 有名角以外
有名角以外の三角比に関しては、下記を参照してください。

三角比一覧表
http://homepage2.nifty.com/NG/unit/Trigonometric-ratio.htm
有名角以外の出し方
http://www.ftext.org/text/section/77

[関連記事]
[プログラマーのための数学 - 目次](http://qiita.com/Esfahan/items/ab63e7c5bcf812dff2a9)
【プログラマーのための数学】三平方の定理 (ピタゴラスの定理)

## 目次
[プログラマーのための数学 - 目次](http://qiita.com/Esfahan/items/ab63e7c5bcf812dff2a9)

## 三平方の定理とは
直角三角形の3辺の長さの関係を表した式
ピタゴラスの定理とか勾股弦の定理（こうこげんのていり）とも呼ばれる。

## 三平方の定理
![triangle.png](https://qiita-image-store.s3.amazonaws.com/0/105936/94d70a0e-c5ef-eaab-a356-43fcfb775a09.png)
出典：[進研ゼミ](http://chu.benesse.co.jp/qat/6434_m.html)

上図のような直角三角形で、直角をはさむ2辺をa,bとし、残り1辺をcとしたとき、下記の式が成り立ちます。

```math
c^2 = a^2 + b^2
```
つまり、直角三角形では、a,bの長さがわかれば、cの長さを求めることができます。

この方程式は、直角三角形のときのみ有効です。
直角三角形でない場合は、余弦定理を使います。
[余弦定理についてはコチラを参照](http://qiita.com/Esfahan/items/421619087c29cf0feed5)

以上

[参考]
http://www.geisya.or.jp/~mwm48961/math/m3pita02.htm
http://www.zkai.co.jp/jr/ikkanko/pdf/am3hy.pdf


[関連記事]
[プログラマーのための数学 - 目次](http://qiita.com/Esfahan/items/ab63e7c5bcf812dff2a9)
rails write_attribute

```rb
class Message < ActiveRecord::Base
	has_ancestry

	def content=(gaga)
		write_attribute(:content,'test')
		binding.pry
	end
end
```

必需写在model的instance_method中,不然会报private method错误, private method就是不能用明确的接收者来call这个方法,这里的话每次比如Message.new(:content => "another")都会覆盖为test

https://github.com/rails/rails/blob/3-0-stable/activerecord/lib/active_record/base.rb#L1416

https://github.com/rails/rails/blob/3-0-stable/activerecord/lib/active_record/base.rb#L1569
VisualStudioでビルド時に「クラスライブラリの出力タイプを持つプロジェクトを直接起動することはできません」と怒られたら…

## 概要
VisualStudioでビルド時に「クラスライブラリの出力タイプを持つプロジェクトを直接起動することはできません」と怒られたら、スタートアッププロジェクトに実行可能なソリューションを設定してください。


## 本題
### エラーの内容
ビルド時にこんなエラーが出たら…

<img width="491" alt="スクリーンショット 2016-07-13 14.43.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/46547/5c5a9880-94bf-b879-f9e0-e7835b4c9ad4.png">

### 解決策
実行可能なプロジェクト名（それまでビルドできていたプロジェクトがあればそのプロジェクト名）を右クリックして、「スタートアッププロジェクトに設定」をクリックしてください。
<img width="373" alt="スクリーンショット 2016-07-13 14.43.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/46547/5451d13b-fe1a-e153-ce4c-8428ab5e8549.png">

### 原因
エラーの内容そのままですが、スタートアッププロジェクトの出力タイプがクラスライブラリに設定されているときビルドできません。

ソリューションに複数のアセンブリがあるとき、例えばunit testを追加しているときなどに気付かないうちに設定を変更してしまっている場合があります。

そもそもビルドできないプロジェクトをビルドできない場合はこの限りではないですが、今回のように簡単な設定変更で解消できることもあるのでお試しください！