Rich Lab. Blog

「まつらリッチ研究所」の研究の一環で、はてなブログ上にブログを公開。でもなぜか買い物カゴが……。はてブはそんな機能あったっけ?

「けもフレ×ネットカルチャー×プログラミング」な本できました

新刊ができたので、商品の購入ボタンを置いておきます。いや……そうじゃなくて紹介記事置いておきます。(8/11までは納品されてないのでボタン押せません)

f:id:richmikan:20170805102444j:plain

けもフレ難民の第2クール活動調査資料

ついったーちほーの最大瞬間風速

2017年8月11日 発売

(C92 1日目 た24b/3日目S40a委託)

頒布価格:1000円

66ページ、オールカラー

商品詳細

現在、カゴに冊入っています

(Safariをお使いの方はコチラで注文)

「これはボス、あなたこれがだんだんボスに見えてくる」と言われたらもうそれにしか見えなくてもうどうしようもないペトロナスツインタワーの表紙が素敵なけものフレンズの本です。

 

でも、かわいいフレンズたちの絵とかマンガとか一切ありません。フレンズ化した人々(各界著名人含む)が巻き起こした行動や名言、起こった出来事をTwitter上で観測した本です。

くわしく

まず、特殊なソフト(いや、全然特殊じゃない)を使ってTwitter①ツイートの大量検索を実施します。その時に使った検索条件式が次です。

けものフレンズ OR けもフレ OR けもふれ OR ケモフレ OR じゃぱりぱーく OR ジャパリパーク OR "サーバルちゃん" OR "かばんちゃん"

これが、この本をフレンズ化した唯一かつすべての要因です。

f:id:richmikan:20170805114406j:plain

次に、そうして取得した大量のツイートから表計算ソフトでグラフを作ります。どういうグラフかというと、「何時何分に1分あたり何回のツイートがなされたか」

すると、特定の日時にものすごい勢いでツイートをされる箇所がたくさん見つかります。ものすごい勢いでツイートが飛び交っているということは、何かフレンズたちをザワつかせる事件があったに違いありません。ということで、③物凄い勢いでツイートが飛び交っていた最中のツイートを観測します。すると……、

  • その時,どんな出来事が起こっていたのか
  • どんな名言が飛び出したのか
  • その出来事に対して、皆どんなリアクションをしていたのか

などが、手に取るようにわかるという仕組みです。それが右上に貼ったグラフ例です。

多彩なグラフ

グラフはそれだけじゃありません。例えば、フレンズたちが固唾を飲んで見守っていた最終話放送中などは分単位ではなく秒単位でグラフ化してどの時分秒の何のシーンに盛り上がったのかを調査しましたし、どうぶつビスケッツ×PPPがミュージックステーションに出演した際には他の出演者と比べてどれくらい多くツイートされたのか集計しましたし、ツイートに付随している位置情報をマッピングしてフレンズたちがどこへ足を運んだのかも可視化しました。

本文に掲載しているグラフの例2
ニコ生で1話から11話を一挙放送した時

本文に掲載しているグラフの例3
4/14のMステ放送時、どこで盛り上がった?

本文に掲載しているグラフの例4
Mステで、最も話題にされた出演者は?

本文に掲載しているグラフの例5
フレンズの分布図も作成

メイキングも公開

本文サンプル(第2章)

一応うちはコンピューター技術を取り扱うグループですので、技術解説パートも用意しました。

これらのツイート収集や分析、一体どういう機材を使って行ったのか?

じつは、一台のUNIXコンピューターと家庭用インターネット回線、そしてUNIXコマンドだけなのです。Rなどの高級言語もいらなければ,Firehose等の特殊な契約も必要ありません.

その具体的な手順をチュートリアル形式で紹介していますので、あなたも今日からツイートのデータ分析が始められるようになります。夏休みの自由研究にピッタリですね。

コミケ1日目 た24bで初売り

コミケ合わせで作りましたのでコミケで初売りします。初日た24bです。この日は、たつき監督も隣のホールに出展しているらしいですよ。フレンズのみなさんは、ぜひついでに立ち寄ってください。

それから、3日目も東SOKEN(S40a)さんとこに委託しますのでそちらでもぜひ。

 

 

←カゴに商品が入っている時にこのボタンを押せば、レジへ移動します。

2017年、POSIX原理主義は世界に進出する

この記事はPOSIX原理主義 Advent Calendar 2016の最終日です。

Advent Calendar 2016完走のご挨拶

さて、このAdvent Calendarを読破してくださった皆様、そして当番の日に執筆してくださった皆様、この25日間おつきあいくださりありがとうございました。主催者でもない私が挨拶するのもおかしなものですが、POSIX原理主義という考え方を提案した張本人として、こういう場を用意してもらえたことに心から感謝します。

まだ埋まっていない日もありますが、当番の方が読み応えのある内容で後日必ずや埋めてくれるはずですの期待してお待ちください。

後日埋まるはずではありますが、節目の25日を迎えたということで、POSIX原理主義を来年どうしていくかの抱負を語り、一足先に完走のご挨拶に代えたいと思います。

