Hatena::ブログ(Diary)

ymknの日記 Twitter

2011年11月26日

google.comの検索窓に日本語を入れるとbaidoが候補を返してる?

ついさっきFirefoxの検索バーに日本語を入れたら、なぜかbaidoに関する証明書のエラーダイアログが表示された。そして、明らかに中国語っぽい語句が候補として表示された。驚いて検索バーの設定をFirefox組み込みのgoogle-jp.xmlに切り替えてみると(自分は既定の検索エンジンをmycroft.mozdev.orgで公開されているgoogle.comものにしている)、中国語っぽい語句は候補から消えた。

検索プラグインの内容が腐っているのかと疑いsearchpluginsの中のgoogle-us.xmlを覗いてみたけども特にbaidoを指しているようなことはなかった。

Firefoxの検索バーではなく、google.comの検索窓で日本語を入力しても同様だった。google.comでは漢字が入力されるとbaidoから検索候補を拾うようにしているのか?

それにしても今までずっとこの設定で使ってきたけども証明書のエラーなんか見たのは初めてだし、中国語っぽい語句が表示されたこともなかった。ついさっきGoogleが何か変えた?

とりあえずgoogle-us.xml内の検索候補取得URLをgoogle-jp.xmlのものに書き換えて事なきを得ようとしたがダメだった。なぜだ。仕方がないのでgoogle-jp.xmlを使うことにする。

(2011/11/27 0:09追記)

google.comの設定で、表示言語をJapaneseにすると解消(google-jp.xmlの結果と同じになった)された。Firefoxの検索バーはそれでもダメだけど。証明書のエラーが出なくなってしまったので、未だbaidoに繋ぎにいっているかは不明。

2010年12月05日

日本語ファイル名が文字化けしないunzipのビルド手順

愚痴だけで終わらせるのもなんなのでまとめました。

  1. FS#15256 – [unzip] New unzip 6.0 lacks -O -I optionsからパッチを取得する
  2. パッチが対応するバージョンのunzipのソースを取得する
  3. Homebrewでlibiconvをインストールする (OS付属のlibiconvだとシンボルが解決できないので)
  4. インストールしたlibiconvのlibディレクトリのファイルとincludeディレクトリのファイルのリンクを/usr/local/libと/usr/local/includeに作る (Homebrewが作ってくれなかったので)
  5. ソースを展開してパッチ当てる
  6. ソースのunix/MakefileのLFを定義している箇所に-I/usr/local/include -L/usr/local/lib -liconvとか追加する (LFLAGS1に書いてもうまくいかなかった。なんで?)
  7. ソースのunix/Makefileを一つ上のディレクトリにコピーする (INSTALLに書いてあるよ)
  8. make genericする

参考

Mac OS X Snow Leopard (10.6) でlibiconvを必要とするプログラムをビルドするときの注意

簡潔なまとめ

Mac OS X Snow Leopard*1付属のlibiconvは一般的なlibiconvとシンボル定義(関数名)が異なるため、MacportsやらHomebrewやら自前やらでlibiconvとiconv.hを入手してそれを使うべき。

長いまとめ(あるいは愚痴)

これでハマって貴重な日曜日の自由時間が3時間ほど失われた。その無念を込めて記す。

日本語ファイル名を含むZIPファイルを扱うシェルスクリプトを書こうとして、unzipコマンドにファイル名のエンコーディングをよしなに扱ってくれるパッチを当てようとしていたときのこと。unzipのソースをとってきて、パッチを当てて、普通にmakeして終わりかと思いきや、下記のようなエラーに遭遇。

Undefined symbols:
  "_iconv_close", referenced from:
      _charset_to_intern in unix.o
  "_iconv_open", referenced from:
      _charset_to_intern in unix.o
  "_iconv", referenced from:
      _charset_to_intern in unix.o
ld: symbol(s) not found

あー、libiconvが見えてないのね、と理解して、-liconvが付与されるようにMakefileを修正*2して再makeしても状況変わらず。なんでだー!? としばらく悩むこと小1時間。

Leopard に PHP5.2.6 をインストールするによれば、configureスクリプトの--with-iconvを--with-iconv=shared,/usrに変更すればよいとのことだが、今回の都合には合わず断念。_iconv_closeなどをlibiconv_closeなどに修正すれば直ったとの記載もあるので、要はMax OS X付属のiconv.hがなんかおかしいんだろ、と思い、homebrewでlibiconvをインストール*3して、-I/usr/local/includeと-L/usr/local/libが付与されるようMakefileを修正したらうまくビルドできた。

これで無事Windowsで作った日本語ファイル名のファイル入りZIPファイルとかがMax OS Xで文字化けせずに展開できるようになったわけだが、本来作りたかったスクリプトを作る時間はもうないのだった。だるい。

*1:Snow Leopard限定かどうかは知らない。ほかのバージョンでもだめかもしれない

