さくらのVPSでメールアカウントを追加する

さくらのVPSでメールアカウントを追加するには、二つの設定ファイルに追記してコマンドを実行してサービスを再起動する必要がある。

これを自動化したい。

一番ラクなのはwebから設定することであるが、cgiはそのままではシステムにかかわるファイルに追記したりサービスリスタートなどはできない。できては困る。権限がないのだ。

apacheでsudoを使うようにすればいいようだが、ひとつ困ったことがある。

cgiでファイルを open $fh,">>file.txt"; とやると、permission deniedになる。これは sudoでは解決しない。

ファイルをいじるスクリプトを作ってそれを呼ぶようにしないと駄目か。




ibus

# ps aux|grep ibus
hoge   2260  6.0  0.2 148464  2332 ?        Sl   07:00   0:04 /usr/bin/ibus-daemon -r --xim
hoge   2268  0.0  0.3 158108  3336 ?        S    07:00   0:00 /usr/libexec/ibus-gconf

hoge   2272  0.0  0.6 235456  6232 ?        S    07:00   0:00 /usr/libexec/ibus-x11 --kill-daemon
root      2374  0.0  0.0 107460   924 pts/1    S+   07:01   0:00 grep ibus

# ibus-setup
Traceback (most recent call last):

File "/usr/share/ibus/setup/main.py", line 28, in <module>
import gtk
ImportError: No module named gtk

これがいけないのか。gtkというモジュールがないのか。じゃあいれよう。ちょこちょことyum installをするがうまくいかない。めんどくさいので yum install python*

djangoがどうたらでエラーになる。

skipbrokenとかなんとかいうのをつけたらというのでつけてみるとインストールが始まったが最後にコケる。WEBで似たような状況の人を探し、pythonと名のつくものはなんでもかんでも片っ端から放り込む。

ダメ。

再起動する。

ダメ。

なんか、「あのリポジトリだとダメ」とかいう情報があるがどこからいれたとかどこからいれるとか、よくわからない。

以前使っていたノートPCを起動してみる。

起動しているプロセスが多い。

rpm -qa|grep ibus

としてみるとこれもずいぶん違う。

同じものを全部入れてみる。

再起動。

それにしてもいつも思うのだがさくらのVPSの再起動はずいぶん速いね?

iPhoneの再起動より速い。

ダメ。

psで足りないのは、以下の二つ。これが動かないとダメなのだろう。

やっぱりpythonだ。

python /usr/share/ibus/ui/gtk/main.py
python /usr/share/ibus-anthy/engine/main.py


はいってないモジュールを一個一個インストールしていくと、

エラーメッセージが変わった。

python /usr/share/ibus/ui/gtk/main.py
Traceback (most recent call last):
File "/usr/share/ibus/ui/gtk/main.py", line 33, in <module>
import ibus
ImportError: No module named ibus


main.pyというファイルを見ると、 import ibus と書いてある。

これがないのだ。

これを入れればいいのだ。

どうやって?

import os
import sys
import getopt
#import ibus
#import gtk
import gettext
#import panel
#import pynotify


main.pyには上記のようにimport文が書いてあるがコメントにした部分が全部 no module named *** となる。

なんだよこれ・・・

ibusがダメなのか、pythonがダメなのか・・・

さくらのVPSメール関連設定メモ

doveadm pw

/etc/dovecot/passwd

/etc/postfix/vmailbox

postmap /etc/postfix/vmailbox

/etc/init.d/postfix restart

/etc/init.d/dovecot restart




さくらのVPSにVNC接続

さくらのvpsでgnomeを動かしてvncでつながるようになった。

そんなの重くて使いものにならないだろうと思っていたが、

軽快である。

youtubeを見てみようと思って、flashをインストールしたのだがうまくいかない。

インストールしたあと、libflashplayer.soというファイルを、以下のようにコピーしないといけなかった。

# cd /usr/lib/mozilla/plugins/
# ll
合計 0
# cd /
# find -name "libflashplayer.so"
./usr/lib64/mozilla/plugins/libflashplayer.so
./usr/lib64/flash-plugin/libflashplayer.so
# cp /usr/lib64/mozilla/plugins/libflashplayer.so /usr/lib/mozilla/plugins/


