messaliberty

hulor と開発チームの最新情報

「常識が変わる」という機会の損失

「○○円貯まったら留学する」とか
「○○年経ったら結婚する」とか
「○○年勤めたら転職する」とか
「自分は○○だから××しない」という話を聞くことがありますが、私はこの考え方が好きではありません。その一番の理由として、この考え方が「それをすることに伴なう考え方と更なる行動の変化」」を考慮していない考え方だと思うからです。

【英語上達のための勉強の例】

例えば、英語の勉強を例に挙げてみます。留学をしたことのない人が「日常会話がある程度聴き取れるようになったらオーストラリアへ留学する」という目標を立てたとしましょう。そういう人に対して私は「いやいや、まずその国へ行ってみなよ」とお薦めします。山登りに例えるならば死なない程度に「まずは登ってみる」ということです。やってみることによって、考え方が変わり、その先の行動も変わります。

「ネイティブが何言ってるかさっぱり分からん~!リスニングもっと頑張らないと!!」
「ヨーロッパ人留学生の発音すごくきれいだな。自分は何て発音が下手なんだ・・・!!」

それらの「恥」は帰国後の勉強の進歩具合を大いに加速してくれることでしょう。
はたまた、

「いや、オーストラリアって案外おもんないな。自分は留学は別にしなくてもいいかも・・・」
「やっぱり自分には語学は向いてない!辞めて他の勉強をしよう」
と言った前向きな気付きによる下山かも知れません。
いずれにせよ「とりあえずやってみることによる精神的変化とそれに引き起こされる行動の変化」が重要なわけです。

【スノーボードでの例】

スノーボードが上手くなりたかったら、本を読んでフォームを勉強するのは一旦辞めて、挫折を味わいにゲレンデに滑りに行き、その後、本で勉強すれば良いと思います。本を読んで正しいフォームを身につけることもとっても重要です。ドラマティックな成長のためには「正しいやり方を真似ること」が必須です。ただしそれは「もうあんな恥はかきたくない!」という考え方への変化を起こしてからです。「颯爽と滑っている自分がなんだか想像できる」という考え方の変化かも知れません。その経験があるのとないのとでは本で学ぶという「行動」時の集中力や真剣さに差が出て、成長放物線の角度が変わってくると思うのです。

【会社組織においても一緒】

ちょっと話が変わりますが、これらは会社組織においても同じことが言えると思います。あなたの会社が年間目標を立てたとしましょう。
「今年の年末には年商1000万円達成するぞ!!」1000万円が山頂です。この場合は「1000万円を達成するための数値ベースでの事業計画を立てること」が「具体的な行動」です。それは「1000万円達成するには今のままでは全然無理だ!」という精神的変化を促します。「現在地を知る」という点において「自分の英語が通じなかった」「リフトから降りれなかった」という「恥」と一緒です。以前関わりのあった年商2000万の会社では「年商10億!」と壁に貼ってありましたが、具体的方法は話されていませんでした。何となく目標が達成されることはないと思うのです。また、山頂にたどり着く間のマイルストーンが見えずに山登りするのは精神的負担がかかります。山頂が見えていないと尚更です。

英語やスノーボードの場合、行動が「本当にやりたいかどうか?」という精神的変化(願望)を起こし、更なる行動につながると思います。会社の売上の場合は「本当に出来るかどうか?」という精神的変化(焦り)を起こし、更なる行動につながると思います。

【常識は変化する】

主旨が「目標設定の重要さ」のようになってしまいましたが、一番書きたかったことは「行動してみることにより気持ちに変化が起こる」ということです。つまりは「常識が変わっていく」ということです。
冒頭に戻って、例えば「今付き合って3年だけど5年経ったら結婚する」としましょう。仮に3年目で結婚したとして、4年目、5年目間に精神的変化が起こります。
「別に欲しくなかったけど何だか子供が欲しくなってきた」
「精神的に落ち着いて、人に優しくなれるようになった」
結婚を先延ばしにした場合に比べ、6年目の時点では全く別の人生になっていると思うのです。

「入社したけど面白くなかった。でも3年は勤めると決めたから絶対辞めないぞ」という場合も面白くないのであれば辞めてもっと楽しい会社に入ったらいいのです。
「転職して新しい会社でタイと取引をすることになって、タイ語を勉強しようかななんて気になってきた」なんて素敵です。

