Google Crisis Response(Google)
災害に関する情報源や、行方不明者情報の収集と検索を行う『パーソンファインダー』を初めとするツールの提供が行われています。

2008年3月19日 水曜日

Yahoo! Japan がアクセス解析サービスを開始

Filed under: インターネット
時間:0時02分
投稿者:よしとも
AddClips 経由でソーシャルブックマークに登録

 Yahoo! Japan が、個人サイト向けのアクセス解析ツールのサービスを開始しました。

 サービスの名前は「Yahoo! ログール」。単なるアクセス解析ではなく、ほかのユーザーを登録する「お気に入り」機能などを持ち、SNS のようなコミュニティーとしての面が強く出ています。利用には、Yahoo! Japan のアカウントが必要です。

 アクセス解析ツールと言うと、Google Analytics を無視することは出来ません。Google Analytics は Urchin がベースとなっているためか、SEO を目的としたプロ向けツールのイメージが抜けません。各項目名も「参照元」のように硬い感じのものが多いです。

 これに対して、Yahoo! ログールは一般向けのイメージです。導入説明ではキャラクターが使用され、ファンシーですらあります。
 項目名も、「ここから来ました」や「ここに行きました」のような、やわらかい言葉が使われています。アバターの設定が出来たり、自分をお気に入りに登録した人がわかる「ファンリスト」などもあります。いわゆる「足跡」機能もあり、アクセス解析というよりも SNS のようです。

 ベータ版というこもあり、機能の充実と言う点では Google Analytics に負けています。しかし、はてなブックマークの登録数がわかるなど、注目されそうな機能もあります。アクセスは気になるけど、Google Analytics は難しくてよくわからないと言う人にはいいかもしれません。将来は、マニアックな Google Analyics と手軽な Yahoo! ログールといったようになり、2大アクセス解析サービスと言うことになるかもしれません。ちょっと注目して見たいと思います。

Comments (0)

2008年3月16日 日曜日

Smarty で date() の書式設定を使う

Filed under: プログラミング
時間:22時39分
投稿者:よしとも
AddClips 経由でソーシャルブックマークに登録

 Smarty というテンプレートエンジンがあります。おそらく、PHP では定番中の定番だと思います。

 この Smarty は私のお気に入りでして、PHP でそれなりの規模のもの(といっても、プログラムとしては小さなものですが)を作るときには必ずといっていいほど使っています。現在製作中のものにも使っているのですが、日付を表示させる部分で不満がありました。1桁の時には10の位の部分が0になったり半角スペースになってしまうのです。

 書式を指定して日付を表示するには date_format という就職子を使うのですが、書式がいまいち充実していなくて思うような表示をさせることができません。データ保持に使っている MySQL のほうがよっぽど多機能だったので、思わずそちらで整形済みの日付を作成してしまいました。しかし、できれば Smarty 側で処理をさせたいと思い、大雑把ですがプラグイン機能を使って実装してしまいました。

実装

 実装したといっても、大したことはやってなかったりします。もともと date_format もプラグインとして実装されていて、内部では PHP の strftime() という組み込み関数を使用しています。冒頭で書いた不満は、この関数の機能に起因します。

 対して、同じ組み込み関数である date() では、1桁の時には1桁で表示するということが可能です。そこで、date_format のファイルを基にして date() を使うようにしてみたというわけです。それが次のコードです。ライセンスは Smarty に従って LGPL となります。

  1. <?php
  2. /**
  3.  * Smarty plugin
  4.  * @package Smarty
  5.  * @subpackage plugins
  6.  */
  7.  
  8. /**
  9.  * Include the {@link shared.make_timestamp.php} plugin
  10.  */
  11. require_once $smarty->_get_plugin_filepath('shared', 'make_timestamp');
  12. /**
  13.  * Smarty date_format modifier plugin
  14.  *
  15.  * Type:     modifier<br>
  16.  * Name:     date<br>
  17.  * Purpose:  format datestamps via date<br>
  18.  * Input:<br>
  19.  *         - string: input date string
  20.  *         - format: strftime format for output
  21.  *         - default_date: default date if $string is empty
  22.  * @author   Yoshitomo
  23.  * @param string
  24.  * @param string
  25.  * @param string
  26.  * @return string|void
  27.  * @uses smarty_make_timestamp()
  28.  */
  29. function smarty_modifier_date($string, $format = 'M d, Y', $default_date = '')
  30. {
  31.     if ($string != '') {
  32.         $timestamp = smarty_make_timestamp($string);
  33.     } elseif ($default_date != '') {
  34.         $timestamp = smarty_make_timestamp($default_date);
  35.     } else {
  36.         return;
  37.     }
  38.     return date($format, $timestamp);
  39. }
  40.  
  41. /* vim: set expandtab: */
  42.  
  43. ?>

 この内容を、modifier.date.php というファイル名で保存して、Smarty のプラグインディレクトリに置いてください。使い方は書式が date() に従うというだけで、あとは date_format と同じです。