youtubeの絵はカクカクしているが、これはvpsから我が家間の通信が遅いからである。

Bフレッツとかだったらいけるんじゃないか?

あとは音か・・・。

その前に日本語入力だ。

Ctrl+SpaceでiBusという日本語入力が動くはずなのだが、数秒とまるが動かない。

あと、resolve.confの中身が消えてしまうことがある。

#Generated by NetworkManager と書いてあるので、こいつが上書きしているのではないかと思う。

GNOMEを入れるときに余計なものをたくさんいれてしまったのでその時入ってしまったのだろう。

NetworkManagerは起動しないようにする(GUIで)。

が、やっぱり消える。「ifconfigにネームサーバを書け」とか書いてあるので、しぶしぶ書いたらその内容がresolv.confに入った。よくわからんがこれでいこう。

日本語入力は、scimというのと、ibusというのがあって、scimはインストールできず、

ibusはインストールされているが起動せず、でどっちもダメだ。

まあguiでなきゃダメなことがあるわけではないから困らないのだが、

皆ができるということができないのは腑に落ちない・・・




Net::Twitter::Liteの更新



Net::Twitter::Liteが新しくなっているようなので更新した。

cpan[1]> install Net::Twitter::Lite
CPAN: Storable loaded ok (v2.20)
Going to read '/root/.cpan/Metadata'
Database was generated on Fri, 25 Jan 2013 14:53:03 GMT
CPAN: LWP::UserAgent loaded ok (v6.04)
CPAN: Time::HiRes loaded ok (v1.9725)
Fetching with LWP:
ftp://ftp.riken.jp/lang/CPAN/authors/01mailrc.txt.gz
CPAN: YAML loaded ok (v0.70)
Going to read '/authors/01mailrc.txt.gz'
CPAN: Compress::Zlib loaded ok (v2.058)
............................................................................DONE
Fetching with LWP:
ftp://ftp.riken.jp/lang/CPAN/modules/02packages.details.txt.gz
Going to read '/modules/02packages.details.txt.gz'
Database was generated on Sun, 27 Jan 2013 15:17:03 GMT
..............
New CPAN.pm version (v1.9800) available.
[Currently running version is v1.9402]
You might want to try
install CPAN
reload cpan
to both upgrade CPAN.pm and run the new version without leaving
the current session.


..............................................................DONE
Fetching with LWP:
ftp://ftp.riken.jp/lang/CPAN/modules/03modlist.data.gz
Going to read '/modules/03modlist.data.gz'
............................................................................DONE
Going to write /root/.cpan/Metadata
Net::Twitter::Lite is up to date (0.11002).





Java

ちょっとjavaを使ってみる。

server - clientのサンプルがあって、1台のパソコンで両方動かしてみたことがあるが、

それをさくらのVPSのサーバとWindows7間でやってみたい。

まずWin7にJDKを入れる。

JDKでいいんだっけ?

JavaはもうSunではなくORACLEのものになっている。

インストールして、Pathを追加して、helloworld的なものを動かしてみる。

さくらの方は、rpmファイルをPCに落としてftpであげようとしたら遅くて待てないので、wgetしようとしたら失敗する。どうも、WEBでLicense Agreementに同意してダウンロードしないとダメらしいので、PCからアップロードすることにする・・・あと80分とかいう表示・・・待てない。

さくらのvpsにX WindowsとGNOMEを入れて、VNCでつなぎ、firefoxをいれて、ORACLEのダウンロードページへ行って落とす。

けっこう時間はかかったが、今後もこういうことがあるかもしれないからね。

というわけでWin7とCentOS6の両方でjavaのHelloWorldを動かした。



perl単語帳

use Win32::Clipboard;
my $clip = Win32::Clipboard();
exit 1 unless $clip->IsText();
my $text = $clip->GetText();
$filename ='newwords.txt';
open $fh,'>>',$filename or die;
print $fh $text."\n";
close $fh;

新しい単語を見つけたらそれをクリップボードにコピーした後、

このスクリプトを動かすとファイルに追加してくれる。

それだけ。

コピーがメンドクサイ。本当は選択して右クリックで送りたいところだけど。




mediawikiのインストール

sphinxはやっぱりメンドクサイのでwikiを入れる。

