Tuesday, June 11, 2013

Plagger::Plugin::Filter::MicrosoftTranslator (仮)

PlaggerのFilterです。
MicrosoftTranslatorを使って、タイトルを翻訳しています。
Plagger::Plugin::Filter::Babelfishを参考に書きましたが、まだゼンゼン中途半端でコードが汚いです。。。
メモ的に載せておきます。

コスト的に考えて、本文の翻訳はやめておいたほうが良さそうかなと。

package Plagger::Plugin::Filter::MicrosoftTranslator;
use strict;
use base qw( Plagger::Plugin );

use Plagger::UserAgent;
use Digest::MD5 qw(md5_hex);
use Encode qw(encode_utf8);
use LWP::UserAgent;
use XML::Atom::Feed;
use XML::Atom::Entry;

sub register {
    my($self, $context) = @_;

    $context->autoload_plugin({ module => 'Filter::GuessLanguage' });
    $context->register_hook(
        $self,
        'plugin.init'        => \&connect_to_azure_api,
        'update.entry.fixup' => \&update,
    );
}

sub rule_hook { 'update.entry.fixup' }

sub connect_to_azure_api {
    my($self, $context, $args) = @_;
    $context->log(debug => "hello");
}

sub update {
    my($self, $context, $args) = @_;

    my $language   = $self->conf->{source};

    my $title    = $args->{entry}->title->data;
    my $title_tr = $self->translate($title, $language);
    unless (defined $title_tr) {
        $context->log(error => "Translation failed");
        return;
    }

    $args->{entry}->title($title_tr);

    sleep 1;
=c
    my $body    = $args->{entry}->body->data;
    my $body_tr = $self->translate($body, $language);
    unless (defined $body_tr) {
        $context->log(error => "Translation failed: ");
        return;
    }
    $args->{entry}->body($body_tr);
=cut 
}

sub translate {
    my ($self, $text, $language) = @_;

    my $destination = $self->conf->{destination} or do {
      Plagger->context->log(error => "set destination language");
      return;
    };

    # get content from azure api
    my $account_key = $self->conf->{account_key};
    $ENV{'PERL_LWP_SSL_VERIFY_HOSTNAME'} = 0;
    my $url = URI->new("https://api.datamarket.azure.com/Bing/MicrosoftTranslator/v1/Translate?Text=%27$text%27&To=%27$destination%27");
    my $ua = LWP::UserAgent->new or die;
    my $req = HTTP::Request->new(GET => $url);
    $req->authorization_basic('', $account_key);
    my $res = $ua->request($req);
    die $res->status_line if !$res->is_success;
    my $content = $res->content;

    # get elem from Atom
    my $feed = XML::Atom::Feed->new(\$content);
    my @entries = $feed->entries;
    foreach my $entry(@entries){
 return $entry->content->elem->findvalue('./m:properties/d:Text')
    }
}

1;

__END__

=head1 NAME

Plagger::Plugin::Filter::MicrosoftTranslator - translate via MicrosoftTranslator

=head1 SYNOPSIS

  - module: Filter::MicrosoftTranslator
    config:
      destination: ko
      account_key: xxxxxxxxxxxxxxxxxxxx

=head1 DESCRIPTION

This plugin translates each entry TITLE via MicrosoftTranslator.
See "Microsoft Translator" http://msdn.microsoft.com/en-us/library/dd576287.aspx for details.

=head1 CONFIG

=over 4

=item destination

Which language the feeds/entries should be translated to.
See "Translator Language Codes" http://msdn.microsoft.com/en-us/library/hh456380.aspx for details.   

=back

=head1 AUTHOR

yako.takeshi@googlemail.com

=head1 SEE ALSO

L

=cut





Monday, June 10, 2013

WordPressで本文中の画像URLを抜き出す

本文中の画像URLをループで使えるようにします。

テーマのための関数 (functions.php)に以下のコードを追記します。
画像がなかったときには、no_thumb.jpgを表示します。
/**
 * get image url from post 
 */

function catch_that_image() {
  global $post, $posts;
  $first_img = '';
  ob_start();
  ob_end_clean();
  $output = preg_match_all('/<\s*img [^\>]*src\s*=\s*[\""\']?([^\""\'>]*)/i', $post->post_content, $matches);

  $first_img = $matches [1] [0];
 
  if(empty($first_img)){
    $first_img = "/no_thumb.jpg";
  }
  return $first_img;
}

メインインデックスのテンプレート (index.php)などの記事のループで以下のコードを使います。


うまく画像が出たでしょうか?