[Smarty]
{$date_value|date:”Y年n月j日”}
[/Smarty]

残る不満

 無事便利になったわけですが、分と秒に関しては結局満足できる結果にはなりませんでした。この2つの項目は、なぜか1桁で表示するという書式設定ができません。
 書式の表をよく見てみると、小文字のときは0がついて、大文字の時には0がつかないと言うようになっていることがわかります。そして、分と秒に対する0のつく場合の文字としては i と s があり、その大文字である I と S はすでに別の項目で使われてしまっています。大文字と小文字の対応を崩したくないために実装していないのではないかと、思わず疑ってしまいました。

 I も S も、日本ではあまり需要がない項目であるのがなんとも残念です。時間を見て実装をと思っていますが、もしすでにあってご存知でしたらぜひ教えてください。

Comments (0)

2008年3月14日 金曜日

管理者なのに新規にページが公開できない原因

Filed under: WordPress,ハック
時間:1時10分
投稿者:よしとも
AddClips 経由でソーシャルブックマークに登録

 先週の記事でも書きましたように、Google AdSense の規約変更のためにプライバシーポリシーの掲載が必要となりました。いろいろと考えて自力で作ったのですが、なぜか肝心のページの公開ができません。

 公開するには、ステータスを「公開」にすればいいはずですが、私の場合はなぜかその項目が表示されていません。その部分のコードを探して確認してみることに。久しぶりのハックです。バージョンは ME2.1.3。ME2.0 からアップグレードしてあります。

