2012年4月5日木曜日

第8回Okinawa.rb Meetupに参加して

参加しました。
写真は@gliese035さんと@rikiyahirataさんと@kimihito_さんです。 思えばOkinawa.rbのMeetupはじめてからブログをしっかり書いたことがない。
すぎた人生は戻ってこないので過去の記事はもう書かないと思う。ちょっともったいなさすぎる。
今書かないと永遠に書かないので、今書きます。

今日ははじめてOkinawa.rbにお越しの方もいらっしゃいました!
@gongoZさんきてくれてありがとー! @nekonekomeikoさんありがとう!


今日やったこと


Twitterで一言で書いてたので引用すると
今日は僕は楽しめました。メタプロ、下レイヤーな話、Airbnbの件、&:symbolで暗黙的にto_procが呼ばれる、PHPだと連想配列と配列っておんなじ感じだけどRubyの配列とハッシュって結構違うよねっていう感じの話、唐揚げ、正規表現の否定戻り読み。」


メタプログラミング

久しぶりに@naopontanさんが来てくれてたので一緒にメタプログラミングRubyを読みました。
前回、第2章の途中まで読んでいて、2章のまとめを読んで3章へ。
ブロックの使い方、クロージャとスコープの話。
スコープゲートしっかり覚えた! スコープゴートを超える話も覚えた!

ダイナミックスコープとレキシカルスコープの違いについて@libkinjoさんの書いてくれたPerlでmyとlocalを使ったサンプルを見ながら読んでいました。


詳しいことはここにまとめられないかも。あとで別エントリにあげます。

下レイヤー

Okinawa.rbとは別で下(ネタ)レイヤーの勉強会が立ち上がりそうです。
モチベーションが保てて技術の向上にも繋がると思うのでぜひ頑張っていきたいと思います。
内容が下でも、それを改善していくプロセス、そこで得られた技術は他でも役に立つはずです。

Airbnbの件

ギークハウス沖縄をAirbnbに登録しています。

A House for GEEK! GeekHouse Okinawa

間貸ししている部屋を探せるようなサービスです。
登録してから数件、借りたいなーという申し込みがありました。
英語の申し込みがあった場合、翻訳や辞書をたよりながら読めはするのですが、気のきいた返事が書けなくて、Okinawa.rbの時に@RedHotMadGalilさんにヘルプを頼んで、書いてもらっています。
ほんとに、いつもありがとうございます。

&:symbolで暗黙的にto_procが呼ばれる

ハッシュのキーについて@_attonさんとコード書きながら話してる中で自分が
{:foo => 1, "bar" => 2}.keys.map(&:class)
というコードを書いて見せたところ、map(&:class)ってなんぞ?ってなりました。
メソッドの呼び出しで&:classって書くと、&がついてるので:classはプロックだよね、って感じになって暗黙的にSymbol#to_procが呼ばれるようです。
自分の理解を助けるためにソースコード書いてみました。

PHPだとarray_ほにゃららで処理するし、配列も連想配列も作るときarray()でかく。
RubyだとHashとArrayのクラスも分かれてるし、それぞれのメソッドがある。
「PHPでは配列も連想配列も一緒な感じだけど、Rubyって違うの?」っていう感じの疑問から話題が広がりました。

唐揚げ

@kanpe777さんから頂いた唐揚げを食べました。美味しかったです。レンジでカリッカリにするのがお勧めらしい。今度試す!(早くも頂いた唐揚げ1kgがなくなりそうです)

正規表現の否定戻り読み

(自称)初心者のみなさんが@ey0tさんと一緒に楽しいRubyを読んでいます。(いつもありがとうございます。)
そこで出てきた問題をどう解決するか?っていう感じでした。(すみません、問題についてちゃんと把握してないかも)
$ grep bar | grep -v foobarでよくね?みたいな話が出たり。
FacebookのOkinawa.rbのグループに皆さんの投稿がまとめられています。
http://www.facebook.com/groups/okinawarb/294866413919509/
@_attonさんが書いてた(?!>)っていう否定戻り読みの正規表現を知らなかったので超参考になりました。
正規表現だけでも勉強会開けそうな気がする。誰か教えてください。

自己紹介

出来たかな?もうちょっと掴める自己紹介がしたい。
今回は自己紹介をTwitterで実況してみました。
まぁまぁ良さそうな反応だったので次回もそんな感じでやろうと思ってます。

終わりに

毎回Okinawa.rbのMeetupが終わるたびに考えています。
みんな満足出来たかな? と。
とりあえず僕が楽しめた分は記事に残してみなさんと共有していきたいなと考えています。

2012年3月23日金曜日

LexuesAcademyを超えるその日まで



2012年の3月17日をもってLexuesAcademy第1期を終えました。
サポートして下さった関係者の皆さま、本当にありがとうございました。
少し遅れましたが、謝辞にかえてブログを書きます。

成果発表会で最後に淵上さんが
「沖縄型若年層向け」
「雇用されるための技術者研修ではなく」
「間違っても彼らを採用することがないように」
とおっしゃっていたのが印象的でした。

僕は内定を蹴り、雇用されるのと別の道を歩きはじめました。
決意表明では「自分のサービスで食えるのが目標」と言いましたが、未だに自分のサービスでお金を稼げていません。
僕がたくさんの人に使って貰えて「お金を出してもらえる」ようなサービスを作り上げることが出来てはじめて「僕はレキサスアカデミーの目的を達成した」と自信を持って言えるんだと思います。



発表を見にきて頂いた皆さんありがとうございます。
見つけた分だけ感想のブログやTogetterへのリンクを集めておきます。



他の受講生の皆さんも最終成果発表を終えて、LexuesAcademyで何をして、これから何をしたいか、考えたことをそれぞれブログにまとめています。

レキサスアカデミーの期間を通じて、最終成果発表を終えて、反省するところはもちろんあります。
しかし、僕たちがやってきたことを少し紹介させて頂くと

  • 40個以上ものアプリ/サービスをつくりだした
  • 20,000ダウンロードされるアプリを2つも輩出出来た
  • 作ったものから収益をあげることが出来た
  • 地元の人の問題を解決するサービスを開発し、それが認められ新聞にも掲載された
  • XHAGO3で自分たちの学んだことを沖縄の技術者の皆さまへ伝えた
  • 英語が出来ない・人前で話すのが苦手というコンプレックスを乗り越え英語プレゼンを堂々とこなした
  • 勉強して終わりじゃない、成果をマーケットに出してフィードバックを受け改善してきた

