OmniAICreator/Qiita-1.07M huggingface dataset:
18時間ぶっ通し、PHPブートキャンプ！に参加してきた(備忘録)


## きっかけ
[PHPブートキャンプ！ in 表参道][1]
これを見たのがきっかけで本日朝9時までPHPを書き続けていました。

## 内容
いつもは、(Web)デザインの学校を運営されている、
[マーズナレッジ株式会社][2] の佐々木多生さんが講師で、30名規模の勉強会でした。

(~~実は新卒で入った金融会社の、とっても恐い債権回収部門の部長に似ていたのは内緒w~~)

8時間：PHPリファレンスを熟読！
8時間：ひたすらPHPコードを書いてCMSを完成させる！！

>【決まり事】

>- データベースを使用する
>- フレームワーク使用禁止
>- ネットからのコピペ禁止
>- 設計も含める
>- Webアプリケーションに必要な最低限のセキュリティ対策は行う
>- 期限：5/11 午前8時まで

以上。

あとは参加された皆様とワイワイしながらひたすらコードを書く。
はい、簡単ですがこれだけです。

## 感想
いやー、設計はすぐに思いつくんですが、実装ができない。
圧倒的な知識の欠如。分かっていたことですが、今回それが具体的になったのが一番の収穫です。

先日Qiitaに投稿した[Vagrantを1.5系に上げたら色々追加されていたので確認する][3]
もそれなりに使い続けて、改めてリファレンスを見直して理解が出来た状態なので、
継続することが一番大切だと学びました。


## 最優秀賞の作品
~~許可取ってから記載しようと思います。~~

作者の方から了解を頂いたので、ご紹介。
Githubレポジトリ:[PHPブートキャンプで作ったCMS][4]/[デモサイト][5]

## これから
取り敢えず、以下の設計を実装できるよう継続していきたいと思います。

1. メディア管理配信サービス

	```
	* 管理ページ
		- ログイン(ID / PASS)
		- viewページ
			- メディアのアップロード
			- 紹介ページの投稿
				- 音声の場合、audio
				- 動画の場合、player
	* フロントページ
		- メディアの公開
```

2. ファイル管理システム

	```
	* 管理ページ
		- ログイン(ID/PASS)
		- ファイル検索
```

3. 日付指定で、PHPとMySQLを使ってTwitterに投稿するサービス
Qiitaに投稿している[日付指定で、GASからTwitterに投稿するスクリプトを作ってみた][5]のMySQLバージョン

[1]: http://atnd.org/events/50183
[2]: http://themarsknowledge.com/
[3]: http://qiita.com/AH_korikori/items/d92897ad76ce80832b6b
[4]: https://github.com/90zbear/18hPHP
[5]: http://18hphp.90zbear.com/
[6]: http://qiita.com/AH_korikori/items/0e0252c805ca1ab8faea
Jinja2｜Pythonテンプレートエンジン

**Pythonでのテンプレートエンジンについて調べたのでメモ。**

* Mako、Genshi、Jinja2 など色々ある（なぜか日本名が多い）
* フレームワークとしては Bottle が軽量で良さげ
* これぞ決定版！的なものはないけど Jinja2 が簡単で分かりやすそう

というわけで Jinja2 を試してみた。
名前の由来は、テンプレート ⇒ テンプル ⇒ 神社、との事。‥なるほど。

## ![](//goo.gl/78mjX8)１）インストール

環境はさくらVPS（CentOS）

```
yum install python-pip（まだ pip が無い場合のみ）
pip install jinja2
```

## ![](//goo.gl/78mjX8)２）Apache 設定（まだの人だけ）

Python が CGI として動くように Apache を設定します。

```
vi /etc/httpd/conf/httpd.conf
```

viエディター等で、httpd.confの下記２ヶ所を変更します。

```:httpd.conf
１）
<Directory "/var/www/html">
    Options Indexes FollowSymLinks
    　↓　ExecCGI を追加
    Options Indexes FollowSymLinks ExecCGI
</Directory>

２）
#AddHandler cgi-script .cgi
　↓ コメントを外し、.py 追加
AddHandler cgi-script .cgi .py
```

設定保存後、Apache 再起動。

```
service httpd restart
```

## ![](//goo.gl/78mjX8)３）テンプレート

```html:hello.tpl.html（UTF-8）
<html>
<body>
ようこそ、{{ shop }}です。
<hr>
<ul>
{% for food in foods %}
    <li>{{ loop.index }}: {{ food.name }} － {{ food.price }}円</li>
{% endfor %}
</ul>
</body>
</html>
```

## ![](//goo.gl/78mjX8)４）フロント側（テンプレートを呼び出す側）

PythonソースファイルはすべてUTF-8で記述し、アップロード後のパーミッションは755（実行権限を与える）。また、HTMLを出力する前に下記の出力が必要。（忘れると即エラー）

```
print "Content-Type: text/html\n";
```

```py:hello.py（UTF-8）
#!/usr/bin/python
# -*- coding: utf-8 -*-
from jinja2 import Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('./', encoding='utf8'))
tpl = env.get_template('hello.tpl.html')

foods = []
foods.append({'name':u'ラーメン', 'price':400})
foods.append({'name':u'焼き飯',   'price':500})
foods.append({'name':u'天津飯',   'price':600})

html = tpl.render({'shop':u'悟空軒', 'foods':foods})
print 'Content-Type: text/html; charset=utf-8\n'
print html.encode('utf-8')
```

あとは、ブラウザから hello.py にアクセスして確認。

