OmniAICreator/Qiita-1.07M huggingface dataset:
sidekiqでqueueの中身を確認する方法

APIドキュメントにも明には書いてなかった気がするので備忘録として。
※以下ではActiveJobを使っています。

## 	queueに入っているJobの数を確認する。
queue名を指定して `Sidekiq::Queue.new` すると色々ゴニョゴニョ出来るみたい。
以下は `default` というqueueを取得する例。

```ruby
[60] pry(main)> queue = Sidekiq::Queue.new('default')
[61] pry(main)> queue.size
```

## queueの各Jobの内容を確認する
`queue.first` で最初のJobの中身が確認できるようなので見てみる。

```ruby
[33] pry(main)> queue.first
=> #<Sidekiq::Job:0x007fac2ca82ca0
 @item=
  {"class"=>"ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper",
   "wrapped"=>"ActionMailer::DeliveryJob",
   "queue"=>"mailers",
   "args"=>
    [{"job_class"=>"ActionMailer::DeliveryJob",
      "job_id"=>"e02f1e74-aef4-4ea1-b374-e93da431a949",
      "queue_name"=>"mailers",
      "arguments"=>["HogeMailer", "user_created", "deliver_later", {"_aj_globalid"=>"gid://app/User/1"}]}],
   "retry"=>true,
   "jid"=>"3b19683d5a8dbc085b1302c6",
   "created_at"=>1444714057.8843222,
   "enqueued_at"=>1444714057.884371},
 @queue="mailers",
 @value=
  "{\"class\":\"ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper\",\"wrapped\":\"ActionMailer::DeliveryJob\",\"queue\":\"mailers\",\"args\":[{\"job_class\":\"ActionMailer::DeliveryJob\",\"job_id\":\"e02f1e74-aef4-4ea1-b374-e93da431a949\",\"queue_name\":\"mailers\",\"arguments\":[\"HogeMailer\",\"user_created\",\"deliver_later\",{\"_aj_globalid\":\"gid://app/User/1\"}]}],\"retry\":true,\"jid\":\"3b19683d5a8dbc085b1302c6\",\"created_at\":1444714057.8843222,\"enqueued_at\":1444714057.884371}">
```

上記から、各Jobの中身によって色々集計変えたいとか処理変えたいとか何かしたいだったら、以下のようにすれば良さそう

```ruby
queue = Sidekiq::Queue.new('default')
queue.each do |q|
  if q.args.first["arguments"].include?('hogehoge')
    puts hogehoge
  end
end
```
JavaCC Eclipse  Plugin 導入方法

#はじめに

JavaCC Eclipse  Plugin 導入方法 について忘れた時のために書いておきます．
使用しているOSはMac X Yosemite 10.10.5です．

公式ホームページ
http://eclipse-javacc.sourceforge.net/

#インストール手順

1. > Help > Check for Updatesより，Eclipseをアップデートします．
2. > help > Install New Software を選択します．
3. http://eclipse-javacc.sourceforge.net/ を Work width:  にいれadd を選択します．
4. JavaCC　EclipsePlug-in にチェックを入れ，Next>を選択し，acceptし，Finishを選択します．

#実行方法
1. javaプロジェクトを作ります．
2. 作成したプロジェクトのsrcを右クリックし，New > other >JavaCC template を選択します．
3. 現環境では，パスの設定がおかしくなっているので，パスの設定を変更します．下記のようなエラーメッセージが出てしまいます[1]．
4. MyNewGrammar.jjを右クリックし，Build Path > Configure Build Path > JavaCC option でPathを  Applications/Eclipse.app/Contents/Eclipse/plugins/sf.eclipse.javacc_1.5.30/jars/javacc-5.0.jarに変更します．ディレクトリを確認したところ，jarsの下にJavacc_x.x.jarファイルが有るようなので，このように変更しました．
5. <?parser_name?>の箇所を全て，MyNewGrammarに置換します．
6. MyNewGrammar.jjを右クリックし，Compile with javaCCを選択します．
7. Consoleに Reading from standard input... Enter an expression like "1+(2+3)*4;" : と出力されるはずです．
8. 以上です．

#エラーメッセージ
[1] >java -classpath /Applications/Eclipse.app/Contents/Eclipse/plugins/sf.eclipse.javacc_1.5.30/javacc-5.0.jar javacc MyNewGrammar.jj (@ 13/10/2015 18:02:20)
エラー: メイン・クラスjavaccが見つからなかったかロードできませんでした
slack-notifierでrailsからSlackへ簡単にメッセージを送る