*2:unzipのMakefileは各環境名のサブディレクトリに含まれるMakefileをコピーして使うことになっているが、依然としてコピー元のファイルも読まれるらしく、修正を入れる場合はコピー元と先両方に必要

*3:仕様なのか何なのか知らないがコマンドと違って/usr/local/libや/usr/local/includeにリンクが張られなかった。ので手動で張った

2010年11月21日

au携帯電話のフルサポートコースからシンプルコースへの変更

フルサポートコースは端末を購入してから2年間の使用が前提となっており、2年以内にシンプルコースへの変更を行うと、「フルサポート解除料」として結構なお金を取られてしまう。

それを避けるには、端末を購入してから2年ちょうど経過したときにシンプルコースに変更すればよい。契約期間の計算方法は下記URLの通りなのだが、具体的にいつ契約変更手続きをとればよいのかわからない。そこで、サポート窓口に問い合わせてみた。

曰く、フルサポート解除料の金額については、変更後の契約が実際に有効になる月が何ヶ月目であるかによるとのこと。

つまり、今月が24ヶ月目だとすると、今月に変更手続きをして問題ないということになる(実際に変更後の契約が有効になるのは翌月(25ヶ月目)だから)。

ちなみに今月が何ヶ月目かは、「お客様サポート」の「契約情報照会」の「端末契約情報」のページで確認できる。

[参考]auケータイの「フルサポート解除料」とは?

2010年05月05日

携帯メールだけでWebサイト表示やそのサイトの画像を取得できるゲートウェイ的なもの

auのガンガンメールというサービス(料金プランE)は基本料金だけでメールの送受信にかかるパケット代が無料になるという素晴らしいサービスだ。だが対象はあくまでメールだけで、残念なことにWebサイト閲覧にかかったパケット代は無料にならず、ダブル定額スーパーライト相当の扱いを受けてしまう(すなわち、使えば使うほど料金がかかり、最大で4410円に達してしまう)。

メールを連絡手段程度にしか使っていない自分としては、メールよりもWeb閲覧が無料になってくれた方がうれしい。そこで、Webブラウザを一切使わずにメール機能だけでWebのコンテンツにアクセスできるようなシステムを作れば、無料でWeb閲覧ができるのではないかと考えた(操作性はかなり悪いだろうけれど)。

システムの仕様案は次の通り。

  • 件名ないし本文にアクセスしたいURLを記載し、ある特定メールアドレスにメールすると、そのURLのコンテンツを返送する。ただし、メールの受信サイズ制限があるため内容はテキストのみ。サイトに含まれる画像はすべてURLに置換される。
  • 画像のURLを送ると、その画像を適切なサイズ(画面サイズ的な意味と、ファイルサイズ的な意味で)にリサイズし、添付ファイルとして返送する。
  • メールは数秒程度で返送される。
  • 送信するメールにパラメータを記載する、もしくは送信先アドレスを変更することで、携帯サイト/PCサイトの切り替えができる。

システムの実現方式案は次の通り。

  • 専用のメールアカウント(自分のGmail or 自宅メールサーバ)をcronか何かでスクリプトを実行し監視する。
  • それっぽいメールが来ていたら内容を解析してwgetなり独自クライアントなりでコンテンツ取得。
  • 取得済みのコンテンツからHTMLパーサを使って表示できそうなテキストおよびaタグのhref属性値とimgタグのsrc属性値を抜き出す。
  • 画像ファイルの場合、クライアントの画面サイズと受信可能サイズから最適なサイズにリサイズ。
  • メールを作成して送信元アドレスに返送。

考えられる課題など。

  • GETはいいとしてPOSTとかどうするのか。送信データの入力をどうするか。とりあえずは未対応でもいいけど。
  • 専用メールサーバが必要か否か。自分専用なら自分のGmailアカウント決めうちでいいのかもだが。
  • POPがいいのかIMAPがいいのか。
  • POP/IMAPの監視間隔。できるだけ早く返送してほしいが頻繁に接続していると怒られそう。
  • システムで実装するWebクライアントを携帯端末に偽装する方法。ただ、これは割と情報ありそう。
  • 画像処理の負荷
  • Cookieに対応できるようにするかどうか。
  • Basic認証とか。
  • auに怒られないか。

公衆無線LANがいまいち使えない(個人的な)理由

過去にfonやらWIRELESS GATEやらホットスポットなどの公衆無線LANのサービスを導入していた時期があったけど、思ったより役に立たなかったので今はすべて解約してしまっている。

そもそも自分がこの手のサービスを必要とした理由は、家であらかじめiPod touchのBylineにキャッシュしてきたRSS新着を朝の通勤電車ですべて読み終えてしまい帰りの電車で読むものがなくなって暇だから帰りの電車に乗る前に再度キャッシュし直したい、というもの。

でも、

  • 電波強度をある程度維持するにはAPに割と近寄らないといけない
  • 接続可能になるまで多少の時間を要する
  • つながったらつながったで思ったより通信速度が遅い