今年は、大きな一歩を踏み出した年

POSIX原理主義という考え方。これは、私の中で2014年頃に生まれました。それまでもPOSIXに準拠すると何だかラクになるなぁというぼんやりとした思いはあったものの、一つの概念としてしっかり命名したのはこの年でした。また同年、PHPカンファレンス2014参加したのが公の場でのデビューでした。なぜPHPのイベントだったかというと、この年のPHPconでは、言語を問わないLT大会が催されたからでした。

あれから2年。POSIX原理主義に基づくソフトウェアを書き貯めつつ、今年は学術論文を発表したり、Bash on Ubuntu on Windowsの登場によるOSの壁崩壊という大革命に合わせてPOSIX原理主義の理論を完成させ、その内容で商業出版を果たしました。

でも、今年何より大きかった出来事はPOSIX原理主義の支持者が現れ、仲間ができたことでした。私も、提唱者とはいえ一人の人間。気が付かない間違いや辿り着けないアイデアがあり、そして一つの体ではやりきれないこともたくさんあります。そこを補完してくれる人というのは今後の発展のためには欠かせない存在です。

今年もついに、できなかったことがあった

POSIX原理主義はとても切れ味の良い、優れた理論であると思っています。現代ソフトウェアは、目先の性能や利便性ばかりを追求し、長持ちさせるという発想がどこかへ抜けてしまっているものばかりですが、長持ちさせたいというニーズに応えられる貴重な解であり、パラダイムシフトを起こす存在だとさえ思ってます。そして優れたコマンドもいくつか作ってきました。

どれもヒットしてもおかしくない出来映えだと思っています。JSONパーサーのjqやジェネレーターのjoなど、starが何千個もついているわけで、それよりも優れた出来である自信があるので当然もっとstarが付いてもよさそうなものです。

しかし現実には2ケタの差があります。同じように疑問を持つ方もいらっしゃいます。

これが、今年できなかったこと。つまり、優れているのに全然普及しなかったということです。なぜなんでしょう?

この本が、できない理由を教えてくれた

オライリー・ジャパンが発行している

という本に答えが書いてありました。じつは、数年前に購入していた本だったのですがの本棚に挿したまま読んでいませんでした。良いソフトだとおもうのに流行らないのは「何でだろう」と思うようになっていて、この本を読んでみたらあっさり答えに辿り着きました。ちなみに、この本のすべての内容はWebでも読めます。

この本は、書名のとおりオープンソースソフトウェアを普及するための枠組みを作るための作法について書かれたものです。特徴的なのは、「こうやると失敗する」「こうやらないと失敗する」ということを具体例を示しながら解説している点です。

そして、POSIX原理主義ソフトウェアが流行らない理由に対する答えは、第2章「さあ始めましょう」に書いてありました。

「手持ちのもので始めよう」節より
フリーソフトウェアプロジェクトの立ち上げ時に最も厄介なのは、 個人的なビジョンをみんなにわかる形に置き換えることです。 あなた (あるいはあなたの属する組織) にとっては何がやりたいのかは明白でしょう。 しかし、そのプロジェクトの目標が何なのかを一般にもわかるように表明することは、 それなりに大変な作業です。しかし、 かならず時間を割いてそれをやらなければなりません。

つまり、「限られた時間の中で、ドキュメント作りと新たなコード作成どっちに時間を割く?」と問われたら、後者を選びたくなるけどそれが罠だと言っているのです。

しかも、

インターネットのデフォルト言語が英語となっている という事実を無視することはできません。

といって、英語を前提をすべきことまで示唆されていました。

我々の作ったソフトウェアを振り返ってみるとどうでしょう?ドキュメントはほとんどありません。シェルスクリプト中のコメントはまぁまめに書いていますが、ほとんど日本語です。

ドキュメントがないということは、空気も同然です。つまり、見えないということです。見えないということは、使う人も現れないのはもちろん、プロジェクトに参加しようとする人も現れません。参加しようかどうしようか、迷うことすらできないのですから。

来年はPOSIX原理主義のコミュニティーを立ち上げる!

というわけで本の教えに従って、来年は次の活動に力を入れます。

(1) コマンドのマニュアル、POSIX原理主義のドキュメントを整備します

まずは、本で指摘されれいた罠に見事にハマっていたことを反省し、これまで作ってきたコマンドのドキュメントを作っていきます。まずは母国語たる日本語で書いてフォーマットの確立や説明シナリオを確立し、次々英語に翻訳していきます。

特に完成度の高いと感じている「Parsrs」や「小鳥男」を優先してドキュメント化していきたいです。

並行して、POSIX原理主義を実践していくうえでのドキュメントの整備・翻訳も進めます。具体的に言うと、

のことです。さらに、このAdvent Calendarに寄稿してくださった有用なTipsも対象にできれば理想です。

「満足に英語使えるのか」ですか? 幸い今年、

というニュースがありましたし、たぶん大丈夫でしょう!