参考)
記事内の最初の画像を取り出す
http://kachibito.net/wp-code/display-first-image-url

Thursday, June 6, 2013

MySQL 5.6をrpmでインストールします

MySQL 5.6をrpmでインストールします。
現時点でremiレポジトリなどで対応していないので、rpmからインストールします。
 
http://dev.mysql.com/downloads/mysql/5.6.html#downloads 
新バージョンを確認し、便宜、以下の 5.6.12-1 の数字を合わせましょう。

ダウンロード
# wget -q http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-client-5.6.11-2.el6.x86_64.rpm/from/http://cdn.mysql.com/ \
http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-shared-compat-5.6.11-2.el6.x86_64.rpm/from/http://cdn.mysql.com/ \
http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-server-5.6.11-2.el6.x86_64.rpm/from/http://cdn.mysql.com/ \
http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-devel-5.6.11-2.el6.x86_64.rpm/from/http://cdn.mysql.com/ \
http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-shared-5.6.11-2.el6.x86_64.rpm/from/http://cdn.mysql.com/ \
インストール
# yum install MySQL-{client,devel,server,shared-compat}-5.6.11-2.el6.x86_64.rpm
# yum install MySQL-shared-5.6.11-2.el6.x86_64.rpm
yumログ確認
# tail /var/log/yum.log
MySQLスタート
# /etc/init.d/mysql start
MySQLログ確認
# cat /var/log/mysqld.log    
root初期パスワード確認
*****のところがパスワードです
# cat /root/.mysql_secret
# The random password set for the root user at Thu Jun  6 14:23:31 2013 (local time): *****
MySQLにログイン
# mysql -uroot -p******
パスワード設定
mysql> SET PASSWORD FOR root@localhost=PASSWORD('******');
mysql_secure_installationを実行
# mysql_secure_installation

# rootパスワードを入力
Enter current password for root (enter for none):

# rootユーザーのパスワードを変更するか?
Change the root password? [Y/n] n

# 匿名ユーザーを削除するか?
Remove anonymous users? [Y/n] Y

# rootユーザーでリモートからのログインを許可するか?
Disallow root login remotely? [Y/n] Y or N

# 「test」データベースを削除するか?
Remove test database and access to it? [Y/n] Y

# 権限テーブルをリロードするか?
Reload privilege tables now? [Y/n] Y

my.cnf設定
・/usr/my.cnfが優先されるので、5.5以前の慣習のため、/etc/にリンクを貼っておく
・innodb_buffer_pool_size = 1G この値は使用可能メモリの60%を推奨
・クエリを確認したいときには、general_logを有効にしてください(SET GLOBAL general_log = ON or OFF;でも可)

# rm /etc/my.cnf
# ln -s /usr/my.cnf /etc/
# vi /usr/my.cnf

[mysqld]
datadir                 = /var/lib/mysql
socket                  = /var/lib/mysql/mysql.sock
character-set-server    = utf8
skip-character-set-client-handshake

log-error               = /var/lib/mysql/mysqld-error.log
#general_log             = 1
#general_log_file        = /var/lib/mysql/mysql.log
slow_query_log          = 1
slow_query_log_file     = /var/lib/mysql/slow.log 
long_query_time = 5

log-bin                 = mysql-bin
binlog_format           = mixed
expire_logs_days        = 1
server-id               = 101
max_allowed_packet      = 8M
table_open_cache        = 256
max_connections         = 1024
innodb_file_per_table
innodb_flush_log_at_trx_commit = 0
innodb_flush_method     = O_DIRECT
innodb_buffer_pool_size = 1G
innodb_log_file_size    = 128M
innodb_log_buffer_size  = 8M
query_cache_type        = 1
query_cache_size        = 64M
key_buffer_size         = 32M
sort_buffer_size        = 1M
read_buffer_size        = 1M
read_rnd_buffer_size    = 4M

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

[mysqld_safe]
log-error               = /var/lib/mysql/mysqld_safe-error.log
pid-file                = /var/run/mysqld/mysqld.pid
character-set-server    = utf8
log_fileを削除して、MySQLをスタート
# /etc/init.d/mysql stop
# rm /var/lib/mysql/ib_logfile0
# rm /var/lib/mysql/ib_logfile1
# /etc/init.d/mysql start
MySQLログ確認
# cat /var/lib/mysql/mysqld_safe-error.log

こちらのblogを参考にさせて頂きました。
有難うございます。
http://d.hatena.ne.jp/akishin999/20130207/1360241401

PHP5.4もインストールするときは、こちらのblogが参考になります。
http://blog.youyo.info/blog/2013/02/12/server-build-log/