Hatena::ブログ(Diary)

130単位

2011-04-28

第2回「開発コンテスト24」で作ったSlideShareの何か

えー、応募はしませんでした>< 意志が弱かったのは反省点です。

作ったもの

f:id:deeeki:20110428091046j:image

SlideShareのスライドをプログラミングや開発に関するキーワードごとに閲覧できるものです。

f:id:deeeki:20110428091044j:image

f:id:deeeki:20110428091043j:image

技術まわり

きっかけ

目的

課題

(普段の生活で)半径3m以内にいる人が困っていることを解決する

※職場や学校の隣の席の人、同居する家族やルームメイトなど(ご自身は対象外です。)

http://info.cookpad.com/24contest2
  • 未経験者/初心者が学習のとっかかりを得るために
  • 英語で敷居が高いと思われるSlideShareを少しでも親しみやすく

24h顛末

  • 会社で課題確認して退社
  • 地元の友人がきて飯食ったりなど
  • 漠然とアイデア考えつつ眠かったので普通に睡眠
  • 朝はまだアイデア考えつつだらだらネットサーフィン
  • 友人が用事に出かけて、締切り6時間前にようやく開発開始*1
  • いまいちな出来ながら締切ぎりぎりでデプロイしてて間に合わずギブ

やりたかったこと

課題

  • SlideShareは日本語検索できない
  • 半径3m以内の人の直接的な解決にはなっていないかもしれない
    • このスライド読むといいよ、で終わってしまいそうな状況はよくない
    • そもそも未経験者がパッと見てスライドとか読み進められるとも思えない
  • UIに改善の余地がまだまだある

まとめ

そんなわけで作ったものの微妙な感触だったのですが、あとで後輩に見せてみたらまあ悪くはない反応だったので、すこし手直しして公開してみた次第です。

次回開催があれば、もっと時間をかけて、納得した上で提出するまではいきたいなあと思います。

参加されたみなさまおつかれさまでした&クックパッドさん機会提供ありがとうございました!


2011-04-27

3月分の読書記録

定例エントリです。全然読んでいないと後ろめたさからか月の終わり間際の更新になるようです。

きたみりゅうじ氏の『フリーランスを代表して 申告と節税について教わってきました。』は、フリーランスの特に経理面の知識を得るとっかかりとしては良い本だと思いました。

3月分読書データ

期間 : 2011年03月
読了数 : 3 冊
はじめてのRuby on Rails3―「Webアプリケーション」作りに定番の「フレームワーク」を使う! 便利なフレーム (I/O BOOKS)
清水 美樹 / 工学社 (2010-11)
★★★☆☆ 読了日:2011年3月20日
初心者向けで奥深く解説されてはいない。Windows向け環境構築あり
バクマン。 12 (ジャンプコミックス)
小畑 健 / 集英社 (2011-03-04)
★★★★☆ 読了日:2011年3月7日
展開のサイクルはやい。ジャンプでしかできない演出も良い
フリーランスを代表して 申告と節税について教わってきました。
きたみ りゅうじ / 日本実業出版社 (2005-12-08)
★★★★☆ 読了日:2011年3月6日
フリーランスにとって青色申告の知識は必須。3/15までに申請。他にも税金の仕組みや節税の方法の解説がわかりやすい

メディアマーカー

2月分の読書記録 - 130単位 (一ヶ月前)

3月分の読書記録 - 130単位 (一年前)

2011-04-20

ダッシュボードから不要なウィジェットを無効化 #WordPress

お題

  • ダッシュボードで扱えるウィジェットを「テキスト」のみにしたい

環境

案1

<?php
function disable_widgets() {
    global $wp_widget_factory;
    foreach ($wp_widget_factory->widgets as $widget_class => $widget) {
        if ($widtet_class !== 'wp_widget_text') {
            unregister_widget($widget_class);
        }
    }
}
add_action('widgets_init', 'disable_widgets', 99);

案2

<?php
function disable_widgets() {
    global $wp_registered_widgets;
    foreach ($wp_registered_widgets as $idx => $widget) {
        if ($widget['classname'] !== 'widget_text') {
            unset($wp_registered_widgets[$idx]);
        }
    }
}
add_action('widgets_admin_page', 'disable_widgets');