(2) POSIX原理主義のWebページを作ります

ドキュメントを作ることは確かに重要ですが、それらを一覧的に見られるWebサイトも重要です。そもそもPOSIX原理主義は思想が大事ですので、そういう話を語る場所が必要になります。

案の定、そういったWebサイトが必要であることも同じ本の同じ章に書かれています。もうこれはさっさと作るしかありません。それでもう名前は決めてあります。

posixism.org です。

POSIX fundamentalism、略してPOSIXismというわけです。もうドメインは押さえてあります。始めはほとんど中身のないサイトだと思いますが、できたらアナウンスします。

(3) POSIX原理主義のコミュニティーを作ります

POSIX原理主義の今後の構想をすればするほど、もっと多くの仲間が必要だなと感じます。ドキュメント整備やコード開発の仕事を手伝ってくれる仲間になってくれる人がいるとありがたいところですが、始めからそんなことは望みません。

一緒にPOSIX原理主義を楽しみ、実践してくれる仲間を増やしたいです。だいたいどんなプロダクトもそうですが、利用者の数が多いほど価値が高まります。

そのために、どこかのつてを探して定期的な勉強会など開けないかと画策します。見事開催が実現したら

  • POSIX原理主義のどこが良くて悪いのか
  • コマンドやデータの在り方
  • UNIX哲学に基づくプログラミングやデータモデリングはどうやるべきか

などの意見交換をしたいと。例えば、先日のAdvent Calendar 21日目でシェルショッカー総統の321君が、「revやseqコマンドはなぜ優れているのか」ということを語っていましたがまさにああいう議論であり、意見交換をしていきたいです。

今でもTwitter上などで何となくは議論していますが、オフラインで本格的にやりたいですね。

英語……。うーん英語圏の人とも議論できたら理想ですね。

世界を“Great!”と言わせ、日本人に「すごい!」と言わせる。

今年は

が大ヒットしましたが、このコンテンツのヒットの経緯を見ても、日本人は自力でいいものを見つける力が弱いんじゃないかと思います。なぜ世界レベルのコンテンツ力をもった作品が海外を経由しないと流行らないんでしょうね。

技術も同じです。青色LEDもそうですし、既に八木・宇田アンテナが発明された時代にこの気質はありました。日本発のソフトウェアで有名なものはほとんどありませんが、よーく調べてみると、日本人の目に留まらかったことで、優秀なのに消えて行ったり、海外に流出してもともと日本で生まれたものだともはや誰にも知られていないものが意外に多く存在します。

POSIX原理主義がドキュメントの英語化に拘るのもこういう意図があります。海外で認知されなければ、国内ですら生き残れないという危機感です。

だから我々は、POSIX原理主義で世界を“Great!”と言わせ、そして日本で「すごい!」と言わせなければならないと思うのです。

 

というわけで来年、POSIX原理主義は世界に進出します。どうか応援してください。あわよくば、仲間になって一緒に“Great!”と言わせようじゃありませんか!

「大岡裁き」ならぬ「POSIX裁き」

この記事はPOSIX原理主義 Advent Calendar 2016の9日目の記事です。

今日のテーマは、POSIXという規格で起こった一つの事件とその裁きを、大岡政談(大岡裁き)になぞらえて紹介します。

大岡政談とは何か

f:id:richmikan:20161209042852j:plain

そもそも大岡政談とは何でしょう?それはあの水戸黄門と共に時代劇の定番となった大岡越前をモデルにした(ほぼ創作上の)事件簿です。

実際の水戸黄門も諸国漫遊をしておらず、あれは創作物語だったのと同様に、大岡越前の名裁きとされる逸話も史実だと確認できているものは今のところ一つだけ*1で、あとは落語の囃と言われています。

創作であろうものの、その中でも特に有名なのが「三方一両損

昔、大工の吉五郎という男が小判三両を無くした。それを左官の金太郎が拾い、幸い財布に吉五郎の名が入っていたことから善意で届けたところ、恥に感じた吉五郎は受け取りを拒否。やがて喧嘩になり、町奉行大岡様の白洲(法廷)にて決着をつけることに。

白洲でも相変わらず互いに主張を譲らぬ二人であったが、そんな二人を大岡は謙虚であると、たいそう褒めた。そして大岡は吉五郎が頑なに受け取らぬ三両を代わりに受け取り、そこに懐から取り出した自分の一両を加えてこう言った。

「その方らは謙虚ゆえ、褒美を出す。この手元にある四両を二両ずつ受け取るがよい。吉五郎、その方は届けられた時点で受け取っていれば三両が戻っていたもをその謙虚さから二両しか戻らず一両の損。金太郎、その方は拾った時点でそのまま受け取っておれば三両得したものをその謙遜さゆえ二両しか褒美を貰えず一両の損。この大岡忠相も、その方らに褒美を授けるために一両出し、一両の損。三方一両損。これにて一件落着」