[slack-ruby-gem](https://github.com/aki017/slack-ruby-gem)というのもありこちらを紹介する記事は多いのですが、star数が多いこちら[slack-notifier](https://github.com/stevenosloan/slack-notifier)を使ってみた記事は少なかったので、まとめました。(どちらも単純にメッセージを送るだけだったら、機能的に差異は無さそう)

## Slack側の事前準備(WebHookURLを取得する)
チャンネルのプルダウンから `Add a service integration` を選択します
![Kobito.2D5JY4.png](https://qiita-image-store.s3.amazonaws.com/0/76861/1dd9377a-010f-c7fe-648d-6eacbfb78d65.png "Kobito.2D5JY4.png")
`Integrations` の一覧から、 `Incoming WebHooks` を選択します(下の方にあります)
![Kobito.y3glRH.png](https://qiita-image-store.s3.amazonaws.com/0/76861/2f615529-4f7a-4f79-02b9-4fd796f60d16.png "Kobito.y3glRH.png")

プルダウンから通知したいチャンネルを選択して、 `Add Incoming WebHooks`をクリックします。
![Kobito.CzWAzB.png](https://qiita-image-store.s3.amazonaws.com/0/76861/010fcd55-2e6e-f0f1-75de-48be8ca71f4d.png "Kobito.CzWAzB.png")
ここに表示されている `Webhook URL` をメモしておきます。(slackへの表示名や、アイコン画像もここで変更できます。)
![Kobito.3x1qzx.png](https://qiita-image-store.s3.amazonaws.com/0/76861/23e856a5-03a3-40e2-502e-9ffdf4d9bc5d.png "Kobito.3x1qzx.png")

## railsアプリから、slackに通知を送る
Gemfileに `slack-notifier` を追加して `bundle install`します。

```ruby
#Gemfile
gem 'slack-notifier'
```

あとはrailsの中で、以下の様なコードをかけば簡単にSlackに通知ができます。

```ruby
notifier = Slack::Notifier.new('https://hooks.slack.com/services/hogehogefugafuga') #事前準備で取得したWebhook URL
notifier.ping('Hello')
```

通知されるとこんな感じ！
![Kobito.tBavgl.png](https://qiita-image-store.s3.amazonaws.com/0/76861/2a62eedf-1684-2321-50de-1bf5b8f62150.png "Kobito.tBavgl.png")


私は環境変数に書いて、参照するようにしたりしてます。
事前準備で取得したWebhook URLを各環境の設定に追記します。(以下は`production.rb`に環境変数を使って定義する例)

```ruby
# production.rb
  config.slack_webhook_url = ENV['SLACK_WEBHOOK_URL']

```

```ruby
notifier = Slack::Notifier.new(Rails.application.config.slack_webhook_url)
notifier.ping(message)
```

## 感想・所感
めっちゃ簡単にSlack連携できました。ただSlackへの通知はそこそこ時間がかかるので、当たり前といえば当たり前ですがカジュアルにコントローラとかから直接Slackにメッセージを送るのは注意が必要です。(sidekiqなど使って遅延実行した方が良いと思う)
Mac初心者がEl Capitanにnginx + php 環境を構築してハマったメモ その1

開発環境をMacに移行するにあたり、web開発環境構築に少々つまづいたのでメモを置いておきます。ほとんどの情報はちょっと検索すればあちこちにありますが、自分のハマりどころとはちょっと違ったので。

# 事前準備

作業はほぼターミナルで行います。**Launchpad＞その他＞ターミナル** を起動しておいてください。

## 不可視ファイルの可視化

システムに関わるファイルはだいたい不可視状態になっています（Windowsもそうですよね）。これを可視化しましょう。
ターミナルから下記のコマンドを実行して下さい。

```bash
defaults write com.apple.finder AppleShowAllFiles -boolean true
```

```bash
killAll Finder
```

* [Macで不可視（隠し）ファイルやフォルダを表示する方法](http://gori.me/mac/mac-tips/79489)

## Finderの起動

アプリケーションをインストールした後は設定ファイルのコピーやエイリアスの作成を行いますが、コマンドだけ見ても初心者はピンと来ないと思います。
Finderを起動しておいて、該当するフォルダを開いておくと、ファイルが増えたことを視覚的に理解できると思います。

`/usr/local/etc/` のような場所は普通に操作してもたどれませんので、`[command]+[shift]+[G]`でパス入力すると移動できます。

![スクリーンショット 2015-10-13 17.51.16.png](https://qiita-image-store.s3.amazonaws.com/0/2513/074741e0-f0a7-cb29-f578-426bbc8003ed.png)

上の画像でファイル名が薄いグレーになっているものは不可視ファイルです。

# Xcodeのインストール

XcodeとはOSXやiOSアプリなどの開発環境です。
これに収録されているコマンドラインツールが必要になるので、App Storeからインストールしてください。

インストールしたら一度でいいので起動させてください。
起動だけ確認したら終了させてOKです。

# Homebrewのインストール

Homebrewというのはアプリケーションの管理ツールです。
GUIアプリは標準でApp Storeがありますが、これのCLI（コマンドライン）版だと思っててください。アプリのインストール、アンインストール、アップデートなどを行えます。

## インストール

ターミナルから下記のコマンドを実行すると勝手にインストールしてくれます。

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

ただし、El Capitanからは`/usr/local/`というフォルダの有無によって手順が変わります。詳しくは参考サイトをご覧下さい（丸投げ）。

* [【Mac】OS X 10.11 El CapitanにHomebrewをインストールする方法](http://blog.h-wd.info/2015/10/08/mac-os-x-10-11-el-capitan%E3%81%ABhomebrew%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/)

# パスの追加

Homebrewによってインストールされる実行ファイルは基本的に`/usr/local/bin`や`/usr/local/sbin`にインストールされます。
そのままではインストールしてもファイルが見付からず実行できないので、パスを追加します。

テキストエディタ（標準の「テキストエディット」など）で`/etc/paths`を編集してください。内容は環境によって違う可能性があるので、追加部分だけ注目してください。

```bash:/etc/paths
/usr/local/bin　←追加
/usr/local/sbin　←追加
/usr/bin
/bin
/sbin
```

## Homebrewの動作確認

ちゃんとインストールできたか確認しましょう。`brew doctor`と入力してください。
下記のように表示されれば準備OKです。

```bash
$ brew doctor
Your system is ready to brew.
```

Homebrewは色々便利なコマンドがあります。検索すればたくさん情報が出てきますので調べてみて下さい（筆者自身よくわかってない）。

* [Macのツールを楽にインストールできるパッケージ管理システムHomebrewの使い方](http://millkeyweb.com/installing-homebrew/)

# つづきはその2で

事前準備とHomebrewだけで長くなったので、「その2」に続きます。

* [Mac初心者がEl Capitanにnginx + php 環境を構築してハマったメモ その2](http://qiita.com/sygnas/items/34c4c408bf3418b918a7)
【シェル】年月を指定してその日付分ループする

日付指定で行う処理をまとめてやるのに便利

```bash:dailyloop
#!/bin/bash

TARGETMONTH=$1

TARGETDATE="${TARGETMONTH}01"
while [ `echo ${TARGETDATE} | cut -c 1-6` -eq ${TARGETMONTH} ]; do
  【処理記述】
  【処理記述】
  【処理記述】
  TARGETDATE=`date -d "${TARGETDATE} 1 days" '+%Y%m%d'`
done 
```
[Javascript]URL情報(フルパス, ファイル名以外)を表示

## URL表示テスト

```html:sample.html
<HTML>
<HEAD>
<TITLE></TITLE>
<SCRIPT language="JavaScript">
<!--
// 警告ウィンドウを表示する
function show() {
  var fullpath = location.pathname;
  var url      = location.href.split(/#/)[0]; // hash に / を含むことがある場合を考慮
  var url_path = url.substring(0, url.lastIndexOf("/"));

  window.alert("[location.pathname:]->\n"+fullpath+"\n\n"+
               "[location.href:]->\n"+url+"\n\n"+
               "[location.href(except filename):]->\n"+url_path);
}
//-->
</SCRIPT>
</HEAD>
<BODY>
<A href="#" onClick="show()">パスを表示する</A>
</BODY>
</HTML>
```
[Server]よく使用するポート番号一覧メモ

よくポート番号を忘れるので備忘録的に。

|ポート番号|説明| 
|:--|:--|
|20/TCP|FTP - データ転送ポート|
|21/TCP|FTP - コントロールポート|
|22/TCP,UDP|Secure Shell (SSH) - セキュアログイン、セキュアなファイル転送（scpやsftpなど）、ポート転送などで用いられる。|
|23/TCP|Telnet - 平文ベースのテキスト通信プロトコル|
|25/TCP,UDP|Simple Mail Transfer Protocol (SMTP) - メール配信プロトコル|
|80/TCP,UDP|Hypertext Transfer Protocol (HTTP)|
|110/TCP|Post Office Protocol 3 (POP3)|
|443/TCP,UDP|Hypertext Transfer Protocol over TLS/SSL (HTTPS)|
|465/TCP|SMTP over SSL|
|587/TCP|e-mail message submission(SMTP)|
|995/TCP|Post Office Protocol 3 over TLS/SSL (POP3S)|

[参照元：Wikipedia](https://ja.wikipedia.org/wiki/TCP%E3%82%84UDP%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%83%9D%E3%83%BC%E3%83%88%E7%95%AA%E5%8F%B7%E3%81%AE%E4%B8%80%E8%A6%A7)
iOS UIViewについての勉強メモ

# Apple公式

[iOS View プログラミングガイド(日本語)](https://developer.apple.com/jp/devcenter/ios/library/documentation/ViewPG_iPhoneOS.pdf)
[iOS View Controllerカタログ(日本語)](https://developer.apple.com/jp/devcenter/ios/library/documentation/ViewControllerCatalog.pdf)


# UIViewとUIViewControllerとは

## UIViewとは？
- 矩形領域を表示する機能を持ったクラス
- UIView をベースに様々な UI 部品用クラスが存在
- UIView およびそのサブクラスを使って画面を構築することができる

## UIViewControllerとは？
- Viewのライフサイクルの管理と画面遷移の機能を持ったクラス
- UIViewController をベースにしたクラスがあり複雑な画面管理や画面遷移をする機能を持っている

## 説明がわかりやすかったサイトの情報

[iOS アプリの構造がどのようになっているか紐解いてみる](http://d.hatena.ne.jp/glass-_-onion/20120507/1336320038)
→UIApplication,UIWindow,AppDelegateなどiOSアプリ構造が非常にわかりやすく記載されている

UIApplication →Eventはココで制御されている
　└UIWindow
　　└(UIViewController)
　　　└UIView


[iOS アプリの画面開発の基礎を理解する](http://d.hatena.ne.jp/glass-_-onion/20120601/1338477967)
→UIViewとUIViewControllerについて非常にわかりやすく記載されている


| iOSアプリ種類 | 説明 |
|:-----------|:-----------|
| Single View Application | 画面が1つだけのシンプルなアプリ |
| Utility Application | メイン画面と設定画面で構成されるアプリ |
| Master Detail Application | 一覧画面と詳細画面で構成されるアプリ |
| Tabbed Application | タブを使って複数画面を切り替えるタイプのアプリ |
| Page-Based Application | ページめくりを使うアプリ |


| 画面種類 | 説明 |
|:-----------|:-----------|
| リスト形式画面(Table View) | テーブルビューやコレクションビューを使ってリスト形式でデータを表示する画面 |
| ノーマルビューベース画面 | テーブルビューやコレクションビューを使わない画面 |


| 画面遷移種類 | 説明 |
|:-----------|:-----------|
| モーダル(Modal) | 画面の上に新たに画面を重ねていく画面遷移方法。重ねられた(下位にある)画面は新たに開いた画面が閉じるまで操作できない。一番上に表示されているユーザが操作可能なビューのことをモーダルビューと呼ぶ |
| ポップオーバー(Popover) | 画面の上に小さな画面を重ねて表示する。機能的にはモーダルと同じ。iPad で使用される |
| ナビゲーション(Navigation) | 階層構造のあるデータを詳細画面に掘り下げていく画面遷移方法。ドリルダウンと呼ばれることもある。テーブルビューとセットで使用することが多い |
| スプリット(Split) | 画面を2つの領域にわけて表示する。左側の項目を選択すると右側のページが切り替わる。iPad でナビゲーションの代わりに使用する。横向き(Landscape)と縦向き(Portrait)で表示が変わる。縦向きの時は右側の画面のみ表示され左側の画面はポップオーバーで表示する |
| タブ(Tab) | タブを使って画面を切り替える画面遷移方法 |
| ページめくり | 電子書籍などページをめくって画面を移動する画面遷移方法 |


UIKit framework
　└View Controller
　　└Navigation Controller
　　└Tab bar Controller
　　└Page View Controller
　　└Split View Controller
　　└Popover
Matlabでシンボリック計算の結果のファイル出力

当たり前だけど，型を変換してやらないといけない．

```matlab
% Jは何かの行列
fileID = fopen('J.txt','a');
for i=1:size(J,1)
  for j=1:size(J,2)
    fprintf(fileID, 'J(%i, %i) = %s;\n\n', i, j, char(J(i,j)))
  end
end
fclose(fileID);
```
iOS9で動的に挿入したvideoタグの挙動

# iOS9で動的に挿入したvideoタグが上手く動かない

iOS8まで動いていたコードのままにしていたらiOS9でvideoをうまく再生できなかった。
Youtubeは動いてるしうちのコードがおかしいのは間違いなさそう。

**つらい。**

ちなみに構成としては、ページのロード時にはvideoタグは配置せずに、サムネイル画像だけ置いておいて、クリックされたら適当なplaceholderと置換するかたちでvideoをDOM挿入する感じにしている。

## なんか色々試してみた結果

```js
// <video> を挿入したあと
video.oncanplay = function() {
  video.play();
};

video.load();
```

ってやったら動いた。
要するにiOS9からは自動的には動画を読みこんだりしないから手動で loadをする必要があるということだろうか。

動的にvideoタグを挿入しないならこういうことをしないでいいのかもしれない。

一応メモ書き程度に。
パスの最後のディレクトリ名・ファイル名を抽出する


シェルを書いているときに、最後のディレクトリ名が欲しいことがあったのでメモ。
「`/home/hoge/piyo`」というパス名があったとすると、最後の「`piyo`」だけを抽出したい。


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

DIR="/home/hoge/piyo"
str=`echo ${DIR} | awk -F "/" '{ print $NF }'`
echo ${str}
```

```:結果
$ ./hoge.sh
piyo
```

- `awk -F "/"`のところの`"/"`を変えれば、他の区切り文字などにも対応できる。
- `print $(NF - 1)`とすると最後から二番目の区切り位置の文字が抽出できる。（例だとhogeが抽出される）
- `print $1`で最初の区切り位置の文字が抽出できる。例だと最初の区切りには何もないので何も表示されない（`$1「""」`、`$2「"home"」`、`$3「"hoge"」`、`$4「"piyo"」`）

追記：
もっと簡単な方法を教えて下さいました。

```sh:
str=`basename ${DIR}`
```
zshでもgitの補完機能使えるようにする設定

## homebrew使ってzshをインストール
```
$ brew install zsh
```

## 補完定義ファイルの設置
```
$ mkdir ~/.zsh/completion/
$ cd ~/.zsh/completion/
$ curl -O https://raw.github.com/git/git/master/contrib/completion/git-completion.bash
$ curl -O https://raw.github.com/git/git/master/contrib/completion/git-completion.zsh
```

## `git-completion.zsh`を`_git`にリネーム
```
$ mv git-completion.zsh _git
```

## .zshrcに以下の記述を追加
```
fpath=($(brew --prefix)/share/zsh/site-functions $fpath)

autoload -U compinit
compinit -u
```

## `zcompdump`をリビルド
```
$ rm -f ~/.zcompdump; compinit
```
rbenvを使ったrubyインストール方法


## 依存パッケージをインストール
```
sudo yum -y --enablerepo=remi,epel  install libyaml libyaml-devel zlib zlib-devel readline readline-devel openssl openssl-devel libxml2 libxml2-devel libxslt libxslt-devel
```

## rbenvをインストール
```
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
```

## 環境設定
以下の2行を.bashrcに記述

```
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
```

.bashrc読み込み

```
$ source ~/.bashrc
```

## ruby-buildをインストール
```
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

## rubyのインストール
インストール可能なrubyのバージョンを確認

```
$ rbenv install --list 
```

rubyのインストール

```
$ rbenv install -v 2.1.2
```

## rubyのバージョンを変更
```
$ rbenv rehash
$ rbenv versions
$ rbenv global 2.1.2
```
docker run で IPを指定

# 課題

[nginx-proxy](https://github.com/jwilder/nginx-proxy) を使うときに、8080ポート、なおかつ localhost のみで受け入れるようにしたかった。

# 解決法

-p オプションは、受付IPアドレスを指定することができる。どうやらホスト名ではいけないようだ。

```
docker run -d -p 127.0.0.1:8080:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy
```

コロンが沢山でちょっと違和感ね。

# 参考記事

- [run](https://docs.docker.com/reference/commandline/run/)
- [nginx-proxyによるマルチドメイン環境](http://qiita.com/sigelinde/items/95c154dc807a4bbc9cf0)
SourceTree使用git忽略内容配置


```
*~
.DS_Store
# 排除build目录
build/*
# Exclude temp nibs and swap files
# 排除nib临时文件和交换文件
*~.nib
*.swp
# 排除OS X的文件夹显示属性目录
.DS_Store
# 排除xcode3 xcode4的用户自定义设置文件
*.mode1
*.mode1v3
*.mode2v3
*.perspective
*.perspectivev3
*.pbxuser
*.xcuserdata
*.xcbkptlist
*.xcuserstate
*.xccheckout
*.xcuserdatad
# 排除二进制文件
*.nib
```
插件安装不起作用



1． “Control+空格”启动Spotlight，输入“终端”查找终端程序，打开”终端”后输入下面代码并回车（是为了显示隐藏的文件夹）：defaults write com.apple.finder AppleShowAllFiles -bool true

2． 点击Finder菜单栏的“前往”（在上面）选项，选择“个人”，再选择“资源库”文件夹（是雾色的哦，因为是隐藏文件夹），之后依次进入以下路径：Applcattion Support -> Developer -> Shared -> Xcode -> Plug-ins，删除里面的VVdocumenter-Xcode.xcplugin文件

3． 此时再重新安装VVdocumenter,重启Xcode, 会弹出窗口提示,点击”Load Bundle”(记得应该是这么写的,反真是”Skip Bundle”旁边的)按钮就可以了

4． 最后记得进入终端输入以下代码隐藏文件夹：defaults write com.apple.finder AppleShowAllFiles -bool false
rubyのクローラー”anemone”でローカルに保存したhtmlファイルを呼び出そうとした時にはまったこと

オフラインでも開発を継続してできるように、ローカルのファイルをクローリングできるようにしたときにanemoneで同じようにやろうとしてはまったこと


結論からいうと、anemoneはHTTPリクエスト以外の場合では正常に動作しないとのこと。よく考えてみればanemoneってwebクローラーだったし、当たり前のことなんだけど、、


ローカルファイルをクロールするには、anemoneを使う必要はない。anemoneのgemをインストールした際に一緒にインストールされるnokogiriを利用すれば問題なし。nokogiriを使ったクローリングについては

http://www.nokogiri.org/tutorials/parsing_an_html_xml_document.html


このURLに書いてある。英語のドキュメントだけど、タイトルに[ FILE ]とかあるからだいたいどこ見ればいいかはわかると思う。

てことでオフラインでも好き勝手開発できるようになった。あまりニーズはないかもしれないけど、すごく困ったので書いてみた。

この辺を多少冗長な部分があるけど、唯一わかりやすく解説してくれているのは以下のリンク。

[Project Name : 周りに勧められてスクレイピングなるものをしてみたいけど何すればいいのかわからなかったあの日の自分へ](http://vsanna.sakura.ne.jp/wp/2015/01/scraping_start_up/)


#やり方




間違っている点、修正したほうがいい表現などがあったらどんどん編集依頼を送っていただけたらとても嬉しいです。

* * *
#以下、注意点

## ①ローカルファイルを「File.open(パス)」で指定するだけではダメ

というのも、nokogiriでスクレイピングする際には「xpath」という手法を使うのですが、そのためにはnokogiriのメソッド、またはanemoneのメソッドで呼び出したファイルしかその手法を活用できなかった。

もちろん、ローカルファイルの呼び出しにはfile.open使わなきゃいけないんだけどそのあとにnokogiriで使える形にするために１ステップコーディング

```lang:test.rb
require "nokogiri"
file = File.open("test.html")
doc = Nokogiri::HTML(file)
```

xmlファイルならば「html」と書いてあるところをすべて「xml」で書き換えれば問題なく利用していくことはできる。

ちなみに、nokogiriの使い方については、日本語のサイトはたいていよくわからないので公式ドキュメントを読みましょう。（よくわかんないメモ書きみたいなのを更新してる俺が言うのもなんだけど笑）

[nokogiri.org](http://www.nokogiri.org/)

##　②もちろん、「file:///パス」でいくのもダメ

これはブラウザからローカルのファイルにアクセスするときに、よび出す書き方なんだけど、もちろんこれもダメ。

ブラウザでからアクセスできるが、これはfileプロトコルというものを活用しているのでなんかややこしいことになるからアウト。

これだと、通信プロトコルを使っているからanemoneでクローリングすることは可能。ただ、HTTPプロトコルで通信しているわけではないから色々問題が生じて、結局xpathで指定はできなかった。よびだせるけど、「InvalidURIError」って出てきてxpathで読み込むための形まで変換できないことが原因みたい。（正確なことはわからない）
Swift 2.0 で追加された guard のいいところ

記事の内容はこちらを参照してください。
https://mishimay.github.io/75fb0958f33079ff0e8a/
<!--

メソッドのはじめに引数の有効性をチェックして、もし不正な値だったらreturnする、というようなコードが書きやすくなる構文です。

```swift
func show(message: String?) {

    // messageがnilだったらreturnする
    guard let theMessage = message else { // (1)
        return // (2)
    }

    print(theMessage)
}
```
(1) messageをアンラップ (messageがnilでなければtheMessageに値が入る)
(2) messageをアンラップできなければ (messageがnilなら) return


# いいとこ1: guard文でアンラップした変数を後で使える

よくある `if` 文でnilチェックする方法だと、nilチェックの後にオプショナル変数をアンラップする必要が出てきます。

```swift
func show(message: String?) {
    if message == nil {
        return
    }
    let theMessage = message! // ここ
    // ...
}
```

```swift
func show(message: String?) {
    if message == nil {
        return
    }
    if let theMessage = message { // ここ
        // ...
    }
}
```

`guard` を使えばアンラップとnilチェックを同時に行え、アンラップされた変数はguard文を抜けた後でも使用することができます。

```swift
func show(message: String?) {
    guard let theMessage = message else {
        return
    }

    print(theMessage) // アンラップした変数を使うことができる
}
```

# いいとこ2: guardの条件に合わなかったらすぐにスコープから抜けることが保証される

guard文の `else` 節の中では、以下のいずれかを行わないとコンパイルエラーになります。

1. `noreturn` アトリビュートの付いた関数 (e.g. プログラム終了) を呼ぶ
1. 以下のいずれかを書く
  - `return`
  - `break`
  - `continue`
  - `throw`

よって、チェックに引っかかったけど `return` を書き忘れて処理が続行される、といううっかりミスがなくなります。

# 参考
http://furuya02.hatenablog.com/entry/2015/08/15/102224
https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Statements.html#//apple_ref/swift/grammar/guard-statement


-->
コマンドラインからphpを実行する時にmemory_limitを指定する


```bash
php -f ./useMemory.php -d memory_limit=2048M
```

書き方はこれでいいんだが、この

memory_limit=2048M

のイコール記号の前後にスペースが入ってると動かねえからな、よろしく。
SSHを許可するYamaha製ルーターの動的ファイヤーウォール設定

http://www.rtpro.yamaha.co.jp/RT/docs/firewall/
親切なんだけど、なんとなく分かりにくいYamahaのドキュメント……。

このドキュメントを読んだ時のメモ。NVR500しか持ってないので、それでしか検証していない。

# IPマスカレード

22番をそのまま使うと辞書攻撃みたいなのでログが埋まって鬱陶しいので、8888番とかに変更する。が、サーバー側も8888番とかにすると、今度はSELinuxがうるさいので、サーバー側は22番にしたい。こういう時には、IPマスカレードのポートに

```
8888=22
```

という書き方ができて、こうすると8888番への接続は22番へNAPTされる。NAPTって書いて欲しい。IPマスカレードってあまり周りでは聞くことが少ない単語なんですが……。宗教的な話ですかね……。

# 静的フィルタ

プロトコルに

```
tcpflag=0x0002/0x0017
```

と書くことができる。これでセッション開始時のパケットだけを許可、というルールが書ける。TCPパケットのヘッダの、SYNとSYN/ACKのビットが立っている、という話。

# 動的フィルタ

SSHというサービスが選べる。たぶん一定以上のリビジョンでのみ。無ければリビジョンアップしたほうがいいと思う。

# まとめ

最初のが通れば、あとは動的フィルタがうまいこと戸を開け閉めしてくれる、というわけ。`iptables`でもおんなじ感じで書いたような記憶がある。
リモートワーク中の不便を解消するためのツール一覧


## Sqwiggle

言わずとしれた、	`an always-on online workplace for your remote team to work together throughout the day and feel more connected` を謳う常時接続型のテキストチャット&ビデオチャットアプリ。

リモートワーカーだけで構成されるチームだと、これを常時起動しておくことで

* お互いに仕事してる感を共有したり、
* 必要なときにすぐビデオチャットで会話できたり、

して便利。ただ、オフィスワーカー・リモートワーカー混成チームだとうまくいかなかった。
オフィスワーカーがSqwiggleを起動しておくメリットがなく、次第に起動しなくなってしまったため。

## Screenhero

音声、動画、画面共有を実現してくれるサービス。コードレビューやペアプロに便利。

https://screenhero.com/

いつの間にかSlackで `/hero @Slackユーザ名` と発言するだけで、画面共有のセッションを開始できるようになってて便利。
## Asana

## Meldium

## SizeUp

オフィスだとお互いに様子が伺える場所で働いたりするが、リモートワークでそういう環境をつくるためにSqwiggleやSlackなどを使ったりする。いずれにしても、SlackやSqwiggleを頻繁に確認して、メンションやビデオチャット要求がきたらすぐに応答するくらいでないと、オフィスでの円滑なコミュニケーションの代替にはならない。

そのため、あまり集中力がいらない作業中などは、

* Chrome
* iTerm2
* Slack
* Sqwiggle

を画面分割で表示したりすることで、できるだけコミュニケーションをとりやすい状態にする。
プログラミングなど集中を要する作業を行うときは、この限りではない。

## Alfred

### Alfred + Google Calendar

今日の予定を見える化するためにGoogle Calendarを使いたいが、予定が変化するたびにGoogle Chromeを開いて、トラックパッドをポチポチして予定入力・・・というのは面倒すぎた。
そこで、Alfredから予定を入力できるようにした。

### Alfred + Redmine

「隣の人が何してるかわからない」問題がリモートだとより顕在化するので、自分がやろうとしていること、やっていることをとにかく常に共有するようにしたい。
今の職場ではイシュートラッキングのために主にRedmineを使っているが、何か作業を予定するたびにChromeでRedmineのチケット作成ページを開いてタイトルや説明を入力して・・・というのは面倒。そこで、Alfredから

## 日報

今勤めている会社では元々、部署を超えて誰が何をやっているのかをオープンにするため、日報を書く文化がある。日報を見ると、場所にとらわれずにその人が一日何を予定していて、結果がどうだったか、そしてどういう感情を持ったかがなんとなくわかる。リモートワーカーを含むチームでの情報共有にオススメ。後述のWorkingOnとかぶる部分もあるが、日報はよりマネジメントよりの人が読んで、WorkingOnが送るサマリーはより現場よりの人が読むとメリットが大きい印象。

## WorkingOn

朝会(朝のスタンドアップミーティングなど)に代わるツールとして使われていたりする[WorkingOn](https://www.workingon.co/)を使って、リモートワーカーを含むチームでの情報共有を行う。

オフィスで働いているときは、独り言やプロジェクトメンバー間の会話が他のメンバーにも聞こえるため、だいたい誰が何をやっていて、何に困っているのかわかっていた。
リモートだと、明示的にSlack上でコミュニケーションをとっている人同士の会話を能動的にきかないと誰が何をやっているのかわからなくなってしまう。しかし、そのためには自分の業務と少し離れたプロジェクトのチャンネルをずっと張っている必要がある。そして、知りたいのは「大体何をやっているか」であって、細かい仕様の話などは読む必要はない。でも、実際には全て読んで読み手側で咀嚼しないと「大体何をやっているか」がわからない。これだと、リモートワークの結果だれが何をやっているのか大体知るためにより時間がかかるようになってしまっている。非効率。そこで、リモートのときは誰がだいたい何をやっているのかを常に共有するようにする。
しかも、ただ「誰がだいたいなにをやっているかを常に共有」するだけだと、共有する側のコストが増えてしまうだけ。共有するコストを増やし多分、他のコストを減らしたい。そこでWorkingOnを使う。

WorkingOnはで何をやっているのかを常に共有しておくと、日報に書くべきことが自然にWorkingOnに記録される。そのため、日報を書くような文化がある会社であれば、WorkingOnによって日報を書く時間を減らせるかもしれない。また、日報の内容によっては、WorkingOnへの常時投稿&WorkingOnによるデイリーサマリーメールで代替できるかもしれない。日報はよりマネジメントよりの人が読んで、WorkingOnが送るサマリーはより現場よりの人が読むとメリットが大きい印象なので、両立させてもよいかもしれない。

### WorkingOn + Alfred

前述のWorkingOn + Sqwiggle連携や、日報、本来の趣旨である「何をやっているのか・何に困っているのか」の共有のためにWorkingOnは使いたい。しかし、自分の状況を共有しようとするたびにChromeを開いたりするのはいかにも面倒。もっと気軽に状況を共有したい。そこで、Alfredから簡単に状況を共有できるようにした。

### WorkingOn + Sqwiggle

「ちょっとこの人と話したい」というのがリモートだとしづらくなる。それを防ぐために、SqwiggleでBusy状態になっていないときはいつでも話しかけてよいことにする。そういう運用にするためには、裏を返すと、状態をSqwiggleのUI上でポチポチして更新するようにしなければならない・・・だとつらすぎるので、WorkingOnのIntegrationを使う。

これはWorkingOnに最初から用意されている機能で、ステータスに `*b* を付与するとSqwiggle上で自分がBusy状態、`*a* を付与するとAvailable状態にしてくれる。これで、Sqwiggleの画面をポチポチしなくてもWorkingOnやAlfredから常に「今話しかけて良い状態か」をSqwiggleに反映させることができ、開発者の生産性をあまり落とさずに、「ちょっと話したい」を実現できる。
CakePHP2 命名規則


CakePHPの命名規則のメモ


## 条件

CakePHPver2.6.10

1.cakePHPディレクトリ名：cake
2.アプリケーション名：testapp
3.アクション名：action
4.テーブル名　：tables

http://localhost/cake/testapp/action/
http://localhost/[cakephpディレクトリ]/[アプリケーション名]/[アクション名]/

## 命名規則

### CakePHP
ファイル、フォルダ名はキャメル記法を使用

### Controller

- ファイル名：[アプリケーション名]Controller.php → TestAppController.php
- アクション記載：```function [アクション名](){} ``` → ```function action(){} ```

``` app/Controller/TestAppController.php
<?php
App::uses('AppController', 'Controller');
class TestAppController extends AppController {
    function action(){//アクション名
    }
}
```

### View

- フォルダ名：[アプリケーション名] → TestApp
- ファイル名：[アクション名].ctp → action.ctp

``` app/View/TestApp/action.ctp
//表示させるものを記載
<html>
  <head>
    <title>action Page</title>
  </head>
  <body>
    <h1>action Page</h1>
  </body>
</html>
```

### Model

 - ファイル名：[テーブル名※1].php → Table.php
 - ファイル名：[テーブル名]Controller.php → TablesController.php

``` app/Model/Table.php
<?php
App::uses('AppModel', 'Model');
class Table extends AppModel { 
}
```
``` app/Controller/TablesController.php
<?php
App::uses('AppController', 'Controller');
class TablesController extends AppController {
    public $scaffold;//値確認用
}
```
テーブルにアクセスし中身を確認
http://localhost/cake/tables/

※1
テーブル名が複数系の場合は、単数系に
 → tables → Table.php
"_"の後の文字は大文字
 → sample_tables → SampleTable.php
 

## 参考 

about COC 
https://ja.wikipedia.org/wiki/%E8%A8%AD%E5%AE%9A%E3%82%88%E3%82%8A%E8%A6%8F%E7%B4%84
 
CakePHP2 プログラミング入門
http://libro.tuyano.com/index2?id=734001
Sublime Text: Word Wrap（行末折返し）の切替にショートカットキーを割り当てる


# ゴール
ショートカットキーひとつでword wrap: toggle コマンドを動作させる

# 方法
"Preferences" -> "Key Bindings -- User"をクリック
キーバインディング設定のJSONファイルが出てくるので以下の要素を追加します

```json:Windows,Mac共通
{ "keys": ["ctrl+shift+w"], "command": "toggle_setting", "args": {"setting": "word_wrap"} }
```
中括弧のなかにいれましょう。
すでに要素が入っている場合は前の要素にカンマをつけてこれを次の行に入れましょう。

※この部分編集リクエスト歓迎です。

これを追加すると`ctrl+shift+e`で行末折り返しができます。

#参考
https://sublimetext.userecho.com/topic/19595-has-the-command-to-toggle-word-wrapping-been-implemented-yet/
Android 6.0のFloating ActionModeに対応する必要があるもの/ないもの

## Floating ActionModeとは

iPhoneみたいに、長押ししたそばにコピペのオペレーションメニューがポップアップで出る
機能です。
（どうやってアップルの特許を回避したのかが、個人的には気になりますね・・・ｗ）

![Floating ActionMode](https://developer.android.com/images/android-6.0/text-selection.gif)
[https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-text-selection](https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-text-selection)から引用

リファレンスによると、「startActionModeの第二引数でActionMode.TYPE_FLOATINGを指定せよ」みたいなことが書いてあります。

## 通常のTextViewは特に対応不要

> Editor: Turn on Floating Toolbar Action Mode for Text Selection
> https://android.googlesource.com/platform/frameworks/base/+/b8ed5b75da7b48e3f5c40cd9bae1d29fd5a8db9b%5E%21/core/java/android/widget/Editor.java

これのおかげで、特になにもActionModeにカスタマイズをしていないTextView（もしくはそれを継承したクラス）は、かってにFloating ActionModeがサポートされます

## WebViewは・・・

TextViewじゃない、自前実装でもないテキストは、だいたいWebViewですが、
10/9現在、最新の「AndroidシステムのWebView」を利用しても、Floating ActionModeにはなっていませんし、Floating ActionModeを独自で使う、ということもおそらくできません。

[Android] Supporting floating select ActionModes for web content

> Add floating toolbar support for web content selections.
> BUG=389153
> Review URL: https://codereview.chromium.org/1242613002
> 
> https://chromium.googlesource.com/chromium/src.git/+/98a1a3a17168e4b61e723dc973dad81c1190d78a%5E%21/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java

ただ、じつはFloating ActionModeに対応することじたいは、もう対応が入っています。
![ContentViewCore.java.jpg](https://qiita-image-store.s3.amazonaws.com/0/74571/0a395ef1-8113-8062-7f21-315a105ab705.jpeg)

しらべてみたところ、Chromium 46くらい（上のスクリーンショットは48ですがｗ）でマージされているのに対し、10月9日現在世の中に出回っているAndroid WebViewはchromium **45**！

つまり、もうしばらくしてAndroidシステムのWebViewが46にアップデートされれば、なにもしなくても、WebViewのテキストもFloating ActionModeをサポートするようになります！


## 結論

変なカスタマイズを作りこもうとせず、気長に待つのが一番です！


　
　
## 補足（2015/10/21　追記）

とかいってたら、Chrome 46がリリースされましたね。
http://googlechromereleases.blogspot.jp/2015/10/stable-channel-update-for-chrome-os_20.html

Floating Action Modeが使えるようになってました。
![Screenshot_20151021-192318.png](https://qiita-image-store.s3.amazonaws.com/0/74571/411b058f-e945-3665-15b8-bb1143660746.png)
よりよい名付け親になるために

# 名前が適切か問題
コーディングをしていていつも悩むのが，この変数名/関数(メソッド)名/クラス名で良いのだろうか?という問題

日本語分かる人しかいない!と開きなおって日本語名を付けてしまうのも，状況によってはアリだとは思いますが，先のことは分からないのでなるべく英語でそれっぽい名前付けをしておきたいものです．

とはいっても細かいニュアンスとかわからないし，そもそも語彙が少ないので毎度辛い思いをしてるので，自分はこんな感じでやろうとしてるというまとめ．

## 名前をぼやっと考える
たとえば初期化処理に名前をつけようとすると，だいたい`init`とか`initial`とか出てきちゃうわけですが，どれもこれも同じように命名すると余計にわかりにくくなってしまいます．

そこでおもむろに，[Thesaurus.com](http://www.thesaurus.com/browse/initial) で類語を検索

http://www.thesaurus.com の良いところは，意味が似ているものの順に色付けしてくれる点
![image](https://qiita-image-store.s3.amazonaws.com/0/18974/00860d8d-243a-14ff-1966-222bfadefa30.png)

また，反意語も同時に出してくれるので，対称性のあるメソッドを作りたいときなどは参考になります．

## 選んだ単語の用例を知る
単語が分かっても適切な使い方(文法や慣例など)をしなければ余計にわかり辛くなってしまうもの．
そこで，[英辞郎](http://eow.alc.co.jp/search?q=initial)で検索

普通の辞書と違うところは，用例が豊富に出てくるところ．
用例がより多く出てくる = 頻繁に(より一般的に)使われているはず なので，単語選びのために http://www.thesaurus.com と行ったり来たりしながらよりしっくりくる単語を選びます．

## 名前をつける
あとはもう．．．勘です．

英辞郎をはさむことで，明らかに一般的じゃなさそうな単語は避けることができます(主観)し，語彙も増えていってる気がするとかしないとか．

--- 

あとは．．．接続詞(`at`とか`on`とか`by`とか...)には気をつけたいところですが，なかなか適切なものを選ぶのは難しいですね．
pandas で Amazon RDS (PostgreSQL) のデータを SQL を使ってとってくる

# 問題

Pandas でデータを扱いたいので、pandas のメソッド read_sql を
Amazon RDS (PostgreSQL) から取ってきたい。


# 解決策

## インストール
sqlalchemy, padas を入れる

```
pip install -U sqlalchemy pandas
```

## サンプルコード

```
import sqlalchemy 
import pandas

## DB Connection configuration
username = "USERNAME"
password = "PASSWORD"
endpoint = "ENDPOINT"  # something like amazonaws.com:5432
dbname   = "DBNAME"

## Connect to Db
con = sqlalchemy.create_engine("postgresql://%s:%s@%s/%s" % (username, password, endpoint, dbname))


## Get Data
data = pandas.read_sql("YOUR_SQL", con)
print(data)
```
Tornado入門（１）：TornadoではじめるPythonWebフレームワーク

# はじめに
本連載では、Python上で動作するWebサーバ&WebアプリケーションフレームワークであるTornadoでアプリケーション開発を行う方法について紹介します。本連載で扱う内容は、次のとおりです。

* Tornadoの特徴
* Tornado利用のための環境設定手順
* Hello, Worldアプリケーションの作成
* データベースと連携したアプリケーションの作成
* その他、役立つTornado関連のテクニック

　導入の今回は、まずTornadoの特徴と環境設定手順、「Hello, World」アプリケーションの作成までを紹介します。

# 対象読者
* PythonによるWebアプリケーション開発に興味がある方
* Pythonを触ったことがある方
* Webアプリケーションの開発をこれから学ぶ方、もしくは学び始めたばかりの方

# 必要な環境
* Python 2.6 以上
* Tornado 4.2

# Tornadoについて
今回紹介するTornadoは、Apache Licence 2.0に基づくオープンソースのノンブロッキングなWebサーバ&Webフレームワークです。TornadoはFriendFeedによって開発され、Facebookに吸収されたのちにオープンソース化されたフレームワークで、以下のような特徴があります。

* ノンブロッキングI/O
* リアルタイム性
* シンプルなテンプレート
* シングルスレッド、シングルプロセス

Djangoがフルスタック型のフレームワークなのに対して、Tornadoは自分で必要なコンポーネントを組み合わせていくタイプのフレームワークとなっています。
　Tornadoは非常に多機能で、本家ドキュメントも充実しています。対照的に日本語情報は少ないのですが、活用できれば大いに役立つことと思います。

# Tornadoを使ってみよう！

## インストール
インストールは以下のようにpipで行います。

```shell-session
$ pip install tornado
```

## Hello World
以下は公式のHello Worldのコードです。最小限の記述しかされていない短いコードですがちゃんと動きます。

```py:app.py
import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

application = tornado.web.Application([
    (r"/", MainHandler),
])

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.current().start()
```

上のコードをapp.pyという名前で保存してから以下のように実行してみてください。

```shell-session
$ python app.py
```

ローカルホストの8888番（[http://localhost:8888/](http://localhost:8888/)）にアクセスして、以下のようなHello Worldの文字が表示されれば成功です。
![スクリーンショット 2015-10-13 0.11.50.png](https://qiita-image-store.s3.amazonaws.com/0/77079/200150fc-aca4-218c-e029-12332d183706.png)

# コードの解説
app.pyの中で重要な以下の２点を解説していきます。

* RequestHandler
* Applicationオブジェクト

## RequestHandler
RequestHandlerクラスはHTTPリクエストを処理するための基底クラスです。実際のリクエストを処理するためには、RequestHandlerクラスのサブクラスを作成する必要があります。以下のコード片を見てみましょう。

```py
class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")
```
　このコード片では、RequestHandlerクラスを継承してMainHandlerクラスを作っています。リクエストを扱う際には、TornadoはこのMainHandlerクラスをインスタンス化し、リクエストのHTTPメソッドに対応したメソッドを呼び出します。この例では、getメソッドだけ定義しているので、HTTP GETリクエストにのみ対応できます。getメソッド以外には、POST、DELETE、PUTなどに対応した、post, delete, putメソッドなどがあります。
　このようにHTTPリクエストの種類に応じて、処理するメソッドを自動的に切り分けられるので、一つのメソッドをシンプルにすることができます。

## Applicationオブジェクト
Applicationオブジェクトは、アプリケーション全体の設定をするために使われます。

```py
application = tornado.web.Application([
    (r"/", MainHandler),
])
```
　このコード片ではApplicationクラスのインスタンスを作成しています。重要なことは、Applicationインスタンスを作成する際に引数としてタプルのリストを渡すことです。このタプルにはURLとハンドラの対応を記述します。これにより、どこのリクエストに対してどのハンドラで処理をするのかということをTornadoに教えています。上の例の場合、"[http://example.com/](http://example.com/)"にアクセスした時にはMainHandlerで処理を行うということを示しています。仮にr"/hoge/"と記述していた場合は、"[http://example.com/hoge/](http://example.com/hoge/)"にアクセスする必要があります。

# 参考資料

* [（英語）Tornado公式ドキュメント](http://www.tornadoweb.org/en/stable/index.html)
* [（英語）Tornadoアプリケーションの構造](http://tornadokevinlee.readthedocs.org/en/latest/guide/structure.html)
* [（英語）tornado 4.2.1 : Python Package Index - PyPI](https://pypi.python.org/pypi/tornado)


<!--
## IOLoop
このクラスのインスタンスを作成・実行した後から、TornadoがHTTPリクエストを受け付けられるようになります。
-->
Python 標準パッケージ だけで wav ファイルを読み込む

# 問題
`scikits.audiolab` とか `numpy` とかの Python 追加パッケージを
入れられない状況で、 wav ファイルを読み込みたい。

# 解決方法

`wave`, `array` で読み込む。

```
import wave
import array

wavdata = wave.open(YOUR_WAV_FILE).readframes(-1)
audio = array.array("h", wavdata)   # wav のビット幅が 16bit の場合
```
Python - Ubuntu14.04にpsycopg2をインストールする手順

 
 Pythonからpostgresに接続するためにpsycopg2をインストールしようとした時につまずいたのでメモ

#### 環境
* OS... Ubuntu14.04
* Python... Python 3.2.3

#### インストールコマンド

```
sudo pip install psycopg2
```

#### エラーメッセージ

```
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-47ldcn/psycopg2
```

#### 対応
以下のパッケージが不足していたようなのでインストール

```
sudo apt-get install -y python3-dev
sudo apt-get install -y libpq-dev
```

再度インストールしたらうまく動作しました

#### ※参考
http://makaaso.hatenablog.com/entry/2015/10/07/105458
Pythonで短縮URL的な文字列を出す

元ネタどこか忘れたけど、どこかに落ちてたRubyかなんかのコードを移植。

```py
# -*- coding: utf-8 -*-

"""
convert_tableは、文字のリスト。
このリストを使って基数変換する。
リストの長さが62だったら、62進数に変換する感じ。
intは、10進数で入れる。
"""

import math


def string_to_int(target, convert_table):

    def char_to_int(char):
        return convert_table.index(char)

    int_result = 0
    target = [char for char in target]
    target.reverse()
    for index, char in enumerate(target):
        int_result += char_to_int(char) * int(math.pow(len(convert_table), index))

    return int_result


def int_to_string(target, convert_table):

    def int_to_char(int_value):
        return convert_table[int_value]

    string_result = ""
    while target > 0:
        string_result = int_to_char(target % len(convert_table)) + string_result
        target /= len(convert_table)

    return string_result


def generate_convert_table():
    convert_table_base = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
    convert_table_base_list = list(convert_table_base)
    import random
    random.shuffle(convert_table_base_list)
    return "".join(convert_table_base_list)
```
jSでラジオボタンの制御

JavaScriptで複数のラジオボタンを連動させる記述。

##いいえを選択すると下のラジオが受付不能になります


[DEMO](http://jsdo.it/tonkatsu_tanaka/2sPN)


##記述

```html:html
<article>
	<header><h1>いいえを選択すると下のラジオが受付不能になります</h1></header>
	<section class="checkbox_area">
		<p>血液はありますか？</p>
		<form action="xxxxxx" method="post" name="frm_yesno">
		<div><input type="radio" id="in_yesno1" name="q[1]" value="1" onclick="rCheck('1')">はい</div>
		<div><input type="radio" id="in_yesno2" name="q[1]" value="0" onclick="rCheck('0')" checked>いいえ</div>
		</form>

	</section>
	<section class="btn_area">
		<p>では何型ですか？</p>
		<form action="xxxxxx" method="post">
		<div><input type="radio" name="type_blood" id="r_btnA" value="a">A型</div>
		<div><input type="radio" name="type_blood" id="r_btnB" value="b">B型</div>
		<div><input type="radio" name="type_blood" id="r_btnO" value="o">O型</div>
		<div><input type="radio" name="type_blood" id="r_btnAB" value="ab">AB型</div>
		<div><input type="radio" name="type_blood" id="r_btnA" value="unknown" disabled="disabled">不明</div>
		</form>

	</section>

</article>

```

```js:javascript
function rCheck(chkID) {
	var array = ['r_btnA', 'r_btnB', 'r_btnO', 'r_btnAB'];
	for (kay in array){
		var r_btn = document.getElementById(array[kay]);
		if(chkID == '0'){
			r_btn.setAttribute('disabled', 'disabled');
			r_btn.checked = false;
		} else {
			r_btn.removeAttribute('disabled');
		}
	}
}
window.onload = function(){
	var array = ['in_yesno1', 'in_yesno2'];
	var ynFlag = '1';
	for (kay in array){
		var r_btn = document.getElementById(array[kay]);
		if(r_btn.checked){
			ynFlag = r_btn.getAttribute('value');
			break;
		}
	}
	rCheck(ynFlag);
};
```
Swiftでネット上の画像を表示する(SDWebImage)

## したいこと
アプリのコードを変えずに、アプリ内で画像を表示させたい
[SDWebImage](http://cocoadocs.org/docsets/SDWebImage/)というのが定番らしいので使ってみる。

## 準備
### CocoaPodsをinstall
[CocoaPods](https://cocoapods.org/)
macならrubyが入っているので
```
$ sudo gem install cocoapods
```
するだけ。
### PodfileをかいてSDWebImageを導入する
```
$ pod init
$ vim Podfile
```
```
target 'hoge' do
  platform :ios, '8.0'
  use_frameworks!
  pod 'SDWebImage', '~>3.6'
end
```
swiftで使うには use_frameworks!って書いて、
platformは8.0以上にする必要がある。
（よく見たらinitしたところのコメントにもそう書いてあった。swiftの人はここのコメント外せって）
http://qiita.com/taketin/items/8264aeebc5a626c6d48f

```
$ pod install
```
![resulet](https://i.gyazo.com/b48153f0b69e2fad6f3389c99fd0e040.png)


## コード
### Projectの開き直し
インストールしたPODを使うために、projectname.xcodeprojではなくprojectname.xcworkspaceでプロジェクトを開く。すでにXcodeを開いている場合にはここで開き直しする。
![xcodeworkspace](https://i.gyazo.com/3c584ad6d7ca9db2dabf4925ffbad0c9.png)


### Bridgin-Headerファイルを作ってSwiftでSDWebImageを使えるようにする

"File" -> "New" -> "File" -> "Header File"
ファイル名は　project名-Bridging-Header.hってするらしい。

```objc:SDWebImageTest-Bridging-Header.h
#ifndef SDWebImageTest_Bridging_Header_h
#define SDWebImageTest_Bridging_Header_h

#import <SDWebImage/UIImageView+WebCache.h>

#endif /* SDWebImageTest_Bridging_Header_h */
```

Build SettingのSwift Compillerに、bridgeファイルをつなぐ。
Objective-C Bridging Headerのところにファイル名を入力。
![SDTest_xcodeproj_と_sticker_—_bash_—_80×24.png](https://qiita-image-store.s3.amazonaws.com/0/32555/518626dc-6553-caac-0bd4-9fb9be0011aa.png)


Buildしてみたところ、そんなヘッダーないよって怒られたので
project名を追加したところbuildが通った。

### storyboardにImageViewを配置する
![ImageView配置](https://i.gyazo.com/1207eb4663b08317bb6f7acf99ff7531.png)

### storyboardのImageViewをViewControllerで使えるようにする
Controlを押しながら、ViewControllerにImage Viewをドラッグ。
![ViewController_swift_—_Edited_と_Main_storyboard_—_Edited.png](https://qiita-image-store.s3.amazonaws.com/0/32555/5cdfbbfc-f5b7-f6b4-28d4-f3355b7abd6f.png)
コードの番号のよこに丸ポチがついて、コードが挿入される。
```
    @IBOutlet weak var Image: UIImageView!
```

### ViewController

```ViewController.swift
import UIKit
import SDWebImage

class ViewController: UIViewController {

    @IBOutlet weak var Image: UIImageView!
    override func viewDidLoad() {
        super.viewDidLoad()
        let imageURL = NSURL(string: "https://i.gyazo.com/90f50b5c0d1aa8c0b3cd0170e72ec601.png")
        Image.sd_setImageWithURL(imageURL)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }


}
```

できた
![simulator img](https://i.gyazo.com/8bbabbb696f96ac6165871dbfeb3e779.png)
[IDE] 学生って最高じゃないか（歓喜）-各種言語対応IDEを無料で頂く-

学生は有料ソフトウェアを少し安めに入手できる…という夢のような価格設定をされたパッケージ「アカデミック版」は現在多くのソフトウェアで提供されていますが、このIDEは少し安めなんて話じゃありません。
**無料、100%OFF、実質1万円引き×12です**
しかもネットでの評価も高いJetBrains製のIDEが使えます。

#JetBrains様様
学生プログラマが最初にインストールするIDEとして名高いeclipseやnetbeansなどの無料IDE。
それらも優秀ですが効率のいいプログラム開発にはより質の高いIDEを使いたいものです。

特に（習い始めの私が感じた問題点ですが）C言語をIDEで開発していると*複数のmain関数を共存させられない*というのがありました。
簡単なプログラムをたくさん作るのでこの仕様がめんどくさい。できるならIDEの便利な即時実行をファイル単位でできればいいのに！ってずっと思いながら渋々フリーのテキストエディタを使っていた時期もありました。

そこで見つけたのがJetBrains社のホームページ。学生は要チェックです。
https://www.jetbrains.com/student/

なんと購入US\$99、アップグレード（だいたい年一らしい）US\$59もする（学生には）お高いIDEたちが12個**全部無料**で入手できるんです！（クロスプラットフォームなのでOSの心配無用！）

##主な開発対象
* Java
* .NET
* C/C++
* PHP
* HTML/CSS/Javascript
* OS X/iOS
* Android
* Ruby/Ruby on Rails
* Python/Django

#入手方法
1. 画面中央の"Apply Now"をクリック。
![](https://qiita-image-store.s3.amazonaws.com/0/94904/5daede88-7dc5-93c4-fb4c-b9649678ca58.png)

1. 申請フォームに記入（大学発行のメールアドレスがあるとすごく楽です）。
![](https://qiita-image-store.s3.amazonaws.com/0/94904/b78256f5-5802-f361-fd59-c3a372a0ebc8.png)

1. メールアドレスに届いたリンクをクリックして本登録する。

1. これ全部ゲットできます。
![](https://qiita-image-store.s3.amazonaws.com/0/94904/1fff83bc-fda1-0593-df54-0bef982d27cd.png)

**もちろん商用利用はNGです！**

#CLionとかいう神IDE
この中に"CLion"というC/C++IDEがあります。
CLionはビルドにCMakeというソフトを採用していて、プロジェクトのルートにあるCMakeList.txtをいじることでファイル単位でビルドをすることができ、何よりそれが*簡単です*。
（CMakeList.txtの表記法は割愛。）
IDEのビルド機能を合わせればコンパイルとデバッグのたびにターミナルやコマンドプロンプトとウィンドウを入れ替える必要もありません。
これで大量のmain関数を生産する学生プログラマならではの悩みも解消されますね（笑）
インスタンスなしでジェネリックタイプにタイプを指定する

### 背景
```
func foo<T>(objects: [T])->T? {
    return objects.first
}
```
Swiftではメソッド宣言に、上記のようなジェネリックタイプをサポートしますが、ジェネリックタイプを明示的に指定することができません：

```
foo([Int]())  // タイプの **インスタンス** でタイプを推測させることができる
foo<Int>([])  // タイプをこういう風に指定するのは文法エラー
```

### 問題
このタイプのインスタンスを作りたくない、作れないケースがあります。
こういう場合、タイプ自体でジェネリックを呼び出す方法は？

### コード
```
// 定義
func findObjectByType<T>(objs: [AnyObject], t: T.Type)->T? {
    for obj in objs {
       if let casted = obj as? T {
           return casted
       }
    }
    return nil
}

// 使用
findObject(findObjectByType, Class1.self)
```
centosのSSHあたりのもろもろ

# SSHについて
SSH サーバーは CentOS を「Minimal Install」した場合でも、デフォルトで OpenSSH がインストールされるため、
追加インストールする必要はありません。
最低限必要な設定としては、セキュリティを考慮して、
以下のように root アカウントの直接ログインの禁止設定を実施する

```
vi /etc/ssh/sshd_config
# 42行目：コメント解除し変更 ( rootログイン禁止 )
PermitRootLogin no
# 65行目：コメント解除
PermitEmptyPasswords no
PasswordAuthentication yes
/etc/rc.d/init.d/sshd restart 
```

### SSH クライアントをインストールします。(インストールしてない場合のみ)

`# yum -y install openssh-clients`

### SSH鍵の作成

```
# 鍵ペア作成
#ssh-keygen -t rsa 
Generating public/private rsa key pair.
Enter file in which to save the key (/home/[username]/.ssh/id_rsa):   # 変更の必要がなければそのまま空 Enter
Created directory '/home/[username]/.ssh'.
Enter passphrase (empty for no passphrase):   # パスフレーズ設定 (空 Enter でノーパス設定)
Enter same passphrase again:
Your identification has been saved in /home/[username]/.ssh/id_rsa.
Your public key has been saved in /home/[username]/.ssh/id_rsa.pub.
The key fingerprint is:
38:f1:b4:6d:d3:0e:59:c8:fa:1d:1d:48:86:f0:fe:74 [username]@dlp.server.world
The key's randomart image is:

#cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys 
#chmod 600 ~/.ssh/authorized_keys 
```

### パスワードログインの不可

```
# vi /etc/ssh/sshd_config
# 66行目：パスワード認証不可に変更
PasswordAuthentication no
# /etc/rc.d/init.d/sshd restart 
```

### SSHでのログイン

`ssh [ログインユーザー@ホスト名 または IP アドレス]`
`ssh -i path/to/key/id_dsa ホスト名`

### SSHでリモートの任意コマンドの実行

例としてリモートホストの /etc/passwd を cat する
`ssh cent@dlp.server.world "cat /etc/passwd" `
nginScriptを試す(2):js_set,js_runディレクティブ

[VirtualBox]:https://www.virtualbox.org/wiki/Downloads
[Ubuntu]:http://ftp.riken.jp/Linux/ubuntu-releases/
[nginx]:http://nginx.org/
[Launching nginScript and Looking Ahead]:https://www.nginx.com/blog/launching-nginscript-and-looking-ahead/
[nginScript Documentation]:https://www.nginx.com/resources/wiki/nginScript/

関連記事:

 * [VirtualBox+UbuntuにLEMP環境構築]
 * [nginScriptを試す(1):nginxをソースコンパイル]
 * nginScriptを試す(2):js_set,js_runディレクティブ

[VirtualBox+UbuntuにLEMP環境構築]:http://qiita.com/dozo/items/1c21c8758121c366ba90
[nginScriptを試す(1):nginxをソースコンパイル]:http://qiita.com/dozo/items/98077bdd9cbf928cc422

今度はスクリプトの実行

ヾ(・ω<)ﾉ"　三三三●　ⅱⅲ コロコロ♪
***
------------------- ↓ 余談はここから ↓-------------------
[前回の記事](http://qiita.com/dozo/items/98077bdd9cbf928cc422)では非常に長くなったが[nginx]のインストールとnginScriptのインストールはできた。
次はnginScriptを実際に使ってみよう。
とはいえ、[Launching nginScript and Looking Ahead]ページにある以上のことは何もなさそうだ。

これはプログラミング言語というレベルまではいかないまでも、
ApacheのConfでゴリゴリ書くようなものをScript上でやってしまおうという位置づけに思う。

------------------- ↑ 余談はここまで ↑ -------------------

ヾ(・ω<)ﾉ"　三三三●　ⅱⅲ コロコロ♪
***
------------------- ↓ 本題はここから ↓-------------------

# ディレクティブ
## js_setディレクティブ
変数を定義するディレクティブ
""でくくった内容の結果文字列を定義する変数に代入

```js:/usr/local/nginx/conf/nginx.conf
http {
    ・・・
    js_set $msg "
       var m = 'Hello ';
       m += 'world!';
       m;
    ";

    server{
        ・・・
        location /hello {
            add_header Content-Type text/plain;
            return 200 $msg;
        }
    }
}
```

### ブラウザからアクセス

![nginx04.PNG](https://qiita-image-store.s3.amazonaws.com/0/40697/f05b50ef-82f8-9199-038f-e69aa9d2b20f.png)


## js_runディレクティブ
responseオブジェクトを制御するディレクティブ

```js:/usr/local/nginx/conf/nginx.conf
http {
    ・・・
    server{
        ・・・
        location /run {
            js_run "
                var res;
                res = $r.response;

                res.contentType = 'text/plain';
                res.status = 200;
                res.sendHeader();

                res.send( 'Hello nginScript!' );
                res.finish();
            ";
        }
    }
}
```

### ブラウザからアクセス
![nginx05.PNG](https://qiita-image-store.s3.amazonaws.com/0/40697/b011f276-e4ad-daaf-7e52-f7f547eba660.png)



------------------- ↑ 本題はここまで ↑-------------------

ヾ(・ω<)ﾉ"　三三三●　ⅱⅲ コロコロ♪
***
------------------- ↓ 補足はここから ↓-------------------
LAMPの構築

#LAMPの構築

**Linux、Apache、MySQL、PHPの頭文字をとったもので**

#### DB
- yum install mysql-server 

##### Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)の対策

```
/etc/init.d/mysql stop
chown -R mysql:mysql /var/lib/mysql
mysql_install_db
/etc/init.d/mysql start
```
#### apache
- yum install httpd 

#### php
- yum install php php-mysql php-mbstring

#### 自動起動
- chkconfig httpd on
- chkconfig mysqld on

1. chkconfigでの確認
2. phpの確認/var/www/htmlで vi index.php

```
<?php
phpinfo();
```
3. mysql_secure_installation(mysqlの構築)
`rootのpw以外は基本Yでok`

### MySQL設定

- ログの出力先作成(必要であれば)
mkdir /var/log/mysql
chown -R mysql:mysql /var/log/mysql

- オリジナルのコンフィグをバックアップします。
mv -i /etc/my.cnf /etc/my.cnf.org

```
vi /etc/my.cnf　←　MySQL設定ファイル編集
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
character-set-server = utf8　←　追加(MySQLサーバーの文字コードをUTF-8にする)
```

### LAMP初期設定
[これに関するリンク](http://qiita.com/shokei1205/items/64fcbf0a639b601a6cca)
Node.js + TypeScript + Atom 環境を構築する


以下の3つをします。

* [Node.js]を[nodebrew]でinstallする
* [TypeScript]をinstallする
* [Atom]をinstallして[TypeScript]に対応する

``Mac OS 10.10.1`` で試しています。

## Node.js with nodebrew

``nodebrew`` をinstallする。

```
$ curl -L git.io/nodebrew | perl - setup
```

パスを通す必要あり。↑のconsole logに出てます。

```
$ vi ~/.bash_profile

# nodebrew.                                                                     
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

``node``, ``npm`` をinstallする。

```
$ nodebrew install-binary latest
$ nodebrew use latest
```

成功したか確認してみる。

```
$ npm --version
```


## TypeScript

最新のVersionを見てみる。2015/10/13時点では ``1.6.2`` みたい。

```
$ npm info typescript

{ name: 'typescript',
  description: 'TypeScript is a language for application scale JavaScript development',
  'dist-tags': { latest: '1.6.2', next: '1.7.0-dev.20151006' },
  versions: 
   [ '0.8.0',
     '0.8.1-1',
...
```

[TypeScript]をinstallする。

```
$ npm install -g typescript@1.6.2
```

成功したか確認してみる。

```
$ tsc --version
```


## Atom

[Atom]をダウンロードしてinstall --> 起動する。

> プロキシ環境下の方は[こちら](http://qiita.com/megmogmog1965/items/7613267d7e7a677a5d8a)も。

``apm`` コマンドをinstallする。

* ``Menu`` --> ``Atom`` --> ``Install Shell Commands``

TypeScriptプラグインをinstallする。

```
$ apm install atom-typescript
```

コンパイルエラーとかチェックして出したいので、Linterプラグインを入れる。

```
$ apm install linter
$ npm install -g tslint
$ apm install linter-tslint
```

その他、便利プラグイン。

```
# 右上にMinimap表示.
$ apm install minimap

# "ctrl + r" で実行.
$ apm install atom-runner

# "ctrl + alt + b" で整形.
$ apm install atom-beautify
```

プロジェクトルートに[tslint.json]を置く。エラーチェックとかの設定です。

* [tslint.json]

プロジェクトルートに ``tsconfig.json`` を置く。[TypeScript]用の設定です。

```json:tsconfig.json
{
    "compilerOptions": {
        "target": "es5",
        "module": "commonjs",
        "declaration": false,
        "noImplicitAny": false,
        "removeComments": true,
        "noLib": false
    },
    "buildOnSave": true,
    "filesGlob": [
        "./**/*.ts",
        "!./node_modules/**/*.ts"
    ],
    "files": [
    ],
    "exclude": []
}
```

[Atom]を再起動して新規に ``test.ts`` を書いてみる。エラー表示が出たら成功。

```javascript:test.ts
var num: number = 777;

num = 'this is string.';  // Error: Type 'string' is not assignable to type 'number'.
```


[Node.js]:https://nodejs.org/en/
[nodebrew]:https://github.com/hokaccha/nodebrew
[TypeScript]:http://www.typescriptlang.org/
[Atom]:https://atom.io/
[tslint.json]:https://raw.githubusercontent.com/palantir/tslint/master/tslint.json
crontabバックアップを超お手軽に

# ミニマム中のミニマムはこれ
```
crontab -l | mail -s crontab youraddress@example.com
```

これであなたのメールアドレス（youraddress@example.com）に、crontabの内容が転送される。メールタイトルは、-s で指定しているので、分かりやすいタイトルに変えてね。

# 背景
crontab -e と crontab -r が近すぎるので、編集しようとして削除しちゃうってトラブルがある。もしくはありそう。

# 解決策あれこれ
* crontab < ファイル って方法
 * 実ファイルがあるのでそいつがリポジトリ管理されていればいい
 * これなら、ファイルが残るのだけれど、誰か（過去の私含めて）が直接crontabを編集しているかもしれない。不安だ不安だ。crontab -e そのものを殺してしまわないと。
* そもそもcrontb使うんだっけ？
 * Jenkinsを始め、crontabに頼らずとも時刻起動するソリューションはある
 * が、そういうのがないからこそcrontab使ってるんだよね
* ファイルにバックアップ
 * crontab -l > backupdir/yyyymmdd.txt
 * よくあるケースだけど、このバックアップファイル削除するのに勇気いるのよね。
 * バックアップファイルを復活させることって実はあまりないから、うっかり復活しちゃわないところに置く方がいいと思うのです

# メールに飛ばすというソリューション
ちょっとしたバックアップをメールに飛ばすというソリューションは、ケースとしては有用。FTPが禁止されている環境でも、バッチ処理完了メールまで閉じてしまってるケースってのはあまりない。（が、本当にセキュアな環境ならこの穴も塞がれているはず）

「あのバッチ処理何時だっけ？」って時にも、メールを検索するだけなので、リードオンリー環境としては便利。
Photoshopのカンバスとアセットを使って効率的なカンプ作成


1.キャンバス別で各ページや必要であれば各幅のビューを解像度等倍で作成

2.完成したデータをキャンバスごとに別ファイル書き出し

3.書き出したキャンバスごとのPSDファイルでレイヤーをRename、アセット書き出しを行う

4.最初のキャンバス、解像度等倍のものでサイズ、マージン幅など確認しながらコーディング

※レイヤーを選択した状態でコマンドを押すとマージン幅がガイド表示される
※AdobeCloud上にアップすることで使用しているカラーコードやCSSが確認できる

__CSSをコピーについて__
PhotoshopのCSSをコピーはレイヤー名がクラス名になる。これを駆使することでPhotoshop上でプレコーディングを行う事が可能。
VMでcentos6のLAMP構築

## インストールの手順

1. centosのダウンロードする
2. デフォルトでインストールする
3. rootでログインする、初期設定する
4. ネットワークの設定


#### network

```
vi /etc/sysconfig/network-scripts/ifcfg-eth1
---(HWADDRの行以外を削除して下記を追加)---------------------------
DEVICE=eth1
HWADDR=08:00:27:XX:XX:XX　　←【この行は残す】
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=none
IPADDR=192.168.56.201
NETMASK=255.255.255.0
---(networkの再起動)----------------------------------------------------
service network restart
```


#### 一般ユーザの作成&削除

```
useradd centos　←　一般ユーザcentosの作成
passwd centos　←　centosのパスワード設定
ユーザー centos のパスワードを変更。
新しいパスワード:　←　centosのパスワード応答
新しいパスワードを再入力してください:　←　centosのパスワード応答(確認)
passwd: 全ての認証トークンが正しく更新できました。
userdel -r centos　←　一般ユーザcentosの削除
```

#### rootになれるユーザを管理者のみにする

```
[root@centos ~]# usermod -G wheel centos　←　管理者ユーザをwheelグループに追加
[root@centos ~]# vi /etc/pam.d/su
#auth       required     pam_wheel.so use_uid
↓
auth       required     pam_wheel.so use_uid　←　コメント解除
管理者用一般ユーザからはrootになれて、管理者以外の一般ユーザからはrootになれないことを確認
```

#### sudoer[参考](http://www.server-world.info/query?os=CentOS_6&p=initial_conf&f=8)

Linuxでは
/etc/sudoers

FreeBSDでは
/usr/local/etc/sudoers

```
# who     where     = (as_whom)      what 
user1 ALL = (root) /sbin/service httpd start
centos ALL = (ALL) ALL (全権限のsudoer)
```
この記述で
ユーザwhoが、ホストwhereで、権限as_whomで、コマンドwhatを実行できる。

***
## まとめ
1. CentOS入手(略)
2. VMBoxの作成(基本デフォルトでいい)
3. 一般ユーザからsudoerの作成