moshをCentOS6.5にインストールしてMacで使用する方法


今までサーバへ接続するにはSSHを使用していましたが、
今更ながらmoshというのをインストールしてみました。

moshの説明は以下のURLを参考にしてください。
Mosh: the mobile shell


moshを使うにはサーバとクライアント両方インストールする必要があります。
という事でインストール方法となります。

  • CentOS6.5にmoshをインストール

yumでインストール可能ですが、
epelリポジトリにしかないのでepelからインストールします。

yum --enablerepo=epel install mosh

これでインストールは終了です。もしエラーが発生した場合、
必要なライブラリ等をインストールしてください。

なお、moshをインストール後はサービス等を特に起動する必要ありません。
moshをインストールするのみです。

Macmoshをインストールするにはbrewから可能です。

brew install mobile-shell

ちなみに

brew install mosh

でも同じものが入ります。

  • 使い方

moshを使うには通常のsshと同じく

mosh root@ipアドレス

とすれば接続できます。sshを使うときと同じですね。


iptablesを設定していた場合、
-A INPUT -m state --state NEW -m udp -p udp --dport 60000:61000 -j ACCEPT
udpポートを通信可能にしておいてください。


以上でmoshが使えるようになります。

IE9以降でのevent.pageX、event.pageYの取得方法


こんばんみ。という懐かしいフレーズで今日はIE9以降で困った事を書いてみましょう。

早速ですがこんな感じのコードでツールチップとやらを作ってみました。

var tooltip = '<div class="tooltip">てへぺろ</div>';
$('body').append(tooltip);

$('hoge').mouseover(function(e) {
  $('.tooltip').fadeIn('500');
  $('.tooltip').fadeTo('10', 1.9);
}).mousemove(function(e) {
  $('.tooltip').css('left', e.pageX + 5);
  $('.tooltip').css('top', e.pageY - 20);
});

この方法だとスクロールしない画面であれば問題なく動作するんだけど、
縦長や横長にスクロールされる画面の場合、
IE9以降だとツールチップのX、Y作業がずれてしまい正常に動作してくれません。
こんな感じですね。
Edit fiddle - JSFiddle
他のブラウザやIE8までならきちんと動きます。

これは困った、どうしようかと悩んでいたのですが下記の方法で対処しました。

var tooltip = '<div class="tooltip">てへぺろ</div>';
$('body').append(tooltip);

$('hoge').mouseover(function(e) {
  $('.tooltip').fadeIn('500');
  $('.tooltip').fadeTo('10', 1.9);
}).mousemove(function(e) {
  pageX = e.clientX + (document.body.scrollLeft || document.documentElement.scrollLeft);
  pageY = e.clientY + (document.body.scrollTop || document.documentElement.scrollTop);
  $('.tooltip').css('left', pageX + 5);
  $('.tooltip').css('top', pageY - 20);
});
  pageX = e.clientX + (document.body.scrollLeft || document.documentElement.scrollLeft);
  pageY = e.clientY + (document.body.scrollTop || document.documentElement.scrollTop);

とe.pageX、e.pageYではなく、こうする事でIE9以降でも無事にツールチップがマウスの軌跡についてくれるようになりましたよっとノシ
これで多分、問題ないと思いますけど。。。

いい加減IEは無くなってほしい物です。

GoogleMapの画面サイズを動的にブラウザ一杯に表示したい時の対処法


ねむたーい。ねむたーーい。
というわけで引き続きGoogleMapネタです。

GoogleMapの画面サイズを幅一杯に広げる時に困ったのでメモしときます。
どういう事かというと、

<div id="map-canvas" style="width: 400px; height: 400px;"></div>

とGoogleMapを横幅400px以内に表示してて、
jQueryを使ってあるボタンが押され時にGoogleMapをブラウザサイズ一杯に広げて表示したかったわけです。
こんな風に。

$(function () {
  $('hoge-btn').click(function() {
    $('#map-canvas').css({'width': '100%', 'height': '100%'});
  });
})