さらにこの話には「三方一両得」という続きがあり、「なるほど同じ騒ぎを起こせば大岡様から一両貰えるのか」と悪巧みした二人組をこれまた巧妙な裁きで懲らしめるというものなのですが、いずれにしてもウィットに富んだ名裁きとして語り継がれています。

アーカイバー一命令損」事件

さて、POSIX規格にも過去、二つのコマンド(命令)が削除されるという一大事が起こりました。過去との互換性を何よりも尊重するはずのPOSIXという規格が、なんとコマンドを削除したのです。しかし、そこはPOSIX。単に削除したわけではなく、ウィットに富んだ名裁きを行って決着を図ったのです。

この事件を、三方一両損になぞらえ、アーカイバー一命令損」と呼ぶことにしますが、その経緯を見ていきましょう。

tarコマンドとcpioコマンド

今を遡ること28年前の1988年。UNIX系OSのあるべき仕様を定めた「POSIXの御触書」が公布されました。その正式名称はIEEE Std 1003.1-1988というものでしたが、そこには当時メジャーだったアーカイバーコマンドであるtarcpioも記載されていました。つまり、tarとcpioはUNIX系を名乗るOSが持つべきコマンドとされていました。これは、それまでの各種UNIX系OSで双方のコマンドが普及していたことを物語っています。

しかし、両者の仲(互換性)は最悪。それぞれで生成したアーカイブファイルには全く互換性がありません。アーカイブファイルを作るという目的を達成するために、異なるベンダーがそれぞれ独自に開発し、二大勢力になっていたというだけだったのです。各種UNIX系OSの仕様の最大公約数的存在を目指していたPOSIXにおいて、この二大勢力のどちらかを切り捨てるというこは当時できなかったのでしょう。だからこそ両方ともPOSIXに採用されたのだと思います。*2

フォーマットの陳腐化と独自拡張

しかし、時代と共にコンピューターが扱うデータサイズが大きくなると、それぞれアーカイブファイルフォーマットが陳腐化していきました。一つは大きなデータに見合わぬ小ささのブロックサイズ。ブロックサイズが不適切に小さいと効率が悪化してしまいます。もう一つは8GBの壁。当初の規格ではどちらも8GB以上のサイズを持つアーカイブファイルが生成できませんでした。特にファイルサイズの上限問題は致命的です。

これでは使い物にならないということもあり、各ベンダーは勝手に独自拡張を施すようになりました。こうして、細かな派生が生まれ、POSIXの御触書によって維持されていたtar&cpio二大勢力という治安が崩れようとしていまいた。

POSIXが両コマンドに下した裁き

最初の御触書が交付されてから5年後の1993年、庶民(ユーザー)達からの陳情にPOSIX守(ポジックスのかみ)はついに裁きを下すことになりました。

下した裁きはなんと、tarコマンドとcpioコマンドの双方の所払(ところばらい)!ベンダー間で統一性の無い拡張をした以上市中(POSIX環境)には置けぬということで、御触書から削除を命じたのです。

しかしそこは名裁きで有名なPOSIX守、単なる所払ではありませんでした。このままではアーカイバーコマンドが無くなってしまいますから、新たなコマンドをアーカイバーの役に就かせることとしたのです。しかしここでかつての二大勢力と異なる第三のフォーマットを策定しては、今まで作成されたアーカイブファイルが開封できなくなってしまい、庶民達が混乱してしまいます。そこで、新たなコマンドにはtar、cpio双方の形式を踏襲させつつ、ブロックサイズやデータサイズの上限問題を克服できるよう仕様を拡張させたのです。

そして、アーカイバーコマンドに与えた屋号(名前)はpax。ラテン語で「平和」を意味します。POSIX上でアーカイバ―コマンドが二つ減って一つ増えて……、これぞまさしく「アーカイバ―一命令損」。めでたしめでたし。

今のPOSIX文書に、裁きの跡が残されていた

この裁きがあったことを物語る記述が、「POSIXのお触書」2008年版(IEEE Std 1003.1-2008)のpaxコマンドのページに残されています。

RATIONALE

The pax utility was new for the ISO POSIX-2:1993 standard. It represents a peaceful compromise between advocates of the historical tar and cpio utilities.
(paxユーティリティーは、POSIX.2-1993で登場しました。これは、過去にtarとcpioユーティリティーをそれぞれ提唱した人達に対する平和的妥協を促す象徴的なユーティリティーです。)

"pax"という名には、packs(「梱包する」という動詞の三人称単数現在)の意味と同時に、アーカイバーコマンドの覇権争いを終わらせて平和を築こうという願いが込められていたのです。何という名裁きなのでしょうか。

paxコマンドを試しに使ってみる。

そもそもpaxって皆さんご存知ですか?POSIX守の願いがいまいち届かずあまり有名ではありませんが、POSIXの御触書にありますのでお使いのUNIX系OSにはまず間違いなく入っていると思います。そして、実際にtarやcpioとファイルの互換性があります。

さすがに、「paxでアーカイブファイルを作ればtarでもcpioでも開ける」ということはありませんが。どちらの方式のアーカイブファイルも作成できますし読めます。そして、現在の大抵のtarコマンドは(たぶんcpioコマンドも)paxコマンドが作成する上位互換アーカイブフォーマットを読めます。

