そんな今日この頃でして、、、

コード書いたり映画みたり。努力は苦手だから「楽しいこと」を探していきたい。

『Perlについて語ろう』読んだよー

YAPC おなじみ ゆーすけべー氏のKindle本。

Perlについて語ろう

Perlについて語ろう

僕は集中力ない・出不精・人見知りの三重苦エンジニアなので勉強会もカンファレンスも行かないから直接は知らないけれど、氏のブログを読んでMojoliciousを使おうと決めたり諸々の記事読んでWebアプリ作りてーなーと思ったりで勝手に一方的に親しみを感じていたりもする。


さて、本題の本について。

「入門本」と銘打っているだけのことはあって変数の使い方から始まるが、いわゆる言語の入門本的な手広く・散漫な感じとは違って、実際にバッチなりWebアプリなりを作ろうと思った際にぶつかりそうな課題について集中して段階的に書かれている。

理屈詰めというよりは実用的なモジュールとその使い方の紹介が中心といった感じ。


僕も業務でPerlを使っている手前ひと通り「やりたい事」はできるようになったが、それでもかなり「へーそんなのあったんだ」という発見があった。

やはり業務だとどうしても「引き継いだもの」に縛られてしまう部分もあるわけで、時にはこういった物を読んで0ベースから視点を広める価値はある。


元がWeb連載ということもあり本当の初心者からすれば少々説明があっさりし過ぎているような気もするが、『初めてのPerl』あたりを副読本として読み進めれば適度に目的を与えらえて良いモチベーションになるように思う。

初めてのPerl 第6版

初めてのPerl 第6版

そして本書を読み進め、ある程度自分なりにWebアプリが作れるようになった上で『Webサービスの作り方』を読むのがお勧め。

『Webサービスのつくり方』読んだよー - そんな今日この頃でして、、、

goemonでMojolicious::Liteでの開発速度を加速してみた

先日↓こんなツールがリリースされてたので試してみたら、なかなか快適だった。

Big Sky :: 開発速度を加速するツール、goemon を書いた。

大雑把に説明すると、ファイルの変更を読み取ってリロードやらminifyやらを自動でこなしてくれる補助ツール

ファイル編集からの定形処理を自動化することで、コードを書くことに専念することができる。


昨今じゃ色々とビルドツール的なものが出てきてて、例えば前に使ってみたYeomanなんかを使えば、テンプレート作成からテストまでカバーできる。

Yeomanのチュートリアルの個人的なまとめ - そんな今日この頃でして、、、

確かに便利は便利なんだが、結構覚えなきゃいけないことは多いし、テンプレートとしてあるものを使う分には良いのだけれど、いざ自分好みの環境に適用しようと思うとちょっと面倒くさい・・・

そこまでフロント開発に比重を置いてるわけではないし物覚えも悪い身からすると正直しんどい。


その点goemonはシンプルで学習コストが低く、それでいて柔軟性があるので、今ある環境に気軽に導入できるのが良い。

今回は個人的に愛用してるPerlフレームワークMojolicious::Liteで使ってみた。

続きを読む

今日踏んだ落とし穴、printfでの小数の桁揃えに注意

学生の頃に地方システム屋へのインターンで「こんな地味で面白くもないこと仕事にしたくないぜ!」と感じてウェブ界隈に就職したのに、なぜか今現在は帳票システムめいた案件に関わってるっていうインガオホー。

さて、金回り・契約回りの数値となると数字の正確さはもちろん表記まで色々要求がシビアになったくるわけだが、今日踏んだのはprintfによる小数点の桁揃えでの問題。


数値から整数部分と取り出すという要件の場合、一番大雑把にやるならint($num)という手があるが、これは厳密には非推奨。

$ perldoc -f int
       int     Returns the integer portion of EXPR.  If EXPR is omitted, uses
               $_.  You should not use this function for rounding: one because
               it truncates towards 0, and two because machine representations
               of floating-point numbers can sometimes produce
               counterintuitive results.  For example, "int(-6.725/0.025)"
               produces -268 rather than the correct -269; that's because it's
               really more like -268.99999999999994315658 instead.  Usually,
               the "sprintf", "printf", or the "POSIX::floor" and
               "POSIX::ceil" functions will serve you better than will int().

曰く、sprintfとかprintfとか、POSIX::floorなりPOSIX::ceilあたりを使えよとのこと。

use POSIX qw/floor/;とか書くのも面倒くさいので、僕は$num = sprintf "%d", $num;の方を好んで使う。


さて今回は同じノリで値を小数点第二位で切りそろえるという要件に対しsprintf "%.2f", $num;と実装したわけだが、これがちょっとうまく行かなかった。

