OmniAICreator/Qiita-1.07M huggingface dataset:
できるだけインフラに触りたくないエンジニアがWeb開発環境を整える

アプリケーションコードは書けるけど、管理系のコードは書いたことがない or 書きたくない。
できるだけ自動化はしたいけど、面倒くさいことはしたくない。開発者自分だけだし。
日曜プログラマなので面倒くさいことは逃げたい。

そんな気持ちの時に、インフラを憂鬱と思う僕にふさわしい環境構築手順を考えました。


## 前提
* 楽なこと。
* 何も考えずにテキトーにやってもある程度動くこと。
* 色々できること。
* 英語がカタコトでも分かりやすいとか、日本語docsがあるとか。
* 新しいっぽい感じがすること。少なくとも古くない。

楽でテキトーでも動く≠色々できる
日本語docの充実≠新しい

そんな気がするけど調べてみよう。

## 基盤部
一番下の部分。
PaaSの何かを使うことは確定。

### aws(ec2)
めんどくさい。高機能で何でも出来るけど。色々設定しなきゃいけないのが面倒くさい。
### heroku
楽。オススメっぽい。やや古い＆デバッグ困難
### Dokku
Dockerの設定ファイル経由でサーバ立てられるアレ。
家の古いLinuxで建てたサーバと同じ環境をクラウド上でできるね！
### Dokku Alternative
なんかいいらしい http://kray.jp/blog/dokku-alternative/


## WebFramework

知らんので誰か教えて。やろうと思ってたの

### Play! + Scala
なんかカッコいい気がする（気のせい）
### node.js + なんか
何が良いのか分からん。
### RoR
LoL

最近Web触ってないのでよくわからなくなった

## jsフロントエンド
### AngularJS
乗るしか無いこのビッグウェーブ
### jQuery
温故知新。特に問題ないし関連ライブラリ多いし。


## CSS

* Saas 古いの？
* Scss 新しいの？
* Less 動的なの？



#まとめ
僕の知識が5年位アップデートされてないことがわかったのでだれかボスケテ
CoreOSのdocker1.3.1対応版インストールなど


# 参考