などの理由で、RSSのキャッシュが終わるまでの数分間、何をするわけでもなく電柱の下(AP)でぼけっと突っ立ってなきゃいけないのが気まずく。何の変哲もない道ばたの電柱の下だったりするので目立つんですよこれが。

というわけで、公衆無線LANはカフェとかに数時間こもって何かをやる人向けであり、自分のように移動しながら何かをする人には向いていないんじゃないかと思った。たぶん携帯電話会社の各種3Gデータ通信サービスとかが適切なんだろうけど、家に引いている光回線とは別に追加で5000円程度払うのは未だに受け入れられず、帰りの電車はゲームとかして適当につぶしているのでした。ああもったいない。

2010年03月29日

mod_fcgid + mod_userdirなURLにてCodeigniterのURL設定をうまく実現する

CodeIgniter の URL : CodeIgniter ユーザガイド 日本語版の設定を、mod_userdirで設定されたユーザディレクトリ以下に設置されたCodeIgniterに対してうまく実現する方法のメモ。なお、PHPはmod_fcgidでCGI版を動作させている。モジュール版PHPを使っている場合はまた事情が違うかも。

たとえば、http://example.com/~username/myapp/hoge/fugaのようなURLをhttp://example.com/~username/myapp/index.php/hoge/fugaへのアクセスに変換したい。このような場合、次のような設定をするとよい。

.htaccessにRewriteBaseを追加する

RewriteBaseなし(デフォルト)だと、/がprefixとして扱われるため、書き換え後のURLがhttp://example.com/index.php/hoge/fugaのようになってしまう(/myapp/~userdir/が抜けている)。

RewriteBase /~username/myapp/

のように設定することで、想定通りのURLへリダイレクトされる。

CodeIgniterのURI Protocol設定値を'QUERY_STRING'にする

URLの書き換えは前述の設定でうまくいくが、今度はmod_fcgidにて「No input file specified.」なエラーになってしまう。有名な問題らしく少し検索したらいろいろと出ていたが、時間もないのでこのように対応。config.phpのURI Protocol設定を

$config['uri_protocol'] = "QUERY_STRING"

のようにし、.htaccessのRewriteRuleを

RewriteRule ^(.+)$ index.php?$1 [L]

のようにした(index.phpの直後の/を?に変えた)。

とりあえずはこれで解決。

2010年01月03日

EJB2+Servlet+JSPなEARをIDEなしで作る

諸事情によりIDEなしでEJB2+Servlet+JSPなEnterprise Applicationを構築したりする必要があったのでメモ。

想定するアプリケーション構造

Web Browser <---> JSP <---> Servlet <---> EJB(Stateless Session Bean) <---> DAO(POJO) <---> DB
Web Browser
クライアントアプリ。
JSP
入力と出力用画面。Sendボタン押下でto入力欄の内容をServletに送信、結果をResult欄に表示する。
Servlet
EJBを生成し、JSPからの入力を渡してリモートメソッドの実行、結果を受け取りJSPへ返す。
EJB
入力文字列を加工して結果を返却する。

DB用意するのが面倒なのでDAO以降は省略。EJB使っているわけではなく単なるPOJOなので調べる必要なし。

アプリケーションサーバにはWebLogic 9.2MP3を利用。ちょい古めのバージョンだが諸事情のため。

EARの構造

EAR(Enterprise Archive)ファイルは下記のようなディレクトリ構造を持つZIPファイル*1。jarコマンドで作成する。application.xmlファイルが含まれるMETA-INFディレクトリと複数のWARファイルおよび複数のEJB-JAR(EJBを使っている場合)ファイルで構成される。

/
  META-INF/
    application.xml
    weblogic-application.xml
  hello.war
  hello.jar

application.xmlファイルにはEARファイルに含まれるWARファイルとEJB-JAR ファイルの名前を定義する感じ。ここでWARファイルに対してコンテキストルートを定義すると、WARファイル内のweb.xmlで定義されたコンテキストルートは上書きされる*2

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE application PUBLIC '-//Sun Microsystems, Inc.//DTD J2EE Application 1.2//EN' 'http://java.sun.com/j2ee/dtds/application_1_2.dtd'>
<application>
  <description>Hello Enterprise Application</description>
  <module>
    <ejb>hello.jar</ejb>
  </module>
  <module>
    <web>
      <web-uri>hello.war</web-uri>
      <context-root>hello</context-root>
    </web>
  </module>
</application>

weblogic-application.xmlファイルはWebLogic用のapplication.xmlファイル。最小構成においては特に書くことない。一応用意する。

<?xml version="1.0" encoding="ISO-8859-1"?>
<wls:weblogic-application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:wls="http://www.bea.com/ns/weblogic/90" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/j2ee_1_4.xsd http://www.bea.com/ns/weblogic/90 http://www.bea.com/ns/weblogic/90/weblogic-application.xsd">
</wls:weblogic-application>

EJB-JARの構造