というわけで、試しにpaxコマンドでtar形式の上位互換であるustar形式アーカイブファイルを作成し*3、それをtarコマンドで開いてみようと思います。

# 1)テスト用のディレクトリーを作って入る
$ mkdir ~/test
$ cd ~/test

# 2)paxでアーカイブ作成
#   ・-wオプション + 対象ファイル名...
#   ・結果は標準出力に出るのでリダイレクト
$ pax -w /usr/share/man > man.tar

# 3)tarでアーカイブ展開
#   ・paxは絶対パスを取らずにアーカイブを作るので警告が出る
$ tar -xf man.tar
tar: Removing leading '/' from member names
tar: Removing leading '/' from hard link targets

# 4)生成ファイルを確認
$ ls
total 33944
-rw-rw-r-- 1 rich rich 34713600 Dec  9 03:14 man.tar
drwxrwxr-x 3 rich rich     4096 Dec  9 03:14 usr
$ 

ちゃんとできました(古めのCentOS 5で確認)。

というわけで、これからはtarに代えてpaxコマンドを使いましょう。POSIX守に感謝しながら。

*1:夫の計画殺人未遂の罪で裁かれた「白子屋事件」

*2:一方、trコマンドにはSystem V系の書式とBSD系の書式という相反する二大勢力があったものの、こちらのケースでは涙を飲んでBSD系が採用されました。

*3:paxコマンドのデフォルトアーカイブ形式はustarである。

POSIX原理主義の本は、作り方から売り方まで思想の塊である。

この記事はPOSIX原理主義Advent Calendar 2016の2日目の記事です。

今日のテーマは、昨日の記事でも紹介されていたPOSIX原理主義の書籍の話です。いきなりですが、商品の購入ボタンを置いておきます。

f:id:richmikan:20161201224717j:plain

POSIX原理主義聖典

Windows/Mac/UNIX すべてで20年動くプログラムはどう書くべきか

2016年11月10日 発売

頒布価格:3600円

388ページ、2色刷

目次商品詳細

現在、カゴに冊入っています

(Safariをお使いの方はコチラで注文)

続きを読む

Shell Scriptライトクックブック2014-2016 頒布中

2016年の夏コミで発行したShell Scriptライトクックブック2014-2016を通販してます

f:id:richmikan:20160912080501j:plain

POSIX原理主義シェルスクリプトレシピ集

Shell Scriptライトクックブック 2014-2016(第4版)

2016年8月14日 発行(コミケ90 3日目)

頒布価格:1500円

ページが増えて232Pに

目次商品ページ

現在、カゴに冊入っています

(Safariをお使いの方はコチラで注文)

第4版の変更点

詳細は目次をご覧ください。と済ませるのもあんまりなので、ポイントを記します。

Bash on Ubuntu on WindowsTwitterに対応し、青いカバーに

そもそも改訂は第3版でおしまいと言っていたのですが改訂しました(スミマセン)。というのも、Bash on Ubuntu on Windowsという大革命が起きたからです。POSIX原理主義Windowsでも通用する時代が到来したとなったらそれをサポートすべく対応しないわけにはいかない、というわけでBash on Ubuntu on Windowsに対応した内容にしました。

併せてレシピも追加しましたが、一番の目玉はTwitterに関するレシピシェルスクリプトからTwitter APIを操作して、投稿、検索、DM送受信などの日常使いを実現する方法を追加しました。

つまりこれらは、Bash on Ubuntu on Windowsでも動くTwitterアプリが作れるということを意味します。

計15個のレシピが、追加 or 修正

先程紹介したTwitterレシピをはじめ、合計15のレシピを追加しました。5章の「どの環境でも動くシェルスクリプトを書く」の内容をより完璧にしたり、他に大きなものとしては、1秒未満sleepをいかにしてPOSIXの範囲で実現するかなどを解説しています。たぶんこれはコロンブスの卵的に目から鱗なはずです。

序章を完全に書き直し、POSIX原理主義の理論をより完璧なものに

POSIXの範囲では不可能な処理を行うためにはどうしてもPOSIX外のコマンドを利用しなければなりませんが、従来は「やむを得ないので、最低限にとどめる」という見解であり、理論的に不完全でした。第4版ではこれを修正、「交換可能性の担保」という考え方を導入することで、理論的な曖昧さを解消しました。

また、東京メトロのコンテストから1年半経過し、一体どれだけの応募作品が今でも動いているのかの実態調査レポートも掲載しました。POSIX原理主義を用いないソフトウェアの保存の利かなさが露呈する結果になりました。(こんな結果で東京五輪観光客向けのアプリ開発促進計画は大丈夫なんでしょうか?)

通販もやってます

通常のコミケではないし……、遠いし……、行けないよ。という方もご安心を。通販やってます。この通販のためのプログラムは、本書で紹介したレシピをふんだんに活用し、シェルスクリプトで作られたものです。本書レシピの実力の程を確認するためにも、このサイトの通販を是非ご利用ください。(Safari等、このサイトのカゴ入れボタンがうまく機能しない方はコチラへ)

 

 

