ページ

2012/09/30

[SQLearning][SQLite]ログインとデータベースの作成・削除

SQL ゼロからはじめるデータベース操作を教材にしてSQLiteを学ぶ
SQL学習連載「SQLearning」を始めます。

準備は以下の記事で済んでいると想定します。
SQL ゼロからはじめるデータベース操作で SQLite を学ぶ | DevAchieve

SQLite コンソールを開く

ターミナルで以下のコマンドを実行します。
sqlite3
SQLite にはユーザーの概念がないのでログインする必要がありません。常に管理者です。

データベースの新規作成

ファイル作成先を指定せずに作成
sqlite3 shop.db
/Users/[ユーザー名]/に作成されます。

ファイル作成先を指定して作成
sqlite3 /Users/wada/Docments/shop.db

ファイルが作成されるのは何かしらの操作をしたあとになるようです。
sqlite> .databases
上記のコマンドを実行すると接続しているデータベース名のリストが得られ、
データベースファイルが存在しない場合、ファイルが作成されます。

データベースの削除

SQLite では1データベース1ファイルなのでデータベースの削除はSQLからではなく、ファイルの削除で行います。
rm shop.db

SQLite コンソールからログアウト

sqlite> .exit
または
sqlite> .quit

次回

次回は「デーブルの作成・確認・削除」についてを予定しています。

SQL ゼロからはじめるデータベース操作 (CD-ROM付) (プログラミング学習シリーズ)
SQL ゼロからはじめるデータベース操作 (CD-ROM付) (プログラミング学習シリーズ)

2012/09/29

[SQLearning][MySQL]ログインとデータベースの作成・削除

SQL ゼロからはじめるデータベース操作を教材にしてMySQLを学ぶ
SQL学習連載「SQLearning」を始めます。
第1回は「データベースの作成」です。

準備は以下の記事で済んでいると想定します。
MacにMySQLを導入してみた | DevAchieve
※想定する MySQL のバージョンは5.1ですが5.5で実行・確認しています。
バージョンによる差異がある場合はマニュアルを併記しておくつもりです。

MySQL クライアントへのログイン

匿名ユーザーとしてログイン
mysql
ユーザー名を指定してログイン
mysql -u [ユーザー名] -p
root としてログイン
mysql -u root -p
まだユーザーを作成したり、パスワードを設定していないのでパスワードなしで root としてログインします。

データベースの新規作成

mysql> CREATE DATABASE shop;
ちなみに作成できたかは以下のクエリで確認できます。
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| shop               |
| test               |
+--------------------+

データベースの削除

mysql> DROP DATABASE shop;

MySQL クライアントからログアウト

mysql> exit
または
mysql> quit

次回

次回は「デーブルの作成とデータ型・制約の指定」についてを予定しています。

SQL ゼロからはじめるデータベース操作 (CD-ROM付) (プログラミング学習シリーズ)
SQL ゼロからはじめるデータベース操作 (CD-ROM付) (プログラミング学習シリーズ)

2012/09/28

[競技プログラミング][PHP][AtCoder]謎のたこ焼きおじさん

B - 謎のたこ焼きおじさん

時間制限 : 2sec / スタック制限 : 10MB / メモリ制限 : 64MB

問題文

あなたはたこ焼きを買いに来たところ、伝説のたこ焼きマスター高橋社長に認められ、
新しく作るたこ焼き屋さんの店長を任されました。
店長に任命されたあなたに与えられた最初の仕事は、お店の看板を作成することでした。
ところが高橋社長は使えない時間がないので、
たこ焼き屋さんの名前は決めましたが、看板を作るのはあなたに任せて去って行きました。
その際に看板を作るための英字ブロックが入ったいくつかのキットを渡されました。
英字キットとは、ランダムな英字ブロックが含まれている袋のことです。
例えば英字キットを表す文字列が ABCC であるような英字キットの場合、
  • 英字ブロックAが1つ含まれている。
  • 英字ブロックBが1つ含まれている。
  • 英字ブロックCが2つ含まれている。
とみなすことができます。
つまり、英字キット ABCC 1 袋につき、
英字ブロックAと英字ブロックBを1つずつ、英字ブロックCを2つを看板に用いることができます。
高橋社長から渡された英字キットは全て同じ英字キットだったので、どのキットを開けても中身は全く同じです。
あなたは看板にお金をかけるわけにもいかないので、開封する英字キットを最小にして残りは返品したいです。
どれだけの英字キットを使うことで、お店の看板を作ることができるでしょうか。

入力

入力は以下の形式で標準入力から与えられる。
N M
name
kit
入力は 3 行ある。
1 行目にお店の名前の文字数 N (1≦N≦50) と、
英字キット 1 袋に入ってる英字ブロックの数 M (1≦M≦50) が空白区切りで与えられる。
2 行目にはお店の名前を表す文字列 name が N 文字で与えられる。
文字列 name に含まれる文字は A-Z のみである。
3 行目には英字キットに含まれている英字ブロックを表す文字列 kit が M 文字で与えられる。
文字列 kit に含まれる文字は A-Z のみである。

出力

看板をつくるために必要な英字キットの最小数を標準出力に 1 行で出力すること。
与えられた英字キットで看板を作成することができない場合は、-1を出力すること。
また、出力の最後には改行をいれること。

出典

B: 謎のたこ焼きおじさん - AtCoder Regular Contest #008 | AtCoder

回答

AtCoder/arc008_2.php at master · wada811/AtCoder · GitHub
<?php
fscanf(STDIN, "%d %d", $n, $m);
for($i = 0; $i < $n; $i++){
    $name[] = fgetc(STDIN);
}
fgetc(STDIN); // throw line feed code
for($i = 0; $i < $m; $i++){
    $kit[] = fgetc(STDIN);
}
fgetc(STDIN); // throw line feed code

$name_counts = array_count_values($name);
$kit_counts = array_count_values($kit);
foreach($name_counts as $key => $name_count){
    if(array_key_exists($key, $kit_counts)){
        $diff[] = max($name_count - $kit_counts[$key], 0);
    }else{
        $count = -1;
        break;
    }
}
$count = isset($count) ? $count : max($diff) + 1;
echo $count.PHP_EOL;
?>
一文字ずつ配列に保存して改行コードを捨てるのが10行目まで。
array_count_valuesで配列の値の数を数えて配列化したら
店名に含まれるアルファベットが英字キットに含まれるかarray_key_existsで探す。
見つからなかったら店名は完成しないのでカウントを -1 にして break する。
見つかったら差をとる。マイナスになったら0にして配列に詰める。
差の最大をmaxでとるが、差なので英字キット1袋分カウントが減るから+1する。

抜けは無さそうなんだけど AC にならないケースがあるみたいなんだよなぁ。
どなたかわかる方コメントや @wada811 にリプライください。お願いします。

追記(2012/09/29): ACになりました。

<?php
fscanf(STDIN, "%d %d", $n, $m);
for($i = 0; $i < $n; $i++){
    $name[] = fgetc(STDIN);
}
fgetc(STDIN); // throw line feed code
for($i = 0; $i < $m; $i++){
    $kit[] = fgetc(STDIN);
}
fgetc(STDIN); // throw line feed code
 
$name_counts = array_count_values($name);
$kit_counts = array_count_values($kit);
foreach($name_counts as $key => $name_count){
    if(array_key_exists($key, $kit_counts)){
        $counts[] = ceil($name_count / $kit_counts[$key]);
    }else{
        $count = -1;
        break;
    }
}
$count = isset($count) ? $count : max($counts);
echo $count.PHP_EOL;
?>
引き算でキット数を計算するのが問題だったようです。
コメントくださったAyaka Kashiyamaさんありがとうございました。
英字毎にカウントは独立しているので考えるべきは以下のパターンくらいだったでしょうか。
(name, kit) = ('A', ''), ('', 'A'), ('A', 'A'), ('AA', 'A'), ('A', 'AA'), ('AAA', 'AA')
1番目は キットに存在しないので -1, 2番目は存在しない英字なのでチェックが行われない, 3番目は 1/1 で 1,
4番目は 2/1 で 2, 5番目は 1/2 で ceilで切り上げて 1, 6番目は 3/2 で 同様に切り上げて 2 になる。
うーん。悔しい。反例を見つける力が足りない。悔しい。