解析編

 ページ編集画面のアドレスからファイルを推測したどっていくと、wp-admin/edit-page-form.php に該当箇所が見つかりました。

  1. <fieldset class="dbx-box">
  2. <h3 class="dbx-handle"><?php _e('Page Status') ?></h3>
  3. <div class="dbx-content"><?php if ( current_user_can('publish_pages') ) : ?>
  4. <label for="post_status_publish" class="selectit"><input id="post_status_publish" name="post_status" type="radio" value="publish" <?php checked($post->post_status, 'publish'); checked($post->post_status, 'future'); ?> /> <?php _e('Published') ?></label>
  5. <?php endif; ?>
  6.       <label for="post_status_draft" class="selectit"><input id="post_status_draft" name="post_status" type="radio" value="draft" <?php checked($post->post_status, 'draft'); ?> /> <?php _e('Draft') ?></label>
  7.       <label for="post_status_private" class="selectit"><input id="post_status_private" name="post_status" type="radio" value="private" <?php checked($post->post_status, 'private'); ?> /> <?php _e('Private') ?></label></div>
  8. </fieldset>

 63行目が公開とする項目で、62行目のところで権限の有無によって処理を分岐しているようです。管理者アカウントで作業しているので権限がないとは思えないのですが。

 今度は条件式に使われている関数 current_user_can() を調べます。まずは定義場所を見つける必要があります。ファイル群から検索という方法でもいいのですが、試しに Google で検索してみることに。キーワードは「WordPress current_user_can」。
 capabilities.php というファイルにあるという情報が見つかりました。コアファイルの置かれているところを探してみると、wp-includes/ にありました。

  1. // Capability checking wrapper around the global $current_user object.
  2. function current_user_can($capability) {
  3.     $current_user = wp_get_current_user();
  4.  
  5.     $args = array_slice(func_get_args(), 1);
  6.     $args = array_merge(array($capability), $args);
  7.  
  8.     if ( empty($current_user) )
  9.         return false;
  10.  
  11.     return call_user_func_array(array(&$current_user, 'has_cap'), $args);
  12. }

 446行目で wp_get_current_user() が返す値を変数に入れています。変数の値を調べてみると、クラス WP_User のインスタンスが入っていました。このクラスも、capabilities.php に定義があります。長いのでコードは省略します。

 448行目の処理は、この関数の2番目以降の引数を要素として持つ配列を取得しています。今回引数は1つだけなので、当然この行の直後では $args は要素を持たない配列です。449行では配列の結合をしていて、変数 $args には array('publish_pages') に相当する値が入ります。

 454行目では、コールバック処理の結果を返しています。変数 $current_user にはクラス WP_User のインスタンスが入っていますので、コールバック関数は WP_User のメンバ関数 has_cap() と言うことになります。定義は次のようになっています。

  1. //has_cap(capability_or_role_name) or
  2.     //has_cap('edit_post', post_id)
  3.     function has_cap($cap) {
  4.         if ( is_numeric($cap) )
  5.             $cap = $this->translate_level_to_cap($cap);
  6.  
  7.         $args = array_slice(func_get_args(), 1);
  8.         $args = array_merge(array($cap, $this->ID), $args);
  9.         $caps = call_user_func_array('map_meta_cap', $args);
  10.         // Must have ALL requested caps
  11.         $capabilities = apply_filters('user_has_cap', $this->allcaps, $caps, $args);
  12.         foreach ($caps as $cap) {
  13.             //echo "Checking cap $cap<br/>";
  14.             if(empty($capabilities[$cap]) || !$capabilities[$cap])
  15.                 return false;
  16.         }
  17.  
  18.         return true;
  19.     }

 引数 $cap には、コールバックで渡された文字列 publish_pages が入ります。数値ではないので、262行目の処理は行われません。264行目と265行目は、current_user_can() の場合と同じですね。$this->ID は、ログイン中のユーザーのID(ログインIDではなく、データベーステーブルの主キー)が入っています。

 266行目で再びコールバックです。この段階 $args には array(‘publish_pages’, ユーザーID) が入っているので、map_meta_cap('publish_pages', ユーザーID) ということをしていることになります。

 関数の定義は、285行目から442行目にかけて記述されています。これもかなり長いですが、やっていることは第一引数の値で switch 分岐処理をしているだけです。publish_pages のところはないので、default 節で次のように処理をしているだけです。

  1. default:
  2.         // If no meta caps match, return the original cap.
  3.         $caps[] = $cap;

 そして、その戻り値は予想通り array('publish_pages') でした。

 268行目。プラグイン作成ではおなじみの、apply_filters が使われています。以前にもこの関数のハックに挑んだことがありますが、ややこしくて苦手です。面倒なので $capabilities の中身を見てみるだけに。連想配列になっていて、ユーザステータスを記録しているようです。$capabilities['publish_pages'] はありませんでした。

 269~273行目では、値がないか Not true のものが見つかったら false でリターンするという処理です。値がないので false になってしまいます。

