Make logrotate cookbook for Chef possible to work on Ruby1.8

There is a great cookbook posted on GitHub to configure logrotation with Chef though, it may work on Ruby 1.9 or greater. My server Ruby1.8 installed couldn’t run its recipes.
I fixed a part of the cookbook so that it can also work on Ruby1.8:

https://gist.github.com/noradaiko/5219337.js

Diff is as follows:

--- a/cookbooks/logrotate/libraries/logrotate_config.rb
+++ b/cookbooks/logrotate/libraries/logrotate_config.rb
@@ -28,36 +28,46 @@ module CookbookLogrotate
       end
 
       def directives_from hash
-        hash.select { |k, v| DIRECTIVES.include?(k) && v }.keys
+                 Hash[ hash.select { |k, v| DIRECTIVES.include?(k) && v } ].keys
       end
 
       def values_from hash
-        hash.select { |k| VALUES.include? k }
+                 Hash[ hash.select { |k, v|
+                                 VALUES.include? k
+                         }
+                 ]
       end
 
       def paths_from hash
-        hash.select { |k| !(DIRECTIVES_AND_VALUES.include? k) }.inject({}) do | accum_paths, (path, config) |
-          accum_paths[path] = {
-            'directives' => directives_from(config),
-            'values' => values_from(config),
-            'scripts' => scripts_from(config)
-          }
+               pp hash
+        Hash[ hash.select { |k| !(DIRECTIVES_AND_VALUES.include? k) } ].inject({}) do | accum_paths, (path, config) |
+                 pp "----"
+          if config.instance_of?(Mash)
+            accum_paths[path] = {
+              'directives' => directives_from(config),
+              'values' => values_from(config),
+              'scripts' => scripts_from(config)
+            }
 
-          accum_paths
+                       pp accum_paths[path]
+            accum_paths
+          else
+            accum_paths
+                 end
         end
       end
 
       def scripts_from hash
-        defined_scripts = hash.select { |k| SCRIPTS.include? k }
-        defined_scripts.inject({}) do | accum_scripts, (script, lines) |
-          if lines.respond_to? :join
-            accum_scripts[script] = lines.join "n"
-          else
-            accum_scripts[script] = lines
-          end
+          defined_scripts = hash.select { |k| SCRIPTS.include? k }
+          defined_scripts.inject({}) do | accum_scripts, (script, lines) |
+            if lines.respond_to? :join
+              accum_scripts[script] = lines.join "n"
+            else
+              accum_scripts[script] = lines
+            end
 
-          accum_scripts
-        end
+            accum_scripts
+          end
       end
     end

Hope it helps.

冷たい購入手続き問題

お金を払うという事について、一つ気づきを得た。

コンビニなどでのどんな小さな買い物でも、どんなに急いでても、レジでは出来る限りありがとうって言うようにしてる。
俺にとってお金を払うとは、単なる仮想的価値の目的物への変換作業ではなく、提供者への感謝の気持ちの表明およびその気持ちの交換だ。
別の言い方をすると、お金を払うとは、言葉通りの物品取引というプラマイゼロ・それっきりのやりとりではなく、そこから感謝や親しみ、そして関係が発生して続く生産的な行為だと考えている。

自分がサービスでのマネタイズ(お金を儲けること)を考えるとき、ずっと引っかかっていた事があった。
それは、PCやスマフォなどの端末での買い物全てにおいて、「ありがとう」を言う瞬間が無いって事。
それってすっげぇ切ないやん。ありえへん。
アプリを買うときの、なんとも言えない冷たい手続き感の原因はそこだった。
そうだな、この問題を「冷たい購入手続き問題」と勝手に呼ぶ事にしよう。

話は脱線するが、AppStoreのユーザレビュー欄はアプリ提供者との双方向性が皆無で、ユーザの片思いな気持ちが充満している。
いいレビューをして下さった方々に、こちらからお礼の一言も言い返せない。
不具合報告や要望を書いて下さった方々に、なんの見解も示せない。
ひどい作りだと思う。
Appleはコミュニティ運営の方法論をもっと勉強した方がいい。