←カゴに商品が入っている時にこのボタンを押せば、レジへ移動します。

値引きをプログラミングする(売り方も作品の一部だ)

POSIX原理主義者割引き」はじめました

f:id:richmikan:20150719144455j:plain

書籍「すべてのUNIXで20年動くプログラムはどう書くべきか」を著者の通販サイト(ココのサイト)で購入されるお客様に、ささやかながら値引きを致します。

とはいっても商業本を値引きすることはできない決まりなので、元になった同人誌をセットで購入される方に、その同人誌の方を400円値引きします。

他の書店には絶対マネできないこの企画。是非下のボタンを2つともポチしてください。(Safariの方は本店でポチ!

商業版カゴ入れボタン同人版カゴ入れボタン

冊入っています

冊入っています

「分割金利手数料はすべて負担」はジャパネットたかたの『作品』

以前、あのジャパネットの高田社長が「ショッピングはエンターテインメントです」と言っていた。「分割金利手数料は店が負担」の第一人者だし、ハプニング覚悟で生放送を止めないし、高田社長は経営を引退しても未だに出演は続けている。

それらはまさに、エンターテインメントだという前提があるからであって、ジャパネットたかたはメーカーが作った作品(=製品)を売りながら、自分達が考案したショウ(=実演)や値引き(=分割金利手数料負担然り)という作品を売っているのだ。

つまり「値引き」とは店の作品の一つである。作品であるということは、値引きの仕方にもオリジナリティーがなくてはならない。客はオリジナリティーを感じるから、例え値引き額がさほどでなくても、その店を選ぶ。(実際、ジャパネットの価格も価格.comで見つかる最安店には敵わないことが多い。それでも売れる)

ネットショップ店主が独自の値引き企画を創設するのは難しいという現実

そうすると「なるほど、独自の値引き制度を考案するのも一つの手なのか!よし、やろう」と思う。ところが、多くのネットショップ店主にとってはそれが難しい。なぜなら、ネットショップ上で値引きを実施したければ、ショッピングカートプログラムにやらせなければならない。でも店主は基本的にプログラマーではないので、ショッピングカートで値引き販売をしたければ既製のものから選ぶしかない。結局それは店独自の「作品」ではない。

WordPressといったCMSなど、ページデザイン(店の内装)の制作にはある程度店独自にオリジナリティーを表現させるプログラムはあるのに、なぜ値引き制度という分野ではオリジナリティーを表現させるプログラムがないのか!

値引きルールをプログラミングで表現する

このような問題点に気付いたので私は自前のショッピングカートプログラムに値引き機能を実装してみた。もちろん、既製の値引き機能を作るのが目的ではない。導入する店主が独自の値引き企画を導入できる仕組みだ。

細かい話はヌキにして、どうやったかだけを記そうと思う。ちなみに、うちの自作ショッピングカートはシェルスクリプトで書かれている。

1) 買い物明細生成プログラム本体にフックを置く

値引き機能を入れ込む対象となるのは、買い物明細を生成するプログラムである。しかし、これを下手いじるとシステムそのものが復旧不可能なほどに壊れてしまうという問題がある。

そこで、開発者と店主がいじるべき領域の違いを明確化すべく、店主がいじるべきプログラムファイルは外出しし("$Homedir/CONFIG"というディレクトリーの中に"DISCOUNT_RULES.SHLIB"という名前で置くこととし)、存在すればインクルード(".":sourceコマンド)するようにした。→冒頭部分

######################################################################
# 初期設定
######################################################################

# --- このシステム(CART)のホームディレクトリー -----------------------
Homedir="$(d=${0%/*}/; [ "_$d" = "_$0/" ] && d='./'; cd "$d.."; pwd)"

# --- その他初期ディレクトリー等定義 ---------------------------------
[ -f $Homedir/CONFIG/DISCOUNT_RULES.SHLIB ] && { # 値引きルールライブラリー登録
  . $Homedir/CONFIG/DISCOUNT_RULES.SHLIB         # (存在すれば)
}
   :
   :
   :

# --- 小計を求め、レシートファイルに記入 -----------------------------
cat $Tmp-in_the_cart                                                            |
# 1:商品ID 2:カゴ入り数量                                                       #
join -1 1 -2 1 -o 2.1,1.2,1.3,1.4,1.5,1.6,1.7,2.2 $Tmp-productmaster -          |
# 1:商品ID 2:商品名(mojihameエンコ) 3:単価(+税表記含) 4:発売日 5:重さ厚さ       #
# 6:在庫情報体 7:URL 8:カゴ入り数量                                             #
if PATH='' type DISCOUNT_BEFORE_CALCULATING_TAX >/dev/null 2>&1; then           # 税金計算前の値引き
  DISCOUNT_BEFORE_CALCULATING_TAX                                               # (ルールが設定されている場合)
else                                                                            #
  cat                                                                           #