「自分が社交ダンスなんてガラじゃないよ」なんて思っていても、いざやってみたら楽しくて習いに行き始めた。新たな生涯の趣味が一つ増えた!なんてことになるかも知れません。

行動してみることによって以前は考えられなかった考え方の変化が訪れるかも知れませんが、そしたらそっちへ向かってまた走り出せばいいのではないでしょうか。現在の状態でくすぶって「自分(会社)の中での常識の変化とそれに伴なう行動」という機会を損失するよりよっぽどか成長すると思います。個人としても会社の一員としても「具体的行動による常識の変化」を起こしていくように心がけようと改めて思った次第です。

Share and Enjoy:
  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • email
  • MySpace
  • Reddit
  • Tumblr
  • Yahoo! Buzz
  • StumbleUpon
  • Technorati
  • Twitter

Google App Engine 上の JRuby でメールを受信する方法

以下の組み合わせで動作を確認しています

  • jruby-1.4.0
  • rails 2.3.2
  • appengine-java-sdk-1.3.0.zip
  • appengine-apis-0.0.11.jar (0.0.12 でもメール受信部分の機能は入っていないっぽい)

GAE/J でのメールの受信の流れは以下のようになっています。

  1. (string)@(appid).appspotmail.com 宛へメールを送る
  2. 次のURLが呼び出される http://(appid).appspot.com/_ah/mail/(string)@(appid).appspotmail.com
  3. ↑ の URL に関連付けられた method が呼び出される
  4. TomCat(?) の HttpServletRequest req の req.getInputStream() から受信したメールを読み込む

※ (string)には好きな文字列、(appid)には GAE の appid が入ります。

Java でメールを読み込む部分のサンプルは以下のような感じになります。
Receiving Email – Google App Engine – Google Code

import java.io.IOException;
import java.util.Properties;
import javax.mail.Session;
import javax.mail.internet.MimeMessage;
import javax.servlet.http.*; 

