nDiki : さくらのレンタルサーバ

2012年2月7日 (火)

Unison で同期しているディレクトリの一部を Dropbox フォルダへ移動してどこでも編集可能に

さくらのレンタルサーバ上にあるデータはローカルの Linux BOX と Unison で同期している。 この nDiki の記事も Emacsテキストファイルで作成した後、Unison で同期して公開している。

 [さくらのレンタルサーバ]
 /home/naney 
     |
   <Unison> 同期
     |
 [ローカル PC]
 /home/naney/site/site_name/sync

ただこれだとローカル PC から離れている時の記事の下書きとか面倒くさい。ということで Dropbox 上に一部を置くことにした。同期している全てのデータを Dropbox 上に置くのはナンセンスなので、一部のディレクトリのみ。

Dropbox フォルダ側は単一のディレクトリツリーである必要があるので、Unison で同期しているディレクトリのツリーの一部を Dropbox フォルダ上へ移動し、シンボリックリンクに置き換え。Unison の設定ファイルに follow = path share/some_dir を追加してそのディレクトリはシンボリックリンクを辿ってその先の中身で同期するようにした。

 [さくらのレンタルサーバ]
 /home/naney 
     |
   <Unison> 同期
     |
 [ローカル PC]
 /home/naney/site/site_name/sync
     /home/naney/site/site_name/sync/share/some_dir
         |
       <symbolic link>
         |
     /home/naney/var/Dropbox/site/_name/sync/some_dir
 /home/naney/var/Dropbox/site/_name/sync
    |
 [Dropbox]

これで Dropbox を入れた他の PC や Android 端末から記事の作成・編集ができるようになった。

ちなみに Google Chrome に SourceKit をインストールすると、Web ブラウザ上から直接 Dropbox 上にテキストファイルを作成したり既存のテキストファイルを編集したりできて便利。 テキストファイルUTF-8LF になるのでいい感じ。

スポンサード リンク
[ 2月7日全て ]

2012年3月8日 (木)

特定の Git リポジトリだけ読み書きできる SSH 鍵を作る

サーバ上の特定の Git リポジトリのみにアクセスできる SSH 鍵を作ってみた。

具体的にいうと、SSH 鍵を作って、さくらのレンタルサーバ上に dotfiles 用 Git リポジトリを作ってそこだけを読み書きできるように設定した。今回は Gitosis とかそういう大袈裟なのは使わないない方向で。

サーバ上に Git リポジトリを作る

まずサーバに SSH で入ってホームディレクトリの下に Git リポジトリを作成。

 $mkdir -p /home/naney/var/git/dotfiles.git
 $cd /home/naney/var/git/dotfiles.git
 $git --bare init

特定の Git リポジトリだけにアクセスできる git-shell ラッパーを用意する

通常の git-ssh は特定のリポジトリだけアクセスを許可するとかできない。 なのでさきほど作った Git リポジトリのみアクセスできるようなラッパーを用意する。

 #!/bin/sh

 repo=$(eval echo $(echo ${SSH_ORIGINAL_COMMAND} | cut -d' ' -f2))
 if [ "x${repo}" != "x/home/naney/var/git/dotfiles.git" ]; then
   echo "No access granted to reporitory ${repo}" 1>&2
   exit 1
 fi

 /home/naney/local/git/bin/git-shell -c "${SSH_ORIGINAL_COMMAND}"

これをサーバ上で /home/naney/local/bin/git-shell-dotfiles という名前で保存し実行権限をセットしておく。 なお Git は ~/local/git の下に以前インストールしておいてある。

複数のディレクトリを指定できるようにするとか、そういのはよしなにどうぞ。

ローカルホスト上で専用の SSH 鍵を作ってサーバに送る

 $cd ~/.ssh
 $ssh-keygen -C dotfiles -f id_rsa.dotfiles
 $ssh-copy-id -i ~/.ssh/id_rsa.dotfiles naney@example.sakura.ne.jp

