ページ

2012/12/30

2012年に @wada811 が読んだ技術書まとめ

2012年も終わりに近づいているので@wada811が読んだ技術書を振り返ってみようかと思います。

2012/01/14 [書評]Web標準の教科書―XHTMLとCSSでつくる“正しい”Webサイト | DevAchieve

趣味でやっていたHTML/CSSを業務レベルに上げるために基礎からおさらいしました。
最近HTML5が仕様策定完了したのでHTML5/CSS3バージョンで出して欲しいですね。
CSS3まだまだぐちゃぐちゃしてて無理かもしれませんが…。(linear-gradientとか使ってみたけど酷い…)

2012/01/15 [書評]WEB+DB PRESS 総集編 [Vol.1~60] | DevAchieve

ちょっとずつ読んでいって最近全部読み終わりました。
流石に古くかったり、やってない言語などは参考にはならなかったけど
普遍的な内容は結構勉強になった。効率が良いかと問われると微妙だと言わざるをえないけど…。
最近の号はやはり得るものはそこそこ多いので普通に買うのはありかもしれません。

2012/01/15 [書評]良いコードを書く技術 読みやすく保守しやすいプログラミング作法 | DevAchieve

ある程度良いコードを書けていればリーダブルコードを読んだ方が得るものもあるんじゃないかと思います。
原典にあたる重要性を教えてくれるのと参考文献を紹介してくれるのでそこはいいと思います。

2012/01/15 [書評]コンピュータはなぜ動くのか ~知っておきたいハードウエア&ソフトウエアの基礎知識~ | DevAchieve

2012/01/15 [書評]プログラムはなぜ動くのか 第2版 知っておきたいプログラムの基礎知識 | DevAchieve

2012/01/15 [書評]ネットワークはなぜつながるのか 第2版<br>知っておきたいTCP/IP、LAN、光ファイバの基礎知識 | DevAchieve

なぜ〜なのかシリーズ。レビューを書いたのがこの日というだけでさすがに1日で3冊読めるものじゃない。
基本情報技術者を取るのと、ソフトウェア会社でエンジニアになるにあたって
非情報学科の大学生だった俺がとりあえず基礎知識を仕入れておかねばと読んだ本です。
まぁそこまで無駄ではなかったと思いたいです。ネットワークはちんぷんかんぷんのままだったけど…。

2012/03/31 [書評]できる逆引き Excel VBAを極める 勝ちワザ700 2010/2007/2003/2002対応 (「できる逆引き」シリーズ) | DevAchieve

内定先アルバイトでExcel VBAをやるのに読んだ本です。なかったら結構きつかったかも。

2012/03/30 [書評]よくわかるPHPの教科書 | DevAchieve

レビュー日だから日付が前後してますが、読んだのはこっちが後です。
プログラミング言語はもういくつか使っていたのでPHPでどんな事するのかの概要を知るために買ってみました。
プログラミング経験があればプロになるためのWeb技術入門
プロになるための PHPプログラミング入門で十分な内容だったかも。

2012/04/15 基本情報技術者試験を受験するまでに使った参考書3冊 | DevAchieve

基本情報技術者試験に受かったので使った参考書のレビューをしました。
改訂新版 基本情報技術者 らくらく突破 表計算はオススメだと思います。
後は過去問やっておけばなんとかなるような気がしますね。
そのくらい過去問でやってたことが形を変えて出てきます。

2012/04/21 [書評]プログラミングの宝箱 アルゴリズムとデータ構造 第2版 | DevAchieve

基本情報技術者試験に受かったはいいものの、情報科出身ではないのでアルゴリズムとデータ構造について
まともに学んだことがなくてイマイチな得点だったので勉強のために読んでみました。
アルゴリズムとデータ構造について学んだことがない人は読んでおくといいと思います。

2012/04/25 [Twitter][API]改訂で2012年5月14日までに開発者がするべきこと | DevAchieve

Twitter API ポケットリファレンスの事もちょっと書いている記事なので。
TwitterのAPIを叩くなら結構必須だと思います。かなり役に立ちました。
TwitterのAPIが1.1にバージョンアップしますが読んでおくと1.1のこともわかりやすいかもしれません。

2012/05/12 [書評]よくわかるiPhoneアプリ開発の教科書【iOS 5&Xcode 4.2対応版】 | DevAchieve

iPhoneアプリを作ることになってXcodeやInterface Builderの使い方がぜんぜんわからなかったので
そのへんを解説している一番簡単そうな本を読んでみました。
iPhoneを使っていなかったのでどんな機能、どんなパーツがあるかを知ることができたのは良かったと思います。

2012/05/09 [書評]詳解 Objective-C 2.0 第3版 | DevAchieve

iPhoneアプリを作るにはObjective-Cで書くのだけれど結構他の言語とは異なっていたので
よく理解するために読んでみました。使いこなせてはいないけど理解することはできました。
もっとObjective-CをマスターしてiPhone/Android両方できますと胸を張って言えるようになりたいです。

2012/06/02 [書評]知る、読む、使う! オープンソースライセンス | DevAchieve

昔、図書館で読んだソフトウェアライセンスの話が電子書籍になって出版されていたので読んでみました。
ソフトウェアライセンスも大事な話ですから一回は学んでおいたほうがいいですね。

2012/06/03 [書評]「プロになるためのWeb技術入門」なぜ,あなたはWebシステムを開発できないのか | DevAchieve

アプリばっかり作っていてWebとかPHPとかのあたりが全然わかってなかったのでコレで勉強しました。
コレはもっと早く読んでおきたかったというくらいの基礎知識でした。

2012/06/09 [書評]iPhoneプログラミングUIKit詳解リファレンス | DevAchieve

話はまたiPhoneに戻って今度はUIKitを解説した本です。
コレがなかったらリファレンスを読むしかなかったかもしれません。
この本はiOS4ベースで今使い物になるか不安になるかもしれませんが、
iOS5/6で追加はされましたが既存のものはそんなに変わっていないと思うので大丈夫かと思います。

2012/06/30 [書評]iPhoneアプリ設計の極意 ―思わずタップしたくなるアプリのデザイン | DevAchieve

iPhoneに限らずAndroidアプリのデザイン設計をするのにも役立つ本です。
こういうの本の内容を理解していない人がアプリって
すごく微妙だったりするので使いやすいアプリを作りたいなら必読です!

2012/07/23 [書評]達人プログラマー システム開発の職人から名匠への道 | DevAchieve

名著だと言われていたので読んでました。
実際のプログラミング、システム開発に近い所でのプログラマがどうあるべきかを説いている本です。
プログラマとしてどうあるべきか不安がある人は読んでおくといいかもしれません。

2012/07/08 日経ソフトウエアをまとめ買いしてやったぜぇ~ワイルドだろぅ? | DevAchieve

2012/08/09 [書評]日経ソフトウエア 2012年 01月号 | DevAchieve

2012/08/12 [書評]日経ソフトウエア 2012年 02月号 | DevAchieve

2012/08/20 [書評]日経ソフトウエア 2012年 03月号 | DevAchieve

2012/09/03 [書評]日経ソフトウエア 2012年 04月号 | DevAchieve

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

2012/09/10 [書評]日経ソフトウエア 2012年 06月号 | DevAchieve

2012/09/16 [書評]日経ソフトウエア 2012年 07月号 | DevAchieve

2012/09/18 [書評]日経ソフトウエア 2012年 08月号 | DevAchieve

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

忙しい中で効率的に最新情報を手に入れるには雑誌がいいのでは?
ということで日経ソフトウエアを購読してみました。
最初は興味が有ることが多くて良かったのだけど、
終盤は読みたい記事も少なくなりコスパ悪かったので購読やめちゃました。
他にも読みたい本あるし必要な時にちゃんとした本で情報を仕入れた方が確実な知識が手に入ると思いました。

2012/08/24 [書評]必ず結果が出るブログ運営テクニック100 プロ・ブロガーが教える“俺メディア”の極意 | DevAchieve

ネット上でよくブログ論、ブログテクニックの記事を読んでいたので目新しいことはなかったのですが、
逆にそういうのを読んでいない人は本書を読んでおくと良いかもしれません。ブログで稼ぎたい人向です。
僕はセルフブランディングと備忘録が出来ればいいのでブログで直接お金を稼ぎたいわけではないので
この本を読んでどうこうしようというのはありませんでした。技術ブログで記事量産とか無理ですし…。

2012/08/26 [書評]リーダブルコード The Art of Readable Code | DevAchieve

コードは理解しやすくなければならないという考えのもと、
理解するための時間を最短にするための実践的なテクニック集を解説している本です。
変数名には説明的な名前をつけるべきとか
どういうコメントを書くべきかとかを解説しているので読んでマスターしてください!

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

デザインというから敬遠されがちですが、スタイリングとかデコレーション的なアートな感じではなく
設計なのでWeb系の開発者は読んでおくと良いと思います。(プログラマーもデザインを理解しておくべき論)

2012/09/11 [書評]マンガでわかるデータベース | DevAchieve

データベースの概念、基礎知識をマンガで解説した本です。
なんとなくSQLを書いたことがある人がしっかりデータベースを勉強しようと思ったら
この本から学んでいくのが良いと思います。情報処理技術者試験のデータベースあたりの勉強にも使えます。
ちなみにごっちゃになりやすい第二正規形と第三正規形の違いは連鎖があるかどうかです。(詳しくは記事へ)

2012/09/26 [書評]SQL ゼロからはじめるデータベース操作 | DevAchieve

標準SQLでRDBMSによらないSQLが書けるようになる本です。
コレ一冊でOracle, SQL Server, DB2, PostgreSQL, MySQLで動くSQLが書けるようになります。
この本をマスターしたら後のSQLは応用するだけで組めるようになるので是非マスターしましょう!

2012/10/02 [書評]プログラミングコンテストチャレンジブック [第2版] | DevAchieve

競技プログラミングをたまにやっているので勉強用にと読んでみました。
難しいこと書いてあって睡眠導入剤として優秀すぎたので読むのは諦めました…。

2012/11/03 [書評]Android SDK開発のレシピ | DevAchieve

第1版と第2版ともに読んだ本です。第2版はカメラ周りが実装にかなり役に立ちました。
その他のサンプルも役に立っているので手元において開発をしていました。

1年で書籍25冊と雑誌9冊を読んだ!

正確には書評を書いていない書籍とかあったり、つまみ読みで通して読んでない本とかあったり、
途中で読むのをやめた書籍があったりで書籍と雑誌あわせて40冊くらいだと思います。
今年読んだけど書評を書いてない本は以下のとおり。
Webを支える技術情熱プログラマー入門gitObjective-C逆引きハンドブック
PHP 逆引きレシピ平成25年度【春期】【秋期】 応用情報技術者 合格教本
12月はレビューを一冊も書いていないのですが、
これは応用情報技術者の勉強を始めたので他の本は全然読んでいないからです。

これだけ本を読んで身につけたのがObjective-CとPHPとSQLくらいでしょうか。
まだまだユニットテストとかTDDとかJenkinsでCIとかの高位な部分や、
JavaScriptやRubyなどの他の言語などをもっと学びたいです。
もっと色々なことを身につけられる機会、環境、時間が欲しいです。速さが足りない!

