« 2007年11月 | メイン | 2008年01月 »

2007年12月 アーカイブ

2007年12月22日

レイアウトの変更

ようやくMTのテンプレートをいじくる時間ができたのでチャレンジしてみた。
トップは3段組に変更した。
しかし、記事ページがおかしい。
トップと同じレイアウトでいいの・・・

あと、alpha, beta, gammaなんていうカラムのつけかたはよくないな。

これらの名前は、日本語名にして、一度それで設定したものから
スタイルシートやHTMLファイルを生成するように
してあげるラッパーをつくったら結構受けそうだが、どうだろ。

2007年12月23日

りんたろう


本埜村の白鳥と鴨

今朝は、早朝からKenさんと一緒に本埜村へ白鳥の撮影に行ってきた。
八千代を抜け16号を突っ切って、北総線の印西牧の原駅の近辺。
家からだと、空いていれば30分くらいでいけるだろうが、すこし混んでいたので
1時間弱。辺り一面田んぼだらけ。

白鳥の郷 本埜村とかなり有名なようで、
もともと平成4年に6羽の白鳥がきたのが始まりで、
餌を与え続けた甲斐あって、年々増えてきたそうです。
飛来してくるのは10月終わりから2月くらいまで。

平成4年6羽
平成5年12羽
平成6年23羽
平成7年10月38羽
平成8年52羽
平成9年85羽
平成10年125羽
平成11年2月7日147羽
平成12年11月10日271羽
平成14年2月357羽
平成15年2月811羽
平成16年2月540羽
平成17年2月833羽

電車で来る場合は、成田線小林駅から徒歩30分、
または安食駅、北総線印旛日本医大駅から徒歩30分

白鳥の餌付け時間は平日と土日で時間が違うので注意
平日 朝:6時40分頃 夕方:4時頃
土日、祭日:朝8時、夕方:4時




Movable Typeでソースコードを記述するために

プログラムソースコードをWeb上で公開する場合、
そのまま表示したいのだが、タグだけで対応するのでは意図しない結果になる。
スペースやタブ、そして、記号文字がパースされた時点で無視されてしまうからだ。

それだけでなく、せっかくだから言語の予約語などはハイライト表示したいという
希望にかなったものがsyntaxhighlighterだ。


ダウンロードしてきて、スタイルシートとJavaScriptを使えるようにすればよいだけだ。
あちこち、使い方を説明しているサイトがあるので参考にすればよい。

ただ、改行位置に、「<br />」が入ってしまい悩むと思うが、
これはMovable Type側で改行を「<br />」に変換するためである。
ソースコードを貼り付ける前に、改行を「&#10;」に変換してから貼り付ければよい。

UNIXの哲学

UNIX創始者の一人でパイプ発案者でもある
Doug McIlroyによるUNIX哲学

1.1つのプログラムが、1つの役割に専念する。

2.複数のプログラムは協調して働く。

3.プログラムは汎用的インターフェイスである標準入出力を扱う。

X Window System設計チームの一員だったMike GancarzによるUNIX哲学

1. Small is beautiful.
(小さいものは美しい)

処理単位が小さいことは、理解しやすいだけでなく、バグを出しにくくする。
あれもこれも詰め込んだ関数などは便利に再利用できることが少ない。
小さいものの集まりであれば、融通も利くが、
大きいものは特定の場合にだけ便利で、それ以外に利用価値がない。

2. Make each program do one thing well.
(1つのプログラムは単純な1つの機能を行う)

関数やプログラムが何をするのか、簡潔に説明できるようにすること。
ビギナーほど、あれやこれや詰め込みたくなるが、本当にそこでやるべきなのか考えてみよう。

3. Build a prototype as soon as possible.
(なるべく早くプロトタイプを作成せよ)

とにかく動くレベルで検証しておくこと。口よりも先に手を動かせ。

4. Choose portability over efficiency.
(効率よりも移植性を重視せよ)

特定の環境でしか動かなくするようなことを避ける。
UNIX, Linux, Windowsそれぞれで同一のソースが動くことが望ましい。

5. Store data in flat text files.
(データは単純なテキストファイルに格納せよ)

アプリ依存のデータは作らないほうがよい。
プレーンなテキストであれば、多くのツールをつかって自由自在に加工が可能である。

