Browse Category: emacs

ruby/rails for REE のオフライン環境を整える

ruby/railsでオフライン環境を整える – p0t にある方法を REE(Ruby Enterprise Edition)  20090610 版で試してみた。

前提として、REE は /opt/local/ruby-enterprise-1.8.6-20090610/ にインストールされていて、/opt/ruby にシンボリックリンクをはっている。通常のユーザのパスは /opt/local/bin/ruby が最優先になっている。

まずは Ruby。基本的に p0ts さんの方法でよいが念のためというか、そのままオンラインになることも多いので localhost からのみ接続を許可するようにした。

<VirtualHost * *:443>
ServerName ruby
DocumentRoot “/Users/naoya/w/help/ruby-man-html”

ErrorLog “logs/ruby-error_log”
CustomLog “logs/ruby-access_log” combined

<Location />
Order Deny,Allow
Allow from 127.0.0.1
Deny from All
</Location>
</VirtualHost>

次に gem server は、p0t さんの方法と同じだけど、mislav-hanna は github の rubygems にあるので、次のコマンドでインストールする。

$  sudo gem install mislav-hanna –source http://gems.github.com

ただし、rdoc 2.4 でなく、2.3 を必要するので、rdoc を本家からダウンロードしてインストールする。

$ wget http://rubyforge.org/frs/download.php/50957/rdoc-2.3.0.gem

$  sudo gem install -f rdoc-2.3.0.gem

$ /opt/ruby/bin/rdoc –version

rdoc 2.3.0

そして、hanna テンプレートの設定は root ユーザの .gemrc を変更した。理由は、ローカルに rubygems リポジトリのミラーが作ってあるから。

$ sudo vi ~root/.gemrc

rdoc: –inline-source –line-numbers –format=html –template=hanna
gem: –backtrace –source http://rubygems/

rdoc を再生成する。

$  sudo gem rdoc –all –no-ri