EJB-JAR(EJB Java Archive)は下記のようなディレクトリ構造を持つZIPファイル。jarコマンドで作成する。ejb-jar.xmlファイルが含まれるMETA-INFディレクトリとEJBのclassファイル(Homeインタフェース、Remoteインタフェース、Beanクラス)で構成される。

/
  META-INF/
    ejb-jar.xml
    weblogic-ejb-jar.xml
  net/
    jibunstyle/
      hello/
        ejb/
          Hello.class
          HelloBean.class
          HelloHome.class

ejb-jar.xmlファイルには作成したEJB関連クラスのFQCNとBeanの種類などを定義する。

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN' 'http://java.sun.com/dtd/ejb-jar_2_0.dtd'>
<ejb-jar>
  <enterprise-beans>
    <session>
      <ejb-name>Hello</ejb-name>
      <home>net.jibunstyle.hello.ejb.HelloHome</home>
      <remote>net.jibunstyle.hello.ejb.Hello</remote>
      <ejb-class>net.jibunstyle.hello.ejb.HelloBean</ejb-class>
      <session-type>Stateless</session-type>
      <transaction-type>Bean</transaction-type>
    </session>
  </enterprise-beans>
</ejb-jar>

weblogic-ejb-jar.xmlはWebLogic用のejb-jar.xmlファイル。EJB名とそのJNDI名を定義しておく。weblogic-application.xmlやweblogic.xmlでは何も記載いらなかったのでこれも同様である気がするが調べるのが面倒なのでとりあえず。

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE weblogic-ejb-jar PUBLIC '-//BEA Systems, Inc.//DTD WebLogic 6.0.0 EJB//EN' 'http://www.bea.com/servers/wls600/dtd/weblogic-ejb-jar.dtd'>
<weblogic-ejb-jar>
  <weblogic-enterprise-bean>
    <ejb-name>Hello</ejb-name>
    <jndi-name>Hello</jndi-name>
  </weblogic-enterprise-bean>
</weblogic-ejb-jar>

以下、EJB関連のクラス。

package net.jibunstyle.hello.ejb;

import javax.ejb.EJBObject;
import java.rmi.RemoteException;

/**
 * Remoteインタフェース
 */
public interface Hello extends EJBObject { 
  public String say(String to) throws RemoteException; 
}
package net.jibunstyle.hello.ejb;

import java.rmi.RemoteException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;

/**
 * Beanクラス
 */
public class HelloBean implements SessionBean { 
  public String say(String to) { 
    return "Hello, " + to;
  }

  public void setSessionContext(SessionContext sc) {}
  public void ejbCreate() {}
  public void ejbRemove() {} 
  public void ejbActivate() {} 
  public void ejbPassivate() {} 
}
package net.jibunstyle.hello.ejb;

import java.rmi.RemoteException; 
import javax.ejb.CreateException; 
import javax.ejb.EJBHome;

/**
  * Homeインタフェース
  */
public interface HelloHome extends EJBHome { 
  public Hello create() throws RemoteException, CreateException;
}

WARの構造

WAR(Web Application Archive)は下記のようなディレクトリ構造を持つZIPファイル。web.xmlファイルやlibディレクトリ、classesディレクトリが含まれるWEB-INFディレクトリ、JSPやHTMLなどのコンテンツファイルで構成される。

/
  WEB-INF/
    web.xml
    weblogic.xml
    lib/
    classes/
      net/
        jibunstyle/
          hello/
            servlet/
              HelloServlet.class
  hello.jsp

web.xmlファイルにはWARに含まれるServletの定義と、そのServletにアクセスするためのURLマッピング情報などを記載する。

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
  <servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>net.jibunstyle.hello.servlet.HelloServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>
</web-app>

weblogic.xmlファイルはWebLogic用のweb.xmlファイル。特に何も記載しなくてもよい。

<?xml version="1.0" encoding="ISO-8859-1"?>
<weblogic-web-app>
</weblogic-web-app>

libディレクトリには参照する共通ライブラリを、classesディレクトリにはServletのclassファイルを格納する。以下、ServletとJSPのソース。

package net.jibunstyle.hello.servlet;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import net.jibunstyle.hello.ejb.*;

public class HelloServlet extends HttpServlet {
  public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    Properties prop = new Properties();
    String msg = "";
    prop.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
    prop.put(Context.PROVIDER_URL, "t3://localhost:8001");
    Context ctx = null;
    try {
      ctx = new InitialContext(prop);
    } catch (Exception ex) {
      ex.printStackTrace();
    }
    HelloHome home = null;
    Hello hello = null;
    try {
      home = (HelloHome)ctx.lookup("Hello");
    } catch (Exception ex) {
      ex.printStackTrace();
    }

    try {
      hello = home.create();
    } catch (Exception ex) {
      ex.printStackTrace();
    }
    
    String to = request.getParameter("to");
    
    try {
      msg = hello.say(to);
    } catch (Exception ex) {
      ex.printStackTrace();
    }
    
    request.setAttribute("to", to);
    request.setAttribute("result", msg);
    