6. Use software leverage to your advantage.
(ソフトウエアを自らを助く手段として利用せよ)

自分を助けるためのソフトウエアをどんどん利用すべきである。
プログラムが書ける人の中には、便利なプログラムをうまく利用していない人が多い。
特定な環境に依存する技術者になるな。
WindowsだろうがLinuxだろうがUNIXだろうが、どこの環境でも便利なものはどんどんつかえ。

7. Use shell scripts to increase leverage and portability.
(シェルスクリプトを利用し自らを助け、移植性を高めよ)

シェルsh,bash,sed,awk,perlなど適材適所で利用せよ。
組み合わせて、とにかく書いて動かしてみよう。

8. Avoid captive user interfaces.
(ユーザ・インターフェースを1つに強制するな)

固定観念を捨てよ。

9. Make every program a filter.
(全てのプログラムはフィルタとして振る舞え)

入力がファイルである必要はない。標準入力でよい。
出力がファイルである必要はない。標準出力でよい。
こうしておけば、入出力を切り替えることができる。
パイプとリダイレクトで、つなげていこう。

Flash+PHPのスライドショー dfGallery

dfGalleryというフォトスライドショーを使ってみた。
http://www.dezinerfolio.com/2007/06/07/dfgallery/
フロントエンドがFlash, バックエンドがPHPの組み合わせで、
フルスクリーンへの切り替えも可能。
なかなかスムーズでしかもフリーである。

重要な特色:
* Flickr、Picasa、Fotki、PhotobucketとCustom Imagesの両方に対応するFlash Gallery。
*「Print Screen」を利用可、不可を設定可能。
* 容易にカスタマイズ可能です。
* 完全なScreenモード。
* RSSとCustom Imagesの両方対応している。
* どんなサイズでも対応。
* バックグラウンドで流れるMP3ファイルを指定可能。
* 複数の言語サポート。
* 新しいアップデートが利用可能であるなら、通知する。
* 無料です。

フリーでこれだけできていれば感謝ですね。
ただ、下に表示されるサムネイルの画像も指定しなければならないのだけれど
勝手にリサイズしてサムネイル画像をつくってくれるとよいのだが。
あと、噴出しに出る画像に合せるとへんな部分(左上の一部?)が表示されている。

o 試してみたフォトスライドショー
http://www.iplusone.sakura.ne.jp/photo/dfgallery/

雨上がりの海浜幕張

午前中で雨があがったので、自転車でぶらっと海浜幕張まで行ってきた。

メッセ会場の裏には、沢山の木が生えていて、そこには多くの鳥がいる。
中に入れればもっと寄れたのが、生憎会場は閉鎖されていたんで、歩道から撮ってます。



2007年12月24日

MTのエントリを自動で登録するには?

この連休中でMT(Movable Type)のカスタマイズ方法について急速に理解を深めた。
うちの会社サイトもこのMTを利用して作られていはいる。

MTの仕組みやは知っていたが、実際にカスタマイズまでやってみるといろいろと見えてくる。
カスタマイズされたあとのブログ運用が大変便利なのは前からわかっていたが、
カスタマイズ自体は、簡単にできることと、それ以上のことで差が大きい。

なぜかMTのデフォルトデザインは、ダサい色と、ダサいレイアウトなのだが
このあたりを変更するのはカスタマイズというよりも、HTML自体の編集といったほうがよい。
入力フォームでやれるような内容ではない。
クライアント上でファイル編集して、FTPでアップロード、再構築。という作業になる。
これではCMSとはいえない。

このあたりも含めて設定だけで、できるような仕組みをプラス提供してあげれば
便利だなと思った。

ブラウザから次のようなことができるような仕組みを考えてみたい。
・レイアウト変更が自由自在にできる。
自由自在ではなくとも、カラム2、カラム3の変更。
カラム2も、メニューの左右は選べるように。

・スタイルシートになっている値の変更
せっかくスタイルシートで指定している値は、画面上から、もっとわかりやすい名前で参照できるようにして、
変更したらスタイルシート生成、そして再構築できるようにしたい。

何かを使ってみると、いろいろなリクエストが沸いてくるが、これが本業ではないので
まずやらなければならないことはというと、