2012/12/28

Sublime Text 2の設定とDiffの取り方

Sublime Text 2とは

凄く便利で使いやすいと最近エンジニアの間に話題になっているエディタです。
なんかめっちゃ色々できて良いらしいので使い始めることにしました。
Sublime Text: The text editor you'll fall in love withからダウンロードできます。
恋に落ちるエディタと自称するだけあってかなり評判いいです。

ライセンス料は$59ですが試用版でも無期限で使えるようです。
今後リリース予定のSublime Text 3はアップデートにお金がかかるらしいです。
Sublime Text 2 - Sales FAQ

おそらくSublime Text 2ユーザーは割安なアップデート料を払えばよくて
新規になると値上がりしてて手を出しにくくなるのが
この手のソフトウェアにありがちなパターンだと思うので今のうちに買っておくのが良いかもしれません。
PayPalで支払いができて今なら5000円切るので更に円安になる前に買っておくのがお得かと思います。

Sublime Text 2の設定

Sublime Text 2 > Preferences > Settings - User (command + ,)で設定ファイルを開きます。
開いても殆ど何も書かれていなくて何を設定すればいいのかわからないので
Sublime Text 2 > Preferences > Settings - Defaultから Settings - User にまるっとコピペしました。
設定に関してはSublime Text 2 のDefault設定ファイルを眺める - blue_ham_cake1024のブログ
Y.A.M の 雑記帳: Sublime Text 2 の設定を参考にして変更してみました。
// フォントの指定
-    "font_face": "",
+    "font_face": "consolas",

// フォントサイズ
-    "font_size": 12,
+    "font_size": 14,

// 指定した幅のところで縦線が入ります。配列形式で複数指定できます。
-    "rulers": [],
+    "rulers": [100, 120],

// スペースをタブに変換
-    "translate_tabs_to_spaces": false,
+    "translate_tabs_to_spaces": true,

// 折り返しを強制
-    "word_wrap": "auto",
+    "word_wrap": true,

// その代わりに幅は広めに
-    "wrap_width": 0,
+    "wrap_width": 120,

// ミニマップ上でのファイルの現在の表示範囲をボーター表示
-    "draw_minimap_border": false,
+    "draw_minimap_border": true,

// 現在の行をハイライト
-    "highlight_line": false,
+    "highlight_line": true,

// 空白類の表示を常に
-    "draw_white_space": "selection",
+    "draw_white_space": "all",

// インデントのラインをキャレットの色とは異なる色で表示
-    "indent_guide_options": ["draw_normal"],
+    "indent_guide_options": ["draw_active"],

// 保存時に末尾の空白を除去
-    "trim_trailing_white_space_on_save": false,
+    "trim_trailing_white_space_on_save": true,

// 保存時に最後の行が改行文字になるようにする
-    "ensure_newline_at_eof_on_save": false,
+    "ensure_newline_at_eof_on_save": true,

// 文字コードを特定できない場合に自動的に指定する文字コード(ASCII, UTF-8, UTF-16は自動判定してくれる)
-    "fallback_encoding": "Western (Windows 1252)",
+    "fallback_encoding": "Shift-JIS",

// デフォルトの改行コード
-    "default_line_ending": "system",
+    "default_line_ending": "windows",

// Shift + Tab で行のどこでもアンインデント
-    "shift_tab_unindent": false,
+    "shift_tab_unindent": true,

// 変更したファイルはタブバーでファイル名をハイライト
-    "highlight_modified_tabs": false,
+    "highlight_modified_tabs": true,

// 開いているファイルが無くなったらアプリケーションを閉じる
-    "close_windows_when_empty": false,
+    "close_windows_when_empty": true,

Sublime Text 2でのDiffの取り方

Diffを取りたい2つのファイルを含むフォルダをFile > Open...で開き、
2つのファイルを選択(Macだったらコマンドキー押しながらファイルをクリック)して、
右クリックでDiff Files...をクリックするとDiffが取れます。

ということで上の設定はデフォルト設定とユーザー設定をDiffを取ったものでした。
これから色々使ってみようと思います!

Webプログラマーになる前に学ぶべきこと、知っておきたかったこと

新米Webプログラマー@wada811がプログラマーになる前に学ぶべきこと、知っておきたかったことを
これからWebプログラマーになる人に向けてまとめてみました。

心構え

プログラマとして生きるための心構えとして情熱プログラマーを読んでおくのはオススメだと思います。
研修先から帰る新幹線の中で読み終わる程度の分量だったのでぜひ読んでおいて欲しいです。
さらっと読めてしまうけど学ぶことが多いので何度も読んでしまうお気に入りの本です。
コードについてはリーダブルコードを読みましょう。[書評]リーダブルコード The Art of Readable Code
志高く、良いコードを書こうという気概があれば技術者として伸びていけると思っています。こちらもぜひ!
あと、ブログを書こう!私がプログラマとしてブログを書く事をオススメする8つの理由 | DevAchieve

スキル

HTML/CSS

Web系なら基本中の基本です。
HTML5/CSS3とかアツいですし、HTML5の仕様策定も完了したのですが
ユーザーが使用するブラウザが対応していないことも多いのでまずは基本のHTML/CSSを抑えましょう。
ということで、Web標準の教科書―XHTMLとCSSでつくる“正しい”Webサイトはオススメです。
結構習うより慣れろ的なところがあるので既存のページをいじくりまわすだけでも勉強になるかと思います。

プログラミング

あんまり好きじゃないですけど最初はやっぱりC言語からなのかなぁという気がします。
最初はCの絵本新版 明解C言語 入門編なんかを半年くらい挫折を繰り返したり
プログラミングの宝箱 アルゴリズムとデータ構造 第2版でちゃんとアルゴリズムを学んだり
AIZU ONLINE JUDGEのVolume100のものを一通りやったりとある程度できるようになるまで頑張りました。
今は3分動画でマスターする初心者向けプログラミング学習サイト - ドットインストールがあって
通信添削もしてくれるそうですからプログラミング学習については困らなそうですね。

JavaScript/jQuery

軽く知っていると実装に幅が出て捗ります。
ガッツリ習得してなくても何とかなっているけど基本くらいは知っておきたいですね。
プロになるためのJavaScript入門が最近出て、書評とか見る限り良さげだったので読むと良さそうです。
ガチでやるならJavaScript 第6版JavaScriptリファレンス 第6版は役立ちそうです。

正規表現

もしかしたらJavaScriptより先にこっちを習得しておくべきかもしれません。
めんどくさいテキスト処理などを一発で片付けることができたりとかなり捗ります。
習うより慣れろで覚えてしまったのでどの書籍が参考になるとかは挙げられないのですが頑張って覚えましょう!

PHP

全く知らないのでは実務で困ることが多いと思うので概要をプロになるためのWeb技術入門
プロになるための PHPプログラミング入門で抑えておけばなんとかなるはずです。
プログラミング自体が初めてでなければめっちゃ便利なC言語の上位版みたいな感じなので大丈夫だと思います。
あとはPHP: PHP マニュアル - Manualが詳しいので関数とかをマニュアル見れば使いこなせるかと思います。
フレームワークはCakePHPがよく使われているますが、入社時に習得してなくても
CakePHP Cookbookというドキュメントがあるので入社後に習得していけば大丈夫です。

SQL

PHPに合わせてSQLも学ぶ必要がありますが、入社時にはデータベースの概要がわかっていれば十分でしょう。
マンガでわかるデータベースがわかりやすかったです。[書評]マンガでわかるデータベース | DevAchieve
SQL ゼロからはじめるデータベース操作も読んでガリガリSQL書けるようになっていると凄いです。
[書評]SQL ゼロからはじめるデータベース操作 | DevAchieve

バージョン管理システム

SubversionかGitのどちらかを知っていて軽くでも使ってみていると実務で使う際に理解が早いかと思います。
個人で使うならGitだと思うので入門gitとか読んで実際に使ってみると良いんじゃないでしょうか?
GitならGitHubでソースコードを公開できるので何か作って公開しておくとヘッドハンティングとか来るかも?

資格

資格を持っていなくても基本情報レベルの知識はあった方が良いんじゃないかと思います。
僕は基本情報は入社直後の春に取りました。基本情報技術者試験を受験するまでに使った参考書3冊
基本情報が取れればちょっと勉強すれば応用情報も取れると最近聞いて来春受験に向けて勉強してます。
資格を取ったら祝い金とか貰えるとこなら頑張るのもいいと思います。

おわりに

こう見るとWebプログラマーに求められる技術は結構幅広いですね。
広く深い知識を習得していかなければなりませんので日々勉強が必要です。
万能選手でなければならないけどもスペシャリストでもなくてはならない、
それでいて一番の下手くそでもいたい。(情熱プログラマー)
こんな師匠がいて導いてくれていたらと思い、記事を書いてみました。
僕のWeb系の師匠になってくれる人を探しています!

2012/12/27

[PHP]年末年始に働きたくないPHPerのためのタイマー予約機能の実装

もう仕事納めをして16連休を謳歌している@wada811です。
皆さん年末年始をいかがお過ごしの予定でしょうか?
え?クリスマスや年越し・新年の対応のために仕事しているんです?
そんな仕事はタイマー仕込んでさっさと年末年始をまったり過ごしましょう!

DateTimeクラスやDateInterval::formatを使っていて
PHP5.3以上でないと動かないのでideone.comなどでは動作が確認できないので
codepad.viper-7.comで確認してください。
<?php
/**
 * タイマー処理用判定クラス
 */
class Timer {

   /**
    * タイマー処理: 指定の日時からはtrueを返す
    * @param string $dateTime 'Y-m-d H:i:s'フォーマットな日時
    * @return boolean 判定結果
    */
   public static function fromDateTime($dateTime){
       $today = new DateTime();
       $limitDateTime = DateTime::createFromFormat('Y-m-d H:i:s', $dateTime, new DateTimeZone('Asia/Tokyo'));
       return $today->diff($limitDateTime)->format('%R') === '-';
   }

   /**
    * タイマー処理: 指定の日時まではtrueを返す
    * @param string $dateTime 'Y-m-d H:i:s'フォーマットな日時
    * @return boolean 判定結果
    */
   public static function toDateTime($dateTime){
       $today = new DateTime();
       $limitDateTime = DateTime::createFromFormat('Y-m-d H:i:s', $dateTime, new DateTimeZone('Asia/Tokyo'));
       return $today->diff($limitDateTime)->format('%R') === '+';
   }

}
使い方は簡単!Timerクラスを require するなどしたら後は日時を渡して呼び出すだけ!
if(Timer::toDateTime('2012-12-25 23:59:59')){
    // クリスマスまでの処理
}
if(Timer::fromDateTime('2013-01-01 00:00:00')){
    // 来年からの処理
}
DateTime::diffに渡される日時が同じである場合は'+'を返すので
Timer::toDateTimeは境界を含みますが、Timer::fromDateTimeは境界を含みません。
まぁ1秒だけだから細かいことは気にしなくても大丈夫だと思いますので
普通に切りの良い時間をそれぞれ指定してもいいかと思います。