閑話休題。この冷たい購入手続き問題は、時折課金方法に悪影響を及ぼす。
シンボリックな例を一つ挙げよう。
フリーミアムモデルにおいて、「ストレスポイント」をいかに効果的に設けるかという議論がよくなされる。
フリーミアムモデルとは、無料で使える部分と有料で使える部分を併せ持ったサービスのビジネスモデルのこと。
ストレスポイントとは、無料で使える部分の機能的制約によってユーザにストレスを与える方法、および制約対象の機能のこと。
代表例は、標準だと広告が表示されて、お金を払うと広告なしで使える、などが挙げられる。
このストレスを解消するためにお金を払うとき、我々は感謝の念を抱いているだろうか?
俺は、悔しさに似た気持ちをたまに自覚する。
なんて非生産的な課金方法なんだろう。
感謝を言う瞬間が無いって事は、先に述べた、お金を払う行為の意義が欠損する事ではない。
端末上での課金を主軸としたビジネスモデルでは、往々にしてお金を払う事に対する生産的側面が(意図せずとも)薄れ失われているように思えてならない。
もちろん、全てじゃない。

自分が端末で動くサービスを提供している以上、この冷たい購入手続き問題と向き合わなければならない。
何も具体的な答えは出てないし、失敗したり間違うかもしれないけど、設計理念は明確になった。
それは、感謝の気持ちをもってお金を気持ちよく出してもらえるような課金体系を作るって事だ。
当たり前っちゃそうなんだが、ブレる心配が無くなった。

ユーザ端末から貞子みたいに顔出してお礼言えたらいいのにね(こわい)。

Chef installation problem: chef-solr depends on solr-jetty which is not in apt repository on Debian squeeze

When I was trying to install chef-server on Debian(squeeze) through this guide, I got a package dependency error like following:

~# aptitude install chef chef-server
The following NEW packages will be installed:
binutils{a} build-essential{a} bzip2{a} ca-certificates-java{a} chef chef-expander{a} chef-server chef-server-api{a}
chef-server-webui{a} chef-solr{ab} couchdb{a} cpp{a} cpp-4.4{a} dbus{a} default-jre-headless{a} dpkg-dev{a} erlang-base{a}
erlang-crypto{a} erlang-inets{a} erlang-mnesia{a} erlang-os-mon{a} erlang-public-key{a} erlang-runtime-tools{a} erlang-snmp{a}
erlang-ssl{a} erlang-syntax-tools{a} erlang-tools{a} erlang-webtool{a} erlang-xmerl{a} fakeroot{a} fontconfig{a} fontconfig-config{a}
g++{a} g++-4.4{a} gcc{a} gcc-4.4{a} java-common{a} javascript-common{a} libabstract-ruby1.8{a} libaddressable-ruby{a}
libalgorithm-diff-perl{a} libalgorithm-diff-xs-perl{a} libalgorithm-merge-perl{a} libamqp-ruby{a} libasound2{a} libasyncns0{a}
libaudio2{a} libavahi-client3{a} libavahi-common-data{a} libavahi-common3{a} libboost-dev{a} libboost1.42-dev{a} libbunny-ruby{a}
libbunny-ruby1.8{a} libc-dev-bin{a} libc6-dev{a} libcap2{a} libcoderay-ruby{a} libcoderay-ruby1.8{a} libcups2{a}
libdaemons-ruby1.8{a} libdb4.7{a} libdbus-1-3{a} libdep-selector-ruby{a} libdpkg-perl{a} libdrm-intel1{a} libdrm-radeon1{a}
libdrm2{a} libem-http-request-ruby{a} liberubis-ruby{a} liberubis-ruby1.8{a} libescape-utils-ruby{a} libeventmachine-ruby{a}
libeventmachine-ruby1.8{a} libexpat1{a} libextlib-ruby{a} libextlib-ruby1.8{a} libfast-xs-ruby{a} libffi-ruby1.8{a} libffi5{a}
libflac8{a} libfontconfig1{a} libfssm-ruby1.8{a} libgecode-dev{a} libgecode27{a} libgl1-mesa-dev{a} libgl1-mesa-dri{a}
libgl1-mesa-glx{a} libglib2.0-0{a} libglib2.0-data{a} libglu1-mesa{a} libglu1-mesa-dev{a} libgmp3c2{a} libgomp1{a} libhaml-ruby1.8{a}
libhighline-ruby{a} libhighline-ruby1.8{a} libhmac-ruby1.8{a} libice6{a} libicu44{a} libinotify-ruby1.8{a} libjpeg62{a}
libjs-jquery{a} libjson-ruby{a} libjson-ruby1.8{a} liblcms1{a} libmerb-assets-ruby{a} libmerb-assets-ruby1.8{a}
libmerb-core-ruby1.8{a} libmerb-haml-ruby{a} libmerb-haml-ruby1.8{a} libmerb-helpers-ruby{a} libmerb-helpers-ruby1.8{a}
libmerb-param-protection-ruby{a} libmerb-param-protection-ruby1.8{a} libmime-types-ruby{a} libmixlib-authentication-ruby{a}
libmixlib-authentication-ruby1.8{a} libmixlib-cli-ruby{a} libmixlib-cli-ruby1.8{a} libmixlib-config-ruby{a}
libmixlib-config-ruby1.8{a} libmixlib-log-ruby{a} libmixlib-log-ruby1.8{a} libmng1{a} libmoneta-ruby{a} libmoneta-ruby1.8{a}
libmozjs2d{a} libmpfr4{a} libmysqlclient16{a} libnet-ssh-gateway-ruby1.8{a} libnet-ssh-multi-ruby{a} libnet-ssh-multi-ruby1.8{a}
libnet-ssh2-ruby{a} libnet-ssh2-ruby1.8{a} libnspr4-0d{a} libnss3-1d{a} libogg0{a} libohai-ruby{a} libohai-ruby1.8{a}
libopenid-ruby{a} libopenid-ruby1.8{a} libpcre3{a} libphonon4{a} libpng12-0{a} libpolyglot-ruby{a} libpthread-stubs0{a}
libpthread-stubs0-dev{a} libpulse-mainloop-glib0{a} libpulse0{a} libqt4-assistant{a} libqt4-dbus{a} libqt4-designer{a} libqt4-dev{a}
libqt4-help{a} libqt4-multimedia{a} libqt4-network{a} libqt4-opengl{a} libqt4-opengl-dev{a} libqt4-qt3support{a} libqt4-script{a}
libqt4-scripttools{a} libqt4-sql{a} libqt4-sql-mysql{a} libqt4-svg{a} libqt4-test{a} libqt4-webkit{a} libqt4-xml{a}
libqt4-xmlpatterns{a} libqtcore4{a} libqtgui4{a} librack-ruby{a} librack-ruby1.8{a} librb-inotify-ruby1.8{a} libreadline5{a}
librestclient-ruby{a} librestclient-ruby1.8{a} libruby1.8{a} libsctp1{a} libsm6{a} libsndfile1{a} libstdc++6-4.4-dev{a}
libsystemu-ruby1.8{a} libtiff4{a} libtimedate-perl{a} libtreetop-ruby{a} libuuidtools-ruby{a} libuuidtools-ruby1.8{a} libvorbis0a{a}
libvorbisenc2{a} libx11-dev{a} libxau-dev{a} libxcb1-dev{a} libxdamage1{a} libxdmcp-dev{a} libxfixes3{a} libxi6{a} libxml-ruby1.8{a}
libxml2{a} libxrender1{a} libxt6{a} libxtst6{a} libxxf86vm1{a} libyajl-ruby{a} linux-libc-dev{a} lksctp-tools{a} make{a}
manpages-dev{a} merb-core{a} mesa-common-dev{a} mysql-common{a} ohai{a} openjdk-6-jre-headless{a} openjdk-6-jre-lib{a} patch{a}
perl{a} perl-modules{a} qt4-qmake{a} qt4-qtconfig{a} rabbitmq-server{a} rake{a} ruby{a} ruby-ipaddress{a} ruby-mixlib-shellout{a}
ruby1.8{a} ruby1.8-dev{a} rubygems{a} rubygems1.8{a} sgml-base{a} shared-mime-info{a} thin{a} thin1.8{a} ttf-dejavu-core{a}
tzdata-java{a} unzip{a} wwwconfig-common{a} x11-common{a} x11proto-core-dev{a} x11proto-input-dev{a} x11proto-kb-dev{a} xml-core{a}
xtrans-dev{a} zip{a}
0 packages upgraded, 243 newly installed, 0 to remove and 0 not upgraded.
Need to get 176 MB of archives. After unpacking 556 MB will be used.
The following packages have unmet dependencies:
chef-solr: Depends: solr-jetty (>= 1.4.0) which is a virtual package.
The following actions will resolve these dependencies:

Keep the following packages at their current version:
1) chef-expander [Not Installed]
2) chef-server [Not Installed]
3) chef-server-api [Not Installed]
4) chef-server-webui [Not Installed]
5) chef-solr [Not Installed]

Accept this solution? [Y/n/q/?]

It seems that solr-jetty does not exist in APT repos. However it’s listed in the repos for sid.
According to this page, we can use the repos for squeeze by opscode.
Thus just add this line to /etc/apt/sources.list:

deb http://apt.opscode.com/ squeeze main

Then I’ve got solved the problem. Following is the result:

~# aptitude update
~# aptitude install chef chef-server
The following NEW packages will be installed:
ant{a} ant-optional{a} apache2-utils{a} binutils{a} build-essential{a} bzip2{a} ca-certificates-java{a} chef chef-expander{a}
chef-server chef-server-api{a} chef-server-webui{a} chef-solr{a} couchdb{a} cpp{a} cpp-4.4{a} dbus{a} default-jre-headless{a} defoma{a}
dpkg-dev{a} erlang-base{a} erlang-crypto{a} erlang-inets{a} erlang-mnesia{a} erlang-os-mon{a} erlang-public-key{a}
erlang-runtime-tools{a} erlang-snmp{a} erlang-ssl{a} erlang-syntax-tools{a} erlang-tools{a} erlang-webtool{a} erlang-xmerl{a}
fakeroot{a} fontconfig{a} fontconfig-config{a} g++{a} g++-4.4{a} gcc{a} gcc-4.4{a} gcj-4.4-base{a} gcj-4.4-jre-lib{a} glassfish-mail{a}
hicolor-icon-theme{a} java-common{a} javascript-common{a} jetty{a} jsvc{a} libabstract-ruby1.8{a} libaccess-bridge-java{a}
libaccess-bridge-java-jni{a} libaddressable-ruby{a} libalgorithm-diff-perl{a} libalgorithm-diff-xs-perl{a} libalgorithm-merge-perl{a}
libamqp-ruby{a} libapr1{a} libaprutil1{a} libasound2{a} libasyncns0{a} libatk1.0-0{a} libatk1.0-data{a} libaudio2{a} libavahi-client3{a}
libavahi-common-data{a} libavahi-common3{a} libbcel-java{a} libboost-dev{a} libboost1.42-dev{a} libbunny-ruby{a} libbunny-ruby1.8{a}
libc-dev-bin{a} libc6-dev{a} libcairo2{a} libcap2{a} libcoderay-ruby{a} libcoderay-ruby1.8{a} libcommons-beanutils-java{a}
libcommons-codec-java{a} libcommons-collections3-java{a} libcommons-compress-java{a} libcommons-csv-java{a} libcommons-daemon-java{a}
libcommons-dbcp-java{a} libcommons-digester-java{a} libcommons-fileupload-java{a} libcommons-httpclient-java{a} libcommons-io-java{a}
libcommons-logging-java{a} libcommons-pool-java{a} libcups2{a} libdaemons-ruby1.8{a} libdatrie1{a} libdb-je-java{a} libdb4.7{a}
libdb4.7-java{a} libdb4.7-java-gcj{a} libdbus-1-3{a} libdep-selector-ruby{a} libdpkg-perl{a} libdrm-intel1{a} libdrm-radeon1{a}
libdrm2{a} libecj-java{a} libem-http-request-ruby{a} liberubis-ruby{a} liberubis-ruby1.8{a} libescape-utils-ruby{a}
libeventmachine-ruby{a} libeventmachine-ruby1.8{a} libexpat1{a} libextlib-ruby{a} libextlib-ruby1.8{a} libfast-xs-ruby{a}
libffi-ruby1.8{a} libffi5{a} libflac8{a} libfont-freetype-perl{a} libfontconfig1{a} libfontenc1{a} libfssm-ruby1.8{a} libgcj-bc{a}
libgcj-common{a} libgcj10{a} libgecode-dev{a} libgecode27{a} libgeronimo-jta-1.0.1b-spec-java{a} libgif4{a} libgl1-mesa-dev{a}
libgl1-mesa-dri{a} libgl1-mesa-glx{a} libglib2.0-0{a} libglib2.0-data{a} libglu1-mesa{a} libglu1-mesa-dev{a} libgmp3c2{a}
libgnuinet-java{a} libgnujaf-java{a} libgnumail-java{a} libgomp1{a} libgtk2.0-0{a} libgtk2.0-bin{a} libgtk2.0-common{a}
libhaml-ruby1.8{a} libhighline-ruby{a} libhighline-ruby1.8{a} libhmac-ruby1.8{a} libice6{a} libicu44{a} libicu4j-java{a}
libinotify-ruby1.8{a} libjasper1{a} libjaxp1.3-java{a} libjaxp1.3-java-gcj{a} libjetty-extra{a} libjetty-extra-java{a} libjetty-java{a}
libjline-java{a} libjpeg62{a} libjs-jquery{a} libjson-ruby{a} libjson-ruby1.8{a} libjtidy-java{a} liblcms1{a} liblog4j1.2-java{a}
liblog4j1.2-java-gcj{a} liblucene2-java{a} libmerb-assets-ruby{a} libmerb-assets-ruby1.8{a} libmerb-core-ruby1.8{a} libmerb-haml-ruby{a}
libmerb-haml-ruby1.8{a} libmerb-helpers-ruby{a} libmerb-helpers-ruby1.8{a} libmerb-param-protection-ruby{a}
libmerb-param-protection-ruby1.8{a} libmime-types-ruby{a} libmixlib-authentication-ruby{a} libmixlib-authentication-ruby1.8{a}
libmixlib-cli-ruby{a} libmixlib-cli-ruby1.8{a} libmixlib-config-ruby{a} libmixlib-config-ruby1.8{a} libmixlib-log-ruby{a}
libmixlib-log-ruby1.8{a} libmng1{a} libmoneta-ruby{a} libmoneta-ruby1.8{a} libmozjs2d{a} libmpfr4{a} libmx4j-java{a} libmysqlclient16{a}
libnet-ssh-gateway-ruby1.8{a} libnet-ssh-multi-ruby{a} libnet-ssh-multi-ruby1.8{a} libnet-ssh2-ruby{a} libnet-ssh2-ruby1.8{a}
libnspr4-0d{a} libnss3-1d{a} libogg0{a} libohai-ruby{a} libohai-ruby1.8{a} libopenid-ruby{a} libopenid-ruby1.8{a} libpango1.0-0{a}
libpango1.0-common{a} libpcre3{a} libphonon4{a} libpixman-1-0{a} libpng12-0{a} libpolyglot-ruby{a} libportlet-api-2.0-spec-java{a}
libpthread-stubs0{a} libpthread-stubs0-dev{a} libpulse-mainloop-glib0{a} libpulse0{a} libqt4-assistant{a} libqt4-dbus{a}
libqt4-designer{a} libqt4-dev{a} libqt4-help{a} libqt4-multimedia{a} libqt4-network{a} libqt4-opengl{a} libqt4-opengl-dev{a}
libqt4-qt3support{a} libqt4-script{a} libqt4-scripttools{a} libqt4-sql{a} libqt4-sql-mysql{a} libqt4-svg{a} libqt4-test{a}
libqt4-webkit{a} libqt4-xml{a} libqt4-xmlpatterns{a} libqtcore4{a} libqtgui4{a} librack-ruby{a} librack-ruby1.8{a}
librb-inotify-ruby1.8{a} libreadline5{a} libregexp-java{a} librestclient-ruby{a} librestclient-ruby1.8{a} libruby1.8{a} libsctp1{a}
libservlet2.5-java{a} libslf4j-java{a} libsm6{a} libsndfile1{a} libstdc++6-4.4-dev{a} libsystemu-ruby1.8{a} libthai-data{a} libthai0{a}
libtiff4{a} libtimedate-perl{a} libtomcat6-java{a} libtreetop-ruby{a} libuuidtools-ruby{a} libuuidtools-ruby1.8{a} libvorbis0a{a}
libvorbisenc2{a} libx11-dev{a} libxau-dev{a} libxcb-render-util0{a} libxcb-render0{a} libxcb1-dev{a} libxcomposite1{a} libxcursor1{a}
libxdamage1{a} libxdmcp-dev{a} libxerces2-java{a} libxerces2-java-gcj{a} libxfixes3{a} libxfont1{a} libxft2{a} libxi6{a} libxinerama1{a}
libxml-commons-external-java{a} libxml-ruby1.8{a} libxml2{a} libxrandr2{a} libxrender1{a} libxt6{a} libxtst6{a} libxxf86vm1{a}
libyajl-ruby{a} linux-libc-dev{a} lksctp-tools{a} make{a} manpages-dev{a} merb-core{a} mesa-common-dev{a} mime-support{a}
mysql-common{a} ohai{a} openjdk-6-jre{a} openjdk-6-jre-headless{a} openjdk-6-jre-lib{a} patch{a} perl{a} perl-modules{a} python{a}
python-minimal{a} python2.6{a} python2.6-minimal{a} qt4-qmake{a} qt4-qtconfig{a} rabbitmq-server{a} rake{a} ruby{a} ruby-ipaddress{a}
ruby-mixlib-shellout{a} ruby1.8{a} ruby1.8-dev{a} rubygems{a} rubygems1.8{a} sgml-base{a} shared-mime-info{a} solr-common{a}
solr-jetty{a} thin{a} thin1.8{a} ttf-dejavu-core{a} ttf-dejavu-extra{a} tzdata-java{a} unzip{a} wwwconfig-common{a} x-ttcidfont-conf{a}
x11-common{a} x11proto-core-dev{a} x11proto-input-dev{a} x11proto-kb-dev{a} xfonts-encodings{a} xfonts-utils{a} xml-core{a}
xtrans-dev{a} zip{a}
0 packages upgraded, 338 newly installed, 0 to remove and 0 not upgraded.
Need to get 258 MB of archives. After unpacking 749 MB will be used.
Do you want to continue? [Y/n/?]