かなり成果を出してませんか? 僕も皆も自信をもっていいと思いますよ。

一番凄いのはここにいたるまでの失敗の連続を乗り越えて来た事ではないでしょうか。

「失敗から学ぶ」
僕たちレキサスアカデミー生は今後も色んなことに挑戦し、失敗し、そこから学ぶことをやめられないはずです。
だってレキサスアカデミーの期間はとっても楽しかったから!

僕はレキサスアカデミーが終わっても満足していません。
これからも積極的に挑戦し失敗し成長し「僕はLexuesAcademyの目的を達成した」と胸を張って言えるようなサービスを作っていきます。

LexuesAcademyの目的を超えるその日まで、今後ともよろしくお願いします。

2012年3月22日木曜日

はなちんのLexuesAcademy最終成果発表会でのアウトプット


2012年3月17日にレキサスアカデミー最終成果発表会がありました。

最終成果発表会でのアウトプットについてまとめておきます。


最終成果発表会の様子はUstreamで配信されております。僕はFavtileの発表と、僕の今後について決意表明を致しました。
以下の動画から録画された動画を視聴できます。
Favtileは30:31~33:41あたり、決意表明は50:15~52:55頃です。

LexesAcademy成果発表会〜後半〜



Favtileへの質問
質問に対する答えは適切だったでしょうか?
デリバリーの面で自分で気づいた事は以下の3つ。

  • 質問への答えで「えっと」「で」が結構出てる
  • 質問への答えで同じセンテンスを2回繰り返している
  • 姿勢ちょっと悪い

@pinkrootさん
いつもFavtile使って頂いてありがとうございます。

質問「どうやってこの素晴らしいデザインを考えたのですか?」

  • リストで表示するのは好きじゃない。タイル状で一覧出来るのが好き。
  • リストで表示せずタイル状に表示するのが好きで、デザイナーと協力し、可愛くなるように考えた

質問「デザインに対してマーケットからフィードバックはあったか?」

  • 背景画像を表示していたが、ユーザーからの声で、ユーザーは背景を見たいわけではないことに気づき取り除いた。
  • 上のバーがもっと大きかったが「大きすぎ」と言われて最低限必要な情報が収まるように小さくした。

他にも

  • トップページをぱっとみて使い方が分からない
  • ユーザー名を入れるのが面倒
  • アクセス解析を見るとユーザー名で間違って@を入れてしまっている

このようなフィードバックを頂き、最終成果発表会中にトップページを改修しました!


まだ直せていませんが「スクロールバーが出ない状態だと次のページ読み込めない」というバグ報告も受けています。
他にも、タイルの横幅固定してるせいで

  • Amazonのリンクがハミ出る
  • 動画が小さすぎてそのままみれなくね?
  • スライドも小さすぎね?
  • 余白なくてつまりすぎ
  • 情報が全部たいらだとどこから見ていいか分からない
  • カテゴライズしたい(タグとか)
  • 人のFavを購読するようにしてもいいのでは?
  • 有名人のFavを読ませるサービスへピボットしてみては
などなどのフィードバックも頂いております。ありがとうございます。

Favtileへのフィードバックがあったら是非@hanachin_までお願いします。

@yamanetoshiさん
質問「Webサービスの場合、マーケット、ユーザーとのやりとり・フィードバックはどのようにしましたか?」
Favtileの場合は

  • FavtileのページをTwitterにつぶやけるようになってる
  • Twitterにつぶやかれている情報を僕がチェック
  • Twitterでフィードバックを受けてTwitterでユーザーに返事をする

もともとTwitterに特化したサービスなので不満点・改善して欲しい点をユーザーがTwitterに直接書いてくれる事が多い、という点もありますね。

Favtileを今後どのようにするのか?という質問がプレゼン後にありました。
これについては現在

  • ピボットして別のサービスをはじめる
  • フィードバックは頂いてるのでもっとブラッシュアップ出来ないか
  • 誰か買ってくれる人いないか
  • Favtileからお金とれないか
    • 例えば広告を載せる
    • 機能を追加して有料版を提供する
など色々と考えております。


最終成果報告会での決意表明
レキサスアカデミーの前に週末ものづくり講座を受けていました。
実際に自分のものをマーケットに出してフィードバックを貰って改善する工程が楽しくなりました。
yasulabさんが講師をしてると聞いて参加せねばと思いすぐ山崎さんへ問い合わせ、レキサスアカデミーに参加することに。
もっと色んなものをマーケットに出して反応を貰ってもっといいものを作りたいという思いがあって参加した。
いいものを作るには技術以外にもデザイン・マーケティング、グローバルに使われるものを作るために「英語」が必要だと気づいた。
これからもレキアカで成長するためにやってきたこと、英語・プレゼン・マーケティング、全てを続けて行きたい。

今後も自分のやりたいことをやっていきたいと考えています。
プログラミングが好きなのでプログラマー・Webデザイナーの人とギークハウス沖縄で生活しながら、プログラミングの話をしたりサービスを作りながら共同生活を送っています。
毎週水曜日にギークハウス沖縄でOkinawa.rbを開いており、県内の技術者と学生ともっと交流を深めたい。そして皆さんと一緒に僕自身も成長していきたい。
最終的に自分の作ったサービスで食べて行けるようになること、それが今後の目標です。

2012年3月21日水曜日

はてなからお引っ越し

Bloggerからはてなダイアリーに移行したのが何ヶ月前だっけ?
Bloggerに戻って独自ドメインのblog.hanach.inで運用しようかと思います。
はてなは凄く好きなんですがアクセス解析等との連携を考えた場合Bloggerの方が楽かなと。
あとBloggerで記事書いてKloutスコアをあげたいというのもあります。
当面はBloggerでやって行きますが準備が整い次第WordPressに移行しようと思います。
理由は
  • サーバーを貸して頂けそうなのでWordPress動かすサーバーの維持費が必要なくなる
  • ブログ以外のPortfolioサイトもhanach.inで作りたいと考えており、全て自分でカスタマイズ出来る方が使い勝手が良さそう
  • WordPressの使い方を覚えておいた方が今後仕事する際に便利そう
などです。
記事はすべてはてなダイアリーの方から移行済みです。
それではみなさん、こちらでもよろしくお願いします。

2012年3月6日火曜日

僕はGumroadで猫のふんを売ります



2日連続、3度目。もう10うんこぐらい一人で片付けたのでこれはもうお金とってもいいかなと思って猫のふん写真の詰め合わせを売ります。


猫のふん詰め合わせ on Gumroad





