訪問者に対して何かしらの サービス を提供するWeb
「あのサービスをつくったゆーすけべーさんですよね?」
Shut the fuck up and write some code.
use Net::Twitter::Lite::WithAPIv1_1;
use Config::Pit;
use Encode;
use utf8;
binmode STDOUT, ':utf8';
my $config = pit_get('twitter-api');
my $nt = Net::Twitter::Lite::WithAPIv1_1->new(
consumer_key => $config->{consumer_key},
consumer_secret => $config->{consumer_secret},
access_token => $config->{token},
access_token_secret => $config->{token_secret}
);
my $result = $nt->search(
{
q => 'おはよう',
include_entities => 1,
result_type => 'recent',
count => 100
}
);
for my $tweet ( @{ $result->{statuses} } ) {
print "$tweet->{text}\n";
print "----------------------------------------\n";
}
そこに1,000人いたとして、アイデアを思いつくのが100人、アイデアを実現するのが10人、アイデアで成功する人は1人
1. 哲学
- 個々人が持つある興味に対する揺るがない信念
2. アイデア
- 哲学を叶える個別具体的なアイデア
3. テーマ
- 勝負する領域
4. コンセプト
- アイデアを束ねるつくるモノを一言で表すような枠組み
5. 名前
- これが無くては始まらない。キラキラネームかセルフトーキングか
6. デザイン
- 見た目のみならず、ディテールを妥協して決めていく作業
7. 内部設計
- 実装に向けてのシステムの内側を設計する
クックパッド の場合…
例: ボケては「写真で一言ボケる」Webサービス
アイデアとは既存の要素の新しい組み合わせ以外の何のものでもないということである
「アイデアのつくり方」より
そにはリスクが潜んでいる
「企画倒れ」にならないよう開発へのハードルを下げていく
やるやる詐欺にはなりたくない
これはemacsです!
Standing on the shoulders of giants
CPANライブラリのエコシステム
オススメ本
このやり取り自体が取り決め= プロトコル として定められている
あくまで取り決めなので「そういうモノ」として捉える
クライアントからサーバへのリクエスト。リソースを扱うため、主に4つが使われている
$ telnet yusukebe.com 80
GET / HTTP/1.1
Host: yusukebe.com
ある程度構造化したテキストをマークアップで書ける
<h2 class="title">タイトル</h2>
CSSセレクタを利用しHTMLを装飾する
h2.title { color:#333; }
ページ自体をブラウザ側で操作し動きを与える
$('h2.title').fadeOut();
などが主流であるが C言語 でも不可能ではない
例えば、Ruby on Rails
役割を分離して考えておくとよいよねぇ〜
例: Twitterログイン掲示板
今でしょ!
やり方はひとつじゃない
package WebServiceOneDay;
use strict;
use warnings;
use Text::Markdown qw/markdown/;
use Path::Class qw/file/;
use Encode qw/decode_utf8/;
use Data::Section::Simple qw/get_data_section/;
use Text::MicroTemplate qw/render_mt/;
…;
$ mojo generate app MyApp::Web
すると…
$ tree ./
./
├── lib
│ └── MyApp
│ ├── Web
│ │ └── Example.pm
│ └── Web.pm
├── log
├── public
│ └── index.html
├── script
│ └── my_app_web
├── t
│ └── basic.t
└── templates
├── example
│ └── welcome.html.ep
└── layouts
└── default.html.ep
package MyApp::Web;
use Mojo::Base 'Mojolicious';
sub startup {
my $self = shift;
my $r = $self->routes;
$r->namespaces(['MyApp::Web::Controller']);
$r->get('/')->to('root#index');
}
1;
package MyApp::Web::Controller::Root;
use Mojo::Base 'Mojolicious::Controller';
sub index {
my $self = shift;
my $message = "Hello, I'm from Yokohama!";
$self->stash->{message} = $message;
$self->render();
}
1;
% layout 'default';
% title 'Welcome';
<h2><%= $message %></h2>
なにをつくりましょうか!
mysql> select * from entry;
+----+---------------+-----------+---------+---------------------+
| id | title | body | user_id | created_on |
+----+---------------+-----------+---------+---------------------+
| 1 | This is title | Body Text | 1 | 2013-07-23 14:00:00 |
+----+---------------+-----------+---------+---------------------+
1 row in set (0.00 sec)
CREATE TABLE entry (
id INT UNSIGNED AUTO_INCREMENT,
title VARCHAR(255),
body TEXT NOT NULL,
user_id BIGINT UNSIGNED NOT NULL,
created_on DATETIME NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET 'utf8' engine=InnoDB;
INSERT INTO entry
(title, body, user_id, created_on)
VALUES
('This is title', 'Body Text', 1, '2013-07-23 14:00:00');
$db->insert( 'entry',
{ title => 'This is title', body => 'Body text' } );
my $entry = $db->single( 'entry', { id => 1 } );
say $entry->title; # This is title
$entry->update({ title => 'Another title' });
say $entry->title; # Another title
$entry->delete();
sub index {
my $self = shift;
my $entries = $self->model('Entry')->get_recent_entries({}, {
order_by => 'id DESC', page => 1
});
$self->stash->{entries} = $entries;
$self->render('index');
}
TAP
ok $model->get_entry({ id => 1 });