ZorgへアップしたフォトをBloggerにリンクを張ってコメントを書いていたが
ここのBlog一本でいけそうなので、あちらは廃止する。
mixiも、どんなものかとフォトアルバムを試しに有料で使ってみたが、これも続けるほどではない。

そうなるとBloggerやmixiにあげた日記をこちらへ移行しておきたい。
幸いMTは、過去日付エントリーが可能なので、移行というよりも
再度エントリー作成からでもよいと思っている。

勿論手作業ではなく、自動生成させての話だ。

Zorgから各フォトページのURLとフォトのURL、そして撮影日をもってきて、
それを元にエントリーを生成する。
もってくるほうは頭に浮かぶが、MTのエントリは直接DBへ書いてよいのか?
ちと調べてみよう。

と思ったら、そういえばHomepasge BuilderからXML-RPCインタフェースを使った各ブログサイトへの
書き込みインターフェイスってのがあった。
ということで、このXML-RPCインタフェースが用意されているわけだから、
自前でこの処理を書けば、登録できるということになる。

XML-RPC APIを使った投稿

XML-RPC 仕様書

Movable Type で使える XML-RPC API

Zorgから自分のフォトを取得する

Zorgは、いくつかの機能をAPIで提供している。

Zorg API

zorg.photos.getPhotosをつかえば、自分がこれまでに投稿した一覧を取得できる。
この説明ページの一番下に、クイックスタートがあるので、それをブラウザのURLにコピペしてみれば
XMLレスポンスでフォト一覧を受け取ることができる。

ここからXMLパースして必要な情報を抜き出す。

TAG TYPE VALUE
total_items [INT] 該当フォト全件数
TAG TYPE VALUE
photo_id [STRING] 他のメソッドなどで使用する、エンコードされたZorgフォトID
title [STRING] フォトのタイトル
posted_date [INT] アップロードタイムスタンプ(UNIX TIME形式)
taken_date [INT] 撮影タイムスタンプ(UNIX TIME形式)
images_view [STRING] ビューサイズフォト(一辺480ピクセル)のURL
images_thumbnail [STRING] サムネイルサイズフォト(一辺150ピクセル)のURL
images_square [STRING] スクエアサイズフォト(100ピクセルx100ピクセル 正方形)のURL
images_minimum [STRING] ミニマムサイズフォト(40ピクセルx40ピクセル 正方形)のURL

ここで、上記テーブルを挿入したら、テーブルの直前に大量の余白ができてしまった。
エントリーのオプションで「改行設定」が「改行を変換する」になっている場合、
table タグに含まれる改行が、すべて改行タグに変換されてしまい、
その改行が table タグの直前ですべて吐き出されてしまうためです。

ということでテーブルTAG記述中の改行を全部取り除いてからペーストしてみる。
s/\n//gで取り除いてみたら、大量の空白はなくなった。
しかし、あとからこのテーブルを編集するのはちと厳しい。
もう少し、エレガントな方法を検討する必要がある。

話がそれてしまったが・・・・

取得した情報からエントリをどのように作成するか決めてしまう。

・[title]をそのままエントリのタイトルに利用する。
・エントリに掲載する内容

  <a href="フォトページへのリンク"><mg src="ビューサイズフォトへのURL[images_view]" ></a>

・フォトページへのリンクは、
  http://www.zorg.com/pub/photod?pid=[photo_id]

・エントリの投稿日時は、撮影タイムスタンプ[taken_date]とする。

続きを読む "Zorgから自分のフォトを取得する" »

MagpieRSS

PHPで利用できるRSSパーサMagpieRSSを使ってみる。

http://magpierss.sourceforge.net/

MagpieRSS 0.52 Now Compatible with PHP 4.3.2をダウンロードしてみる。

と思ったが、PEAR/XML_RSSを利用する。
今後は極力PEARのライブラリを利用する方針。

ライブドアのお天気おねいさんから天気を取得してくる

PHPからXMLパースする方法はたくさんあるけれど、
ここでもPEARライブラリを使ってみる。

Serializer.php
Unserializer.php

をインストールする。

が、できず。

[root@localhost XML]# pear install XML_Serializer
Failed to download pear/XML_Serializer within preferred state "stable", latest release is version 0.18.0, stability "beta", use "channel://pear.php.net/XML_Serializer-0.18.0" to install
Cannot initialize 'channel://pear.php.net/XML_Serializer', invalid or missing package file
Package "channel://pear.php.net/XML_Serializer" is not valid
install failed