2012/09/27

[競技プログラミング][PHP][AtCoder]たこ焼き買えるかな?

A - たこ焼き買えるかな?

時間制限 : 2sec / スタック制限 : 10MB / メモリ制限 : 64MB

問題文

ある日、あなたはたこ焼きを買いに行きました。
そのお店ではたこ焼き 1 個 15 円、 10 個まとめて 100 円で売っています。
今、あなたは N 個のたこ焼きを買おうと思っています。
あなたはたこ焼きを N 個以上買うのに少なくともいくら必要でしょうか。

入力

入力は以下の形式で標準入力から与えられる。
N
入力は 1 行ある。
1 行目には、購入したいたこ焼きの個数を表す整数 N(1≦N≦50) が与えられる。

出力

たこ焼きを N 個以上買うのに必要な最小金額を標準出力に 1 行で出力すること。
なお、最後には改行を出力せよ。

出典

A: たこ焼き買えるかな? - AtCoder Regular Contest #008 | AtCoder

回答

AtCoder/arc008_1.php at master · wada811/AtCoder · GitHub
<?php
fscanf(STDIN, "%d", $n);
$cost = (int)($n / 10) * 100 + min($n % 10 * 15, 100);
echo $cost.PHP_EOL;
?>
7個買うならセットで買うほうがお得!って言ってセット買うとは思わなかった。
いまいちminって使い慣れてなくて三項演算子で書いてしまう…。
もうC言語のように書かなくていいのにね…。

2012/09/26

[書評]SQL ゼロからはじめるデータベース操作

SQL ゼロからはじめるデータベース操作 (CD-ROM付) (プログラミング学習シリーズ)
ミック
翔泳社
発売日:2010-06-29
ブクログでレビューを見る»
標準SQLでRDBMSの操作を学ぶことのできる入門書。
主要なデータベースでのSQLの文法の違いがあれば
毎回解説があるので安心して読むことができる。
データベース操作に特化していて本書をマスターすれば大抵の事はできるようになる。
重要単語にふりがな振ってあったり初心者を脱落させないようにしっかり解説が入っていて
データベース初心者に是非オススメしたい入門書です。
後半で解説用のサンプルデータの INSERT文の BEGIN TRANSACTION に毎回同じ解説がつくのは
もはや笑いがこみ上げてくるレベル。絶対に初心者を挫折させない配慮を感じられます。

すべての解説で標準SQLを元にOracle, SQL Server, DB2, PostgreSQL, MySQLでの書き方が書かれているので
RDBMSを選ばない学習ができるので、ある程度書ける人も読んでおくと学べることが多いでしょう。
SQL ゼロからはじめるデータベース操作 - ミック/翔泳社:SEShop.com
上記の公式サイトで目次が確認できるので理解できていない部分があったら読むといいと思います。
相関サブクエリとか CASE 式を理解できると SQL の幅が広がると思うので理解しておきたいです。
入門書で相関サブクエリや CASE 式などをわかりやすく解説しているのは本書だけなのではないでしょうか?

本書をマスターしたら後は応用して何とかなったりします。
本書には JOIN しながら相関サブクエリで絞り込みつつ UPDATE する方法は書かれていないけど
それぞれの書き方は解説されているので組み合わせればそんなクエリを書くこともできるようになります。
SQL の基礎知識としてマスターしておきたいですね。

データベース初心者がSQLを極めるためのオススメ書籍6冊 | DevAchieve
データベース初心者が概念や基礎知識を学び、
SQLの書き方やDB設計など習得して
DBとSQLを極めるまでのステップアップとなる本を6冊ピックアップしてみました。

このデータベース坂を一緒に登ってみませんか?
SQL ゼロからはじめるデータベース操作 (CD-ROM付) (プログラミング学習シリーズ)
SQL ゼロからはじめるデータベース操作 (CD-ROM付) (プログラミング学習シリーズ)

2012/09/25

[書評]日経ソフトウエア 2012年 09月号

日経ソフトウエア 2012年 09月号 [雑誌]
日経BP社
発売日:2012-07-24
ブクログでレビューを見る»
プログラマが知っておきたい中学・高校の数学と物理、
Android最新ツール&ライブラリ。
付録は「ゼロから5日でiPhoneアプリが作れる本」という小冊子。
日経ソフトウエア ダウンロード - 2012年:ITpro

プログラマが知っておきたい中学・高校の数学と物理

日経 ソフトウエア 2012年 04月号で好評だった企画の第2弾。結構ガチな内容になってます。
三角関数の復習をして、旗の画像を変換してなびかせたり、ビリヤードの球の衝突をシミュレートしたり、
画像変換でレンズ効果を実現したり、画像の歪みを補正したりと濃い内容です。

Android最新ツール&ライブラリ「AndroidAnnotations」

コードの記述量を劇的に削減できるAndroid初学者にも優しい多機能ライブラリで、
かなり完結に書けるようで便利そうです。
紙面には載ってないですがサンプルコードがあるらしいので使うときに参考にしたいところ。
@vvakameさん曰く、これからのAndroid開発には必須らしいので学んでおきたいですね。

おまけ

付録は「ゼロから5日でiPhoneアプリが作れる本」という小冊子。
これまでの小冊子の内容が良かっただけに一気に小学生向けになってしまって残念。

気になる内容がなかったり、内容が浅かったりで雑誌はコスパ悪いなぁと思ってきた…。
日経ソフトウエア 2012年 10月号@chokudaiさんの深さ優先探索くらいしか興味ある記事ないし…。
なんかオススメの書籍ないですかね?

日経ソフトウエア 2012年 09月号 [雑誌]
日経ソフトウエア 2012年 09月号 [雑誌]

2012/09/24

MacにMySQLを導入してみた

MySQL :: Download MySQL Community Serverから Mac OS X ver.~ DMG Archive をダウンロードする。
32bit / 64bit の判別方法はターミナルでgetconf LONG_BITを入力して返ってきた値らしい。
適当にパッケージっぽいもの開いてインストールしたら以下のコマンドを入力する。
sudo /Library/StartupItems/MySQLCOM/MySQLCOM start
参考: MySQL :: MySQL 5.1 リファレンスマニュアル :: 2.5 Mac OS X に MySQL をインストールする

これで/usr/local/mysql/bin/mysqlと入力すれば mysql が使える。
しかし、こんなの毎回入力してたら死ねるので alias の設定をする。

僕は zsh を使っているので /Users/wada/.zshrc に alias mysql=/usr/local/mysql/bin/mysqlを記述した。
MySQL :: MySQL 5.1 リファレンスマニュアル :: 2.5 Mac OS X に MySQL をインストールするによると
以下の2行を書いておくといいらしい。
alias mysql=/usr/local/mysql/bin/mysql
alias mysqladmin=/usr/local/mysql/bin/mysqladmin
.zshrc に記述したら設定を反映するためにsource /Users/wada/.zshrcと入力する。
参考: bash から zsh に乗り換えた【その仕事、蠍は留守です】

これでどこでもターミナル上で mysql と打つだけで MySQL が使えるようになる。
これでやっと SQL の勉強を始めることができそうだ。

2012/09/23

MacにHomeBrewとzshを導入してみた

Macのパッケージ管理ならHomeBrewでしょ、と誰かが言うのでインストールしてみた。
Homebrew — MacPorts driving you to drink? Try Homebrew!の最下部の
Install HomeBrew のコマンドをターミナルで入力すればインストールできるみたい。
よくわからず色々グチャグチャやってたら入ったからよくわからないけどたぶんそう。
たぶんコレ↓が役に立つと思う。
[Mac] Mountain Lionへパッケージ管理「Homebrew」をインストールする手順のメモ