2012年2月20日月曜日

WordPressにAmazonアフィリエイトの商品を貼る



経緯


ギークハウス沖縄のブログでアフィリエイトをやることにしました。


本を頂いたら記事を書き、読んだらレビュー記事を書き、その記事を読んだ方がAmazonで本を買ってくだされば、頂いた本から収益が得られ、そのお金でまた本が買えます。


新しい本が買えると本を寄贈してくださった方も喜んでくださるのではないでしょうか。





ギークハウス沖縄ではブログにfluxflex+WordPressを使用しています。


WordPressでAmazonアフィリエイトのリンクを貼れるようにするのが本記事の目的です。


参考にするサイト


ず's » wordpress用Amazonアフィリエイト用マクロを書いてみた


こちらの記事を参考に進めていきます。


アフィリエイトのマクロを追加する


WordPressのバージョンは3.3.1です。


1.Macro Expanderをインストールする



  1. WordPressの管理画面に入り、左側サイドバーのプラグインから新規追加を選びます。

  2. キーワードの入力欄に「Macro Expander」と入力

  3. プラグインの検索ボタンを押す


f:id:h6n:20120220060138j:image


Macro Expanderが出てきたら、いますぐインストールを押す


f:id:h6n:20120220060139j:image


インストールが完了した、というメッセージを確認する。


f:id:h6n:20120220060140j:image


2.Amazonのリンクを作成するマクロを登録する



  1. 左側サイドバーの外観からテーマ編集を選びます。

  2. 右側のテンプレートの一覧の中から「テーマのための関数」を選ぶ

  3. 「< ?php」の後ろに以下の内容をコピペし、amazon_tracking_idの中の文字を自分のトラッキングIDに変更

  4. ファイルを更新ボタンを押す。


f:id:h6n:20120220060141j:image


確認記事を書く

記事の中で



[[amazon2][427406767X][4873113679]]


のような感じで、amazon2の後ろにasinを角括弧でくくって並べていくだけ。


f:id:h6n:20120220060142j:image


プレビューするとこんな感じ。ちゃんと動いてるっぽい。


f:id:h6n:20120220062329j:image


まとめ


これでAmazonアフィリエイト貼り放題。


ぜひ皆さんもギークハウス沖縄から本を購入してください!





2012年2月19日日曜日

embed.lyを利用してサイトにURLのプレビュー機能を埋め込む方法



#Favtileにembed.lyの埋め込み機能をつけました。


これによりリンク先の動画・写真・OpenGraphで設定されたサイトのアイコン等を埋め込み表示出来るようになりました。


f:id:h6n:20120220000031p:image:w640


今回はembed.lyを利用する過程を紹介します。


embed.lyって何が出来るの?


f:id:h6n:20120220000030p:image:w360


embed.lyを使うと、Webサイトの中に他のサイトの動画や写真やWebサイトを埋め込み表示することが出来ます。


Twitter向けの写真サイト(yfrogやTwitpic)やUstreamやYouTubeはもちろん、InstagramやAmazonなど、218ものコンテンツサイトの埋め込み表示に対応しています。


有料プラン以外に、無料プランがあります。1万URLまで無料で埋め込み表示できます。


登録方法


無料プランへの申し込み方法を説明します。


1.embed.lyの登録画面へ行く

Embedly | Pricing Plans


今回はFreeプランなんで、Freeプランの下のGet this Planをクリック。


f:id:h6n:20120220012134j:image


2.登録画面埋める

まず、ユーザー名、パスワード、メールアドレス、First name、Lastネーム、Organizationの項目を入力しましょう。*1


次にサービスの規約に同意するチェックボックスにチェックを入れます。


最後にSign Up!ボタンをクリックすると完了です。


f:id:h6n:20120220012135j:image


フォーム入力が完了すると次のような画面が出るので、リダイレクトされて別の画面へ切り替わるのを待ちます。


f:id:h6n:20120220012136j:image


この画面が出ると、登録は完了です。


f:id:h6n:20120220012137j:image


embed.lyをウェブサイトで使う前に


embed.lyをウェブサイトで使うためには「このURLのウェブサイトから呼び出されるのを許可する」設定が必要です。


1.設定画面へ行く

Manage your Referrersの欄のManageボタンをクリック


f:id:h6n:20120220024531j:image


2.ウェブサイトのURLを設定に追加する

Add Referrerの入力欄に、WebサイトのURLをhttp://抜きで入力し、Addボタンをクリック。


このとき、「http://favtile.com/hanachin_」など、「http://favtile.com/」のうしろに何かついたURLでもアクセス出来るようにしたい場合は、*をつけて「favtile.com/*」のような感じで入力する。