ということで、直接ダウンロードしてきて、展開し配置する。

お試しにライブドアで提供しているお天気サービスを取得してみた。
http://weather.livedoor.com/weather_hacks/
天気だけでなく、気温、降水量、風向・風速、日照時間、積雪深なんかも取得できるので
マッシュアップにどうぞ。


Zorg API [zorg.photos.getPhotos]

ようやく辿り着いたが、zorg.photos.getPhotosのレスポンスから必要な情報を取得する。

まずは、PHPのソースをどうぞ。

1回のリクエストでは50件づつ返すので、リクエストを繰り返して、欲しいところを抜き出すこと。
その際、リクエストのパラメータに開始番号(start)が必要になる。

ちなみに、最後に投稿したフォトが1番となり、一番古いのが最後となる。
あと、公開していないフォトは除外されて出てこないので、総数からもはずされている。

これで、すべての情報が整った。

UNIXタイム

UNIXタイムとは、1970年1月1日0時0分0秒からの秒数で保持する日時の形式です。
この値を、年月日時分秒に戻すには、date関数を使います。

りんたろう




Zorg投稿日時 : 2007/12/23 21:40 撮影日時 : 2007/12/23 21:28

ページ指定で、50枚づつゲットするPHPを作った。その中の1枚を貼り付ければ、上記のようなスタイルで表示されることになる。
しかし、XML_RPCでのMovable Typeへの書き込みがなかなかうまくいかず。これは次回へ延期。

2007年12月25日

XML_RPCにて自動登録が成功だ!

XML_RPCにて自動登録実施中


長い道のりであった。わかってしまえば詰まらん理由ではあるが、 皆のためにまとめておこう。

その前に、
カテゴリーのセット
タグのセット
もやってしまおう。

続きを読む "XML_RPCにて自動登録が成功だ!" »

2007年12月26日

Zorgフォト一覧からMTエントリの登録(総集編)

Zorgのzorg.photos.getPhotosは、指定した番号のフォトから50枚の情報を返す。
したがって、4000枚だから80回GETする必要がある。
これをWEBアプリとして動かすのは、危険なので、以下のような仕組みにした。


■get_zorg.php
引数で開始番号を与え、zorg.photos.getPhotosでその開始番号から50件のみ取得し、
1件1行で出力。
フォーマットは、フォトID,タイトル,ViewサイズのURL,投稿日時,撮影日時
カンマ区切りで出力

■ex.sh
get_zorg.phpを起動して、結果をファイルmy_photo.txtへリダイレクト
ループで、4000になるまで、+50づつ。

データ行以外に、HTMLタグが出力してしまっているので
それを取り除く。幸い先頭がフォトIDで、iから始まっているので、iではじまらない行は除外。

% grep ^i my_photo.txt > my_photo_result.txt

これでフォト一覧ファイルができあがり。
このファイルをよみながら、XML_RPCでMovable Typeへ書き込みを行うプログラムを作成した。

ファイルから読み込んだ内容をMovable TypeへXML_RPCで書き登録するPHP

今回、行った問題点を整理しておく。


最初のミステイクは、
$client = new XML_RPC_client( $path, $host, 80 );

$client = new XML_RPC_client( $host, $path, 80 );
としちまった。ホスト、パスという順番だろうという思い込み。
メソッド定義をよみましょう。

XML_RPC_Messagenのメソッドで、記事を投稿するメソッドには、
blogger.newPost
metaWeblog.newPost
の2つがあり、最初blogger.newPostを試した。
こちらはすんなりと成功した。
それもそのはず、引数すくない。
まず、タイトルがない。というか本文の先頭10文字が勝手にタイトルになる。
なんじゃ、この仕様は?記事本文しか登録できない。

で、次にmetaWeblog.newPost
こちらは、ほぼすべての項目の登録が可能。
しかし、嵌った。

投稿日時がまずかった。
//"dateCreated" => new XML_RPC_Value('2007-12-25', "ISO.8601")
これでいけると疑わず、最後までほかをチェックしていたら
'dateCreated'=> new XML_RPC_Value(date("Ymd\TH:i:s",time()), 'dateTime.iso8601')
正しくは、こちらであった。

ITProの2007年ニュース年間ランキング