サーバ上の authorized_keys を修正する

さきほどの ssh-copy-id で、サーバ上の ~/.ssh/authorized_keys の最後に新しい鍵の行が追加されている。この行の先頭に以下を追記する。

command="/home/naney/local/bin/git-shell-dotfiles",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty

これでこの鍵で接続した時は git-shell-dotfiles のみが直接実行できるようになる。

なおシェルをフルには使わせてくないけれど、任意のディレクトリの Git リポジトリの読み書きができても良いのであれば直接 git-shell を指定する。

command="/home/naney/local/git/git-shell -c \"$SSH_ORIGIAN_COMMAND\"",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty

ローカルホスト上の ~/.ssh/config を編集

config ファイルに

 IdentityFile ~/.ssh/id_rsa.dotfiles

を追記し、この鍵も使えるようにしておく。

clone してみる

きちんとできていれば

 git clone naney@example.sakura.ne.jp:/home/naney/var/git/dotfiles.git

とすることで clone できることを確認。またサーバ上の他の場所に作ったリモートリポジトリにアクセスができないようになっていることをチェック。(テストする時は他の SSH 鍵で接続されないように .ssh から他の鍵を削除する)。

別の端末で

~/.ssh/id_rsa.dotfiles を適宜別の端末にコピーし、~/.ssh/config に IdentityFile を書き込めば、同様に git clone できるようになる。

[ 3月8日全て ]

2013年3月4日 (月)

ぼちぼち Twitter API 1.1 対応 (Net::Twitter::Lite で)

さくらのレンタルサーバ

  my $response
    = URI::Fetch->fetch(
    "http://api.twitter.com/1/statuses/user_timeline.rss?user_id=$id&count=200"
    ) or die URI::Fetch->errstr;

とかレガシーなコードが動いているの(2007年11月に書いた*1)で、Twitter API 1.1 に対応せねば。

Net::Twitter::Lite を使うか。Net::Twitter::Lite を cpanm で home の下にインストール。

 curl -LO http://xrl.us/cpanm
 chomod 755 cpanm
 cpanm -l /home/naney/local/libperl-twitter Net::Twitter::Lite

で自分の Tweet を取ってくるのはだいたいこんな感じ。

 #!/usr/bin/perl

 use warnings;
 use strict;
 use HTTP::Date;
 use Net::Twitter::Lite;

 use lib
   qw(/home/naney/local/libperl-twitter/lib/perl5 /home/naney/local/libperl-twitter/lib/perl5/i386-freebsd-64int);

 my $consumer_key        = 'aaa';
 my $consumer_secret     = 'bbb';
 my $access_token        = 'ccc';
 my $access_token_secret = 'ddd';
 my $id                  = 自分の Twitter アカウントの ID(数字);

 my $twitter = Net::Twitter::Lite->new(
   apiurl           => 'http://api.twitter.com/1.1',
   legacy_lists_api => 0,
   consumer_key     => $consumer_key,
   consumer_secret  => $consumer_secret
 );

 $twitter->access_token($access_token);
 $twitter->access_token_secret($access_token_secret);

 my $timeline = $twitter->user_timeline(
   {
     count       => 200,
     user_id     => $id,
     include_rts => 'true'
   }
 );

 foreach my $tweet (@$timeline) {
   my $time     = $tweet->{created_at};
   $time =~ s/\+0000/UTC/;
   $tweet->{_created_at} = HTTP::Date::str2time($time);

   # use $tweet here.
 }

[ Perl ]

*1RSSURL は去年修正

[ 3月4日全て ]

2013年9月23日 (月)

さくらのレンタルサーバperlbrew