2012/12/26

[CSS]等幅フォントにするためのおすすめのfont-family指定

ゴシック体のオススメのfont-family指定はわかったので、今度はソースコードなどの表示に使えるものを。

使用するフォントはCSS Font Stackでmonospaceで掲載されているものです。
ConsolasはMicrosoftが開発したプログラミング用フォントです。
Courier NewはほとんどのWindows, Macにインストールされているフォントです。

Menlo と Mac の等幅フォント – terkel.jp
Courier、Courier New、Consolas – terkel.jp
上記のページを参考に設定するなら以下のようになるかと思います。
pre, code, var, samp, kbd, .mono {
    font-family: Consolas, 'Courier New', Courier, Monaco, monospace;
    font-size: 14px;
    line-height: 1.2;
}
見慣れない要素名があるので解説をします。詳しくはリンク先の仕様を読んでください。
code: コンピュータのコードを表示するためのタグです。
var: 変数のインスタンスやプログラムの引数を表すためのタグです。
samp: プログラムやスクリプトからの出力のサンプルを表すためのタグです。
kbd: ユーザーが入力するテキストを示すためのタグです。

【決定版】僕の考えた最強のfont-family指定

本記事は200弱ツイート、500弱のはてブと16000PVを2日で稼ぎ出した(稼いだからってどうもないけど)
[CSS]俺好みのfont-family指定が最強に読みやすくてオススメ! | DevAchieveの反省会会場となります。
未読の方は先に読んでおくと話がわかりやすいかと思います。指定だけ見たい人はこちら

[CSS]俺好みのfont-family指定が最強に読みやすくてオススメ!の狙い

タイトルではてブや検索流入を狙う

本当は教えたくないSEO!アクセス数が20倍になったブログタイトル32文字の法則 | Chrome Life
解説されている通り、はてブは全角32文字までに入れないとトランケートされてしまうので短めに。
はてブユーザーが大好きな最強とか入れておいて、読んでブクマしてもらえるようにしておきます。
「font-family 指定 オススメ」というキーワードを埋め込んでおけば今後の検索流入も見込めます。
上記の狙いが上手くハマった結果です。もはや「font-family 指定」でググると2位に出てきます。
ちなみに「font-family 指定」でググって出てきた下記のサイトを参考にしているのでそんなに外れてないはず。
font-familyなに指定する? | Tips Note
資料:日本のコーダーのfont-family指定 | ウェビンブログ
CSSのfont-family:ヒラギノとMS Pゴシックとメイリオの悩ましい関係 - webデザイナーのナナメガキ
いまさら聞けないCSS font-familyのまとめ: 小粋空間
CSS上級者を悩ませるフォント指定を探究するぜ2011 autumn | DAICHIFIVE blog

適当にぶっこんでおくと訂正してもらえるメソッド

フォントに詳しくないからある程度調べてそれっぽいこと書いておいたら後は
はてブユーザーが何か指摘してくれると信じてました。

Exactly(その通りでございます)
line-height の値には単位なしが良いとされる理由 - lucky bag
line-height の値には単位なしが良いとされる理由を知らなかったので勉強になりました。

コレは知りませんでした。
僕の中では三点リーダは...のイメージなので問題ないんですがそうでないデザインの時は気をつけまます。

これなんかは普通にググってもわからない情報ですよね。上手くメソッドが実行されていて嬉しいです。
しかしWindows XP以前の人たちはメイリオ指定できなかった場合は
MS Pゴシックしかない気がするのですが、他に何を指定すればいいのでしょうか?
フォント云々の前にパソコンを買い換えて欲しいところです。

その他のフォント指定おすすめなど

id:sunoho
最初はHelvetica(Neue)で安定だと思います
id:Shir
Arialより前にHelveticaを・・・
id:gmsniper2
メイリオより前にヒラギノを表記するんだったらHelvetica(Arial)と組み合わせた方がいいと思うんだよなあ
id:n-yuji
ダメダメ。5年前ならコレでよかったかもしれんが。ヒラギノはProNにすべし、Osakaは入れる必要なし。
id:masamune61
参考に。ヒラギノは馬鹿にできません。
id:solidstatesociety
ヒラギノを甘く見すぎ
id:gnta
Verdanaは横幅を取り過ぎるし極小サイズでの視認性に優れてるだけでフォントフェイスも美しくないのでBodyフォントには向かない。
id:Falky
最近はfont-familyの指定順序だけで正しくクロスブラウザ和欧混植できるの?つい1年くらい前まではWebkit以外グダグダで、表示ブチ壊れるUAもあったはず。@font-face unicode-rangeめんどくさいですね。
などなど様々な意見がありました。
ヒラギノで批判されているようですが、いまいち意図がつかめないところが残念な所です。
ヒラギノはProNにすべしと言われたので調べてみるとProNでは略字体が正しい字になるようです。
Leopardの新フォント、ヒラギノ角ゴ ProNとは | トブ iPhone
iOS 6におけるブラウザの表示フォントについて(Hiragino Kaku Gothic ProとProNでも違いが...)|Blog|Skyward Design
iOSでもヒラギノはProNが良さそうですのでProNで行く事にしましょう。
あと、Mac OS 9以前のために一応残しておいたけどやっぱりOsakaはいらないみたいです。
@font-face unicode-rangeまで踏み込むのはよくわからないし面倒臭すぎるのでこのへんでお茶を濁します。

最強のfont-family指定(旧)

CSS Font Stack :: A complete collection of web safe CSS font stacks :: Web Fonts
Bootstrapを参考にして最強のfont-family指定決定版を作りました。
body {
    font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, 'ヒラギノ角ゴ ProN W3', 'Hiragino Kaku Gothic ProN', 'メイリオ', Meiryo, 'MS Pゴシック', 'MS PGothic', sans-serif;
    font-size: 14px;
    line-height: 1.3;
    font-weight: normal;
}
個人的にはこのブログで見る分にはVerdanaが幅広で英数字が読みやすく感じるのですが
他のサイトで使う用と考えてHelvetica系列に先を譲りました。
これで決定版を名乗ってもいいだろう。何かあったらまたご指摘下さい。

追記(2012/12/29 18:00)


萌えないごみの日: 【CSS】font-familyを指定するな。ユーザー選択に任せよ。

ユーザーの選択の尊重のためにfont-familyを指定するなという意見もいただきましたが、
Windows 7のフォント設定がデフォルトのままのIE9(ClearType有効)でこの有様です。
一部のフォントにこだわりのあるユーザーがブラウザ設定で自分好みのフォントで見れるようにするのために
大多数のフォントが設定できることも知らないユーザーにコレを見せろというのは受け入れることができません。
上記のページで言われている和文フォントと欧文フォントの不揃いを気にするならば
和文フォントのみの指定が良いかと思います。
確認用にこちらにfont sample pageを作りました。
font-family: 'Hiragino Kaku Gothic ProN', Meiryo, 'MS PGothic', sans-serif;
メイリオがVerdanaっぽくて、ヒラギノ角ゴがHelveticaっぽくなっているので
少し違う印象を与えるのが微妙かもしれませんが、
和文フォントのみで指定するなら不揃いもなくていいかもしれませんね。

追記(2013/01/12 18:00)

上記のサイトでコメントを通して色々話しあった結果、和欧混植は不揃いが生じるので
和文フォントのみ指定、または総称ファミリを指定するのが良いという結論に至りました。
IEで総称ファミリ指定で上記のスクリーンショットのような中国語フォントが使用されてしまうバグがあるので
和文フォントを指定するのが安牌だろうと思います。
和文フォントを指定してもユーザーの環境によって表示が変わり得るのであくまで安牌ですが…。

結論: 最強のfont-family指定

body {
    font-family: 'Hiragino Kaku Gothic ProN', Meiryo, 'MS PGothic', Sans-serif;
    font-size: 14px;
    line-height: 1.3;
    font-weight: normal;
}
または
body {
    font-family: Sans-serif;
    font-size: 14px;
    line-height: 1.3;
    font-weight: normal;
}
ちなみにOperaとかいう最強伝説を持つブラウザには和文フォントは日本語で指定しないといけないので注意。

2012/12/22

[CSS]俺好みのfont-family指定が最強に読みやすくてオススメ!

追記記事を書きました

【決定版】僕の考えた最強のfont-family指定 | DevAchieve

元記事ここから

俺のためにWeb開発者は俺にとって読みやすいフォント指定をするのだ!
指定方法は下にあるぞ!

新規でサイトを制作するのに基本のフォント指定を持っていなかったので
色々調べたり、このブログのフォント指定を変更してみたりしたら
実は Arial より Verdana のほうが見やすいことがわかってしまった。
さすがMicrosoftがコンピュータ用ディスプレイ上での視認性向上のために
作ったフォントだ!Verdana - Wikipedia

フォント周りのオススメの指定

追記記事により良い指定を載せたのでこちらは掲載終了しました。

font-family めっちゃ長い!

何故かと言えば環境によっては指定したフォントがインストールされていない可能性があるから。
だから指定したいフォントを優先順位つけて記述する。左にあるフォントが一番優先順位が高い。

余談だけどfont-size(文字サイズ)とline-height(行の高さ)はTwitterの指定と同じなので個人的に読みやすい。

どうしてこのfont-familyの指定なのか

英数字は欧文フォントに任せたほうが綺麗なので和文フォントよりも前に書く。

Verdana は Arial に比べて小さい文字でも潰れにくくて綺麗だったので
このブログも Arial から Verdana に乗り換えた。

日本語表記のフォントやスペースを含むフォントはクォーテーションで囲む

invalid property valueと怒られたくなかったらシングルクォートかダブルクォートで囲むんだ!

Macユーザーのためにヒラギノを先に書く

Macにはメイリオがデフォルトでは入っていないのだけど
Office for Mac を入れるとメイリオがインストールされるので
メイリオが先に書いてあるとメイリオで表示されてしまう。

Windowsでヒラギノが入っているとアンチエイリアスがかからなくて汚くなるらしいけど
gdippとかのアンチエイリアスをかけてくれるソフトを入れていると綺麗に表示されるらしいので
Windowsでヒラギノをインストールする人はそういうソフトを使ってもらうことにする。

俺はWindowsにヒラギノが入っていないので関係ない。
むしろOffice for MacをMacに入れているのでヒラギノが先がいい。メイリオ嫌いじゃないけど。

和文フォントの日本語表記と英語表記について

ブラウザの種類やバージョンによっては日本語表記と英語表記のどちらかしか解釈できない奴がいる。
メジャーなブラウザの最新版なら日本語表記だけでも大丈夫らしいけど一応両方書く。

sans-serifとは

総称ファミリと呼ばれるもので、フォントのカテゴリみたいなもの。
指定したフォントがひとつもインストールされていなかった場合は
環境依存のフォント指定になってしまうのでせめてカテゴリ指定しておくためのもの。
どんなのがあるかや、フォントがどのように分類されるかは総称ファミリ名分類のフォント名一覧が見やすい。