fi                                                                              |
awk '{print $1,$2,$7,$3,$8}'                                                    |
# 1:商品ID 2:商品名(mojihameエンコード) 3:URL 4:単価(+税表記含) 5:カゴ入り数量  #
awk 'BEGIN          {sotozei_target_amt = 0;                          }         #
     $4~/\+[Tt]$/   {zeinuki_unitprice = substr($4,1,length($4)-2);             #
                     sotozei_target_amt += zeinuki_unitprice*$5;                #
                     print $1,$2,$3,zeinuki_unitprice,$5,zeinuki_unitprice*$5;} #
     $4~/^-?[0-9]+$/{print $0,$4*$5;                                  }         #
     END            {tax = int(sotozei_target_amt*'"$TR_TAX_RATE"');            #
                     print "TAX 消費税(税別商品分) -", tax, 1, tax;}'           > $Tmp-reciept
# 1:商品ID 2:商品名(mojihameエンコード) 3:URL 4:単価(税抜) 5:カゴ入り数量 6:小計

上記のコードの後半部分は、明細テキストデータを生成している箇所だ。joinやawkをパイプで繋ぐといういかにもシェルスクリプトらしいコードである。

このコードの中盤に"DISCOUNT_BEFORE_CALCULATING_TAX"という謎のコマンドが出てくる。これが(消費税計算前に)値引きを行うためのプログラム(後述)なのだが、じつは外部コマンドではなくてシェル関数である。typeコマンドによってその存在を確かめてから、存在すれば実行し(パイプで通し)、存在しなければcatコマンドで到来データをそのまま通過させるというロジックだ。

if文ごとパイプに通せるのがいかにもシェルスクリプトでしょ?

2) 店主がいじる値引き実行用のシェル関数

明細生成プログラム本体はフックを入れただけなので、値引きを実行するプログラム本体は別にある。店主は、独自に考案した値引き企画を、この部分でシェルスクリプトという表現手段を用いて表現する。

店主は、値引きを企画したいのであれば $Homedir/CONFIG/DISCOUNT_RULES.SHLIB という名のファイルを用意し、DISCOUNT_BEFORE_CALCULATING_TAXというシェル関数を書く。

今回は、商業本(商品ID=pfb)と同人本(商品ID=ssr2)を同時購入した筋金入りのPOSIX原理主義者に向けた割り引きだが、それをプログラミングしたものが次のシェルスクリプトだ。

######################################################################
# 商品確認後、税計算前段階での値引き
######################################################################
#
# [使用方法]
# * 使いたい場合は、このシェル関数の名前を
#   "DISCOUNT_BEFORE_CALCULATING_TAX"
#   にして、下記の入出力の規則に則ってプログラムを書く。
# [入力]
# * 標準入力から次のデータが送られてくる
#   1:商品ID
#   2:商品名(mojihameエスケープ)
#   3:単価(外税商品は末尾に"+t"と書かれている)
#   4:発売日
#   5:重さ厚さ情報
#   6:在庫情報体(電子商品は"*")
#   7:商品URL(なければ"-")
#   8:カゴ入り数量
# [出力]
# * 標準出力に上記情報をそのまま通過させるのを忘れずに!!!!!
# * それに加えて、必要に応じて次の列を出力する。
#     1:値引ID("^DISC.[A-Za-z0-9_.-]*$"形式に合致すること。例、"DISC.campain1")
#     2:値引理由の名称(mojihameエスケープ)
#     3:値引単価
#       - 負値にすること!そうしなければ割増しになってしまう
#       - 外税商品の値引きをする場合は数字の直後に"+t"を付けると税も値引かれる
#     4:"-"(ダミー列につき無視されるので何でもよい)
#     5:"-"(ダミー列につき無視されるので何でもよい)
#     6:"-"(ダミー列につき無視されるので何でもよい)
#     7:値引理由を説明しているページがあればそのURL(無ければ"-")
#     8:適用数(第4列の名目を複数口適用したい場合はここを2以上にする)
#
DISCOUNT_BEFORE_CALCULATING_TAX() {

  awk '
  {
    # カゴに入っている商品IDとその単価・数量の登録をしながら出力
    pri[$1] = $3;
    qty[$1] = $8;
    print;
  }
  END {

    # 「POSIX原理主義者」割り引き
    # ・商品ID[ssr2]が存在する場合、商品ID[pfb]1冊につき400円値引く。
    # ・ただし値引き額の最大は、商品ID[ssr2]の小計である。
    if (("ssr2" in qty) && ("pfb" in qty)) {
      p = -400      ;
      q = qty["pfb"];
      if (p*q*(-1) > pri["ssr2"]*qty["ssr2"]) {
        p = pri["ssr2"]*qty["ssr2"]*(-1);
        q = 1;
      }
      print "DISC.POSIX POSIX原理主義本同時購入よる同人版値引き",p,"- - - -",q;
    }

  }
  '
}

実体はAWKのコードである。それがシェル関数でラッピングされているに過ぎない。