2009年10月に契約したさくらのレンタルサーバPerl 5.8.9 でもう随分古いし、今時 perlbrew でしょうということで perlbrew。まずスクリプト用のを ~/local/script 以下に入れておく。

 mkdir ~/local/script
 cd ~/local/script
 export PERLBREW_ROOT=$PWD/perl5/perlbrew
 export PERLBREW_HOME=$PWD/.perlbrew
 curl -L http://install.perlbew.pl | /usr/local/bin/bash

ここで以下のようなエラー

 ## Installing patchperl

 ERROR: Failed to retrieve patchperl executable.

patchperl のダウンロードに失敗している模様。最初は cURL + SSL の問題かなと思ったんだけれど perlbrew では既に --insecure オプション付きで curl を呼んでいるので違う模様。手で cURL するぶんにはダウンロードできるし。

perlbrew ではファイルのダウンロードで curl, wget, fetch のコマンドのどれかを使うようになっているんだけれど、wget か fetch がコケるのかな。

~/local/script/perl5/perlbrew/bin/perlbrewエディタで開いて %commands で curl, wget, fetch の仕様を定義しているところから wget と fetch の定義を削除して curl だけ残したところ、うまく動くようになった。

 source $PERLBREW_ROOT/etc/bashrc
 source $PERLBREW_ROOT/etc/perlbrew-completion.bash

 perlbrew install-patchperl
 perlbrew install-cpanm
 perlbrew install perl-5.18.1

Perl 5.18.1 インストール完了。

今日のさえずり: MIME::Parser 相変わらずインタフェースがわかりにくい

2013年09月23日

[ 9月23日全て ]

2013年9月24日 (火)

さくらのレンタルサーバメール受信時にプログラムを実行する

さくらのレンタルサーバでは mail delivery agent (MDA) に maildrop が使われているので .mailfilter に設定を書くことで、メール受信時にプログラムを実行できる(サポート対象外)。

$HOME/MailBox/<メールアカント名>/.mailfilter というファイルを作り、

 logfile "/home/<アカウント名>/var/log/maildrop/<メールアカウント名>.log"
 cc "!自分のメールアドレス"
 cc "| /path/to/my/script"
 exit

などと書き権限を 600 にしておけば、メールがきた時に自分のメールアドレスに転送するとともにプログラムを実行できる。届いたメールはプログラムの標準入力に渡される。

.mailfilter の文法チェックは次でできる。

 maildrop -V 9 .mailfilter < /dev/null
[ 9月24日全て ]

2013年9月26日 (木)

最近メール関連ではまり続けているとか【日記】

IFTTT + HootSuiteHootSuite 障害で動かなくなった。

IFTTT + Gmail に変更。URL 短縮も自前でやる必要があるのでフィード側で対応したものの、Gmail 側に bot 疑惑をもられたのか「送信メールが reject される」「Gmail ログイン時に CAPTCHA 入力を求められる」「Android での Google アカウント設定も一度強制的に無効化された」などとなり、ban の危険性が出てきたので停止。

→ かわりに IFTTT の Mail チャネルを使おうかと。Mail チャネルだとそのアドレスにしか受信できないので、受信したら自動的に別のアドレスに配送するプログラムを書くことにする。さくらのレンタルサーバでのプログラム実行方法を確認。

IFTTT で Mail チャネルに送った場合 text/plain なパートはボディ中の URL が変なクリックトラッカーの URL に置き換えられているので使えないことが判明。text/html パートの方を使わないと駄目ぽ。ということで Perl スクリプトで「Email::MIME で parse」「HTML::TreeBuilder で該当箇所を抽出」「Email::Sender::Transport::SMTP::TLS」でメール送信するようにした。IFTTT での trigger が foursquare の時と feed の時で Email チャネルから送信される HTML 構造が変わるなんて……。組み合わせ別にテンプレートが違うのか。