ITProの2007年ニュース年間ランキングが発表された。

http://itpro.nikkeibp.co.jp/article/COLUMN/20071220/289933/

2007年12月27日

年末残課題




最近MTをはじめてから、カスタマイズに時間をとられ睡眠不足です。
いろいろやりたいことが沢山あるがなかなか反映できない。

ソースコードの表示にSyntaxHighlighterを利用しているが、
これがアーカイブページや検索結果に反映されない。

カレンダーを追加してみたが、アーカイブのリンク先にカレンダが表示されてしまうようになったので、はずした。

あと、Zorgのフォトからエントリー作成計画は、2000件ほど完了。
どうも1000件くらいでサーバにConnectできなくなる。
で、今朝再度チャレンジしてみたが、1件も登録できずという状態。
残り2000件ほどは冬休みに対応する。

聖徳太子は10人の人と話ができた云々いわれているが、
今私は、複数の人と
C,PHP, Java, JavaScript, SQL, bash, perl, ruby, MTタグ, CSS,
そして、りんたろうとは、りんたろう語で会話をしている。

2007年12月28日

復旧完了

MTのエントリに、Zorgへのフォトリンクを全部登録したんだけど
1件1エントリーは面倒なので、日付単位でまとめて、どかんと登録したら
壊れた。(笑)

で、その場所では、全エントリを削除して再構築したんだけど
どうにもこうにもInternal Server Errorの呪縛から逃れられず
場所を移動しました。

ということで、
http://www.iplusone.sakura.ne.jp/
に新しく構築。

2007年12月30日

Cannon PIXUS MP970

千葉のヨドバシカメラにいって、
Cannon PIXUS MP970を買ってきた。

さっそく今年撮ったフォトを印刷してみて、年賀状を作成してみました。

プリンタを買うたびに思いますが、
セットアップやインクの交換などわかりやすく簡単にできるように
考えられていますね。

さて、印刷するだけならMP610で十分なのですが
MP970は複合機として以下の機能がついています。

・ネットワーク対応機能100BASE-TX/10BASE-T Bluetooth Ver1.2
・35mmフィルムスキャン

ネットワークは、別売りのプリンタサーバを買えばよいと思いますが、
フィルムスキャナーって単体でもかなり高価なので
とりあえずスキャンできるというだけでも楽しめるかなと思います。
我が家にストックされているフィルムといえば娘の小さい頃の写真。
これを取り込んでみたいと思います。

C言語でMySQLを操作する

MySQLを利用する場合、WEBのシステム構築となると
フロントエンドがPHPやrubyといったスクリプトで記述することが多いと思います。

今日は、C言語からMySQLを操作するAPIを利用してみたいと思います。
私の環境はFedora7で、すでにmysqlのC APIがインストール済みなので
ヘッダファイルとライブラリファイルが以下のようにそろっています。

[root@fedora7 c]# ls /usr/include/mysql/
chardefs.h   my_config_i386.h  my_semaphore.h   mysqld_error.h  sslopt-case.h
errmsg.h     my_dbug.h         my_sys.h         raid.h          sslopt-longopts.h
history.h    my_dir.h          my_xml.h         readline.h      sslopt-vars.h
keycache.h   my_getopt.h       mysql.h          rlmbutil.h      tilde.h
keymaps.h    my_global.h       mysql_com.h      rlprivate.h     typelib.h
m_ctype.h    my_list.h         mysql_embed.h    rlshell.h       xmalloc.h
m_string.h   my_net.h          mysql_time.h     rltypedefs.h
my_alloc.h   my_no_pthread.h   mysql_version.h  sql_common.h
my_config.h  my_pthread.h      mysqld_ername.h  sql_state.h
[root@fedora7 c]# ls /usr/lib/mysql/
libdbug.a         libmysqlclient.so         libmysqlclient_r.so.15      mysql_config
libheap.a         libmysqlclient.so.15      libmysqlclient_r.so.15.0.0  mysqlbug
libmyisam.a       libmysqlclient.so.15.0.0  libmystrings.a
libmyisammrg.a    libmysqlclient_r.a        libmysys.a
libmysqlclient.a  libmysqlclient_r.so       libvio.a

試しに、次の駅テーブルの中身を表示させてみます。

