owncloud8.2.3で、フォルダをダウンロードしたときの文字化けと、ユーザ名の検索を修正する

owncloud8.2.3になってました。もう9.0とかもでているみたいですが。

さてフォルダをダウンロードしたときzipファイルを開くとファイル名が文字化けしている件は、下記で直ります。
まあWindows8以降なら問題ないそうですけど、7だといまだにダメなので。

owncloud/3rdparty/mcnetic/zipstreamer/src/ZipStreamer.php

private static function normalizeFilePath($filePath) {
return trim(str_replace('\\', '/', $filePath), '/');
}

private static function normalizeFilePath($filePath) {
return mb_convert_encoding(trim(str_replace('\\', '/', $filePath), '/'),"SJIS","UTF-8");
}

共有先のユーザの検索は、おせっかいなことに前後方一致検索になっているので、前方一致に直すなら下記の部分で「’%’ . $search . ‘%’」になっている部分を「$search . ‘%’」にしてください。まあ、投げているクエリからして20000ユーザ表示するみたいなので、直さなくてもいいかもですが……。

owncloud/lib/private/user/database.php

public function getDisplayNames($search = '', $limit = null, $offset = null) {
$parameters = [];
$searchLike = '';
if ($search !== '') {
$parameters[] = '%' . $search . '%';
$parameters[] = '%' . $search . '%';
$searchLike = ' WHERE LOWER(`displayname`) LIKE LOWER(?) OR '
. 'LOWER(`uid`) LIKE LOWER(?)';
}

public function getUsers($search = '', $limit = null, $offset = null) {
$parameters = [];
$searchLike = '';
if ($search !== '') {
$parameters[] = '%' . $search . '%';
$searchLike = ' WHERE LOWER(`uid`) LIKE LOWER(?)';

vi owncloud/lib/private/groups/database.php

public function getGroups($search = '', $limit = null, $offset = null) {
$parameters = [];
$searchLike = '';
if ($search !== '') {
$parameters[] = '%' . $search . '%';
$searchLike = ' WHERE LOWER(`gid`) LIKE LOWER(?)';
}

広告

自分用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);でダンプしてください。

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で動く範囲で)。