Category Archives: PERSONAL COMPUTER - Page 5

PerlとSendmailとBccのメーリングリスト配信スクリプト

昨日うっかりBccとCcを間違えてしまう大失態を演じてしまったため簡易ながら不特定多数にBccでメールを一斉配信してくれるスクリプトをPerlでサクッと書いてみました。
そしてどうせ書いたのならば久々に公開して有意義に使っていただこうと思い公開します。

コマンドラインベースで動けばいいかなということで機能自体には特にこだわりは無いのですが必要のある方がおりましたらご自由にコピーしてお使いください。
※ 当スクリプトを利用するにはPerlモジュールのインストールができるレベルの知識を必要とします。

実行用スクリプト
# vi infoEmail.pl

#!/usr/bin/perl
use utf8;
use strict;
use warnings;

binmode(STDOUT, ":utf8");

require "infoEmail.pm";

#
# メールマガジン配信スクリプト
#

my $mm   = infoEmail->new();
my $mime = $mm->mailer();

print $mime->as_string;
print '*' x 50 . "\n";
print "上記の内容で配信してもよろしいですか? (y/N)\n";
print '*' x 50 . "\n";
print "> ";
my $input = <STDIN>;
chomp($input);

if($input eq 'y' || $input eq 'yes'){
        $mm->sendmail($mime);
        print "メールを配信しました\n";
}else{
        print "メールの配信をキャンセルしました\n";
}

モジュール(プログラム本体)
# vi infoEmail.pm

#!/usr/bin/perl
package infoEmail;

use utf8;
use strict;
use warnings;

use Config::Simple;
use Mail::Krohn;
use Mail::Krohn::Sendmail;
use Email::MIME;
use Email::MIME::Creator;
use Encode;

sub new {
        my $class = shift;
        my $cfg = new Config::Simple('./infoEmail.conf') or die Config::Simple->error();
        my $self = {
                from         => $cfg->param('From'),
                to           => $cfg->param('To'),
                subject      => $cfg->param('Subject'),
                x_mailer     => $cfg->param('X-Mailer'),
                bccfilepath  => $cfg->param('BccFilePath'),
                bodyfilepath => $cfg->param('BodyFilePath')
        };
        return bless $self , $class;
}

sub mailer {
        my $self     = shift;
        my $bcc      = $self->read_config($self->{ bccfilepath });
        my $body     = $self->read_config($self->{ bodyfilepath });
        my $from     = $self->{ from };
        my $to       = $self->{ to };
        my $subject  = $self->{ subject };
        my $x_mailer = $self->{ x_mailer };
        my $mime = Email::MIME->create(
                header => [
                        From       => encode('MIME-Header-ISO_2022_JP' => decode('utf-8',$from)),
                        To         => encode('MIME-Header-ISO_2022_JP' => decode('utf-8',$to)),
                        Bcc        => encode('MIME-Header-ISO_2022_JP' => decode('utf-8',$bcc)),
                        Subject    => encode('MIME-Header-ISO_2022_JP' => decode('utf-8',$subject)),
                        'X-Mailer' => decode('utf-8',$x_mailer),
                ],
                attributes => {
                        content_type => 'text/plain',
                        charset      => 'ISO-2022-JP',
                        encoding     => '7bit',
                },
                body => encode('iso-2022-jp' => decode('utf-8',$body)),
        );
        return $mime;
}

sub sendmail {
        my $self = shift;
        my $mime = shift;
        my $mailer = Mail::Krohn->new();
        $mailer->send($mime);
        return 0;
}

sub read_config {
        my $self = shift;
        my $file_path = shift;

        open(my $fh, "<", $file_path) || die("Can not open file $file_path");
        my $file_contents;
        while( my $line = readline $fh ){
                $file_contents .= $line;
        }
        chomp($file_contents);
        return $file_contents;
}

1;

設定ファイル
# vi infoEmail.conf