そんなわけで、プラグインにも対応できる案2でやるのがいいかと思います。コードはテーマのfunctions.phpに追加またはプラグイン化してください。他のウィジェットを有効化する場合は名前を調べて条件式に追加してください。深くは調べてないので副作用があるかもしれません。あったらご連絡ください><


4883377377
WordPress関数リファレンスガイド

関連リンク

2011-04-18

Rails3入門電子書籍『はじめる! Rails3(1)』のメモ

はじめる! Rails3(1) - 達人出版会

Rails3入門書の電子書籍です。初心者向けに良いということだったので購入してみました。PayPal支払いで1000円です。購入時のアカウントメールアドレス電子書籍各ページの下に付加されます。

続刊される予定のうちの第一巻ということで、これを読んだだけで実務でのアプリを作れるかというと微妙な感じですが、基礎を学べる日本語の書籍としては最適と思います。

個人的に知らなかった点もいくつかあり、知識が広げられたという意味では読んで良かったです。以下そのメモです。問題ありましたらご指摘ください。

第3章

rails _2.3.8_ appname #バージョン2
rails _3.0.3_ new appname #バージョン3
rails new hinagiku -O

第5章

第6章

  • x.days.from_now で「現在時刻からx日後」を求める
  • シードデータ投入
rake db:seed
rake db:reset

第7章

  • paramsにはシンボルを使うのが一般的(なのだろうか)
params[:id]

第8章

  • link_toの第2引数URLパスよりもシンボルやモデルオブジェクト変数を入れるようにする
    • 構造が複雑になると恩恵を受ける

第10章

  • rails.jsが削除時のフォームを生成と送信処理を行う

第11章

  • アクションは集合(collection)または要素(member)を対象とする
  • routes.rbのresourcesのブロックで :on => :member とすると resources/1/added_actionが認識される
resources :tasks do
	put :finish, :on => :member
end

第12章

第14章

  • Arelのwhere()やorder()は順番は関係ない
  • プレースホルダーの位置に挿入される値は自動的にエスケープされる
  • 引数を取る場合はlambdaを使ってスコープを定義
scope :search, lambda { |query|
	where([ "name LIKE ?", "%#{query}%" ])
}

第15章

bundle list

こちらでサンプルが見られます。

Rubyの入門書としてはこちらがおすすめみたいです。

4797357401
たのしいRuby 第3版

関連リンク

2011-04-17

Rails勉強会@東京第61回 #railstokyo 参加メモ

Rails’ Wiki - Rails勉強会@東京第61回

初参加してきました。

以下参加したセッション目次です。

  • Devise
  • RSpec/よろず相談
  • 運用環境

以下雑多なメモです。間違い等あるかもしれませんがご了承ください><

Devise

  • Rackベース
  • Viewも自前で持ってる
  • モジュラリティが高い
  • 拡張するときにソース読み込まないとわからなかったりするのが難点
  • 認証のみ別アプリにはしないほうがいい
  • 認証用データのテーブルは別にしたほうがいい
  • OmniAuthと連携
  • OpenIDは将来性に疑問
  • OAuthのほうが受け入れられてる
  • SSLRequirement
    • フォークされていて選択肢がいろいろある
  • SSLの範囲
  • initializer/devise.rbの記述でSSL対応

RSpec

よろず相談

管理アプリを伴う場合の構成
  • admin側でrake db:schema:dump
  • Modelをexternal
  • Controllerの階層を掘る
    • ScaffoldでできるModelが階層に対応してない
  • Admin用Controllerのgenerator作る解決
  • Adminの下にnamespaceで呼ぶ
  • RailsAdminつかってて大変だけど便利
マスタデータの扱い
  • Enumっぽいものがあるといい
    • GitHubにいくつかあるけど決定稿がない
  • 0/1をアルファベットにするのをModel側において表示をi18nにする
  • seedsでまるっと置き換えちゃう

運用

※カッコ内は各項目で利用してる参加者の数

感想

初参加でどんな感じかもわからなったですが、自己紹介で興味のあることを聞きつつ多数決でセッションの内容を決めていく柔軟さが新鮮で面白かったです。Deviseのセッションオーナーをやっていただいた[twitter:@takahashim]さんには質問に丁寧に答えていただき感謝しています。まだ経験不足ため理解が及ばない部分もありましたが、外のRuby/Rails界隈の雰囲気が知れてよかったです。