Automatically loading iPhone 5-sized images where required

You’ll be familiar with the way that [UIImage imageNamed:] automatically loads @2x versions of images when running on a retina device.
Unfortunately, imageNamed: will NOT automatically load -586h@2x versions of images when running on an iPhone 5.

Sometimes this doesn’t matter, for example icons and non-full screen graphics are probably the same on iPhone 4 & 5. However, if you have full-screen background images, or full-width / height background images for toolbars etc you will have problems. Your 480-high images will most likely get stretched (and will probably look horrid as a result).

There is a better way to load automatically -586@2x versions of images(if available) than manually checking the screen size.
Here is a category named Retina4 of UIImage to do exactly this thing.

https://gist.github.com/3784303.js?file=UIImageRetina4.h

https://gist.github.com/3784303.js?file=UIImageRetina4.m

This code is originally made by Benjamin Stahlhood though I fixed below problems that are existed in original version.

  • Replacing imageNamed: method for retina4 is executed multiple times. So retina4ImageNamed: is never called in some cases.
  • The scale property of UIImage is set to 1.0f instead of 2.0f because the filename is specified with “@2x”.

at Machiya

荒川の河川敷で花火した。
虫の音を聴きながらまったりやる花火もなかなかいい。

町屋は都電が走っていた。
なんかの機会に乗ってみたい。目的地は、旅館で。

後輩が持ってた二眼レフ。覗かしてもろた。

パカッと開いたところ。

相変わらずええ趣味しとる。

羽衣ねぶた祭

羽衣ねぶた祭

ねぶた祭といえば青森のイメージが強かったけど、実は青森以外でも行われている事を知った。
羽衣ねぶた祭は、東京は立川の羽衣町で行われている祭。
人もそこそこでゆっくり楽しめた。
あと出店のクオリティが高い。全部美味い。
ねぶたは迫力があった。
これって毎年作ってるんだろうか。手作りで。
職人技ですな。
最後の写真は宝石すくい。