############################################################
# メールマガジン設定ファイル
############################################################
# 送信元
From         = "ぼっちちゃん" <めーる@あどらあ>
# 送信先
To           = "ぼっちちゃん" <めーる@あどらあ>
# 件名
Subject      = ぼっちちゃんと愉快な仲間たちめーりんぐりすと
# メーラー名
X-Mailer     = My Best Friends Mailing List
############################################################
# 送り先リストの記述されたファイル
BccFilePath  = ./infoEmail_bcc.tmp
# 本文の記述されたファイル
BodyFilePath = ./infoEmail_body.tmp
############################################################

配信用メール本文
# vi infoEmail_body.tmp

お友達100人できるかな?

=======================================
"ぼっちちゃん" <めーる@あどらあ~>
ぼっちちゃんと愉快な仲間たちめーりんぐりすと
=======================================

配信対象のアドレスリスト
# vi infoEmail_bcc.tmp

おともだち1@あどらあ, めーる2@あどらあ, めーる3@あどらあ, めーる4@あどらあ, めーる5@あどらあ

久々にPerl触ったらだいぶ忘れてました(^_^;)

参考サイト
第20回 Email::Sender:メールを送信する:モダンPerlの世界へようこそ|gihyo.jp … 技術評論社

PerlでメールをBccで送信する Email::MIME + Mail::Krohn

メールをEmail::Sendを利用し送信しようとしたところ下記のように色々と怒られたため調べてみたところ
スクリプト起動時にReturn::Value::NO_CLUCKに値を入れれば良いということが分かったが実にスマートではないので代わりになるモジュールを探してみた

Return::Value is deprecated at /usr/lib/perl5/site_perl/5.8.8/Return/Value.pm line 13
        require Return/Value.pm called at /usr/lib/perl5/site_perl/5.8.8/Email/Send.pm line 11
        Email::Send::BEGIN() called at /usr/lib/perl5/site_perl/5.8.8/Return/Value.pm line 0
        eval {...} called at /usr/lib/perl5/site_perl/5.8.8/Return/Value.pm line 0
        require Email/Send.pm called at infoEmail.pl line 6
        main::BEGIN() called at /usr/lib/perl5/site_perl/5.8.8/Return/Value.pm line 0
        eval {...} called at /usr/lib/perl5/site_perl/5.8.8/Return/Value.pm line 0

必要なモジュールをインストールする
# cpan install parent
# cpan install Class::Accessor::Lite
# cpan install Mail::Krohn

#!/usr/bin/perl
use strict;
use warnings;

use utf8;
use Mail::Krohn;
use Mail::Krohn::Sendmail;
use Email::MIME;
use Email::MIME::Creator;
use Encode;

MAIN:{
    my $mime = Email::MIME->create(
        header => [
            From => 'そうしんもとめーる@あどれす',
            To   => 'そうしんもとめーる@あどれす',
            Bcc  => 'そうしんさきめーる@あどれす',
            Subject => Encode::encode( 'MIME-Header-ISO_2022_JP', 'テストメールです' ),
            'X-Mailer' => 'TestMailer',
        ],
        attributes => {
            content_type => 'text/plain',
            charset      => 'iso-2022-jp',
            encoding     => '7bit',
        },
        parts => [
                Encode::encode( 'iso-2022-jp', 'でばっぐおいしー!!' ),
        ],
    );

    my $mailer = Mail::Krohn->new();
    $mailer->send($mime);
}

参考サイト
Email::MIME::CreatorとEmail::Sendでメール送信
[Perl]Email::SendつかったらReturn::Valueにdeprecatedだと怒られた

CentOS5.7 Email::Send インストール

# cpan install Perl::OSType <- make testでエラーが起きる # yum --enablerepo=epel install perl-Perl-OSType # cpan install Module::Build # cpan install Module::Pluggable # cpan install Email::Send

atコマンドがエラーを起こす

$ echo “xmms -p” |sudo at 0900
warning: commands will be executed using /bin/sh
Cannot open lockfile /var/spool/cron/atjobs/.SEQ: No such file or directory

atdを再起動させても解決しなかったため手動でロックファイルを作成したところ解決しました

$ sudo touch /var/spool/cron/atjobs/.SEQ
$ sudo chown daemon:daemon /var/spool/cron/atjobs/.SEQ

iPhone “メッセージ”(SMS/MMS)を一括削除する 要JB