フォントについてもっと詳しく知りたいならウェブにおけるフォントのヒントが良い。

CSSでのフォントの指定方法についてもっと詳しく知りたければW3C CSS Fontsのページを読もう。

おまけ

たまに見るCSSのfontプロパティの指定。|| は順不同。[]? は中身を省略可。忘れるのでメモ。
font: [font-style || font-variant || font-weight]? font-size[/line-height]? font-family;

2012/12/12

IEで2番目以降のGETパラメータが実体参照になり値が取得できないバグ


クリックでサンプルページへ

IE6/7/8/9 で確認しているバグ。IE10 で直っているかは知らない。
URL に GET パラメータを付けた際に2番目以降は & でつなぐわけだけど、
どうやら IE では実体参照と勘違いしてしまうみたいで変換されてしまうので
その GET 値が取得できなくなってしまう。PHP やってる時に出会ったわかりにくいバグだ。
IE 限定で起こるバグで GET の名前の部分が実体参照と被り、かつ それが2番目以降にあるというレアな限定バグ。
全て試したわけではないがHTML4 で使える文字実体参照
「HTML2.0 以降で使える文字実体参照」は変換されてしまうようだ。

対処法は名前を変えるか、2番目以降に書かないか、だ。
うーん、ひどい。

2012/12/11

[競技プログラミング][PHP][第2回早稲田大学プログラミングコンテスト]団子とうさぎ

A - 団子とうさぎ

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

古来より,月にはうさぎが住んでおり,餅をついていると言われている.
我々が月を見上げるとき,うさぎ達もまた地球を見ているのである.

問題

今,うさぎたちの目の前には N 段に積まれた団子がある.
今回の積み方では,上から x 段目には,x2 個の団子がある.
これらの団子を M 匹のうさぎたちで平等に分けることを考えよう.
あなたの仕事は,団子を平等に分けた時,いくつ団子が余るかを求めるプログラムを書くことである.

入力

入力は以下の形式で標準入力から与えられる.
N M
団子の段数を表す整数 N(1≦N≦100) とうさぎの数 M(1≦M≦100)が半角スペース区切りで与えられる.

出力

団子を平等に分けた時,余る団子の数を標準出力に 1 行で出力せよ.
なお、最後には改行を出力せよ.

出典

A: 団子とうさぎ - 第2回早稲田大学プログラミングコンテスト | AtCoder

回答

AtCoder/wupc_01.php at master · wada811/AtCoder · GitHub
<?php
fscanf(STDIN, "%d %d", $n, $rabbit);
$count = 0;
for($i = 1; $i <= $n; $i++){
    $count += pow($i, 2);
}
echo $count % $rabbit . PHP_EOL;
?>
$count を求めるもっと上手い方法あったかな?

2012/12/10

[競技プログラミング][PHP][東京大学プログラミングコンテスト2012]2012年12月02日

A - 2012年12月02日

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

問題

今日は2012年12月02日であって, 月日を構成する数字1202を並べ替えると西暦を表す数字2012になる.
このような日を良い日という事にする. 与えられた日付が良い日かどうかを答えよ.

入力

yyyy/mm/dd という形の文字列が一行で与えられる.
yyyyは,4桁の整数,mmは先頭が0でありうる2桁の整数,ddは先頭が0でありうる2桁の整数である.

yyyyが西暦,mmが月,ddが日を表している.

出力

与えられた日付けが良い日であるならば,yes 良い日でないならば,no を一行に出力せよ.

制約

1000≤yyyy≤9999
与えられる日付は,正しい日付を表している.

出典

A: 2012年12月02日 - 東京大学プログラミングコンテスト2012 | AtCoder

回答

AtCoder/utpc2012_01.php at master · wada811/AtCoder · GitHub
<?php
$date = trim(fgets(STDIN));
$date1 = array($date[0], $date[1], $date[2], $date[3]);
$date2 = array($date[5], $date[6], $date[8], $date[9]);
echo array_count_values($date1) == array_count_values($date2) ? 'yes' : 'no';
echo PHP_EOL;
?>
あんまり良い名前が思いつかなかったから適当な変数名。使い捨てのコード。ひどい。

2012/12/09

[競技プログラミング][PHP][DigitalArts プログラミングコンテスト2012]Password

B - Password

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

問題文

セキュリティに興味がある高橋君は、デジタルアーツ株式会社に就職したい青年です。
そこで、高橋君は自分が運営するサービスであるAtCoderのセキュリティについて見なおしてみることにしました。

現在AtCoderのシステムでは、パスワードは 1 文字以上 20 文字以下の英小文字のみとしています。
そして、文字列 s に対してハッシュ値( hash(s) )を求める以下の式があり、
パスワードと入力した文字列に対して、それぞれこの式で算出したハッシュ値が一致すると、
入力した文字列は正しいとみなします。

hash(s)=Num(c1)+Num(c2)+…+Num(cN) (ci は文字列 s の i 番目の文字を意味する)

なお、上記の式の関数 Num() とは英小文字を数字に変換する関数で、
Num(a)=1, Num(b)=2, …., Num(z)=26 というように、
a から z に対して順に 1 から 26 までの数字を返します。

高橋君は、このシステムではパスワードと違う文字列でも
簡単にハッシュ値が一致してしまうことに気づきました。
例えば、文字列 abc のハッシュ値は、1+2+3=6 となりますが、
文字列 bbb のハッシュ値も 2+2+2=6 ですし、f も 6 になってしまいます。

高橋君は、現在使っているパスワードに対してどのような文字列が
正しいパスワードとして認識されてしまうか知りたいです。
正しいパスワード以外で条件を満たすものを 1 つ出力しなさい。
条件を満たすものが複数ある場合は、どの文字列を出力しても構いません。
もし条件を満たすパスワードが存在しない場合は NO と出力しなさい。
なお、AtCoderのシステムで入力できるパスワードは 1 文字以上 20 文字以下の英小文字のみなので、
答えとして出力する文字列もその条件をみたします。

入力

入力は以下の形式で標準入力から与えられる。
c1c2‥‥cN
入力には正しいパスワードを表す長さ N(1≦N≦20) の文字列が 1 行で与えられる。
正しいパスワードの i 番目の文字を表す ci は英小文字 (a-z) である。

出力

与えられた正しいパスワードを表す文字列と等しいハッシュ値になる英小文字 1 文字以上 20 文字以下の文字列を、
正しいパスワード以外のいずれか 1 つ出力せよ。
また、そのような文字列が存在しない場合は NO と出力せよ。
なお、出力は 1 行のみとし、最後には改行を出力せよ。

出典

B: Password - DigitalArts プログラミングコンテスト2012 | AtCoder

回答

AtCoder/digitalarts_2.php at master · wada811/AtCoder · GitHub
<?php
$password = trim(fgets(STDIN));
$ascii_a = ord('a') - 1;
$numbars = array();
for($i = 0, $end = strlen($password); $i < $end; $i++){
    $numbars[] = ord($password[$i]) - $ascii_a;
}

$sum = array_sum($numbars);
// special case
if($sum === 1 || $sum === 26 * 20){
    // 'a' or 'zzzzzzzzzzzzzzzzzzzz'
    echo 'NO' . PHP_EOL;
    exit();
}

$answers = array();
if(count($numbars) === 1){
    // 'b' - 'z'
    $answers[0] = $numbars[0] - 1;
    $answers[1] = 1;
}else{
    while($sum){
        $answers[] = min(26, $sum);
        $sum -= min(26, $sum);
    }
}
// ex. 'za' -> 'az'
while($answers == $numbars){
    shuffle($answers);
}

$another_password = '';
for($i = 0, $count = count($answers); $i < $count; $i++){
    $another_password .= chr($answers[$i] + $ascii_a);
}
echo $another_password . PHP_EOL;
?>
2行目でtrimし忘れて意図しない改行コードで答えが合わなくて泣きそうになった。
文字列を配列でアクセスできるので1文字ずつアスキーコード変換して配列に入れる。
答えが NO になる例外を弾き、1文字のパスワードとそうでないもので処理を分ける。
後は28行目に書いたようなやつのためにshuffleして入れ替えておく。コレで確実。
あとはアスキーコードを逆変換して出力!

2012/12/08

[競技プログラミング][PHP][DigitalArts プログラミングコンテスト2012]C-Filter

A - C-Filter

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

問題文

セキュリティに興味がある高橋君は、デジタルアーツ株式会社に就職したい青年です。
彼は、面接で自分をアピールするために、
得意なプログラミングでフィルタリングソフト「C-Filter」を作ろうと考えています。
「C-Filter」は、与えられた文字列 s に、
あらかじめ登録しておいた「NGワード」と一致する文字列が存在する場合、
その文字列の長さと等しい数の *に置き換えて出力するソフトウェアです。
この文字列を置き換える処理をフィルタリングと呼びます。
「NGワード」とは、半角英小文字と*から構成されます。
*はすべての半角英小文字 1 文字と一致します。
例えば myonmyon は、NGワードmyo*myonと一致します。
ただし、NGワードは単語ごとに適用されるため、myo myon はNGワード myo*myonとは一致しません。
また、NGワードはある単語に対して完全に一致する必要があります。
例えば、abcdeは、NGワードabcやbcd、cdeに一致しません。

文字列 s と、NGワードが与えられるので、C-Filterの出力する文字列を答えてください。

入力

入力は以下の形式で標準入力から与えられる。
s
N
t1
:
:
tN
入力は N+2 行からなる。
1 行目には 1 文字以上 1,000 文字以下の文字列 s が与えられる。
s はフィルタリングする対象の文字列を半角スペースで区切って繋げた文字列である。
2 行目にはNGワードの個数を表す整数 N(0≦N≦50) が与えられる。
3 行目から N+2 行目までNGワードを表す文字列 ti(1≦i≦N)が与えられる。
文字列 ti は半角英小文字と * から構成される。
文字列 ti の長さは 1 文字以上、 20 文字以下である。
文字列 ti に含まれる * は、半角スペースを除くすべての半角英小文字 1 文字をフィルタリングの対象とします。

出力

入力された文字列 s をC-Filterでフィルタリングした結果を 1 行で出力せよ。
なお、最後には改行を出力せよ。

出典

A: C-Filter - DigitalArts プログラミングコンテスト2012 | AtCoder

回答

AtCoder/digitalarts_1.php at master · wada811/AtCoder · GitHub
<?php
$sentence = trim(fgets(STDIN));
fscanf(STDIN, "%d", $n);
$filters = array();
for($i = 0; $i < $n; $i++){
    $filters[] = '/^' . str_replace('*', '.', trim(fgets(STDIN))) . '$/';
}
$words = explode(' ', $sentence);
$censored = preg_replace_callback(
                $filters,
                create_function(
                    '$matches',
                    'return str_repeat("*", strlen($matches[0]));'
                ),
                $words
            );