こないだpukiwikiが動かなかったのでmediawikiを入れてみる。

ファイルを wgetでダウンロードして解凍し、/var/www/html/ の下にフォルダを移す。

そして http://www.example.com/mediawiki-1.xx.xx/index.php をブラウザで開く。

するとひまわりの写真の下に Please set up the wiki first. というリンクが表示される。

「これをクリックするとセットアップできるのか、こりゃ便利だ」

と思ったら、500のエラー。

ログを見ると、

[Sun Jan 27 04:48:27 2013] [error] [client xx.xx.xx.xx] PHP Fatal error:  Class 'DOMDocument' not found in /var/www/html/wiki/includes/LocalisationCache.php on line 542,(以下略)


これはphp-domがないと出るエラーだそうだ。

php-domをyumで入れればいいのだが依存関係がどうたらで結局phpを入れなおしてから以下をやった。

# yum install php-xml
# yum install php-dom
# service httpd restart


その後、インストールスクリプトが動いたがDBにアクセスできないとかいろいろあってごちゃごちゃやったが何が必要十分なのかがよくわからない。最終的にインストールできたときのphpとmysqlのモジュールは以下のようになっている。

# rpm -qa|grep php
php-mbstring-5.3.3-14.el6_3.x86_64
php-xml-5.3.3-14.el6_3.x86_64
php-common-5.3.3-14.el6_3.x86_64
php-pdo-5.3.3-14.el6_3.x86_64
php-gd-5.3.3-14.el6_3.x86_64
php-cli-5.3.3-14.el6_3.x86_64
php-mysql-5.3.3-14.el6_3.x86_64
php-devel-5.3.3-14.el6_3.x86_64
php-5.3.3-14.el6_3.x86_64
php-mcrypt-5.3.3-1.el6.x86_64
php-pear-1.9.4-4.el6.noarch

# rpm -qa|grep mysql
compat-mysql51-5.1.54-1.el6.remi.x86_64
mysql-5.5.28-3.el6.remi.x86_64
mysql-devel-5.5.28-3.el6.remi.x86_64
mysql-libs-5.5.28-3.el6.remi.x86_64
mysql-server-5.5.28-3.el6.remi.x86_64
php-mysql-5.3.3-14.el6_3.x86_64





Mojolicious

クライアントサーバのperl版を試した。

これを使えばさっき作った単語登録をネットワーク対応にできる。

そして、Mojoliciousというものを知った。

Mojolicious::Liteというモジュールもある。

インストール後、以下のようなファイルを作り、


use Mojolicious::Lite;

get '/' => 'index';

app->start;

__DATA__

@@ index.html.ep
Hello World!


以下のようにmorboというコマンドで実行するとhttpサーバが動く。


C:\Users\t\mojo>morbo mojo.pl
[Sun Jan 27 04:09:27 2013] [info] Listening at "http://*:3000".
Server available at http://127.0.0.1:3000.


この状態でブラウザで http://127.0.0.1:3000 にアクセスすれば、Hello World! という文字が表示される。

これはおもしろそう。

https://github.com/yuki-kimoto/mojolicious-guides-japanese/wiki/Mojolicious%3A%3ALite




正規表現メモ

20130125 のような文字列を年月日にわける。


if($date =~ /(\d{4})(\d{2})(\d{2})/){
$yy = $1;
$mm = $2;
$dd = $3;
}





fizzbuzz



perlの経験もだいぶ増えたので、fizzbuzz問題くらいなら書けるだろうと思って書いてみた。


for($i=0; $i<=100; $i++){
if(($i % 15)==0){
print "Fizz Buzz\n";
}elsif(($i % 3)==0){
print "Fizz\n";
}elsif(($i % 5)==0){
print "Buzz\n";
}else{
print $i."\n";
}
}


なんどもエラーが出ては消しを繰り返したけど、これであってるよね?

もっとエレガントな方法はあるだろう。perlだったらワンライナーで書いてるのを見たことがある。

が、とりあえず最低限の要件は満たすものとして。

perlでは、forでインデックスを足してくループなどほとんど使わないので、

インデックスの初期値と終了条件と増分の順番がわからなくなったりする。

mod(%)はさっきちょっと使ったので書けたがさっきまではgoogleで検索しないと書けないくらいだった。