zsh とは … なんかすげー便利なコマンドシェル、らしい。zsh - Wikipedia
zsh は インストールした HomeBrew を使えば
ターミナル上で以下のコマンドだけでインストールできる。
brew install zsh
このままではインストールしてもターミナルを起動するとデフォルトの bash が起動してしまうので
sudo vi /etc/shells/usr/local/bin/zshを追記する。
バージョン名付きのがあったらソッチのほうがいいかも。
chpass -s /usr/local/bin/zshでデフォルトを zsh に変更する。
chpassコマンドを入力してパスワードを入力したら変更が確認できる。
Shell:部分が /usr/local/bin/zsh になっているはず。
システム環境設定 > ユーザーとグループ から鍵を開いて編集できるようにして
ユーザー名の上で右クリックで詳細オプションをクリックし、開いた画面でログインシェルを変更しても良い。

使えるようになったかどうかの確認としてzsh --versionと入力してみるといいかも。
参考
Mac (Lion) にzshをインストール | CAPH TECH
MacのログインシェルをHomebrew等で入れたzshやbashに変更する方法 | Macとかの雑記帳

zsh の設定をするために一旦ターミナルを終了し、再起動する。
何やら色々聞かれるのでよくわからないまま設定するも良い。
とりあえず 0 をタイプして保存すると/Users/[ユーザー名]/.zshrcが生成されると思う。
巷で流れる .zshrc の設定はココに記述すれば良さそうだ。

2012/09/22

SQL ゼロからはじめるデータベース操作で SQLite を学ぶ

SQL ゼロからはじめるデータベース操作 (CD-ROM付) (プログラミング学習シリーズ)SQL ゼロからはじめるデータベース操作 (CD-ROM付) (プログラミング学習シリーズ)
●達人から学ぶ基礎とコツ

本書は、「データベースやSQLがはじめて」という初心者を対象に、
プロのDBエンジニアである著者がSQLの基礎とコツをやさしく丁寧に教える入門書です。

データベース/テーブルの構造から、データを検索したり更新したりする構文、
よく使う関数、テーブルの結合など、
SQLによるデータベース操作の基本を学習していきます。
WHERE句、GROUP BY句、HAVING句やサブクエリなど、
SQLを使いこなすためのポイントとなる機能や、
初心者にとって理解が難しい部分は、豊富な図とサンプルプログラムでかみくだいて解説しています。
また、標準SQLをベースに、各種データベース(Oracle, SQL Server, DB2, PostgreSQL, MySQL)での違いや、
初心者がハマりやすいポイント、基礎ノウハウについてもしっかり解説。

付属CD-ROMには、SQL学習環境としてPostgreSQL、本書のサンプルプログラムを収録。
本書の内容を試しながら学習することで学習効果が高まります。

・何から学習すれば良いかわからない
・きちんとSQLを書けるようになりたい
・現場で通用する基礎を身につけたい

という方におすすめの一冊です。

_人人人人人人人人人人人_
> SQLiteが入ってない <
 ̄Y^Y^Y^Y^Y^Y^Y^Y ̄

iOS や Android では SQLite なので SQLite でも書けるようになっておきたいところです。
すごくわかりやすく、初心者を脱落させない配慮が感じられる本なのでコレをベースに学習して行きます。
勝手に SQLite 対応しちゃいます。

SQlite のインストール

Windows

SQLite Download Pageから sqlite-shell-win32-x86-<varsion>.zip をダウンロードして
インストールしたら使えます。たぶん。

Mac

たぶんもう入ってます。ターミナルで sqlite3 と入力すれば sqlite が使えるはず。
ダメだったら Windows と同じページから Mac 用の zip をダウンロードしてインストールすればいいと思います。

SQLite の起動

sqlite3 とターミナル上で打てば起動します。

他のデータベースは MySQL しか使ったことないからわからないけど SQLite はユーザーという概念がありません。
一つのデータベースは一つのファイルに収められ、ファイルさえあればパスワードなしで開くことができます。

ヘルプを開く

起動直後に表示されているように.helpでヘルプを表示することができます。

SQLite の終了

.exitまたは.quitで終了します。

これで準備は完了したので次回からはデータベースを作成したりテーブルを作成したいと思います。

2012/09/21

Lita - GUI の SQLite クライアントアプリケーション

Lita - SQLite Administration Tool
Lita is a free and open source SQLite database administration tool for Windows, MacOSX and Linux.
  • Open, create, compact, manage SQLite databases
  • Create, rename, delete, and empty tables
  • Create, rename and delete columns
  • Create, modify and delete records
  • Encrypt or reencrypt your databases
  • Run, import and export your custom SQL statements
  • Create and delete indices

SQLiteでできるほとんどのことができると思われます。
Android や iOS ではデータベースは SQLite を利用しているので SQL のテストをしたい際に便利です。

Android なら端末の以下のパスに .db ファイルがあるらしいです。ROOT権限があれば覗けるとか。
/data/data/[パッケージ名]/database/

iOS なら Mac の以下のパスに .sqlite ファイルがあります。
/Users/[ユーザー名]/Library/Application Support/iPhone Simulator/[ビルド時のiOSのバージョン]/Applications/[アプリのGUID]/Documents/
/Users/[ユーザー名]/Library が隠しファイル設定になっているので TinkerToolで表示させてやりましょう。

SQL ゼロからはじめるデータベース操作が Oracle, SQL Server, DB2, PostgreSQL, MySQL に対応していたので
勉強がてらに SQLite を対応させようと思います。
スマホアプリは SQLiteなのでマスターしておきたいですね。

2012/09/20

[競技プログラミング][PHP][AtCoder]迷子のCDケース

B - 迷子のCDケース

時間制限 : 2sec / スタック制限 : 10MB / メモリ制限 : 64MB

問題文

高橋君はCDで音楽を聴くことが好きです。
CDプレイヤーには先日聴いたCDが入ったままになっているのですが、
そのCDに対応するCDケースが見当たらないことに気づきました。
前回に聴いた時にCDケースをどこに置いたのか、残念ながら高橋君は全く思い出せませんでした。
仕方がないので高橋君は今から聴こうとしているCDをケースから取り出し、
CDプレイヤーに入っていたCDをそのケースへと片付けることにしました。
さらに別のCDを新たにCDプレイヤーに入れる場合も、
CDプレイヤーに入っていたCDは空いたCDケースに片づけます。
例えば図 1(※省略)のように 3 枚のCDがある状態で、
黄緑色のCD、オレンジ色のCDの順でCDを聴くと、
それぞれのCDは最も下の図(※省略)のように片付けられることになります。

高橋君が音楽を聴き終わった後、今日聞いたCDのリストが与えられるので、
高橋君が所持するCDケースにはそれぞれどのCDが入っているかを答えなさい。

入力

入力は以下の形式で標準入力から与えられる。
N M
disk0
disk1
:
:
diskM−1
入力は M+1 行ある。
1 行目には、高橋君が所持するCDケースの個数を表す整数 N(1≦N≦100)と、
今日聴いたCDの枚数 M(0≦M≦100) が空白区切りで与えられる。
CDケースを 1 つ無くしているので、高橋君は計 N+1 枚のCDを所持している。
CDと対応するCDケースにはそれぞれ 0 から N までの数が番号付けられている。
現在CDプレイヤーに入ってるCDとそれに対応する見当たらないCDケースは 0 番である。
2 行目からの M 行には今日聴いたCDの番号のリストが与えられる。
i+2 行目の整数 disk i (0 ≦ i ≦ M−1, 0 ≦ disk i ≦ N) は i+1 番目に disk i 番のCDを聴いたことを表している。

出力

1 から N 番までのCDケースに入ってるCDの番号を順に標準出力に 1 行に 1 ケース分ずつ出力せよ。
なお、最後には改行を出力せよ。