echo implode(' ', $censored) . PHP_EOL;
?>
fgetsで1行取得。この際にtrimしておかないと思わぬ改行コードでハマる。
6行目で取得しつつ正規表現に入れ込む。 間の空白を置換しないようにするのが面倒なので空白で分割。 preg_replaceのe修飾子が PHP 5.5.0 で非推奨になったので
AtCoder の PHP のバージョンは 5.3.6だけど使わないでおく。
代わりにpreg_replace_callbackでうまいことやる。
第二引数のコールバック関数にマッチした文字の文字数だけstr_repeatで繰り返す。
後は文字列に直して出力!テクニカルな感じでカッコいい!

2012/11/25

[SQLearning][SQLite]テーブルの変更と削除

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

前回: [SQLearning][SQLite]データ型と制約の指定 | DevAchieve
第3回は「テーブルの変更と削除」についてです。

カラムの追加

以下の CREATE 文で生成されるテーブルを元に解説していきます。
CREATE TABLE products (
    id          INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    name        TEXT    NOT NULL UNIQUE,
    description TEXT    NULL,
    price       INTEGER NOT NULL,
    discount    INTEGER NOT NULL DEFAULT 0,
    reg_date    TEXT    NOT NULL DEFAULT CURRENT_DATE
);
このテーブルにカラムを追加するには以下のように記述します。
ALTER TABLE <テーブル名> ADD <カラム名> <型> <制約>;
ALTER TABLE products
    ADD bar_code TEXT NOT NULL DEFAULT '000000000000000';
カラムは常に末尾に追加されます。
CREATE TABLE 構文とは異なり、以下のような制約があります。
  • 追加されるカラムは PRIMARY KEY 制約, UNIQUE 制約を持つことができません。
  • 追加されるカラムは デフォルト値に固定値以外の値(CURRENT_TIME, CURRENT_DATE, CURRENT_TIMESTAMP, 式)を持つことができません。
  • 追加されるカラムに NOT NULL 制約が指定されている場合は NULL 以外のデフォルト値が設定されている必要があります。
  • 外部キー制約が有効で、REFERENCES 句とともにカラムが追加された場合、追加されたカラムはデフォルト値に NULL を持たなくてはなりません。
※ CHECK 制約を追加する際は既存の列に対してテストされないことに注意してください。
これは CHECK 制約に違反するデータを含むテーブルになりうることを意味します。
SQLite の今後のバージョンでは追加される CHECK 制約を検証するように変更されるかもしれません。

カラムが追加されたデータベースは SQLite Ver.3.1.3 以前のバージョンで読めなくなります。

テーブル名の変更

テーブル名を変更するには以下のように記述します。
ALTER TABLE <テーブル名> RENAME TO <新しいテーブル名>;
テーブル名を変更した際に外部キー制約が有効ならば
REFERENCES 句に指定されていたテーブル名は新しいテーブル名に自動的にリネームされます。

SQLite Query Language: ALTER TABLE

テーブルの削除

テーブルを削除するには以下のように記述します。
DROP TABLE <テーブル名>;
テーブルに関連付けられたすべてのインデックスとトリガも削除されます。
DROP TABLE IF EXISTS <テーブル名>;
IF EXISTS を記述すれば存在しないテーブルの削除を試みることによるエラーを防ぐことができます。

次回

次回は「SELECT文の基礎」を予定しています。

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

2012/11/24

[SQLearning][MySQL]テーブルの変更・削除

SQL ゼロからはじめるデータベース操作を教材にしてMySQLを学ぶ
SQL学習連載「SQLearning」の第4回です。
前回: [SQLearning][MySQL]データ型・制約の指定 | DevAchieve
第4回は「テーブルの変更・削除」についてです。

カラムの追加

前回同様、以下のテーブルを元に解説していきます。
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| name        | varchar(255) | NO   | UNI | NULL    |                |
| description | text         | YES  |     | NULL    |                |
| price       | int(11)      | NO   |     | NULL    |                |
| tax_free    | tinyint(1)   | NO   |     | 0       |                |
| reg_date    | datetime     | NO   |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+
このテーブルにカラムを追加するには以下のように記述します。
ALTER TABLE <テーブル名> ADD <追加するカラム名> <型> <制約>;
ALTER TABLE products
    ADD bar_code varchar(255) NOT NULL DEFAULT '0-000000-000000' AFTER tax_free;
カラムの追加位置は AFTER で指定します。未指定の場合は末尾に追加されます。
先頭に追加する場合は以下のように FIRST で指定します。
ALTER TABLE products
    ADD products_type_id int(11) NOT NULL DEFAULT 0 COMMENT '商品タイプ' FIRST;
また、複数追加する場合は以下のようにカンマ区切りで記述します。
ALTER TABLE products
    ADD receipt_name varchar(255) NOT NULL COMMENT 'レシート表示名' AFTER name,
    ADD url varchar(255) NULL DEFAULT NULL COMMENT '商品ページURL' AFTER description;

カラムの変更

カラム名、カラムの型や制約を変更する場合は以下のように記述します。
ALTER TABLE <テーブル名> CHANGE <古いカラム名> <新しいカラム名> <型> <制約>;
ALTER TABLE products
    CHANGE url homepage_url varchar(255) NULL DEFAULT NULL COMMENT '商品ホームページURL';

カラムの型や制約だけを変更したい場合は以下のように記述します。
ALTER TABLE <テーブル名> MODIFY <変更するカラム名> <型> <制約>;
ALTER TABLE products
    MODIFY bar_code varchar(13) NOT NULL DEFAULT '0000000000000' AFTER id;
AFTER でカラムの順番も変更することもできます。
Oracleの独自実装の互換性対応のため実装されているようです。

カラムのデフォルト値を削除したい場合は以下のように記述します。
ALTER TABLE <テーブル名> ALTER <カラム名> DROP DEFAULT;
ALTER TABLE products
    ALTER bar_code DROP DEFAULT;

カラムのデフォルト値を設定したい場合は以下のように記述します。
ALTER TABLE <テーブル名> ALTER <カラム名> SET DEFAULT <デフォルト値>;
ALTER TABLE products
    ALTER bar_code SET DEFAULT '0000000000000';

カラムの削除

カラムを削除したい場合は以下のように記述します。
ALTER TABLE <テーブル名> DROP <削除するカラム名>;
ALTER TABLE products
    DROP homepage_url;

ADD, ALTER, CHANGE, DROP はカンマで区切ることによって一度に複数の変更を実行することができます。
ALTER TABLE では元テーブルの一時コピーを作成するため一度に変更を実行したほうが良いです。
ほとんどの場合、 ALTER TABLE は元テーブルのテンポラリ コピーを作成する事で起動します。
そのコピー上で変更が行われ、その後元テーブルが削除されて新しいテーブルがリネームされます。
ALTER TABLE が実行している間、他のクライアントが元テーブルを読む事ができます。
新しいテーブルの準備ができるまで更新と書き込みは止められ、
その後更新に失敗する事なく新しいテーブルに自動的にリダイレクトされます。
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.1.2 ALTER TABLE 構文

AUTO_INCREMENT の値の変更

以下のように記述します。
ALTER TABLE <テーブル名> AUTO_INCREMENT = <値>;
ALTER TABLE products AUTO_INCREMENT = 100;
AUTO_INCREMENT カラム内の最高値以下の値が指定された場合、
MyISAMでは最高値+1にリセットされますが、InnoDBではエラーも出ず、変更もされません。

おまけ: AUTO_INCREMENT の振り直し

挿入と削除を繰り返していると id が歯抜け状態になるので振り直したい時に使えます。
データ不整合を起こす可能性があるのでよく検討してから使用してください。
ALTER TABLE products
    CHANGE id renamed_id int(11);
ALTER TABLE products
    ADD id int(11) NOT NULL AUTO_INCREMENT FIRST,
    ADD PRIMARY KEY(id),
    DROP renamed_id;
単純に id を DROP してから追加しないのは先に DROP すると順序が変わる可能性があるからです。

テーブル名の変更

ALTER TABLE <テーブル名> RENAME TO <新しいテーブル名>
RENAME TABLE <テーブル名> TO <新しいテーブル名>
標準SQLでテーブル名の変更が定義されていないので独自実装で方法が幾つかあります。
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.1.19 RENAME TABLE 構文

データベースエンジンの変更

ALTER TABLE <テーブル名> ENGINE = <エンジン名>;
ALTER TABLE products ENGINE = InnoDB;

デフォルト文字セットの変更

ALTER TABLE <テーブル名> DEFAULT CHARSET = <文字コード名>;

MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.1.2 ALTER TABLE 構文

テーブルの削除

DROP TABLE [IF EXISTS] <テーブル名>;
DROP TABLE products;
DROP TABLE IF EXISTS products;
IF EXISTS を記述すれば存在しないテーブルの削除を試みることによるエラーを防ぐことができます。

次回

次回は「SELECT文の基礎」について予定しています。
SQL ゼロからはじめるデータベース操作 (CD-ROM付) (プログラミング学習シリーズ)
SQL ゼロからはじめるデータベース操作 (CD-ROM付) (プログラミング学習シリーズ)

2012/11/18

[CSS] ol 要素を使用しないカウントアップするリストを作ってみた

前回のリストマーカー引き続き、CSSで ol タグ相当のCSSクラスを作ってみた。
[CSS]before擬似要素を使って複数行対応のリストマーカーを作ってみた | DevAchieve

また ::before 擬似要素を使っているので CSS3 扱い。
IE8ではコロンをひとつにしないと動かない。
css/list.cssCSS list-counter sample page
カウント部分は前回と同じく複数行対応になっている。
Generated content, automatic numbering, and lists にある通り、
本記事では count になっている identifier を初期化しなければならない。
/**
 * list-counter base class
 */
.counter.init {
    counter-reset: count;
}
.count {
    display: block;
    padding-left: 1em;
}
.count::before {
    counter-increment: count;
    display: block;
    float: left;
    margin-left: -1em;
    width: 1em;
    text-align: center;
}
/**
 * list-counter counter class
 */
.counter.type_decimal .count::before {
    content: counter(count, decimal);
}
.counter.type_decimal_leading_zero .count::before {
    content: counter(count, decimal-leading-zero);
}
.counter.type_lower_roman .count::before {
    content: counter(count, lower-roman);
}
.counter.type_upper_roman .count::before {
    content: counter(count, upper-roman);
}
.counter.type_lower_greek .count::before {
    content: counter(count, lower-greek);
}
.counter.type_upper_greek .count::before {
    content: counter(count, upper-greek);
}
.counter.type_lower_latin .count::before {
    content: counter(count, lower-latin);
}
.counter.type_upper_latin .count::before {
    content: counter(count, upper-latin);
}
.counter.type_lower_alpha .count::before {
    content: counter(count, lower-alpha);
}
.counter.type_upper_alpha .count::before {
    content: counter(count, upper-alpha);
}
.counter.type_armenian .count::before {
    content: counter(count, armenian);
}
.counter.type_georgian .count::before {
    content: counter(count, georgian);
}
upper-greek に関しては W3C の list-style-type プロパティの定義には載っていないのでブラウザ実装依存。
Opera では decimal, Firefox では 空白 になり、Chrome, Safari, IE9では正常に表示される。

モダンブラウザのための最小clearfixハック