私のiOS5まで改善されなかった不満を上げると”メッセージ”アプリの一括削除機能が無いことでした。”編集”ボタンを押してちまちま削除しようにも数千件ぐらいメールが溜まっていては気が滅入ってしまいます。

そこで紹介するのが”iDelete-MSG”です。このアプリをインストールすると”編集”ボタンをクリックすると”Delete All”ボタンが右側に表示されそれをクリックすると一気に全てのメールを削除することができます。

が。。。しかし、ここまで紹介しておきながら実はこのアプリ何故か現在Cydiaの検索では見つかりません。。。。
BigBossにて無料で公開されているはずなんですけどねぇ・・・・

そこで困り果てて解決策を考えていたのですが、海外のサイトに解決策を見つけました。

How to Delete all Text Messages on iPhone with Single Tap

こちらのサイトにアプリのdebファイルが上がっているのでそれを直接iPhoneからiFile(有料版)でインストールすることで動きました。iFileは度々使い結構便利なので無料版しか持っていない人はこの際有料版を購入してもいいかもしれませんね。

ちなみに海外のサイトの方はiFunboxでインストールしたようです。

一応debファイルはここにも上げておこうかと思います。
ideletemsg_1.0.1
※ 作者ならびにその関係者の方で何か問題がございましたらご連絡ください。迅速に削除したいと思います。

最後に余談になってしまうのですが、あまりにもメールの件数が多すぎるとこのアプリを動かしている途中、iPhoneがフリーズする可能性があります。
そういう場合は再起動を繰返しながら一括削除をすことで解決することができます。

参考
iDelete-MSG – メッセージ履歴の『一括削除ボタン』を追加する [JBApp]

MacBook Air Late 2011 BackTrack5 グラフィックドライバ

MacBook Air Late 2011 のグラフィックカードはnvidiaではなくi5に組み込まれているGPUらしいのでIntel HD Graphics 3000 384 MBを使っているようです。

調べたところリポジトリを追加することで手軽にインストールできるようなのでメモしておきます。

sudo add-apt-repository ppa:glasen/intel-driver
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install linux-image-generic-lts-backport-natty linux-headers-generic-lts-backport-natty

Ubuntu11.10でffmpegのlibfaacを使う Unknown encoder ‘libfaac’

調べたところライセンスが関係して機能を削っているようですね。

使えるようにするにはソースからビルドする時にオプションを追加する方法等あるようですがすごくめんどくさい・・・・

そんな訳で、他の方法を探してみました。

非公式リポジトリのMedibuntuには予めオプションを追加してビルドしたパッケージが用意されているようなのでそれを利用したいと思う。

リポジトリの追加

$ sudo wget http://www.medibuntu.org/sources.list.d/`lsb_release -cs`.list –output-document=/etc/apt/sources.list.d/medibuntu.list && sudo apt-get -q update && sudo apt-get –yes -q –allow-unauthenticated install medibuntu-keyring && sudo apt-get -q update

ffmpegを再インストール
$ sudo apt-get -reinstall install ffmpeg libavcodec-extra-53

※ Ubuntu11.10のffmpegはlibavcodec-extra-52ではなくlibavcodec-extra-53のようなのでこちらを指定する。

これで、Unknown encoder ‘libfaac’が出なくなると思う。

Ubuntu 11.10 プリンタ と MacOSX Lion を接続する

Windowsとの接続は普通にhttpで接続できていたのですが、なんかMacOSXとの接続のしかたがよくわからない・・・

苦戦していたらどうやらMacOSXの”プリントとスキャン”の設定には裏メニューがあるらしい事が分かった

システム環境設定 > プリントとスキャン > プリンタの追加(+ボタン)
ツールバーを右クリックすると”ツールバーをカスタマイズ”という項目が出てくるのでそれをクリック

“詳細”をツールバーへドラッグ&ドロップ

“詳細”よりIPPのhttpを選択することによりプリンタを指定する事ができる

プリンタのURLの例
http://<サーバ名>:<ポート番号>/printers/<プリンター名>

全く。。。分かりにくいですねぇ・・・

参考元:Mac OS X 10.5 Leopard からSambaプリンタに接続 – ろばの穴