あと、開発環境がlocalhostのサーバーに上がってるときは




  • localhost/*

  • localhost:3000/*


等々を追加しておくと便利です。


f:id:h6n:20120220024532j:image


追加が完了するとReferrersに出てきます。


f:id:h6n:20120220024533j:image


3.URLが設定出来てるか確認する

自分のウェブサイトで使えるか確認してみましょう。


使いたいURL「http://favtile.com/hanachin_」をTest Urlボタンの左の入力欄に入れ、Test Urlボタンをクリックします。


f:id:h6n:20120220024534j:image


そのURLで使える場合は緑色で「Matched」と出ます。


f:id:h6n:20120220024535j:image


赤で「No match」と出たら、そのURLでは使えません。確認してください。


f:id:h6n:20120220033745j:image


embed.lyを使う


ではembed.lyを実際どうやって使うのかのサンプルです。


全容


<!DOCTYPE html>
<html>
<head>
<title>embed.ly!</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script src="http://scripts.embed.ly/jquery.embedly.min.js"></script>
<script type="text/javascript">
$(function(){
$("a").embedly({
// ここはそれぞれのAPIキーに置き換えてください
key:"4c0281125b1211e188dc4040d3dc5c07"
});
});
</script>
</head>
<body>
<header>
<h1>embed.ly!</h1>
</header>
<article>
<h1>Favtile</h1>
<a href="http://favtile.com/">Favtile</a>
</article>
<article>
<h1>node.js + socket.io + Arduinoでイイネ! クローン</h1>
<a href="http://www.youtube.com/watch?v=WsjvgkjYWS4">youtube</a>
</article>
</body>
</html>


1.必要なファイルをscriptタグで指定

jQueryと、embed.lyのjQueryプラグインを読み込みます。



<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script src="http://scripts.embed.ly/jquery.embedly.min.js"></script>


2.embed.lyでリンク先を埋め込む

「"a"」など、埋め込みたいリンクをjQueryで指定し、「$("a").embedly({key: "key"})」のような感じでembed.lyのプラグインを呼び出すだけで、リンクを埋め込めます。



<script type="text/javascript">
$(function(){
$("a").embedly({
// ここはそれぞれのAPIキーに置き換えてください
key:"4c0281125b1211e188dc4040d3dc5c07"
});
});
</script>


keyに指定してある文字はembed.lyのYour API Keyに表示されている文字で置き換えてください。


f:id:h6n:20120220040409j:image


3.確認

確認してみましょう。上手く行けばこのような感じで、サイトの画像や動画が埋め込まれて表示されます。


f:id:h6n:20120220040410j:image


うまくいかなかったらこんな感じでただのリンクのまま、ですね。


f:id:h6n:20120220040411j:image


まとめ


embed.lyを使うと結構簡単な手順で色んなコンテンツを埋め込めるのでお勧めです。


皆さんも是非使ってみてはいかがでしょうか?




*1:キャプチャで「ギークハウス沖縄」って入れてるけど通らなかったので別のに変更しました。





Favtileのユーザーの背景表示をやめました。



#Favtile

前々からフィードバックの意見を貰っていました。



  • Favtileでユーザーが見たいのは背景ではない

  • 背景があると情報過多

一方で背景を表示すると



  • ユーザーの切り替わりが分かりやすい

僕がFavtileに背景画像を設定していた理由は、そのユーザーが設定した背景なのでそのユーザーの雰囲気が出る(かな?)と思っていたからです。

Twitterで背景を設定する理由


Twitterの背景には何の画像を設定していますか?

僕の場合、前までλの画像を敷き詰めていました。

理由は関数型言語、無名関数が好きなんだよアピールのためです。




僕は専用のクライアントでしかTwitterしません。Twitterの背景を設定しても、自分で自分の背景を見ることはほぼないです。

なのでいくらチカチカする画像でも、個性を主張する画像でも、どんな普通な画像でも、気になりません。(見ないから)

もしも僕がケータイでしかTwitterを使わない場合も設定しないと思います。ケータイでは背景を表示する余白のスペースがあるとは思えないからです。




しかし、TwitterのWebサイトでTwitterをやっている人は常に自分が設定した背景画像を目にする事になると思います。

タイムラインを見るときも、自分のお気に入りを見るときも、返信をチェックするときも、サイドバーで他人のプロフィールを表示するときも、常に自分の背景を目にするはずです。

これはパソコンのデスクトップでも同じですよね。

色んな作業をしていても見えるのは自分が設定した背景です。




Twitterのサイトで背景が変わるタイミングはいつでしょう?

別のユーザーのページへ移動した時です。

いつも見えてる背景が変わると別のユーザーのページなんだと気づきやすいですね。

Favtileに背景を設定する理由がない


TwitterのWebの画面と同じように、自分のFavを眺めるなら、自分の背景が見えるのは自然です。

Favtileでは他の人のツイートもだらだらと眺めてもらいたいと思っています。

もしも自分がツイートを眺めるなら、自分が設定した画像がみたいのではないか?

ツイートを眺めるときの背景は、普段のTwitterの背景と同じでいいのか?

他人のツイートを眺めるとき、他の人の背景を見たい訳ではないのでは?

と色々出てきて、背景設定する必要がない事に納得いきました。

まとめ


というわけで、僕の中での結論として

もしも自分がツイートを眺めるなら、自分が設定した画像がみたいのではないか?


という風にまとまって、背景表示をやめました。

大事なのは考えること


背景画像については前々からあったのですが、自分の中での結論が出ていませんでした。

んで色々と突っ込まれても「うーん」みたいな感じではっきりせず。

つけた理由も「その人の雰囲気が出そう」って感じでやっぱりちゃんとした理由なし。(そもそも背景だけでその人の雰囲気が出るのか、その人の雰囲気って必要なのか、とか色々ありますが)

背景についてようやくちゃんと考えてみると「背景画像って作業中にでも眺めたい自分の好きな画像設定してるなー」と気づいて納得して消せました。

レキサスアカデミーで突っ込みいっぱい受けてはじめて「俺あんまり考えてねーなー」と思えた一日でした。

もうちょっと考えて生きていきたい。




2012年2月16日木曜日

生まれて初めてたんぽぽを食べました。



僕が生まれてきてから今まで一度もたんぽぽを食べた事はない。


たんぽぽ茶は飲んだことがあるし、たんぽぽのわたを吹き飛ばすことはあっても、たんぽぽを食べた事は無かった。


人生いつ終わるか分からないのに今たんぽぽを食べないでいつたんぽぽを食べるのか。


たんぽぽの食わず嫌いではないのか。


公園に行けばそこにはたんぽぽがある。いつでもたんぽぽは食べれる。24時間好きなときにたんぽぽ食べれる。


というわけで漫湖公園でたんぽぽを摘んできました。


傷がついてる葉、色が変な葉をのけて水洗い。


サラダでも食べれるらしいのですが、たんぽぽビギナーなのでスパゲッティに混ぜます。


f:id:h6n:20120215181336j:image:w360


鶏肉に塩こしょうで味付けしてたんぽぽと一緒にオリーブオイルで炒め、ゆであがったスパゲッティを加えケチャップを絡める。


f:id:h6n:20120216154430j:image:w360


おいしそう。実際おいしかった。


クリーム系のソースでも食べてみたけどちょっと葉っぱが苦かった。


甘いケチャップとかと一緒だとかなり食べやすい。普通の野菜。見た目も美味しそうです。


僕はたんぽぽを食べることによって、たんぽぽをただの花でなく、食材として見れるようになりました。


たとえ花が咲いてなくても、たんぽぽ見ると「美味しそう」と思える。幸せだ!


これからもたんぽぽに対してもっと仕掛けていきたい。





2012年2月15日水曜日

たべものめも





Arduino + サーボモータ。ボタンを押すと左右に回転!



ボタンを押すとサーボモーターがある方向へ回転、ある程度動くと反対側に動く。


というものを作ってみました。


サーボモータの動かし方を覚えたくて。


なんかすごく楽に行けちゃいましたね。




#include <Servo.h>

#define BUTTON 7

Servo myservo; // create servo object to control a servo
int val = 0;
int direct = 1;
int angle = 90;

void setup()
{
myservo.attach(9); // attaches the servo on pin 9 to the servo object
pinMode(BUTTON, INPUT);
}
// scale it to use it with the servo (value between 0 and 180)
void loop() {
val = digitalRead(BUTTON);

if (angle <= 0) {
direct = 1;
} else if (angle >= 180) {
direct = -1;
}

if (val == HIGH) {
angle = angle + direct;
}

myservo.write(angle);
delay(10);
}





2012年2月14日火曜日

MAMPのPHPでpeclを使う(Mac OSX Lion編)



今日も同居人のデバッグを手伝っています。


PECLでoauthのプラグイン使いたいらしい。


pecl install oauthやるとエラーが出るそうで。


とりあえず以下のブログ参考にしつつやるとpecl install oauth出来た。


MAMP + OAuth + Lion





Rails 3.2 + omniauthでハマった。



Rails 3.2 + omniauthでTwitter連携アプリを作ろうと思いたち、omniauth-twitterを使おうとしてハマったのでメモ。


アクセスすると次のようなエラー



NoMethodError
undefined method `include?' for nil:NilClass

Gemfileでomniauthにgitのリポジトリを設定したら直った。



gem 'omniauth', :git => 'git://github.com/intridea/omniauth.git'





2012年2月13日月曜日

Backbone.jsのTodoアプリを読む。



クライアントサイドMVCフレームワークをもっと勉強したい。


今僕は#Favtileというサービスを作っています。


Twitterのお気に入り機能のためのツールです。


そこではクライアントサイド・サーバーサイド共にCoffeeScriptで書いており、Spine.jsを使っています。


Spine.jsを使いはじめた理由? CoffeeScriptが好きだからです。Spine.jsはCoffeeScriptで書かれていますから。


でも他にもJavaScriptのMVCフレームワークはいっぱいあります。


有名だと思うのでBackbone.jsをやります。


有名だと情報が多いので無名のフレームワークよりも勉強しやすいという考えです。


Backbone.jsのサンプルのTodoアプリを読みながらドキュメントを引いて調べていきます。


Backbone Demo: Todos


Todo Model


Todoモデルはtext、order、doneの3つの属性を持つようです。


属性のデフォルト値がある場合はdefaultsに指定する。


toggleはTodoが完了した/してないを切り替えるメソッドですね。


textの属性持つとコメントには書いてるけどModelの中には「text」が見当たらない。そんなものか。



// Our basic **Todo** model has `text`, `order`, and `done` attributes.
window.Todo = Backbone.Model.extend({

// Default attributes for a todo item.
defaults: function() {
return {
done: false,
order: Todos.nextOrder()
};
},

// Toggle the `done` state of this todo item.
toggle: function() {
this.save({done: !this.get("done")});
}


Backbone.jsのドキュメントを読みながらもっと詳しく読む。


defaults

Modelをインスタンス化するときに属性の値が指定されてなかった時はデフォルト値としてdefaultsの内容が使われる。


ここでdefaultsに関数を指定するとその関数の返り値をデフォルト値として使う、と。


デフォルト値が毎回変わるような場合に関数を指定するといい感じなのかなぁ。


save

Modelのsaveメソッドは、内部でBackbone.syncを使っていて、Backbone.syncではRESTでサーバーにアクセスする。


LocalStorage adapterを使ってるとここが置き換わるかんじか。


saveメソッドに変更したい属性達を{}でまとめて渡すか、save("key", "value")のような感じで呼び出して使う、と。


validateメソッドを実装してvalidateとおらないと保存出来ないようにすることも出来るみたい。


isNewっていうので新規作成されたものか判定してるのかな? 新しく作成されるときはcreateがよばれ、更新の時はupdateが呼ばれるよう。


saveには{success:成功時の処理, error:失敗時の処理}のような感じで成功時・失敗時のコールバック関数を渡せるらしい。


Todo Collection


modelプロパティにCollectionが持ってるモデルのクラスを指定する、Collection.addとかcreateするときにmodelを使うのかなぁ。


Storeっていうのはローカルストレージに読み書きするためのクラスかな?


collectionの中からdoneなやつだけ取るのがdoneメソッドで、remainingはコレクションからdoneなやつを除いたもの、か。読みやすい。


nextOrderでTodoの順番を作ってる。


comparetorプロパティを定義するとcollectionを並べるときにその値が使われるようです。


今のだと追加した順に並ぶようになってますね。



// Todo Collection
// ---------------

// The collection of todos is backed by *localStorage* instead of a remote
// server.
window.TodoList = Backbone.Collection.extend({

// Reference to this collection's model.
model: Todo,

// Save all of the todo items under the `"todos"` namespace.
localStorage: new Store("todos"),

// Filter down the list of all todo items that are finished.
done: function() {
return this.filter(function(todo){ return todo.get('done'); });
},

// Filter down the list to only todo items that are still not finished.
remaining: function() {
return this.without.apply(this, this.done());
},

// We keep the Todos in sequential order, despite being saved by unordered
// GUID in the database. This generates the next order number for new items.
nextOrder: function() {
if (!this.length) return 1;
return this.last().get('order') + 1;
},

// Todos are sorted by their original insertion order.
comparator: function(todo) {
return todo.get('order');
}

});

// Create our global collection of **Todos**.
window.Todos = new TodoList;


TodoView


SpineでいうとControllerにあたる部分。


Backbone.Viewを継承してる。


はtagName、className、id、attributesを指定することで表示用のエレメントが作られ、elプロパティに保持されるようで。


_.template便利だなぁ。クライアントサイドのテンプレートっていっぱいあるのね…


eventsっていうプロパティに{"eventName selector":"methodName"}の形式で書くっぽい。


内部的にはjQueryのdelegateが呼ばれてイベントが設定される。(設定するときには名前空間もくっつけてるみたい)


clickしたときはtoggleDoneがよばれて、その中でmodelのtoggleが呼ばれてdoneの値が更新されて、changeイベントが発行されてレンダリングし直されるのかな。


dbclickではeditが呼ばれて、その中で編集中の見た目になるようクラスを追加して、入力欄にフォーカス当ててるみたい。


ではフォーカスはずれた時はどうなるかというと


renderの中でsetTextをよんでいて、その中で、フォーカスが外れたとき(blur)はcloseを呼ぶように設定してる。


closeの中ではモデルの値を保存したあと、編集中の見た目を取り除いてる感じ。


enterが押された時にもcloseは呼ばれるみたいだ。なるほど。


initializeが初期化する時によばれるものかな?




  • モデルが変更されたらレンダリングしなおす

  • モデルが捨てられたら要素を取り除く


みたいな設定をしてるみたい。



window.TodoView = Backbone.View.extend({

//... is a list tag.
tagName: "li",

// Cache the template function for a single item.
template: _.template($('#item-template').html()),

// The DOM events specific to an item.
events: {
"click .check" : "toggleDone",
"dblclick div.todo-text" : "edit",
"click span.todo-destroy" : "clear",
"keypress .todo-input" : "updateOnEnter"
},

// The TodoView listens for changes to its model, re-rendering.
initialize: function() {
this.model.bind('change', this.render, this);
this.model.bind('destroy', this.remove, this);
},

// Re-render the contents of the todo item.
render: function() {
$(this.el).html(this.template(this.model.toJSON()));
this.setText();
return this;
},

// To avoid XSS (not that it would be harmful in this particular app),
// we use `jQuery.text` to set the contents of the todo item.
setText: function() {
var text = this.model.get('text');
this.$('.todo-text').text(text);
this.input = this.$('.todo-input');
this.input.bind('blur', _.bind(this.close, this)).val(text);
},

// Toggle the `"done"` state of the model.
toggleDone: function() {
this.model.toggle();
},

// Switch this view into `"editing"` mode, displaying the input field.
edit: function() {
$(this.el).addClass("editing");
this.input.focus();
},

// Close the `"editing"` mode, saving changes to the todo.
close: function() {
this.model.save({text: this.input.val()});
$(this.el).removeClass("editing");
},

// If you hit `enter`, we're through editing the item.
updateOnEnter: function(e) {
if (e.keyCode == 13) this.close();
},

// Remove this view from the DOM.
remove: function() {
$(this.el).remove();
},

// Remove the item, destroy the model.
clear: function() {
this.model.destroy();
}

});


AppView


なるほど。既にある要素をelにバインドする事も出来る、と。


addとかresetとかそこらへんのイベントはFAQの中にCatalog of Eventsで載ってる。



// The Application
// ---------------

// Our overall **AppView** is the top-level piece of UI.
window.AppView = Backbone.View.extend({

// Instead of generating a new element, bind to the existing skeleton of
// the App already present in the HTML.
el: $("#todoapp"),

// Our template for the line of statistics at the bottom of the app.
statsTemplate: _.template($('#stats-template').html()),

// Delegated events for creating new items, and clearing completed ones.
events: {
"keypress #new-todo": "createOnEnter",
"keyup #new-todo": "showTooltip",
"click .todo-clear a": "clearCompleted"
},

// At initialization we bind to the relevant events on the `Todos`
// collection, when items are added or changed. Kick things off by
// loading any preexisting todos that might be saved in *localStorage*.
initialize: function() {
this.input = this.$("#new-todo");

Todos.bind('add', this.addOne, this);
Todos.bind('reset', this.addAll, this);
Todos.bind('all', this.render, this);

Todos.fetch();
},

// Re-rendering the App just means refreshing the statistics -- the rest
// of the app doesn't change.
render: function() {
this.$('#todo-stats').html(this.statsTemplate({
total: Todos.length,
done: Todos.done().length,
remaining: Todos.remaining().length
}));
},

// Add a single todo item to the list by creating a view for it, and
// appending its element to the `<ul>`.
addOne: function(todo) {
var view = new TodoView({model: todo});
$("#todo-list").append(view.render().el);
},

// Add all items in the **Todos** collection at once.
addAll: function() {
Todos.each(this.addOne);
},

// If you hit return in the main input field, and there is text to save,
// create new **Todo** model persisting it to *localStorage*.
createOnEnter: function(e) {
var text = this.input.val();
if (!text || e.keyCode != 13) return;
Todos.create({text: text});
this.input.val('');
},

// Clear all done todo items, destroying their models.
clearCompleted: function() {
_.each(Todos.done(), function(todo){ todo.destroy(); });
return false;
},

// Lazily show the tooltip that tells you to press `enter` to save
// a new todo item, after one second.
showTooltip: function(e) {
var tooltip = this.$(".ui-tooltip-top");
var val = this.input.val();
tooltip.fadeOut();
if (this.tooltipTimeout) clearTimeout(this.tooltipTimeout);
if (val == '' || val == this.input.attr('placeholder')) return;
var show = function(){ tooltip.show().fadeIn(); };
this.tooltipTimeout = _.delay(show, 1000);
}

});

// Finally, we kick things off by creating the **App**.
window.App = new AppView;

});


まとめ


だらだらと書いた割に内容のない文章になってしまった。


実際に自分で何か作ってみる方が理解が進むかも。(あるいはBackbone.jsのソースを読むとか)





2012年2月6日月曜日

ローカルにあるgemファイルのインストール



[ruby] ローカルにあるgemファイルをインストールする - プログラム番長のヲボエガキ


ここを参考にして出来た!


gemの-lオプションを使う。



$ gem install -l foo.gem


$ gem instlal -hして確認。



-l, --local Restrict operations to the LOCAL domain




2012年1月28日土曜日

Twitterのお気に入りをもっと使いやすくするツール・Favtileをリリースしました。



Favtile


f:id:h6n:20120129043756p:image:w360


Twitterのお気に入りをタイル状に美しく表示、そこから人のお気に入りを見たり、お気に入りを追加出来る、Twitterのお気に入り機能に最適化したツールです。


特徴としては




  • タイル状に表示することで情報量を多く、かつ美しく表示します。

  • ある人のお気に入りから他の人のお気に入りへワンクリックで飛べます。


実際の表示例: masasonさんのお気に入り


http://favtile.com/masason


またハッシュタグの検索結果を表示することも可能です。


http://favtile.com/#gigazine


ソースコードはGitHubで公開しています。


https://github.com/hanachin/favtile


サーバーサイド・クライアントサイドともにCoffeeScriptで書きました。


クライアントサイドはSpine.jsとjQuery、サーバーサイドはzappaというフレームワークを使用しています。


内部の実装について下北沢オープンソースカフェさんで開かれた勉強会で語った動画があります。


http://www.ustream.tv/recorded/20015536





2012年1月20日金曜日

AndroidアプリHesoをリリースしました



「へそ」をたくさん出せるキモ面白いへそだしアプリ「Heso」をリリースしました。


Heso - Google Play の Android アプリ


f:id:h6n:20120121010530j:image


ただのへそなのにいっぱい出るとなんだか不愉快。


タップするとへそが出るへそだしアプリです。


f:id:h6n:20120121010529j:image


へそを出すのが恥ずかしいあなた、hesoを使っていっぱいへそを出してみませんか?


Twitterでの反応


ありがとうございます!










レビュー依頼中


applikoさんにレビュー依頼を投稿しました!


おすすめ!アンドロイドアプリ情報appliko(アプリコ)


レビューはいつでも待っているので是非よろしくお願いします。





2012年1月3日火曜日

2014: Surrounding Area



今日も簡単そうな問題から。


2014: Surrounding Area


以下クソース。


実装簡単だと思ってたら結構手こずった。コーディング力うんこ…。



#include <stdio.h>

#define MAX_WH 50
#define BLACK 1
#define WHITE 2

char map[MAX_WH][MAX_WH + 1];
char flag[MAX_WH][MAX_WH + 1];

int w, h;

void printFlag() {
int i, j;
for (i = 0; i < w; i++) {
for (j = 0; j < h; j++) printf("%d", flag[j][i]);
puts("");
}
puts("****************");
}

int count(int n) {
int i, j, cnt = 0;
for (i = 0; i < w; i++) {
for (j = 0; j < h; j++) {
if (flag[j][i] == n) cnt++;
}
}
return cnt;
}

void reset_flag() {
int i, j;
for (i = 0; i < w; i++) {
for (j = 0; j < h; j++) {
flag[j][i] = 0;
}
}
}

int rinsetsu(int mask, int x, int y) {
char c = mask == BLACK ? 'B' : 'W';
if (0 <= x + 1 && x + 1 < w && map[y][x + 1] == c) return 1;
if (0 <= x - 1 && x - 1 < w && map[y][x - 1] == c) return 1;
if (0 <= y + 1 && y + 1 < h && map[y + 1][x] == c) return 1;
if (0 <= y - 1 && y - 1 < h && map[y - 1][x] == c) return 1;
return 0;
}

int kakudai_rinsetsu(int mask, int x, int y) {
if (0 <= x + 1 && x + 1 < w && flag[y][x + 1] & mask) return 1;
if (0 <= x - 1 && x - 1 < w && flag[y][x - 1] & mask) return 1;
if (0 <= y + 1 && y + 1 < h && flag[y + 1][x] & mask) return 1;
if (0 <= y - 1 && y - 1 < h && flag[y - 1][x] & mask) return 1;
return 0;
}

void fill(int mask, int x, int y) {
if (0 <= x && x < w && 0 <= y && y < h) {
int c = map[y][x];
if (c == 'B' || c == 'W') return;
if (flag[y][x] & mask) return;

if (rinsetsu(mask, x, y) || kakudai_rinsetsu(mask, x, y)) {
flag[y][x] |= mask;
fill(mask, x + 1, y);
fill(mask, x, y + 1);
fill(mask, x - 1, y);
fill(mask, x, y - 1);
}
}
}

void solve() {
int i, j;

for (i = 0; i < w; i++) {
for (j = 0; j < h; j++) {
if (map[j][i] == 'B' || map[j][i] == 'W') {
int mask = map[j][i] == 'B' ? BLACK : WHITE;
fill(mask, i + 1, j);
fill(mask, i, j + 1);
fill(mask, i - 1, j);
fill(mask, i, j - 1);
}
}
}

printf("%d %d\n", count(BLACK), count(WHITE));
}

int main() {
int i;
while (1) {
scanf("%d %d\n", &w, &h);
if (!(w | h)) break;

for (i = 0; i < h; i++) {
scanf("%s\n", map[i]);
}
reset_flag();

solve();
}
return 0;
}





2012年1月2日月曜日

久々にAOJをやった。



今日やったことまとめ。


久々にAizu Online Judgeをやった。


Problem setのVolume 0で解いてないやつを。


最後にやったのは2011-05-01なので、おおよそ8ヶ月ぶり。


くソースアップしときます。


0068: Enclose Pins with a Rubber Band


解法分かんなくてググて出たページで凸包というのを初めて知るなど…。


その単語だけ見てアルゴリズム書いてるページへ。


点集合の凸包-数学アルゴリズム演習ノート-


deq notesさんのベクトルのページ等を見てなんとか解けた。


超時間かかった。



#include <cstdio>
#include <complex>

using namespace std;

#define MAX_N 100

typedef complex<double> P;
#define EPS (1e-10)
#define EQ(a,b) (abs((a) - (b)) < EPS)
#define EQV(a,b) (EQ((a).real(), (b).real()) && EQ((a).imag(), (b).imag()))

double cross(P a, P b) {
return (a.real() * b.imag() - a.imag() * b.real());
}

int side(P start, P end, P point) {
double arg = cross(end - start, point - start);
if (arg > 0) return 1; // left
if (arg < 0) return -1; // right
return 0; // center
}

int n;
P p[MAX_N];

int next_vertex(int start_index) {
for (int i = 0; i < n; ++i) {
if (start_index == i) continue;
bool right = false;
for (int j = 0; j < n; ++j) {
if (i == j) continue;
if (side(p[start_index], p[i], p[j]) == -1) right = true;
}
if (!right) return i;
}
return start_index;
}

int main() {
while (1) {
scanf("%d\n", &n);
if (!n) break;

for (int i = 0; i < n; ++i) {
double x, y;
scanf("%lf,%lf\n", &x, &y);
p[i] = P(x, y);
}

int pm = 0;
for (int i = 0; i < n; ++i) {
if (p[pm].real() > p[i].real()) pm = i;
}

int start = pm;
int current = next_vertex(start);
int count = 1;

while (start != current) {
current = next_vertex(current);
count++;
}
printf("%d\n", n - count);
}
return 0;
}


0069 Drawing Lots II


左右の横線の有無を確認するのを忘れてWAいっぱい出しちゃった。



#include <stdio.h>

int n, m, hit, d;
char dan[30][11];

int amida() {
int i;
int cur = m;
for (i = 0; i < d; ++i) {
// right
if (cur < n && dan[i][cur - 1] == '1') {
cur = cur + 1;
}
// left
else if (cur > 1 && dan[i][cur - 2] == '1') {
cur = cur - 1;
}
}
return cur == hit;
}


void solve() {
int i, j;
if (amida()) {
puts("0");
return;
}

for (i = 0; i < d; i++) {
for (j = 0; j < n - 1; j++) {
if (dan[i][j] == '0') {
if (j > 0 && dan[i][j-1] == '1') continue;
if (j < n - 2 && dan[i][j+1] == '1') continue;
dan[i][j] = '1';
if (amida()) {
printf("%d %d\n", i+1, j+1);
return;
}
dan[i][j] = '0';
}
}
}

puts("1");
}

int main() {
int i;
while (1) {
scanf("%d\n", &n);
if (!n) break;

scanf("%d\n%d\n%d\n", &m, &hit, &d);
for (i = 0; i < d; i++) {
scanf("%s\n", dan[i]);
}
solve();
}
return 0;
}


0078: Magic Square


魔方陣の問題。


return 0を忘れてRE



マス目に入る各数字は右詰4桁で出力してください。


を見落としPresentation errorでした。



#include <stdio.h>

#define MAX_N 15

int sq[MAX_N][MAX_N];
int n;

void reset() {
int i, j;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
sq[i][j] = -1;
}
}
}

void fill(int count, int x, int y) {
if (count > n * n) return;
if (x < 0) x = n - 1;
if (x >= n) x = 0;
if (y >= n) y = 0;
if (sq[x][y] != -1) {
fill(count, x - 1, y + 1);
} else {
sq[x][y] = count;
fill(count + 1, x + 1, y + 1);
}
}

void printSq() {
int i, j;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
printf(j ? "%4d" : "%4d", sq[j][i]);
}
puts("");
}
}

void solve() {
int center = n / 2;
reset();
sq[center][center + 1] = 1;
fill(2, center + 1, center + 2);
printSq();
}

int main() {
while (1) {
scanf("%d\n", &n);
if (!n) break;

solve();
}
return 0;
}


まとめ


やっぱり数学的な知識がないと辛いかも。


皆どうやって覚えてるんだろう。


あと解法分かんないときどしたらいい? 解法ググってでも解いたらいい?


僕頭固いからかなー。


とりえあずこんな感じで毎日解いていけるといいな。


次やるときは問題文をしっかり読んで重要なとこ見落とさないようにする。


目指せ一発Accept!





2012年1月1日日曜日

今年やりたいこと、やめたいこと



このリストの中の項目に優先度を付け、抽象的な項目を具体化し、目的をはっきりさせ、目標を立て実行していけば必ず実現出来るはずです。


やりたいことリスト




  • デート


    • 美味しい食事を食べさせたい

    • いい景色を見る



  • 旅行


    • こないだパスポート切れた。1回しか使わなかった。もったいない。

    • 円高のうちに海外行きたい。



  • 書き初め


    • 1月中にやりたい



  • 海で泳ぐ


    • 太ってたので裸になりたくなかったけど今なら多分大丈夫



  • カラオケ


    • 歌える曲が少ないので何か歌えるように頑張ろう

    • カラオケいくのをやめるという手もある(?



  • 料理する


    • 揚げ物作れるようになりたい



  • 洗濯をマスターする

  • 食べる


    • パプリカの牛すじカレーを食べる

    • LAMPのカレーかクスクス食べる

    • rukindのコーヒーを飲む、ワッフル食べる

    • 美ら豆コーヒー飲む

    • 海山味で刺身定食食べる

    • 東方美人飲む

    • 琉家のラーメン食べる

    • 阿里で鶏粥食べる

    • 勧められたお店に行く

    • 要するに食べ物屋巡る



  • ギークハウス住む

  • 家庭菜園


    • 野菜苦手なので食べるようにしたい

    • 多分何かを育てるのは小学校以来なので新しい経験が出来るはず

    • 野菜じゃなくてハーブとかでもいいかも

    • 成長記録撮りたい



  • 痩せる


    • 3ヶ月で15kg痩せてその後緩やかにリバウンドしている

    • 既にデブっぽい体型に戻っているのを戻す

    • とりあえず前に3ヶ月で15kg痩せたときのを参考にギークハウス住んでるうちに痩せる

    • 体重計(デジタル表示)買う



  • クレジットカード早く届いてください


    • 12月の頭あたりに申し込んだんだけど中々来ない。審査落ちてたらどうしよ。

    • 届いたらASAPでAndroidマーケット登録する



  • 電子書籍版がある書籍は電子書籍版を買う

  • 日本語で書かれた電子書籍本を購入する

  • なるべく英語の電子書籍本を購入する

  • なんらかの英語検定的なものを受けるため勉強する

  • 自炊する


    • スペースとってしまうし読みたいとき読めない本は存在価値が低い(多分)

    • 裁断してスキャンしてOCRかけて検索可能なPDFにしたい



  • Androidマーケットにうんこでもいいのでアプリを投稿する

  • GitHubのリポジトリを増やす


    • うんコードでもいいじゃない。人間だもの。



  • CoffeeScriptでLispのようなものを書く

  • 勉強会で何か発表する

  • 本を読む

  • プログラミングコンテストに取り組む


    • AOJ

    • TopCoder



  • Webサービスを公開する

  • 電子工作


    • せっかくArduino買ったのにいかせてない



  • もうちょっと人と関わる


    • ただしなるべくめんどくさくない感じで…



  • ブログを書く


    • もっと良質な記事を出す



  • 関数型言語

  • 女装


やめたいことリスト




  • ショートコーディング辞める


    • トップに勝てないから。



  • XSS探さない


    • 僕が探さなくても誰かが探す。



  • 飲み過ぎない


    • 昨年はケータイ紛失(みつかりました)、道ばたで寝る、後輩に絡むなど



  • 飲み物を自販機で買う

  • リンスをめんどくさがってやらない

  • 人に会わないとき髭剃らない、風呂はいらない

  • 暴飲暴食

  • 二度寝

  • 休日家に居る


    • これ気をつける。




まとめ


以上が2012年はじめに思いついたやりたいこと、やめたいことです。


最初に



このリストの中の項目に優先度を付け、抽象的な項目を具体化し、目的をはっきりさせ、目標を立て実行していけば必ず実現出来るはずです。


と書きました。


しかし、何かやろうとするとその過程で必ず何か失敗します。


例えば昨年は一昨年やらなかったことをやりました。


成功したことがいくつかあります。




  • 勉強会で発表

  • 9leapに応募して賞を頂く

  • GitHubにうんコードをいっぱいアップ


でも失敗したこともあります。




  • 頑張って作ったけど一度も自分以外の人に使われてないもの

  • 作ったbotがマイナーすぎてフォロワー30人にも満たない

  • 飲み過ぎ


他いろいろ。


成功したことの中にも「こうしておけばもっと良かったのでは?」という点がいくつもあります。


それを踏まえて、今年は昨年やらなかったことをどんどんやって、もっと「失敗」する一年にしたいです。


リストに挙げたやりたいこと・やめたいことを実践して、もう少し具体的な話を1つずつブログに書いていければいいなと思っています。


今年もよろしくお願いします。