$ perl -e 'printf "%.2f", 123.456;'
123.46

どうやら%.Xf単純に桁で切りそろえてくれるわけじゃないらしい。

ちなみに切り上げとか四捨五入とも挙動は違うので注意。

perl -e 'printf "%.2f", 123.455;'
123.45

どうやら正攻法で100かけて整形して100で割る、みたいなことをしなくちゃいけなそう。

perl -e 'print(sprintf("%d",123.456*100)/100)'
123.45

もう21世紀なんだし何か他にスマートな書き方は無いのかなと探してみたけど、ちょっと見当たらなかった。

初めてのPerl 第6版

初めてのPerl 第6版

自分用メモ

Mojo::Liteのxslate_rendererでヘルパー使うときの記述↓

#pl側
use Text::Xslate qw/html_builder/;
plugin 'xslate_renderer' => {
  template_options => {
    function => {
      test => sub{
        return html_builder {
          my $html = shift;
          my $tag = $html."test";
          return $tag;
        };
     },
  }
};
#tx側
:"a"|test(); #=> atest
  1. template_options内にfunctionとして記述
  2. html_builderで返す

AngularJSの$http.post()のメモ

今年に入ってから「流行りものに手を出してみよう」ということでAngularJSをよく使うようになったのだが、最近ではもはや理由がない限りは使うのがデフォって位に僕の中では無くてはならない存在になってきた。

昨今のブラウザ側にある程度データを持たせてガリガリいじるような設計の場合、生のJavascriptなりjQueryなりで作ると内部的なデータと実際の画面表示とで状態を同期するのが一丁面倒だったりする。

そのへんデータバインディングの恩恵に与ることで凄く生産性が上がるのである。


さて本題。

AngularJSでは$http.post()によってPOSTでデータを送信することはできるのだが、これをjQueryの$.post()のつもりで使おうとすると、なぜかサーバ側で上手く取得できなくて面食らうことになる。

  #ブラウザ側
  $http.post('/api', {test:1}); #"test"って要素に"1"って入れて送ってみるじゃん
  #サーバ側(今回はMojolicious::Liteで)
  $self->param('test');#これでは"1"が取れない!!

結論から言えば、AngularJSの$http.post()はformのinput要素のような形で送信するものではなくて、application/x-www-form-urlencodedが付かないからJSONのまんま自動では展開されないのが原因。

jQueryのやつっぽく使いたい場合

無理くりjQueryライクにやりたければ、細かい設定を入れて$http()使えばよい。

$http(
  {
    url:"/api",
    method:"POST",
    data:{test:1}
    headers: {'Content-Type': 'application/x-www-form-urlencoded'}
  }
)

https://docs.angularjs.org/api/ng/service/$http

(そもそもAngularJSとjQuery共存できるので、そこだけjQuery使う方がベターな気がするけど・・・)

Mojolicious::Liteで受け取る

とはいえ最新のフレームワークがわざわざこんな形で送ってるのは当然理由がある。

普通にpostした場合は一次の連想配列でカバーできる形式のデータしか送れないわけで、複雑な構造のデータを扱いたい場合は何かと工夫が必要となるのだが、JSON形式でならばそのあたりの面倒がない。


そんなわけで、ちゃんと$http.post()で送った物を取ってみる。

要はリクエストボディを取得してJSONでデコードしてやりゃ良い。

個人的に専ら良く使っているPerlフレームワークMojolicious::Liteには初めっから便利なものが用意されている。

my $data = $self->req->json;
$data->{test}; #これで目的のものが取れる!

AngularJSアプリケーション開発ガイド

AngularJSアプリケーション開発ガイド


Vita用のソフトは何本か買ってみたのだけど、最近は『地球防衛軍3Portable』ついついばっかりやってしまう。

地球防衛軍 3 PORTABLE

地球防衛軍 3 PORTABLE

それほど敵に動作にバリエーションはないけれど、ボリュームはあるしアンロックされる武器もいっぱいあって、TPSとして楽しい要素をしっかり抑えている。

1ステージだけってつもりでやってたら、気づいたら夜になってたりするから恐ろしい。

HerokuでMojolicious::Lite動かしてみたメモ

深夜にサーバいじりしてうっかりノッて来ると目が冴えちゃってあかんのな・・・

そんなわけで、出社時間までちょっと間があるのでメモ。


HerokuでPerlアプリを動かす

HerokuとはRailsアプリを動作する、ある程度までは無料で使えるPaaS・・・なのだが、実はbuildpackを導入することで色々な言語を使うことができる。

昨年の時点では、あまり日本語のドキュメントが無かったし、そもそもRuby使ってみるのが主目的だったのでSinatraを使っていた。

Sinatra@Heroku とりあえずHerokuで何か動かしたい人向けメモ - そんな今日この頃でして、、、


しかし、やはり本職で使い慣れたPerlを動かせれば夢が広がるなということで、日本語ドキュメントも充実してきたのでやってみた。


Herokuのアカウント作成とかツールの準備とか

このへんは省略。


ローカルにMojolicious::Liteアプリを作ってみる

こっちも省略。

管理画面づくりとmojoな話 - そんな今日この頃でして、、、

Mojolicious::LiteでXslate使ってみたメモ - そんな今日この頃でして、、、


デプロイ用にディレクトリを作り、その中に格納しておく。


buildpackを導入

Perl用のものも何種類かあるが、例示がドンピシャだったのでperlokuを使ってみた。

GitHub - judofyr/perloku: Perl on Heroku


記載されて通り、アプリのスクリプトを入れたディレクトリに下記のファイルを作成。

Makefile.PL

今回はXslate使いたかったのでMojoX::Renderer::Xslateを追加した。

use strict;
use warnings;

use ExtUtils::MakeMaker;

WriteMakefile(
  NAME         => '*アプリのスクリプト*',
  VERSION      => '*バージョン*',
  AUTHOR       => '*名前*',
  EXE_FILES    => ['*アプリのファイル*'],
  PREREQ_PM    => {
    'Mojolicious' => '3.0',
    'MojoX::Renderer::Xslate' => '0.9',
  },
  test         => {TESTS => 't/*.t'}
);


Perloku (chmod +x とかで実行権限与えとく)

#!/bin/sh
./myapp.pl daemon -l http://*:$PORT -m production


また、アプリのスクリプト自体も実行権限与えとく。


デプロイ!

ひとまずディレクトリ下で

$ git init


buildpoack導入

$ heroku create *アプリ名* -s cedar --buildpack http://github.com/judofyr/perloku.git


あとはおなじみ

$ git add .
$ git commit -m 'first commit'
$ git push heroku master


(なんかモジュールが指定したつもりのバージョンじゃないのが気になったが、動作自体には影響なかったので今回はスルー)

開いて確認!

$ heroku open
$ heroku logs




なんとか時間内に書き終わった・・・

HerokuではじめるRailsプログラミング入門

HerokuではじめるRailsプログラミング入門

Mojolicious::LiteでXslate使ってみたメモ

nginx.confいじってgitlab・redmine・mediatombをサブディレクトリで運用しようとしたけど、どうにも上手くいかなくて心が折れたので、表題のメモでお茶にごし。

やってみれば単純な話だったので世間的には書くまでもないということだと思うけど、ググっても古かったり部分的だったりでドンピシャな情報が引っかからなくて僕はちょっと戸惑ったので(^^;


Mojolicious::LiteはPerlの軽量WAF。

個人的にお気に入り。

管理画面づくりとmojoな話 - そんな今日この頃でして、、、


Xslateは軽量なテンプレートエンジン。

最近周辺で何かと使われてるので、使っておきたいなーと。


1.なにはともあれモジュール追加

一応。

# cpanm MojoX::Render::Xslate

関係するモジュールが多いのか、割と時間かかった。

2.lite_app内での記述

plugin 'xslate_renderer';を記述。

#!/usr/bin/env perl
use Mojolicious::Lite;
plugin 'PODRenderer';
plugin 'xslate_renderer';

DATA以降のxxx.html.ep系をxxx.html.tx系に書き換える、もしくはtemplatesディレクトリ以下にxxx.html.txみたいな感じにテンプレートファイルを用意する。(個人的には後者の方が好き)


古い情報だとゴニョゴニョやってたりするけど、こっちはこのままでOKみたい。

 $self->render('index');
+α. ヘッダーとかフッターとか

どうやらプラグインのとこでハッシュでオプション渡せば良いらしい。

ちなみにこっちはファイル名フルで。

plugin 'xslate_renderer' => {
  template_options => {
    header => ['header.html.tx'],
    footer => ['footer.html.tx'],
  }
};

僕はXslateて業務の管理画面で使う最低限の書式を把握してる程度だったので、改めて検索するとブロックとか色々便利そうな機能が用意されてることに驚くのな。

『Webサービスのつくり方』読んだよー

Webサービスのつくり方 ~「新しい」を生み出すための33のエッセイ (Software Design plus)

Webサービスのつくり方 ~「新しい」を生み出すための33のエッセイ (Software Design plus)


どんな本か

本書の構成は「心構えと下準備」「企画」「設計」「開発」「プロモーションと運用」の5章からなる。


書店のプログラミング関連の棚によく平積みされてるような「〜を使ってウェブサービスを作ろー」的な本だと環境構築から開発ぐらいが関の山なんだけど、本書は比較的サクッと読める分量ながらも「ウェブサービスを作る」ということの全体を手広くカバーされている。

そう言ってしまうと広くて浅い感じなのかと思ってしまうが、本書に関してはかなり実際的で具体的なことが多く書かれており、「薄く」はあっても「浅く」はないなという印象をもった。


以下面白いなと思った内容



哲学とアイディアとコンセプト

「企画」の章では哲学→アイデア→テーマ→コンセプト→名前→デザインの順に企画を具体化させて行くべきという内容が述べられている。

実際本職でも「何をつくるかという意志が固まっていないためにプロジェクトが一向に進行しない」みたいな状況を間近に見ているため、このプロセスの重要性は骨身にしみて感じる。

僕が見ている現場について考えると、プロジェクトが揺らぐ原因は本書で言う所の哲学とアイディアとテーマとコンセプトがそれぞれ明確化されていないことのように思う。

本書に従って言うならば
哲学はサービスを考える上での確固たる価値観
アイディアは哲学を実現する方法
テーマはサービスがどの領域で勝負していくかという方向性
コンセプトはテーマを具体化したもの
図にすると以下のような感じ。

f:id:blue1st:20130707061239p:plain

哲学という軸なしにアイディアだけ大量に出しても具体案を固めるには弊害にしかならないし、テーマが定まらなければどっちつかずなプロダクトとなってしまう。

環境構築と開発

いわゆる「ウェブプログラミング入門書」では古典的なApache+mod_cgi+MySQLあたりを環境として書かれるのがほとんどなように思うが、本書ではNginx+Starman+memcached+MySQLというかなりイマドキで実際的な環境が挙げられている。

このあたりはPerlを使う人でなければそのまま参考にすることはできない部分ではあるが、古典的な環境での性能的限界とそれに対するアプローチの考え方が書かれているため、その他の言語使用者でもそれなり参考になるのではないかと思う。


また、開発を効率化するためにWAFやCSSフレームワークを積極的に使うこと、そして使い慣れた自分なりの雛形を作っておくことが勧められている。

ここは僕も社内管理画面でMojuliciousLite+TwitterBootStrapを活用するようになってからすごく恩恵を実感するところだったりする。
管理画面づくりとmojoな話 - そんな今日この頃でして、、、

単純に作業量減るというだけではなく、
・より本質的な価値を高めることに注力できる
・構造に統一感があることにより技術的に蓄積していくものが大きい



感想

意外と具体的な環境に合わせて書かれているため予備知識ゼロで読むには辛いし、かと言ってこの一冊を読みこめば何でもできるようになるというほど手厚い内容ではない。

特に開発の部分ではPerlを使わないと何のことやらと思う部分も多い気はする。

しかし、サービスを思いついてから運営するまでのことが網羅的に書かれているため、自分に何が足りていないかを把握して今後の学習の方針を定めるのには良いと思った。


全くの素人がタイトルを素直に受け取って参考にするには厳しい気がするが、「Apache+mod_cgi+MySQLである程度意図したものは作れる」位の人が読むと得るものが大きいと思う。



あと僕は無料なのを重視してHeroku使ったりしていて気楽に使えて良いなとは思うのだけれど、結構PaaS環境独自の知識が必要だし環境構築や運用の知識が付きづらいしで、本書で勧められているようなVPSを借りる方が総合的には良いかもなぁと思ったり。
Sinatra@Heroku とりあえずHerokuで何か動かしたい人向けメモ - そんな今日この頃でして、、、

Webサービスのつくり方 ~「新しい」を生み出すための33のエッセイ (Software Design plus)

Webサービスのつくり方 ~「新しい」を生み出すための33のエッセイ (Software Design plus)


近況

社内でRuby勉強会に参加するために『たのしいRuby』を読み進める今日この頃。

たのしいRuby 第4版

たのしいRuby 第4版

前に個人で学習してた時は、より具体的な使用例が書かれていた『作りながら学ぶRuby入門』を参考にしていたのだけれど、それと比べるとより根本からの説明になっていて、Rubyという言語を理解のには適しているように思う。
Rubyの学習 第7部&まとめ - そんな今日この頃でして、、、

結構読みやすく、確かにRuby入門書の定番と言われるだけのことはある。