CSSハックの中でも最も有名で最も使われているのが clearfix だろう。
CSSハック嫌いの僕でも clearfix の有用性だけは認めざるを得ない。
それでもCSSハックは使いたくないのでできるだけ簡潔な表現にした。

ネタ元はこちら:A new micro clearfix hack – Nicolas Gallagher

IE6/7どころかIE8もサポートしない最強の clearfix である。
IE9 と Chrome, Firefox, Safari, Opera の最新版で動作することを確認済み。
.clearfix::after {
    content: "";
    display: table;
    clear: both;
}

ネタ元の以下の clearfix はIE6+をサポートするので困ったらコッチを使うと良い。
/**
 * A new micro clearfix hack – Nicolas Gallagher
 * http://nicolasgallagher.com/micro-clearfix-hack/
 */
.clearfix:before,
.clearfix:after {
    content: " ";
    display: table;
}

.clearfix:after {
    clear: both;
}

.clearfix {
    *zoom: 1; /* for IE 6/7 only */
}
ちなみにHTML5 Boilerplate: The web's most popular front-end templateでも使われている方法なので安心!

2012/11/13

[CSS]before擬似要素を使って複数行対応のリストマーカーを作ってみた

ul 要素などに指定できる list-style-type には種類に制限があるので
好きなリストマーカーを自由に設定できるように
::before擬似要素を使ってリストマーカー用のクラスを作ってみた。
css/list.css
もちろんテキストが複数行になってもインデントが揃っている。
サンプルページ:CSS list-marker sample page
.marker {
    display: block;
    padding-left: 1em;
}
.marker::before {
    content: "";
    display: block;
    float: left;
    margin-left: -1em;
    width: 1em;
    text-align: center;
}
::before擬似要素でブロック要素を生成して float: left; で要素の左に並べる。
要素を padding-left: 1em; で左に間を空けて margin-left: -1em; で左に戻す。
width: 1em; で text-align: center; を指定しておけば半角文字のマーカーが真ん中に来て良い感じになる。

::before という書き方は擬似クラスと擬似要素が多くなった CSS3 からの書き方なので
IE8 では対応してないので :before と書く必要がある。ちなみに IE6/7はサポートすらされていない。

上のクラスを指定しただけではリストマーカーは表示されないので以下のように指定する。
content には画像や属性値を指定することもできる。
.marker.type_disc::before {
    content: "・";
}
.marker.type_filled_circle::before {
    content: "●";
}
.marker.type_outline_circle::before {
    content: "○";
}
.marker.type_filled_square::before {
    content: "■";
}
.marker.type_outline_square::before {
    content: "□";
}
.marker.type_filled_diamond::before {
    content: "◆";
}
.marker.type_outline_diamond::before {
    content: "◇";
}
.marker.type_filled_star::before {
    content: "★";
}
.marker.type_outline_star::before {
    content: "☆";
}
.marker.type_filled_triangle::before {
    content: "▲";
}
.marker.type_outline_triangle::before {
    content: "△";
}
.marker.type_filled_inverted_triangle::before {
    content: "▼";
}
.marker.type_outline_inverted_triangle::before {
    content: "▽";
}


2012/11/10

PHP で ASCII コードを利用して CSS の list-style-type を再現する

CSS の list-style-type は ul 要素や ol 要素などに指定することができて、
以下のように表示したければ
  1. あいうえお
  2. かきくけこ
  3. さしすせそ
以下のように指定します。
ol {
    list-style-type: upper-alpha;
}
<ol>
    <li>あいうえお</li>
    <li>かきくけこ</li>
    <li>さしすせそ</li>
</ol>
しかし、このABCなどのリストマーカー部分をリスト部分とは異なるデザインにしたい場合、
特に表示位置、色、大きさを調節したい場合はリストでは難しくなります。

HTML/CSSでは難しいのですが、動的なサイトだったためPHPで書くことができました。
リストマーカー部分が数値であれば簡単に for ループのインデックスが使えるのですが
リストマーカーが英字なので少しどうしたものかと思いました。
パッと思い浮かんだ選択肢は、アルファベットを持った配列を定義しておきインデックスで配列の要素を出力、
またはアルファベットを文字列で持ちインデックスでsubstrで1文字だけ出力、という2つ。

定義するのがめんどくさいし、ダサい実装でどうしたものかと考えていたら
C言語の入門書でアスキーコードを利用したことを思い出しました。
PHPでアスキーコードを利用したことがなかったのですが、
C言語でできることはPHPでもできるだろと探してみたらありました。

PHPでアスキーコードを利用する方法!

<?php
for($i = 0; $i < 26; $i++){
    echo chr(ord('A') + $i) . '.';
}
?>
chrがアスキーコードから文字を返してくれて、ordが文字のアスキーコードを返してくれます。

2012/11/03

[書評]Android SDK開発のレシピ

AndroidSDK開発のレシピ―104個のレシピで学ぶAndroidアプリ開発の極意
塚田翔也
秀和システム
発売日:2010-08
ブクログでレビューを見る»
Androidのちょっと変わったネタをレシピとして紹介している本。
ある程度アプリを開発できるようになって
変わったネタを求めている開発者にオススメ。

Android SDK開発のレシピ 第二版 もオススメです。
http://www.amazon.co.jp/o/ASIN/4798035297/wada811-22/ref=nosim/
「Android SDK開発のレシピ」という本を書きました。 - gabuchanの日記

Android SDK開発のレシピ 第2版
塚田翔也
秀和システム
発売日:2012-09
ブクログでレビューを見る»
Androidのベストプラクティスが詰まった本。
レシピ形式で幅広い項目を扱っているので読めば大抵のことはできるようになる。
普通の本では扱われない設定やショートカット、ツールの使い方なども紹介されていて良い。
サンプル用のアプリやコードが公開されているのでとても参考になる。
「Android SDK開発のレシピ」が第2版になりました。 - gabuchanの日記