    request.getRequestDispatcher("hello.jsp").forward(request, response);
  } 
}
<html>
  <head>
    <title>Hello Enterprise Application</title>
  </head>
  <body>
    <h1>Hello Enterprise Application</h1>
    <form action="/hello/hello" method="POST">
      <div>Say hello to ... <input type="text" name="to" value="<%= request.getAttribute("to") %>"></div>
      <div><input type="submit" value="Say">
      <div>Result : <%= request.getAttribute("result") %></div>
    </form>
  </body>
</html>

EARのデプロイ(WebLogic)

できあがったEARファイルをWebLogicのautodeployフォルダにドロップすれば簡単にデプロイされる。あらかじめConfiguration Wizardで適当に作成した新しいドメインmydomainにデプロイする。autodeployディレクトリの場所は以下。

C:\bea\user_projects\domains\mydomain\autodeploy

動作確認

Webブラウザを起動して、 http://localhost:8001/hello/hello.jsp にアクセスする。なお、ポートはmydomain作成時に8001を指定した。

WebLogicに関する注意

  • application.xmlなどのXMLファイルにUTF-8を使うと、「1文字目が思ってたのと違う」的なエラーがでて面倒。BOM付きUTF-8にすれば解決しそうなエラーではあるが面倒なのですべてISO-8859-1で統一した。
  • 管理コンソールからデプロイしようとすると「EARにアクセスできん」的なエラーが出てうまくいかない。ファック。autodeployフォルダを使った。

まとめ

今までIDEにやらせていて詳しく理解できていなかった部分がクリアになった気がした。

おまけ

作業ディレクトリ構成とバッチファイル。なお、JRockitのbinディレクトリにパスが通っている前提で書かれている。

myear
│  hello.ear
│  
├─hello.ear.folder
│  │  hello.jar
│  │  hello.war
│  │  mkear.bat
│  │  
│  ├─hello.jar.folder
│  │  │  mkjar.bat
│  │  │  
│  │  ├─META-INF
│  │  │      ejb-jar.xml
│  │  │      weblogic-ejb-jar.xml
│  │  │      
│  │  └─net
│  │      └─jibunstyle
│  │          └─hello
│  │              └─ejb
│  │                      Hello.class
│  │                      HelloBean.class
│  │                      HelloHome.class
│  │                      
│  ├─hello.war.folder
│  │  │  hello.jsp
│  │  │  mkwar.bat
│  │  │  
│  │  └─WEB-INF
│  │      │  web.xml
│  │      │  weblogic.xml
│  │      │  
│  │      ├─classes
│  │      │  └─net
│  │      │      └─jibunstyle
│  │      │          └─hello
│  │      │              └─servlet
│  │      │                      HelloServlet.class
│  │      │                      
│  │      └─lib
│  └─META-INF
│          application.xml
│          weblogic-application.xml
│          
└─src
    │  buildejb.bat
    │  buildservlet.bat
    │  
    └─net
        └─jibunstyle
            └─hello
                ├─ejb
                │      Hello.java
                │      HelloBean.java
                │      HelloHome.java
                │      
                └─servlet
                        HelloServlet.java
EJBビルド用(buildejb.bat)
@ECHO OFF
SET CLASSPATH=C:\bea\weblogic92\server\lib\weblogic.jar
SET DEST=..\hello.ear.folder\hello.jar.folder
javac -d %DEST% net\jibunstyle\hello\ejb\*.java
サーブレットビルド用(buildservlet.bat)
@ECHO OFF
SET CLASSPATH=C:\bea\weblogic92\server\lib\weblogic.jar;..\hello.ear.folder\hello.jar
SET DEST=..\hello.ear.folder\hello.war.folder\WEB-INF\classes\
javac -d %DEST% net\jibunstyle\hello\servlet\*.java
hello.jar作成用(mkjar.bat)
jar -cf ..\hello.jar *
hello.war作成用(mkwar.bat)
jar -cf ..\hello.war *
hello.ear作成用(mkear.bat)
jar -cf ..\hello.ear *.jar *.war META-INF

*1:厳密に言えば微妙に違うのだろうがまあこの程度の理解でよしとする

*2:複数のWARを一つのEARにまとめたときにコンテキストルートがかぶったりして困る事態を回避するために設定できるのだろう。たぶん。調べてないけど

2009年12月21日

MS-IME使用中にキーボードショートカットで行選択する方法

ExcelではShift+Spaceで行選択できる*1のは皆様ご存じの通り。私もShift+Space→Ctrl+Plusで行挿入とかShift+Space→Ctrl+Minusで行削除とかを多用しまくっています。

この便利なShift+Spaceなんですが、MS-IMEのショートカット(空白挿入)とモロかぶりしているために、日本語入力ON時にShift+Spaceすると期待しない全角スペースが入力されてしまってムキー!とかなるわけです。