解決編

 すっかり弱ってしまいました。散々調べ続けて、わかったのは間違いなくページを公開する権限がないことだけ。(仕組みがわかって勉強になったというのもありますけど・・・)

 方向を変えて、publish_pages について調べてみることに。「WordPress publish_pages」と検索。WordPress Japan のフォーラムに、よく似た不具合のスレッドを発見。

 そこからリンクされているページを見ると、データベースに記録されているシステム設定に問題がある模様。どれどれと確認してみると、$capabilities の内容によく似たデータが。そして、そこには publish_pages はありませんでした。2.0 からアップグレードするときに、スクリプトが修正してくれなかっただけなのではないでしょうか。実際、プラグインチェック用に新規インストールした 2.1 のほうでは次のような内容で、そこにはちゃんと publish_pages があります。

  1. a:5:{s:13:"administrator";a:2:{s:4:"name";s:27:"管理人 - (Administrator)";s:12:"capabilities";a:47:{s:13:"switch_themes";b:1;s:11:"edit_themes";b:1;s:16:"activate_plugins";b:1;s:12:"edit_plugins";b:1;s:10:"edit_users";b:1;s:10:"edit_files";b:1;s:14:"manage_options";b:1;s:17:"moderate_comments";b:1;s:17:"manage_categories";b:1;s:12:"manage_links";b:1;s:12:"upload_files";b:1;s:6:"import";b:1;s:15:"unfiltered_html";b:1;s:10:"edit_posts";b:1;s:17:"edit_others_posts";b:1;s:20:"edit_published_posts";b:1;s:13:"publish_posts";b:1;s:10:"edit_pages";b:1;s:4:"read";b:1;s:8:"level_10";b:1;s:7:"level_9";b:1;s:7:"level_8";b:1;s:7:"level_7";b:1;s:7:"level_6";b:1;s:7:"level_5";b:1;s:7:"level_4";b:1;s:7:"level_3";b:1;s:7:"level_2";b:1;s:7:"level_1";b:1;s:7:"level_0";b:1;s:17:"edit_others_pages";b:1;s:20:"edit_published_pages";b:1;s:13:"publish_pages";b:1;s:12:"delete_pages";b:1;s:19:"delete_others_pages";b:1;s:22:"delete_published_pages";b:1;s:12:"delete_posts";b:1;s:19:"delete_others_posts";b:1;s:22:"delete_published_posts";b:1;s:20:"delete_private_posts";b:1;s:18:"edit_private_posts";b:1;s:18:"read_private_posts";b:1;s:20:"delete_private_pages";b:1;s:18:"edit_private_pages";b:1;s:18:"read_private_pages";b:1;s:12:"delete_users";b:1;s:12:"create_users";b:1;}}s:6:"editor";a:2:{s:4:"name";s:20:"編集者 - (Editor)";s:12:"capabilities";a:34:{s:17:"moderate_comments";b:1;s:17:"manage_categories";b:1;s:12:"manage_links";b:1;s:12:"upload_files";b:1;s:15:"unfiltered_html";b:1;s:10:"edit_posts";b:1;s:17:"edit_others_posts";b:1;s:20:"edit_published_posts";b:1;s:13:"publish_posts";b:1;s:10:"edit_pages";b:1;s:4:"read";b:1;s:7:"level_7";b:1;s:7:"level_6";b:1;s:7:"level_5";b:1;s:7:"level_4";b:1;s:7:"level_3";b:1;s:7:"level_2";b:1;s:7:"level_1";b:1;s:7:"level_0";b:1;s:17:"edit_others_pages";b:1;s:20:"edit_published_pages";b:1;s:13:"publish_pages";b:1;s:12:"delete_pages";b:1;s:19:"delete_others_pages";b:1;s:22:"delete_published_pages";b:1;s:12:"delete_posts";b:1;s:19:"delete_others_posts";b:1;s:22:"delete_published_posts";b:1;s:20:"delete_private_posts";b:1;s:18:"edit_private_posts";b:1;s:18:"read_private_posts";b:1;s:20:"delete_private_pages";b:1;s:18:"edit_private_pages";b:1;s:18:"read_private_pages";b:1;}}s:6:"author";a:2:{s:4:"name";s:20:"投稿者 - (Author)";s:12:"capabilities";a:10:{s:12:"upload_files";b:1;s:10:"edit_posts";b:1;s:20:"edit_published_posts";b:1;s:13:"publish_posts";b:1;s:4:"read";b:1;s:7:"level_2";b:1;s:7:"level_1";b:1;s:7:"level_0";b:1;s:12:"delete_posts";b:1;s:22:"delete_published_posts";b:1;}}s:11:"contributor";a:2:{s:4:"name";s:25:"寄稿者 - (Contributor)";s:12:"capabilities";a:5:{s:10:"edit_posts";b:1;s:4:"read";b:1;s:7:"level_1";b:1;s:7:"level_0";b:1;s:12:"delete_posts";b:1;}}s:10:"subscriber";a:2:{s:4:"name";s:24:"購読者 - (Subscriber)";s:12:"capabilities";a:2:{s:4:"read";b:1;s:7:"level_0";b:1;}}}

 思い切ってデータを差し替えてみると、見事公開の選択肢が表示されるように。これで、やっとプライバシーポリシーの公開ができます。

Comments (0)

2008年3月6日 木曜日

Amazon.com も動画広告へ参入

Filed under: アフィリエイト
時間:20時31分
投稿者:よしとも
AddClips 経由でソーシャルブックマークに登録

 動画用の Google AdSense 広告である「AdSense for video」のベータ版が開始されていますが、Amazon.com も動画広告に参入です。

 このサービスは「Your Video Widget」というウィジェットで、アップロードした動画に広告の好きなコマ位置に広告を掲載し、それをサイトに掲載します。YouTube のように、専用のプレーヤーが提供されます。

Comments (0)

2008年3月3日 月曜日

Google AdSense の規約変更