出典

B: 迷子のCDケース - AtCoder Regular Contest #007 | AtCoder

回答

AtCoder/arc007_2.php at master · wada811/AtCoder · GitHub
<?php
fscanf(STDIN, "%d %d", $n, $m);
for($i = 0; $i < $m; $i++){
    fscanf(STDIN, "%d", $playlist[]);
}
$now = 0;
for($i = 1; $i <= $n; $i++){
    $case[] = $i;
}
for($i = 0; $i < $m; $i++){
    if($now !== $playlist[$i]){
        $next = array_search($playlist[$i], $case);
        list($case[$next], $now) = array($now, $case[$next]);
    }
}
for($i = 0; $i < $n; $i++){
    echo $case[$i].PHP_EOL;
}
?>
6行目で now playing な CD を定義、8行目で CD ケースに CD を詰める。
プレイリストが現在再生中の CD 以外だったら入れ替え。
コレをしないと array_search で false が返ってきてしまう。
13行目は list を使ったテクニカルな変数のスワップ(入れ替え)方法。
普通に $tmp = $a; $a = $b; $b = $tmp; の円環の順で書く方法でも良かったのだけど
PHP でスワップするのは初めてだったのでなんかあるかなと調べてみたらあった。
初見の人は何やってるかわからなくて戸惑いそうだから使いにくい感じはあるけど…。

ちなみに now playing を一緒に配列に入れても解ける。
Submission #44496 - AtCoder Regular Contest #007 | AtCoder
CD を主体にするか、ケースを主体にするかの違いなんだけど
あんまりセマンティックな感じがしないので不採用でした。まぁ好みの問題ですね。

2012/09/19

[競技プログラミング][PHP][AtCoder]帰ってきた器物損壊!高橋君

A - 帰ってきた器物損壊!高橋君

時間制限 : 2sec / スタック制限 : 10MB / メモリ制限 : 64MB

問題文

高橋君はある日、コンピューターのキーボードの中の 1 つのキーが壊れていることに気づきました。
壊れたキーは押しても文字が出力されません。
力が強いことで有名な高橋君なので、キーを強く叩きすぎたのでしょう。
しかし、高橋君は小さいことは気にしない性格なので、そのキーボードを壊れたまま使うことにしました。
高橋君がタイピングする文字列が与えられるので、
壊れたキーボードを用いてタイピングした場合の出力結果を答えなさい。

入力

入力は以下の形式で標準入力から与えられる。
X
s
入力は 2 行ある。
1 行目には、壊れたキーを表す文字 X が与えられる。
X は英字の小文字(a-z)のいずれかである。
2 行目にはタイピングする文字列を表す 1 文字以上 50 文字以下の文字列が与えられる。
文字列は英語の小文字(a-z)のみで成り立っている。

出力

壊れたキーでの入力は出力されない状態で文字列をタイピングした場合に、
出力される文字列を標準出力に 1 行で出力せよ。
なお、最後には改行を出力せよ。
もし何も出力されない場合は改行のみを出力せよ。

出典

A: 帰ってきた器物損壊!高橋君 - AtCoder Regular Contest #007 | AtCoder

回答

AtCoder/arc007_1.php at master · wada811/AtCoder · GitHub
<?php
fscanf(STDIN, "%c", $key);
fscanf(STDIN, "%s", $string);
$string = str_replace($key, '', $string);
echo $string.PHP_EOL;
?>
簡単な文字列置換でクリア。

2012/09/18

[書評]日経ソフトウエア 2012年 08月号

日経ソフトウエア 2012年 08月号 [雑誌]
日経BP社
発売日:2012-06-23
ブクログでレビューを見る»
やわらか頭でアルゴリズムを10倍生かす!
付録は「Eclipse 逆引きポケット事典」という小冊子。
日経ソフトウエア ダウンロード - 2012年:ITpro

やわらか頭でアルゴリズムを10倍生かす!(後編)

幅優先探索の解説。考え方がだいぶわかってきたのでサンプルコード見ながらなら何とか書けそう。

おまけ

付録は「Eclipse 逆引きポケット事典」という小冊子。
ほとんど興味ない記事だったけど、この付録が欲しくて買った。
コレに書いてある内容を使いこなせれば超スピードで開発できそう。
残念ながら Android アプリを作れていないのでまだ使えていないが開発するときは手元に置いておきたい。

日経ソフトウエア 2012年 08月号 [雑誌]
日経ソフトウエア 2012年 08月号 [雑誌]

2012/09/17

[競技プログラミング][PHP][天下一プログラマーコンテスト2012]ロイヤルストレートフラッシュ

B - ロイヤルストレートフラッシュ

時間制限 : 2sec / スタック制限 : 10MB / メモリ制限 : 64MB

問題文

シャッフルされたトランプの山札が与えられる。
ここからロイヤルストレートフラッシュを作りたい。
山札からカードを 1 枚ずつめくり、手札に入れるか捨てるという操作を繰り返す。
最短でロイヤルストレートフラッシュが完成したときの捨て札を、カードを捨てた順に出力せよ。
なお、初期状態で手札は空とし、ロイヤルストレートフラッシュが完成したとき、
手札に余分なカードが存在してはならない。


与えられる山札を表す文字列は、以下のBNFに従う。

<山札> ::= <カード> | <山札> <カード>
<カード> ::= <マーク> <番号>
<マーク> ::= "S" | "H" | "D" | "C"
<番号> ::= "A" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "J" | "Q" | "K"
ロイヤルストレートフラッシュとは、同じマークの「10、J、Q、K、A」の組み合わせのことを言う。
すなわち、「S10, SJ, SQ, SK, SA」、「H10, HJ, HQ, HK, HA」、「D10, DJ, DQ, DK, DA」、
「C10, CJ, CQ, CK, CA」のカードの組み合わせ 4 種類がロイヤルストレートフラッシュである。

入力

入力は以下の形式で標準入力から与えられる。
s
山札のカードを表す文字列 s が 1 行で与えられる。
山札にはマークと番号の両方が等しいカードの組は存在しない。
ロイヤルストレートフラッシュを作ることが可能であることが保証される。

出力

ロイヤルストレートフラッシュを最短で作ったときの捨て札を表す文字列を 1 行で出力せよ。
捨て札はカードを捨てた順に記述する必要がある。
捨て札が無い場合は、 0 (数字のゼロ) を出力せよ。
なお、行の終端には改行が必要である。

出典

B: ロイヤルストレートフラッシュ - 天下一プログラマーコンテスト2012 予選C | AtCoder

回答

AtCoder/tenka1_2012_C_2.php at master · wada811/AtCoder · GitHub
<?php
fscanf(STDIN, "%s", $input);
preg_match_all('/([SHDC])([^SHDC]{1,2})/', $input, $matches);
$rsf = array('10', 'J', 'Q', 'K', 'A');
$cards = array('S' => 0, 'H' => 0, 'D' => 0, 'C' => 0);
for($i = 0; $i < count($matches[0]); $i++){
    $card = $matches[0][$i];
    $mark = $matches[1][$i];
    $num = $matches[2][$i];
    if(in_array($num, $rsf)){
        $cards[$mark]++;
    }
    if($cards[$mark] === 5){
        foreach($rsf as $number){
            $input = implode('.', explode($mark.$number, $input));
        }
        $input = explode('.', $input);
        array_pop($input);
        $trash = implode($input);
        break;
    }
}
$trash = empty($trash) ? '0' : $trash;
echo $trash.PHP_EOL;
?>
ロイヤルストレートフラッシュ以外の手札を捨てる処理がイマイチ。
ロイヤルストレートフラッシュをexplodeimplodeでドット(任意の文字)に置換。
explodeで再び配列にして、array_popで揃った後のカードを除去。
implodeで文字列に直して空チェックしたら出力。

explode/implode祭りすぎる。なんとかならんもんかなー。