じゃあMS-IMEのショートカットキーの設定を無効にしてやればいいのではと、Shift+Spaceのキー設定を削除しても何も変わらないという。これはひどい。俺はExcelで行挿入/削除をするたびに今のMS-IMEの状態を確認してONだったらOFFにしてやるなどの余計な手間をかけ続けなければならないのか・・・!

と、昨日までは思っていたのですが、それの回避方法を今日発見してハッピーになれたのでメモ。

その方法は、MS-IMEのShift+Spaceの設定を残したまま、左から2番目の列(カラム名忘れた)の設定をなし(「-」)にするというもの。

これでIMEがONだろうがOFFだろうが気にせずShift+Spaceできて私は非常にハッピーです。

ちなみにATOKでは設定を変えることなくShift+Spaceできるので職場のPCでATOKが使える幸運な人はその幸せをかみしめるべきですよ。

*1:ちなみに列選択はCtrl+Space

2009年11月29日

おっぱいがついてないほうがいいこともあるんだなあ

ここ1週間、息子(9ヶ月)が頻繁に咳をしている。おっぱいを飲んでいる最中も咳を止められず、何度もむせてしまって最後まで満足に飲めていないようだ。

離乳食は割としっかり食べているので食事という観点では特に問題ないと言えなくもないのだが、やっかいなのが寝かし付けの時である。

おっぱいを飲みながら眠りにつくのが彼のスタイルなのだが、最近は途中で咳き込んでしまうためになかなか眠ることができない。本人はそれでもおっぱいを飲みたがるので、乳飲む→咳き込む→泣く→乳飲む→咳き込む→泣く、のループに陥っている。そのうちに乳が底をつき、乳首もすり切れてヒリヒリじんじん、それでもおっぱいを求める息子に妻はすっかり憔悴してしまう。

そんなときは私が息子を抱いて、妻のいない別室へと移動して寝かしつけるようにしている。もちろん、突然母親から引き離されたことで息子はよりいっそう大きな声で泣きわめき、何とか私の手から逃れ母の元に戻ろうと暴れ始めるのだが、もともと眠たかったこともあって、数十分もするとすとん、と眠りに落ちるのだ。

妻が同じ方法で寝かせようとしても、難しい。なぜなら、彼女にはおっぱいがついており、息子もそれを知っているからだ。それがある以上、息子は求め続けてしまう。

息子が産まれて数ヶ月の頃。1時間以上揺すり続けても息子を寝かしつけられなかった私は、おっぱいを使ってあっさりとそれをやってしまう妻を見て、親としての(努力では埋めることのできない)絶対的な能力の差のようなものを感じ、劣等感に悩んだことがあった。

しかし、今は逆におっぱいがついていないことが有利に働いている。いまこの状況下では妻よりも自分の方がうまく息子を寝かしつけることができる。子育てにおいて男は女に絶対勝てない、敵わないと諦めてしまっていたのに、それをあっさりとひっくり返す現実があってなんとも不思議な気分だ。

思えば最近、男女の違いをいいわけにして無意識のうちに子育てを妻に押しつけがちだったような気がする。——男は子育てに根本的に向いていない、向き不向きがある、自分は働いて稼いでくるから息子のことは頼む、みたいな。

男でも、子育てのすべてに向いていないわけじゃない。だからせめて諦めてしまうのだけはやめようと、そんなことを思った。

2009年11月26日

レンタルサーバ上のデータを自宅PCに定期バックアップ

個人趣味レベルでWebサービスを一般公開する場合、自宅サーバの維持メンテを嫌って格安レンタルサーバーを借りることがよくあると思います。わずかな費用と引き替えに何となく24時間365日近く動き続けてくれるので楽なのですが、格安レンタルサーバーはデータの保証をしていないところが多いため、ユーザーが蓄積してくれたデータを守るためにはバックアップが必要不可欠です。

というわけで先ほど、次から述べるところの2番を作ってみました。ついでなので私のバックアップの一連の流れを紹介してみたりします。

1.レンタルサーバ上でDBダンプ取得(シェルスクリプトをcron実行)

下記スクリプトをcronで毎朝5時に実行し、MySQLのDBダンプをレンタルサーバ上の非公開ディレクトリに保存します。

#!/bin/sh
/usr/local/mysql/bin/mysqldump --default-character-set=eucjpms -uユーザー名 --opt データベース名 -pパスワード > /virtual/アカウント名/mysqlbackup/mysql_`date +%w`.sql

ちなみに借りているレンタルサーバーはCORESERVER.JPです。XREA.COMの上位版ですね。cronやSSH接続が許可されているので重宝しています。

2.自宅のWindows PCでレンタルサーバ上のDBダンプファイルを取得(バッチファイルでftp.exeをWindowsタスクスケジューラで実行)

ここが今日作った部分です。すなわち、昨日まではレンタルサーバー上でDBダンプをとるだけにとどまっており、バックアップとしては全く体をなしていなかったわけですから恐ろしい話です。