(･o･ゞ いじょー。

## ![](//goo.gl/78mjX8) 参考リンク

jinja2｜it-note 1.0 ドキュメント
<a href="http://maman-it-information.readthedocs.org/ja/latest/src/python/jinja2/jinja2.html" target="_blank">http://maman-it-information.readthedocs.org/ja/latest/src/python/jinja2/jinja2.html</a>

Python 公式ドキュメント（英語）
<a href="http://jinja.pocoo.org/docs/dev/" target="_blank">http://jinja.pocoo.org/docs/dev/</a>

<!--
Jinja2 ドキュメント日本語訳
http://ymotongpoo.appspot.com/jinja2_ja/index.html

Jinja2 利用ノート
http://www.geocities.jp/showa_yojyo/note/python-jinja2.html
-->
流行りにのるために Vagrant で用意した ubuntu に Docker を導入してみた

# 目的

* 今回は Docker を触ってみるという目的のための投稿です。
* とても有意義なことができるようになるわけではありません。

* Ubuntu で動かすのがおすすめのようなので、 Vagrant で用意します。
    * 仮想マシンの上で仮想マシンを動かすというよくわからない感じになりますが。。

* Docker とは何か。他のツールとの違いは？というのは [こちら](http://qiita.com/kasaharu/items/59b8d3a76b4a22eab88e) でまとめています。

# Vagrant で Ubuntu 用意

* Vagrant での仮想マシンの用意は[ここ](http://qiita.com/kasaharu/items/5270f6d9737e7bd9b917)でもまとめているが、せっかくなので Ubuntu 14.04 を使用する

```bash
# Ubuntu 14.04 の Box を取得
$ box add ubuntu1404 http://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box
# 初期化
$ vagrant init ubuntu1404
# Vagrantfile の config.vm.network のコメントを外した後、仮想マシンを起動
$ vagrant up
# 仮想マシンにログイン
$ vagrant ssh
```

# Docker インストール手順

* ここからはすべて Vagrant で用意した仮想マシン上で操作

* [Install Page for Ubuntu 14.04](http://docs.docker.io/installation/ubuntulinux/#ubuntu-trusty-1404-lts-64-bit) を参考におこなっている

```bash
$ sudo apt-get update
$ sudo apt-get install docker.io
$ sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker
```

## インストール後にバージョン確認

```bash
$ docker -v
Docker version 0.9.1, build 3600720
```

# Docker image の取得から登録まで
## Docker 上で動かす OS (イメージ) の取得
* docker image を [docker index](https://index.docker.io/) から取得

```bash
# docker index の表示
$ sudo docker search ubuntu
# 任意のイメージを取得
$ sudo docker pull ubuntu
# 取得したイメージの確認
$ sudo docker images
# 任意のイメージ詳細情報表示
$ sudo docker inspect REPOGITORY:TAG
# 任意のイメージ削除
$ sudo docker rmi REPOGITORY:TAG
```

* 今回 REPOGITORY:TAG となっている箇所はすべて、 ubuntu:latest で作業する

## 取得したイメージの実行
* コンテナの作成

```bash
# コンテナの作成
$ sudo docker run REPOGITORY:TAG echo "Hello, Docker"

Hello, Docker
# 作成したコンテナの表示
$ sudo docker ps -a
# コンテナの削除
$ sudo docker rm CONTAINER_ID
```

## イメージを作成する
* 自分でカスタマイズした状態のイメージ作成

```bash
# docker コンテナ内で作業用意
$ sudo docker run -i -t REPOGITORY:TAG /bin/bash
# vim をインストールする
root@xxxxxxxxxxxx:# sudo apt-get install vim
# docker コンテナからぬける
root@xxxxxxxxxxxx:# exit
# 作成したコンテナの確認
$ sudo docker ps -a
# コンテナのイメージを作成する
$ sudo docker commit CONTAINER_ID IMAGE_NAME(username/vim)
# 作成したイメージの確認 (username/vim という REPOGITORY があることを確認する)
$ sudo docker images
# 作成したイメージを元にコンテナを作成
$ sudo docker run -i -t username/vim:latest /bin/bash
# vim が起動できれば OK
```

## Docker index への登録
* カスタムイメージを docker index に登録
* 事前に Docker のアカウントを取得しておく必要あり
    * 必要に応じて取得 : https://www.docker.io/

```bash
# Docker へのログイン
$ sudo docker login
# 任意のイメージを push する
$ sudo docker push username/vim
```

# Dockerfile の使用
* Dockerfile は環境構築の手順を記載できる
* Dockerfile を作ることで、イメージの取得から新たなイメージの作成までを build コマンドで行えるようになる

``` :Dockerfile
# Base Image の取得
FROM ubuntu:latest
# Author 情報を記載(必須ではない)
MAINTAINER kasaharu
# build 時に実行すること
RUN apt-get install -y vim
# コンテナを実行した時のコマンド
CMD ["echo", "running!"]
```

* Dockerfile の実行
    * 作られるイメージの REPOGITORY 名と TAG 名を指定できる

```bash
# REPOGITORY 名と TAG 名を指定して build を実行
$ sudo docker build -t REPOGITORY:TAG .
# イメージ一覧の表示(FROM で指定したイメージと build 時に指定したイメージがあれば OK)
$ sudo docker images
# 今作られたイメージからコンテナを作成(CMD で指定したコマンドが実行される)
$ sudo docker run REPOGITORY:TAG
```

# 参考
* [公式ページ](https://www.docker.io/)
* Docker 入門 ~IMMUTABLE INFRASTRUCTURE を実現する~
MacPortsでPEARをインストールした後にすること

MacPortsでPEARをインストールした後にすること

パスの設定
```shell-session:~/.profile
export PATH=/opt/local/lib/php/pear/bin:/opt/local/bin:/opt/local/sbin:$PATH
```

下記を実行。なんか標準だと、pearでインストールすると、/usr/local/lib/php/pearに入ってしまうので。

/opt/local/lib/php/pear/bin/pear config-create /opt/local/lib/php ~/.pearrc
『Linuxエンジニア養成読本』初版と2版の違い

ざっと見た印象ですが。

 * 初版 http://gihyo.jp/book/2011/978-4-7741-4601-0#toc
 * 二版 http://gihyo.jp/book/2014/978-4-7741-6377-2#toc

初版にMeeGoの記事が入っていますが二版からは消えてます。MeeGo記事が入っていてLinuxの最大派閥でもあるAndroidの ~~言及はないです~~。まぁ普通の人はLinuxとして使わないからね。

修正。言及ありました (二版 p41)

AndroidではSELinuxが有効になったんだよ、とか、こういう本でさっくり説明する人がいると、エンジニアとしても色々辺縁系の愉しみが増える気がします。

ディストリビューションの「存在感」という意味で言うと、仕事で見るのはCentOSが割と多くて、Debian/Ubuntuの「存在感」については本当かのぅ、と思ったんですが、GoogleトレンドではUbuntuが圧倒的なので正しいサブタイトルでした。

参考: http://www.utano.jp/entry/2014/03/linux_distribution_trend

＃ 日本に限るとCentOSのマスがUbuntuの半分弱とやや増加するようです。何故でしょうか。

すでに14.04 LTSが出ているUbuntuですが、二版の内容は13.10基準のようです。ちょっと食い足りないですが、これは出版のタイミング考えると仕方ありません。LTSの説明と4月リリース予定の14.04LTSという説明はもちろんあります。

初版ではsysvinitをupstartに変えてみるというCentOS 5の記事があります。この部分は2版では削除されています。ただ、この流れなら収録していて欲しい、RHEL 7/ CentOS 7系で採用が予定されているsystemdについては ~~言及自体がありません。私自身が最近調べ始めたというレベルで過剰に意識しすぎでしょうか。~~ 失礼。「ブートローダの最新動向」に言及はありました。

初版ではbtrfsaという名前が目次で出ていて「ファッ！？」と思ったんですがただのタイポで、本文ではbtrfsとなってます。ファイルシステムの章は後続の章で言及される「ZFS」や「ハイエンドストレージ」といった概念について、前段の章では説明がないなど、教本としては食い足りない感じが少々します。これは初版から代わりがありません。

以上のように色々書きますが、基本的な入門記事について言えば目につく変更はありませんので、リアルタイムにLinuxを追っている方的には、初版にさらに2版を買い重ねるメリットはあまりないと思いました。

最近この辺りを偶然復習してたのでメモ的に書きました。おじゃましました。
EFIにArchLinuxインストール (LivaPC)

電源投入後、F7キーでBootデバイス一覧を表示させ、USBメモリから
Ubuntu14.04ja 64bit版をインストール。

しかし結構もっさりしているのでArchLinuxをインストールすることにした。

* PC: [LivaPC](http://pc.watch.impress.co.jp/docs/column/nishikawa/20140331_641997.html)
  * [ECS - LIVA MINI PC KIT](http://www.ecsjpn.co.jp/liva/index.htm)

[参考:自作PCにArch linuxをインストール | Cocoa-tipsを見てちょ!](http://cocoa-tips.com/?p=119)
[ArchLinux iso download](http://ftp.jaist.ac.jp/pub/Linux/ArchLinux/iso/latest/)

[昔インストールした時の覚書](http://qiita.com/tukiyo3/items/48fb3b4b41642743d581)

パーティショニング
===================


```bash:
# gdisk /dev/mmcblk0
```

```bash:
# gdisk -l /dev/mmcblk0
GPT fdisk (gdisk) version 0.8.10

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.
Disk /dev/mmcblk0: 61071360 sectors, 29.1 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 34830398-0F24-4608-A665-3F260E52A964
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 61071326
Partitions will be aligned on 2048-sector boundaries
Total free space is 2014 sectors (1007.0 KiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048          206847   100.0 MiB   EF00  efi
   2          206846         4913151   2.0 GiB     8200  swap
   3         4913152        61071326   26.8 GiB    8300  /
```

```bash:
mkfs.vfat -F32 /dev/mmcblk0p1
mkswap /dev/mmcblk0p2
mkfs.xfs /dev/mmcblk0p3
```

mount
======

```bash:
mount /dev/mmcblk0p3 /mnt
mkdir -p /mnt/boot/efi
mount /dev/mmcblk0p1 /mnt/boot/efi
```

pacman
======

```bash:/etc/pacman.d/mirrorlist
Server = http://ftp.tsukuba.wide.ad.jp/Linux/archlinux/$repo/os/$arch
```

```bash:
pacstrap -i /mnt base base-devel vim openssh grub efibootmgr os-prober
# pacstrapは5分ほどかかる。
genfstab -U -p /mnt >> /mnt/etc/fstab
arch-chroot /mnt /bin/bash
```

chroot環境
---------

* [ArchLinuxをインストール (EFI) - Qiita](http://qiita.com/tukiyo3/items/5b66da8febd9c2535629)

```bash:chroot環境
vim /etc/locale.gen
# en_US.UTF-8とja_JP.UTF-8のコメントアウトを外す
echo LANG=ja_JP.UTF-8 > /etc/locale.conf
locale-gen
```

```bash:
echo KEYMAP=jp106 > /etc/vconsole.conf
```

```bash:
ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
hwclock --systohc --utc
echo Arch >  /etc/hostname
```

```bash:sshdを最初から有効
systemctl enable sshd
mkinitcpio -p linux
passwd
```

```bash:EFIbootできるようにする
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=arch_grub --recheck
grub-mkconfig -o /boot/grub/grub.cfg
```

## ネットワーク設定

```bash:
pacman -S netctl ifenslave
echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/99-sysctl.conf
```

* [ArchLinuxでネットワーク設定 (ブリッジ、bonding) - Qiita](http://qiita.com/tukiyo3/items/08c8b0180eae29055736)

# インストーラを終了する

```bash:
exit
umount -a
reboot
```

# OS起動後

```bash:一般ユーザ作成
useradd -m owner
passwd owner
visudo
```
linuxでもenthumble

Linuxでもenthumbleを使いたかったので、xmodmapの設定ファイルを書いてみた。
適宜、自分の使いたい設定をコメントアウトして、ファイルをホームディレクトリに置いて、
~/.xprofileなどに"xmodmap ~/.Xmodmap"と追記するだけ。

## .Xmodmap
```
keycode 102 = Mode_switch 

! Enter Esc
keycode 65 = space NoSymbol Return Return
keycode 100 = Henkan_Mode NoSymbol Escape Escape

! WASD
keycode 25 = w W Up Up
keycode 38 = a A Left Left
keycode 39 = s S Down Down
keycode 40 = d D Right Right

! HJKL
!keycode 43 = h H Left Left
!keycode 44 = j J Down Down
!keycode 45 = k K Up Up
!keycode 46 = l L Right Right

! IJKL
!keycode 31 = i I Up Up
!keycode 44 = j J Left Left
!keycode 45 = k K Down Down
!keycode 46 = l L Right Right

! FBNP
!keycode 41 = f F Right Right
!keycode 56 = b B Left Left
!keycode 57 = n N Down Down
!keycode 33 = p P Up Up
```
MySQLをstartしたら[ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't existがでたとき

ちょっとだけ詰まったのでメモ



MySQLのの起動に失敗し、こんな感じのエラーが出た時↓
`[ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist`

データベースディレクトリがどこだかわからない状態になっているみたいです。

` mysql_install_db --datadir=/var/lib/mysql --user=mysql`
してから
`/etc/rc.d/init.d/mysqld start`
startしたら治りました



↓参考にさせていただきました
CentOS5.6にMySQL5.5をインストールする
http://infoscoopjp.wordpress.com/2012/04/18/mysql5-5/
mbedのスタートアップ処理（まとめ）

やっとスタートアップ処理がなんとなく分かってきたようなのでまとめました。

http://nora66.com/mbed/mbed-src.html#2014/05/09startup

まだまだ間違いがあると思うんで、気がついたら修正します。
MediaWikiフォーマットのテキストをHTMLに変換する


MediaWikiフォーマットのテキストをHTMLに変換する。MediaWikiフォーマットのParserは色々ありますが、今回はMediaWikiに含まれるオリジナルのParserを使って変換します。

## MediaWikiのインストール

MediaWikiの最新バージョンを拾ってきて適当に設置。

http://www.mediawiki.org/wiki/Download/ja

```Terminal
$ wget http://releases.wikimedia.org/mediawiki/1.22/mediawiki-1.22.6.tar.gz
$ tar zxvf mediawiki-1.22.6.tar.gz
```

### 設定ファイルの作成

インストールスクリプトを使って、設定ファイルとデータベースを生成します。データベースは、このためだけにMySQLやPostgreSQLを準備するのは面倒なので、SQLiteを使用。

```Terminal
$ cd mediawiki-1.22.6
$ php maintenance/install.php wikiname adminname --pass=password --dbtype=sqlite --dbpath=./
```

## 方法1: parse.phpを使って変換

maintenanceディレクトリに含まれるparse.phpをコマンドラインから叩いて、MediaWikiフォーマットのテキストをHTMLに変換することができます。

サンプル：

```Terminal
$ php maintenance/parse.php --title foo
''[[foo]]''^D
<p><i><strong class="selflink">foo</strong></i>
</p>$
```

```Terminal
$ echo "'''bold'''" > /tmp/foo.txt
$ php maintenance/parse.php /tmp/foo.txt
<p><b>bold</b>
</p>$
```

```Terminal
$ cat /tmp/foo | php maintenance/parse.php
<p><b>bold</b>
</p>$
```

## 方法2: PHPスクリプトファイルからParserクラスを呼び出して変換

Parserクラスをスクリプトファイルから直接呼び出して変換することもできる。こちらのほうが細かい制御が出来そう。

https://www.mediawiki.org/wiki/Manual:Parser.php

サンプルスクリプト

```wiki2html.php
<?php

include_once('maintenance/commandLine.inc');

$parser = new Parser();
$output = $parser->parse(
  "this is a ''sample''",
  Title::newFromText('title'),
  new ParserOptions()
);

echo $output->getText();
```

実行

```Terminal
$ php wiki2html.php
<p>this is a <i>sample</i>
</p>$
```
Node.js/Express4でのシンプルなファイルのアップロード

# はじめに

大体、[Node.js/Expressでのシンプルなファイルのアップロード](http://qiita.com/weed/items/55390c60ba4a1d1fe5cd)の記事でOK

# express4固有の対応

## expressコマンドがない

[Express 4 をはじめよう](http://qiita.com/hoshi-takanori/items/2128a6cf1dbb533379a2)でこれを知りました。記事にある通り、「express-generator」を入れることで、expressコマンドが使えます。

```
npm install -g express-generator
```
## expressコマンドでひな形の作成

```bash
express upload
$ cd upload
$ npm install
$ mkdir uploads
```
## bodyParser
bodyParserがJSONのみ対象になったので、[expressjs/multer](https://github.com/expressjs/multer)を使った。

```bash
npm install --save multer
```

```js
app.use(multer({ dest: './uploads/'}))
```
# アップロードファイルの処理

元記事のnameだとmulterだと一時ファイル名だったので、originalnameに変更

```js:upload.js
var fs;

fs = require('fs');

exports.post = function(req, res) {
  var target_path, tmp_path;
  console.dir(req.files);
  tmp_path = req.files.thumbnail.path;
  target_path = './uploads/' + req.files.thumbnail.originalname;
  fs.rename(tmp_path, target_path, function(err) {
    if (err) {
      throw err;
    }
    fs.unlink(tmp_path, function() {
      if (err) {
        throw err;
      }
      res.send('File uploaded to: ' + target_path + ' - ' + req.files.thumbnail.size + ' bytes');
    });
  });
};
```


# まとめ

bodyParserがイマイチ理解できてない状態で書いてますorz。
upload.jsでの処理は、multerではapp.useの中に書くことも出来る模様。
3で割り切れる2進数を表す正規表現


[Lingrの「じょうほうかがく！」部屋](http://lingr.com/room/computer_science/archives/2014/05/10#message-18988087)で「3で割り切れる2進数を表す正規表現」が話題になって解いてみたので備忘録として記事にします。
※ この部屋はパスワード必須なので知っている方しか入れません。

「3で割り切れる2進数を表す正規表現」の解は以下のようになりました。

```js
^(0*(
| 1 (00|11)* 01 (00|11)* 01
| 1 (00|11)* 01 (00|11)* 10 (00|11)* 10
| 1 (00|11)* 01 (00|11)* 10 (00|11)* 01 (00|11)* 01
| 1 (00|11)* 10
|01 (00|11)* 01 (00|11)* 01
|01 (00|11)* 01 (00|11)* 10 (00|11)* 10
|01 (00|11)* 01 (00|11)* 10 (00|11)* 01 (00|11)* 01
|01 (00|11)* 10
|10 (00|11)* 01
|10 (00|11)* 10 (00|11)* 01 (00|11) * 01
|10 (00|11)* 10 (00|11)* 10
|11
))\+$
```

この解を導くまでの考え方を簡単に説明すると、

1. 2進数文字列を左から2桁ずつに区切って、その合計が3の倍数になるのはもとの数字も3の倍数。
2. 2進数2桁（00,01,10,11）を0個以上足して3の倍数になる最小限のパターンはいくつあるか。
    * 01 01 01
    * 01 01 10 10
    * 01 01 10 01 01
    * 01 10
    * 10 01
    * 10 10 01 01
    * 10 10 10
    * 11
3. 2.の個々のパターンの間に 00 もしくは 11 が0個以上入っても問題ない。
4. 先頭の0が0個以上あるケースとないケース。

以上




以下、これをJavaScriptで検証してみた結果。

```js
var reg = '^(0*(|1(00|11)*01(00|11)*01|1(00|11)*01(00|11)*10(00|11)*10|1(00|11)*01(00|11)*10(00|11)*01(00|11)*01|1(00|11)*10|01(00|11)*01(00|11)*01|01(00|11)*01(00|11)*10(00|11)*10|01(00|11)*01(00|11)*10(00|11)*01(00|11)*01|01(00|11)*10|10(00|11)*01|10(00|11)*10(00|11)*01(00|11)*01|10(00|11)*10(00|11)*10|11))\+$';
for(var i=0;i<100;i++){
  var n = (new Array(10 - i.toString(2).length)).join('0') + i.toString(2);
  if(n.match(reg)){
    console.log(n + ":" + i);
  }
}

// 000000000:0
// 000000011:3
// 000000110:6
// 000001001:9
// 000001100:12
// 000001111:15
// 000010010:18
// 000010101:21
// 000011000:24
// 000011011:27
// 000011110:30
// 000100001:33
// 000100100:36
// 000100111:39
// 000101010:42
// 000101101:45
// 000110000:48
// 000110011:51
// 000110110:54
// 000111001:57
// 000111100:60
// 000111111:63
// 001000010:66
// 001000101:69
// 001001000:72
// 001001011:75
// 001001110:78
// 001010001:81
// 001010100:84
// 001010111:87
// 001011010:90
// 001011101:93
// 001100000:96
// 001100011:99   
```
UiAutomatorを使用しての多段swipeの実現

## 目的
- Pattern LockをAndroid Debug Bridge上から解除する
- Pattern Lockってこんなやつね　→　[Google画像検索](https://www.google.co.jp/search?q=PatternLock&es_sm=122&qscrl=1&tbm=isch&tbo=u&source=univ&sa=X&ei=VGhuU4nDH4T88QWn94KQAg&ved=0CCoQsAQ&biw=1262&bih=793)

## 問題点
- Android Debug Bridge(adb)にはswipeの機能が一応組み込まれているのだが，2点しか選択できないため複雑なswipe操作ができない．

``` $
adb -s <Device ID> shell input swipe x1 y1 x2 y2 
```

## 解決案
- [UiAutomator](http://developer.android.com/tools/help/uiautomator/index.html)を使用すれば多段Swipeができそうじゃないか？と[API](http://developer.android.com/tools/help/uiautomator/UiDevice.html#swipe(android.graphics.Point[], int))見てて気づく．
- 実際実行してみる → できたー！ってなった．

## 実装
- UiAutomatorのプロジェクトの作り方などは他に譲るとして．

```UiAutomator.java
public void swipe(){
    Bundle args = this.getParams();
    String x_str = args.getString("x");
    String y_str = args.getString("y");
    StringTokenizer x = new StringTokenizer(x_str, ",");
    StringTokenizer y = new StringTokenizer(y_str, ",");
    assertTrue(x.countTokens() == y.countTokens());
    Point[] point = new Point[x.countTokens()];
    int i = 0;
    while(x.hasMoreTokens()){
        point[i] = new Point(
            Integer.parseInt(x.nextToken()), Integer.parseInt(y.nextToken()));
        i++;
    }
    getUiDevice().swipe(point, 10);
}
```
- 多段Swipeを一度の動作で行うため，今回はx座標，y座標をStringとして投げている．投げる値の例は”100,200,300”みたいな感じ．
- その値をStringTokenizerで切り出し，配列作ってぶち込んでUiDeviceクラスのswipeメソッドに投げている．

## 実行
- 実行については，まずUiAutomatorのプロジェクトで作成したjarファイルを対象のAndroid端末にpushします

``` $
adb -s <Device ID> shell push <Project名>.jar /data/local/tmp
```
- その後，テストをmethod単位で走らせます．

``` $
adb -s <Device ID> shell uiautomator runtest <Project名>.jar -c <Package名>.<Class名>#swipe -e "x" "100,200,300" -e "y" "400,500,400"
```

## 結論
- 最近Pythonばかり触ってたから，Javaの記法忘れてた．
Multiple dex files define というエラーに出会ったときの対処法 (Android Studio, GreenDao)

GreenDao というORマッパーライブラリがあって、導入したら Multiple dex files define というエラーが出たという話

## げんいん

バージョンの異なる Android Support ライブラリーがかち合うことがある

## たいおう

Gradle の設定で除く

```js
    compile('de.greenrobot:greendao:1.3.0') {
        exclude module: 'support-v4'
    }
```

## さんこう

- Multiple dex files define ... with Gradle - http://goo.gl/MNy5d9
- greenDAO – Android ORM for SQLite - http://goo.gl/GCQ5Y

## あとがき

- グロースハッカー消えてください
AngularJSでAPIをコールし非同期で画面を更新する


先日にはてブのホットエントリになってたこの記事（[Promises: ブラウザーJavaScriptの新しい非同期標準になるか？](http://www.infoq.com/jp/news/2014/05/promises-javascript)）をみるに、APIアクセスの場合は promises を使わないと、APIの応答が遅い場合に結果が取得できないし、またAPIの結果が返ってくるまでユーザを待たせてしまうことになります。

というわけで、AngularJS でAPIの結果を非同期で取得して画面を更新する、というデモを作ってみました（応答が遅いAPIを模するために、1秒のウェイトを擬似的にいれてます）。

デモはこちら⇒http://hkusu.github.io/AngularJS_apicall_demo3

![スクリーンショット 2014-05-11 1.26.57.png](https://qiita-image-store.s3.amazonaws.com/0/35733/124b6cff-56e9-1b50-680f-89c47ca74390.png "スクリーンショット 2014-05-11 1.26.57.png")

下記にソースの説明をします。
※ 私のJavaScriptの経験はまだ浅いので、おかしなところがあったら教えてください^^;

### ① ソースツリーのWEB公開領域に、適当にJSONファイルを用意

```json:app/data/sample.json
[
  {
    "id": "1",
    "name": "山田"
  },
  {
    "id": "2",
    "name": "鈴木"
  },
  {
    "id": "3",
    "name": "高橋"
   }
]
```

### ② JSONファイルにアクセスするFactoryを用意

擬似的に1秒間ウェイトしてから、結果を返すようにしています。

```javascript:app/scripts/services/data.js
angular.module('apiTestApp')
  .factory('JsonData', function ($http) {

    return {

      getSampleData: function () {

        return $http.get('data/sample.json')
          .success(function(data, status, headers, config) {

            // 擬似的に、1秒間ウェイト
            var time = new Date().getTime();
            while (new Date().getTime() < time + 1000);

            return data;
          });
      }

    }

  })
;
```

### ③ Controllerから先程のFactoryを呼び出し

`.then` で先程のAPIアクセスの応答があった後に、画面にAPIの応答結果を表示するようにします。
AngularJSの場合、リアルタイムのデータバイングが働くので、簡単に書けますね^^

応答を待つ間に、後続に書いた処理（今回だと `$scope.show_loading = true;` の行）が実行されます。
今回は応答を待つ間は画面に「読み込み中」と表示することにします。

```javascript:app/scripts/controllers/main.js
angular.module('apiTestApp')
  .controller('MainCtrl', ['$scope', 'JsonData', function ($scope, JsonData) {

    // こっちの書き方はNGパターン
    //$scope.items = JsonData.getSampleData().data;

    JsonData.getSampleData().then(function(res){
        $scope.items = res.data;
        $scope.show_loading = false; // ローディング中、を非表示へ
      }
    );

    $scope.show_loading = true; // ローディング中、を表示

  }])
;
```

### ④ ViewでHTMLへ表示

```html:app/views/main.html
<div ng-controller="MainCtrl">
  この間の部分が非同期での読み込み<br>
  ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓<br>
  <div ng-show="show_loading">
    読み込み中..
  </div>
  <li ng-repeat="item in items">
    {{item.id}} - {{item.name}}
  </li>
  ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓<br>
</div>
```

### ⑤ 結果はこんな感じ

![スクリーンショット 2014-05-11 1.26.57.png](https://qiita-image-store.s3.amazonaws.com/0/35733/124b6cff-56e9-1b50-680f-89c47ca74390.png "スクリーンショット 2014-05-11 1.26.57.png")

![スクリーンショット 2014-05-11 1.24.16.png](https://qiita-image-store.s3.amazonaws.com/0/35733/aa399902-0cec-3721-c093-a997a2876fc1.png "スクリーンショット 2014-05-11 1.24.16.png")

デモはこちら⇒http://hkusu.github.io/AngularJS_apicall_demo3

# ほか

- 今回のソースはGitHubに置いてあります。
	- https://github.com/hkusu/AngularJS_apicall_demo3
- 参考:前回までの投稿（いま考えると、APIの応答が遅い場合は結果が取得できずあまり良くない..）
	- [AngularJSでAPIをコールし結果を取得するサンプル①](http://qiita.com/hkusu/items/61127838300d1b429091)
	- [AngularJSでAPIをコールし結果を取得するサンプル②](http://qiita.com/hkusu/items/52df7eb9f77beef16168)
Markdown のコードブロックの中で PowerShell で .NET の静的メソッドを呼び出すコードを書いたら表示されないのを回避するバッドノウハウ


コードブロックの中に `[System.IO.Compression.Zipfile]::ExtractToDirectory("", "")` みたいなのを書くと表示されない．
行末にセミコロンを付けると，ちゃんと表示されるし，コードとしての意味も変わらないで保たれる．
ただ，とてもバッドノウハウな感じ ...

ちなみに，Qiita だけじゃなくて，Gist でも同じ現象が発生していて，同じように回避できた．
ただ，Gist だと，reStructuredText で書けば，そもそも問題が発生しない．
多分，使ってるライブラリが同じ（pygments.rb？？）で，それの問題っぽい？？


``` ps1
# 表示されない
# [System.IO.Compression.Zipfile]::ExtractToDirectory("", "")
[System.IO.Compression.Zipfile]::ExtractToDirectory("", "")

# 表示される
# [System.IO.Compression.Zipfile]::ExtractToDirectory("", "");
[System.IO.Compression.Zipfile]::ExtractToDirectory("", "");
[System.IO.Compression.Zipfile]::ExtractToDirectory("", "") # コメント付けても表示される
```

# See also

* [rst と比較しつつ、いろいろ試している Gist](https://gist.github.com/cd01/9409254)
FlaskでGzipに圧縮したCSSを送信

`bootstrap.min.css` のロードが遅い問題を改善したくて、cssをgzipでどうすれば送信できるのか…と考えて調べた結果、無事出来たのでメモる。

### Viewを作る

とりあえず、新しくViewを作りましょう。
今回は `bootstrap.min.css` をGzipで圧縮したものを送信するので、 `/bootstrap.gz.css` という名前でURIを作ります。

```py
@app.route("/bootstrap.gz.css")
```

### Gzip圧縮

次に、Gzip圧縮したCSSファイルを読み込みます。(おそらく、通常のCSSファイルを読み込んで `gzip` モジュールで圧縮しても大丈夫だと思います)

```py
fp = open("static/css/bootstrap.min.css.gz")
content = fp.read()
fp.close()
```

### ヘッダーにひとてま加える

このままではダメなので、ヘッダーに一手間加えましょう。今回はGZIPで圧縮しているので、 `Content-Encoding` ヘッダに情報を加えます。

```py
res = make_response(content)
res.headers["Content-Type"] = "text/css"
res.headers["Content-Encoding"] = "gzip"
```

これらを一つにすると、以下のコードになります。
今回はCSSを圧縮したものを送信しましたが、Javascriptや画像でも同じ事ができると思います…!

```py
@view.route("/bootstrap.gz.css")
def Bootstrap():
    fp = open("static/css/bootstrap.min.css.gz")
    content = fp.read()
    fp.close()

    res = make_response(content)
    res.headers["Content-Type"] = "text/css"
    res.headers["Content-Encoding"] = "gzip"

    return res
```

是非参考にしてください！
SpriteKit入門 -24-


SKCropNodeクラスを使用すると、シーンの一部だけマスクをかけて表示することができます。
maskNodeプロパティで指定した描画領域の部分のみ表示します。
マスクがかかるのは、SKCropNodeオブジェクトのchildrenの描画になります。

```objectivec:HelloScene.m
- (void)createSceneContents
{
    self.backgroundColor = [SKColor blueColor];
    self.scaleMode = SKSceneScaleModeAspectFit;
    SKSpriteNode *spaceship = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship.png"];
	SKSpriteNode *spark = [SKSpriteNode spriteNodeWithImageNamed:@"spark.png"];
	spark.xScale = 4.0;
	spark.yScale = 3.0;
	SKCropNode *cropNode = [[SKCropNode alloc] init];
	cropNode.position = CGPointMake(300,600);
	cropNode.maskNode = spark;
	[cropNode addChild:spaceship];
	[self addChild:cropNode];
}
```

結果はこのようになります。

![spritekit_24_01.png](https://qiita-image-store.s3.amazonaws.com/0/30731/ea00eb50-eeee-4cb4-615a-4b48ea50daba.png "spritekit_24_01.png")

今回はここまで。
rubyでtwitterのbotを実装する(第5世代のやり方)

ruby twitterで検索すると、いろいろ実装方法がでてくるが、以下のエラーでつまづくことがあったので、メモ。

```
undefined method `configure' for Twitter:Module (NoMethodError)
```

gemでいれたtwitterのversionは、5.8.0だったので、ある時点からtwitterのライブラリの仕様が変わったらしい。

```
$ gem list --local | grep twitter
get-twitter-oauth-token (1.1.0)
twitter (5.8.0)
```

でも、以下のようにやれば動くので参考にしてください。

gemでライブラリをインストール

```
gem install twitter
```

もしかしたら、以下も必要だったかもしれない。

```
gem install oauth get-twitter-oauth-token
```

rubyのプログラム

```rb
require "twitter"

client = Twitter::REST::Client.new do |config|
  config.consumer_key = "lftxxxxxGrxlxxxxSlu44xxx"
  config.consumer_secret = "UTq19HxxxxNkGqiBxSFxxxxxxnOabvvzUxxxx6mpxxxx8jb"
  config.access_token        = "109999726-e9QpxxxxxxxrVl2t1sdsxxxxxWIg3rxxxxGvPka"
  config.access_token_secret = "tixxxxxAHjMAxxxx1KktdgiPrMnsxxxxxxyWVMEgxxxQN"
end

client.update("Hello World!!!")

```

ポイントは、`Twitter::REST::Client.new`とするところと、
その戻り値をclientで受けて、そのclientを操作するところ。
よくみるやり方だと、`Twitter.configure do |config|`とやっているけれど、自分の場合は、上記のエラーになってしまった。
これは、twitterのライブラリのversion5から仕様が変わったということだと思ってます。

参考になりそうなのは、以下のサイト
[3分でスッキリ! Oauth 1.0図解とRuby Twitter bot開発](http://b.ruyaka.com/2013/12/02/ruby-twitter-bot-with-oath1-0a/)
[Error with Ruby Twitter API](http://stackoverflow.com/questions/20247712/error-with-ruby-twitter-api)
xyzzyの自動バックアップ機能でリンクファイルを壊さないようにする

Emacsでもそうなんですが、xyzzyでは自動バックアップを取る時に

- 現在のファイルを別名でコピー
- 保存するときは元の名前で保存

という動作をするため、元のファイルが`mklink`や`ln`で作られたファイルだとリンク先を参照できなくなってしまい悲しいことになっちゃいます。

## 解決策

```cl
(setf backup-by-copying t)
```

と`.xyzzy`とかに書いておくとバックアップの方をコピーで作成するので安心です。そもそも何でそんな動作がデフォルトなのかがよくわからん。

## 参考

<a href="http://d.hatena.ne.jp/bowbow99/20081210/1228866085">ln.exe と xyzzy は仲が悪い？ - 日々ごちゃごちゃと考える</a>
TeXのubuntuでのインストールからコンパイル、記法などに関して

##1 TeXのインストール
```bash
#レポジトリの追加、パッケージ情報の更新
$ sudo apt-add-repository ppa:texlive-backports/ppa
$ sudo apt-get update
$ sudo apt-get upgrade
#インストール。時間がかかります。
$ sudo apt-get install texlive-lang-cjk
```
##2 TeXでのコンパイル
```bash
$ platex sample.tex
$ dvipdfmx sample
```

##3 TeXで一番簡単な記入例
```tex
\documentclass{jarticle}
\begin{document}
This is a sample document.
これはサンプルドキュメントです。
% %がついた場合、それ以降その文の後ろについた文字はコメントとして扱われます。
\end{document}
```

##4 TeXでの改行
TeXファイル上で改行をしても、和文の場合コンパイル後には反映されません。そのため、

```tex
\begin{document}
ここで改行します。\\
一行間を開けたい時はこのようにします。\\\\
\end{document}
```

とするのがいいようです。他の方法があるよって場合は教えていただけると助かります。

##5 タイトル
```tex
\begin{document}

\title{タイトル}
\author{著者名}
\date{日付} 

\maketitle %ここでタイトルを作成するので忘れないように

\end{document}
```

\maketitleでtitleをタイトルを作ります。
日付は、省略した場合、コンパイルした時の日付が挿入されます。日付を入れたくない時は、\date{}とすることで省略することが出来ます。
他にも、\subjclass{MSC number}, \keywords{キーワード}, \thanks{謝辞}, \address{連絡先住所}, \email{メールアドレス} などを記入できます．

##6 セクション(章)
```tex
\begin{document}
\section{見出し} %節
\subsection{見出し} %小節
\seciton{見出し} %節ごとに数字が振られる。ここは二番目の\sectionなので2 とつく(詳しくはわからない)
\end{document}
```

##7 数式
```tex
\begin{document}
$A$ %$で囲むと数式モードとなる。

$$ 
A 
$$ 

\[
math
\] 

%\[か$$で囲んだ部分は数式が独立して中央揃えで表示されることになる。

$$\frac{2}{5}$$ %2/5 
%分数を表すには \frac{分子}{分母}

$$3^3$$ % ^ : 上付きの添字

$$V_g$$ % _ : 下付きの添字 
\end{document}
```

##8 表
```tex
\begin{document}
  \begin{table}[htb]
    \begin{center} %センタリング
    \caption{表のタイトル}
       \begin{tabular}{|l|l|l} \hline
       年 & 月 & 日 & 時間 \\ \hline
       2014 & 5 & 17 & 13 \\ \hline
       2013 & 4 & 03 & 10 \\ \hline
       \end{tabular}
     \end{center}
   \end{table}
\end{document}
```

\begin{tabular}{列指定}といった感じで記入する。
列指定には

* l:左寄せ
* c:中央寄せ
* r:右寄せ

の三種類があり、縦線を入れたいところには"|"を入れる。
また、"\hline"で横線を入れることが出来る。

##9 画像
```tex
\begin{figure}[h] % h:記述した場所 t:ページのトップ b:ページの一番下
  \centering
  \includegraphics{画像.png}
  \caption{図についての説明}
  \label{label}
\end{figure}
```

記入する前に\usepackage[dvipdfmx]{graphicx}を入れる必要があります。

###参考
[Ubuntu 12.04でLaTeX環境を構築する](http://qiita.com/muniere/items/a468d4673d7bb7105dc7)
[TeX入門](http://www.comp.tmu.ac.jp/tsakai/lectures/intro_tex.html)
Viewでcontrollerオブジェクトにアクセスするには

view中でcontroller変数を利用すると、現在のcontrollerオブジェクトにアクセスできる。

```rb
# view/abcs/new.html.slim

div class=controller.controller_name
  = form_for(@abc) do |f|
...
```

# 参考

[RailsによるアジャイルWebアプリケーション開発 第4版](http://www.amazon.co.jp/dp/4274068668)
SpriteKit入門 -23-


SKEmitterNodeクラスのtargetNodeプロパティの効果を見てみます。

次のサンプルは、spaceshipスプライトにsmokeエフェクトを発生させています。
タップすると、spaceshipスプライトが回転しながら右に移動します。
そのとき、targetNodeプロパティを指定していないと、smokeエフェクトも一緒に回転して移動します。

```objectivec:HelloScene.m
- (void)createSceneContents
{
    self.backgroundColor = [SKColor blueColor];
    self.scaleMode = SKSceneScaleModeAspectFit;
    SKSpriteNode *spaceship = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship.png"];
	spaceship.name = @"spaceship";
    spaceship.position = CGPointMake(100,600);
    [self addChild:spaceship];
	SKEmitterNode *smoke = [self newSmokeEmitter];
//	smoke.targetNode = self.scene;
	smoke.targetNode = spaceship;
	smoke.position = CGPointMake(0, -100);
	smoke.targetNode = self.scene;
	smoke.particleBirthRate = 5;
	smoke.numParticlesToEmit = 0;
	SKKeyframeSequence *scaleSequence = [[SKKeyframeSequence alloc] initWithKeyframeValues:@[@0.2, @0.7, @0.1] times:@[@0.0, @0.25, @0.75]];
	smoke.particleScaleSequence = scaleSequence;
	[spaceship addChild:smoke];
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
	SKSpriteNode *spaceship = (SKSpriteNode *)[self childNodeWithName:@"spaceship"];
	if (spaceship != nil) {
		CGFloat circumference = spaceship.size.height * M_PI/2.0;
		SKAction *oneRevolution = [SKAction rotateByAngle:-M_PI*2 duration:10.0];
		SKAction *moveRight = [SKAction moveByX:circumference y:0.0 duration:10.0];
		SKAction *group = [SKAction group:@[oneRevolution, moveRight]];
		[spaceship runAction:group];
	}
}
```

![spritekit_23_01.png](https://qiita-image-store.s3.amazonaws.com/0/30731/cafea622-e715-9d74-0998-7a637c585210.png "spritekit_23_01.png")

コメントしてある、smoke.targetNode = self.scene; のコメントアウトを外すと、
smokeエフェクトがspaceshipプロパティのアクションの影響を受けなくなります。

![spritekit_23_02.png](https://qiita-image-store.s3.amazonaws.com/0/30731/5e77a5fc-e313-a9d1-99af-f81added6f3d.png "spritekit_23_02.png")

こちらのほうが自然ですね。

今回はここまで。
Mac の Finder でタイトルバーにフルパスを表示する

ターミナルを開いて
`defaults write com.apple.finder _FXShowPosixPathInTitle -boolean true`

と入力するとタイトルバーにフルパスが表示されるようになります。

Xtra Finderを利用している場合でも同じように表示されます。


解除には以下を同じようにターミナルで入力してください。
`defaults delete com.apple.finder _FXShowPosixPathInTitle`
useradd / adduser

誤っていたら訂正願います。

# useradd

ユーザを追加します、まる。

デフォルト動作が「原始的」です。
何も指定しないとデフォルトのシェルは```/bin/sh```になったりします。
一方Debian系の```adduser```は```/bin/bash```になる「ことが多い」はずです (後述)。

いわゆるUnix系OSで古くからあるコマンドのようです。Linux Standard Baseのレベルでは規定がありますので、Linuxの範囲では動作が同じと考えられます。

http://refspecs.linuxbase.org/LSB_3.1.1/LSB-Core-generic/LSB-Core-generic/useradd.html

また、File Hierarchy Standardにもこっそりuseraddについての言及が有ります (adduserはありません)。あくまで脚注相当でuseraddの要不要自体Optional未満の扱いっぽいので、仕様としては何の意味もないのですが、由緒正しいふるーいコマンド臭い雰囲気は感じます。

http://www.pathname.com/fhs/pub/fhs-2.3.html#FTN.AEN581

> Systems that use the shadow password suite will have additional configuration files in /etc (/etc/shadow and others) and programs in /usr/sbin (useradd, usermod, and others).

Unix系全体で(APIで言う「POSIX標準」的なレベルで)統一した仕様があるかはちょっと良くわかりません。AIXにはよく似た同名コマンドがあります。

http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.cmds/doc/aixcmds5/useradd.htm

Solarisのマニュアルらしきものの日本語。これが正しいかは知りませんが

http://jp.fujitsu.com/platform/server/sparcenterprise/technical/command-reference/usr/usr01.html

ざっと見ると```-m```をつけてかつ```-k```をつけなかった際のホームディレクトリの扱いが富士通のページだけないんですが、果たして仕様は一致しているのでしょうか。

古いものを知らないので歴史的な事情については図りかねます。多分1995年よりは前にあったでしょう。

＃ 一旦この記事書いてから「しまったなぁ」と思った話として、POSIX系のプログラミングガイド確認出来てないってのがあります。多分useraddはそれを薄めに囲ってるだけだと予想。

# adduser

ユーザを追加します、まる。

とりあえず私が知っているDebianとCentOSについてまず書きます

 * Debian ... Perlスクリプト。中でuseraddやgroupaddを巧みに呼びだす
 * CentOS ... useraddへのエイリアス、か、そもそも存在しない

(ざっとadduserってぐぐるとFreeBSDだとさらにシェルスクリプトの何かが出てきたりします。
http://www.freebsd.org/cgi/man.cgi?query=adduser&sektion=8 )

ここからはDebian系のadduserについて書きます。

インタラクティブなユーザ追加スクリプトで、住所を聞いてきたりもします。
動作を/etc/adduser.confで書き換えることができ、デフォルトでログインシェルが/etc/bashになるのはこの設定ファイルに書かれているからのようです。```-k```がない際のスケルトンディレクトリが/etc/skelになるのもこいつのせい。

なので、システム管理者がお茶目にも/etc/adduser.confを書き換えてデフォルトシェルを/bin/shに変えてたりすると、adduserでログインシェルが/etc/bashになると期待できなくなります。

＃自分の環境ではzshにして/etc/skelをいじって……

スクリプトのCopyrightが1995年です。「比較的」新しい、かな？かな？

直観的には「高機能でミスが少なめになりやすい」的な印象を持つのですが、ただ、複数のUnix系OSをまたぐ際にこのスクリプトが存在することはあまり期待できません、というかざっくり見た感じPerlスクリプトとしてのadduserはDebian系特有の便利ツールです。名前似てるのに。

DebianとUbuntuを行き来しているのであればいいんですが、たいていadduserと打って(ﾟДﾟ)って顔になるのって自分の中ではCentOSいじってる時です。

RedHat系ですとこれが暗黙にuseraddにsymlinkされてたりするケースもあるそうです。なおCentOS 6.5をサッと見た時にはadduserは存在自体がありませんので、混乱という意味では少し落ち着く。yum探してもないよ。

# 個人的な印象

自分の周りが比較的Debian系で固められているため、なっがいあいだadduserに全く疑問を持つことがなかったのですが、いざ各コマンドの起源やら他OSの対応状況やらを見ると、特にadduserの使用について少し身構えてしまう部分があります。

個人的に以前やられたのがグループ管理についての操作体系の違いでして。「useraddの-gと-Gの違いを説明してみろ」と質問されて、自分が正答出来ている気があまりしません。本来Unixでは所属できるグループってば１つなんでしたっけね……？

＃ ```adduser user group```というショートカット的な機能がuseraddにはもちろんないのがある意味ハマりポイントでした。

他のディストリビューションを使うのなら似て非なるものはこれだけではないので、この２コマンドだけあげつらうのもどうかと思いますが……

＃この範囲の狭い調査でも、/bin/shだってashかdashかの違いがあるという事実を知りましてちょっと驚きました。Debian系はashではなくdash。どのくらい致命的に響くかは不明。シェル芸の極地でも考えない限り見るのほとんどbashだもんなぁ……

調べている最中、Debian系ではadduserが「推奨」されている風味の説明を見た記憶がありますが定かではありません。もっとも普通はadduser使う気がします。

あと、きっと将来は/etc/skel下に自前の.zshrcを入れたりしま(せん)

おしまい。
UICollectionViewLayoutの切替アニメーションの速度を調整する

UICollectionViewは複数のレイアウトをアニメーション付きで簡単に切り替えることができる。ただ、切り替える時のアニメーションの速度を調整する方法がなくて困っていた。これはUICollectionViewFlowLayoutだけではなく、カスタムレイアウトの時も同じ。

いろいろ調べてみたら、単純にUIViewのanimationDuration:animationsメソッド内でアニメーションを切り替えてやればよいことがわかった。


```objc
[UIView animateWithDuration:1.f animations:^{
  [self.collectionView setCollectionViewLayout:self.flowLayout animated:YES];
}];
```

<br>
こんな感じで書くと現在のレイアウトからの切り替わる速度を調整できる。
PhotonCloud + Unityでオンラインゲーム開発 その1 ~ルームの作成~

Photon Cloudを使ったオンラインゲーム開発の備忘録です。
<h1>1.ルームを作成</h1>
まず、新しいSceneを作成します。
今回は名前を「RoomScene」とします。
このシーンでは、オンラインゲームのルームにあたる部分を作成していきます。
このシーンに[Game Object]>[Create Empty]から空のゲームオブジェクトを作成します。
今回はこのゲームオブジェクトの名前を「RoomManager」とします。
このオブジェクトにルームに関するスクリプトをアタッチしていきます。
まず、C#のスクリプトを作成してください。

```csharp:RoomManager.cs
using UnityEngine;
using System;

public class RoomManager : MonoBehaviour {

	private string playerName = "GuestAAA";
	private string roomName = "myRoom";
	private bool connectFailed = false;


	public void Awake()
	{
		// マスタークライアントのsceneと同じsceneを部屋に入室した人もロードする。
		PhotonNetwork.automaticallySyncScene = true;
		// もしまだ接続していない状態ならば
		if (PhotonNetwork.connectionStateDetailed == PeerState.PeerCreated)
		{
			// PhotonServerSettingsの設定に従ってPhotonNetwork（マスターサーバー）に接続する。
			PhotonNetwork.ConnectUsingSettings("1.0");
		}

		// もしPhotonNetWorkに名前を登録していないならば、PhotonNetworkに名前を登録する
		if (PhotonNetwork.playerName==null)
		{
             //ランダムにプレイヤーの名前を生成
			this.playerName = "Guest" + UnityEngine.Random.Range(1, 9999);
             //Photonにプレイヤーを登録
			PhotonNetwork.playerName = this.playerName; 
		}else{
             //Photonにプレイヤーを登録
			this.playerName = PhotonNetwork.playerName;
		}
	}
}
```

Photonの初期化は以上です。
次に、Roomにログインするためのメニューを作成します。

スクリプト内に適当に下のメソッドを実装してください。

```csharp:RoomManager.cs
--省略--
	public void OnGUI(){
                //ルーム名をテキストフィールドから入力させる
                this.roomName = GUILayout.TextField(this.roomName);
                //ルーム作成ボタン
		if (GUILayout.Button("Create Room", GUILayout.Width(100)))
		{
                        //ルームを作成。引数はルーム名
			PhotonNetwork.CreateRoom(this.roomName);
		}
                //ルームに入室するボタン
		if (GUILayout.Button("Join Room", GUILayout.Width(100)))
		{
                        //入室。引数はルーム名
			PhotonNetwork.JoinRoom(this.roomName);
		}
        }
--省略--
```

また、スクリプト最下部に以下を追記してください。

```csharp:RoomManager.cs
--省略--
        //以下必須(?)メソッド。
	//各ステート時にコールされる。書かないとエラーに
    //入室時にコール
	public void OnJoinedRoom()
	{
		Debug.Log("OnJoinedRoom");
	}
    //部屋作成に成功したときにコール
	public void OnCreatedRoom()
	{
		Debug.Log("OnCreatedRoom");
	}
    //接続が切断されたときにコール
	public void OnDisconnectedFromPhoton()
	{
		Debug.Log("Disconnected from Photon.");
	}
    //接続失敗時にコール
	public void OnFailedToConnectToPhoton(object parameters)
	{
		this.connectFailed = true;
		Debug.Log("OnFailedToConnectToPhoton. StatusCode: " + parameters + " ServerAddress: " + PhotonNetwork.networkingPeer.ServerAddress);
	}
```

これで入室処理が完成です。

第二回
http://qiita.com/yuya-okada/items/69a722bea2eb3dea7d6d
特定ユーザにのみtty無しでのsudoを認める

VagrantやServerspecを使っている時など、ttyなしでsudoができるように `/etc/sudoers` から下記の記述をコメントアウトすることがありますが、これだと権限を持つ全てのユーザがttyなしでsudoを実行できるようになってしまいます。

```text:/etc/sudoers
#Defaults      requiretty
```

全ユーザではなく、特定のユーザだけにttyなしでのsudoを認めるには次のように書きます。

```text:/etc/sudoers
Defaults           requiretty
Defaults:username !requiretty
```

### 参考

- sudoers(5)
    - Defaults
    - SUDOERS OPTIONS
日本語文字列照合順番の一部を整理整頓してみる

1冊の本の巻末索引を考えてみよう．それぞれのエントリーはどんな順序で並んでいるだろうか？

並べること，整列や配列，排列と呼ばれる話題である．JIS（日本工業規格）には，JIS X 4061 に，「日本語文字列照合順番」という規定がある（[日本工業標準調査会](http://www.jisc.go.jp/) のページから「JIS 検索」を通じて閲覧できる）．「照合順番」「照合する」などの用語については，JIS X 4061 に規定されているのでそちらを参照してほしいが，比較関数を作るとか，規則によって順番を付けるとかいった意味で捉えればよいはずである．（順番が付いた後にその順番に従って並べ替える操作は別操作だというだけのこと．）

この記事から始まる一連の投稿では，JIS X 4061 から，

* 1. (2) 読み・表記照合
* 3.3 (1)/4.1 基本照合規則

を採用し，（日本語を解しない）実装者に要件を説明することを念頭に置いて，記述を整理することを狙う（最終的には英語またはオランダ語に翻訳することになる）．なお，入出力の文字コードは UTF-8 を想定し，UTF-8 で日本語を扱う上での特有の注意事項はできるだけ漏らさず付け加えていきたいと考えている．
SpriteKit入門 -22-


SKEmitterNodeクラスを使ってエフェクトを操作してみます。

numParticlesToEmitプロパティに値を設定すると、指定した値の数だけパーティクルを生成した後、SKEmitterNodeオブジェクトは消滅します。
また、particleScaleプロパティなどを指定することにより、プログラムからも設定を変更できます。

```objectivec:HelloScene.m
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
	SKEmitterNode *smoke = [self newSmokeEmitter];
	UITouch *touch = [touches anyObject];
	CGPoint location = [touch locationInNode:self];
	smoke.position = location;
	smoke.particleBirthRate = 5;
	smoke.numParticlesToEmit = 100;
	smoke.particleScale = 0.3;
	smoke.particleScaleRange = 0.2;
	smoke.particleScaleSpeed = -0.1;
	[self addChild:smoke];
}
```

![spritekit_22_01.png](https://qiita-image-store.s3.amazonaws.com/0/30731/935040cb-9ff6-800a-b742-9ea03620fa88.png "spritekit_22_01.png")

Keyframe Sequence を使って、Particle Emitter Editor では指定できない動きを作ることもできます。
次の例では、scale を lifetime*0.0秒後に0.2 ⇒ lifetime*0.25秒後に0.7 ⇒ lifetime*0.75秒後に0.1と変化させています。

```objectivec:HelloScene.m
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
	SKEmitterNode *smoke = [self newSmokeEmitter];
	UITouch *touch = [touches anyObject];
	CGPoint location = [touch locationInNode:self];
	smoke.position = location;
	smoke.particleBirthRate = 5;
	smoke.numParticlesToEmit = 100;
	SKKeyframeSequence *scaleSequence = [[SKKeyframeSequence alloc] initWithKeyframeValues:@[@0.2, @0.7, @0.1] times:@[@0.0, @0.25, @0.75]];
	smoke.particleScaleSequence = scaleSequence;
	[self addChild:smoke];
}
```

![spritekit_22_02.png](https://qiita-image-store.s3.amazonaws.com/0/30731/10ded948-7e26-281d-4417-722d97712d0a.png "spritekit_22_02.png")

今回はここまで。
Pidoraでdump1090ビルドしてみた

[前回](http://qiita.com/fujiba/items/68858760dace376d0642)の続き。

ADS-Bを受信するためのdump1090をビルドしようとしたけど、すんなり行かなかった。

````:console
git clone git://github.com/MalcolmRobb/dump1090.git
cd dump1090
make
````

makeすると、以下のエラー

````:エラー
gcc -O2 -g -Wall -W `pkg-config --cflags librtlsdr`   -c dump1090.c
Package librtlsdr was not found in the pkg-config search path.
Perhaps you should add the directory containing `librtlsdr.pc'
to the PKG_CONFIG_PATH environment variable
No package 'librtlsdr' found
````

librtlsdrは、/usr/local/libにあって、/usr/local/lib/pkgconfigにpcファイルもある。

と言うことで、環境変数見たらPKG_CONFIG_PATHが無かったので、環境変数追加してmakeで無事ビルド完了。
MEAN.IO　公式ドキュメント　備忘録

和訳が見つからなかったので、自分用に公式docを和訳兼メモ。
勉強し始めたばかりなので、用語の使い方や内容に関するご指摘・ご教授を頂けるとうれしいです。
　
　
MEANバージョン：0.3.3
　
公式ドキュメントの1つ目の「File Structure」に関してメモ。(2014/5/10時点)
「Package」にも同じ「File Structure」があり、内容も似ていますが上から参照して1つ目です。

> `$APP_HOME`はmeanコマンドで各種ファイルが展開されるディレクトリとします。

#File Structure
##サーバサイドコード
サーバサイドで動作させるの全てのコードは **$APP_HOME/server** ディレクトリに保存する。
```
　server
　　--- config　# 各種設定ファイルを保存するディレクトリ (詳細は下記)
　　--- controllers　# コントローラ(MVCのC)に関するファイルを保存するディレクトリ
　　--- models　# モデル(MVCのM)に関するファイルを保存するディレクトリ
　　--- routes　# ルーティング情報・処理に関するファイルを保存するディレクトリ
　　--- views　# swig based html rendering - here
　　　　　　　　　SWIG形式で記述するHTML表示用ファイルを保存するディレクトリ？
　
```
> 「views」について、実際のファイルを確認すると404やindex用のファイルが保存されているが
> 後述にあるとおりクライアントに渡すのはpublicディレクトリのはず？

##クライアントサイドコード
クライアントサイドで動作させる全てのコードは **$APP_HOME/public** ディレクトリに保存する。
```
　public
　　--- articles　#　筆者の環境には自動作成されず。(そういうものかもしれません)
　　--- auth　#　
　　--- humans.txt　#　
　　--- init.js　#　
　　--- robots.txt　#　
　　--- system　#　
　　　　　--- assets　#　
　　　　　--- controllers　#　
　　　　　--- lib　#　
　　　　　--- routes　#　
　　　　　--- services　#　
　　　　　--- system.js　#　
　　　　　--- views　#　
　
```

##コンフィグファイル
「サーバサイドの」全てのコンフィグファイルは **$APP_HOME/server/config** ディレクトリに保存する。
「テスト」「開発」「本番」の起動モード毎に異なる設定を **$APP_HOME/server/config/env** ディレクトリに定義することが出来る。
```
　config
　--- env　#　起動モード毎のコンフィグファイルを保存するディレクトリ。
　　　　--- all.js　#　全起動モードで適用される共通設定ファイル。
　　　　　　　　　　　　待ち受けIP・ポート・接続先DB・HTML生成エンジン等を記載。
　　　　　　　　　　　　(各モード用設定ファイルとどちらの設定が優先されるかは未検証。
　　　　　　　　　　　　　config.jsはall.jsを先に読み込むように記載。)
　　　　--- development.js　#　開発モード時に参照される設定ファイル。
　--- config.js　#　envディレクトリの設定ファイルを読み込む定義が記載。
　--- express.js　#　expressフレームワーク用の設定ファイル？
　--- passport.js　#　OpenID認証用プラグイン「passport」に関する設定ファイル？
　--- system/　#　
　
```
> サービスをスタートした際($APP_HOME/server.jsを実行)、「server.js」が「config.js」を
> 参照し、「config.js」が「env/all.js」→「env/各モード.js」の順番で参照する。

　
次は勉強がてらserver.jsからどういった順番でファイルが参照されていくかを読む予定。
即売会サービスを作ろう８（画像アップローダ編）


アイテムの登録、編集機能を作っていて気づいたのですが
いまのapiだと１つのapiで複数の画像をアップロードすることになるため
送信時間が非常に長く、ユーザー体験が悪くなってしまいます。

このあたり他のアプリはどうやっているのかなとメルカリ(http://mercari.jp )を調べたのですが
メルカリは１画像を選択するごとにサーバにアップロードしているようです。

そんなわけでマネしてみました。
アップローダーの完成です。
メルカリ触ってて思ったのですが、いつかは画像加工機能も入れたいですね！

```python

# 画像のアップロード
class PutImage(UserLoginAuthRequestHandler):

    def post(self):
        if self.invalidateAccount():
            Common.writeUserResponseError(self, 401,u"無効セッション")
            return

        blob    =   self.request.get('blob')
        content_type = self.request.params['blob'].type

        blobHash = hashlib.md5(blob).hexdigest()
        gcsPath = Common.createImagePath(blobHash)
        Common.saveToGCS(gcsPath,blob,content_type)


        entity = ImageFile()
        entity.path = gcsPath
        entity.md5  = blobHash

        entity.put()

        res = dict(
            url = webapp2.uri_for('GetImage',_full=True,imageid=entity.key.id())
        )

        Common.writeUserResponseSuccess(self, res )


# 指定した画像を返す
class GetImage(UserLoginAuthRequestHandler):

    def get(self):
        imageid = int(self.request.get('imageid'))

        item = ImageFile.get_by_id(imageid)

        path = item.path

        gcs_file = gcs.open(path)
        gcs_stat = gcs.stat(path)

        self.response.content_type = gcs_stat.content_type
        self.response.content_type_params = None
        self.response.write(gcs_file.read())
        gcs_file.close()





app = webapp2.WSGIApplication(
                            [
                                webapp2.Route('/user/api/resource/putimage', PutImage,'PutImage'),
                                webapp2.Route('/user/api/resource/getimage', GetImage,'GetImage'),
                            ],
                            debug=Common.isDebug()
)
```

こんな感じでサークルアイテムの登録・編集機能がつきました。
https://github.com/nagai/freemarket/tree/20140429
次回は即売会会場を作ります。
ユーザの情報をパスワードなく更新したい


# 問題
- サインインしたユーザの情報を更新したいができなかった。

- ``` Rails.logger.info(@user.errors.messages.inspect)``` でログを見てみると、どうもパスワードがないため更新されない感じだった。

# 解決策

モデルで ```allow_blank```を適応させた

```rails:model.rb

validates :password, presence: true, length: {minimum: 5, maximum: 120}

```
だった場合、

```rails:model.rb

validates :password, presence: true, length: {minimum: 5, maximum: 120}, on: :create
validates :password, length: {minimum: 5, maximum: 120}, on: :update, allow_blank: true

```
のように、updateが呼ばれるときだけは```allow_blank```で行う。

※ validates が重複してるので、うまくDRYでいける方法があれば教えて欲しいです…


# 参考

[Devise 3 (rails 4) can't update user without password - Stack Overflow](http://stackoverflow.com/questions/16811530/devise-3-rails-4-cant-update-user-without-password)
Cameraのpositionが子オブジェクトのposiotionに影響

忘れていたのか初めてなのかわからんがハマった。

CameraのTransform.Posiotionが（0,0,0）じゃなかった事でハマった。

子オブジェクトのTransform.positionが(0.05,-0.2,0)にも関わらず
Debug.logすると全く違う値が表示されてた。

何回やっても駄目なのでバージョンアップしようかと思ったが
CameraのTransform.positionを引き算すると
ちょうどDebug.Logの数値とピッタリになることに気づく。

子オブジェクトって絶対座標だっけ？
相対座標だと思ってたんだけどなあ。
Rubyのdefine_method、class_evalで動的に定義されたメソッドの呼出コストを調べてみた


はじめに
========

Rubyでは、通常のメソッド定義のほかに、動的にメソッドを定義する方法がいくつかありますが、
動的に定義されたメソッドと通常のメソッドの呼出コストの差が気になります。

また、動的に定義されたメソッドの中でも`define_method`で定義されたものは重いということもよく知られています。
一例として、Railsでは、重い`define_method`を使う代わりに文字列の`class_eval`を使用している箇所が多くあります。

というわけで、

* 通常のメソッド定義
* `define_method`
* `class_eval` + 文字列
* `class_eval` + ブロック

で定義したメソッドの呼出コストのベンチマークを取ってみました。

`class_eval` + ブロックは __正確には動的ではない__（メソッドの内容を動的に変更できない）のですが、気になったので同時にベンチマークすることにしました。


ベンチマーク
========

環境
--------

Ruby 2.1.2

コード
--------

何もしないメソッドをそれぞれの方法で定義し、10000000回呼び出しています。

```ruby:コード
require 'benchmark'

class Test

  # 通常のメソッド
  def test_normal
  end
  
  # define_method
  define_method :test_define_method do
  end

  # class_eval (文字列)
  class_eval <<-EOS, __FILE__, __LINE__ + 1
    def test_eval_string
    end
  EOS

  # class_eval (ブロック)
  class_eval do
    def test_eval_block
    end
  end
end

n = 10000000
test = Test.new

Benchmark.bm do |b|
  b.report '通常のメソッド' do
    n.times { test.test_normal }
  end

  b.report 'define_method' do
    n.times { test.test_define_method }
  end

  b.report 'class_eval (文字列)' do
    n.times { test.test_eval_string }
  end

  b.report 'class_eval (ブロック)' do
    n.times { test.test_eval_block }
  end
end

```

結果
--------

`define_method`版が他に比べて2倍近く時間がかかる一方、他の方法はほとんど時間が変わらないことがわかりました。

```text:ベンチマーク結果
       user     system      total        real
通常のメソッド  0.880000   0.000000   0.880000 (  0.880378)
define_method  1.520000   0.000000   1.520000 (  1.527402)
class_eval (文字列)  0.890000   0.000000   0.890000 (  0.893508)
class_eval (ブロック)  0.880000   0.000000   0.880000 (  0.884782)
```

まとめ
========

やはり`define_method`で定義したメソッドは遅い
--------

`define_method`版は他に比べて2倍近く遅いという結果になりました。

今回は何も行わないメソッドでのベンチマークだったので結果が極端になりましたが、
通常のプログラミングでも、メソッド呼出のコストを考慮しなければいけない場合 (メソッドの内容が少ないなど) は、`define_method`の遅さを気にする必要がありそうです。

文字列`class_eval`で定義したメソッドは通常のメソッドと呼出コストが変わらない
--------

一方、文字列`class_eval`を使えば、通常のメソッドと同じ速さのメソッドを動的に定義できる (文字列しか動的に操作できないというデメリットがありますが) ということもわかりました。