2012/09/16

[書評]日経ソフトウエア 2012年 07月号

日経ソフトウエア 2012年 07月号 [雑誌]
日経BP社
発売日:2012-05-24
ブクログでレビューを見る»
深津貴之の使いやすいiPhoneアプリの作り方、
やわらか頭でアルゴリズムを10倍生かす!
付録は「jQuery Mobile ポケット事典」という小冊子。
日経ソフトウエア ダウンロード - 2012年:ITpro

深津貴之の使いやすいiPhoneアプリの作り方

プロダクトの使いやすさの4つの性質
  • 作業の不便を取り除く
  • 作業の手順を簡略化する
  • 作業のミスを簡略化する
  • 作業に付加価値を与える
ユーザビリティに大きく影響するので常に意識しておきたい。

やわらか頭でアルゴリズムを10倍生かす!(前編)

幅優先探索のわかりやすい解説。考え方は理解できたので今度から幅優先探索を使って解いていきたい。
深さ優先探索と違って色々用意するものがあって面倒臭そうだけど一度書いてしまえば使いまわせそうな感じ。

おまけ

付録の jQuery Mobile ポケット事典 は普通に使える。
気合の入った人なら本家ドキュメントを読んだほうがいいのだろうけど
さらっとどんな感じか知りたいのなら丁度良い。
jQuery Mobile
jQuery Mobile: Demos and Documentation

日経ソフトウエア 2012年 07月号 [雑誌]
日経ソフトウエア 2012年 07月号 [雑誌]

2012/09/13

[競技プログラミング][PHP][天下一プログラマーコンテスト2012]与えられた数より小さい素数の個数について

A - 与えられた数より小さい素数の個数について

時間制限 : 2sec / スタック制限 : 10MB / メモリ制限 : 64MB

問題文

素数とは、1 と自分自身以外に正の約数を持たない、1 以外の自然数のことをいいます。

自然数 n が与えられるので、 n よりも小さい素数の数は何個存在するかを求めてください。

入力

入力は以下の形式で標準入力から与えられる。
n
自然数 n ( 1≤n≤10,000 ) が 1 行で与えられる。

出力

n よりも小さい素数の個数を標準出力に 1 行で出力せよ。
なお、行の終端には改行が必要である。

出典

A: 与えられた数より小さい素数の個数について - 天下一プログラマーコンテスト2012 予選C | AtCoder

回答

AtCoder/tenka1_2012_C_1.php at master · wada811/AtCoder · GitHub
<?php
fscanf(STDIN, "%d", $n);
$isPrime[0] = $isPrime[1] = 0;
for($i = 2; $i < $n; $i++){
    $isPrime[$i] = 1;
}
for($i = 0; $i < $n; $i++){
    if($isPrime[$i] === 1){
        for($j = 2 * $i; $j < $n; $j += $i){
            $isPrime[$j] = 0;
        }
    }
}
$count = array_count_values($isPrime);
echo max(0, $count[1]).PHP_EOL;
?>
AOJ/vol0/AOJ0009.cpp at master · wada811/AOJ
AOJでC言語で書いた素数判定をPHPに書きなおすだけの簡単なお仕事。
array_count_valuesで素数フラグをカウントしてやればOKだけど
単純に出力すると2ケースだけテスト落ちる。
$n に 0 か 1 を渡されると出力するものがないので
maxで最低でも 0 を出力するようにするとちゃんと通る。

2012/09/12

[競技プログラミング][PHP][天下一プログラマーコンテスト2012][AC] camel_case

[競技プログラミング][PHP][天下一プログラマーコンテスト2012]camel_case | DevAchieveの解き直し版。
記事で分かる人教えてくださいってお願いしておいたら本当に教えてくださる方が!感謝です!


回答

AtCoder/tenka1_2012_B_2_preg_replace.php at master · wada811/AtCoder
<?php
$variable = trim(fgets(STDIN));
if(isCamelCase($variable)){
    $variable = toSnakeCase($variable);
}else if(isSnakeCase($variable)){
    $variable = toCamelCase($variable);
}
echo $variable.PHP_EOL;


function isCamelCase($str){
    return preg_match('/^_*[a-z][a-z0-9]*([A-Z][a-z0-9]*)*_*$/', $str, $matches);
}

function toCamelCase($str){
    preg_match('/^(_*).*$/', $str, $matches);
    $str = substr($str, strlen($matches[1]));
    return $matches[1].preg_replace('/_([a-z])/e', 'strtoupper("$1")', $str);
}

function isSnakeCase($str){
    return preg_match('/^_*[a-z][a-z0-9]*(_[a-z][a-z0-9]*)*_*$/', $str, $matches);
}

function toSnakeCase($str){
    return preg_replace('/([A-Z])/e', '"_".strtolower("$1")', $str);
}
?>
AtCoder/tenka1_2012_B_2_preg_replace_callback.php at master · wada811/AtCoder
<?php
$variable = trim(fgets(STDIN));
if(isCamelCase($variable)){
    $variable = toSnakeCase($variable);
}else if(isSnakeCase($variable)){
    $variable = toCamelCase($variable);
}
echo $variable.PHP_EOL;


function isCamelCase($str){
    return preg_match('/^_*[a-z][a-z0-9]*([A-Z][a-z0-9]*)*_*$/', $str, $matches);
}

function toCamelCase($str){
    preg_match('/^(_*).*$/', $str, $matches);
    $str = substr($str, strlen($matches[1]));
    return $matches[1].preg_replace_callback(
        '/_([a-z])/',
        create_function('$matches', 'return strtoupper($matches[1]);'),
        $str);
}

function isSnakeCase($str){
    return preg_match('/^_*[a-z][a-z0-9]*(_[a-z][a-z0-9]*)*_*$/', $str, $matches);
}

function toSnakeCase($str){
    return preg_replace_callback(
        '/([A-Z])/', 
        create_function('$matches', 'return "_".strtolower($matches[1]);'),
        $str);
}
?>
無事に両方通りました。原因としては単語が一文字でもOKだったということ。
ただ、一文字だけの単語を許容しても置換で preg_replace と preg_replace_callback は
_aXYZ0_ を見た際に aX の後は xY ではなく、 YZ を見に行ってしまうので
マッチ方法を変えなければいけませんでした。
判定でガチガチにキャメルケースとスネークケースを判別しているので変換では少し緩めにしました。
キャメルケース → スネークケース の場合は、大文字がマッチした時点で単語の先頭だということになります。
スネークケース → キャメルケース の場合は、先頭に付加されるアンダースコアが判定に影響するので
function toCamelCase($str){
    preg_match('/^(_*).*$/', $str, $matches);
    $str = substr($str, strlen($matches[1]));
    return $matches[1].preg_replace_callback(
        '/_([a-z])/',
        create_function('$matches', 'return strtoupper($matches[1]);'),
        $str);
}
先頭のアンダースコアをマッチさせて除去した後に置換をかけて、
プレフィックスとしてアンダースコアを付加することにしました。

おかげさまで解くことができました。@cielavenirさん、本当にありがとうございました!

2012/09/11

[書評]マンガでわかるデータベース

マンガでわかるデータベース
高橋麻奈
発売日:2005-12
ブクログでレビューを見る»
データベースの概念、基礎知識をマンガで解説した本。
マンガと解説文が半々で演習問題もあり。
結構しっかりした内容で後半は全くの初心者にはなんのことだかわからないかも。
サクッと全体を知るには良いと思う。

ちょっと萌え系のマンガだけど意外と内容はしっかりしててわかりやすいと聞いたので読んでみました。
情報処理技術者試験対策にも使えるように書かれているので受験を考えている人にちょうどいいと思います。
簡単な SQL なら書けるけどって人が読んでおくとデータベースのことをもっと理解できるでしょう。