すると、こんな感じになってなぜか画面一杯に広がらない。。。


これは困った。。と悩んでいて検索すると、

google.maps.event.trigger(map, 'resize');

というeventをハケーン。
mapというのはnew google.maps.Map(document.getElementById("map-canvas"))の事ね。
というわけで、早速

$(function () {
  $('hoge-btn').click(function() {
    $('#map-canvas').css({'width': '100%', 'height': '100%'});
    google.maps.event.trigger(map, 'resize');
  });
})

としてみると、、、

無事に表示されるようになりました。


いやぁ一時はどうなるものかと思いましたよ。良かった良かった。

bootstrapでgooglemapのZoomControlStyleを使う時の注意点

今日はガラッと変わってgooglemapの事を書いてみます。
bootstrapを使った時に以下の点ではまりました。
bootstrapで良くある書き方でmap-canvasにgooglemapを表示したい時に、

    <div class="container-fluid">
      <div class="row-fluid">
        <div class="span3">
        </div>
        <div class="span9">
           <div id="map-canvas"></div>
        </div>
      </div>
    </div>

と書いたらデフォルトのZoomControlStyleの表示がおかしくなります。
こんな感じね。

これは困ったという事で調べてみると以下のようにすれば解決するようです。
スタイルシートに、

#map-canvas img {
 max-width: none;
 min-width: 0px;
}

と書くだけでデフォルトのZoomControlStyleが表示されるようになりますたノシ


こんなしょうもない事で時間をつぶしてしまったorz

Symfony2のCommandでproductionモードで実行する方法

前にCommandを使ってバッチからメール送信する時の事を書きました。
これね id:amidaike:20130414

で、無事にメール送信できたのでいざ本番で試そうと思ったところ、
困った事にdebugモードで実行されてしまう。。なぜだ。。
という事でまたまた調べましょう。まんどくせぇ。。

たとえばCommandのconfigureを以下のように書いた場合、

protected function configure()
{
    $this->setName('app:mail:sendmail')->setDescription('メール送信だよ〜ん');
}

と書いた場合、これをいざ実行しようとする時は、

app/console app:mail:sendmail

と書けば実行されるんですが、このままだとdebugモードで実行されてしまいます。
何なんだよ一体ということで、consoleのヘルプを眺めたらこんな風に書いていました。

$ app/console --help
Usage:
 help [--xml] [command_name]

Arguments:
 command               The command to execute
 command_name          The command name (default: "help")

Options:
 --xml                 To output help as XML
 --help (-h)           Display this help message.
 --quiet (-q)          Do not output any message.
 --verbose (-v)        Increase verbosity of messages.
 --version (-V)        Display this application version.
 --ansi                Force ANSI output.
 --no-ansi             Disable ANSI output.
 --no-interaction (-n) Do not ask any interactive question.
 --shell (-s)          Launch the shell.
 --process-isolation   Launch commands from shell as a separate processes.
 --env (-e)            The Environment name. (default: "dev")
 --no-debug            Switches off debug mode.

Help:
 The help command displays help for a given command:
 
   php app/console help list
 
 You can also output the help as XML by using the --xml option:
 
   php app/console help --xml list


どうやら--envと--no-debugを使うようです。
というわけで早速先ほどのコマンドを修正して実行してみましょう。

app/console --env=prod --no-debug app:mail:sendmail

と書いて実行すると、、、何という事でしょう。
無事にproductionモードで実行する事が出来ました。


う〜ん、またハマってしまった。。。
公式サイトのどこに書いているんだろうか。。おいらの探し方が悪いのか。。。。

Symfony2を勉強する時に読んだ本

前回久しぶりにSymfony2の事を書いたので、
今回はSymfony2を使う時に参考になった本を紹介します。

Symfony2を勉強するにあたっては
http://docs.symfony.gr.jp
を読んだりすると思います。

また、phpを勉強する時と同じくネットとかで調べればある程度分かるんだけど、まとめて勉強したいという時は以下の本が凄く役に立ちました。