第1版の時はまだAndroid初心者だったので変わったネタも使い道がなくて、
汎用的なネタが多かったAndroid SDK逆引きハンドブックに取って代わられて本棚の肥やしになっていました。
第2版ではだいぶ網羅的になっていて、初心者でも役に立つようなレシピが多かったです。
サンプルコードもGitHub(https://github.com/gabu/gabubon2)で公開されているし、
レシピ自体が一つのAndroidアプリになっていて凄く参考になりました!
読むだけでAndroidのハマりポイントを回避していけるので感謝です!

余談ですが、第2版の表紙を見た時、JellyBeanだからこんな表紙なのかと思ったら第1版からだったんですね。
AndroidSDK開発のレシピ―104個のレシピで学ぶAndroidアプリ開発の極意Android SDK開発のレシピ

2012/10/28

[競技プログラミング][PHP][AtCoder]おとぎの国の高橋君

B - おとぎの国の高橋君

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

問題文

高橋君の住むAtCoder国では、
私達が普段使用する数字と同様に 10 個のアラビア数字 (0−9) の 10 進数が使われています。
しかし、私達が普段使用する数字は大小関係が 0<1<2<3<4<5<6<7<8<9 の順になっているのに対して、
AtCoder国の数字ではその大小関係が異なっています。
例えば、AtCoder国の数字では 0<9<8<7<6<5<4<3<2<1 の順になっている場合、
AtCoder国では 9 よりも 8 の方が大きいことになります。また、97 よりも 72 の方が大きいことになります。

AtCoder国の数字の大小関係といくつかの数が与えられるので、
AtCoder国の数字の大小関係で昇順に並び替えてください。
なお、私達が普段使用する数字同様、AtCoder国で最も小さい数字は 0 であることは決まっています。

入力

入力は以下の形式で標準入力から与えられる。
b0 b1 ‥‥ b9
N
a0
a1
:
:
aN−1
入力は N+2 行ある。
1 行目には、AtCoder国での 1 桁の数字の大小関係が与えられる。
AtCoder国では b0<b1<…<b9 であることを表している。
b0 は必ず 0 である。
重複する数字は存在せず、0 から 9 までの数字が 1 度ずつ現れる。
2 行目には並び替える数の個数を表す整数 N(1≦N≦777) が与えられる。
3 行目からの N 行には、j+3 行目に並び替える数を表す整数 aj(1≦aj≦777,777,777) が与えられる。

出力

与えられた数をAtCoder国の数字の大小関係にあわせて昇順に並び替え、
標準出力に 1 行に 1 つの数字ずつ出力せよ。
なお、最後には改行を出力せよ。

出典

B: おとぎの国の高橋君 - AtCoder Regular Contest #009 | AtCoder

回答

AtCoder/arc009_2.php at master · wada811/AtCoder
<?php
// デバッグ用関数
function echos($array, $line){
    echo $line . '::k: ' . implode(' ', array_keys($array)) . PHP_EOL;
    echo $line . '::v: ' . implode(' ', $array) . PHP_EOL;
}
// 変換処理はここから
$cardinalNumber = trim(fgets(STDIN));
$cardinalNumbers = explode(' ', $cardinalNumber);
fscanf(STDIN, '%d', $n);
for($i = 0; $i < $n; $i++){
    fscanf(STDIN, '%d', $targetNumbers[]);
}
// echos($targetNumbers, __LINE__);
// 14::k: 0 1 2 3 4 5 6 7 8 9
// 14::v: 1 2 3 4 5 6 7 8 9 10
// targetNumbers の数字をアルファベットに置換
$alphabets = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j');
$numbers = array_keys($alphabets);
$targetAlphabets = str_replace($numbers, $alphabets, $targetNumbers);
// echos($targetAlphabets, __LINE__);
// 21::k: 0 1 2 3 4 5 6 7 8 9
// 21::v: b c d e f g h i j ba
// このアルファベットを cardinalNumbers の順になるようにソート
$cardinalAlphabets = array();
for($i = 0, $end = count($cardinalNumbers); $i < $end; $i++){
    $cardinalAlphabets[$i] = $alphabets[$cardinalNumbers[$i]];
}
// echos($cardinalAlphabets, __LINE__);
// 29::k: 0 1 2 3 4 5 6 7 8 9
// 29::v: a i b d f e j h g c
// targetAlphabets を cardinalAlphabets の k に置換
$numbers = array_keys($cardinalAlphabets);
$atCoderNumbers = str_replace($cardinalAlphabets, $numbers, $targetAlphabets);
// echos($atCoderNumbers, __LINE__);
// 35::k: 0 1 2 3 4 5 6 7 8 9
// 35::v: 2 9 3 5 4 8 7 1 6 20
// この数値を昇順に並べ替える
asort($atCoderNumbers);
// echos($atCoderNumbers, __LINE__);
// 40::k: 7 0 2 4 3 8 6 5 1 9
// 40::v: 1 2 3 4 5 6 7 8 9 20
// この順の k で targetNumbers を得る
$results = array();
$orders = array_keys($atCoderNumbers);
foreach($orders as $order){
    $results[] = $targetNumbers[$order];
}
// echos($results, __LINE__);
// 49::k: 0 1 2 3 4 5 6 7 8 9
// 49::v: 8 1 3 5 4 9 7 6 2 10
// 出力!
echo implode(PHP_EOL, $results) . PHP_EOL;
?>
変換してソートして逆変換するだけだとか思ってやってみたら結構大変なことになった。
数字をAtCoder国の大小関係の数字に変換しようとしたら
str_replaceで配列を渡すと多重変換されてしまうようだった。
仕方ないので適当にアルファベットを間に挟んで変換していったら混乱したので
デバッグ用関数を作ったら結構すんなり解けた。
間にアルファベットを挟む分だけわかりにくくなっているが、
変換してしまえばasortでソートするだけだし、
ソートすればインデックスがわかるので逆変換しなくても
元の数字をそのインデックスの順に出力するだけで良い。

普段よりB問題から面倒くさかったかも。C問題も難しかったし。

2012/10/27

[競技プログラミング][PHP][AtCoder]元気にお使い!高橋君

A - 元気にお使い!高橋君

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

問題文

ある日高橋君はお母さんに近くのスーパーまでおつかいを頼まれました。
お母さんに手渡されたおつかいメモには、買ってきて欲しい商品の値段と個数がそれぞれ書かれています。
ただしメモに書かれている値段には消費税が含まれていませんが、全ての商品には消費税が 5% かかります。
高橋君のおつかいに必要な金額を答えなさい。
なお、消費税は 1 円未満は切り捨てます。

入力

入力は以下の形式で標準入力から与えられる。
N
a0 b0
a1 b1
:
:
aN−1 bN−1
入力は N+1 行ある。
1 行目には、購入する商品の品数を表す整数 N(1≦N≦10) が与えられる。
2 行目から N 行の i+2 行目にはある商品の購入したい個数を表す整数 ai(1≦ai≦10) とその単価を表す整数 bi(1≦bi≦1,000) が空白区切りで与えられる。

出力

高橋君のおつかいに必要な金額を標準出力に 1 行で出力せよ。
なお、最後には改行を出力せよ。

出典

A: 元気にお使い!高橋君 - AtCoder Regular Contest #009 | AtCoder

回答

AtCoder/arc009_1.php at master · wada811/AtCoder · GitHub
<?php
fscanf(STDIN, '%d', $n);
$sum = 0;
for($i = 0; $i < $n; $i++){
    fscanf(STDIN, '%d %d', $num, $price);
    $sum += $num * $price;
}
$sum *= 1.05;
echo (int)$sum . PHP_EOL;
?>
個数と単価をかけて合計し、最後に消費税をかけて
小数点以下を切り捨てるだけの簡単なプログラム。
最初切り捨てを読んでなくて WA になったけど。

2012/10/26

[SQLearning][SQLite]データ型と制約の指定

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

前回: [SQLearning][SQLite]テーブルの作成・確認・削除 | DevAchieve
第3回は「データ型と制約の指定」についてです。

データ型の指定

以下の CREATE 文を例にデータ型と制約の指定について解説します。
CREATE TABLE IF NOT EXISTS products (
    id          INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    name        TEXT    NOT NULL UNIQUE,
    description TEXT    NULL,
    price       INTEGER NOT NULL CHECK(price > 0),
    tax_free    INTEGER NOT NULL DEFAULT 0 CHECK(tax_free IN (0, 1)),
    reg_date    TEXT    NOT NULL DEFAULT CURRENT_DATE
);
SQLite では動的型付けシステムを使用していて、データ型はカラムではなく値自体に関連付けられます。
ストレージクラスとして定義されていますが、これらはほぼデータ型と同じと考えることができます。
NULL
NULL値
INTEGER
符号付き整数。桁数によって1, 2, 3, 4, 6 バイトで保存される。
REAL
浮動小数点数。8バイトで保存される。
TEXT
文字列。データベースのエンコーディング(UTF-8, UTF-16BE もしくは UTF-16LE)で保存される。
BLOB
バイナリデータ(Binary Large OBject)。入力データがそのまま保存される。

Boolean
真偽値を格納する Boolean 型はありません。かわりに INTEGER 型の 0(false), 1(true) として保存します。
Date 型と Time 型
Date 型, Time 型, DateTime 型はありません。
かわりに組み込みのDate And Time Functionsが INTEGER, TEXT, REAL のいずれかとして保存します。
INTEGER: 1970-01-01 00:00:00 UTC からの秒数である Unix Time
TEXT: ISO8601 表記の文字列("YYYY-MM-DD HH:MM:SS.SSS")
REAL: 先発グレゴリオ暦にしたがった紀元前4714年11月24日、
グリニッジ標準時における正午からのユリウス日数(関連: ユリウス通日)
REAL はちょっと意味がわかりませんね。

また、SQLite では他の RDBMS との互換性のために Type Affinity (型の類似性)という概念が導入されています。
  • TEXT: ストレージクラスの NULL, BLOB, TEXT のすべてのデータを含みます。
  • NUMERIC: ストレージクラスの5つすべてを含みます。データは変換される可能性があります。
  • INTEGER: NUMERIC とほぼ同じ振る舞いをします。違いは CAST 方法のみです。
  • REAL: NUMERIC とほぼ同じ振る舞いをします。違いは浮動少数表現を強制する点です。
  • NONE: 他のストレージクラスへの変換をしません。
Datatypes In SQLite Version 3

制約の指定

NULL と NOT NULL
NULL は NULL値を許容し、NOT NULL は NULL値 を入れることができなくなります。
DEFAULT
デフォルト値を設定することができます。
INSERT時の日時をデフォルト値にすることのできる以下のキーワードを設定することもできます。
CURRENT_TIMEHH:MM:SS 形式
CURRENT_DATEYYYY-MM-DD 形式
CURRENT_TIMESTAMPYYYY-MM-DD HH:MM:SS 形式
PRIMARY KEY
主キーを設定することができます。INTEGER と組み合わせることで AUTOINCREMENT を実現できます。
しかし、その場合はデータ削除に再び同じ値が入ります。
AUTOINCREMENT
明示的に指定するとデータ削除後は削除した値にはならず次に大きい値が入ります。
UNIQUE
指定すると unique(一意な)値のみを受け入れます。
INSERT または UPDATE 時に既存の値と重複した値を指定するとエラーになります。
NULL を許容する場合、それぞれの NULL値は異なる値として扱われます。
CHECK(条件式)
条件式を満たす値のみを許容します。条件式にサブクエリを含めることはできません。
INSERT または UPDATE 時に条件式を満たさない値を指定するとエラーになります。
ver. 3.3.0 からサポートされました。ver. 3.3.0 以前では指定しても無視されます。

SQLite Query Language: CREATE TABLE

次回

次回は「テーブルの変更」についてを予定しています。

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

2012/10/05

[SQLearning][MySQL]データ型・制約の指定

SQL ゼロからはじめるデータベース操作を教材にしてMySQLを学ぶ
SQL学習連載「SQLearning」の第3回です。
前回: [SQLearning][MySQL]テーブルの作成・確認・削除
第3回は「データ型・制約の指定」の指定についてです。

データ型の指定

以下の CREATE 文を例にデータ型と制約の指定について解説します。
CREATE TABLE products (
    id          int(11)      NOT NULL AUTO_INCREMENT COMMENT '商品ID',
    name        varchar(255) NOT NULL UNIQUE         COMMENT '商品名',
    description text                                 COMMENT '商品の説明',
    price       int(11)      NOT NULL                COMMENT '商品の値段',
    tax_free    tinyint(1)   NOT NULL DEFAULT 0      COMMENT '非課税フラグ',
    reg_date    datetime     NOT NULL                COMMENT '登録日',
    PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT '商品テーブル';
int(11)
数値型です。カッコは表示幅です。値の範囲に影響を与えるものではありません。
ZEROFILL を続いて指定することによってスペースで調整される表示幅を 0 で埋めることができます。
値の範囲は -2147483648 ~ 2147483647 ですが、UNSIGNED をつければ 0 ~ 4294967295 になります。
MySQL :: MySQL 5.1 リファレンスマニュアル :: 10.2 数値タイプ
varchar
可変長の文字列型です。カッコは文字数です。(※4.1以前まではバイト数でした)
MySQL :: MySQL 3.23, 4.0, 4.1 Reference Manual :: 10.4.1 The CHAR and VARCHAR Types
(Before MySQL 4.1, the length is interpreted as number of bytes.)
MySQL 5.0.3以前は varchar は 255 バイト まででした。それ以降のバージョンでは 65535 バイト、
メタデータを除き 65532 バイト まで入れることができます。
MySQL :: MySQL 5.0 Reference Manual :: 11.1.6.1 The CHAR and VARCHAR Types
The length can be specified as a value from 0 to 255 before MySQL 5.0.3, and 0 to 65,535 in 5.0.3 and later versions.
文字コードが utf8 の場合は1文字3バイトなのでカッコに指定できるのは(65532/3=)21844くらいまでです。(*1)
それ以上の数を指定すると MySQLが自動的に mediumtext などに変換します。
(*1)メタデータの領域があるのか僕の環境では varchar(21835) までしか varchar として作成できませんでした。
text
可変長の文字列型です。varchar とは異なりデフォルト値を設定できません。
用途としては varchar とほとんど同じですが varchar がテーブルにインラインに格納されているのに対して
text は文字列を別ファイルとして持ち、カラムはファイルへのポインタを持っているようです。
この件については複雑な問題ですが以下の投稿によくまとまっています。
Takahiko HORIUCHI - Google+ - RDBMS に MySQL を採用したシステムで、VARCHAR の代わりに TEXT…
varchar(10000)とかで指定するくらいなら text にした方がパフォーマンス的に良いようです。
tinyint(1)
MySQL によって BOOL / BOOLEAN が内部変換された数値型です。
主にフラグ系の値を格納するのに使います。値の範囲は -127 ~ 128 です。
datetime
日時を格納する日付型です。'YYYY-MM-DD HH:MM:SS'形式で日時を保存します。

データ型は詳しく書くとリファレンスマニュアル並みの分量になるのでココでは簡単に紹介するだけに留めます。
詳しく知りたい方はMySQL :: MySQL 5.1 リファレンスマニュアル :: 10 データタイプを読むといいでしょう。

カラムの制約の指定

NULL と NOT NULL
description は NULL を許容するので NULL を指定していますが、
他のカラムは NULL を入れたくないので NOT NULL を指定します。
DEFAULT
デフォルト値を指定したい場合は DEFAULT [指定したい値] と記述します。
discount カラムはフラグを 0, 1 で管理したいのでデフォルト false で 0 を指定する、などのように使います。
AUTO_INCREMENT
id などのように自動で連番を振りたい場合は AUTO_INCREMENT を指定します。
UNIQUE
すべての値が一意でなければならない制限を指定します。
INSERT または UPDATE 時に既存の値と同じ値になる場合はエラーが発生します。
NULL を許容する場合、すべての NULL値は異なる値として扱われます。
COMMENT
カラムに対するコメントを記述することができます。
SQL 文のコメントとは異なり、SHOW CREATE TABLE 文で CREATE TABLE 文を表示した時にも表示されます。
phpMyAdmin などを使用する場合はコメントが表示されるのでフラグ系の各値の意味を記述しておくと便利です。

テーブルの制約の指定

PRIMARY KEY ( [カラム名] )
このテーブルの主キーを設定することができます。

テーブルの設定

ENGINE
データベースのストレージエンジンを指定することができます。
InnoDB と MyISAM が有名ですが 5.5 では InnoDB がデフォルトなようです。
以下のクエリでストレージエンジンの種類を確認すすることができます。
mysql> SHOW ENGINES;
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.5.4.13 SHOW ENGINES 構文
また、以下のクエリで各テーブルが使用しているストレージエンジンを確認することができます。
mysql> SHOW TABLE STATUS;
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.5.4.27 SHOW TABLE STATUS 構文
DEFAULT CHARSET
使用する文字セットを指定することができます。日本語を扱うなら utf8(utf8_general_ci)が一般的です。
以下のクエリでサポートしている文字セットを確認することができます。
mysql> SHOW CHARACTER SET;
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.5.4.2 SHOW CHARACTER SET 構文
実行結果
MySQL :: MySQL 5.1 リファレンスマニュアル :: 9.10 MySQL でサポートされるキャラクタセットと照合順序
MySQL :: MySQL 5.5 Reference Manual :: 10.1.14 Character Sets and Collations That MySQL Supports
COLLATE
照合順序を設定することができます。文字列を比較する際に順位を決める設定です。
DEFAULT CHARSET が utf8 の場合、省略すると utf8_general_ci が設定されます。
ちなみに utf8_general_ci の ci は case-insensitive の略で、大文字小文字を区別しないという意味なので
大文字小文字を区別したい場合は utf8_bin などを指定します。
以下のようなクエリで照合順序の一覧を表示します。
mysql> SHOW COLLATION like 'utf8%';
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.5.4.3 SHOW COLLATION 構文
COMMENT
テーブルに対してもコメントを記述することができます。

次回

次回は「テーブルの変更」についてを予定しています。

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

2012/10/04

[SQLearning][SQLite]テーブルの作成・確認・削除

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

前回: [SQLearning][SQLite]ログインとデータベースの作成・削除 | DevAchieve
第2回は「テーブルの作成・確認・削除」についてです。

テーブルの作成

CREATE TABLE products (
    id          INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    name        TEXT    NOT NULL,
    description TEXT    NULL,
    price       INTEGER NOT NULL,
    discount    INTEGER NOT NULL DEFAULT 0,
    reg_date    TEXT    NOT NULL
);
すでにテーブルが存在する場合はエラーになりますが IF NOT EXISTS と書くことでエラーを防ぐことができます。
CREATE TABLE IF NOT EXISTS products (
    id          INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    name        TEXT    NOT NULL,
    description TEXT    NULL,
    price       INTEGER NOT NULL,
    discount    INTEGER NOT NULL DEFAULT 0,
    reg_date    TEXT    NOT NULL
);
SQLite Query Language: CREATE TABLE

テーブルの確認

.tables
テーブルの一覧を表示します。
sqlite> .tables
.schema
CREATE TABLE 文を表示します。
sqlite> .schema products

テーブルの削除

DROP TABLE products;
すでにテーブルが存在する場合はエラーになりますが IF EXISTS と書くことでエラーを防ぐことができます。
DROP TABLE IF EXISTS products;

次回

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

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

2012/10/03

[競技プログラミング][PHP][K2PC Easy]ハンバーガー

A - ハンバーガー(Hamburger)

時間制限 : 1sec / スタック制限 : 128MB / メモリ制限 : 256MB

問題文

kyuridenamidaは, K2PCというレストランでバイトをしている.
彼は受付を担当しているが, 時給が810円と低いので, 時給が893円の厨房を担当したいと考えている.

厨房では, K2PCレストランの(唯一の商品であり)目玉商品であるK2PCハンバーガーを作る仕事が行われている.
ハンバーガーを1個作るには, 肉が1枚, パンが2枚, トッピング類が3個必要である.
今, 肉がa枚, パンがb枚, トッピング類がc個あるとする.
ハンバーガーをN個作るためには, それぞれの材料が残りいくつ必要か求めよ.

入力

a b c
N
1行目に, 今ある肉の枚数, パンの枚数, トッピングの個数を表す整数がこの順に入力される.
2行目に, 作りたいハンバーガーの個数を表す整数が入力される.

出力

それぞれの材料がいくつ必要かを, 肉の枚数, パンの枚数, トッピングの個数の順でスペース区切りで出力せよ.
改行を忘れないように注意すること.

出典

A: ハンバーガー(Hamburger) - Kyuride Kagamiz Programming Contest (Easy) | AtCoder

解答

AtCoder/k2pc_easy_1.php at master · wada811/AtCoder · GitHub
<?php
fscanf(STDIN, "%d %d %d", $a, $b, $c);
fscanf(STDIN, "%d", $n);
$n_a = max($n * 1 - $a, 0);
$n_b = max($n * 2 - $b, 0);
$n_c = max($n * 3 - $c, 0);
echo $n_a . ' ' . $n_b . ' ' . $n_c . PHP_EOL;
?>
なんかやってたから解いてみたけどこれくらいしか解けなかった。
次の問題のビットマニアは問題がまずよくわからなかったし読むのが面倒だった。

2012/10/02

[書評]プログラミングコンテストチャレンジブック [第2版]

プログラミングコンテストチャレンジブック [第2版] ~問題解決のアルゴリズム活用力とコーディングテクニックを鍛える~
秋葉拓哉
マイナビ
発売日:2012-01-28
ブクログでレビューを見る»
実際のプログラミングコンテストで出題された問題などを元に
アルゴリズムの解説をしている本。
深さ優先探索と幅優先探索でわーわー言ってるレベルなので
難しいし白黒だしで睡眠導入剤でした。
本自体は色々な手法や色々な問題を解説していて凄いのだけど
理解するには一つ一つの手法に対してもっと練習問題がないときついと思いました。
AtCoderの問題を@chokudai さんが解答手法を呟いてくれるので
この本でその手法を調べてAtCoderの問題に適用していけば練習になりそうです。
何もなしで、ただ読むだけだと睡眠導入剤にしかならない。途中で読むのを諦めた。

深さ優先探索とか幅優先探索でわーわー言ってるレベルでも徐々にステップアップしていける本があるといいな。
プログラミングコンテストチャレンジブック [第2版] ~問題解決のアルゴリズム活用力とコーディングテクニックを鍛える~
プログラミングコンテストチャレンジブック [第2版] ~問題解決のアルゴリズム活用力とコーディングテクニックを鍛える~

2012/10/01

[SQLearning][MySQL]テーブルの作成・確認・削除

SQL ゼロからはじめるデータベース操作を教材にしてMySQLを学ぶ
SQL学習連載「SQLearning」の第2回です。
第1回: [SQLearning][MySQL]ログインとデータベースの作成・削除
第2回の今回は「テーブルの作成・確認・削除」についてです。

データベースの選択

第1回で作成した shop データベースにテーブルを作成するわけですが、
まずはテーブルを作成するクエリを投げる前にデータベースを選択しなければいけません。
データベースを選択していないとERROR 1046 (3D000): No database selectedというエラーが発生します。
mysql> USE shop;
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.3.3 USE 構文

テーブルの作成

CREATE TABLE Shohin (
    shohin_id     CHAR(4)       NOT NULL,
    shohin_mei    VARCHAR(100)  NOT NULL,
    shohin_bunrui VARCHAR(32)   NOT NULL,
    hanbai_tanka  INTEGER       ,
    shiire_tanka  INTEGER       ,
    torokubi      DATE          ,
    PRIMARY KEY (shohin_id)
);
すでにテーブルが存在する場合はエラーになりますが IF NOT EXISTS と書くことでエラーを防ぐことができます。
CREATE IF NOT EXISTS TABLE Shohin (
    shohin_id     CHAR(4)       NOT NULL,
    shohin_mei    VARCHAR(100)  NOT NULL,
    shohin_bunrui VARCHAR(32)   NOT NULL,
    hanbai_tanka  INTEGER       ,
    shiire_tanka  INTEGER       ,
    torokubi      DATE          ,
    PRIMARY KEY (shohin_id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.1.8 CREATE TABLE 構文

テーブルの確認

テーブル情報はいくつかのクエリで確認することができます。
SHOW TABLES 構文
データベースのテーブル一覧を表示します。
mysql> SHOW TABLES;
+----------------+
| Tables_in_shop |
+----------------+
| Shohin         |
+----------------+
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.5.4.28 SHOW TABLES 構文
DESCRIBE 構文 または SHOW COLUMNS 構文
データ型や制約などを表示します。DESCRIBE 構文は SHOW COLUMNS 構文 のショートカットです。
mysql> DESCRIBE Shohin;
または
mysql> DESC Shohin;
または
mysql> SHOW COLUMNS FROM Shohin;
+---------------+--------------+------+-----+---------+-------+
| Field         | Type         | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+-------+
| shohin_id     | char(4)      | NO   | PRI | NULL    |       |
| shohin_mei    | varchar(100) | NO   |     | NULL    |       |
| shohin_bunrui | varchar(32)  | NO   |     | NULL    |       |
| hanbai_tanka  | int(11)      | YES  |     | NULL    |       |
| shiire_tanka  | int(11)      | YES  |     | NULL    |       |
| torokubi      | date         | YES  |     | NULL    |       |
+---------------+--------------+------+-----+---------+-------+
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.3.1 DESCRIBE 構文
SHOW TABLE STATUS 構文
テーブルに関するさらに詳しい情報を表示します。
mysql> SHOW TABLE STATUS;
+--------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
| Name   | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time | Check_time | Collation       | Checksum | Create_options | Comment |
+--------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
| Shohin | InnoDB |      10 | Compact    |    0 |              0 |       16384 |               0 |            0 |   9437184 |           NULL | 2012-09-29 22:44:57 | NULL        | NULL       | utf8_general_ci |     NULL |                |         |
+--------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.5.4.27 SHOW TABLE STATUS 構文
SHOW CREATE TABLE 構文
CREATE 文を表示します。
mysql> SHOW CREATE TABLE Shohin;
CREATE TABLE `Shohin` (
  `shohin_id` char(4) NOT NULL,
  `shohin_mei` varchar(100) NOT NULL,
  `shohin_bunrui` varchar(32) NOT NULL,
  `hanbai_tanka` int(11) DEFAULT NULL,
  `shiire_tanka` int(11) DEFAULT NULL,
  `torokubi` date DEFAULT NULL,
  PRIMARY KEY (`shohin_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
MySQL によって自動的に変換されていることがわかります。
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.5.4.9 SHOW CREATE TABLE 構文

テーブルの削除

mysql> DROP TABLE Shohin;
テーブルが存在していなかった場合はエラーになりますが IF EXISTS と書くことでエラーを防ぐことができます。
mysql> DROP TABLE IF EXISTS Shohin;
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.1.14 DROP TABLE 構文

次回

次回は「データ型・制約の指定」についてを予定しています。
SQL ゼロからはじめるデータベース操作 (CD-ROM付) (プログラミング学習シリーズ)
SQL ゼロからはじめるデータベース操作 (CD-ROM付) (プログラミング学習シリーズ)