Filed under: アフィリエイト
時間:23時34分
投稿者:よしとも
AddClips 経由でソーシャルブックマークに登録

 このサイトでは Google AdSense によるアフィリエイト広告を掲載しています。最近、このサービスの規約が変更され、その内容が話題となってます。

 話題になっているのは、広告配信の際に Cookieウェブビーコンを使用しており、そのことを一般の閲覧者に対して通知せよという部分。通知するだけならまだしも、プライバシーポリシーとして規定し、その中には Cookie の管理について閲覧者(規約では「ユーザー」)が選択できる手段についての情報も記載する必要があります。

 サービスを利用し続けるにはやるしかないのですが、正直自力で用意できる人はそんなに多くないのではないでしょうか。ほかの人が用意したものを利用するか、それとも諦めるかのどちらかになりそうな気がします。私もその中に入りそうですが、幸い期限まではまだあります。挑んでみるのも悪くないかもしれません。

 なお、ヘルプフォーラムに関連スレッドがあります。プライバシーポリシー作成の際には、ここの内容も参考にしようと思っています。

 法人運営で AdSense 広告を掲載しているサイトも参考になりそうです。株式会社Impress Watch のものがしっかりしていていいですね。

Comments (2)

2008年2月15日 金曜日

Google AdSense のガイドブック登場

Filed under: アフィリエイト
時間:22時53分
投稿者:よしとも
AddClips 経由でソーシャルブックマークに登録

 Google AdSense はアフィリエイト広告の定番ですが、日本ではまとまった情報が少ないのが現状です。アフィリエイトの本はあっても、AdSense の本はありません。洋書であれば何冊かあるのですが、言語の壁が大きく立ちはだかります。私自身、導入するときには先人たちがインターネット上で公開している情報にかなりお世話になりました。

 そんな Google AdSense ですが、ついに日本語でまとまった情報を得ることができるようになりました。Google によるガイドブックが公開されたのです。

 残念ながら007年12月の時点の内容となっていますが、申し込みから最適化までを網羅しています。PDF形式のファイルとして公開されていて、総ページ数は60ページ(内2ページは表紙)です。手元の文庫本では厚さが4mmくらいでした。無料で公開されていることを考えれば結構な量ではないいでしょうか。

Comments (0)

2008年2月10日 日曜日

そろそろ Vista に

Filed under: コンピューター,ソフトウェア
時間:17時13分
投稿者:よしとも
AddClips 経由でソーシャルブックマークに登録

 Windows Vista を導入してまもなく1年弱となりました。スリープができないなどの問題はありましたが、慣れもあってだんだんと使い勝手が良くなってきたように感じます。

 最後の難関であるオンラインゲームも、かなり安定してプレイできるようになってきました。ユーザー・アカウント・コントロールの確認ダイアログが出るたびに落ちる問題はありますが、機能自体をオフにすることで対処できています。この状態で、愛用しているソフトがすべて動けば万事OK。

 Vista SP1 も完成し、3月には配布開始予定だそうです。技術的には SP1 は必須ではないそうですが、心理的にはやはり導入への目安になるのではないでしょうか。配布開始から様子見の1ヶ月が過ぎたあたりで、本格的な移行をしたいと思っています。何より、早く新マシンをメインにしたいですしね。快適さがぜんぜん違います。

Comments (1)

2008年1月25日 金曜日

O’Reilly Maker

Filed under: インターネット,書籍
時間:1時15分
投稿者:よしとも
AddClips 経由でソーシャルブックマークに登録

 オライリーという出版社があります。IT系書籍の大手で、大きな書店には専用のコーナーがあったりします。そして、その装丁はかなりの特徴があります。名前は知らなくても、見たことがあるのでは?

 たとえば、こんな感じ。


 タイトルが大きめで、精密な生物のイラストが添えられています。このデザインが妙に役に立ちそうに見えて、出会うたびに欲しくなってしまいます。

 さて、やっと本題。この特徴的なデザインを再現できるツールが公開されています。その名も O’Reilly Maker。そのままですね。作者はオライリーのファンだそうで、技術思考の人なのではないでしょうか。私も含め、ストレートなネーミングを好む人が多いような気がします。

 作ったものはサイトに保存され、あとから訪れた人が見ることができます。ランキングもあって、現在のトップは『詳説/.J』。スラッシュドット・ジャパンですね。海外サイトなのに、2位との差が4倍以上あります。

 面白そうなので、私も作ってみました。日本語だとフォントがいまいちになるので英文に。