Installing RDoc documentation for merb-slices-1.0.11…
Installing RDoc documentation for actionmailer-2.0.2…
Installing RDoc documentation for memcached-0.14…
error while writing to #<File:classes/Rlibmemcached/MemcachedSt.html>
ERROR:  While executing gem … (NoMethodError)
private method `sub’ called for nil:NilClass

ちょっとエラーが出ているが気にしない方向で。。。

gems もローカルからのみ接続許可する。インクリメンタル検索がかなりよさげ。

<VirtualHost * *:443>
ServerName gems
DocumentRoot “/Users/naoya/prj/htdocs/sinatra-rubygems/public”

<Directory /Users/naoya/prj/htdocs/sinatra-rubygems/public*>
Allow from All
</Directory>

ErrorLog “logs/gems-error_log”
CustomLog “logs/gems-access_log” combined

<Location />
Order Deny,Allow
Allow from 127.0.0.1
Deny from All
</Location>
</VirtualHost>

最後に gem ミラーを作る。まず、builder が必要なのでインストールする。

$ sudo /opt/ruby/bin/gem install builder

そして、設定ファイルを記述する。gem のミラーには時間がかかる。

$ sudo vi ~root/.gemmirrorrc


– from: http://gems.rubyforge.org
to: /opt/rubygems/rubyforge/

$ sudo mkdir /opt/rubygems

$  sudo /opt/ruby/bin/gem mirror && sudo gem generate_index -d /opt/rubygems

github の rubygems もミラーしようとしたがエラーが出てしまいうまくいかなかった。

$  sudo vi ~root/.gemmirrorrc


#- from: http://gems.github.com/
#  to: /opt/rubygems/github/
– from: http://gems.rubyforge.org
to: /opt/rubygems/rubyforge/

$ sudo /opt/ruby/bin/gem mirror

fetching: http://gems.github.com//Marshal.4.8.Z
ERROR:  While executing gem … (ArgumentError)
comparison of String with 3 failed

よし、これで環境が整ったはずなので、いつでもオフライン環境になれる。

Velocity 2009

Velocity 2009 に無事申し込んで、航空券とホテルの確保、はじめての一人渡米なので SFO から San Jose までの行き方を調べました。SFO から San Jose までは、Google Maps の道案内を信じて行ってみたいと思います。Velocity は高価だけあって、全日程のランチが含まれています。

さて、Velocity 2009 に参加するセッションを決めたので、紹介しておきます。

一日目 – 6/22(月)
一日目は、ワークショップの枠組で開催されます。
9:00am: Death of a Web Server: Crisis in Cashing

我々のウェブサーバ郡は、うまくいかなかったとき何が悪いのか教えてはくれない。このワークショップでは高負荷時にウェブサーバが落ちてしまったときの様子を見ることができるだろう。その負荷テストをライブでみることでサーバがあるステージで落ちてしまうのを見ることができるだおう。そして、どういうときに失敗するのかを明かにすることで解決の糸口が分かるだろう。例えば、コードを変更したとき、設定を変更したとき、ハードウェアを変更したときなど。このワークショップを通じて、もし「なぜウェブサイトはこんなにも重いのか」という質問に答えられるようになるだろう。

11:00am: Introduction to Managed Infrastructure with Puppet

Puppet は、Ruby で書かれている人気のあるオープンソースのサーバ管理ソリューションです。このワークショップでは、Puppet のインストール、いくかのサービスを管理する方法や Puppet を使ってシンプルに問題を解決できるデモを行います。

Puppet は普段から愛用していますので、このワークショップで Puppet を開発している Luke Kanies さんに会えるのがとても楽しみです。

1:45pm: Hadoop Operations: Managing Big Data Clusters

Hadoop と MapReduce は、蓄積されていて増え続けているログやセンサーデータ生成されたコンテンツやフィードなどの巨大なデータを処理することを可能にしてくれる。

Cluudera, Inc で、我々は世界中各地にある団体などで同じプロセス「プロダクション並列環境で小さな Hadoop クラスター上で研究プロジェクトを開始して、その上オペレーションチームにとって新しい負担になっていること」を目撃した。信頼できる管理するためのツールの数とスケーラブルな Hadoop のインストール方法は Hadoop の活気のあるユーザコミュニティによって提供されている。これらのコミュニティにはメジャーな貢献者である Yahoo! や Facebook や IBM 研究所が含まれている。
セッションを通じて、私たちが管理しているクラスターからの苦労話を共有できるだろう。それらは 10 から 1000 ノードにスケールした Hadoop での特別なコツやトリックである。詳細には次の内容をカバーしている。

  • クラスターのセットアップ:どうやって始めればよいか?安定版のバイナリはどこから見つければよいか?どうやって自分のシステムのイメージするか?どうやってマスターやスレーブや他の逸脱したトラックを保てばよいか?
  • モニタリングと通知:どうやったクラスターが問題なく動いていることを知ることができるか?Hadoop をモニターするツールには何を使うのが一番良いか?自分のクラスターでモニタリングシステムをスケールすることができる助けとなるコツは何か?
  • アップグレード:Hadoop はとても速いリリースサイクルをとっている。いつアップグレードするべきか?スムーズにアップグレードするには?ユーザにどのくらいのインパクトがあるか?
  • 最適化:100 台のサーバが 60 か 160 のどちらのパフォーマンスになっているか?それを知る方法は?50 のチューニングパラメータは何を意味するのか?

3:45pm: Scalable Internet Architectures

Scalble Internet Architectures という書籍を書いた Theo Schlossnagle 氏によるワークショップです。

伝統的なウェブアーキテクチャーの内部にどっぷり浸かりながら議論します。実際の生活アーキテクチャーを見てみると、弱点を見ることができ Digg や NYTimes や MSN のような大規模サイト(あるいはトラフィックが 30 秒間で 15 Mbps から 1 Gbps に跳ね上がったとき)で長期に渡って発覚した強烈な重荷として起こるであろうことを議論できるだろう。

フレンドリーな雰囲気で、ここ1年で実際に使ったできるさまざまな逸話や苦労話や良い悪いデザインやコツなどを楽しむことができるだろう。

8:00pm: Ignite Velocity

BOF みたいなもので LT のようです。すでに締め切っていますが、内容が公開されていません。

二日目 – 6/23(火)

午前中は、キーノートです。

8:30am: オープニングキーノートFacebook Keynote2 Years Later, Loving and Hating the CloudSurviving the 2008 Elections

Google の Steve Souders 氏と O’Reilly Rader & Opscode の Jesse Robbins 氏のとオープニングキーノート「ようこそ Velocity 2009 へ」。

続けて、Facebook のテクニカルオペレーションの副リーダーの Jonathan Heilgher 氏のキーノート。

そして、picnik.com でのクラウドを使った良い点と悪い点について。

最後に、dailykos.com の Jeremy Bingham 氏による MySQL の最適化、lighttpd を動かしてパフォーマンスを向上させるカスタムモジュールを lighttpd へ組み込む方法、など。

10:40am: Fixing Twitter など

twitter のパフォーマンス向上とそのスケーラビリティについての講演です。これはかなり興味深いです。

Twitter (twitter.com) は、「今何している?」という質問に答えているユーザたちのマイクロブログサービスです。それは単純な 140 文字の文字列(a tweet)で表現されていてユーザのフロー(あるいは友達)たちに伝えています。

数年を経て Twitter は数百万のユーザたちが使うサイトにスケールする挑戦を体験してきました。ROR をホスティングすることからたくさんのスケールする挑戦に出会い、コミュニティーと我々の体験を共有したいと思います。

次のトピックが含まれています。

  • ROR を本番環境で使うときのベストプラクティス
  • パフォーマンスにインパクトをあたえる制限の割合について
  • API が通常のウェブで使われると同じことができるときどうすればよいか
  • 非同期と同期処理について
  • なぜディスクは新しいテープなのか
  • キャッシュ手法と Twitter でのオープンソース効果
  • なぜデータベースはすべての問題に対するもっともよい解決方法ではないのか
  • メッセージキュー
  • Thrift を使った巨大なログのハンドリング
  • 弱点を見つけてはその問題を直してさらに次の弱点を見つけるその繰り返しでスケーリングを強化する

1:00pm: 10+ Deploys Per Day: Dev and Ops Cooperation at Flickr

「先週、18 人によって 496 の変更が行われて 67 回のデプロイがされまいた」- Flickr 開発ブログ 2008/12/17。

新しいコードをデプロイするためにプロジェクトを計画したり、管理上のリスクを考えたり、開発とオペレーションとの間でのコミュニケーションと協調はもっとも重要なことです。ウェブインフラは成長してくると、システムとソフトウェアとの間はほとんどはっきりしなくなります。

よりよい Flickr の混在したルールはなぜどのようにできたのかについて話します。

大きな赤いデプロイボタン(Big Red Deploy Button)を健全に保つために有効なツールやテクニックや文化や伝統的なプロセスを議論しましょう。

個人的にもっとも楽しみなセッションの一つです。

1:45pm: Scaling for the Expected and Unexpected

たくさんの人たちとスケーリングとパフォーマンスについて話します。しかし、起こるすべてのことに対して準備できないでしょうか?それらはさまざまな問題を抱えていてそれを解決するソリューションは一つではありません。

すべてのことはよくなったり BAM(?) だったりします。あなたのサイトが Yahoo! のトップページからリンクされたとき何ができるでしょうか?どうやって突発的な大きなトラフィックを捌くことができますか?秒間リクエスト数が通常の5倍になります。サーバ群の CPU は急増します。デーモンは最大限まで稼働しています。回線帯域を越えてしまいます。どうやったこれからのことに対処することができますか?これからの突発的なことに対したどんなツールやテクニックがありますか?

あるいはあなたのサイトがみんなに発見されることは年々トラフィックが 70% から 80% に成長しておきます。これは1ヶ月で 100 万ページビューだったのが 2 年間で 300 万近くになるということです。どうやったこれらの計画を立てればよいでしょうか?2年間ごとにアーキテクチャーを再設計することおは望まないはずです。

それらのシナリオには銀の弾はありません、さまざまな状況を通じて手に入れた助けがたくさんのサイトで使われている技術があります。このセッションではこれらのいくつかの技術をカバーして準備などについて話します。

2:30pm: Infrastructure in the Cloud Era

Chef の作成者による講演です。

ウェブオペレーションは、その都度のメジャーなトレンドの最先端は常に動きつづけています。最近、急増しているのはインフラの全自動化です。素早く軽量な設備や統合された管理路線、ささいなアプリケーション開発です。

複数のオープンソースツール(ChefNanite や CouchDB や RabbitMQ など)を最大限に組わせるとテクニック同士の戦いがテストされます。アダムとイザベラはどのようにして管理を簡単にしたり、アプリケーションと融合したり、自身でドキュメントを作成したりするのを見ることができるでしょう。この道に沿っていけばビジネスに使えるこれからの技術から最大限の手助けを手に入れる必要性のヒントを与えられるでしょう。

講演者はこの世界でよく知られた二つの会社が来ます。Engine Yard は非常にすばらしい名声をもった独自の内部的なホスティングからクラウドへ移しました。Opscode はインフラの自動化をもたらしています。彼らは「Chef」を作成しました。「Chef」はスタートアップ向けにインフラの完全な自動化を構築する体験ができるツールです。

3:40pm: Migrating www.aol.com rom a Proprietary Web Platfrom to Open Source

aol.com でレガシーシステムをオープンソースを含んだ新しいアプリケーションスタックに置き換えたときに話です。アプリケーションアプリケーションの設計、スケーリングとキャパシティの計画、ツール、ネットワーク設計など。

4:25pm: 3本立てで Building OpenDNS Stats, Machines or MegaWatts, Best I/O is No I/O

45分なので、15分ずつのセッションのはずです。OpenDNS の状態について OpenDNS はバックエンドで MySQL と memcached を使っている、Yahoo! の人によるマシンの消費電力について、MySQL のデータをメモリにあわせてディスク I/O を減らす方法

5:30pm: Load Balancing Roudup

Six Apart の人によるいくつかあるロードバランサーのアルゴリズムについて。ラウンドロビンな L4 ロードバランサーから最小コネクションあるいは重み付けがあるちょっと賢い L4 ロードバランサーから L7 ロードバランサー、Perlbal まで。人気のあるオープンソースのロードバランサーの実装ついての話。

6:15pm: レセプション

最終日 – 6/24(水)

午前中はキーノートです。

8:30am: ようこそキーノート by Marissa Mayer (Google)パーフォマンスツール by Eric Goldsmith (AOL), Simon Perkins (Simtec Limited), Stoyan Stefanov (Yahoo! Inc), Jim Pierson (Microsoft), Jan Odvarko (Freelance)

オープニングキーノートは毎日あるんですね。それにしても朝早い。さすがはアメリカ。

Google の Marissa 氏のキーノートがあって驚きました。

パフォーマンスツールでは、AOL PageTest, HttpWatch, YSlow 2.0, and Visual Round Trip Analyzer などのツールについて紹介があるみたいです。

10:40am: World’s Simplest Latency Simulator

Aptimize ソフトウェアが世界中でもっともシンプルな潜在するシミュレーターを紹介します。オープンソースなブラウザに追加することによってネットワークの潜在効果をシミュレートすることができます。使うのは単純でとても簡単です。プロではない人向けにデザインされていて開発者やオペレーターや営業の人たちがインターネットごしあるいは WAN を通じてどのくらいウェブサイトが速いのか遅いのかすぐに見ることができます。

11:45am: The Rackspace Cloud

内容未定ですが、タイトルから推測するとクラウド環境下でのラックスペースについての講演でしょうか。

1:00pm: High Performance at Massive Scale – Lessons Learned at Facebook

この講演もとても楽しみです。Facebook による貴重な体験が聞ける講演です。

Facebook にあるデータは驚くべき割合で成長しています。毎日 50 万人以上の人々が新規登録していて、1億5000万の既存ユーザは驚く割合で新しいデータを追加し続けています。データに逆らって読み込み割合もまた増えています。5000万人以上のユーザによって1秒間に低遅延のランダムアクセスされています。これらの要求を満たすシステムを構築することはまったくもって挑戦であり、私はそこから学んだ教訓を共有したいと思います。

システムのコンポーネントで重大な問題があるものが一つ(SPOFのことだと思う)あってそれは memcached クラスターである。私はパフォーマンスを維持しながら信頼性のある成長したクラスターをもつ方法について議論したい、そして膨大なネットワークトラックを必要とするのと引換えに使われているテクニックがある。いくつかのテクニックはデータをクラスタリングしたようにアプリケーション層にあってアクセスのパターンを解析していたり、他のものはネットワーク帯域に動的に制限するようなシステムレベルで行われていたり、カーネルのネットワークスタックを変更しているものもある。

我々が巨大なコード基盤のある初期化のコストを減らす挑戦を PHP インタプリタで行った最適化、そして 100 TB のデータをもつ MySQL にスケールしたときに学んだ教訓も議論したい。

これからのトピックをすべて共通することは、さまざまな最適化に対する重大な議論することは、スケーリングとパフォーマンスの両面をもつだろう。

1:45pm: Improving Performance in Mature Web Apps, Beyond Gzipping

前半は WordPress による講演です。

WordPress オープンソースプロジェクトの歩みはたくさんの組み合わせでフロントエンドのパフォーマンスを増やしています。そのために何をして何をしなかったのか紹介します。

後半は Google による講演です

あなたのウェブブラウザ上で gzip 圧縮が有効になっているならば、ウェブサイトを加速させるとても一つもっとも簡単にそして高い効果がある方法があります。しかしながら、それをやっても訪問者の 15% は未だに圧縮されたレスポンスを受け取っていません。
このセッションは、なぜこのような問題が行ってこの問題についてできることについて取り上げます。

2:30pm: Fistful of Sand: Monitoring Code Performance at MySpace.com

myspace.com によるコードのパフォーマンスを監視する講演です。

3:40pm: Frontend Performance Engineering in Facebook

Facebook で我々はそれぞれのページの奥に機能やアプリケーションを組み込んでいます。そのような深い融合は、フロントエンドパフォーマンス技術にとって機会と挑戦の両方が存在しています。

4:24pm: Creating Instant Response Time Predictions with neXpert, Native CPU Performance in the Browser with Google Native Client, State of Performance

Microsoft と Google による講演です。

一つ目は、neXpert というツールの紹介です。neXpert とは、クラシックのウェブブラウザのチェックを自動的に行ってくれるウェブデバッカのプラグインで、キャプチャ結果をHTMLレポートとして生成します。

二つ目は、Google が開発した Native Client という技術の紹介です。

三つ目は、Velocity の中心人物である Steve Souders 氏の講演です。ウェブがなぜ遅いのかという根本的な問題に対する講演です。

5:30pm: High Performance Ads – Is It Possible?

そして最後の講演は、この講演です。ウェブ広告のパフォーマンス向上についての講演です。

広告はウェブのもっとも人気のあるたくさんのウェブサイトへもっとも優先順位の高い収入源として提供されています。そして、広告はウェブページを遅くしてしまうという評判をもっています。このプロフェッショナルによるパネルディスカッションではサイトに負荷がかかっているときの広告の影響を緩和するテクニックと体験について議論します。そして計測する標準的な方法の効果と広告のパフォーマンスを向上させる効果についても議論します。

ということで、インフラのカンファレンスとして盛りだくさんすぎる内容ですが、これらのセッションに参加する予定です。

それではいってきますー。(サイドバーにもブログパーツをはってみた)


Velocity, the Web Performance and Operations Conference 2009


Velocity, the Web Performance and Operations Conference 2009

ngIRCd のすすめ

自分のサーバに IRC サーバを構築したいときは、IRCD-Hybrid を使うのが一般的だと思う。しかし、この IRCD-Hybrid はいかんせん設定ファイルの変更方法が分かりにくい、設定ファイルの雛形をみると所々に OLD とか書いてあって必要な設定なのか任意で必要なのかよく分からない。なんとか設定してみたが、本当にちゃんと設定されているか不安になったので削除してしまった。

そこで、他のオープンソースな IRC サーバはないかなと探してみたところ、ngIRCd というがあった。ngIRCd は、その名前のとおり次世代の IRC サーバとして開発されている。ライセンスは、GPL。なんといっても「Simplicity」ということで設定ファイルがとても簡単なのが特徴的で、これぞまさに探していた IRC サーバ!!!設定ファイルの雛形をみても、コメントがちゃんと分かりやすく書いてあって素晴らしすぎる。

ということでさっそく、CentOS 5.3 x86_64 へ導入しようとしたらが、init スクリプトが Debian のものしか用意されていない。そこで、init スクリプトを作って ngIRCd の bugzilla へ登録しておいた。ソースコードに同梱してくれるとうれしいけれど。

SPEC ファイルは、contrib にあるものをそのまま使って RPM にして ngircd をインストールしたあと、/etc/init.d/ngircd を手動でインストールした。デフォルトだと nobody ユーザで動作するので注意しましょう。実行ユーザも切り替えられるけど、SPEC ファイルでは IRCD-Hybrid ように自動的に ircd ユーザを作るようになっていないので要注意。

IRC の設定もさくっと完了した、とても分かりやすい。SSL を利用方法も公式ページに解説されていて素晴らしい。

IRC のサーバを構築するなら、ngIRCd がかなりおすすめです。とても設定が簡単なのが IRC 初心者にとってありがたい。

# 追記

ngIRCd の CentOS/RHEL 向けの init スクリプトは、今日リリースされる ngircd 14.1 に取り込まれることになりました。

SSL で使うおうと設定したら、LimeChat 0.20 で kCFStreamErrorDomainSSL error -9844 というエラーがでてしまった、ngircd 側は特にエラーがでていないので相性の問題だと思われますので、SSL なしで使うことにします。。。

スイッチの電源ケーブルを固定する

業務のサービスで使用しているメインスイッチには、電源ケーブルを固定することができないスイッチを使っています。すこし前にサーバのマウント作業をしていたところ、誤ってメインスイッチの電源ケーブルが抜けてしまったサービスが一時的に落ちてしまった。

これではまずいと思って、スイッチの電源ケーブルをなんとか固定できないものかなと思って、まずは市販されているものを調べてみた。そうしたら、アバンテックということが電源ケーブルを固定するものを売っていた。値段は、だいだい \2,000 円から \3,000 円くらいでかなり高いと思って断念した。

次になんとか自作できないかと近くの雑貨店に探しにいったら、ちょうどタイラップを通すシール付きのいいものが見つかった。値段は、一個 \50 円くらいだった。これを二つほど購入して、さっそく次のように自作してみた。写真はすこし分かりにくいかもしれないけれど、スイッチの上と下に固定するものをはりつけて、そこにタイラップをつけて電源ケーブルをマジックテープで固定してみた。確認してみると、完全に電源ケーブルが固定されていい感じになった!

switch1

よし、これでいけると思ってさっそくラックへマウントしてみるとスイッチの上と下に貼り付けた固定するものがけっこう高さがあって、ちょうど 1U しか空いていなくてスイッチを入れることができなかった。なんとか入ることには入ったけれど、かなりきつくてうまくいかなかった。

そこで次は、1U サーバの電源ケーブルを固定しているのをみて、スイッチも同じようにできないかと思ってやってみた。今後は、固定する板を電源ケーブルポートの右隣で貼り付けて電源ケーブルを丸くしてみた。完全に電源ケーブルが固定されたわけじゃないけれど、これだとちゃんと 1U に入るし、それなりに固定されていていい感じになった。

switch2

これにかかった費用は、固定する板台 \50 円だけ、タイラップは iDC 側から提供されていたものなのでお金がかかっていないのでとてもリーズナブルにできた。

さっそく 1U へスイッチをマウントして稼働を開始した。

emacs の日本語文字コード認識方法

今まで、.emacs に次の設定をしていたのですが、UTF-8 なファイルと EUC-JP なファイルが混在して使うとき、文字コードが固定になっていました。

(set-language-environment "Japanese")

(set-default-coding-systems 'utf-8)

(set-buffer-file-coding-system 'utf-8)

(set-terminal-coding-system 'utf-8)

(set-keyboard-coding-system 'sjis)

これで相当不便だったので、設定をコメントにしてみたところ、文字コードを自動認識してくれるようになりました。日本語入力も問題ないみたいなので、このまま試してみたいと思います。

今のところ、次の設定だけ有効にしてあります。

(set-language-environment "Japanese")

zsh + screen + emacs で 256 色表示できるようにしてみた

僕はいつも開発に、zsh + screen + emacs の三種の神器を使っていますが、どうやらずっと 8 色で使っていることが分かりました。使っている色数は、emacs から M-x list-colors-disply で確認することができます。

8 色だとどうも色数が少ないということで、256 色で表示するように設定してみました。

基本的な設定は、Just Do Live – emacs -nw + screen 256色化 に書かれている通りで設定ができます。

ただし、zsh で screen のステータスバーに実行しているコマンド名を表示するハックである preexec を使っている場合は、$TERM 環境変数が screen ではなく、xterm-256color になってしまうため、$TERM の条件式は使えなくなります。

あわせて、現在の行をハイライトする設定をHighlight the Current Lineを参考にして、highlight-current-line.elを組み込んで設定してみました。

スクリーンショットは、次の通りかなりいい感じになりました。

screenshot.png