偶然にもこの記事id:amidaike:20121126で書いたパーフェクトPHPの著者と同じ方でした。
この本はSymfony2で開発する方には絶対お勧めです。

但し、Symfonyのバージョンが2.0を対象にしているのでそのままでは使えないコードとかもあるんだけど、
Symfony2を使ってサイトを作るには凄く参考になります。

DIの説明も載っているのでDIって何?という方にも概要は掴めると思います。

また、Twitter BootstrapやGitを使っているので余り詳しくないという方も参考になります。
Twitter Bootstrapのバージョンも古いんですけど。

多分、日本で売っているSymfony2の唯一の本ではなかろうかと。(調べてないから他にもあるかも知れませんが)


公式サイトで充分という人は買わなくて良いかも知れないけど、
サイトを見ても分からないという方は迷わずこの本を買いましょう。

ちなみに僕はこの本を読んでSymfony2.1で開発を始めました。
この本を読んでいなかったら今頃酷い目にあっていたでしょう。。。

Symfony2でCommandからメール送信する時のちょっとした設定

久しぶりにSymfony2の事を書きますよノシ
過去に書いていた説明をすっ飛ばして、
コンソールコマンド(Commandの事ね)からメールを送信する時にメチャクチャ困ったから書いておく。


今回はメール送信に標準のswiftmailerを使ってます。
Symfon2を使う方は必ずお世話になりますね。
で、メール送信時はfileにspoolするんじゃなくてmemoryで設定してます。

話はここからで下記の例ではControllerにメール送信用のコードを書いた場合だけど、
特に意識する必要も無く、

$message = \Swift_Message::newInstance()
    ->setSubject('メール送信しますたノシ')
    ->setFrom(array('from@examples.com'))
    ->setTo('to@examples.com')
    ->setBody('メール送信だよ〜ん')
;

$this->get('mailer')->send($message); 

とこんな風に書けばメールは送信されますですはい。


じゃあ今度は同じようにCommandに

$message = \Swift_Message::newInstance()
    ->setSubject('メール送信しますたノシ')
    ->setFrom(array('from@examples.com'))
    ->setTo('to@examples.com')
    ->setBody('メール送信だよ〜ん')
;
$mailer = $this->getContainer()->get('mailer');
$mailer->send($message);

と書いてコマンドを実行するとなぜかメールが送信されません。

何でかな〜どうしてかな〜寒いな〜寒いな〜怖いな〜
と思って悩んでSwiftmailerBundleのソースを眺めていると一筋の光明が。
上記だけではダメらしくて以下のコードもCommandへ記述する必要がありますた。

$transport = $mailer->getTransport();
if (!$transport instanceof \Swift_Transport_SpoolTransport) {
    return;
}

$spool = $transport->getSpool();
if (!$spool instanceof \Swift_MemorySpool) {
    return;
}

$spool->flushQueue($this->getContainer()->get('swiftmailer.transport.real'));

transportとspoolを宣言した後のif文は念のためにチェックしているだけで、
memory以外を設定している人はどうなるか知りません。
で、肝心の

$spool->flushQueue($this->getContainer()->get('swiftmailer.transport.real'));

が必要でした。
これを記入後、コマンドを実行すると無事にメールが送信されるようになりますたノシ

Commandの全文は端折ってメール送信部分だけを書いておくとこんな感じ。

$message = \Swift_Message::newInstance()
    ->setSubject('メール送信しますたノシ')
    ->setFrom(array('from@examples.com'))
    ->setTo('to@examples.com')
    ->setBody('メール送信だよ〜ん')
;
$mailer = $this->getContainer()->get('mailer');
$mailer->send($message);
$transport = $mailer->getTransport();
if (!$transport instanceof \Swift_Transport_SpoolTransport) {
    return;
}

$spool = $transport->getSpool();
if (!$spool instanceof \Swift_MemorySpool) {
    return;
}

$spool->flushQueue($this->getContainer()->get('swiftmailer.transport.real'));


いやぁはまったはまった。凄くはまった。
これは公式サイトにも書いておいてほしいものですね。