Ubuntu11.10でLPB6200がうまく動作しない 対策

このページはcups等基本的なパッケージを既にインストールしてあることを前提に話をすすめる。

メーカーサイトのドライバCAPT Printer Driver for Linux Ver2.40 (32bit)

ダウンロードし展開したらインストール
$ sudo dpkg -i cndrvcups-common_2.40-1_i386.deb
$ sudo dpkg -i cndrvcups-capt_2.40-1_i386.deb

これで普通にプリンタを設定から追加して使えると思っていたが認識はするが、印刷を行なってもジョブが溜るだけで正常に印刷されないという問題が発生した。

ログを見ても中々解決策は見当たらず、途方に暮れていたところ、ロシアのサイトCanon LBP-6000 в Ubuntu 11.10に対策が書かれていたのでそれを元に対策したら正常に動作するようになった。

/etc/rc.localの中のexit 0の間にプリンタを再認識させる設定を記述する

$ sudo vi /etc/rc.local
sudo modprobe usblp
ls -l /dev/usb/lp0
sudo /etc/init.d/ccpd restart

その後再起動
$ sudo reboot
上記のプリンタを再認識させるコマンドを直接叩いてもここで再起動を一度行わないと正常に動作しないようだ

どうもCAPT Printer Driver自体に不具合があるようですね。
あと、余談ですがこれのソースコードからのビルドはやめたほうがいいです。原因不明ですがGTK関係でこけます。

その他、参考になりそうなサイト(画像付きロシア語)
Canon LBP6000 В Ubuntu 11.10

XMLを解析して和訳するRubyスクリプト REXML、Microsoftの翻訳APIを使用

Androidのアプリを日本語化したくなったのでXMLを和訳していたんですが、面倒になったのでスクリプトをサクっと書いて見ました。RubyでXMLを構文解析して読み取り、Microsoftの翻訳APIを利用し自動で機械翻訳して再びXMLで出力しちゃいます。XMLを翻訳して出力プログラムはあまり見かけないのでそれなりに需要があるかなと思い公開してみました。

結構最近は機械翻訳も精度が上がっているようですねw 驚かされました。数百数千行を一個一個手動で訳すよりはある程度自動化したほうが楽ですよね~

※ 機械翻訳は万能ではないのでそれなりに変な訳が出力されます。← 言い切ります
※ リビルドする時にエラーが発生するかもしれませんがその時は手動で直してください。
(多分エディタの自動置換機能とか使えば全然大したことはないと思います)
※ APPIDは下記の参考にさせて頂いたサイト(simultechnology.blog様)を参考にしてください。

#!/usr/bin/ruby -KU
require 'net/http'
require 'rexml/document'
require 'json'

#----------(Settings)----------#
in_file = "strings.xml"
ex_file = "strings_.xml"
$debug = true
$sleep = 3
$appid = "*************************"
#------------------------------#

$rank = 0

def sp
  "  " * $rank
end
def run elem
  if $debug
    print "================================\n"
    print sp + "name : #{elem.name}\n"
    attrs = elem.attributes
    attrs.each{|a,e|
      print sp + "attr : #{a} = #{e}\n"
    }
    print sp + "text : \n--\n#{elem.text}\n--\n"
  end

  if elem.text =~ /\w/ then
    text = URI.escape(elem.text)
    h = Net::HTTP.new("api.microsofttranslator.com")
    response = h.get("/V2/Http.svc/Translate?appid=#{$appid}&from=en&to=ja&text=#{text}")

    if response.message == 'OK'
      doc = REXML::Document.new(response.body)
      elem.text = doc.root.text
    end
  end

  print "#{elem.text}\n"
  sleep $sleep

  if elem.has_elements? then
    elem.each_element{|e|
      $rank += 1
      run e
      $rank -= 1
    }
  end
end

doc = REXML::Document.new(File.new(in_file))
run doc.root
doc.write(File.new(ex_file, "w"))

プログラムを書く上で参考にさせて頂いたサイト
REXML であそぶ http://www.namikilab.tuat.ac.jp/~sasada/prog/rexml.html
simultechnology.blog http://simultechnology.blendmix.jp/blog/archives/1101