懇親会でも貴重なお話が聞けて、特に[twitter:@onk]さんには大変刺激を受けました。ありがとうございました!

2011-04-15

Instagram APIで桜の写真を見るサイトつくりました

花見シーズンが日本各地の大半で過ぎ去ろうとしている中ですが、つくってみました。

f:id:deeeki:20110414222807j:image

あらかじめお断りといいますか、ネタとしては二番煎じです(つくってから気づきました)。以下のサイトが3月末に公開されています。

1枚ずつ切り替わる動きとかおしゃれな感じです。まあベースカラーが違っているので多めにみていただければと…><

経緯

  • ふと「Instagramで桜の写真に特化したサイトって需要あるんじゃないかな」的なことをつぶやこうとする
  • 内容入力してエンター押す直前にやっぱり自分で作ってみようかと思い立つ
  • Herokuで作ってみようとして調査開始
  • http://sakura.heroku.com/ と入力してアクセスしてみると既にある
  • 同じコンセプトだけど取得元がInstagramではなくTwitPicだった
    • 実は先に桜のInstagramサイトをつくっていた方の1年前の作品だった(ということにあとで気づく)
    • no title
  • http://saku.heroku.com/ は空いてたので使おうと試みる
  • HerokuなのでRubyのコードとか探して見てみる
  • どうせAjaxつかうだろうし、だったら全部JavaScriptでいいかと思ってそうする
  • 日曜深夜にひたすらコーディング
  • Heroku使う理由がなくなったので、VPS+自ドメインで公開

利用ライブラリ

変更履歴

Ver1

f:id:deeeki:20110414222810j:image

  • ページ遷移は次ページのみ対応
  • 「桜」と「咲」の語感を利用すべく漢字を前面に出してみたがなんかダサい
Ver2

f:id:deeeki:20110414222808j:image

  • ページ遷移を左右に配置してわかりやすくした
    • 「前へ」のほうはうまく動かない
  • 漢字やめてそれっぽいフレーズにしてみた
  • タイトルの色はちょっとこだわってみた
Ver3
  • デフォルトで自動ページ送りにしてみた
    • 画像拡大表示したら止まる仕様(再び有効化の処理はまだ)
Ver4
  • APIの仕様で次ページしか取れないみたいなので左側は最初に戻るようにした
  • faviconつくった

そんなわけで少しずつ改修重ねて一通りやりたいことやれたので、とりあえず満足した感じです。まだUI調整が必要なところがありますが、よろしければ一度ご覧くださいー。

参考リンク

2011-04-12

CakePHP CSVでインポート/エクスポートするビヘイビア

deeeki/cakephp-csvio - GitHub
https://github.com/deeeki/cakephp-csvio

つくってみました。

これは何

使いかた

準備
ビヘイビアのセット
<?php
//なんらかのModel内
public $actsAs = array('CsvIo');
インポート/エクスポート
<?php
//なんらかのController内
$this->Model->importCsv();
$this->Model->exportCsv();

同梱コントローラーでの作業例

  • 対象テーブル