下記バッチファイルを自宅サーバ(Windows Home Server)のWindowsタスクスケジューラに登録して、1.で取得したDBダンプファイルを毎週月曜朝4時にFTP取得します。

Windowsタスク登録用
CALL backup.bat backup.ftpcmd D:\Backup\mysqlbackup
実処理(FTP)用
@ECHO OFF
REM 
REM DBダンプファイルをFTP取得
REM 

SET RETVAL=0

IF "%1" == "" GOTO invalidargs
IF "%2" == "" GOTO invalidargs

SET NEWDIRNAME=%DATE:/=%
MKDIR %2\%NEWDIRNAME% >> backup.log 2>&1
IF ERRORLEVEL 2 GOTO mkdirfailed

ftp -s:%1 >> backup.log 2>&1
IF ERRORLEVEL 1 GOTO ftpfailed

MOVE *.sql %2\%NEWDIRNAME% >> backup.log 2>&1
IF ERRORLEVEL 2 GOTO movefailed

MOVE *.log %2\%NEWDIRNAME% > NUL 2>&1
GOTO end

:invalidargs
SET RETVAL=1
ECHO 引数が不正です。 backup.bat FTPスクリプト バックアップ先
GOTO end

:ftpfailed
SET RETVAL=2
ECHO FTPに失敗しました。
GOTO end

:mkdirfailed
SET RETVAL=3
ECHO バックアップ先ディレクトリ作成に失敗しました。
GOTO end

:movefailed
SET RETVAL=4
ECHO ファイルの移動に失敗しました。
GOTO end

:end
EXIT /b %RETVAL%

今読み返してみると、FTPを先にやってからディレクトリ作った方がいい感じですね。面倒なのでこのまま放置ですが。

FTPスクリプト

ftp.exeの-sスイッチにFTPコマンドを羅列したテキストファイルを与えると、その通りにFTPを実行してくれます。

OPEN ホスト名
ユーザー名
パスワード
PROMPT
PASV
BINARY
CD mysqlbackup
MGET *.sql
CLOSE
QUIT

はじめにPROMPT OFFしておかないとMGETで入力待ちになってしまい、バッチが終わりません。また、自宅のネットワークはファイアウォールを兼ねるルーターによってほとんどのポートが閉じられているのでPASVモードにしています。

3.自宅のWindows PCのバックアップ時にまとめてバックアップディスクへ待避(BunBackupをWindowsタスクで実行)

個人のデータは作業用のPCのローカルディスクではなく、自宅サーバー(Windows Home Server)の共有フォルダに入れています。先ほどFTPで取得したDBダンプファイルもこの共有フォルダに入れています。このステップでDBダンプファイルを含む共有フォルダのファイルを毎週月曜朝5時にバックアップ専用のハードディスクへミラーリングします。

Linuxサーバー時代はcronでrsyncしてましたが、WindowsならBunBackupを使うのが手軽でよいと思っています。

おわりに

以上です。たまたまうちはWindows Home ServerでFTPとかしていましたが、別にWindows Home Serverの機能は何一つ使っていませんので、普通のWindows PCであれば何でもOKですよ。

ご参考になれば幸いです。

2009年10月03日

最初に入れるソフトウェアとその設定 (俺向け) for Mac OS X 10.6

ソフトウェア

ATOK
昔からのATOKユーザーなので。
Path Finder
フォルダごとにソート順や表示種類を記憶させたいため、そしてサイドバーに好きなフォルダへのショートカットを入れたいため。
Firefox
慣れ親しんだFirefoxの操作性をSafariで実現できなかったため。具体的にはタブをホイールクリックで閉じる動作と、Google BookmarkをSafariのブックマークとして扱うような機能。
Microsoft Mouse
IntelliMouse Explorer 3.0を使っているため。定評のあるステアーマウスは戻る/進むボタンを検知できなかったので使っていない。最近Sonyの非接触充電可能なBluetoothマウスVGP-BMS77を使い始めたのでステアーマウスが必須になった。
Growl
ポップアップ大好きなので。
StartupSoundPrefPane
起動時の「ぼーん」音を消したいため。
M+ Outline Font
美しく視認性の高いプログラム用等幅フォントとして使うために。もしくは自サイトの画像作成用に。またはブラウザのデフォルトフォントにして気分転換用に。
Picasa for Mac
写真の共有にすでにPicasa Web Albumを使っていることと、iPhotoの写真管理方法が気に入らないため(ファイルはすべてフォルダ構造で管理したいがiPhotoはそれができない)。
CotEditor
Windowsで愛していたEmEditorに近い使い勝手のエディタを探していたら出会った。もっといいのがあれば乗り換えるけども。
App Cleaner
手動でインストールしたアプリをきれいに削除したい。

:Aptana Studio:自サイトの開発・運用・保守のため。Pleiadesも同時にインストール。→すこし凝ったことをやろうとするととたんに不便になるので、最近は普通にeclipseを使っている。ApacheやPHPを別にインストール&設定しなければならないのが面倒だが。