標準入力から、冒頭のコメントにある通りの仕様でカゴに入っている商品明細データが渡ってくるのでそれを標準出力へと素通りさせつつ、そのうしろに今回の値引きルールに基づく値引き項目を追加して標準出力へ送るのである。出力時のデータフォーマットも、冒頭に記されたコメントに従う。

値引きのためのプログラミング学習も、デザインのためのHTML学習と同程度にしたい

上記の解説はプログラミングに慣れた人にとってはさほど難しい話ではない。では、そうではない純粋な商売人にはどうだろうか?

確かに上記のようにして値引き実施コードを本体から切り離したものの、きちんと書かなければ本体も動かなくなるわけで完全に安全になったとは到底言えない。

しかし、ネットショップの内装(デザイン)を弄るためにHTMLやCMSを覚えことのがある程度受け入れられているのだから、その程度にまで敷居を下げさえすればよいと思うし、またできるはずだ。

それができなければ、個人のネットショップなど大手に潰されてしまう。

 

 

 

 

←カゴに商品が入っている時にこのボタンを押せば、レジへ移動します。

とある日本の自動車メーカーの社用車がベンツだった件と、シェルスクリプトの実用性を謳う本の通販サイトがPHPだった件の関係性

日本の自動車メーカーの社用車がベンツ?

「総務部総務課山口六平太」というマンガ知ってますか? 自動車会社に勤めるサラリーマンが主人公の話ですけど、日本の自動車メーカーなのに社用車がベンツというのがネタだったのです。

「車売ってる会社なのに、社長はベンツに乗ってんのかよ!」って、誰しもツッコミたくなりますよね。まぁ、あれは大日自動車株式会社という架空の会社ですけど、じゃあ実在の日本の自動車会社はどうかというと、あれ?いすゞ!。……まぁ、今や乗用車は作っていないですからね。(そもそも情報古いですし)

メーカー氏名社長車私用車
トヨタ 張 富士夫 センチュリークラウン プログレコロナ
ホンダ 吉野 浩行 レジェンド ラグレイト
日産 カルロス・ゴーン プレジデント セドリックエルグランド
マツダ マーク・フィールズ センティア RX-7
三菱 園部 考 ディグニィディ ギャランVR-4
ダイハツ 山田 隆哉 アルティス アルティス
スバル 竹中 恭二 レガシィB4 レガシィB4
スズキ 戸田 昌男 カルタスセダン なし
いすゞ 井田 義則 キャデラックコンコース ビックホーンアスカ

車の常識(15@僕のくるまさんのページより

自動車会社にとって社長の車といったら社の象徴なので、それが他社製だったら身も蓋もない話ですよね。

コンピューター言語の実用性を謳う本の販売サイトが他言語製

ところが、コンピューター言語においては、そんな身も蓋もない話が、誰にもツッコミを受けることなく行われてきました。シェルスクリプトのアプリ開発言語としての実用性を謳う本の通販サイトがPHPとか……、そりゃないでしょ。

いゃベンツだってPHPだっていい車や言語ですし、それに別に売るなってわけじゃないですよ。でも著者が、他言語で作られた販売サイトを宣伝する(しかできない)って何のジョークだ!と思うのです。

山口六平太の会社の社用車も自社製になった

でも、彼の会社の社用車がベンツだったのは初期の話。念願かなって今ではサザンという自社製のセダンになっています。

一方シェルスクリプト本は……?

つい昨日、念願かなって、シェルスクリプト製になりました。いや、今までも既に販売サイト自体はあったんですけど、今回めでたく商業本を私(著者)手作りのシェルスクリプト製販売サイトで取り扱えることになりました。C&R研究所さん、ありがとう!こういう柔軟さは大手には簡単には真似できませんね。

というわけでカゴ入れボタンを貼っておきますね。

f:id:richmikan:20150707222712j:plain

すべてのUNIX20年動くプログラムはどう書くべきか

~デプロイ・保守に苦しむエンジニア達へ送るシェルスクリプトレシピ集~

リアル リッチ・ミカン[著]、USP研究所[監]、C&R研究所[発行]

2015年7月24日 発売

本体2,500+税200円

A5版 2色刷 0x100頁

目次商品ページ

現在、カゴに冊入っています

(Safariをお使いの方はコチラ)

このサイト(はてなブログ)自体は、まず間違いなくシェルスクリプト製ではないでしょうけど、ショッピングカートのパーツ(カゴ入れ&レジボタン)はシェルスクリプト製ですからね。このショッピングカートプログラムの特長は、例え他言語CMSで作られたページでもショッピングサイトと化すことができるという点なのです。

だから、人気の出たブログ上でブログ主が商売も始めたいと思ってもわざわざ引っ越す必要がなくなるのです。便利でしょ?

ちなみに、本家の商品ページは現在、ウザい宣伝欄がくっついています(笑)。これもこのショッピングカートプログラムが本質的にCMSを選ばないから簡単にできる技。

 

 

 

 

←カゴに商品が入っている時にこのボタンを押せば、レジへ移動します。