CREATE TABLE IF NOT EXISTS `items` (
	`id` int(11) NOT NULL AUTO_INCREMENT,
	`name` varchar(255) NOT NULL,
	`price` int(11) NOT NULL,
	`created` datetime NOT NULL,
	`modified` datetime NOT NULL,
	PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
  • app/controllers/admin/csv_controller.phpに配置
  • bootstrap.php(core.php)に追記
Configure::write('Routing.prefixes', array('admin'));
  • http://your.cake.app/admin/csv/にアクセス

f:id:deeeki:20110413010750j:image

  • export_allクリック

f:id:deeeki:20110413010749j:image

id,name,price,created,modified
1,"レーザービーム/微かなカオリ [初回限定盤]",1500,"2011-04-12 23:09:47","2011-04-12 23:09:47"
2,"レーザービーム/微かなカオリ [通常盤]",1000,"2011-04-12 23:10:00","2011-04-12 23:10:00"
  • config/csv/items.csvへコピー
  • http://your.cake.app/admin/csv/にアクセス

f:id:deeeki:20110413010748j:image

  • import_allまたはitemsクリック

f:id:deeeki:20110413010746j:image

f:id:deeeki:20110413010744j:image


Windowsのローカルな開発環境で作業してたり、非エンジニアな他のメンバーにデータ入力を行ってもらうとかの場合にお役に立てるかと思います。よかったら使ってみてください。フィードバックいただけるとありがたいです!



Pocket詳解 CakePHP辞典

関連記事

*1:appディレクトリ丸ごとがお手軽

2011-04-10

Excel用のCSV(SJIS)をPHP(UTF-8)で読み込む

Excelで作成したCSVファイルは文字コードがShift-JISであるため、UTF-8に設定してあるPHPで扱うには工夫が必要です。その取り扱い方について調べて、ベンチマークをとってみました。

CSVを配列にする関数4通り

テンポラリファイル作成してfgetcsv()
<?php
function by_tmpfile($file) {
	$ret = array();

	$buf = mb_convert_encoding(file_get_contents($file), 'utf-8', 'sjis-win');
	$fp = tmpfile();
	fwrite($fp, $buf);
	rewind($fp);
	while($line = fgetcsv($fp)) {
		$ret[] = $line;
	}
	fclose($fp);

	return $ret;
}
ロケール設定してfgetcsv()
<?php
setlocale(LC_ALL, 'ja_JP.SJIS');
function by_locale($file) {
	$ret = array();

	$fp = fopen($file, 'r');
	while ($line = fgetcsv($fp)) {
		mb_convert_variables('utf-8', 'sjis-win', $line);
		$ret[] = $line;
	}
	fclose($fp);

	return $ret;
}

str_getcsv()
<?php
function by_str_getcsv($file) {
	$ret = array();

	$buf = mb_convert_encoding(file_get_contents($file), 'utf-8', 'sjis-win');
	$lines = str_getcsv($buf, "\r\n");
	foreach ($lines as $line) {
		$ret[] = str_getcsv($line);
	}

	return $ret;
}
  • PHP5.3以上必要
  • 行単位に分割してからstr_getcsv()を呼ぶ
  • Excelのセル内改行はLFなため、CRLFの"\r\n"で分割可能
  • 参考
<?php
function by_str_getcsv_explode($file) {
	$ret = array();

	$buf = mb_convert_encoding(file_get_contents($file), 'utf-8', 'sjis-win');
	$lines = explode("\r\n", $buf);
	array_pop($lines);
	foreach ($lines as $line) {
		$ret[] = str_getcsv($line);
	}

	return $ret;
}
  • explode()版
  • 末尾の改行で分割された行を無視するためarray_pop()している

ベンチマーク

環境
結果
functiontimememory_peak_usage
by_tmpfile12.437s721848
by_locale6.335s719456
by_str_getcsv8.217s726208
by_str_getcsv_explode5.405s726216

平均値ではありませんが再試行しても微量な差です

まとめ

途中Twitterにてアドバイスいただきました[twitter:@chobi_e]さんありがとうございました!


4774144371
パーフェクトPHP (PERFECT SERIES 3)

関連記事

2011-04-02

Gitブランチ名を__git_ps1でbashプロンプトに表示

Git 基礎最速マスター - 予定は未定Bloghttp://d.hatena.ne.jp/bleis-tift/20100307/1267941654

こちらでプロンプトにGitのブランチ名を表示させる方法を知りました。そこでさらに各OSで共通の表示を試みてみたので、そのメモです。

  1. Bash-Completionのインストール
  2. 環境変数PS1の設定

上記の手順で、

f:id:deeeki:20110403002805p:image

こんな感じになります。

Bash-Completionのインストール

Mac
$ sudo port install git-core +bash_completion
  • .bashrc追記
if [ -f /opt/local/etc/bash_completion ]; then
	. /opt/local/etc/bash_completion
fi
CentOS
  • CentOS release 5.5
  • EPELリポジトリ追加
    • no title
    • 普段含めない場合は /etc/yum.repos.d/epel.repo でenabled=0にする
      • 含める際に yum install package --enablerepo=epel とする
$ sudo rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm
$ sudo yum install bash-completion
  • .bashrc追記
if [ -f /etc/bash_completion ]; then
	. /etc/bash_completion
fi
Ubuntu
  • Ubuntu 10.10
  • もとから入っていた(と思う)が、入っていない場合は以下
$ sudo apt-get install bash-completion

bashプロンプト表示

  • .bashrcで環境変数PS1を設定
    • bash_completion読み込みのあとに記述する
    • 共有していて「-bash: __git_ps1: command not found」とエラーにならないために分岐しておく
if [ -f $BASH_COMPLETION_DIR/git ]; then
	export PS1='\[\033[01;32m\]\u@\h\[\033[01;33m\] \w$(__git_ps1) \n\[\033[01;34m\]\$\[\033[00m\] '
else
	export PS1='\[\033[01;32m\]\u@\h\[\033[01;33m\] \w \n\[\033[01;34m\]\$\[\033[00m\] '
fi
  • source .bashrc などして再読み込み

色やフォーマットはお好みで変更するといいと思います!

参考リンク


4798023809
入門Git

4873112540
入門bash 第3版

2011-04-01

Apache/PHPをMacデフォルトからMacPortsに移行

Apache/PHPとも、Macに標準でインストールされているものを利用していました。が、ふと思い立ってMacPortsのものに移行することにしました。

このようなメリットがあるかと思います。巷ではHomebrewが流行っていたりするようですが、いったんMacPortsを貫き通してみます。

Apache2インストール

$ sudo port install apache2
環境変数PATH追加
  • ~/.bashrcに追記してMacデフォルトから切り替え
    • PATHは前方優先で解釈されるとのこと
export PATH=/opt/local/apache2/bin/:$PATH
  • 追記したら source ~/.bashrc で再読み込み
確認
$ apachectl -v
Server version: Apache/2.2.17 (Unix)
Server built:   Mar 23 2011 01:20:37
$ which apachectl
/opt/local/apache2/bin//apachectl
自動起動
$ sudo launchctl load -w /Library/LaunchDaemons/org.macports.apache2.plist

PHP5インストール

sudo port install php5 +apache2 +pear php5-mbstring php5-mysql
確認
$ php -v
PHP 5.3.6 (cli) (built: Mar 23 2011 01:29:26)
Copyright (c) 1997-2011 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies
$ which php
/opt/local/bin/php
php.ini作成
$ cd /opt/local/etc/php5
$ sudo cp php.ini-development php.ini
php.ini編集
date.timezone = Asia/Tokyo

pdo_mysql.default_socket=/var/mysql/mysql.sock
mysql.default_socket = /var/mysql/mysql.sock
mysqli.default_socket = /var/mysql/mysql.sock

mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = pass
mbstring.http_output = pass

Apacheモジュール追加

$ cd /opt/local/apache2/modules
$ sudo /opt/local/apache2/bin/apxs -a -e -n "php5" libphp5.so

Apache設定ファイル編集

  • /opt/local/apache2/conf/httpd.conf
  • Linux同様conf.d/以下に自前の設定ファイルを置く運用にする
#ファイル一覧を見やすく
Include conf/extra/httpd-autoindex.conf
#拡張子.php対応設定ファイル読み込み
Include conf/extra/mod_php.conf
#自前の設定ファイル読み込み
Include conf.d/*.conf
#Indexファイル定義 (mod_php.confに書くのがいいかも)
<IfModule dir_module>
    DirectoryIndex index.html index.php
</IfModule>

Apache起動コマンド

#設定確認
$ sudo apachectl configtest
#起動
$ sudo apachectl start
#再読込
$ sudo apachectl graceful
#再起動
$ sudo apachectl restart

気づいたこと

  • http://localhost/はアクセスできるが、Alias指定したパスhttp://localhost/alias/にはなぜかアクセスできない
  • http://127.0.0.1/alias/はアクセスできる
  • マシン名http://computer-name.local/alias/でもアクセスできる
  • これらはMacデフォルト/MacPorts問わず発生

この謎わかるかた教えてください><

参考リンク


4774142239
Apacheポケットリファレンス (POCKET REFERENCE)

4774144371
パーフェクトPHP (PERFECT SERIES 3)

関連記事