→ 配送できるようになったけれど IFTTT からうまく送られない。再 activate しても PIN すら届かない。別のメールアドレスにすると PIN が届く(数時間後だったりすぐだったり)ので、窓口にしたいメールアドレスが利用不可になっているか(テスト中にエラーを返してしまっていて使えない判定されたとか?)、IFTTT の方の配信が詰まっているのかよくわからない状態。プログラムができたのにそもそも送られてこないとは。

→ という作業をしている間に放置していた postmaster に3万通ぐらい cron のログがたまってたのに気がつく。Gmail で受信しておくようにするかと Mail Fetcher 設定。そうしたら10数時間後ぐらいから、同じ Gmail アカウントに設定してあった Mail Fetcher を巻き込んで全部「確認中」で止まってフェッチしてくれなくなってあばば。急いで postmaster の Mail Fetcher 設定を外す。数時間後に他のフェッチが再開し始めてほっと一安心。

→ イマココ。

[ 9月26日全て ]

2014年1月25日 (土)

今日のさえずり: 放置ウィッシュリストを見直し

2014年01月25日

[ 1月25日全て ]

2014年3月15日 (土)

今日のさえずり: 検索結果が半角カタカナ化してて10年時代が戻った気がした

2014年03月15日

rimage:/nDiki/Flickr/13161946753.jpg

[ 3月15日全て ]

2014年3月27日 (木)

さくらのレンタルサーババージョンアップメンテナンス

さくらのレンタルサーバの「ディスク容量増量ならびにOSバージョンアップに伴うメンテナンス」が寝ている間に終了。 Perl も新しいバージョンが使えるようになるのだけれど、デフォルトでは今までと同じバージョンだから何もしなくても良いはず。

って確認したらスクリプトが動かなくなっている……。

あー 32 bit が 64 bit になったんだっけ。 SpeedyCGI が動かなくなっているのでまず外し。で再度走らせたら今度は Storable が Long integer size is not compatible といって既存データを読めなくなったので破棄して再生成中。あとは別のスクリプトでいくつか動かなくなったものがあったので、そちらは依存ライブラリを cpanm しなおし。

それとそれと

メールの送信前認証としてご提供している POP before SMTP を廃止いたします。そのため、今後はSMTP認証(SMTP-AUTH)が必須となります。

ってあったのでメールの方も確認したら Gmail からさくらのレンタルサーバ経由でメールが送れなくなっている。あーでも POP before SMTP なんか使ってなかったでしょう。なんでだー。って Twitter あたりみたら、どうも「国外IPアドレスフィルタ」(デフォルト有効)の機能提供開始のせいっぽい。 Gmail のサーバ国内とは限らないもんねぇ。

開始日時は自分のサーバは3月19日(水) 12:00 なので、この時から既に送れない状態になっていたのか。1週間気がつかなかったとか、もうプライベートではメールの利用頻度下がっているってことだねぇ。

さて、国外IPフィルタを無効化。

今日は朝からホットだった。

今日のさえずり: 国外 IP アドレスからのアクセスブロックのせいか

[ 3月27日全て ]

2015年4月27日 (月)

今日のさえずり: 朝会誕生日の祝福をしてくれたので次の1年頑張れる

[ 4月27日全て ]

About Me

Naney Naney

Naney (なにい)です。株式会社ミクシィで SNS 事業の部長をしています。

About nDiki

nDiki1999年1月に始めたコンピュータ日誌を前身とする NaneyWeb 日記(兼パーソナルナレッジベース)です。

#nNote タグがついている記事は他の記事に比べて、より断片的・未整理・不完全なちょっとしたノートです。まだ結論に至っていない考えなども含まれます。頻繁/大幅に更新したり削除したりすることがあります。

※本サイトの内容は個人的見解であり所属組織とは関係ありません。

Other Notes

ナレッジベースアプリケーション Obsidian で書いているノートの一部を notes.naney.org で 公開しています。

月別インデックス
Process Time: 0.057301s / load averages: 0.47, 0.40, 0.41
nDiki by WATANABE Yoshimasa (Naney)
Powered by DiKicker