流れとしては、第1章でデータベースとは何か、データベースの必要性について解説し、
第2章で基本的な用語を抑え、第3章で E-R モデルで分析してデータベースを設計し、
第4章で一通り SQL を使ってデータベース操作をする構成になっています。
第5章以降は運用や実際的な利用についてなので初心者にはイメージしにくいかと思いました。

正規化の話が結構わかりやすいので他の本や解説などで理解できなかったのなら読んでみるといいと思います。
非正規形: 一つの項目に複数の値が入っている状態
第一正規形: 非正規形を分割して各行に一つの値が入っている状態
第二正規形: 主キーの値が決まると他の列の値が決まる状態
第三正規形: 主キー以外の値によって他の列が決まることのない状態
ぱっと見、第二正規形と第三正規形の違いがないように見えますが、地味に違います。
「ある値によって他の値が決まる」というのを関数従属といいますが、
これは「Aが決まるとBが決まる」というのを「A→B」と表すと、「A→B」も「い→ろ→は」も含まれ、
この状態のデータベースを第二正規形と呼びます。
このうち「い→ろ→は」については、「い」が決まって「ろ」が決まり、それによって「は」が決まるという
連鎖が含まれています。このような連鎖のことをデータベースでは推移(関数)従属といい、
この連鎖をなくした、「ある値以外で他の値が決まることのない」状態のことを第三正規形と呼びます。

第一正規化は理解していましたが、第二正規化と第三正規化がイマイチ理解できていなかったのですが、
わかりやすいマンガと しっかりとした解説で理解することができました。
基本的なことから始めたい人は結構オススメです!

データベース初心者がSQLを極めるためのオススメ書籍6冊 | DevAchieve
データベース初心者が概念や基礎知識を学び、
SQLの書き方やDB設計など習得して
DBとSQLを極めるまでのステップアップとなる本を6冊ピックアップしてみました。

このデータベース坂を一緒に登ってみませんか?
マンガでわかるデータベース
マンガでわかるデータベース

2012/09/10

[書評]日経ソフトウエア 2012年 06月号

日経ソフトウエア 2012年 06月号 [雑誌]
日経BP社
発売日:2012-04-24
ブクログでレビューを見る»
矢野りんのデザイン業務レポート、
プログラミングでコレがやりたい!40選、
初めて作るスマホアプリ、Androidのここに注意!、
深津貴之の使いやすいiPhoneアプリの作り方。
付録は「HTML5逆引きポケット事典」という小冊子。
日経ソフトウエア ダウンロード - 2012年:ITpro

矢野りんのデザイン業務レポート

上から順にやってもらう場合、リスト型のUIだとユーザーが何をすればいいのか戸惑うかもしれない。
リスト型の UI は階層構造をイメージさせるのでどこかに「飛んで」いく場合には向いてないかも。
「飛んで」いくならボタンなどがいい。ちゃんとした説明文とわかりやすい文言のボタンが良い。

プログラミングでコレがやりたい!40選

「ナンプレを解くプログラムを作りたい」というトピックは深さ優先探索を使っていて参考になった。
「迷路の最短経路を発見したい」というトピックは幅優先探索が使われていてAtCoderで解くときに役立ちそう。
すごく雑多で微妙。

初めて作るスマホアプリ iPhoneアプリを1時間で作る

難しいことを一切解説せずに3分クッキングやりましたな感じ。InterfaceBuilder の使い方だけ学べる。

Androidのここに注意! セキュリティ対策のツボ

対象読者のレベルが上ったり下がったりしたのは気のせいだろう。
そういえばAndroid Security 安全なアプリケーションを作成するためにをまだ読めてない。
今回のAndroid特集はセキュリティ特集とかマニアックな感じのネタが多かったような。

深津貴之の使いやすいiPhoneアプリの作り方

iPhoneアプリ設計の極意 ―思わずタップしたくなるアプリのデザインの訳者であり、
iPhoneアプリ開発者として有名な@fladdictさんの記事。
アプリ開発者はPCの電源を切ってペーパープロトタイピングしよう!という話。
ピグマサインペン 0.5mmで輪郭を描き、コピックというマーカーで面を塗るらしいです。
紙は75×50mmのポストイットがiPhoneの画面と全く同じサイズ(!)でいいんだそう。
アイディアをメモして、画面も作れるし、貼れるので一覧もできるし画面遷移もわかりやすくていいらしい!
1ページの記事だったけどどの記事よりも価値のある記事だと思った。

おまけ

「インターン女子C#を学ぶ」が終わってしまい、「マンガでスキルアップC#プリミティブ」が始まりました。
妖精さんにいろんな物をさらっと教える感じで「インターン女子」と比べると浅く感じたのは気のせいか。
付録の小冊子は「HTML5逆引きポケット事典」で、表紙に何故か栃木のアイドルユニットがいるという謎。
HTML5のタグの解説というより、広義のHTML5で Canvas API, Web Storage API, Geolocation API,
Drag and Drop API, File API, Text Selection API, Web Messaging API,
Web Worker API, Offline Web Applicaitons の解説とサンプルコードがあって結構いい感じ。当たりの付録です。

日経ソフトウエア 2012年 06月号 [雑誌]
日経ソフトウエア 2012年 06月号 [雑誌]

2012/09/09

[書評]日経ソフトウエア 2012年 05月号

日経ソフトウエア 2012年 05月号 [雑誌]
日経BP社
発売日:2012-03-24
ブクログでレビューを見る»
Xcode4.2使い方入門、Android4.0プログラミング入門。
付録は「根本からわかる!Webプログラミング」という冊子。

日経ソフトウエア ダウンロード - 2012年:ITpro

Xcode4.2使い方入門

ジェスチャーレコグナイザー、静的アナライザやデバッガの使い方について解説されている。
この号で連載は終わりみたい。残念。

Android 4.0 の新機能を学ぶ
Wi-Fi Direct を使って高速&リアルタイム通信を実現

結構良さ気だけど、まだ洗練されてないせいか実用レベルでは無さそうな感じ。
やり取りが多くて面倒くさそうだけど Wi-Fi Direct のフローの説明があるので手元にあるとよさそう。

おまけ

「インターン女子C#を学ぶ」は属性について。ネコミミ属性がついてかわいい。そしてわかりやすい。
結構わかりやすくて面白いのだが最終回のようだ。
付録「根本からわかる!Webプログラミング」はHTMLわからないレベルぐらいが対象だった。

ちょっと読みたい記事なさすぎて購読し続けるかどうかを考えだした。
とりあえず買ってしまったものについては一通り読んでみる。
日経ソフトウエア 2012年 05月号 [雑誌]
日経ソフトウエア 2012年 05月号 [雑誌]

2012/09/08

Twitter API が v1.1 になったから Overview を訳してみた

Current status: API v1.1 | Twitter Developers
結構早かったですね。
Overview: Version 1.1 of the Twitter API | Twitter Developersを意訳しました。

Twitter API v1.1はローンチ以来、初めてのAPIアップデートです。
我々はそれが開発者にとって何を意味するのか興奮しているし、
ここにすべての意味のある変更を補足したので
どんな小さなことも見逃さないでください。
  1. 改良されたレートリミット
  2. JSONのみのサポート
  3. すべてのエンドポイントで認証は必須
  4. 開発者ルールのアップデート
  5. 開発者ディスプレイ要件
  6. 新しいTwitterクライアントポリシー
  7. entities と retweets のデフォルト化
  8. API v1.0 の廃止
  9. dev.twitter.com のアップデート
  10. フィードバックと次のステップ

改良されたレートリミット

我々は、エンドポイント毎に15分のスパンにレートリミットのウインドウ(?)を分割して、
ほとんどの個々の呼び出しはそれぞれのウインドウで15リクエストを可能にしている。
(訳注※ほとんどの API は15分に15回のリクエストが可能)
ほとんどの場合、あなたは以前より多くのエンドポイント毎の API 呼び出しができるでしょう。
他の幅広く使われている API は、ウインドウ毎に 180 回の呼び出しができます。
これは GET statuses/show/:id, GET users/lookup, GET search/tweets や他の呼び出しを
行うアプリケーションに特に有利になります。
API v1.1のレートリミットのドキュメントを読むだけでなく、
ここで各エンドポイントごとのレートリミットを確認してください。