* [Installing to Disk](https://coreos.com/docs/running-coreos/bare-metal/installing-to-disk/)

# CDブート

```bash:sshd用にrootユーザのパスワード設定
sudo -s
passwd
```

```bash:IPアドレスを調べておく
ip -f inet a
```

リモートからssh接続して以下操作

# HDDにインストール

```bash:HDDにインストール
curl -L http://goo.gl/eO5tbp -o cloud-config.yml
coreos-install -d /dev/vda -C alpha -c cloud-config.yml
```

`-V 493.0.0`オプションでバージョンを指定することもできる。

事前のダウンロードしておいたイメージを用いることもできる。

```bash:webサーバ側
wget http://alpha.release.core-os.net/amd64-usr/493.0.0/coreos_production_image.bin.bz2
wget http://alpha.release.core-os.net/amd64-usr/493.0.0/coreos_production_image.bin.bz2.sig

python -m SimpleHTTPServer
```

```bash:
sed -e 's@^BASE_URL.*@BASE_URL="http://192.168.100.103:8000"@' /usr/bin/coreos-install > ~/coreos-install
bash ~/coreos-install -d /dev/vda -c cloud-config.yml
```

# HDDにインストール (cloud-config.ymlを指定しない場合)

```bash:HDDにインストール
sudo coreos-install -d /dev/vda -C alpha -V 493.0.0
```

* リリースのバージョンは https://coreos.com/releases/ で確認ができる。

cloud-config.ymlを引数に指定しても良いが、後のことを考えて手動の編集方法を以下に書く。

# インストール後の設定

```bash:編集
mount -o subvol=root /dev/vda9 /mnt/
```

## cloud-config.ymlを編集する

* [Customize with Cloud-Config](https://coreos.com/docs/cluster-management/setup/cloudinit-cloud-config/)
* cloud-config.ymlは`/mnt/var/lib/coreos-install/user_data`に保存されるので直接編集する。
* syntax checkは https://coreos.com/validate/ で確認できる。

```bash:
mkdir /mnt/var/lib/coreos-install/
```

```bash:短縮URLを使わない場合
curl -o https://raw.githubusercontent.com/tukiyo/dockerimage-ja/master/cloud-config/user_data.yml \
  /mnt/var/lib/coreos-install/user_data
```

```bash:短縮URL
curl -L http://goo.gl/eO5tbp -o /mnt/var/lib/coreos-install/user_data
```

```bash:
reboot
```

## password値

* 暗号化したpasswordは`openssl passwd -1`で生成する。
  * 上記内容では`vagrantユーザ`のパスワードは`vagrant`
* 平文で書くこともできる。

## インストールされたCoreOSのバージョン確認

* CoreOSのバージョンは`/etc/os-release`で確認できる。
【Linux】logrotate

# 設定ファイルの場所
/etc/logrotate.confに共通設定、/etc/logrotate.d/配下に個別の設定を書く。
logrotate.d配下の設定がデフォルト設定をオーバーライドするイメージ。

例えば、apacheのログのローテーションをしたい場合は、logrotate.d配下にapache用のファイルを作成して、個別設定を書き込む。

```bash:設定例
/etc/httpd/logs/access_log
/etc/httpd/logs/error_log {
      weekly
      rotate 4
}
```

#項目の意味

| 項目 | 意味 |
|:-----------|:------------|
| daily,weekly,monthly|それぞれ毎日（0時）、週毎、月毎。| 
| rotate n | n回分保存。weeklyで、rotate 4なら4週間分保存する。 | 
| dateext| ログファイル末尾につく数値の代わりに日付(YYYYMMDD)がつく|
| compress| ローテーションしたログを圧縮|
| notifempty| ログファイルが空ならローテートしない|
| missingok | 対象ファイルが存在しなくてもエラーを出さずに処理続行 |

# logrotateの実行タイミング
/etc/cron.daily内にlogrotate用のshellがあり毎日1回実行される。
CentOS 7 での LAMP 環境のセットアップ手順 (Apache 2, PHP 7, MySQL 8 )

CentOS 7 での LAMP 環境 （ Apache + PHP + MySQL ）のセットアップ手順。

## EPEL と Remi のインストール

```shell-session
$ sudo yum install epel-release
$ sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
```

## Apache + PHP + MySQL接続系ライブラリのインストール

```shell-session
$ sudo yum install php php-mysql
```

apacheを起動する

```shell-session
$ sudo systemctl start httpd
```

apacheの設定ファイルは `/etc/httpd/` 以下にあるので、必要に応じて適宜編集する。

## MySQLのインストール
CentOS7 では MySQL ではなく MariaDB がデフォルトになっているが、 MySQL をインストールする。

### MariaDB関連の削除

maria 関係のパッケージを確認

```shell-session
$ sudo yum list installed | grep maria
```

上記で表示されたものを削除

```shell-session
$ sudo yum -y remove mariadb-libs
```

### MySQL公式のリポジトリの登録

https://dev.mysql.com/downloads/repo/yum/ を参照して、 Red Hat Enterprise Linux 7 用の最新のリポジトリを追加する

```shell-session
$ sudo yum install https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm
```

### MySQL 8 のインストール

最新版の 8 をインストールする。

```shell-session
$ sudo yum install mysql-community-server
```

### MySQLの起動

```shell-session
$ sudo systemctl start mysqld
```

### 初期の root パスワードの確認

```shell-session
$ grep -i password /var/log/mysqld.log
```

### mysql_secure_installation で root のパスワードを設定

```shell-session
$ mysql_secure_installation --use-default
```
【Swift】【Objective-c】アプリのバージョン及びビルドバージョンの取得方法

Swiftの場合

```swift
var version:String =
NSBundle.mainBundle().infoDictionary["CFBundleShortVersionString"]! as String;

var build:String = 
NSBundle.mainBundle().infoDictionary["CFBundleVersion"]! as String;

println(version)
println(build)


```

Objective-Cの場合

```objc

NSLog(@"バージョン %@",
[[NSBundle mainBundle] infoDictionary][@"CFBundleShortVersionString"]);
NSLog(@"ビルド %@",
[[NSBundle mainBundle] infoDictionary][@"CFBundleVersion"]);

```
JavaからGoogleの短縮URLを生成


以下、ソースコード貼ります。

```

    /**
	 * 短縮URL生成
	 * @param longUrl
	 * @return
	 * @throws ClientProtocolException
	 * @throws IOException
	 */
	@SuppressWarnings("resource")
	private static String getShortUrl(String longUrl) throws ClientProtocolException, IOException {
		HttpPost post = new HttpPost("https://www.googleapis.com/urlshortener/v1/url");
		post.setHeader("Content-Type", "application/json");
		post.setEntity(new StringEntity("{'longUrl': '"+longUrl+"'}", "UTF-8"));
		 
		HttpResponse response = new DefaultHttpClient().execute(post);
		 
		String responseText = EntityUtils.toString(response.getEntity());
		
		
		// JsonFactoryの生成
		JsonFactory factory = new JsonFactory();
		// JsonParserの取得
		@SuppressWarnings("deprecation")
		JsonParser parser = factory.createJsonParser(responseText);
		 
		//JSONのパース処理
		String shotUrl = "";
		while (parser.nextToken() != JsonToken.END_OBJECT) {
			String name = parser.getCurrentName();
			if (name != null) {
				parser.nextToken();
				if (name.equals("id")) {
					shotUrl = parser.getText();
				}
			}
		}
		
		return shotUrl;
	}
Matlab が Yosemiteで動かないので直す

![スクリーンショット 2014-10-20 16.24.16.png](https://qiita-image-store.s3.amazonaws.com/0/28835/f38bb39b-4d90-62e2-9097-1f8bb41fc5dc.png)

ここに書きました．
http://ryskt.com/wp/?p=141
DigitalOcean の CentOS7 初期セットアップ手順 

DigitalOcean の CentOS 7 のセットアップの手順。

[Digitalocean の Initial Server Setup with CentOS 7](https://www.digitalocean.com/community/tutorials/initial-server-setup-with-centos-7) を参考にする。

## 仮想マシンの起動
スペックは一番低いやつでOK。後から変更が可能。
OS は CentOS 7 を選択。
SSH キーは登録したものを設定する。これが root の公開鍵に設定される。

droplets の Access の画面で IP アドレスや root のパスワードが確認できるので、 root のパスワードをリセットしておく。リセットしたパスワードはメールで届く。

## SSHログイン

```shell-session
$ ssh -i 秘密鍵 root@IPアドレス
```

## 基本的な設定など
ログインしたら root で下記の作業をする。

### yum upddate とだいたい必要そうなパッケージをインストール

```shell-session
# yum update

# yum -y groupinstall base
# yum -y groupinstall network-tools
```

### reboot

カーネルなどもアップグレードされているので reboot する。

```shell-session
# reboot
```

### SSHのセキュリティ設定

```shell-session
# vi /etc/ssh/sshd_config
```

下記の部分を編集する。

```shell
PasswordAuthentication no
Port 任意のポート番号 ( 22 以外にしておく )
```

sshd を再起動する。

```shell-session
# systemctl restart sshd.service
```

ポート番号が変わっていることを確認する

```shell-session
# ss -antu | grep ssh
```

### SeLinux の設定。

selinux で `/etc/ssh/sshd_config` に設定したポート番号への接続を許可する。

```shell-session
# semanage port -a -t ssh_port_t -p tcp 設定する任意のポート番号
```

## ユーザーの追加
基本的に root ユーザーで作業はしないのでユーザーを追加する。

```shell-session
# useradd {USERNAME}
# passwd {USERNAME}
```

追加したユーザーが sudo を実行できるように wheel グループに追加する

```shell-session
# usermod -aG wheel {USERNAME}
```

追加したユーザーに切り替える

```shell-session
# su {USERNAME}
```

公開鍵を設定する

```shell-session
$ cd
$ mkdir .ssh
$ chmod 700 .ssh
$ vi .ssh/authorized_keys # 公開鍵を記載
$ chmod 600 .ssh/authorized_keys
```

root ユーザーに戻って、 root での ssh ログインを禁止する

```shell-session
# vi /etc/ssh/sshd_config
```

`PermitRootLogin` を `no` にする。

```shell
PermitRootLogin no
```

sshd を再起動する。

```shell-session
$ systemctl restart sshd.service
```

## Cloud Firewalls の設定

[Cloud Firewalls](https://www.digitalocean.com/docs/networking/firewalls/) で、今回変更した SSH ポート番号だけでしか SSH ログインできないように Firewall の設定を追加する。
boot2dockerでパスワードを聞かれないようにする

# boot2dockerでパスワードを聞かれないようにする

### 結論: `chmod 600 ~/.ssh/id_boot2docker` で治る

## 症状

Docker 1.3 と boot2docker 1.3もきて、fig 1.0 も出ましたね。
Macでboot2docker up/startを実行すると以下のようにパスワードが何回も聞かれることがあるようです。

```lang:sh
$ boot2docker up
Waiting for VM and Docker daemon to start...
.docker@localhost's password:
odocker@localhost's password:
docker@localhost's password:

Started.
docker@localhost's password:
```

boot2dockerのid:passはdocker:tcuserなのですが、普通は聞かれないので治し方。

##対処法
- `chmod 600 ~/.ssh/id_boot2docker` しましょう

## 調査方法
- `boot2docker -v up` でboot2dockerが裏側で叩いているコマンドが見えます。boot2dockerはすべてのコマンドで-vオプションが使えるので困ったら-vしましょう
Nexus 7 (2013 WiFi) に Android 5.0 (developer preview) を入れる

Android 5.0 使ってみたかったので最新の developer preview 版を Nexus7 2013 に焼いたのでメモ。


- https://developers.google.com/android/nexus/images

↑に書いてあるとおりだけど…。

### 1. USB デバッグオプションオンにして N7 を mac に繋ぐ

### 2. ブートローダーを起動する

```
adb reboot bootloader
```

### 3. ブートローダをアンロックする

```
fastboot oem unlock
```

標準だと No になってるので Yes にする

### 4. ロムを焼く

http://developer.android.com/preview/index.html の Nexus 7 \[2013\] (Wi-Fi) "razor" をダウンロードして解凍。

```
./flash-all.sh
```

でロムを焼き直す。

久しぶりにロム焼いたけど、簡単ですね。
RundeckにSSLで接続する際にELBで終端してRundeckにはHTTPで接続するためのオプション


はじめに
=======

最近ちょっとRundeckを使い始めています。
お手軽にRundeckにSSLで接続するために、AWSのELBで終端させようと思ったら、意外にかなりハマったので共有します。

バージョン
--------

* Rundeck: rundeck-launcher-2.2.3.jar 

やりたいこと
===========


```
             HTTPS                        HTTP
Client <--------------> (4443)ELB <-------------------> (4440)Rundeck
```

こんな感じで、ELBまでは HTTPSで接続して、そこからRundeckまではHTTPで使いたい、とします。
このような構成は既にELBにワイルドカードのSSL証明書などがある場合とても便利です。
ELB側は4443ポート(rundeckのデフォルトHTTPSポート）である必要はないですが、今はそうであるとします。

まずは
--------
Rundeck側は普通にHTTPで4440ポートで待ち受けるわけですが、絶対URLとしては `https://ELB_DOMAIN:4443/` がベースになります。
`etc/{framework,preferences}.properties` などの該当箇所を色々書き換えていきます。

`framework.server.port = 4440` 
以外は `https://ELB_DOMAIN:4443/` に合わせて書いていく感じでしょうか。

でも上手くいかない
------------

どころが、この辺の設定をどう書き換えても、
ログイン後のリダイレクト先が `http://ELB_DOMAIN:4443/...` と **http** になってしまいます。
他にも左上にある Rundeckのロゴをクリックしてもリンク先が `http://...` になってしまいます。

HTTPSで待ち受けているELBにHTTPで接続しようとするわけですので、そっけないエラーになります。

解決法
-------
結局その辺の設定ファイルをいじる方法だと上手くいかなくて、下記のように
起動スクリプトに **`-Drundeck.jetty.connector.forwarded=true`** を付けると解決しました。


```sh:start.sh
#!/bin/sh

cd $(dirname $0)
exec /usr/java/default/bin/java -jar -Drundeck.jetty.connector.forwarded=true rundeck-launcher-2.2.3.jar
```

※ んー、これを framework.properties に書いても良いのかな・・・？

もし、同じ悩みを持っている方はお試し下さい。

さいごに
=======

Rundeckはなかなか便利で楽しそうなのですが、まだJenkinsに対する絶対的な強みがよくわからないところです。
なんとなく「小回りが利いてイケてる感じがする」という匂いもするので、もう少し使ってみようかなと思っています。
RubyでPostgreSQLを使ってると予期せぬSQLが実行されるかもしれない


#実証
```ruby:Gemfile
source 'https://rubygems.org'

gem 'pg'
gem 'not_null_terminated', github: "ymmtmdk/not_null_terminated"
```

```ruby:fake_insert.rb
require 'pg'
require 'not_null_terminated'

def nnt(sql)
  inst = "; INSERT INTO users (email) VALUES ('ymmt')"
  str = NotNullTerminatedString.new(sql+inst)
  inst.size.times{
    str.chop_without_terminate
  }
  str
end

slct = "SELECT * FROM users"
nnt_slct = nnt(slct)
p nnt_slct == slct #trueが帰る
p nnt_slct =~ /INSERT/ #もちろんマッチしません

conn = PG.connect( dbname: 'emailapp_test' )
conn.exec(slct){|res| p res.to_a.size} #例えば10件あるとする
conn.exec(nnt_slct)
conn.exec(slct){|res| p res.to_a.size} #11に増えてる
```

```
bundle
bundle exec fake_insert.rb
```

このコードを実行するとRubyのレベルではselect文にしか見えない文字列が実はinsertもする所が確認できる。
原因はruby-pg拡張の実装が悪くてStringValueCStrを使うべきところでStringValuePtrを使ってるから。この例では意図的に両者の差異が出るGemを使ってるけど、そもそもこれを見つけた原因は普通にRails使ってたら意図せぬ文字列が混入したことによるPG::CharacterNotInRepertoireに遭遇したことなので、よく探せば狙って引き起こせるかもしれない。

参考：
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/48598
https://github.com/ged/ruby-pg/pull/5
domainクラスでのdefaultValueに0を設定

おそらくこのバージョン前後のバグ？ではないかと思われる挙動なのだが変にハマるかもしれない場所なので。
int型のカラムのデフォルト値を設定する場合

```groovy:book.groovy
class Book{
 Integer num
  static mapping = {
    num defaultValue : 1
  } 
}
```
と記載すればデータベースのほうにもDefault値が1として設定されるが、これが0の場合どうにも上手くいかない。
その場合
`num defaultValue : "0"`
とダブルクォーテーションで囲ってあげるといい。
GrailsのGORMではどうにもこのような事が幾つかある気がする。
内部でSQLを生成する際に解釈しきれていないのだろうか？
ちなみに`type: int`や`sqlType: int`を指定しても解決はしなかった。
WindowsにおけるEclipseのインストール方法（Pleiadesを用いた）


JavaのIDE（統合開発環境）であるEclipseのインストール手順になります。学習や案件対応でJavaの開発環境用意する方も多いと思いますので、ここに記しておきます。

# 1. Eclipseのインストール

本記事のターゲットが初心者が多いであろうと推測されるので、ここではPleiades（Eclipseの日本語化プラグインのことです）を用いたインストールを行います。

以下のURLより、Pleiades All in Oneをダウンロードします。（下図参照。例はWindows 64bitの場合です。）

- [Pleiades - Eclipse プラグイン日本語化プラグイン | MergeDoc Project](http://mergedoc.sourceforge.jp/)

Pleiades All in One Full Editionをインストールすることにより、IDEが日本語化されているだけでなく、IDEの実行環境や、開発用のJavaも併せてインストールされます。

![スクリーンショット_102014_023329_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/27707/a26178d0-9c68-97c7-e6c3-4abb91fce54f.jpeg "スクリーンショット_102014_023329_PM.jpg")

インストール後は、解凍すればすぐ使えます。（参考までに私はCドライブ直下に解凍したpleiadesフォルダを置いて使っています。）

# 2. 注意点

解凍時に、アプリケーションによってはエラーとなってしまいます。この状態で起動を試みても起動できないので注意しましょう。本家では、WinRARを推奨しているようです。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/27707/c1cdeb9f-b66c-e92f-417c-86f276fc05d7.png "無題.png")

# 3. その他

Eclipseのパフォーマンスチューニングについては、以下を参照してみてください。

- [eclipse.iniの設定（パフォーマンス改善、@author補完の設定） | ユニキャストラボ](http://lab.unicast.ne.jp/2011/04/02/eclipse-ini%e3%81%ae%e8%a8%ad%e5%ae%9a%ef%bc%88%e3%83%91%e3%83%95%e3%82%a9%e3%83%bc%e3%83%9e%e3%83%b3%e3%82%b9%e6%94%b9%e5%96%84%e3%80%81author%e8%a3%9c%e5%ae%8c%e3%81%ae%e8%a8%ad%e5%ae%9a%ef%bc%89/)

# References
- [Pleiades - Eclipse プラグイン日本語化プラグイン | MergeDoc Project](http://mergedoc.sourceforge.jp/)
jets3tライブラリを使ってPrivateDistributionを実現する方法

![](https://camo.githubusercontent.com/b3e5216c741963453276671c6550c546dbfb86a5/68747470733a2f2f73332d61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f7374617469632e7570727573682e6e65742f696d616765732f63665f7369676e656455524c2e6a7067)
## 参考URL
- [Java を使用して URL 署名を作成する](http://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/CFPrivateDistJavaDevelopment.html)
- [2014-03-15-cf-signed-url.md](https://github.com/uprush/uprush.github.io/blob/master/_posts/2014-03-15-cf-signed-url.md)
- [CloudFront+S3で署名付きURLでプライベートコンテンツを配信する](http://dev.classmethod.jp/cloud/aws/cf-s3-deliveries-use-signurl/)

個人的には真ん中のリンクのまとめが非常に分かりやすかったです。

## Javaサンプルソースコード
実装に至るまでに、ClassMethodさんのブログを何度も読み返して参考にさせて頂きました。
以下の２つです。

- [JavaでCloudFrontの署名付きURL (signed URL) を生成する](http://dev.classmethod.jp/cloud/aws/cloudfront-presigned-url-java/)
- [Amazon CloudFrontでプライベートコンテンツにアクセス その2](http://dev.classmethod.jp/etc/amazon-cloudfront-private-contents-access-2/)

結果、jets3tライブラリを使ってコードを実装しました。
簡単ですが、以下サンプルです。

このコードによって有効期限付きのURLを発行することが出来ます。

```PrivateMusicDistribution.java

import java.io.FileInputStream;

import org.jets3t.service.CloudFrontService;
import org.jets3t.service.security.EncryptionUtil;
import org.jets3t.service.utils.ServiceUtils;

public class PrivateMusicDistribution {
	
   public static void main(String[] args) throws Exception {

       // cloudfront domain name
		String distributionDomain = "XXXXXXX.cloudfront.net";
       // your Cloudfront private key path
		String privateKeyFilePath = "pk-XXXXXXXXXXXXXXXXX.pem";
       // distribution file
		String s3ObjectKey = "sample.mp3";
		// your Cloudfront Access key
       String accessKey = "XXXXXXXXXX";

		String policyResourcePath = "http://" + distributionDomain + "/"
				+ s3ObjectKey;

		byte[] derPrivateKey = EncryptionUtil
				.convertRsaPemToDer(new FileInputStream(privateKeyFilePath));


		// generate policy. timestamp + 60second
		String policy = CloudFrontService.buildPolicyForSignedUrl(
				policyResourcePath,
				new Date(System.currentTimeMillis() + 60000), null, null);
		
        String signedUrl = CloudFrontService.signUrl(policyResourcePath,
        		accessKey, derPrivateKey, policy);

		System.out.println(signedUrl);
	}

}
```
input要素の中身のテキストの高さがずれる問題


input要素に対してfocus時と非focus時にテキストが配置される縦の位置がずれるという問題に直面していたのだが、
reset.cssに

```
input{
	font-family: inherit;
}
```

がかかってしまっていたからのようだ。
深く見ていないけど、font-familyによってテキストの配置位置がずれる可能性アリ。
同じ問題に遭遇したらチェックしておきましょう。
PowerShellと7zipでファイルを圧縮

データベースから取得したCSVファイルを暗号化パスワード付のzip圧縮にしたい。

しかし、標準の.NETのライブラリーにはzip圧縮をするライブラリーは存在するが、
暗号化パスワードを設定するようなライブラリーは無い。

DotNetZipというライブラリーを使う手もあるが、ライブラリーを取得して自分自身がいるフォルダーに転がして…等と7-zipのコマンドラインツールを使うのと手間が変わらない。

7-zipを使ってPowerShellでzip圧縮してみる。

##フォルダー構成
CSVMAILTRANSFERというフォルダに7zipのコマンドラインツールを取得。
zip解凍しフォルダ丸ごと入れておく
下記のようなフォルダー構成にしておきます。
compress.ps1は、これから作成するPowerShellスクリプトです。
outfileフォルダはzip圧縮したファイルの出力先であり、
csvのデータが入っているフォルダ―です。

C:\CSVMAILTRANSFER
│  compress.ps1
│
├─7za     7zipのコマンドラインツールの入ったフォルダ
│      7-zip.chm
│      7za.exe
│      license.txt
│      readme.txt
│
└─output  zip圧縮ファイル出力先と圧縮したいファイルがある場所
       sales.csv


##ソースコード
```ps1:compress.ps1
<#
compress.ps1

7zipのコマンドラインを使って
暗号化パスワード付zip圧縮ファイルを作成

#>

# 圧縮するファイル
$source="\output\sales.csv"
#圧縮先のファイル名
$dist="\output\sales.zip"

## 7-Zipの場所を指定
# スクリプトファイルのパスを取得
$path=Split-Path ( & { $myInvocation.ScriptName } ) -parent
$7zip=$path+"\7za\7za.exe"
# 圧縮ファイルのフルパス取得
$source=$path+$source
$dist=$path+$dist

# 7-Zipのコマンドライン引数を生成
$Arg=" a -mem=AES256 -pPassword "+$dist+" "+$source

# 7-zipで圧縮
Start-Process $7zip -Verb runas -ArgumentList $Arg

```
##解説
7zipをコマンドラインで操作するのと同じことをPowerShell上で実行している。
Start-Processを使い7zipの実行ファイルを呼び出し、引数を貰い圧縮処理を行っている。

##参考サイト
[コマンドでZIPや7zにパスワードを付ける](http://sevenzip.sourceforge.jp/howto/dos-command-password.html)

[Start-Process](http://technet.microsoft.com/ja-jp/library/hh849848(v=wps.620).aspx)
[jade] クラス名を変数にしてやりたい

# 思ったこと
Bootstrapを見ていて

```html
<div class="raw">
  <table class="col-6">...</table>
  <table class="col-6">...</table>
</div>
```
なんて感じでデザインしたのに，デザイン見た人から「左のテーブルだけもう少し横幅広くならない？」なんて言われて

```html
<div class="raw">
  <table class="col-8">...</table>
  <table class="col-4">...</table>
</div>
```

にせよとか，修正するの，すっげぇ面倒だなぁと思った。

# できたらいいな

```jade
- var left = 6;
- var right = 12 - left;
.raw
  table.#{left}
  table.#{right}
```

# ひとまずの結論
いける

```jade
- var classstr = "hogeClass";
- var left=6, right=12-left;
- var classAttr = function(left){return {left:left, right: 12 - left};}(6);

.raw
  table(class="#{classstr} #{classAttr.left}");
  table(class="#{right}");
  table(class="#{classAttr.right}");
```

いけない

```jade
- var classstr = "hogeClass";
- var classAttr = {left:left, right: 12 - left};

.raw
  table.#{classstr}
  table."#{classstr}"
  table(class="#{classAttr.right}")  //← table(class="NaN")になる
```

最後のヤツがうまくいかないのは，ちょっと意外だった。

jadeにjsロジックをベタ書きするのは，あんまり美しくないような気がするので，expressと組み合わせて，
routeから変数をrenderで引き渡してやれば，なんとなくそれっぽいのが書けそうな気がしてきた。


もしかしたらmixinとか使って，もう少し素直に書けるのかも。その辺は継続調査。

#追記
二番煎じだった。しにたい。
https://teratail.com/questions/2947
EC2起動時にEphemeral DiskをRAID0でマウントする


Elasticsearchを動かすときに高速なSSDが欲しくてやりました。
node自体はクラスターを組んでいるのでデータを失う分には問題ないけど、再起動時やインスタンス追加時にEphemeral Diskを自動でマウントさせたいみたいな時に使えるかと。

※ Ephemeral Disk一つの場合は自動マウント可能だが、権限周りはリセットされるので注意が必要。

まず、次のようなファイルを作成する。

```sh:/etc/init.d/ephemeral-mount
#!/bin/bash

### BEGIN INIT INFO
# Provides: ephemeral-mount
# Required-Start:
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# description: mount ephemeral disk
### END INIT INFO

start() {
    if test -e /dev/xvdb ; then
        if test -e /dev/xvdc ; then
            umount /media/ephemeral0
            yes | mdadm --create /dev/md127 --level=0 --raid-devices=2 /dev/xvd[bc]
            mkfs.ext4 /dev/md127
            mount /dev/md127 /media/ephemeral0
        else
            umount /media/ephemeral0
            mkfs.ext4 /dev/xvdb
            mount /dev/xvdb /media/ephemeral0
        fi
    fi
    chmod 777 -R /media
}

# See how we were called.
case "$1" in
    start)
        start
        ;;
    stop)
        echo "hoge"
        ;;
    *)
        echo $"Usage: $prog {start|stop}"
        RETVAL=2
esac
exit $RETVAL
```

```sh
$ sudo chmod 755 /etc/init.d/ephemeral-mount
$ sudo chkconfig --add ephemeral-mount
$ sudo chkconfig ephemeral-mount on
```

動作確認する場合は手動で実行する。

```sh
$ sudo /etc/init.d/ephemeral-mount start
```
OS X El CapitanのJapaneseIMの日本語入力で常に半角スペースを入力する

# 概要

GUIに設定項目がないため、`/System/Library/Input Methods/JapaneseIM.app/Contents/Resources`配下にある設定ファイルを編集します。
El CapitanからはSystem Integrity Protection (SIP, 通称rootless)により、該当の設定ファイルの書き換えが行えなくなっています。
そのため、一度rootlessを無効化してからファイルを書き換え、再びrootlessを有効化します。[^1]

[^1]: rootlessの有効/無効を切り替えるには再起動が必要です。無効化後の再起動をリカバリーモードにすれば、再起動回数を減らせると思いましたが、リカバリーモードのターミナルで該当の編集ファイルを開くと文字化けが起こるので、通常モードで起動するのが無難です。

# rootlessの無効化

## リカバリーモードで起動

rootlessを無効化するにはリカバリーモードで起動する必要があります。

リカバリーモードで起動するには、Macを再起動して起動時に`⌘+R`キーを押したままにします。
しばらく待つと言語の選択画面が表示されますので、英語の場合は「Use English for the main language」、日本語の場合は「主に日本語を使用する」を選択して次に進みます。
その後、「OS X Utilities」が表示されます。上部の「Utilities」メニューから「Terminal」を起動します。

## csrutilコマンドによるrootless無効化

次のコマンドを実行し、rootlessを無効化します。

    # csrutil disable
    Successfully disabled System Integrity Protection. Please restart the machine for the changes to take effect.

## 通常モードで再起動

「」メニューから「Restart」を選択して再起動します。

# KeySetting_*.plistの書き換え

再起動後、`/System/Library/Input Methods/JapaneseIM.app/Contents/Resources/KeySetting_Default.plist`を編集します。
(「Windows-like shortcuts」にチェックを入れている場合は`/System/Library/Input Methods/JapaneseIM.app/Contents/Resources/KeySetting_Windows.plist`)

    $ sudo vim "/System/Library/Input Methods/JapaneseIM.app/Contents/Resources/KeySetting_Default.plist"

16行目(1)と23行目(2)の`string`要素の内容が、それぞれ全角スペース、半角スペースになっているので入れ替えます。

```
...
		<key>before_typing</key>
		<dict>
			<key>&apos; &apos;</key>
			<dict>
				<key>command</key>
				<string>direct_input</string>
				<key>character</key>
				<string> </string>    <!-- (1) -->
			</dict>
			<key>shift+&apos; &apos;</key>
			<dict>
				<key>command</key>
				<string>direct_input</string>
				<key>character</key>
				<string>　</string>    <!-- (2) -->
			</dict>
...
```

# rootlessの有効化

## リカバリーモードで起動

再び、Macを再起動してリカバリーモードになり、Terminalを起動します。

## csrutilコマンドによるrootless有効化

次のコマンドを実行し、rootlessを有効化します。

    # csrutil enable
    Successfully enabled System Integrity Protection. Please restart the machine for the changes to take effect.

## 通常モードで再起動

「」メニューから「Restart」を選択して再起動します。

これで日本語入力時に`Space`を入力すると半角スペースになり、`Shift+Space`で全角スペースになります。

## 参考

* [Yosemiteの日本語入力で常に半角スペースを入力する方法 | Apple サポートコミュニティ](https://discussionsjapan.apple.com/thread/10153312)
* [OS X：OS X での復元について - Apple サポート](https://support.apple.com/ja-jp/HT201314)
[Ruby]URLのクエリ文字列からHashを生成する

RubyでURLのクエリ文字列をHashに変換する方法です。
標準添付ライブラリURIを利用します。
[Ruby 2.1.0 リファレンスマニュアル > ライブラリ一覧 > uriライブラリ](http://docs.ruby-lang.org/ja/2.1.0/library/uri.html)

```rb
require 'uri'

uri = URI::parse('http://qiita.com/search?utf8=%E2%9C%93&sort=rel&q=ruby')

q_array = URI::decode_www_form(uri.query)
#=> [["utf8", "✓"], ["sort", "rel"], ["q", "ruby"]]

q_hash = Hash[q_array]
#=> {"utf8"=>"✓", "sort"=>"rel", "q"=>"ruby"}
```

## 参考ページ
[How to extract URL parameters from a URL with Ruby or Rails?](http://stackoverflow.com/questions/2500462/how-to-extract-url-parameters-from-a-url-with-ruby-or-rails)

## 関連記事
[Hash からクエリ文字列を生成する](http://qiita.com/quanon86/items/4a0a06e0ed76b9a07bc7)
[Rubyで日本語のURI(URL)をパーズするなら Addressable::URI を使おう](http://qiita.com/yoshioota/items/4a58d977b4f89078d7d4)
また欲しくなったから秘密鍵から公開鍵を都合よく作る


もういらないだろと思って消した公開鍵、古いPCと共にお払い箱になった公開鍵、急に必要になったので秘密鍵から都合よく作り直すことにした。

```bash:ssh-keygen
$ ssh-keygen -y -f secret_key > new.pub
```

###### 参考

```
 -y
    このオプションは OpenSSH 形式の秘密鍵ファイルを読み、OpenSSH 形式の公開鍵を標準出力に表示します。
```

http://www.unixuser.org/~euske/doc/openssh/jman/ssh-keygen.html
iPhoneアプリの公開停止方法 (新iTunes Connect)

# iTunes Connect(日本のみ？)のバグで編集項目が出てこない。
iTunes Connectがバージョンアップし画面が変更されたが、英語版では出てくるはずの項目が日本語版のものでは出てきません。
※[こちら](
http://kb.applingua.com/2011/12/removing-apps-from-the-app-store-itunes-connect/)を参照

## 公開停止方法
1. iTunes Connectにログインする
2. マイAppから停止したいAppを選択する
3. 価格リンクを開く
4. ブラウザのアドレスバーに以下を入力し、Enterキーを押す
```
javascript:uncheckAllCountries();
```
5. Saveボタンを押す

## 公開再開方法

1. iTunes Connectにログインする
2. マイAppから停止したいAppを選択する
3. 価格リンクを開く（バグで表示されていなかった欄が表示されている）
4. すべて選択ボタンを押す
5. Saveボタンを押す

# 最後に
アップルジャパンの迅速な対応を願います。
PowerShellでメール送信

##はじめに
データベースから取得したCSVデータをメールで送信する案件が発生した。
CSVを暗号化zip圧縮にする必要があるが取り敢えずは、
zipファイルをメールに添付して送信するスクリプトを作ってみた。

##環境
PowerShell v2.0以降
.Net Framework 2.0以降

##解説
.NET Framework2.0以降にある 
SmtpClientとMailMessage、Attachmentオブジェクトを呼び出して
作成している。
僕が紹介した当時は、Portの変更等ができなかったので。
今はSend-MailMessageで事足ります。

```posh:メール送信

$From="送信元メールアドレス"
$Subject="納品書"
$body="納品内容を送信致します。"
#　このファイルの場所を取得
$FilePath=Split-Path ( & { $myInvocation.ScriptName } ) -parent
$File=@(Get-ChildItem $FilePath'\添付ファイル.zip')
$To="宛先メールアドレス"

# 送信メールサーバーの設定
$SMTPServer="メールサーバーアドレス"
$Port="ポート番号"
$User="送信ユーザー名"
$Password="送信パスワード"
$SMTPClient=New-Object Net.Mail.SmtpClient($SMTPServer,$Port)
# SSL暗号化通信しない $false
$SMTPClient.EnableSsl=$false
$SMTPClient.Credentials=New-Object Net.NetworkCredential($User,$Password)

# メールメッセージの作成
$MailMassage=New-Object Net.Mail.MailMessage($From,$To,$Subject,$body)
# ファイルから添付ファイルを作成
$Attachment=New-Object Net.Mail.Attachment($File)
# メールメッセージに添付
$MailMassage.Attachments.Add($Attachment)
# メールメッセージを送信
$SMTPClient.Send($MailMassage)

```

##参考サイト
[Windows PowerShell を使用して GMail や Office 365 からメールを送信する](http://blogs.technet.com/b/junichia/archive/2011/12/08/3469710.aspx)

[MailMessage.Attachments プロパティ](http://msdn.microsoft.com/ja-jp/library/system.net.mail.mailmessage.attachments%28v=vs.110%29.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2)

[PSCredential資格情報を作ってみる](http://blogs.gine.jp/kusa/archives/34)

[Send-MailMessage](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/send-mailmessage?view=powershell-7)
連分数展開をMathMLで描いてみた

連分数展開、MathMLで描いてみました。FireFoxのFireMathというプラグインを使って。
FireFoxなら表示可能。ChromeもMathML対応しているはずなんだが、表示できない...ハテ？
黄金数(Φ)、√2、自然対数(e)、円周率(π)の連分数展開が添付画像。
![renbunsuu.jpg](https://qiita-image-store.s3.amazonaws.com/0/48232/1e2742e1-4847-728f-6835-78ee50c41972.jpeg)

その一部のソースコードが以下：

        <mtr>
          <mtd>
            <msqrt>
              <mn>2</mn>
            </msqrt>
            <mo>=</mo>
            <mn>1</mn>
            <mo>+</mo>
            <mfrac>
              <mrow>
                <mn>1</mn>
              </mrow>
              <mrow>
                <mn>2</mn>
                <mo>+</mo>
                <mfrac>
                  <mrow>
                    <mn>1</mn>
                  </mrow>
                  <mrow>
                    <mn>2</mn>
                    <mo>+</mo>
                    <mfrac>
                      <mrow>
                        <mn>1</mn>
                      </mrow>
                      <mrow>
                        <mn>2</mn>
                        <mo>+</mo>
                        <mfrac>
                          <mrow>
                            <mn>1</mn>
                          </mrow>
                          <mrow>
                            <mo>&middot;&middot;&middot;</mo>
                          </mrow>
                        </mfrac>
                      </mrow>
                    </mfrac>
                  </mrow>
                </mfrac>
              </mrow>
            </mfrac>
          </mtd>
        </mtr>
10秒で解決できる、Android 5.0 のドキュメントが取得できない問題の解決策


先日リリースされたAndroid 5.0 SDKですが、SDKマネージャでインストールしても「Documentation for Android」がインストールされていない問題が発生しています（mac、Linux版で確認）

![スクリーンショット_2014-10-20_11_29_29.png](https://qiita-image-store.s3.amazonaws.com/0/4560/9fa04782-bda5-99ee-d6e8-a5fcabb149b9.png "スクリーンショット_2014-10-20_11_29_29.png")

実はインストールできています。SDKマネージャを再度開くと、インストールできていることが確認できます。

![スクリーンショット_2014-10-20_11_32_45.png](https://qiita-image-store.s3.amazonaws.com/0/4560/afe99841-00fc-b2ff-6456-fdd206b7066a.png "スクリーンショット_2014-10-20_11_32_45.png")

SDKマネージャは、しばしば

- インストールしてるのにインストールされてない表示をしてくる
- インストールしたらビルド通らなくなって、SDKマネージャをもう一度開いたら新たなAndroid SDK Build-toolsが出てくる

といった感じの問題が起こるので、違和感をもったらすぐにSDKマネージャ再起動、むしろ何か更新したり追加したら（特にTools系）SDKマネージャ再起動して、隠しキャラが出てきていないかを確認する癖をつけることをおすすめします。
Yosemiteにアップグレードしたらpostgresが起動しないよ＞＜

```bash
connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
```
みたいなことをのたまって起動しない。繋げないよって言われているがよくわからん（繋げない時のいつものエラーな感じ）。

`Yosemite Postgres`で検索してチラチラ見てたら下記が引っかかった。

http://foobartel.com/2014/10/yosemite-upgrade-postgresql/

ログをみたら上記の通り

```
FATAL:  could not open directory "pg_tblspc": No such file or directory
FATAL:  could not open directory "pg_twophase": No such file or directory
```

とでていたので

```
mkdir /usr/local/var/postgres/pg_tblspc
mkdir /usr/local/var/postgres/pg_twophase
mkdir /usr/local/var/postgres/pg_stat_tmp
```

を実行してOK。
[Samba] Windows側から作成したファイルやディレクトリの所有者を指定する

### 動機
何も指定しないと、``nobody``ユーザーになるので、Webから操作するために、``apache``ユーザーに変更したかった。


### 作業

``smb.conf``において、``force user``と``force group``で指定する。

```ini:smb.conf

[test]
        path = /path/to/test

        force user = apache

        force group = apache
;以下おまけ        
        read only = No

        create mask = 0777

        force create mode = 0777

        directory mask = 0777

        force directory mode = 0777

        guest ok = Yes

        browseable = No

```
HerokuでPHPとApacheのバージョンを隠す方法

HerokuでPHPを動かすと、HTTPヘッダーにPHPのバージョンとApacheのバージョン（nginxを使っている場合はnginxのバージョン）が丸見えになる。Herokuで動かしていることがばれればバージョンは明らかなのだけれど、念のため隠しておきたいな、という場合にどうぞ。

## Procfileの指定

```text:Procfile
web: sh web_boot.sh
```

スクリプトを起動するように書き換え。

## web_boot.shの指定

```sh:web_boot.sh
# Apache configuration
echo "ServerSignature Off" >> /app/vendor/heroku/heroku-buildpack-php/conf/apache2/heroku.conf
echo "ServerTokens Prod" >> /app/vendor/heroku/heroku-buildpack-php/conf/apache2/heroku.conf
 
# PHP configuration
sed -i 's/^expose_php = On/expose_php = Off/' /app/vendor/heroku/heroku-buildpack-php/conf/php/php.ini
 
# Launch Apache with PHP
vendor/bin/heroku-php-apache2 public
```

やっていることは単純で、`ServerSignature Off`と`ServerTokens Prod`をApacheの設定ファイルに書き加えて、`expose_php = Off`に`php.ini`の設定を変更しているだけ。その後いつも通りにApacheの起動スクリプトを実行している（この場合`public`が公開ディレクトリーになる）。

ちなみにPHPの場合、`.user.ini`などを利用して一部設定の上書きを行えるのだが、`expose_php`の設定は上書きできない。また、Apacheの`ServerTokens`なども`.htaccess`の利用では上書きできないのでこのような対処が必要になった。

## 補足

この方法はあくまで[heroku-buildpack-php](https://github.com/heroku/heroku-buildpack-php)の構成ありきのものなので、buildbackの構成が変わったら使えなくなるので注意。そもそもHeroku側でHTTPヘッダーからは隠しておいてほしかったりする…。

一般的なHerokuとPHPの組み合わせの使い方は[HerokuでPHPを使うときに気を付けるところ](http://qiita.com/hiro_y/items/bc631a27c9701f81a4f9)に書いたのでよろしければどうぞ。
Drupalの入力フィールドでGoolge Mapを使う


各記事内に地図情報を組み込みたいときは下記のフィールドモジュールが使えます。

### モジュールをインストール
下記ページから、モジュールをインストールします。
(インストール方法はこちら→ http://qiita.com/s_s_k/items/4ae744d8173b8f278626)

Google Map Fieldモジュール
https://www.drupal.org/project/google_map_field


### 関連モジュールをインストール
Google Map Fieldモジュールは他の関連モジュールが必要です。

Jquery updateモジュール
https://www.drupal.org/project/jquery_update



### モジュールをアクティブに変更
モジュールページで、アクティブに変更することで完了です。
各コンテンツタイプの「manage field」で、追加できます。
peco で Docker の container ID を楽に選択する alias

Docker 使っていると割りと container ID が必要になるケース多いと思います。
このとき一々 `docker ps` から container ID を探し出してコピペするのが面倒だったので、alias を定義しました。

```zsh
alias -g P='`docker ps | tail -n +2 | peco | cut -d" " -f1`'
```

`docker ps` の結果を peco で絞り込みます。
これだと起動しているコンテナの ID しか取れないので、停止中のも取りたい場合は `-a` オプションを付ければよいです。

peco に渡す前に `tail -n +2` を噛ませていますが、これは「頭から2行目以降を出力する（= 先頭行を飛ばして出力する）」というコマンドです。
`docker ps` は先頭行にフィールド名ヘッダが入るので、これを除去しています。

## コンテナ停止

```zsh
$ docker stop P
```

## コンテナのログを見る

```zsh
$ docker logs P
```

## nsenter を使ってコンテナに入る

予め [nsenter](https://github.com/jpetazzo/nsenter) を使えるようにしておき、.bashrc や .zshrc で `docker-enter` コマンドを定義しておく。

```zsh
$ docker run --rm -v /usr/local/bin:/target jpetazzo/nsenter
```

OS X で boot2docker 経由の `docker-enter` を参考までに載せておきます。

```.zsh
docker-enter() {
  boot2docker ssh '[ -f /var/lib/boot2docker/nsenter ] || docker run --rm -v /var/lib/boot2docker/:/target jpetazzo/nsenter'
  boot2docker ssh -t sudo /var/lib/boot2docker/docker-enter "$@"
}
```

以上設定したら、以下のコマンドでコンテナに attach できる。

```zsh
$ docker-enter P
```

## `docker exec` でコンテナ内プロセス実行 (>= Docker 1.3)

最近 Docker 1.3 が出て `docker exec` コマンドが定義されました。便利！！！！

例えばコンテナ内のプロセス一覧を確認したい場合、

```zsh
$ docker exec P ps -ef
```

## See also
[dot.zsh/.zshrc.peco - dtan4/dot.zsh](https://github.com/dtan4/dot.zsh/blob/master/.zshrc.peco)
¯
googleスプレッドシートからjsonを生成してzipする

googleスプレッドシートで武器の性能とか、モンスターの出現位置とか、いろいろとバランス調整したい。それらを最終的にはjsonにしてコードで読み出しする。
これは何百万回とやっていく一連の作業なので、これを自動化する。

googleスプレッドシート->csv->json
まず、スプレッドシートでcsvでダウンロードする。
chromeであれば、ダウンロードの全て表示で、urlが表示される。
注意点としては、ここで、シートは共有しておかないとダメ。
そしたらcurlで引っ張ってこれる。

```rb:csv2json.rb

#!/usr/bin/ruby
require 'rubygems'
require 'json'
require 'csv'

def integer_string?(str)
          Integer(str)
            true
rescue ArgumentError
          false
end

lines = CSV.open(ARGV[0]).readlines
keys = lines.delete lines.first
keys.drop(1)

File.open(ARGV[1], "w") do |f|
        a = Hash.new([])
        data = lines.map do |values|
                eqpId = values.at(0)
                values.drop(1)
                values.map! do |v|
                        if v
                                 if integer_string?(v)
                                        v.to_i
                                 else
                                        v.to_s
                                 end
                        else
                                v = ""
                        end
                end
                a[eqpId] = Hash[keys.zip(values)]
        end
        #f.puts JSON.pretty_generate(data)
        f.puts JSON.pretty_generate(a)
end

```

```bash:mk.sh
#!/bin/sh
set -e
WORKDIR=_work
RELDIR=_release

rm -rf $WORKDIR
mkdir $WORKDIR
cp ./*.rb ./$WORKDIR
cd $WORKDIR

#各種csvダウンロード,json化
#URLは都合上、省く
echo 'curl "URL" > eqp.csv'
curl "URL" > eqp.csv
echo 'ruby csv2json.rb eqp.csv eqp.json'
ruby csv2json.rb eqp.csv eqp.json

#このように変換を必要なかずかける。
         
#バージョン
TIME=`date '+%y%m%d%H%M%S'`   
echo "{\"version\":${TIME}}" > version.json

#まとめる    
rm -rf $RELDIR
mkdir $RELDIR
cp ./*.json ./$RELDIR
cd $RELDIR
    
#zip化し、サーバなどにアップロード
zip -r masterdata.zip * 
sudo cp masterdata.zip /Library/WebServer/Documents/
```
「gyazo-s3」を作ってみた


[これ](http://diary.soramugi.net/blog/2014/02/08/gyazo-server%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%B3%E3%80%8Cgyazo-s3%E3%80%8D%E4%BD%9C%E3%81%A3%E3%81%9F/)をやってみました。

※ Macでの作業を想定しています。

## ローカルにアプリを作成

まずはリポジトリをクローンします。

```bash
$ git clone https://github.com/soramugi/gyazo-s3.git
$ cd gyazo-s3
```

必要な環境変数を生成するのに`bundle`を使っているので`rbenv`をインストールします。

```bash
$ brew install postgresql
$ rbenv install 2.1.1
$ rbenv local 2.1.1
$ rbenv exec gem install bundler
$ NOKOGIRI_USE_SYSTEM_LIBRARIES=1 bundle install --path vendor/bundle
```

次のコマンドで`bundle`が使用可能であることを確認します。

```bash
$ echo $(bundle exec rake secret)
```

## herokuへのデプロイ

herokuにデプロイします。いくつか環境変数の設定が必要なのでいれておきます。
また、S3のバケットは初回アップロード時に生成されるので事前に準備しなくてOKです。
（逆に、バケットを作成する権限が必要です）

```bash
$ heroku create gyazo-s3
$ heroku config:set SECRET_KEY_BASE=$(bundle exec rake secret)
$ heroku config:set S3_BUCKET=S3_BUCKET
$ heroku config:set AWS_ACCESS_KEY_ID=AWS_ACCESS_KEY_ID
$ heroku config:set AWS_SECRET_ACCESS_KEY=AWS_SECRET_ACCESS_KEY
$ heroku config:set GYAZO_ID=$(cat ~/Library/Gyazo/id)
$ heroku config:set TITLE=GyazoS3
$ git push heroku master
$ heroku run bundle exec rake db:migrate
```

|変数名|説明|
|:--|:--|
|SECRET_KEY_BASE|たしかDBとの接続時に使うシークレットトークン（？）|
|S3_BUCKET|S3のバケット名|
|AWS_ACCESS_KEY_ID|AWS_ACCESS_KEY_ID|
|AWS_SECRET_ACCESS_KEY|AWS_SECRET_ACCESS_KEY|
|GYAZO_ID|公式クライアントアプリの識別用ID（`cat ~/Library/Gyazo/id`で確認出来る）|
|TITLE|ブラウザのタブとかに表示されるアレ|

## クライアントアプリの設定

`/Applications/Gyazo.app/Contents/Resources/script`を下記のように編集し、参照先をheroku上にたてたGyazoに変更します。

```bash:/Applications/Gyazo.app/Contents/Resources/script
#HOST = 'upload.gyazo.com'
#CGI = '/upload.cgi'
HOST = 'gyazo-s3.herokuapp.com'
CGI = '/items'
```

## 注意点

`~/Library/Gyazo/id`でクライアントアプリとサーバが１:１対応になっています。
複数人での使用の際は、別途`~/Library/Gyazo-S3/id`みたいなものを作成し、そちらをクライアントアプリに参照させるか、別途専用のアプリを作成したほうがいいかもしれません。

ちなみに`~/Library/Gyazo/id`を書き換えてもOKです。

## 番外編

### S3のリージョン

ソースコード内でS3のリージョン指定が`ap-northeast-1`(東京)になっていたため、レイテンシを考慮し`us-east`に変更しました。
※ 既にプルリク済みのため対応は不要ですが、herokuでEUリージョンを使用の際はご注意下さい。

```ruby:~/gyazo-s3/config/environments/production.rb
-  Paperclip::Attachment.default_options[:s3_host_name] = 's3-ap-northeast-1.amazonaws.com'
+  Paperclip::Attachment.default_options[:s3_host_name] = 's3.amazonaws.com'
```

### Basic認証

[こちら](http://qiita.com/mattuso/items/5e2e8424a3d0c939eb11)に書きました。
IP制限等もこれで行けるはず。
Drupalのアップデート方法


### 1.バックアップをとる
インストールしているファイル一式とDBのバックアップをとります。
DBのバックアップには下記のモジュールを使うと簡単にとれます。

http://qiita.com/s_s_k/items/8ce56eaa2ad91725d8f1

### 2.オフラインモードに変更
環境設定のオフラインモードページに行き、オフラインモード設定を有効にします。

### 3.インストールしている、モジュール、テーマをデフォルトに変更
モジュールは何を使用しているか、別途記録するのがおすすめです。

### 4.新しいDrupalをインストール
Drupalのサイトから最新のDrupalファイルをダウンロードしておきます。
新しいバージョンのDrupalで上書きしますが、下記のファイル・ディレクトリは除外してください。

* .htaccess
* 拡張子が.txtのファイル(robots.txt含む)
* profilesディレクトリ
* scriptディレクトリ
* sitesディレクトリ

### 5.モジュールとテーマーを再度インストール、または有効化する。
moduleページ、themeページで設定します。

### 6.update.phpを実行
以下のURLにアクセスして、update.phpを実行します。
update.phpを実行するには、管理ユーザーでログインしている必要があります。

http://[DrupalサイトのURL]/update.php

### 7.オンラインモードに戻す。
環境設定のオフラインモードページに行き、チェックボックスを外して、保存してください。

以上でDrupalのアップデートは完了しました。
イントロダクション/ドメイン駆動設計とは何か？

## なぜドメイン駆動設計なのか
オブジェクト指向をエンタ ープライズ分野へどのように適用すればいいのかについてはっきりとした考え 方がありません。

DDDとは何なのかについ て正確な要約を試みたのがこの本です。

## イントロダクション

## ドメイン駆動設計とは何か
- ソフトウエアを開発する目的は、実世界の作業を自動化したり、ビジネス上の 問題を解決することです。
- 優れたソフトウエアを作るためには、そのソフトウエアが一体何なのか知らなければなりません。
- ドメインに対する十分な知識を持たずに、複雑な銀行業務システムを構築する ことは不可能。

## Q: では誰がドメインを知っているの？

### ソフトウェアアーキテクト
彼は自分のお金を安全に保管したり、必要なときに引き 出したりするために銀行を利用しているだけです。

### ソフトウエアアナリスト
彼は必要な材料をすべて与えられたときに、与えら れた案件について分析することができるだけです。

### 開発者
だめです。 (本には理由無し)

### 銀行員 (実際の利用者)
銀行業務システムは銀行の中で働 く人々や専門家がとてもよく理解しています。すべての細部、すべての落とし 穴、すべての潜在的な問題点、すべてのルールを知っているのです。

ドメインは自動化したい、ビジネス上の問題を解決したいと思っている実際の利用者しか知っていない。

## ドメインモデルとは
- ドメインモデルは、そういった知識を厳密に取捨選択しながら作成する抽象です。
- 対象のドメインをプロジェクトの関係者に向けて表現したもの。

### But
私たちを取り巻く世界をそのまま扱うと、頭に大変な負担がかかってしまいます。特定のドメインですら、ひとりの 人間の頭脳では一度に扱えません。

=> したがって、情報を整理し、システム化し、 より小さな部分に分割し、論理的な単位にまとめて、一度に扱えるようにする 必要があります。

「一番大切なのは私たちは一人で作業しないのでモデルを他人に伝えなければならない」

### 「ドメインの専門家」と「ソフトウェアの専門家」が共通で理解できるドメインモデルを作成する事が不可欠

###それを阻む「言語の壁」
- プログラムの言葉 クラス、継承、パターン
- 専門の言葉

 ### 意識の壁
- あたりまえだと思ってるもの
opensslコマンドでSSL証明書の有効期限を確認する


```
$ openssl s_client -connect example.com:443 < /dev/null 2> /dev/null | openssl x509 -text | grep Not
            Not Before: Sep 25 09:14:02 2014 GMT
            Not After : Oct 27 09:49:54 2017 GMT
```
Not Afterが有効期限
さっくと Itamae を試してみる

# Itamae とは
* Chef like なプロビジョニングツール
* Chef に比べて簡易
    * Chef でいうところの recipe さえあればよい


# 今回試した環境
* Vagrant で動作する Ubuntu 14.04
    * Box URL : https://vagrantcloud.com/ubuntu/boxes/trusty64

```bash
$ gem -v
1.8.23
```

# インストール

```bash
$ gem install itamae
$ gem list | grep itamae
itamae (1.0.2)
```


# 使い方

* recipe の作成

```rb:git.rb
package "git" do
  action :install
end
```

* recipe の実行

```bash
# git のバージョン確認
$ git --version
The program 'git' is currently not installed. To run 'git' please ask your administrator to install the package 'git'
# ローカル環境で Itamae 実行
$ sudo itamae local git.rb
 INFO : Starting Itamae...
 INFO : Recipe: /home/vagrant/Itamae/git.rb
 INFO :    package[git]
 INFO :       action: install
 INFO :          installed will change from 'false' to 'true'
# git のバージョン確認
$ git --version
git version 1.9.1
```

* 簡単！

# 参考
* https://github.com/ryotarai/itamae
* http://sssslide.com/speakerdeck.com/ryotarai/itamae-infra-as-code-xian-zhuang-que-ren-hui
DDDQ - モデル駆動設計 〜分析モデルからバリューオブジェクトまで〜

[親ページ](http://qiita.com/sa-wa-m@github/items/26228a0d8cddb7eba53a)

##モデル駆動設計
前章までで、ドメインの専門家とシステムの専門家によって、ドメインモデルとユビキタス言語が作られてきた。
次には、ソフトウェア開発者によって、ドメインモデルをコードに落としこんでいく。
しかし往々にしてドメインモデルをそのままコードで表現することは出来ず、その問題を解決するためにソフトウェア開発者による恣意的な実装が行われるようになり、最終的な実装とドメインモデルとは乖離してしまうものだ。
それが一概に悪いとは言えない。
問題とすべきなのは、それが性能テストに耐えられるか、拡張性があるか、保守性を持っているかだ。

###分析モデル
アナリストが業務ドメインから独自にモデルを作成する手法。

####メリット
* ドメインの知識がある程度確立できる
* よく分析された正確なモデルが出来る

####デメリット
* 実装を考慮していないため、ソフトウェア開発者はこれを元にさらに別のモデルを作成する必要がある（そしてその後分析モデルは捨てられ忘れられる）。
* アナリストが重要な細部を見落としている可能性がある
* アナリストだけで作成したモデルをソフトウェア開発者に受け渡すような作業フローだと、受け渡し時点で、モデルに記載の無いドメインに関する知識のヌケモレや、曖昧な表記による誤解を招く可能性がある。

所感：「オススメ出来る手法」と書いてある割にはボロクソ言われている。

###わーわーモデル（勝手に名前をつけました）
「分析モデル」のデメリットを補完するための手法。
####分析モデルとの違い
* ドメインの専門家、アナリスト、ソフトウェア開発者がみんなで集まってモデルを作る（全員がモデルの変更に責任を持つ）
* 出来る限り誤解を無くすため、ユビキタス言語を使う
* モデルとコードとの乖離を無くすため、OOPに基づいた言語で実装する（手続き型はクソ）

所感：なんかめっちゃ手間かかりそう。

###モデル駆動設計の基礎要素
####レイヤアーキテクチャ
以下のレイヤーに分けて実装しましょう。

* UIレイヤ（いわゆるView）
* アプリケーションレイヤ（ビジネス以外のロジック・オブジェクト）
* ドメインレイヤ（ビジネスロジック・ビジネスオブジェクト）
* インフラストラクチャレイヤ（DBとかファイルとか？）

所感：実例が欲しいナリ

####エンティティ
一意な参照性のあるオブジェクト。
例）Rails の ActiveRecord でユニーク制約のあるテーブルから1レコード分を取得し、そのインスタンスとなっているオブジェクト等。
取り扱うオブジェクトがエンティティかエンティティでないか、それが問題だ。

####バリューオブジェクト
一意にする必要のないオブジェクト。
なんでもかでもエンティティとして取り扱うのは、考える分には楽だが実行には一意性を確保するためのパフォーマンスコストがかかる。
バリューオブジェクトはその反面、好きなときに作って好きなときに破棄出来る。
このようなオブジェクトは再利用することが出来るが、その場合は単純に作成・削除で管理すべきであり、データを変更出来ないようにすべきだ。
また、バリューオブジェクトの持つデータは分散させずグルーピングすべきだ。
[Objective-C] キャレットの位置を調整


UITextViewなどでキャレット（カーソル）の位置を調整したい場合があります。
その際に利用するのは`UITextRange`と`UITextPosition`です。

`UITextRange`はテキストのレンジ（範囲）を表現するクラスです。
プレーンテキストだけであればそれほど問題は複雑ではありませんが、HTMLテキストなどを考えると、見た目の選択状態と内部的な選択状態に差が生じます。
（例えば、「テキスト」という4文字を選択していても、HTMLではタグが複雑になっていて、内部的には数文字から数十文字を選択している状態かもしれません）

## キャレットの位置を任意の場所に

キャレットを任意の位置に移動するには、`UITextView.selectedTextRange`に`UITextRange`を設定することで実現できます。

```objc
UITextRange    *range    = aTextView.selectedTextRange;
UITextPosition *position = [aTextView positionFromPosition:range.start
                                                    offset:-1]; // キャレットを現在の位置からひとつ後ろに移動する（-1）

aTextView.selectedTextRange = [aTextView textRangeFromPosition:position
                                                      toPosition:position];
```


## キャレットの位置を先頭に

```objc
aTextView.selectedTextRange = [aTextView textRangeFromPosition:textView.beginningOfDocument
                                                      toPosition:aTextView.beginningOfDocument];
```
[WebGL] バッファをGPUに送るまでの過程を覚えるコツ


WebGL（やOpenGL）は全体的に記述が冗長すぎてなにをどこでどうするか、というのを把握するのがとても大変です。
未だにしっかりとは覚えておらず、毎回悶々としてます。

が、色々考えていてなにかに例えて覚えたら覚えやすいかなーと思って考えてみました。
結論から言うと「メール」ですｗ


## メール？？

メールになにがしかの重めのファイルを添付して送るときを想像してください。
概ね、以下の手順で送信すると思います。

1. ファイルを準備する
* ファイルを圧縮する
* 圧縮したファイルを添付する
* 宛先を決める
* 送信

という手順です。

さて、これをWebGLに当てはめてみると、

1. 頂点データを準備する
* バッファオブジェクトにデータをまとめる（`gl.createBuffer`）
* 準備したバッファをバインドする（`gl.bindBuffer`）
* GPUへ送信する属性を有効化する（`gl.enableVertexAttribArray`）
* GPUへ送信する（`gl.vertexAttribPointer`）

## 基本は同じ？

基本的にWebGLでデータのやり取りをする場合は、このバインドとデータの送信という手順を繰り返します。
引数や関数名が違うだけなので、手順を覚えておくと記述が少しは楽になるかな、と思います。

にしても、やっぱりWebGLは記述が冗長だ( ;´Д`)
Drupalのバックアップモジュール


### DBのバックアップ用モジュール

下記ページから、モジュールをインストールします。
(インストル方法はこちら→ http://qiita.com/s_s_k/items/4ae744d8173b8f278626)

https://www.drupal.org/project/backup_migrate


### 設定画面でバックアップ
すぐにバックアップする場合は「Backup now」ボタンをクリックしまう。
Advance設定などで、定期的にバックアップをとることもできます。
[ActionScript][mx]スライダードラッグ中にツールチップのスタイルを更新する

### 解決したい課題

スライダーのツールチップのスタイルは、以下の用に適用できる。

```as3
<fx:Style>
  .myDataTipStyle { ... }
</fx:Style>

mx.controls.HSlider(slider).dataTipStyleName = "myDataTipStyle";
```

しかし、スライダーのつまみをドラッグ中に上記スタイルを変更しても、ツールチップのスタイルは変更されない。

```as3
HSlider(event.currentTarget).dataTipStyleName = "otherStyle";
```

### 解決策

ドラッグイベントをハンドルして、直接ツールチップオブジェクトにスタイルを適用する。
サンプル：

```as3
slider.addEventListener(SliderEvent.THUMB_DRAG, function(event:SliderEvent):void
{
  var toolTips:IChildList = HSlider(event.currentTarget).systemManager.toolTipChildren;
  var datatip:SliderDataTip = toolTips.getChildAt(0) as SliderDataTip;
  datatip.styleName = "otherStyle";
}
```

### 補足

mx.controls.sliderClasses.Sliderの[実装](https://git-wip-us.apache.org/repos/asf/flex-sdk/repo?p=flex-sdk.git;a=blob;f=frameworks/projects/mx/src/mx/controls/sliderClasses/Slider.as;h=c621781fc6e6ef87372f7632246bb6f10c4047cd;hb=HEAD)をみると解るように、ツールチップオブジェクトの生存期間は、つまみを押下（onThumbPress）してリリース（onThumbRelease）するまで。
ドラッグ中にテキスト等を[更新](https://git-wip-us.apache.org/repos/asf/flex-sdk/repo?p=flex-sdk.git;a=blob;f=frameworks/projects/mx/src/mx/controls/sliderClasses/Slider.as;h=c621781fc6e6ef87372f7632246bb6f10c4047cd;hb=HEAD#l2371)しているが、Sliderに登録（dataTipStyleName）したスタイルが渡されていない。初期化時（onThumbPress）のみ。
従って、いくらSliderに対してツールチップのスタイルを更新しても更新されない結果となる。

（※sparkの方を使え、というのは無しで）
OS X Yosemite インストール失敗の後日談

# ■ スペック
* MacBook Pro(2011)
* OS X Marvericks -> OS X Yosemite
* McAfee なし
* Homebrew 導入，デフォルトシェルを zsh に変更

# ■ ダウンロードからインストールまでの経過
* Mac App Store からダウンロード。
* ADSL 回線のため一晩かかる。
* 翌朝，インストーラ起動。インストール開始。
* 残り時間 21 分と表示されたところで「インストールに失敗しました。再起動してやり直してください」の表示。
* 以後，繰り返し。

# ■ 対応と復旧
以下，対応作業と復旧作業のあらましです。

## ● まずは電源を落としてみた
とりあえず電源を入れなおしてみることに。

* 電源を強制的に落としたら MBP が起動しなくなった。
* 正確には起動途中で電源が落ちる感じ。

## ● 調査
ネットで調べてみると，McAfee が入っていることでインストールが止まるという事象があることが判明。

* 意図的に McAfee を入れたつもりはない。
* セーフモードで起動を試みるも，セーフモードですら起動しない。

## ● ディスクのチェック
あきらめてディスクの修復 ＆ 復元を試みることにした。

* 電源 ON 時に option キーを押しておく。
* 起動ディスク選択の画面で「復旧」を選択。
* ディスクユーティリティでチェックなど開始。

### ★ディスクユーティリティの結果
* ディスクの検証 -> 失敗
* ディスクの修復 -> 失敗
* ディスクの復元 -> 失敗

なにをやってもダメな状態に。

## ● 復旧作業
### ★パーティションの削除
仕方ないので Marvericks の入っていたパーティションを削除。

### ★TimeMachine からの復元
自動バックアップの TimeMachine から削除したパーティションに復元を実行する。ディスクユーティリティのウィザードに従えば簡単にできる。4 時間ほどかかったが，無事 Marvericks に戻った。

# ■ 再調査
ネットで最初に調べたときの McAfee 疑惑は自分の MBP には当てはまらないことを知り，再度調査を行うことに。ネットの情報を見る限りだと成功している人が多いので，何か環境面で問題があることは疑いない。

## ● Homebrew の疑惑
Yosemite のインストール時のトラブルを調べてみると，「/usr/local が云々...」という情報が以外に多い。それらの記事を読んでみると，どうやら OS X のデフォルトのログインシェルを bash から zsh に変えたときに入れたパッケージ管理ソフトの Homebrew が入っていると，インストールが長時間化するという事象があるらしい。

### ★その原因は何か
詳細はググッた記事が詳しいので割愛するが，Homebrew でもっている /usr/local 配下のものを Yosemite インストーラが移動させる際に長時間がかかるそうだ。一説には 8 時間という話もある。

### ★しかし，正常には終わるようだ
だが，実際には「長時間かかる」だけでインストールそのものは正常に終わるそうだ。それらの記事でも無理に対処はせずに時間をかけてインストールすることを推奨していた。

# ■ 結論
しかしながら，他に手がかりは無いので Homebrew を疑ってかかってみることにする。まずやったことは次の通りだ。

* デフォルトのログインシェルを zsh -> bash に戻す。
* Homebrew を削除する。

それぞれの手順は各自調べて欲しい。詳しい情報がたくさん公開されている。

## ● 再挑戦
ダウンロード済みの Yosemite インストーラで再びインストール開始。今度は正常にインストール処理が終了し，無事に Yosemite 環境とすることができた。
FreeBSDでowncloud

インストール

`pkg install owncloud apache24 mod_php5`

シンボリックリンクを張る

`ln -s /usr/local/www/owncloud /usr/local/www/apache24/data/owncloud`

最低限の設定

```httpd.conf
AddType application/x-httpd-php .php

<Directory /usr/local/www/apache24/data/owncloud>
  AllowOverride All
</Directory>
```

とりあえず動かすだけなので、まともに運用するなら下記は必須

* HTTPS化
* DBを変更
[jQuery] ページ内リンクの移動に、スクロールのエフェクトをかける方法

# ページ内リンクをもう少しそれっぽくしたい

ただページ内リンクをするだけだと、瞬間移動している様で感じが悪い。
ページ内を移動している感を出したい。

# 実装

## html

アンカーポイントにリンクを貼るだけです。
移動させたい先の、id名に#を付けてhref=に指定するだけ。

```html
<a href="#hoge">下へ移動</a>
```

## jQuery

まずはjQueryを呼び出す。

```js
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/{version}/jquery.min.js"></script>
```

次にスクリプトを記載。

```js
$(function(){
    $('a[href^=#]').click(function(){ 
        var speed = 500; //移動完了までの時間(sec)を指定
        var href= $(this).attr("href"); 
        var target = $(href == "#" || href == "" ? 'html' : href);
        var position = target.offset().top;
        $("html, body").animate({scrollTop:position}, speed, "swing");
        return false;
    });
});
```

これだけでなんとか出来ました。

# 参考

http://klutche.org/archives/536/
/etc/default/zfsにZFS_MOUNT=yesと書いてもUbuntu起動時にZFSボリュームが自動mountされない場合

あなたのシステムは既にUpstartベースで起動しているのでしょう

https://github.com/zfsonlinux/pkg-zfs/wiki/Ubuntu-ZFS-mountall-FAQ-and-troubleshooting

ここの1.3.2 Ubuntu 14.10 (Utopic Unicorn) in testing.の通りに行えば自動mountされます

もっと具体的に
------------

要するに `/etc/init/zpool-import.conf` の `zfs_autoimport_disable ` を0にすればいいのです

### ワンライナー ###

```sed:
$ sudo sed -i .bak 's/^\(.modprobe zfs zfs_autoimport_disable=\).$/\10/' /etc/init/zpool-import.conf
```

あとがき
-------

なんというか、カオス＜init系
[Rails 4.x] ViewからController名やAction名を参照する方法

# View(erb)からController名を参照する

```erb
<%= controller.controller_name %>
```

# View(erb)からAction名を参照する

```erb
<%= controller.action_name %>
```

# ついでに
## Controllerから取得する

```rb
controller_name = controller_name  # コントローラ名
action_name = action_name  # アクション名
```


# 参考

http://rails3try.blogspot.jp/2011/06/rails3-viewcontrolleraction.html