というか、%を使ったからfizzbuzzを思い出したのだ。







演算子の優先順位はよくわからないので、いつも念のためにカッコをつけているが、

この場合は $i % 5 == 0 とかでいいんだね。

カッコをいれるというのは打鍵もちょっと面倒だしわかってる人には邪魔かな。

でもこれでいいんだっけ?と不安になるくらいならカッコをつけといたほうがいいと思ってつけている。

でも、やっぱり % くらいはつけずに使うか。

たとえば以下のような場合は、


$a = 99;

print $a."\n";

if($a > 10 and $a < 50 or $a == 99){
print "baaa\n";
}


今までは必ず以下のように書いていた。


$a = 99;

print $a."\n";

if((($a > 10) and ($a < 50)) or ($a == 99)){
print "baaa\n";
}





viで一括インデント

perlを書いていて、途中で「これはサブルーチンにしよう」と思ったときに、それまで書いた行を全部インデントしたいがメンドクサイのでそのままにしていたことが多かったのだが、簡単に複数行を一括でインデントできる方法を知った。

(カーソルをインデントしたい範囲の最初の行へ動かす)

v ( --VISUAL-- モードになる)
(カーソルをインデントしたい範囲の最後の行まで動かす)

> 

phpの連想配列

twitter apiを使っていて、perlでうまくいかないのでよく使われているphpのtwitteroauthでやっているのだが、json形式のデータから目指す値を取り出す方法がよくわからない。

phpの基礎からやっていく。

まず、連想配列。

<?php

$beatles = array (
'guitar' => 'george',
'bass' => 'paul',
'drums' => 'ringo',
'vocal' => 'john'
);

echo $beatles['guitar'];

echo "\n";

?>

実行結果

# php hai.php
george 今度は、json形式のデータを作り、それを配列に戻して値を取り出す。

<?php
$arr = array('John' => 'Lennon', 'Paul' => 'McCartney', 'George' => 'Harrison', 'Ringo' => 'Starr');

echo $arr['John']."\n";
echo $arr['Ringo']."\n";

echo "\n";

$json = json_encode($arr);

var_dump($json);

echo "\n";

$arr2 = json_decode($json);
var_dump($arr2);


$arr2 = json_decode($json,true);
var_dump($arr2);

echo $arr2['John']."\n";

?>

実行結果

# php a.php
Lennon
Starr

string(72) "{"John":"Lennon","Paul":"McCartney","George":"Harrison","Ringo":"Starr"}"

object(stdClass)#1 (4) {
["John"]=>
string(6) "Lennon"
["Paul"]=>
string(9) "McCartney"
["George"]=>
string(8) "Harrison"
["Ringo"]=>
string(5) "Starr"
}
array(4) {
["John"]=>
string(6) "Lennon"
["Paul"]=>
string(9) "McCartney"
["George"]=>
string(8) "Harrison"
["Ringo"]=>
string(5) "Starr"
}
Lennon
json_decodeで、オプション trueをつけると連想配列になる。つけない場合はvar_dumpすると object(stdClass) となっており、値を参照できなかった。どういう用途に使うのか?




phpで、oauthで認証後、そのユーザがブロックしているユーザを表示する

※このエントリーは古いです。

oauthについて再確認したエントリーはこちら

http://blog.monqy.net/2016/05/phptwitter-api-oauth.html

http://blog.monqy.net/2016/05/php-twitteroauth.html

http://blog.monqy.net/2016/05/php-twitteroauth_2.html


-----------------------------------------------------------------------------


アブラハムさんのサンプルhttps://github.com/abraham/twitteroauthをちょこっといじったもの。

<?php
/**
* @file
* User has successfully authenticated with Twitter. Access tokens saved to session and DB.
*/

/* Load required lib files. */
session_start();
require_once('twitteroauth/twitteroauth.php');
require_once('config.php');

/* If access tokens are not available redirect to connect page. */
if (empty($_SESSION['access_token']) || empty($_SESSION['access_token']['oauth_token']) || empty($_SESSION['access_token']['oauth_token_secret'])) {
header('Location: ./clearsessions.php');
}
/* Get user access tokens out of the session. */
$access_token = $_SESSION['access_token'];