JSONのみのサポート

API v1.1 は JSON のみをサポートします。
我々は、まずストリーミング API 、より最近にトレンド API の XML サポートをやめ、
しばらくのあいだ、これをほのめかしてきました。
我々は、プラットフォーム間で共有される JSON フォーマットを支持することを選びました。
したがって、我々は今日使われるのは稀な XML, Atom, RSS のサポートを中止することを決定しました。
歴史的な文脈のため、我々が API を構築した時に、すべての主要な言語は
JSON をサポートする高性能な、よく銀にされたライブラリを持っていませんでした。
しかし、今日ではそれを持っています。

すべてのエンドポイントで認証は必須

v1.1では、我々はアプリケーションにすべてのリクエストは OAuth 1.0a で認証することを要求している。
現在、この(Twitterにとっての)可視性は(Twitterに対する)虐待的な行為を防止できるだけでなく、
アプリケーションのカテゴリによってどのような API を使っているのかを一層理解するのに役立ちます。
より開発者のニーズを満たせるようにその理解を利用して、我々はプラットフォームを進化させ続けます。
この時点で、すべての認証はユーザーのコンテキストを必要としますが、
今後数週間のうちにユーザーのコンテキストを必要としない認証のフォームのサポートを出します。

開発者ルールのアップデート

我々は開発者ルールをアップデートました。
また、あなたが知っておくべき最も重要なポリシーのコンセプトの概要を作成しました。

開発者ディスプレイ要件

我々の以前のディスプレイガイドラインは更新され、現在のディスプレイ要件だと考えられています。
あなたがWebやモバイルのコンテキストでツイートやタイムラインをレンダリングしている場合は
これらの新しいDeveloper Display Requirementsを確認したいと思う。
(訳注※よくわからないけど読んどけよーくらい?ガチガチに強制しているようではない?)

新しいTwitterクライアントポリシー

コアの Twitter 体験を再現するすべてのアプリケーションは、通常"クライアント"と呼ばれ、
10万ユーザートークン制限を含む、いくつかの新しい制限がかけられることになります。
明確にするために、10万ユーザートークン制限はコアの Twitter 体験を複製する少数のクライアントに
適用され、より広いエコシステムの他のアプリケーションの大部分には適用されません。

これらの新しい条項は、我々の更新されたDeveloper Rules of the Roadで詳細に説明されています。

entities と retweets のデフォルト化

該当する場合には、entities やリツイートは現在の v1.1 でデフォルトで返されます。
include_entities が false にされていない限り、Entities が Tweet オブジェクトの一部として返されます。
include_rts が false にされていない限り、公式リツイートがタイムラインに含まれることになります。

API v1.0 の廃止

ほとんどの開発者は v1.0 から v1.1 への移行ですべきことはほとんど何もありませんが、
我々は移行作業をする十分な時間があることを確認したい。
我々は v1.0 をオフにする前に6ヶ月の猶予を提供する予定です。
2013年3月5日以降、v1.0 のエンドポイントは使用できなくなります。

dev.twitter.com のアップデート

dev.twitter.comのドキュメントは API v1.1 での最新の変更と利用可能なメソッドを反映しています。
あなたが v1.0 と v1.1 のどちらのドキュメントを閲覧しているかより区別しやすくするために
各エンドポイントのドキュメントの上にバージョンを示す新しい青い錠剤に気づくでしょう。

フィードバックと次のステップ

あなたが API の新しいバージョンで問題を発見した場合、
気づいたことを報告するために Issue Tracker を使ってください。
最後に、我々は最も一般的な質問に答えるために、v1.1 に関するFAQを作成しました。
あなたがそこで答えを見つけられなかった場合は、
常に我々が利用でき、あなたのフィードバックのすべてをアクティブに聞くことのできる
API v1.1 専用のディスカッションスレッドにいつもポストできます。
我々は v1.1 への進化の過程を通してあなたと働くことを楽しみにしていて、
みんなが構築するものを見るために待つことができない。
今何かと叩かれてる感じあるけど期待してる。

2012/09/04

[書評]ウェブデザインのつくり方、インターフェイスデザインの考え方。

ウェブデザインのつくり方、インターフェイスデザインの考え方。
矢野りん
発売日:2011-09-26
ブクログでレビューを見る»
Webデザインの基礎知識を幅広く解説した本。
Webデザインを始めたい人が読むのにちょうど良いボリューム。
デザインと言ってもアートなものではないのでプログラマも知っておいていいと思う。

「新しいウェブデザインの技法大全」と表紙にあるけどそこまでのものではないような気がするけども
一般的にWebデザインについて言われていることについてまとまっているので概要を知るのに役に立つ。

だいたいのことは知っていたけどオブジェクトとアクションに分けて分類するという考え方は知らなかった。
あと、カテゴリ分けの手法でLATCH法というのは知らなかった。
Location:位置, Alphabet:アルファベット, Time:時間, Category:分野, Hierarchy:階層で情報を分類する手法。
考え方が結構参考になる。

ウェブデザインのつくり方、インターフェイスデザインの考え方。
ウェブデザインのつくり方、インターフェイスデザインの考え方。

2012/09/03

[書評]日経ソフトウエア 2012年 04月号

日経ソフトウエア 2012年 04月号 [雑誌]
日経BP社
発売日:2012-02-24
ブクログでレビューを見る»
プログラマが知っておきたい中学・高校の数学と物理、
CoffeeScriptを使ってみよう、Androidアプリ設計法、
Android4.0の新機能を学ぶ、Xcode4.2使い方入門。
付録は基礎から学ぶC言語。
日経ソフトウエア ダウンロード - 2012年:ITpro

プログラマが知っておきたい中学・高校の数学と物理

Processingを使った簡単なプログラムでスマホアプリやゲームの開発などに役立つ知識が得られる。
ProcessingはJavaベースの簡単な言語でシューティングゲーム作るのが楽という話を聞いたことがある。
数学と物理がわかっていれば短いコードで書けるので面白そうだ。こういうのを連載して欲しいかも。

JavaScriptをよりシンプルに!「CoffeeScript」を使ってみよう

CoffeeScriptで書けばJavaScriptのベストプラクティスを自動で踏襲できるという噂を聞いて興味を持ってる。
良い感じに解説されているからCoffeeScriptがどんな言語なのかわかりやすい。
カッコとか色々省略しまくってだいぶ気持ち悪く感じてしまうけど…。慣れれば大丈夫なのかな?
中括弧とかないと構造がぶっ壊れそうで怖い気がするよ。

Andriodアプリ設計法 RSSリーダー

XMLのパースとかListViewの再利用とか参考になるかも。骨格だけだから少し物足りない感じ。

Android4.0の新機能を学ぶ Android Beamを使ったお手軽通信

Android BeamはNFCの規格に従ってデバイス間通信を手軽に行うための機能だそう。
Android2.3ではAPIであったけどもAndroid4.0でOSレベルでNFCをサポートしたのがAndroid Beamだとか。
著者のわかめさんがAndroid2.3 Only Hacks ~Gingerbreadをさくさく使うためのサンプルとテクニックにNFCについて書いているらしい。
BluetoothやWi-Fi Directと比較されているので参考になる。
コードはFragmentとか色々出てきて難しそうな印象。使ってないからわからないけど。
なんか思いついたら使ってみたいけどNFCって赤外線だから用途的に使う機会無さそう。

Xcode4.2使い方入門

ストーリーボードの使い方について。Segueの設定方法とか。
この連載まとめれば下手な入門書いらないわー。使い方レベルで困ることがない。

おまけ