Microsoft Remote Desktop Connection Client for Mac
自宅サーバであるWindows Home Serverの管理のため。
cooViewer
ZIPで固められた画像を連続で見るために。本当はStackRoomを使いたいが、フォルダベースでの管理ができないため敬遠。Intel Macな人はBeta版を使うこと。

:Movist:シンプルながらたいていの動画形式に対応していて、かつ連続再生用途にも。本当はQuickTimeで済ませたいのだが、Flip4Macの使い勝手が悪すぎ、WMVをみるのが不便すぎて断念。定番のVLCやらMPlayerやらは動画ウィンドウのほかに制御用のウィンドウが出てしまうのが気に入らない。→Movistではみれない動画があり、最近は仕方なくVLCを使っている。VLCはVLCで一部の動画が正しく見れなくて困るのだが。。

MPlayer
といいつつこれは必要。音声チャンネルがWMA Proな動画を再生できないので。なんか前はMovistでも再生できていたような気がするのだけど、試行錯誤の経過を忘れた。
MacPorts
開発用に。
Porticus
MacPortsのフロントエンド。パッケージの一覧を眺めたいときに。
Window Wrangler
ウィンドウサイズや位置をキーボードから変更するソフト。ウィンドウの右下が画面外に出てしまってにっちもさっちもいかなくなったときのために。

設定

Dock
画面上の位置を右に。下は遠い。そして自動的に隠す設定。部屋の模様替えで右側にモニタを配置することにしたため、右が不便に。仕方がなく下に戻した。本当は表示させっぱなしが好きだが、そうするとDockの下がデッドスペースになってしまうため(ウィンドウがDockの下に入れないため)
Expose
画面左下にカーソルで「すべてのウィンドウ」。誤操作がうっとうしいのでショートカットキーはすべて無効(ただしfn+F3は有効)。
アピアランス
「使用可能な場合はLCDでなめらかな文字を使用」を無効に。ターミナルのアンチエイリアスが汚くなるため。
デスクトップとスクリーンセーバー
スクリーンセーバーを無効にする。有効だと資料閲覧用にMacを使っている際にうっとうしい目に遭う。
言語とテキスト - 入力ソース
バックスラッシュの入力のために、ことえりの「英数」とATOKの「ひらがな」のみを有効にする
キーボード
キーのリピート速度とリピート入力認識までの時間をすべて最速に。かつファンクションキーを標準のファンクションキーとして使う。ATOKのF7、F8、F9変換を多用するので。そしてTabキーですべてのコントロールにフォーカスが移動できるようにする。ブラウザでアカウント情報入力しているときとかにチェックボックスやラジオボタンにフォーカスが当たらないのは不便なので。
キーボード - 修飾キー
OptionキーとCommandキーを入れ替える。Windows風のCtrlキーとAltキー風の配置で使いたいので。
トラックパッド
副ボタンのクリックを右下で有効に。Windowsの右クリック風にしたいので。逆に2本指の動作の服ボタンのクリックは無効にする。誤爆が多い。
省エネルギー
バッテリー運用時の「この電源を使用するときはディスプレイを少し暗くする」を無効に。電源アダプタ運用時でも元々暗めに設定しているので見づらい。そして、電源アダプタ運用時のコンピュータのスリープを無効に、ディスプレイのスリープを1時間に。資料閲覧用に使っているときや、長時間かかる処理のために放置していることがあるため、勝手に画面が暗くなったりスリープに入ってもらっては困る。
日付と時刻 - 時計
秒を表示、24時間表示、曜日を表示、日付を表示をすべて有効に。今が何年何月何日何曜日何時何分なのかすぐに把握したい。秒は簡易ストップウォッチとして使う。
Microsoft Mouse
今使っている7.1だけの問題かもしれないが、戻る/進むボタンがうまく機能しない。内部的にはCommand+[とかを送っているつもりらしいが、どう見てもCommand+aを送っているようにしか見えない。戻る/進むボタンの動作を「キーストローク」に変更して、それぞれCommand+[とCommand+]を送るように設定してあげればよい。

参考:Microsoft IntelliPoint 7.01 For Mac 不具合?

2010/1/11

参考リンク先が消失しているようなので、内容を思い出せる範囲で。結局のところ7.01には問題があるのでそれ以前のバージョンに戻せばよいという話なのだが、7.01をアンインストールしてから古いバージョン(6とか)のインストーラを起動すると「すでに新しいバージョンが入っています」的なメッセージが出て困った事態に。下記ファイルを手動で削除する必要があるのでした、という話。

/private/var/db/receipts/com.microsoft.keyboard.installer.bom
/private/var/db/receipts/com.microsoft.keyboard.installer.plist
/private/var/db/receipts/com.microsoft.mouse.installer.bom
/private/var/db/receipts/com.microsoft.mouse.installer.plist

各種ソフトウェアのリンクを追加した。

プロフィール

ymkn

たまには自分で何か作りたいSIerのSE、あるいはひ弱な一児のパパ。