/* Create a TwitterOauth object with consumer/user tokens. */
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $access_token['oauth_token'], $access_token['oauth_token_secret']);

/* If method is set change API call made. Test is called by default. */

$req1 = $connection->OAuthRequest("https://api.twitter.com/1.1/account/verify_credentials.json","GET");
$req2 = $connection->OAuthRequest("https://api.twitter.com/1.1/blocks/list.json","GET");
$json1 = json_decode($req1,true);
$json2 = json_decode($req2,true);

/* Include HTML to display on the page */
include('html.inc');


html.incは

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Twitter OAuth in PHP</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<style type="text/css">
img {border-width: 0}
* {font-family:'Lucida Grande', sans-serif;}
</style>
</head>
<body>
<div>
<h2>Welcome to a Twitter OAuth PHP example.</h2>

<p>This site is a basic showcase of Twitters OAuth authentication method. If you are having issues try <a href='./clearsessions.php'>clearing your session</a>.</p>

<p>
Links:
<a href='http://github.com/abraham/twitteroauth'>Source Code</a> &amp;
<a href='http://wiki.github.com/abraham/twitteroauth/documentation'>Documentation</a> |
Contact @<a href='http://twitter.com/abraham'>abraham</a>
</p>
<hr />
<?php if (isset($menu)) { ?>
<?php echo $menu; ?>
<?php } ?>
</div>
<?php if (isset($status_text)) { ?>
<?php echo '<h3>'.$status_text.'</h3>'; ?>
<?php } ?>
<p>
<pre>
<?php print_r($content); ?>
<hr>
<?php print($json1[screen_name])." is blocking <br><br>";
foreach($json2[users] as $key => $value){
print $value[screen_name].'<br>';
}
?>
</pre>
</p>

</body>
</html>


いろいろとダサいところはあるでしょうが、

とりあえずこれでブロックユーザ一覧が表示できる。

ハマったのは、$contentのprint_rを消すと、ユーザに認証させるためのボタンが消えてしまうことだった。

どうしてそうなるのかはいまだによくわからないが、とりあえずこいつを消してはいけない。

つぎはblockの解除だ。

ここまでくればあとはいけるだろう。




OAuth

twitterでOAuthの認証をするのをPerlでやりたい。

1年くらい前まで動いていたのだが、動かなくなってしまった。

APIの仕様が変わったせいだろうか?

必要なパラメータが増えたとか・・・。

誰かの書いたサンプルを片っ端から試しているのだがどれもダメだ・・・。




ようやく、PHPで動くサンプルを見つけてVPSで動かしてみるがダメだ・・・。

VPSのせいじゃないか・・・?




原因は時計があってないことだった。30分ほど遅れていた。

「時計があってないとダメ」という情報はすぐに見ていたのだが、まさかズレているとは思わず確認しなかった。

callbackurlの最後に/がないとダメか?とか、

applicationのtypeをreadから read/writeに変えたらkeyを再生成しないとダメか?とか、

iptablesのせいか?とか、

アプリを最初から作り直したりいろいろやったが、それらすべて問題なかった・・・

やれやれ・・・

だが、今度はなんで時計がずれてたのか、という問題を解決しなければならなくなった。







あと、いったんアプリを認証したあと、ログアウトせずにもう一度認証しようとすると不具合が起きるように見える。

あと、Net::Twitterだと時間がかかるのでbotでしたようにNet::Twitter::Liteにしたらnewできない。

なんだろう・・・

タイムアウトするようになってしまった。

なんでか全然わからん。全く同じ状態で一度は動いたから・・・

やっているのはblockしているユーザの一覧とその解除なのだが、結局ローカルでpythonのスクリプトを動かすのが一番速い。

ただ、これをWEBに公開して誰でも使えるようにしたかった。ほぼ同じ機能のものを公開している人もいる。

別にコレを公開しないとどうなるわけでもないが、twitterアプリの基本としてやっておきたかった・・・

なんだろなあ・・・




mysql

mysqlを使って、perlでcgiを作って、勉強半分・実用半分で使ってみた。

この日記は技術的なことをメモしておくのに使っているが、

mysqlに関しては特に難しいことがなく、検索すればなにもかもわかってしまうので、

あらためてここに記すことがほとんどない。