インターン女子C#を学ぶがだいぶ百合っぽくなってまいりました。
ちゃんと学んだことないから結構参考になってるけどね。
付録「現代プログラマの常識!基礎から学ぶC言語」はプラグラミング初めてレベルから
構造体やポインタへと一気にインフレする内容になっててビックリした。これでできたらすごい。

日経 ソフトウエア 2012年 04月号 [雑誌]
日経 ソフトウエア 2012年 04月号 [雑誌]

2012/09/02

[競技プログラミング][PHP][天下一プログラマーコンテスト2012]camel_case

B - camel_case

時間制限 : 2sec / スタック制限 : 10MB / メモリ制限 : 64MB

問題文

以下の通りに、「キャメルケースの文字列」と「アンダースコア区切りの文字列」を定めます。

単語
英小文字で始まる、英小文字・数字から成る文字列
キャメルケースの文字列
1つ以上の単語を、最初の単語以外の先頭の文字を大文字にして連結した文字列
アンダースコア区切りの文字列
1つ以上の単語を、単語の間を1つのアンダースコアで区切って連結した文字列
また、キャメルケースの文字列とアンダースコア区切りの文字列には、
連結した後、最初や最後に1つ以上のアンダースコアが追加されることがあります。

文字列が与えられるので、キャメルケースの文字列とアンダースコア区切りの文字列を相互変換してください。
追加された行頭・行末のアンダースコアはそのまま保持するものとし、
キャメルケースの文字列でもアンダースコア区切りの文字列でもない場合は
与えられた文字列をそのまま出力するものとします。
また、キャメルケースの文字列とアンダースコア区切りの文字列の両方に解釈できる文字列は
どちらであると考えても相互変換した結果が等しくなることが保証されます。

入力

入力は以下の形式で標準入力から与えられる。
c1c2…cN
入力として文字列が 1 行で与えられる。
入力の文字列長 N は、 1≤N≤50 を満たす。
i 文字目の文字 ci は 大文字のアルファベット (A, …, Z) 、
小文字のアルファベット (a, …, z) 、 数字 (0, …, 9) 、 アンダースコア (_ ) のいずれかである。

出力

入力として与えられた文字列を相互変換した文字列を標準出力に 1 行で出力せよ。
なお、行の終端には改行が必要である。

出典

B: camel_case - 天下一プログラマーコンテスト2012 予選B | AtCoder

回答

preg_replaceのe修飾子版
Submission #41990 - 天下一プログラマーコンテスト2012 予選B | AtCoder
AtCoder/tenka1_2012_B_2_preg_replace.php at master · wada811/AtCoder


preg_replace_callback版
Submission #41989 - 天下一プログラマーコンテスト2012 予選B | AtCoder
AtCoder/tenka1_2012_B_2_preg_replace_callback.php at master · wada811/AtCoder · GitHub

AtCoder上の回答を載せているのは通らなかったから…。
<?php
$variable = trim(fgets(STDIN));
if(isCamelCase($variable)){
    $variable = toSnakeCase($variable);
}else if(isSnakeCase($variable)){
    $variable = toCamelCase($variable);
}
echo $variable.PHP_EOL;
 
function isCamelCase($str){
    return preg_match('/^_*[a-z][a-z0-9]+([A-Z][a-z0-9]+)+_*$/', $str, $matches);
}
function toCamelCase($str){
    return preg_replace('/([a-z0-9])_([a-z])/e', '$1.strtoupper("$2")', $str);
}
function isSnakeCase($str){
    return preg_match('/^_*[a-z][a-z0-9]+(_[a-z][a-z0-9]+)+_*$/', $str, $matches);
}
function toSnakeCase($str){
    return preg_replace('/([a-z0-9])([A-Z])/e', '$1."_".strtolower("$2")', $str);
}
?>
preg_replaceだけで使えるe修飾子を使えば第二引数をPHPコードとして評価してくれます。
セキュリティ的にヤバイらしいので下のpreg_replace_callbackを使えと言われています。
<?php
$variable = trim(fgets(STDIN));
if(isCamelCase($variable)){
    $variable = toSnakeCase($variable);
}else if(isSnakeCase($variable)){
    $variable = toCamelCase($variable);
}
echo $variable.PHP_EOL;
 
function isCamelCase($str){
    return preg_match('/^_*[a-z][a-z0-9]+([A-Z][a-z0-9]+)+_*$/', $str, $matches);
}
function toCamelCase($str){
    return preg_replace_callback(
        '/([a-z0-9])_([a-z])/',
        create_function('$matches', 'return $matches[1].strtoupper($matches[2]);'),
        $str);
}
function isSnakeCase($str){
    return preg_match('/^_*[a-z][a-z0-9]+(_[a-z][a-z0-9]+)+_*$/', $str, $matches);
}
function toSnakeCase($str){
    return preg_replace_callback(
        '/([a-z0-9])([A-Z])/', 
        create_function('$matches', 'return $matches[1]."_".strtolower($matches[2]);'),
        $str);
}
?>
こちらは第二引数がコールバック関数になっているのでcreate_functionで作ってやります。
中でstrtoupperしたり、strtolowerしたりしてキャメルケースとスネークケースを相互変換してます。

綺麗なソースだろ?通らないんだぜ…これ…

どうやら正規表現の判定がミスっているらしいのだが…。
連結した後、最初や最後に1つ以上のアンダースコアが追加されることがあります。
最初と最後のアンダースコアをマッチ: /^_*(hoge)_*$/
単語
英小文字で始まる、英小文字・数字から成る文字列
単語: /[a-z][a-z0-9]+/
キャメルケースの文字列
1つ以上の単語を、最初の単語以外の先頭の文字を大文字にして連結した文字列
キャメルケース: /[a-z][a-z0-9]+([A-Z][a-z0-9]+)+/
最終的なキャメルケースの正規表現: /^_*[a-z][a-z0-9]+([A-Z][a-z0-9]+)+_*$/
ということでこれはよさそう。
アンダースコア区切りの文字列
1つ以上の単語を、単語の間を1つのアンダースコアで区切って連結した文字列
スネークケース: /[a-z][a-z0-9]+(_[a-z][a-z0-9]+)+/
単語をアンダースコア区切りで繰り返すのでこれで良いはず。
最終的なスネークケースの正規表現: /^_*[a-z][a-z0-9]+(_[a-z][a-z0-9]+)+_*$/
これも良さそうなのだが何やらAtCoderの結果を何度か見ていると
スネークケースが漏れているんじゃないかと思うようなことがあった。勘だけど…。

わからないのでわかった方ブログのコメントとかTwitterとかで教えてください。
お願いします。

2012/09/01

[競技プログラミング][PHP][天下一プログラマーコンテスト2012]孫子算経

A - 孫子算経

時間制限 : 2sec / スタック制限 : 10MB / メモリ制限 : 64MB

問題文

いま、物が有る。
その数は 1 以上 127 以下である。
3 で割ると、 a 余る。 5 で割ると、 b 余る。 7 で割ると、 c 余る。
いくつ物があるとそうなるか小さい順に答えよ。

入力

入力は以下の形式で標準入力から与えられる。
a b c
入力として 3 つの整数 a ( 0≤a≤2 ), b ( 0≤b≤4 ), c ( 0≤c≤6 ) が空白で区切られて 1 行で与えられる。

出力

条件を満たす物の数を小さい順に改行区切りで出力せよ。
なお、行の終端には改行が必要である。

出典

A: 孫子算経 - 天下一プログラマーコンテスト2012 予選B | AtCoder

回答

AtCoder/tenka1_2012_B_1.php at master · wada811/AtCoder · GitHub
<?php
fscanf(STDIN, "%d %d %d", $a, $b, $c);
for($i = 1; $i < 128; $i++){
 if(($i % 3 == $a) && ($i % 5 == $b) && ($i % 7 == $c)){
  echo $i.PHP_EOL;
 }
}
?>
めちゃくちゃ簡単だった。
書くことない…。
終わり!