O’Reilly Maker

Comments (0)

2008年1月14日 月曜日

Amazon アソシエイト支援プラグイン AmazonLink 0.9.2 リリース

Filed under: AmazonLink,WordPress,アフィリエイト
時間:15時10分
投稿者:よしとも
AddClips 経由でソーシャルブックマークに登録

 Amazon アソシエイト支援プラグイン AmazonLink の0.9.2 をリリースしました。今回はバグの修正のみです。ダウンロードは、いつものように WordPress Plugins/JSeries のページから。

修正内容の解説

 修正したバグは、プラグインファイルを置いてあるディレクトリの名前が正しく取得できないというものです。Windows サーバーでは、そのディレクトリのフルパスとなっていました。

 0.9.1 では、AmazonLink.php の76行目に次のように記述してあります。

  1. $dirs = explode('/', dirname(__FILE__));

 これを、0.9.2 では次のように変更しました。80行目です。

  1. $dirs = explode(DIRECTORY_SEPARATOR, dirname(__FILE__));

 この行の処理は、自分自身(AmazonLink.php)のフルパスからディレクトリ部分を取り出し、それを階層ごとに分割した配列を取得するというものです。Linux などでは階層の区切り文字は /(スラッシュ)ですが、Windows では \(バックスラッシュ。日本語版 Windows では円マークで表示されます)です。区切り文字が正しくなかったため、分割ができていませんでした。

 対応方法として、文字を直接指定するのではなく、定数 DIRECTORY_SEPARATOR を使用するように変更をしました。この定数には実行環境に合わせて階層の区切り文字が入ります。

 ちなみに、次の行で取得した配列の最後の要素を取り出して使用しています。この値が、プラグインファイルの入っているディレクトリの名前となります。

Comments (2)

2008年1月13日 日曜日

Google は、IE7も推奨?

Filed under: インターネット
時間:13時12分
投稿者:よしとも
AddClips 経由でソーシャルブックマークに登録

 GoogleFirefox を推奨しています。内部事情はわかりませんが、少なくとも外部からはそう見えます。Google パックという、複数のアプリケーションをセットにした製品にも、Google ツールバーセット済みの Firefox が含まれています。Firefox 愛用者にとって、比較的親しみを感じる企業といえるでしょう。

 そんな Google のサービスの1つに、Google AdSense があります。いわゆるアフィリエイトサービスで、ページにあった広告が自動的に表示されるものです。
 このサイトでも使用していますが、さきほどその中に Internet Explorer 7(以降、IE7と表記します)の広告がありました。マイクロソフトの広告かと思いきや、その広告の文章は Google が IE7 へのアップグレードを推奨するというもの。リンク先のページのアドレスのドメインも www.google.com と、Google のものになっていました。

 Google にとってマイクロソフトはライバル関係にあるわけで、塩を送りまくっているように見えます。とりあえずダウンロードページを見てみることに。クリックだと規約違反になるので、アドレスをコピーペーストしました。

 ダウンロードページは英語ページでした。広告では単に IE7 にしましょうということしか書かれていませんでしたが、そのページには「Google に最適化された IE7 にアップグレードしましょう」と書かれていました。最適化の内容は、ホームページ(スタートページのほうです)が Google になっていること、Google ツールバーがインストール済みであること、IE7 の検索窓から Google の検索ができるようになってることの3点だそうです。

 IE7 を普及させることが目的ではなく、利用者の多い IE を使って Google をもっと認知してもらうのが目的だったようです。これは、Firefox の場合にも同じことが言えそうです。

 Google の戦略は、無料サービスを広告のように使って知名度を高め、そこから有料サービスの導入につなげるというもののように思えます。以前は無料サービスばかりでやっていけるのかと思っていましたが、今はしっかりと稼いでいるようです。多数の無料サービスで消費者は喜び、そこから有料サービスを始める人によって経営者も喜ぶ。ブログなどを見た限りでは、一般従業員も楽しんでいるようです。今のところよい形になっているようですね。

 最近企業視点が多いですが意図はないです・・・。

Comments (0)
Page 9 of 31« First...7891011...2030...Last »

HTML convert time: 3.905 sec. Powered by

Images is enhanced with WordPress Lightbox JS by Zeo