owncloud7.0.2で、共有先ユーザの検索をきちんとする

たぶんowncloudの中の人は少ユーザでのテストしかしてないと思うんですが、たくさんのユーザを使ってるowncloudでは現状の仕様ではちょっと困りそうなので。

特に「Restrict users to only share with users in their groups」のオプション(グループでのみ共有を可能にする)を使っているとき、共有先の検索は以下のような動作になっています。

1. 所属しているグループのユーザを15人までリストアップ
2. 入力文字列の「前後方一致」で全ユーザを検索
3. 「両方に一致したユーザ」を共有先としてリストアップ

このため検索元ユーザと同グループに15人以上所属している場合、15人目以降が選択されません。
検索枠の文字列を更新するごとに検索しなおしていますけど、いくらユーザ名を正確に入れても同じことです。

正しくなってほしい挙動は以下。

1. 所属しているグループのユーザから、「入力文字列の前方一致」で15人までリストアップ
2. 入力文字列の「前方一致」で全ユーザを検索
3. 「両方に一致したユーザ」を共有先としてリストアップ
(1.だけでいい気はするけど)

というかソースを見る限りもともと1.の部分は入力文字列が検索条件に入るはずなのですが、なぜか空白の前後方一致=ANYになってしまっているのでバグですね……。

下記を直します。

./lib/private/user/database.php
161c161
$result = $query->execute(array($search . ‘%’, $search . ‘%’));

> $result = $query->execute(array(‘%’ . $search . ‘%’, ‘%’ . $search . ‘%’));
235c235
execute(array($search . ‘%’));

> $result = $query->execute(array(‘%’ . $search . ‘%’));

./lib/private/group/database.php
172c172
$result = $stmt->execute(array( $search . ‘%’));

> $result = $stmt->execute(array(‘%’ . $search . ‘%’));
206c206
execute(array($gid, $_GET[‘search’].’%’));

> $result = $stmt->execute(array($gid, ‘%’.$search.’%’));

groupの方のdatabaseの206行目が一番問題なのですが、どうして変数から値が抜け落ちちゃってるのかわからないので応急処置・・・直前まで値が入ってるように見えるんだけどな・・・。

広告

自分用phpメモ Mysqlで取ってきたデータを配列にするとき

どこを読んでも分かりづらかったので・・・

1. クエリでもらってきたデータを配列にもらうには、自分で配列に入れなおさないいけない(関数は用意されていない)
2. mysqli_fetch_array(結果の入った変数) をすると一行ずつデータがもらえる
3. mysqli_fetch_array(結果の入った変数, result_type)をすると、result_typeで指定された形式で一行ずつデータがもらえる。
4. mysqli_fetch_arrayで結果が返らないときはfalseになる

ということで

while ( $一行分 = mysqli_fetch_array($結果, result_type)){ $配列[] = $一行分; }

でデータがなくなるまで格納される。

result_type は3種類。
MYSQL_BOTH(デフォルト) は 配列の格納順番とカラム名の両方で入れてくれる。
MYSQL_NUM は 配列の格納順番だけ。
MYSQL_ASSOC は カラム名だけ。

hoge[行数][列数] でやりたいのか hoge[行数][’カラム名’] でやりたいのかによって使い分け。
とりあえずデータ量がBOTHは単純に二倍になるので、NUMやASSOCが推されてる、と。

さくらのレンタルサーバー(スタンダードプラン)でphpのセッションを使う

というかデフォルトで使えないのに驚いた。
あと、サーバにどんだけ他ユーザがいるのかもさっくり見えちゃうのも驚いた(なんでjailしてないんだろう)。
それはともかく。

ローカル環境でテストしたwebサイトがうまく動かなくて、どうもセッションが使えてないらしい。
どうやらデフォルトではセッションの保存先が指定されていない(のかディレクトリの権限なのかしらないけど)ようなので、下記の作業。

$ mkdir /home/ユーザ名/temp
$ chmod 775 /home/ユーザ名/temp

$ vi /home/ユーザ名/www/php.ini
session.save_path = ‘/home/ユーザ名/temp’;

何の親切か知らないけどデフォルトでディレクトリ構成が見れるようになってたりと、まじめに使おうと思ったら結構大変。
というか僕がFreeBSDに慣れていないだけかも……