mysql> describe M_STATION;
+-------------------+--------------+------+-----+---------+-------+
| Field             | Type         | Null | Key | Default | Extra |
+-------------------+--------------+------+-----+---------+-------+
| CODE              | char(7)      | NO   |     |         |       |
| RAIL_NAME         | varchar(255) | NO   |     |         |       |
| STATION_NUMBER    | int(11)      | NO   |     |         |       |
| STATION_NAME      | varchar(255) | NO   |     |         |       |
| TODOFUKEN         | varchar(20)  | NO   |     |         |       |
| STATION_NAME_KANA | varchar(255) | NO   |     |         |       |
| LAT               | double       | YES  |     | 0       |       |
| LNG               | double       | YES  |     | 0       |       |
| LAT_DMS           | varchar(30)  | YES  |     |         |       |
| LNG_DMS           | varchar(30)  | YES  |     |         |       |
+-------------------+--------------+------+-----+---------+-------+
10 rows in set (0.00 sec)

[root@fedora7 c]# gcc mysql_test.c -lmysqlclient  -lnsl -lm -lz -L/usr/lib/mysql
[root@fedora7 c]# ./a.out
[JR]函館本線(函館~長万部) 函館                         41.773746 140.726399
[JR]函館本線(函館~長万部) 五稜郭                      41.803418 140.733884
[JR]函館本線(函館~長万部) 桔梗                         41.846735 140.723046
[JR]函館本線(函館~長万部) 大中山                      41.864738 140.713482
[JR]函館本線(函館~長万部) 七飯                         41.887012 140.68855
[JR]函館本線(函館~長万部) 渡島大野                   41.905045 140.647628
[JR]函館本線(函館~長万部) 仁山                         41.930014 140.63522
[JR]函館本線(函館~長万部) 大沼                         41.971954 140.669347
[JR]函館本線(函館~長万部) 大沼公園                   41.98103 140.669888
[JR]函館本線(函館~長万部) 赤井川                      42.003267 140.642678
[JR]函館本線(函館~長万部) 駒ヶ岳                      42.038781 140.610537
[JR]函館本線(函館~長万部) 東山                         42.061728 140.605261
[JR]函館本線(函館~長万部) 姫川                         42.081301 140.591677
[JR]函館本線(函館~長万部) 池田園                      41.990661 140.700333
[JR]函館本線(函館~長万部) 流山温泉                   42.003474 140.716494
[JR]函館本線(函館~長万部) 銚子口                      42.015518 140.720673
[JR]函館本線(函館~長万部) 鹿部                         42.06439 140.771393
[JR]函館本線(函館~長万部) 渡島沼尻                   42.107041 140.747609
[JR]函館本線(函館~長万部) 渡島砂原                   42.121645 140.68954
[JR]函館本線(函館~長万部) 掛澗                         42.119211 140.646094
[JR]函館本線(函館~長万部) 尾白内                      42.111221 140.613465
[JR]函館本線(函館~長万部) 東森                         42.106845 140.593564
[JR]函館本線(函館~長万部) 森                            42.108897 140.573985
[JR]函館本線(函館~長万部) 桂川                         42.11559 140.542794
[JR]函館本線(函館~長万部) 石谷                         42.13553 140.506553
[JR]函館本線(函館~長万部) 本石倉                      42.159668 140.471957
[JR]函館本線(函館~長万部) 石倉                         42.172839 140.458461
[JR]函館本線(函館~長万部) 落部                         42.187544 140.420886
[JR]函館本線(函館~長万部) 野田生                      42.217104 140.37586
[JR]函館本線(函館~長万部) 山越                         42.231172 140.326593
[root@fedora7 c]#

続きを読む "C言語でMySQLを操作する" »

2007年12月31日

ディレクトリの存在を確認する

路線ごとに、その路線上の駅の地図を表示するHTMLファイルを生成してみる。
路線単位にディレクトリを作成して、そこに駅番号.htmlという名前で出力する。

ディレクトリの存在確認を行うには、以下のようにlstatで確認する。


google map APIで地図を表示する


About 2007年12月

2007年12月にブログ「iPLUSONE Blog」に投稿されたすべてのエントリーです。過去のものから新しいものへ順番に並んでいます。

前のアーカイブは2007年11月です。

次のアーカイブは2008年01月です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Powered by
Movable Type 3.34