public class MailHandlerServlet extends HttpServlet {
    public void doPost(HttpServletRequest req,
                       HttpServletResponse resp)
            throws IOException {
        Properties props = new Properties();
        Session session = Session.getDefaultInstance(props, null);
        MimeMessage message = new MimeMessage(session, req.getInputStream());

特に GAE 用の API を呼び出しているわけでもなく、HttpServletRequest にアクセスしているだけです。
ただ jruby の場合、HttpServletRequest のインスタンスが見あたりません・・・。
なので、少しトリッキーなことをして HttpServletRequest のインスタンスを取ってくる必要があります。
rails 2.3.2 で動作確認をしていますので、sinatora などの場合、HttpServletRequest を取ってくる辺りの処理を変更する必要があるかも知れません。(未確認)
それが↓のコード appengine_mail_ext.rb になります。

以下のエントリーの Java のコードを参考にさせていただきました。
Google App Engine for Javaでのメール受信コード – きしだのはてな

appengine_mail_ext.rb

# -*- coding: utf-8 -*-

begin
  module AppEngine
    module Mail
      import com.google.appengine.api.mail.MailServiceFactory
      import com.google.appengine.api.mail.MailService

      import java.io.IOException
      import java.io.InputStreamReader
      import java.io.BufferedReader
      import java.util.Properties
      import javax.mail.Message
      import javax.mail.Session
      import javax.mail.internet.MimeMessage
      import javax.servlet.http.HttpServletRequest
      import javax.servlet.http.HttpServletResponse

      module_function

      def java_servlet_request(controller)
        begin
          url = controller.instance_variable_get(:@url)
          req = url.instance_variable_get(:@request)
          env = req.instance_variable_get(:@env)
          java_servlet_request = env['java.servlet_request']
        rescue
          raise "java.servlet_request not found."
        end
        return java_servlet_request
      end

      def receive(java_servlet_request)
        props = Properties.new
        session = Session.getDefaultInstance(props, nil)
        message = MimeMessage.new(session, java_servlet_request.getInputStream())

        return nil if message.nil?

        mail = {
          :subject      => message.get_subject,
          :content_type => message.get_content_type,
        }
        mail[:from]     = message.get_from[0].to_string rescue nil
        mail[:to]       = message.get_recipients(Message::RecipientType::TO).map {|address| address.to_string } rescue nil
        mail[:cc]       = message.get_recipients(Message::RecipientType::CC).map {|address| address.to_string } rescue nil
        mail[:bcc]      = message.get_recipients(Message::RecipientType::BCC).map {|address| address.to_string } rescue nil

        if message.is_mime_type('text/plain')
          mail[:content] = message.get_content
        elsif message.mime_type?('multipart/alternative')
          content = message.get_content
          (0..(content.count-1)).each do |i|
            bp = content.get_body_part(i)
            if bp.mime_type?("text/plain")
              r = InputStreamReader.new(bp.get_input_stream)
              buf = BufferedReader.new(r)
              msg = ''
              while line = buf.read_line
                msg << line + "\n"
              end
              mail[:content] = msg
              break
            end
          end
        else
          raise "unknown content type."
        end
        return mail
      end
    end
  end
rescue NameError #LoadError
  # appengine api wasn't available so neither can the store be
  # This will occur when run script/*
end

この appengine_mail_ext.rb を config/environment.rb 内で require するか、
config/initializers へコピーすることで、
AppEngine::Mail が拡張され、メール受信の準備が整います。
(AppEngine::Mail へ受信の method をつっこんでよかったのかなぁ・・・)

次に、メールを受信する部分のコードを action に書いてメール受信処理が完了します。

http://(appid).appspot.com/_ah/mail/(username)@(appid).appspotmail.com へのアクセスを action につなげる部分は、
Java では web.xml に書きますが、GAE/J + jruby + rails の場合、いつも通り config/routes.rb を編集すればいいようです。

以下は MailHandleController#receive へ割り当てた例:

ActionController::Routing::Routes.draw do |map|
  # ...
  map.mail      '_ah/mail/:email', :controller => 'mail_handle', :action => 'receive', :email => /.*/

最後に、メールを受信するコントローラーとアクションを書いて完了です。
↓はメールを受信して、それをログに表示するサンプル。

class MailHandleController < ApplicationController
  def receive
    email = params[:email] # guess_gmail(params[:email])
    mail = AppEngine::Mail.receive(AppEngine::Mail.java_servlet_request(self))

    Rails.logger.debug("email          : #{email}")
    Rails.logger.debug("mail[:content] : #{mail[:content]}")
    Rails.logger.debug("mail[:subject] : #{mail[:subject]}")
    Rails.logger.debug("mail[:from]    : #{mail[:from]}")
    Rails.logger.debug("mail[:to]      : #{mail[:to]}")
    Rails.logger.debug("mail[:cc]      : #{mail[:cc]}")
    Rails.logger.debug("mail[:bcc]     : #{mail[:bcc]}")

    render :text => "mail received.\n"
  end
end

おしまい。

Share and Enjoy:
  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • email
  • MySpace
  • Reddit
  • Tumblr
  • Yahoo! Buzz
  • StumbleUpon
  • Technorati
  • Twitter

[英語] 勉強せずに英語を習得する方法 1 – はじめに

How to

How to

2010年の誓いとして個人の Blog にも書いたのですが、今年は英語の勉強をしないことに決めました。これまでも何をしたということは無かったのですが、やろうやろうと思い続けるのもすっきりしないので、止めることにしました。ただ、現状に満足しているわけではありませんので、これからも引き続き向上させることは意識します。

では、どうやって勉強せずに英語力を向上させようというのか。このテーマでシリーズ化してみます。

バックボーン

書いている本人が英語まったくしゃべれないのでは説得力が無いので、少しバックボーンを説明します。僕はこれまでに TOEC を受けたことがないし、特別な勉強をしたこともありません。そのため文法や語彙力はひどいものです。ですが、いまは毎日英語を使って仕事をしています。

普段のオフィスでの会話やテキストチャットなどのコミュニケーションは、英語と日本語の割合が50%ぐらいです。会議やメールは2か国語が基本なのです。英語が共通語となる来客があると、90%ぐらいが英語になります。

実際どの程度の英語力なのかについては、僕の英語を見ていただくのが良いと思います。ブログは個人のものも会社のものも英語と日本語で書いています。このエントリーのように例外的に日本語だけ、あるいは英語だけの時も有りますが、まずは英語で書いてそれを日本語化するので、英語版が基本です。

あと何よりの証明が動画です。技術情報ポッドキャスト、messa.tv をやっていますので、どんな英語を話しているのかは一目瞭然です。ぜひご覧ください。

結論

さっそくですが、このシリーズ共通の結論から言います。タイトルの答え、つまり、勉強せずに英語を習得する方法です。

英語圏の Blog を読みまくり、Podcast を聴きまくり、英語を話す人達としゃべりまくる。

なんのひねりもありません。この説明をすると、どれも始めるのが難しいとか、続かないとか、そういった反論を受けます。だったら英語を諦めてくださいとしか言えないのですが、もう少しお付き合いください。

語学は体育です。英語に限らず外国語ができるということは、頭のつくりが優れているからできるのでは無く、練習をいっぱいやったからできるのです。先程書いた結論というのは、すべて体で覚える方法です。

また、社内でも話していたのですが、英語を習得するためにもっとも大切なことは、「挫折を味わうこと」だと思っています。理解できない、伝わらない、そのもどかしさを痛感し、とどめにコミュニケーションがうまく取れないことによる辛い体験をすることが、何よりも必要だと思います。そんな思いをしてまでなぜ英語を使えるようになりたいのか?その答えが見つかる人は、必ず英語が自分の体の一部になります。そしてそのために必要なアクションが、先程挙げたものです。

では、次回以降敷居の低いものから順に、生活の中に取り入れて行く方法を紹介します。

Share and Enjoy:
  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • email
  • MySpace
  • Reddit
  • Tumblr
  • Yahoo! Buzz
  • StumbleUpon
  • Technorati
  • Twitter

WordPressで構築したサイトでFlashコンテンツを表示させる

全く基本的なことで恐縮ですが、Web制作においてFlashコンテンツを表示したいということがあると思います。

今回はWordPressで構築したサイト内でFlashコンテンツを表示させる際、ブラウザ間で不具合なく表示させるのにしばし時間を要してしまったこともあり、またまたメモ代わりとしてポストさせていただきます。

当初は普通に書き出されたソースをコピペで終了だと思っていたのですが、IEで表示されなかったりembedタグは非推奨であったりと足止めを食らってしまいました。

WordPress上でflashコンテンツを表示させる

WordPress上でflashコンテンツを表示させる

表示する2つの方法

1. plugin「WP-SWFObject」を使用する

そもそもこれが一番簡単だったのですが、この方法を敢えて取らなかったために時間を要してしまいました。逆に言うと最近はすぐにpluginに逃げてしまいます。

「WP-SWFObject」というプラグインをインストールし、有効化します。

そして、以下のソースを埋め込むだけです。

[SWF]表示したいswfファイルの絶対パス,横幅,縦幅[/SWF]

以上でIE7,IE6,Firefoxにて表示されました。

2. objectタグだけを利用して表示する

embedタグを使用するとXHTMLではembedタグは定義されていないと言われて怒られます。ということで、objectタグだけで表示しないといけません。

表示させるのに必要なソースは、

<object data="表示したいswfファイルの絶対パス" type="application/x-shockwave-flash" width="横幅" height="縦幅"><param name="movie" value="表示したいswfファイルの絶対パス"></param><param name="play" value="true"></param><param name="loop" value="true"></param></object>

でOKです。

こちらもIE7,IE6,Firefoxにて表示されました。

まずは表示させるということで今回はこれで良しとします。

Share and Enjoy:
  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • email
  • MySpace
  • Reddit
  • Tumblr
  • Yahoo! Buzz
  • StumbleUpon
  • Technorati
  • Twitter

タリーズで見つけた Google のマーケティングキャンペーンにひとこと

Google at Tullys

Google at Tully's

messa.tv でも最近よく取り上げる話題ですが、Google は日本の検索市場で一位になるためにこれまで以上の力を入れています。積極的に TV に出演したり、CM を流したり、街中でキャンペーンを実施したり。

タリーズコーヒーでも写真のようなカードを見つけました。いまなら無料で Wi-Fi が使えます。でも、過剰な期待は禁物。なんとこのキャンペーン、接続可能な時間はわずか30分!

Wi-Fi の実際のプロバイダーである NTT やタリーズをはじめとするパートナー企業は長時間の無料化に抵抗があるのでしょうが、これでは印象は良くありません。Google がやるのなら、もっと強烈なインパクトを与えてくれるものだと期待してしまいます。

Share and Enjoy:
  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • email
  • MySpace
  • Reddit
  • Tumblr
  • Yahoo! Buzz
  • StumbleUpon
  • Technorati
  • Twitter
Get Adobe Flash playerPlugin by wpburn.com wordpress themes