PHPでTwitter API でツイートを投稿する際のハマりポイント

盛大にはまったので。
401とか403でエラーしてる場合は下記チェックです。

1. 登録でハマる

https://dev.twitter.com/
に開発者登録しないと始まりませんが、いつごろからか「Read and Write」のPermissionを得るには、Twitterアカウントにモバイルの登録が必須になりました。(一時期は三つ以上アプリを登録しようとするときも必要だった・・・気がする)

Twitterの設定>モバイル からメールアドレスを登録すればOK・・・ではないです。

その後に、スマートフォン用のTwitter公式アプリでログインをする必要があります。

Dev側のエラーではメアド登録後もずーっと携帯電話番号を登録せよ、とか出てますし、設定から言語を英語に切り替えるとまるで日本の携帯電話番号が登録できそうな感じですが、「まだ君のところの国のプロバイダには対応してないよ」とか言われて登録できません。事実はスマフォ公式アプリでのログインなのです。

ガラケーしか持ってなかったら開発できないですね。ちなみに、アプリでログインさえできればよいので、そのスマフォでプロバイダメールを使っている必要はないです。

2. APIキーの再発行でハマる

作ったアプリケーションキーは、最初「Read」の権限で作られます。
でこれを「Read and Write」に変更します。
再読み込みすると、Permissionが「Read and Write」になってるから完了・・・ではないです。

その後、「Regenarate API keys」でキーを再発行する必要があります。

自動で再発行されないので、手動で再発行しないと新しい権限が適用されません。表示上は何のお知らせもありませんが。

3. POSTでハマる。

phpのバージョンとかもいろいろなのですが
とりあえず下記使っている前提で
https://github.com/abraham/twitteroauth

require_once(‘twitteroauth.php’);
$message = ‘つぶやき内容’;
$oauth = new TwitterOAuth(‘API Key’, ‘API Secret’, ‘Access Token’, ‘Access Secret’);
$tweet = $oauth->post(‘statuses/update’, array(‘status’ => $message));

これでつぶやけます。他人につぶやかせたい場合はアクセストークンを取得してそれを入れて。
できてなかったらprint var_dump($tweet);でダンプしてください。

CentOS6.5でMantisBT1.2.16を日本語化して使うところまで

BTSはいくつかありますが、その中でもとりあえずMantisBTをインストール。

参考:
http://blog.torigoya.net/2011/03/13/mantis/
http://www.alles.or.jp/~sogabe/mantis/manual/1.3.html

CentOS6.5をminimalでインストールしたところからスタートです。

# vi /etc/selinux/config
SELINUX=disabled

とりあえずお約束をして再起動したら

# yum -y install httpd mod_ssl mysql mysql-server php php-mysql php-mbstring wget ntp

# vi /etc/ntp.conf
disable monitor

# chkconfig ntpd on
# service ntpd start

必要な分だけインストール。もちろん通信はSSL。このブログはSSL推しです。証明書なんてなくても・・・。

あと本日時点でまだntpのDDOS攻撃を修正したntpはyumで降ってこないので、修正。必要なntpサーバ書いてください。

# cp /usr/share/mysql/my-large.cnf /etc/my.cnf
# vi /etc/my.cnf
[client]
default-character-set = utf8

[mysqld]
character-set-server =utf8

[mysqldump]
default-character-set = utf8

[mysql]
default-character-set = utf8
auto-rehash

# chkconfig mysqld on
# service mysqld start

# vi /etc/php.ini
date.timezone = Asia/Tokyo

mysqlはしつこくUTF8。それからauto-rehashも入れておくことにしました。タブ補完できたほうが後々面倒にならないと思うので。いらなければ削ってください。date.timezoneも、MantisBT側で使用者のタイムゾーンを設定できるみたいなんですが、とりあえず入れておきます。

# mysql
> CREATE DATABASE mantisdatabase;
> CREATE USER ‘mantisuser’@’localhost’ IDENTIFIED BY ‘mantispassword’;
> GRANT ALL ON mantisdatabase.* TO mantisuser;
> EXIT

MantisBT用のDBとユーザを作ります。

続いてMantisBTをダウンロードして設置。

