OmniAICreator/Qiita-1.07M huggingface dataset:
ボタンタップ時のアニメーションをカスタマイズできるUIButton


漫画アプリのcomicoの応援ボタンをタップした時のアニメーションが素晴らしいと思って、わたしもそれらしいボタンタップアニメーションを作りたいと思って作ってみました。
ほとんどコード書いてないが。。。
iOS7環境がなかったので、試してないですが、多分iOS7でも動くのでは？と思っています。

https://github.com/HIkaruSato/PPParticleButton

![PPPerticleButton.gif](https://qiita-image-store.s3.amazonaws.com/0/37373/dcffde3d-4d11-f4f1-ad03-f156eb62ed32.gif "PPPerticleButton.gif")

##利用方法
1. 上記githubからPPParticleButton.swiftをコピー
2. File->New->File...->Resource->SpriteKit Particle Fileを選択して、sksファイルを作成。sparkなどのdefaultの画像でParticle Fileが作成されるが、次で変更する。
3. Particle File(sksファイル)を好みに編集。好みの画像をParticle Textureにセット。
![PPPerticleButtonSKS_2.gif](https://qiita-image-store.s3.amazonaws.com/0/37373/631c194d-5269-7dde-d20f-3c66aec91b0a.gif "PPPerticleButtonSKS_2.gif")
<br/>

4. コードでPPParticleButtonクラス(UIButtonサブクラス)を初期化または、storyboardのUIButtonのClassにPPParticleButtonクラスを設定する。
![スクリーンショット 2016-01-17 5.19.48.png](https://qiita-image-store.s3.amazonaws.com/0/37373/ab96ad69-b36f-30d8-a082-19c9607acf54.png "スクリーンショット 2016-01-17 5.19.48.png")

<br/>
5. あとはPPPerticleButtonのparticleFileNameMapプロパティにParticle File名(拡張子除く)を設定するだけ。

* ボタンタップ時、常にアニメーションしたい場合

```
ppparticleButton.particleFileNameMap[PPParticleButtonEffectType.Normal] = "Particle File名"
```
<br/>

* ボタンタップ時、ボタンがselected=falseのときだけアニメーションしたい場合

```
ppparticleButton.particleFileNameMap[PPParticleButtonEffectType.UnSelected] = "Particle File名"
```
<br/>


* ボタンタップ時、ボタンがselected=trueのときだけアニメーションしたい場合

```
ppparticleButton.particleFileNameMap[PPParticleButtonEffectType.Selected] = "Particle File名"
```
<br/>


##まとめ
sksファイルはXcodeでグラフィカルに編集できるので、アニメーションの細かい設定をデザイナーさんにもやってもらえそうな気がしています。
まだ、作ったばかりですが、CocoaPodsに対応したり、Wikiもちゃんと書いたりしていこうと思います。
よかったら、ぜひ、使ってみてください！
Crystal 版 Gemnasium を Crystal + MySQL 構成でリリースしました

# Gemnasium とは

[![gemnasium_logo.png](https://qiita-image-store.s3.amazonaws.com/0/51394/8dab883a-015f-8060-9575-17a6f80b0163.png)](https://gemnasium.com/)

[Gemnasium](https://gemnasium.com/) は主に Ruby で使われているウェブサービスで、Gem の依存関係を可視化しウォッチしてくれます。

![Dependency Status](https://gemnasium.com/colszowka/simplecov.svg)

上記のようなバッジも生成できます。README.md に貼り付けることで、依存ライブラリの状態を他の人から見える形で可視化できます。

OSS でのライブラリの開発の際、とても便利なサービスです。

# Shards Rocks とは
[Shards Rocks](https://shards.rocks/) は Gemnasium の Crystal 版にあたるウェブサービスです。私は Gemnasium が好きで、Crystal にそのサービスが無いことを不満に感じていたので、同様なサービスを作ることにしました。

Ruby のライブラリを `gem` と呼ぶのに対し、Crystal では `shard` と呼びます。

Shards Rocks では Gemnasium と同じように、依存ライブラリの状態を表示する機能と、バッジを生成する機能があります。

## 生成されたバッジの例
Crystal の shard では、通常の依存ライブラリと開発に使う依存ライブラリの指定ができます。

[![Dependency Status](https://shards.rocks/badge/github/shardsrocks/sharock-server/status.svg)](https://shards.rocks/github/shardsrocks/sharock-server) [![devDependency Status](https://shards.rocks/badge/github/shardsrocks/sharock-server/dev_status.svg)](https://shards.rocks/github/shardsrocks/sharock-server)

## サービス画面の例
Shards Rocks のレポジトリに対して、この Shards Rocks を適応した例です。

https://shards.rocks/github/shardsrocks/sharock-server

![Screen Shot 2016-01-17 at 03.18.43.png](https://qiita-image-store.s3.amazonaws.com/0/51394/0de7307b-a5fc-f87e-7b10-7bdfc6f67684.png)

# サービス構成
Shards Rocks は全面的に Crystal を利用して開発されています。主な構成は、下記のとおりです。

![Picture1.png](https://qiita-image-store.s3.amazonaws.com/0/51394/6c6841e9-4290-9dfe-8307-13f7a4eadafa.png)

## API サーバー部分
Crystal を開発言語に採用し、ミドルウェアに MySQL と Redis を使っています。
ウェブアプリケーションフレームワークとしては、Sinatra ライクな [Kemal](http://kemalcr.com/) を採用しました。

本サービスは SPA として構成されているため、API サーバーは基本的に JSON を吐くことに特化しています。

ソースコード: https://github.com/shardsrocks/sharock-server

## バックグラウンドワーカー部分
基本的に Crystal を使って開発してありますが、一部ワーカー部分を Go を使って書いてあります。ワーカー部分は resque compatible な [goworker](https://www.goworker.org/) を使っており、ワーカーから exec で Crystal のプログラムを起動しています。

## フロント部分
フレームワークに [Vue.js](http://jp.vuejs.org/) を採用し、[Webpack](https://webpack.github.io/) でビルドしています。記述言語は、[LiveScript](http://livescript.net/)、[LESS](http://lesscss.org/)、[Jade](http://jade-lang.com/) です。

LiveScript で書かれているのは、完全に遊び心です。

ソースコード: https://github.com/shardsrocks/sharock-frontend

# まとめ
Crystal はまだまだ未熟な言語ですが、もともと高速な言語なので、発展途上だからといってパフォーマンス上の問題は発生しません。ライブラリが充実し、言語仕様が安定したら Crystal はもっと実用的に利用できると思います。

バッジをペタペタ README.md にあるのが好きな方は、ぜひ Shards Rocks を使ってください!

# 宣伝
1/22 (金) に東京恵比寿にある Cookpad さんのオフィスで、Crystal の勉強会を開催します。興味のある方は、是非参加してください! Crystal の今後ついて、みんなで議論しましょう。 

- 1/22 (金) 東京 Crystal 勉強会 #3 in 恵比寿<br />
http://crystal.connpass.com/event/22754/
browserify の minify する系トランスフォーマーが webpack に比べて圧縮率が悪い

webpack を使っていた人間が browserify を使ってみたところ、圧縮率が期待通りじゃなかったので少し調べてみた話。

圧縮対象
--------

~~~~~~~~~~~~~~~~~~~~~main.js
var _ = require('lodash');

function printPairs(object) {
  console.log(_.toPairs(object));
}

printPairs({
  a: 1,
  b: 2
});
~~~~~~~~~~~~~~~~~~~~~

モジュールの圧縮率を示すために lodash を呼んでます。

圧縮する
----------

~~~~~~~~~~~~~~~~~~~sh
$ npm install browserify uglifyify minifyify webpack lodash

# webpack
$ ./node_modules/.bin/webpack --optimize-minimize main.js main-webpack.js

# browserify + minifyify
$ ./node_modules/.bin/browserify -p [ minifyify --no-map ] -o main-minifyify.js main.js

# browserify + uglifyify
$ ./node_modules/.bin/browserify -g uglifyify -o main-uglifyify.js main.js
~~~~~~~~~~~~~~~~~~~


比較
--------

~~~~~~~~~~~~~~~~~~~sh
$ ls -sh1 main-*
64K main-minifyify.js
64K main-uglifyify.js
60K main-webpack.js
~~~~~~~~~~~~~~~~~~~

今回のコードは 10% 満たない違いしか無いけれど、babel 関係のものを噛ませると 10% 〜 20% くらい差が出る。

原因？
--------

トップレベルスコープの変数名などの圧縮をしていないせいかな？

~~~~~~~~~~~~~~~~~~~~sh
$ grep printPairs main-*
main-minifyify.js:function printPairs(r){console.log(_.toPairs(r))}var _=require("lodash");printPairs({a:1,b:2});
main-uglifyify.js:function printPairs(r){console.log(_.toPairs(r))}var _=require("lodash");printPairs({a:1,b:2});

# 更に圧縮してみる
$ ./node_modules/.bin/uglifyjs -mt < main-uglifyify.js > main-uglifyify-uglify.js
$ ./node_modules/.bin/uglifyjs -mt < main-minifyify.js > main-minifyify-uglify.js

$ ls -sh1 main-*
60K main-minifyify-uglify.js
64K main-minifyify.js
60K main-uglifyify-uglify.js
64K main-uglifyify.js
60K main-webpack.js
~~~~~~~~~~~~~~~~~~~~

そもそも変数名圧縮云々以前に uglifyify はモジュール1つ1つを圧縮するためのもの、という感じなので、更に圧縮する余地があるのは仕様っぽい。

>  When using uglifyify you should generally also use Uglify, to achieve the smallest output.
> [hughsk/uglifyify - JavaScript](https://github.com/hughsk/uglifyify)

実際調べる過程で、github のコード検索をしたら同様のことをしているのを何度かみました。

どうせ zip 圧縮されて配信すればそんなに違いでないけれど、気になるし、多段ソースマップの設定も大変だし、まだ webpack を使いそう。


追記: babel-polyfill も読み込むと
-------------------------------

こうなる:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~bash
$ ls -sh1 main-*
136K main-minifyify-uglify.js
156K main-minifyify.js
136K main-uglifyify-uglify.js
156K main-uglifyify.js
116K main-webpack.js
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

更に uglify しても webpack に追いつけないみたい。
最小構成のJAX-RS サンプル

最小構成でJAX-RSなアプリをビルドしてwarを作るための、いわゆるスケルトンのようなものです。

料理の仕方としては、`pom.xml`を置いたディレクトリで`mvn package` して、生成した`minimum-jax-rs.war`をTomcatなどにデプロイし、`http://localhost:8080/minimum-jax-rs/api/sample` へアクセスすると、動作が確認できます。EclipseのWTPでビルド・実行しても良いです。

その後は、必要に応じて機能やテストやMavenのプラグインを足していけば良いと思います。

## 必要なファイル

``` java:EndPoint.java
package org.example;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/sample")
public class EndPoint {

  @GET
  @Produces(MediaType.TEXT_PLAIN)
  public String start() {
    System.out.println("access.");
    return "executed.";
  }
}

```
``` xml:web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  version="3.1">

  <servlet>
    <servlet-name>Jersey Web Application</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>jersey.config.server.provider.packages</param-name>
      <param-value>org.example</param-value>
    </init-param>
  </servlet>

  <servlet-mapping>
    <servlet-name>Jersey Web Application</servlet-name>
    <url-pattern>/api/*</url-pattern>
  </servlet-mapping>
</web-app>
```
``` xml:pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.example</groupId>
  <artifactId>minimum-jax-rs</artifactId>
  <version>0.0.1</version>
  <packaging>war</packaging>
  <dependencies>
    <dependency>
      <groupId>org.glassfish.jersey.containers</groupId>
      <artifactId>jersey-container-servlet</artifactId>
      <version>2.22.1</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.3</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>
```

## ディレクトリ構成

この構成で、ファイルを配置してください。

``` console
│  pom.xml
│
└─src
    └─main
        ├─java
        │  └─org
        │      └─example
        │              EndPoint.java
        │
        └─webapp
            └─WEB-INF
                    web.xml
```

## バージョン番号など

- Java 8
- Tomcat 8
- JAX-RS 2.0
絶対パス指定のコマンドのインターポジショニング

シェルスクリプトの単体テストを実施する際、シェルスクリプトの中で呼び出しているミドルウェアのCLIコマンドのスタブを作ることはよくありますが…。

でも、それが絶対パス指定で呼び出されていた場合、`alias`を切ったり、スタブのディレクトリをPATHの先頭に追加するやり方では対処できない。そんな風に悩んでいた時期がありました。

同名関数を定義してインターポジショニングすればよいことを知るまでは。

関数名にはスラッシュを含めることができないじゃないか、って？それが、できるんです。試しに、`date`コマンドでやってみます。

```bash:
$ date() { echo "this is stab.";}
$ date
this is stab.
```

シェル関数は、シェルのコマンドサーチにおいてPATHの検索よりも先に検索されるので、このようなインターポジショニングが可能なのです。

絶対パス指定でも可能です。スラッシュのエスケープは不要です。

```bash:
$ which date
/bin/date
$ /bin/date
Sun Jan 17 02:23:00 JST 2016
$ 
$ /bin/date(){ echo "this is stab.";}
$ /bin/date
this is stab.
```

アンバインドする場合も、スラッシュのエスケープは不要です。

```bash:
$ unset -f /bin/date
$ /bin/date
Sun Jan 17 02:23:00 JST 2016
```

##シェルスクリプトでの応用例

`date`コマンドのスタブの例です。リリースモード時は本物の`/bin/date`が呼び出され、ユニットテスト時はスタブのシェル関数`/bin/date()`が呼び出されています。

```bash:stab.sh
#!/bin/bash

/bin/date()
{
    echo "this is stab."
}
```

```bash:main.sh
#!/bin/bash
set -u

#ユニットテスト時のみスタブをロード
if [[ -n "${UNIT_TEST-}" ]]; then
    . ./stab/stab.sh
    echo "stab module is loaded."
fi

#リリースモード時は本物のコマンドが呼び出される
#ユニットテスト時はシェル関数が呼び出される
/bin/date

exit 0
```

```shell-session:実行結果
$ unset UNIT_TEST
$ ./main.sh
Sun Jan 17 02:04:27 JST 201
$
$ export UNIT_TEST=1
$ ./main.sh
stab module is loaded.
this is stab.
```

##バージョン
```
$ bash --version
GNU bash, version 4.3.30(1)-release (i586-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
```

##参考
コンパイルスイッチ（`${variable-}`）について、参考にさせていただきました。ありがとうございます。

[set -u してるときに変数が未定義または空文字かチェックする for RHEL/CentOS 6](http://qiita.com/ngyuki/items/b2e291e07f6d2b2c353e)（@ngyukiさん）
Clipboard API とCanvas

#### スクリーンショット切り取りツール [こちら](http://pie.karou.jp/a.html)
#### jquery.facedetectionで顔検出 [こちら](http://pie.karou.jp/b.html)
#### ccv.js, face.jsで顔検出 [こちら](http://pie.karou.jp/d.html)
#### clmtrackr.jsで顔検出 [こちら](http://pie.karou.jp/e.html)
#### tracking.jsで顔検出 [こちら](http://pie.karou.jp/f.html)
#### js-objectdetectで顔検出 [こちら](http://pie.karou.jp/g.html)

#### トップページ [こちら](http://pie.karou.jp/)

HTML5 Clipboard APIによって画像貼り付け、加工ができ
canvasの用途がますます広がると思います。
ReactiveKitで代入時に通知

普通にリファレンスに書いてあったけど

```swift
    textView.rText.observe { (text) -> () in
       print(text)
    }
    textView.text = placeholder
```

コレじゃダメで

```swift

    textView.rText.observe { (text) -> () in
       print(text)
    }
    textView.rText.value = placeholder

```

コレが正解
【iBeacon】AppleのiBeaconサンプルアプリをビルドするときの注意


## iBeaconサンプルアプリ「AirLocale」

Apple Developer Libraryに、iBeaconのサンプルアプリ「AirLocale」が掲載されています。

[AirLocate: Using CoreLocation to monitor, range, and configure your device as an iBeacon](https://developer.apple.com/library/ios/samplecode/AirLocate/Introduction/Intro.html)

しかし、iOS7を想定して書かれているため、iOS8以降に対しては、ビルドはできるのですがうまく動作しません。
理由はiOS8から、位置情報の取得にユーザのパーミッションが必要になったからです。

## 修正箇所

#### 1. APLAppDelegate.mの`application:didFinishLaunchingWithOptions:`に次のコードを追加する。

```objc:APLAppDelegate.m
if([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
    [self.locationManager requestAlwaysAuthorization];
}
```

ちなみに`requestWhenInUseAuthorization`と`requestAlwaysAuthorization`があって、前者はアプリを起動しているときだけ、後者はアプリを起動していなときでも位置情報を取得する許可を、ユーザに要求するメソッドです。

#### 2. AirLocate-Info.plistに次の値を追加する

許可を求める際のユーザへのメッセージを設定します。

 * key: `NSLocationAlwaysUsageDescription`
 * value(String): <何らかのメッセージ>

ちなみに`requestWhenInUseAuthorization`のときのキーは`NSLocationWhenInUseUsageDescription`です。

## ソース

[ibeacon - Apple AirLocation demo App ranging not shows beacons - Stack Overflow](http://stackoverflow.com/questions/26079530/apple-airlocation-demo-app-ranging-not-shows-beacons)
Pythonでスクレイピング - 投信協会webから投資信託の基準価格を取得する

#この記事について
Pythonとlxmlを使って、webスクレイピングで投信協会のwebサイト(投信総合検索ライブラリー)から投資信託の基準価格を取得するスクリプトです。
前に公開した[Yahoo!ファイナンス版](http://qiita.com/sawadybomb/items/c34b84c0e8ef9e972691)について、規約上Yahoo!ファイナンスからのwebスクレイピングが禁止されていたので代わりに作成しました。

GitHubで公開してますんで最新版はこちら
[sawadyrr5/PyFundJP: 日本国内の投資信託に関する情報取得スクリプト](https://github.com/sawadyrr5/PyFundJP)

ファンドコードではなくISINコードでの検索となりますが、基本の構文はまったく一緒です。

```py:getNAV
# -*- coding: utf-8 -*-
# python 2.7
# 投信協会から基準価格データをスクレイピングする
import lxml.html
import datetime

def getNAV(isin, sy, sm, sd, ey, em, ed):
    # 引数をdictに突っ込む
    d = dict(isin=isin, sy=sy, sm=sm, sd=sd, ey=ey, em=em, ed=ed)

    # dictをアンパックしてURL生成
    url = 'http://tskl.toushin.or.jp/FdsWeb/view/FDST030004.seam?isinCd={isin}\
&stdDateFromY={sy}&stdDateFromM={sm}&stdDateFromD={sd}\
&stdDateToY={ey}&stdDateToM={em}&stdDateToD={ed}&showFlg=1&adminFlag=1'.format(**d)

    # ElementTreeを取得
    tree = lxml.html.parse(url)

    # 日付, 基準価額, 純資産の要素をすべて取得しつつ、mapを適用してutf-8化
    contents = map(lambda html: html.text.encode('utf-8').replace('\n',''), tree.xpath('//*[@id="showList"]//label'))

    # ひとつのリストになっているので[[date, price, cap], [date, price, cap], ...]と分ける
    res = []
    for i in range(0, len(contents)-1, 3):
        date = datetime.datetime.strptime(contents[i], '%Y年%m月%d日').strftime('%Y%m%d')
        price = int(contents[i+1].replace(',','').replace('円',''))
        cap = contents[i+2].replace(',','').replace('億円','')
        res.append([date, price, cap])

    return res

if __name__ == '__main__':
    # dictにパラメータを突っ込む(日本株アルファ・カルテット（毎月分配型）)
    args = dict(isin='JP90C000A931', sy='2015', sm='12', sd='01', ey='2015', em='12', ed='31')
    # dictごと渡してアンパック
    print getNAV(**args)
```
Rubyだと日付ループがこんなに簡単に書けるのだ！

Ruby愛ほとばしる今日の良き日に、日付ループのテクニックを備忘する。

## ある期間の日付をループして表示
2000-01-01から2000-12-31までの毎日の日付を画面に出力

```
require 'date'
(Date.parse('2000-01-01')..Date.parse('2000-12-31')).each do |date|
  puts date
end
```

## ある期間の毎月5日だけをループして表示
2000-01-01から2000-12-31までの毎月5日の日付を画面に出力

```
require 'date'
(Date.parse('2000-01-01')..Date.parse('2000-12-31')).select{|d| d.day == 5}.each do |date|
  puts date
end
```

## ある期間の毎週日曜だけをループして表示
2000-01-01から2000-12-31までの毎週日曜の日付を画面に出力

```
require 'date'
(Date.parse('2000-01-01')..Date.parse('2000-12-31')).select{|d| d.wday == 0}.each do |date|
  puts date
end
```
直前コマンド出力の最終行をクリップボードへコピー（Terminal、MacOSX）

こんにちは。
Terminal などで、直前のコマンド表示出力（の最終行）を MacOSX のクリップボードへコピーするには、再度実行し、```pbcopy```コマンドへ渡せば良いかと思います。

```console
$ !! | tail -n 1 | pbcopy
```

### AppleScript 利用 ###

上記に対して再度実行を経ない方法として、Terminal 用にシェルスクリプトを自作しました（ AppleScript 利用）[^1]。

[^1]: iTerm も "Select Output of Last Command" という同様のコマンドを持っているようです。

```sh
#!/bin/sh

OFFSET=1 # the second last line
if [ $# -ge 1 ]; then
  echo "$1" | grep -q -e "[^0-9]" || OFFSET=$1
fi
nshift="$((OFFSET + 2))"

# Turn on "Automatically Mark Prompt Lines" in Terminal
osascript << SCRIPT >/dev/null 2>&1
tell application "System Events"
  	key code 126 using {command down, shift down}  -- Select to beginning of text
  	keystroke "a" using {command down, shift down} -- Select between marks
	keystroke "c" using command down  -- Copy
	delay 0.1
end tell
set originalDelimiters to AppleScript's text item delimiters
set AppleScript's text item delimiters to return
set the clipboard to text item - ${nshift} of (the clipboard as text)
set AppleScript's text item delimiters to originalDelimiters
SCRIPT
```

* なお以前は、表示内容の全てを取得し、```PROMPT="$ "``` と決め打ちにして処理していました。

```sh
#!/bin/sh
PROMPT="$ " # 決め打ち
OFFSETLASTLINE=1 # 表示内容の最終行の1つ上の行の文字列
if [ $# -ge 1 ] && expr "$1" : '[0-9]*' > /dev/null ; then
  OFFSETLASTLINE=$1
fi
osascript << SCRIPT
tell application "Terminal"
        set theContents to contents of front window
end tell
set strList to paragraphs of theContents
set idxMax to length of strList
repeat with idx from (idxMax - 1 - ${OFFSETLASTLINE}) to 1 by -1
        set theLine to item idx of strList
        if theLine is not "" or theLine begins with "${PROMPT}"
                exit repeat
        end if
end repeat
set the clipboard to theLine
SCRIPT
```
【UE4 パッケージ化】UE4でパッケージ化の際に出たエラーとその解決まとめ

かなり手抜きですが、現在のプロジェクトをパッケージ化する際にエラーが続出したため、出現したエラーとその解決方法をまとめてみました。

UE4のバージョンは4.10.1ですので、4.11Previewでは解決されている問題があるかもしれません。
参考になれば幸いです。

トゥギャッターを使ってまとめました。
http://togetter.com/li/926572
Javaを始めた頃によくある疑問。Java SEって何？JDKとJREえ？


Javaはじめてから2年くらいたちました。
始めたての頃は、J2EEとかJava SEとかいみわかりませんでした。
そして今でもちゃんとわかってなかったのでこうしてまとめようとしています。謙虚です。

`J2EE`、`J2SE`、`Java SE`、`Java EE`、`JDK`、`JRE`。
このあたりの単語がわかるようにざっくばらんに説明してみたいと思います。

## Javaプログラムを実行するために必要なもの
- JVM
- API
- コンパイラ
- プログラムファイル

### カップラーメンを食べるために
ぼくの好きなカップラーメンを食べるためにはなにが必要でしょうか。

目的は麺をおいしくいただくことです。頑張りたいです。
まずじぶんの好きなインスタントラーメン用意します。
さあ、これで一応食事の体は整いました。味ない乾麺バリバリ食べます？まだ食べません。
調味料を加えて準備を整えます。まだ食べれません。
追加で具材など入れるとよりおいしく召し上がれます。
沸騰したお湯を注ぎます。3分待ちます。
こうしてぼくの好きなインスタントラーメンがちゃんといただけます。

| カップラーメン喰う | Javaを使う |
|:----------:|:-----------:|
| 麺       |        プログラムファイル |
| 付属の調味料         |          API |
| 野菜         |          外部API |
| カップ     |      JVM |
| お湯       |        コンパイラ |

### Java開発するために
Javaは、JVM(カップ、器)を置き、その上でプログラムファイル(麺)を用意します。
プログラムを書くときには、`System.out.print`などのAPI(付属調味料)を使います。
Apache Commonsなどの外部ライブラリ(その他の具材)を追加するとコーディングが楽になります。
準備ができたらコンパイルして(お湯を注いで)はじめて実行可能な成果物(食べれるカップ麺)ができあがります。

※ あくまでわかりやすい例えとして提示しており、厳密な対応にはなりえないため、イメージとして掴む目的でご覧ください。

さて。


## Java SEとかって何なの？
これすなわちAPIのこと。
Javaプラットフォームには主にJava SE, Java EE, Java MEの3つのAPIがある。
まあAPIって書いてるわけですが、個人的にはライブラリといってくれたほうがしっくりきます。
要するに、これ実行したらこういう処理ができますよっていう規約と実際の関数群のことをいう。
おなじみの`System.out.println`はなぜ使えてるのか。
APIがあるからなのです。


## 3つのAPI

### Java SE (旧称J2SE)
**Java Platform, Standard Edition**の略称。
こちらが標準APIになります。基礎となる標準的な機能をまとめたもの。前述の`System.out.println`なんかはここに入ってます。
これがないとなにも始まらないヨ。

http://docs.oracle.com/javase/jp/8/docs/api/

## Java EE (旧称J2EE)
**Java 2 Platform, Enterprise Edition**の略称。
前述のSEに、企業用途(Enterprise)のサーバー用の機能が追加されたAPI。
Webサーバー対話処理のためのサーブレット関連のAPIなどがここに含まれる。`HttpServletRequest`など。
エンタープライズ目的の名称になっているが、個人でもWeb開発はされているので、これは命名当時の状況のためっぽいよね。

https://docs.oracle.com/javaee/7/api/

## Java ME (旧称J2ME)
**Java 2 Platform, Micro Edition**の略称。
情報家電や携帯端末や組み込み機器向けの機能セットとなるAPI。
個人的には全く馴染みないです。ラズパイとかであそぶときはこれにお世話になるのかしら。

http://docs.oracle.com/javame/config/cldc/ref-impl/midp2.0/jsr118/

## JVMについて
**Java Virtual Machine**の略称。
Java仮想環境のうえで、Javaのプログラムは動作します。
メイン環境がLinuxとかのOSで、そのうえに乗っかるかたちでJVMが機能します。
よくJavaは特定の環境に依存せずどこでも動作するといいますが、これは、JVMがプログラムとOSの仲介をしてくれているから。
Javaプログラムを実行すると、JVMが橋となって、乗っかってるコンピュータがわかるようにそれを変換してOSが実行。

ちなみに関係ないけど、iOS/Android両方に変換できるような、クロスプラットフォームのサードパーティフレームワーク(PhoneGapやTitanium)があまり流行ってないのは、まだネイティブ開発が若いからオリジナル機能に対応しきれてないからなんですかね。だれかおしえて。

## コンパイラは何するか
人が書くコードはあくまで人のためのコードで、機械はそれを読めません。
そのため、プログラムを実行するためには、機械語に変換しなければなりません。
それをやるのがコンパイラ。

## お得なバリューセット
上で説明したようなAPIを含む、Javaの実行環境や開発環境をまとめて用意してくれているパッケージがあります。
Javaを使うとなった際は、通常はこれらを使うことになるでしょう。

### JRE
**Java Runtime Environment**の略称。
Javaプラグラムを使う(実行する)ために最低限必要のソフトをまとめたもの。
API、JVMがここにはいってるよ。
でもコンパイラはいってないから開発はできないよ。

### JDK
**Java Development Environment**の略称。
その名の通りこちらは開発用のパッケージ。
JVMとコンパイラとAPIがまとまったセットで、JDKはJREを内包している。


# 参考URL
- http://www.searchman.info/java_eclipse/1000.html
- http://builder.japan.zdnet.com/sp_oracle/weblogic/35051347/
- http://www.fujitsu.com/jp/solutions/infrastructure/dynamic-infrastructure/sdas/technology/j2ee/01-j2ee/index.html
- http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1169502751
引数の value = Proc.new について

以下のActiveRecordのselectメソッドの実装の、引数「value = Proc.new」がよくわからなかったのでメモ。

```bash:selectメソッドの利用
User.where('id < 100').select(&->(user) {user.created_at > Date.new(2013, 1, 1)})
```

```rb:selectメソッドの実装
def select(value = Proc.new)
  if block_given?
    to_a.select {|*block_args| value.call(*block_args) }
  else
    relation = clone
    relation.select_values += Array.wrap(value)
    relation
  end
end
```

リファレンスに以下のような例が載ってあった。
http://docs.ruby-lang.org/ja/2.1.0/class/Proc.html

```rb:
def foo
  pr = Proc.new
  pr.call(1)
end
foo {|arg| p arg }
# => 1
```

ということで、Arrayのmapで試してみた。

```rb
class Array
  def wrap_map(value = Proc.new)
    map {|element| value.call(element * 2)} 
  end
end

[1, 2, 3].wrap_map(&:to_s)
# => ["2", "4", "6"]
[1, 2, 3].wrap_map {|v| v * 2}
# => [4, 8, 12]
```

ちなみに以下でも同じ

```rb
class Array
  def wrap_map(&value)  # こう書いてもOK
    map {|element| value.call(element * 2)} 
  end
end
```
[JavaプログラマのためのHaskell]四日目・高階関数の話

[前回](http://qiita.com/noco/items/77a5588601ba6f0a4f7b)の続き.

せっかく前回型についてやったので、今回からは関数の型の宣言をしていきます.
関数の型

```
第一引数の型 -> 第二引数の型 ->...->返り値の型
```

<h1>高階関数</h1>
他の関数を引数に取る関数のこと. ※例　map関数.


```maptest.hs
main = print $ map square [1, 2, 3] -- 出力： [1, 4, 9]

square n = n * n
```

　　・map関数：　リストの各要素に引数の関数を適用する.
　　　　　　　　　上記の例の式の値は[(square 1), (square 2), (square 3)]となり、
　　　　　　　　　すなわち[1, 4, 9]となる.

<h1>expand.hsその１</h1>
タブ文字を文字＠に置換する.

```expand.hs
main = do cs <- getContents
          putStr $ expand cs

expand :: String -> String
expand cs = map translate cs

translate :: Char -> Char
translate c = if c == '\t'
                then `@` 
                else c
```

　　・if式：　条件式の値がTrueなら式１、Falseなら式２を返す. elseは省略できない.

```
if 条件式　then 式１ else 式２
```
　　・==演算子：　x == yとした場合、xとyが等しい時にTrue、等しくない時にFalseを返す.

```
(==) :: a -> a -> Bool
```

<h1>expand.hsその２</h1>
タブ文字を空白８文字に展開する.

```expand.hs
main = do cs getContents
          putStr $ expand cs

expand :: String -> String
expand cs = concat $ map expandTab cs

expandTab :: Char -> String
expandTab c = if c == '\t' 
                then "        "
                else [c]
```

　　・concat関数：　リストxsを連結して1つのリストにする.

```
concat :: [[a]] -> [a]
```

```
concat [[1, 2], [3], [4, 5]] → [1, 2, 3, 4, 5]
concat ["ab", "c", "de"] → "abcde"
```


今回はここまで！
[第三回](http://qiita.com/noco/items/77a5588601ba6f0a4f7b)
[第五回](http://qiita.com/noco/items/d90cf1cd827e86c289d5)


出典
青木峰郎.ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門.ソフトバンク クリエイティブ株式会社,2006,372p.
[C#] 配列の全要素を別の要素に変換する

文字列を数値に変換することはよくあるのですが、下記のように文字列配列の全要素を数値に変換するにはどうするのか調べたのでメモ書き。

```csharp
using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            int.Parse(Console.ReadLine());
            long[] nums = Array.ConvertAll(
                Console.ReadLine().Split(' '),
                new Converter<string,long>( s => long.Parse(s) ));

            Console.WriteLine("{0} {1} {2}",
                nums.Min(),
                nums.Max(),
                nums.Sum()
                );
        }
    }
}
MaxPlusでモディファイア調べてるメモ

#これはなに？
3dsMaxのPython API、**MaxPlus**にてモディファイアを取得したりしようとしているときに書きつけたメモです

#試行錯誤

```lua:
python.execute "print dir()"
['MaxPlus', '_ToListener', '__builtins__', '__doc__', '__name__', '__package__', '_old_stderr', '_old_stdout', '_redirected_stdout', 'sys']
#success
```
↑Max開いた時点でMaxPlus読み込まれてます

`MaxPlus.SelectionManager.Nodes`で、選択中のオブジェクトを取得できます。
というわけで、なんかジオメトリを掴んでレッツスタート。

```lua:
python.execute "print MaxPlus.SelectionManager.Nodes"
<generator object <genexpr> at 0x00000000FBB2ABD0>
#success
```
↑ジェネレータで返ってくるのか～

取得したノードに対して **.Modifiers** で、適用されてるモディファイアが取得できます。
また、モディファイアに対して **.GetClassName()** で、そのモディファイアの名前が得られます。
横着して(?)リスト内包表記二重にしてみたりした↓

```lua:
python.execute "print [ mod.GetClassName() for node in MaxPlus.SelectionManager.Nodes for mod in node.Modifiers]"
[u'\u30bf\u30fc\u30dc\u30b9\u30e0\u30fc\u30ba', u'\u30b9\u30ad\u30f3']
#success
```
desuyone〜〜


```lua:
python.execute "modList = [ mod.GetClassName() for node in MaxPlus.SelectionManager.Nodes for mod in node.Modifiers]"
#success

python.execute "for i in modList:print i"
ターボスムーズ
スキン
#success
```

「ターボスムーズ」「スキン」というモディファイア名がとれました

#まとめ
この選択オブジェクト、「ターボスムーズ」「スキン」と**「モーファー」も**アサインされてるんだけどな！

今日はここまで。

##参考

MaxPlus and Setting Slice_Modifier Position/Rotation/Scale & "Animatable"
http://tech-artists.org/forum/showthread.php?4697-MaxPlus-and-Setting-Slice_Modifier-Position-Rotation-Scale-amp-quot-Animatable-quot

MaxPlus.SelectionManager.Nodes
http://help.autodesk.com/view/3DSMAX/2015/ENU/?guid=__files_GUID_B8C79798_1908_4FBA_A936_8A383F8494F7_htm

Python APIでのモディファイアの追加とか
http://help.autodesk.com/cloudhelp/2015/ENU/Max-Python-API/files/GUID-1AC35645-91D7-4DBE-9714-681C8CC8700F.htm

Modifier Class Reference
http://help.autodesk.com/view/3DSMAX/2015/ENU/?guid=__py_ref_class_max_plus_1_1_modifier_html


help(mod)

```py:
python.execute "help(mod)"
Help on Modifier in module MaxPlus object:

class Modifier(BaseObject)
 |  The base class for Object Space and Space Warp (World Space) Modifier plug-ins
 |  
 |  Method resolution order:
 |      Modifier
 |      BaseObject
 |      ReferenceTarget
 |      ReferenceMaker
 |      Animatable
 |      InterfaceServer
 |      Wrapper
 |      __builtin__.object
 |  
 |  Methods defined here:
（中略）
 |  ----------------------------------------------------------------------
 |  Methods inherited from InterfaceServer:
 |  
 |  GetInterface(self, *args)
 |      GetInterface(InterfaceServer self, Interface_ID id) -> BaseInterface
 |  
 |  ----------------------------------------------------------------------
 |  Methods inherited from Wrapper:
 |  
 |  GetUnwrappedPtr(self)
 |      GetUnwrappedPtr(Wrapper self) -> void *
 |  
 |  __nonzero__(self)
 |      __nonzero__(Wrapper self) -> bool
 |  
 |  __str__(self)
 |      __str__(Wrapper self) -> char const *
 |  
 |  ----------------------------------------------------------------------
 |  Data descriptors inherited from Wrapper:
 |  
 |  __dict__
 |      dictionary for instance variables (if defined)
 |  
 |  __weakref__
 |      list of weak references to the object (if defined)

#success

```
JavaScriptのクラスの基礎

# JavaScriptのクラスの構成

* 関数
* `this`
* `new`演算子

最小限上記の3つが理解できてればOK

## 関数

* `function`
* `var function`

JavaScriptの関数には関数宣言と関数式の2つがある。説明は以下の記事がわかりやすい。

関数宣言だと、関数ごと巻き上げられるのでどこからでも呼び出せるため、関数式で先頭で変数にセットした方がいい。

関数宣言と関数式の違い
http://qiita.com/orangemittoo/items/ba82462610f0b72915f6

関数の場合の変数の巻き上げ問題について
http://qiita.com/cocottejs/items/143f70e806c61ffafe28

## `this`

他の言語では、`this`は通常インスタンス自身を表すが、JavaScriptの`this`はその関数が呼びだされた際にその関数を格納していたオブジェクトのことを指す。

```js
var sayHelloShared = function() {
  console.log('Hello' + this.name);
};

var human = {
  sayHello: sayHelloShared,
  name: 'masaru',
};

human.sayHello();
```

> Hello masaruと表示される

* `call`を使うと、関数を呼び出すオブジェクトを指定できる

```js
sayHelloShared.call(human);
```

## `new`演算子

* 他の言語がクラスのインスタンス化を行う`new`とは違い、JavaScriptは任意の関数と一緒に呼び出す(JavaScriptにはクラス機構が無い)
* `new`と一緒に関数を呼び出すとまず新しい空のオブジェクト(つまり`{}`)が生成される
* 次に関数が呼び出される。その際には関数内の`this`は生成されたオブジェクトを指す

```js
var Person = function(name, age) {
  this.name = name;
  this.age = age;
};

var masaru = new Person('masaru', 7);

console.log(masaru.name);
```

* つまり、JavaScriptはnew演算子を使うことで関数をコンストラクタとして利用することが出来、クラスを実現できる
* `masaru.constructor`というプロパティで生成時に利用した関数への参照を保持している

# その他

ES6からは標準でクラス機構が用意されており、他言語と同じように、`Class クラス名`の書き方が出来る
underscoreコードリーディング（allKeys)



underscoreに詳しくないので、勉強半分でソースコードを読む。



##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##allKeysとは


###[underscorejs.orgのallKeys](http://underscorejs.org/#allKeys)

こんな説明。
>####_.allKeys(object) 
Retrieve all the names of object's own and inherited properties.


```javascript
function Stooge(name) {
  this.name = name;
}
Stooge.prototype.silly = true;
_.allKeys(new Stooge("Moe"));
=> ["name", "silly"]

```
------------- 
object自身とobjectが持っている特性（?: hasOwnPropertyでわかるやつ?）のすべてのプロパティの名前を返します


###[underscore.allKeys](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L938)
コード的にはこのあたり。

```javascript
  // Retrieve all the property names of an object.
  _.allKeys = function(obj) {
    if (!_.isObject(obj)) return [];
    var keys = [];
    for (var key in obj) keys.push(key);
    // Ahem, IE < 9.
    if (hasEnumBug) collectNonEnumProps(obj, keys);
    return keys;
  };
```

objがobjectではなければ空の配列を返す
そうでない場合
keysを空の配列として生成する。
obj内のkeyをkeysにpushし続ける。
IE9以下の場合はcollectNonEnumPropsを通す。
その後、keysを返す。
コマンドライン上でヒストグラム値（頻度数）を求める

こんにちは。
コマンドライン上でヒストグラム値（頻度数）を求めるシェルスクリプト を作りました[^1]。

下記の動作例は ```history``` コマンドの第2カラムを対象としています（すなわち過去に使用したコマンド名）。

```console
$ history | awk '{print $2}' | ./hist.sh | ./hist_graph.sh
            brew   87 ##################################################
             pip   33 ###################
              ls   30 #################
               :
               :
```

#### ソース

##### 頻度数を求める処理

```hist.sh
#!/bin/sh
cat "$@" | sort | uniq -c | sort -k1nr | awk '{printf "%16s %4d\n",$2,$1;}'
exit 0
```

##### 図示（#の連続）を付け加える処理

```hist_graph.sh
#!/bin/sh
cat "$@" | awk '!max{max=$2;}{f=50/max;if(f>1)f=1;i=$2*f;r="";while(i-->0)r=r"#";printf "%s %s\n",$0,r;}'
exit 0
```

#### 他の方法
なお改めてヒストグラム実現方法を調べてみると、"[in-terminal (ASCII) histograms tool](http://stackoverflow.com/questions/6949332/in-terminal-ascii-histograms-tool)" (Stack Overflow) の中で、下記も紹介されていました。
 * https://github.com/bitly/data_hacks
 * https://github.com/philovivero/distribution


[^1]: ただしこの話題は「[CSVデータのヒストグラム値（頻度数）の計算（qコマンド利用）](http://qiita.com/kkdd/items/7df848ddeeb13bf80530)」とほとんど同じなので恐縮です。
sbclでexeを作る


#何の記事？

今回はタイトルどおりSBCL（Steel Bank Common Lisp）で単体実行可能なexeファイルを作ろう
という記事です。

#先に結論

では早速exeを作ってみます。

```cl:
(load "foo.lisp") ; 必要なファイルをloadする
(sb-ext:save-lisp-and-die "foo.exe"
                          :toplevel #'main
                          :executable t)
```

`sb-ext:save-lisp-and-die`はlispのコアイメージを書き出す関数です。 
`:executable t`を指定した場合、出力されるファイルはsbclのランタイムとコアイメージを含みます。

これで一応exeファイルを作成することができます。

#解説

`sb-ext:save-lisp-and-die`にはいくつかのキーワード引数があります。

詳細についてはSBCLに公式サイトで確認できるので省きますが、
よく使いそうな引数については紹介しておきます。

```cl
;; トップレベルの関数を指定します。
;; （Cで言うとこのmain関数みたいなものです）
;; #'で関数自体を渡します。
:toplevel

;; trueならばイメージとランタイムを一緒にしたexeを出力します。
;; falseならイメージのみを出力し、ランタイムを含みません。（つまりexeにならない）
:executable

;; アプリケーションの種類を指定します。
;; :console ならば実行時にコンソールウインドウを表示します。
;; :gui ならばコンソールウインドウを表示しません。
:application-type
```

#まとめ

さあこれらの引数を指定してexeを出力すると、出力結果を見て悶絶することになるでしょう。


ファイルサイズでかすぎッッΣ(´□｀;)


簡単なものでも40MB近くのサイズになります。
まぁランタイムを含んでるので当然っちゃ当然なんですが、これもう少し小さくならないかな？？？

#環境など
以下テストした環境。

* OS : Windows 10 64bit
* 処理系 : SBCL 1.2.15
Tumblrで希望のuser nameが取れなかった時にポストのauthor nameを変更する方法

# 実現すること
- 自分のTumblr上でのusername（Name）に対してブログに表示するためのScreen Nameを設定できるようにします．
- 見た目（表示される文字列）が変更されるだけで，Tumblrでのusernameが変更されるわけではありません．
- HTMLにScreen Nameをベタ書きしても実現可能ですが，Group Tumblrで複数人が書くときにも管理しやすいようにオプションから設定できるよにします．

# やりかた
## 1. オプションの追加
まずは以下の２つを実装します

- 今回実装する機能をon/offするオプション
- Screen Nameを設定するオプション

[Edit Theme] から [Edit HTML] を選択し，以下のコードを`<head>`タグ内のオプションの羅列に追加します．

```html
<meta name="if:Show Screen Name" content="0"/>
<meta name="text:Name of Author 1" content=""/>
<meta name="text:Screen Name of Author 1" content=""/>
<meta name="text:Name of Author 2" content=""/>
<meta name="text:Screen Name of Author 2" content=""/>
```

追加すると [Edit Theme] の画面に次のようなオプションができます．

![Screen Shot 2016-02-05 at 11.25.52 PM.png](https://qiita-image-store.s3.amazonaws.com/0/3810/978b0ab7-85d2-8eb0-cddb-69a396110873.png)

一番上が今回の機能をon/offするスイッチで，その下に続くテキストボックスが変更前と変更後のユーザー名を書く場所になります．今回はGroup Tumblrも考慮して二人分書けるようにしました．

**Name of Author N**の名前が**Screen Name of Author N**の名前に変換されて表示されるようになります．

## 2. CSSの追加
同様にCSSの中に以下のコードを追加します．このCSSでNameをScreen Nameに変換しています．

```css
{block:IfShowScreenName}
.author-name-{text:Name of Author 1}:after {
    content: "{text:Screen Name of Author 1}";
}
.author-name-{text:Name of Author 2}:after {
    content: "{text:Screen Name of Author 2}";
}
{/block:IfShowScreenName}
```


## 3. Name / Screen Nameの追加
最後にScreen Nameを表示したい場所に以下のコードを足します．

```html
{block:IfNotShowScreenName}
<div>{PostAuthorName}</div>
{/block:IfNotShowScreenName}
{block:IfShowScreenName}
<div class="author-name-{PostAuthorName}"></div>
{/block:IfShowScreenName}
```

以上です．

# 補足
Group Tumblrを使っていて，変換する人を３人以上に増やしたい場合は[1. オプションの追加][2. CSSの追加]で追加したコードを増やしたい分だけ追加してください．
Cppcheck のマニュアルを日本語に訳した

# Cppcheckって?

Cppcheck は C/C++ の静的解析ツールです。

- 開発 http://cppcheck.sourceforge.net/ 

- github https://github.com/danmar/cppcheck

# マニュアル

長い間、有志が日本語に訳したものがネット上にあったのですが、公式ではない、文書のバージョンが古い、というか消えた、という問題がありました。

公式は重要です。

というわけで、公式のgithubにプルリクエストしちゃいました。(docbook形式)

ただgithubにプルリクエストしたものの、メンバーは誰も日本語がよめない模様。
しかもdocbook形式....

マージはされたもののよくわからないままマージされてしまいました。
やっぱり、レビューして欲しいよね?

# 本題 公開レビューのお願い

というわけで、Google Drive に HTML形式のCppcheckのマニュアルを置いたので、
日本人のみなさまにレビューしていただこうかと思います。よろしくお願いします。

英語があまり得意でない方は、このマニュアルを読んで意味がわかりにくいところをコメントしてください。

英語ができる方は、英語で github のissueに追加してくださっても結構です。

# マニュアル

## 日本語版

https://drive.google.com/file/d/0B5_cYmZyxYa4RWNsZEtGS0hQdmM/view?usp=sharing 1.73 日本語

## 英語版

https://drive.google.com/file/d/0B5_cYmZyxYa4V0dCUU1NanQ1dWc/view?usp=sharing 1.73 English

以上です。
ServerspecでWindowsのタイムゾーンをテストする俺のジャスティス

俺です。
これです。


- timezone_spec.rb

```
require 'spec_helper'
require 'yaml'

describe command('tzutil /g') do
  its(:stdout) { should match /Tokyo Standard Time/ }
end
```

- result

```
orenomac$ rake spec:orenowindows
Command "tzutil /g"
  stdout
    should match /Tokyo Standard Time/
```
おわり。
セレクトボックスを変更できないよう固定してかつ値も送信するjQueryプラグイン

## セレクトボックスの内容を固定したい

例えば以下のようなフォームがあるとします。

```html:sample.html
<select name="heater">
  <option value="staub">石油ストーブ</option>
  <option value="aircon">エアコン</option>
  <option value="kotatsu">こたつ</option>
</select>

<select name="fruit">
  <option value="apple">りんご</option>
  <option value="orange">みかん</option>
  <option value="grape">ぶどう</option>
</select>
```

上のセレクトボックスで「こたつ」が選ばれたら、下の方で「みかん」を選択したいときの処理を jQuery で書くと以下のようになります。

```js:sample.js
$(function() {
  $("select[name='heater']").change(function() {
    if( $(this).val() == 'kotatsu' ) {
      $("select[name='fruit']").val("orange");
    }
  });
});
```

しかしこのままだと「みかん」は選ばれてるけど勝手に「りんご」とかに変更できてしまいます。
こたつにはみかんだろ！

というわけで変更できないようにします。

```js:sample.js
$(function() {
  $("select[name='heater']").change(function() {
    if( $(this).val() == 'kotatsu' ) {
      $("select[name='fruit']").val("orange");
      $("select[name='fruit']").attr("disabled", true);
    } else {
      $("select[name='fruit']").removeAttr("disabled");
    }
  });
});
```

これで無事に変更できなくなりましたが、disabled 属性を付けたので値が送信されなくなってしまいました。
これは困った。

readonly 属性はセレクトボックスには効かないし。。

- [disabled属性とreadonly属性の相違点 - Qiita](http://qiita.com/ma_me/items/83b4fa90328e67809507)
- [selectタグのreadonly属性 - いろいろ作ってみる](http://d.hatena.ne.jp/ko_w/20101120/1290243332)

この問題を解決する方法としては、hidden フィールドを用意するなどのやり方があるようです。

でも今回はできれば追加でフィールドは増やしたくない。
さてどうしようか。

## それ、jQuery プラグインでできるよ

ふと思い立って jQuery プラグインを探してみる。
ググってもそれらしきものは見つからなかったので、Github で検索してみる。
そしたらあった。

- [vinicius-stutz/jquery.selection.js](https://github.com/vinicius-stutz/jquery.selection.js)
- [jquery.selection.js by vinicius-stutz](http://vinicius-stutz.github.io/jquery.selection.js/)

ソースを見ると、mousedown とか keydown とかを無効にしてますね。
ブラウザも一通り対応してるっぽい。

> Work with Firefox, Chrome, IE 8+, Opera and Safari.

そんなわけで ``jquery.selection.js`` ファイルを読み込む処理を追加して、以下のコードで完成。

```js:sample.js
$(function() {
  $("select[name='heater']").change(function() {
    if( $(this).val() == 'kotatsu' ) {
      $("select[name='fruit']").val("orange");
      $("select[name='fruit']").disableSelection();
    } else {
      $("select[name='fruit']").enableSelection();
    }
  });
});
```

hidden フィールドなどを増やすことなく、無事にセレクトボックスを固定して値の送信もできるようになりました。
めでたしめでたし。
Pocketで直接オリジナルのページに飛べるchrome extension「DirectJump for Pocket」を作って公開しました


[DirectJump for Pocket - chrome web store](https://chrome.google.com/webstore/detail/directjump-for-pocket/hinnhpncbihcfjacbhehgadjhdpdaaic/related)


これはなに？
==============

Pocketでアイテムをクリックした時にreading pageに推移させず、新しいタブでオリジナルのページを開くchrome extensionです


使い方
======

[DirectJump for Pocket - chrome web store](https://chrome.google.com/webstore/detail/directjump-for-pocket/hinnhpncbihcfjacbhehgadjhdpdaaic/related)からインストールするだけです。



動機
==============

最近になってPocketをwebから使うようになったんだけど、アイテムを開くときにreading pageに推移されるのが地味にストレスだったので作りました。(アイテムの左下にあるlinkをクリックすればオリジナルページに直接飛べるのは知ってます。)

あと、最近「[Sashikomi](http://qiita.com/cotto89/items/12a1d19836083718f037)」というメモエクステンションを作ってstoreに公開した際にディベロッパー登録のために5ドル払っていて、extensionを20個も登録できるらしいので、せっかくだからstoreに公開しました。



実装とか
========

origina urlを取得して、アイテムのhrefを書き換えているだけです。あと、無限スクロールに対応するためにスクロールイベントでbodyの高さを監視してるくらいです。

書いたコードはここに置いてあります。
[cotto89/DirectJump-for-Pocket - github](https://github.com/cotto89/DirectJump-for-Pocket)


バグや改善点があれば遠慮なくGithubやTwitterのリプライで教えて下さい。
[cotto(@cottto89) | Twitter](https://twitter.com/cottto89)
concrete5.7 テーマのサムネイル情報が表示されるようにする

# はじめに

[前回の記事](http://qiita.com/yorozuone/items/ab04c63fa2ebd5a248a8)で、テーマを作成しましたが、テーマファイルを作成するだけでは、管理画面のサムネイルに何も表示されません。

![01.jpeg](https://qiita-image-store.s3.amazonaws.com/0/1154/6c047538-8bf2-8060-247b-92dca4fdee8e.jpeg)

これに、画像、名前、説明を設定したいと思います。

# サムネイル画像を表示させる

サムネイルにしたい画像を、360ｘ270 の PNG 形式でテンプレートを保存した場所、`/application/themes/tm1/` に 'thumbnail.png' というファイル名で保存します。

![thumbnail.png](https://qiita-image-store.s3.amazonaws.com/0/1154/b9425f4b-8b49-a918-927b-8732dd166ca3.png)
[フリー写真素材ぱくたそ](https://www.pakutaso.com)

# 名前と説明を表示させる

description.txt のファイルに１行目に名前、２行目に説明を書いて保存します。

```lang:/application/themes/tm1/description.txt
TestTheme1
テストのテーマです。
```

管理画面にサムネイルが表示されました。

![02.png](https://qiita-image-store.s3.amazonaws.com/0/1154/a65d122b-0651-1442-780c-4750f4363657.png)

# さいごに

[前回の記事](http://qiita.com/yorozuone/items/ab04c63fa2ebd5a248a8)と合わせて、`/application/themes/tm1/` の中には、

```lang:/application/themes/tm1/
default.php
description.txt
thumbnail.png
```

の３ファイルができました。
コーディング初心者に伝えたい、きれいなコードを書くためのたった7つのこと


今や自己啓発本の代名詞とも言えるフレーズをタイトルにしてみました。最近はもっぱら自虐的に「・・・たった212のこと」みたいなものありますが、私のは本当にたった7つですw


## 基本
~まず押さえてほしい~

1. 変数等の名前を適切につける
   - きれいなコードは文章を読むように読めないといけません
   - 必ず英語で書いてください

2. 安易にコピーしない
   - コードをきれいにするポイントは、重複を減らすことと細かく分けること(後述)に尽きます
   - 重複を減らすことの究極はイテレーションです

3. データ類とその処理を1カ所にまとめる
   - これができていると、集団開発的・運用的に非常にやりやすくなります


## メソッド設計
~綺麗なコードはメソッド設計が上手~

1. 長過ぎる処理は適度に分割する
   - 細かく分けることは読みやすくするだけでなく、コピーコードを減らすことにもつながる
   - 使い回し可能な部品を増やすことになるから
   - 様々な粒度で機能ごとに分割すれば、使いやすくなります
   - 処理とフローを分離するのも大切 (フローは処理を制御構文を使って組み立てたものです)

2. 関連のある処理はまとめて書く
   - メソッドを細かく分けると、メソッド数は必然と増えるので、どこに何が書いてあるか整理されてないと全容を把握できません
   - 収納用の箱をたくさん用意したけど、中に入っているものはバラバラというような状態ですね
   - モデルに関することはモデルに描く、メソッドの順番も関連しているものは並べて書くとか、基本的なとこです

3. 例外的な処理はガード節を使い、早々にreturnする
   - メソッド処理内容の理解を早くする上での重要なテクニックです


## テスト
~限られた時間を貴重にするために~

1. 重要な箇所を重点的にテストする
   - どんな慎重にコーディングしたって本番前に基本的なテストを抜くことはありえません
   - ただ、限られた時間の中では、ここだけは絶対にバグってはいけない、という重要な点を優先するようにしましょう


## 蛇足

- なお、誤解を恐れずに書きますが、「綺麗なコードをキープすること」は「バグを回避する」ことと短期的にはイコールではありません！
- 最善のコードというのは、ソフトウェアの規模・フェーズ・目的によって異なります
   - 人間も年齢を重ねるに応じた綺麗さってありますよね
- 故に「綺麗なコードをキープする」ためには、絶え間ないリファクタリングが必要なのですが、リファクタリングを行うことは、コードコピーを行うよりも短期的にはバグを生むリスクが高いです
- コードを綺麗にしようとした結果、最悪サービス一時停止などのユーザファーストでない状況に陥った経験、私以外にもきっとありますよね...?
- 状況にもよりますが、それでも私はリファクタリングを行うことをお勧めしたいです。エンジニアとしての成長にもつながるし、何よりも私自身がそのような細かい努力を怠ったコードを多数向き合ってきたからです。あのような地獄は後に続くものに味わってほしくない・・・っw
- リファクタリングが多い、心身代謝の多いコードは生きています！これからも成長するバイタリズムに溢れているんです！
/etc/resolv.confにアクセス権がないとresolveできない

同じマシンで、```root```ユーザーだとネットアクセスできるのに、一般ユーザーだとできなくなってて小一時間ハマり、```history```してみると以前にも同じとこでハマってた痕跡があったし、もうどう調べればいいのかもわからないので自分メモ

### 症状

```
# nslookup yahoo.co.jp
Server:         8.8.8.8
Address:        8.8.8.8#53

Non-authoritative answer:
Name:   yahoo.co.jp
Address: 183.79.135.206
Name:   yahoo.co.jp
Address: 182.22.59.229
# su -l taro
$ nslookup yahoo.co.jp
;; connection timed out; trying next origin
;; connection timed out; n
```

rootだとできるのにtaroさんだとできない

### 原因？

```
# ls -al /etc/resolv.conf
-rw-------. 1 root root 38 Feb  4 13:55 /etc/resolv.conf
```

これが一般ユーザーから見えないから？

### 解決

```
# chmod +r /etc/resolv.conf
# su -l taro
$ nslookup yahoo.co.jp
Server:         8.8.8.8
Address:        8.8.8.8#53

Non-authoritative answer:
Name:   yahoo.co.jp
Address: 183.79.135.206
Name:   yahoo.co.jp
Address: 182.22.59.229
```

できた・・
そもそもなんでいきなり権限変わるの・・
Spring Boot上のWicketでWebSocketを使うには

## 概要

WicketでWebSocketを利用したい場合、

1. wicket-native-websocket-javaxを利用する
2. web.xmlで定義するServletFilterのクラスを org.apache.wicket.protocol.ws.javax.JavaxWebSocketFilter に変更する
3. WebSocketに対応させたいページにWebSocketBehaviorを定義する

[といった手順](https://ci.apache.org/projects/wicket/guide/7.x/guide/nativewebsockets.html)を踏む。

Spring Boot上でWicketを動かしている場合は、これ以外にも設定が必要なのでまとめておく。

### 検証環境

- Spring Boot 1.3.2
- Wicket 7.2.0
- Java 8

## 1. ライブラリの追加

spring-boot-starter-websocket, wicket-native-websocket-javax を追加する。

```xml:pom.xml
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

<dependency>
  <groupId>org.apache.wicket</groupId>
  <artifactId>wicket-native-websocket-javax</artifactId>
  <version>${wicket.version}</version>
</dependency>    
```

## 2. WicketFilter から JavaxWebSocketFilter への変更

ServletContextInitializer の実装クラスで、読み込む ServletFilterクラス を変更する。

```java:WebInitializer.java
@Configuration
public class WebInitializer implements ServletContextInitializer {

  @Override
  public void onStartup(ServletContext context) throws ServletException {
    // WicketFilter から JavaxWebSocketFilter へ変更
    FilterRegistration filter = context.addFilter("wicket-filter", JavaxWebSocketFilter.class);
    ...
```

## 3. WebSocket の有効化

WebApplicationクラスに `@SpringBootApplication` が定義されている場合。

まず、`@EnableWebSocket` を追加する。

```java:WicketApplication.java
@EnableWebSocket // 追加
@SpringBootApplication
public class WicketApplication extends WebApplication {
  ...
```

次に、WebSocketConfigurer インターフェースを定義する。

```java:WicketApplication.java
@EnableWebSocket
@SpringBootApplication
//インターフェースの定義追加
public class WicketApplication extends WebApplication implements WebSocketConfigurer {
  ...

  // オーバーライドが必要だが、コードの実装は特に不要。
  @Override
  public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
    // TODO Auto-generated method stub
  }
}
```

さらに ServerEndpointExporter, WicketServerEndpointConfig のBean定義を加える。

```java:WicketApplication.java
  @Bean
  public ServerEndpointExporter serverEndpointExporter() {
    return new ServerEndpointExporter();
  }

  @Bean
  public WicketServerEndpointConfig myWicketServerEndpointConfig() {
    return new WicketServerEndpointConfig();
  }
```

## 動作確認

上記の設定を行ったプロジェクトをgithubに公開している。

https://github.com/gishi-yama/wicket-on-spring-boot/tree/f077acd

WebSocketBehavior を add したページに、クライアントから WebSocket でメッセージを送信する。詳しいソースコードは以下の通り。

- [WebSocketBehaviorPage.java](https://github.com/gishi-yama/wicket-on-spring-boot/blob/f077acdb500d98b54827ede54fb2467d12b8e50a/src/main/java/com/example/page/ws/WebSocketBehaviorPage.java)
- [WebSocketBehaviorPage.html](https://github.com/gishi-yama/wicket-on-spring-boot/blob/f077acdb500d98b54827ede54fb2467d12b8e50a/src/main/java/com/example/page/ws/WebSocketBehaviorPage.html)
- [websocket-callback.js
](https://github.com/gishi-yama/wicket-on-spring-boot/blob/f077acdb500d98b54827ede54fb2467d12b8e50a/src/main/webapp/js/websocket-callback.js)

WebSocketBehaviorPage を表示すると、WebSocketでメッセージが送信されるたびに、メッセージの内容とSessionIdを表示していく。
aws-cliでスポットインスタンスの情報を取得するワンライナー２つ


スポットインスタンスであんな事やこんな事を試してみたいのに

「ポチポチしてたら、日が暮れる！！！」

のでAWSが公式に出している[aws-cli](https://github.com/aws/aws-cli)を利用して色々やってみる事にしてみました。
(調べだしてからこの投稿を書くのに既に日が暮れているなんて、誰にも言えない・・・・)



## 参考にしたサイト

* [describe-instances](http://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html)

## 環境

* CentOS 6.7
	* aws-cli 
		* aws-cli/1.10.1 Python/2.7.10 Linux/2.6.32-573.el6.x86_64 botocore/1.3.23

## 事前準備に必要なもの

* jq
	* インストール方法は適当にぐぐってみてください

## 稼働しているスポットインスタンスのインスタンスIDをまとめて取得する

jqで ``` select(.InstanceLifecycle == "spot") ``` としているところがミソ

```shell:path/to/hoge
aws ec2 describe-instances --filter "Name=instance-state-name,Values=running" | jq '.Reservations[].Instances[] | { instanceId: .InstanceId , InstanceLifecycle: .InstanceLifecycle} | select(.InstanceLifecycle == "spot")'
```

## jqを使わずに上記と同じ事をする方法

こっちのほうがシンプル

```shell:path/to/hoge
aws ec2 describe-instances --filter "Name=instance-type,Values=t1.micro" "Name=instance-state-name,Values=running" "Name=instance-lifecycle,Values=spot"
```


## 稼働しているスポットインスタンスの内インスタンスタイプがt1.microのインスタンスIDをまとめて取得する

aws-cliの ``` --filter ``` で ``` "Name=instance-type,Values=t1.micro" ``` をしているのがミソ

```shell:path/to/hoge
aws ec2 describe-instances --filter "Name=instance-type,Values=t1.micro" "Name=instance-state-name,Values=running" | jq '.Reservations[].Instances[] | { instanceId: .InstanceId , InstanceLifecycle: .InstanceLifecycle} | select(.InstanceLifecycle == "spot")'
```


## 最後に

最初はjqで「アチャー、こりゃー」ってしてたけども最終的には--filter使うのが一番シンプルでした・・・・

以上
ridgepoleで外部キー制約付きのテーブルを扱った際にハマった件


# 前提

* rails 4.2.5
* [winebarrel/ridgepole](https://github.com/winebarrel/ridgepole) v0.6.3


# その1.export で 外部キー制約の名前が出力されない


## 問題

例えば以下のような参照整合性が設定されているテーブルがある

```ruby:db/migrate/foo.rb
# ブログエントリ
class Entry < ActiveRecord::Migration
  def change
    create_table :entries do |t|
      t.timestamps null: false
    end
  end
end

# 記事に対するコメント
class Comment < ActiveRecord::Migration
  def change
    create_table :comments do |t|
      # 記事テーブルへの外部キー制約が設定されたカラム
      t.references :entry, index: true, foreign_key: true
      
      t.timestamps null: false
    end
  end
end
```

これを ridgepole で Schemafile にexportすると

```ruby:Schemafile
create_table "comments", ... do |t|
  # comments テーブルの内容
end

create_table "entries", ... do |t|
  # entries テーブルの内容
end

add_foreign_key "comments", "entiries"
```

のように出力されるが、これを ridgepole で apply しようとしても以下のようにエラーとなってしまう。

```console:error
[ERROR] Foreign key name in `xxxxxxx` is undefined
```

どうやら、`add_foreign_key` メソッドに外部キー制約名(`name:`オプション)が抜けているためエラーとなってるらしい。


## 対処

export結果に外部キーの制約名を出力する pull request は以下で上がっており、つい先日0.6.4ブランチにマージされた模様。

* [Add dump with default fk name by winebarrel · Pull Request #62 · winebarrel/ridgepole](https://github.com/winebarrel/ridgepole/pull/62)


gemとして正式にリリースされているのはまだ v0.6.3 (2016/2/5時点) なので、Gemfileを書き換えて、Githubから直接 "v0.6.4"ブランチをインストールするようにする。

```ruby:Gemfile
gem "ridgepole", github: "winebarrel/ridgepole", branch: "v0.6.4"
```

そして、以下のように export 時に `--dump-with-default-fk-name` オプションを追加する。

```console:example
bundle exec ridgepole \
 -c '{adapter: mysql2, database: my_database, username: user, password: pass, host: "localhost"}' \
 --export -o Schemafile --enable-mysql-awesome --dump-with-default-fk-name
```

これで外部キー制約の定義以下のように名前付きで出力されるようになる。

```ruby:Schemafile
add_foreign_key "comments", "entries", name: "fk_rails_xxxxxx"
```



# その2.Schemafileの定義順は(参照先→参照元)でなければならない

<b>※追記(2016/2/9) v0.6.4.beta8 で修正されていることが確認できました。</b>

## 問題

先の件で外部キー制約の問題は解消したと思われたがまだ問題が発生。
先の Schemafile を ridgepole で apply すると以下のような MySQL のエラーが発生する。

```
[ERROR] Mysql2::Error: Cannot add foreign key constraint: ALTER TABLE `comments` ADD CONSTRAINT `fk_rails_xxxxx`
```

どうやら、Schemafile の create_table を順番に実行しているが、その順番が comments (参照元) → entries (参照先) となっており、参照元のテーブルを作成する時点で参照先のテーブルが存在しないためエラーとなっていると思われる。

ridgepole がSchemafileに出力するテーブルの順番はアルファベット順となっており、テーブル間の依存関係は考慮されていないのでそのようなことになるらしい。

## 対処

これは今のところ対処されていないようなで、export 結果を直接エディタ等で編集して entries (参照先) → comments (参照元) の順番となるように書き換える必要がある。

```ruby:修正後のSchemafile
create_table "entries", ... do |t|
  # entries テーブルの内容
end

create_table "comments", ... do |t|
  # comments テーブルの内容
end

add_foreign_key "comments", "entiries"
```


# 結論

Railsでの外部キー制約はいろいろ面倒くさい。