# cd /usr/local/src
# wget http://ftp.jaist.ac.jp/pub/sourceforge/m/ma/mantisbt/mantis-stable/1.2.16/mantisbt-1.2.16.tar.gz
# tar zxvf mantisbt-1.2.16.tar.gz
# mv mantisbt-1.2.16 /var/www/html/mantisbt
# chown apache:apache /var/www/html/mantisbt

443ポートを開けたら

# chkconfig httpd on
# service httpd start

して、https://どめいん/mantisbt/admin/install.php にアクセスします。

初期パスワードのadministrator / root でアクセスして、初期設定。
DBのユーザ/PWを二回聞かれてますが、権限分けしているときだけ必要っぽいので最初の方だけ埋めればいいです。

その後は日本語化とメール通知設定をします。

# vi config_inc.php
$g_default_language = ‘japanese’;
$g_phpMailer_method = PHPMAILER_METHOD_SMTP;
$g_smtp_host = ‘メールサーバ’;
$g_smtp_username = ‘メールアカウント’; #
$g_smtp_password = ‘メールパスワード; #
$g_smtp_port = SMTPポート番号;
$g_administrator_email = ‘メールアドレス’;
$g_webmaster_email = ‘メールアドレス’;
$g_from_email = ‘メールアドレス’;
$g_return_path_email = ‘メールアドレス’;

アクセスしなおして日本語になっていればとりあえず使えます。

ActionScriptとphpを使ってFlashに画像を取り込む

Flashの解析やディレクトリから直接画像を引っ張り出されない工夫をしてみる。

ちなみにAdobeは高くて買えないので、いつもFlashを作るのにはparafla!を使用しています。

parafla!のページ
http://parafla.coaworks.jp/

手順や構成はこんな感じです(わかりづらいね)

1. 「呼び出し側.swf」を作成して、「Flash呼び出し.php」をURLで取得する。
2. 「Flash呼び出し.php」では、「Flash.swf(本体)」を読み込んで表示する。
3. 「表示側.php」を作成して、「呼び出し側.swf」を読み込んで表示する。
4. 「Flash.swf」では、「画像呼び出し.php」を要所要所スクリプトで呼び出してムービークリップに表示する。
5. 「画像呼び出し.php」は、「画像.png」を読み込んで表示する。

ユーザがアクセスするのは[index.php](includeとかで表示側.phpを読み込む)。

[index.php]→[表示側.php]→[呼び出し側.swf]→[Flash呼び出し.php]→[Flash.swf]→(画像が必要な時に)[画像呼び出し.php]→[画像.png]

htaccessで直接アクセスされないように制限
・phpから呼び出すモノのディレクトリはローカルからのみのアクセス制限(PHPはサーバサイドで動くから)
・swfから呼び出すモノのディレクトリはリファラでアクセス制限(SWFはユーザのローカルマシンで動くから)

[index.php]→[表示側.php][呼び出し側.swf][Flash呼び出し.php][Flash.swf]→(画像が必要な時に)[画像呼び出し.php][画像.png]

緑=ローカルからのみ 水色=リファラ制限

とこうすることで肝心のFlash本体や画像は直接アクセスできないディレクトリに置けると思うのですが、どうでしょう。
もっといい方法があったら教えてください(paraflaで動く範囲で)。

ownCloudでフォルダを圧縮ダウンロードする際の文字化けを解消する

ownCloud
http://owncloud.org/
DropBox的なやつです。

対象バージョンは5.0(もう6.0出てるから、そのうち試そうと思う)

フォルダをzipに圧縮してダウンロードする機能があるんだけど、日本語が文字化けする。
(DBの文字コードによるのかもしれないです)

owncloud/lib/files.php このファイルの2行を修正したら直りました。

– $zip->addEmptyDir($internalDir.$dirname);
+ $zip->addEmptyDir(mb_convert_encoding($internalDir.$dirname,”SJIS”,”UTF-8″));

– $zip->addFile($tmpFile, $internalDir.$filename);
+ $zip->addFile(mb_convert_encoding($tmpFile,”SJIS”,”UTF-8″), mb_convert_encoding($internalDir.$filename,”SJIS”,”UTF-8″));

参考にしたのはこちら
http://se-suganuma.blogspot.jp/2010/09/phpziparchive.html