開発メモ,主に補足by子連れ親父プログラマー

2010-11-09

phpにGDが入ってない!!って時にどうすればいいか

まあ、うちではよくある出来事で。
もう毎回の事なんだからさあ~って気もしないでもないが、やり方を教わったのでメモ。

サーバーに入って、rootになったら、
# yum search php
と打つ。
するとだーっとリストが出る。
その中に
php-gd.i386 : gd グラフィックライブラリを使用するための PHP アプリケーション用モジュール
こんなのがある。
それをこうする。
# yum install php-gd.i386

途中でyesかnoか聞かれるので、yesすると
Installed:
  php-gd.i386 0:5.1.6-27.el5

Complete!
というように入る。
あとは、
# /etc/init.d/httpd restart
再起動する。

2010-11-04

アパッチのエラーログをちらちら見ながら作業する

何回やっても憶えられないので記す。
tail -f /var/log/httpd/error_log

2010-10-26

jQuery UIのDialogで、開くウインドウの中身を別ファイルにしたい

ついでなので。
こちらもサンプルソースを見ると、
HTMLはただdialogってidでdiv作っておいて、
<div id="dialog" title="Basic dialog">
  <p>ここに中身</p>
</div>
JavaScript側はこんだけ。
$(function() {
  $( "#dialog" ).dialog();
});
そっけないなあ。
ドキュメントのoptionsとか見ても皆目見当が付かない。
ただやはりこれも同じHTMLのソース(テンプレ)の中にダイアログ用のソースをどんどん書いていくと、ごちゃごちゃになってくる。
1個、2個くらいならいいとは思うが。
ということで調べてみると、

Loading a page into a dialog

こういう記事があり、やり方はあることが分かった。

jqueryでまず一発 div を生成し、そこに .load() で別ファイルを読み込んで、そいつに dialog のオプションを設定し、そして .open() すれ、ってことらしい。

例として、id="add" のなにがしをクリックした場合として、
$('#add').click(function() {
  $('<div></div>')
    .load('add.php')
    .dialog({
      modal: true,
      autoOpen: false,
      buttons: {
        "登録": function() {
          $(this).dialog("close");
        }
      }
    })
    .dialog('open');
  return false;
});
こんな感じでしょうかー。

jQuery UIのTabsを使って切り替えるタブの中身のコンテンツ部分を別ファイルにしたい

他にいいのがなくて仕方なく使ってるjQuery UIですが、一番よく使う、いや、使いたくなるのが、Tabsを使ったタブレイアウトですね。
デザイナーがぱぱぱっと作ってくれればいいんだけど、いないし。
ということでそのTabsですが、サンプルのソースを見ると、
こんな感じになっていて、
<div id="tabs">
  <ul>
    <li><a href="#tabs-1">メニュー1</a></li>
    <li><a href="#tabs-2">メニュー2</a></li>
    <li><a href="#tabs-3">メニュー3</a></li>
  </ul>
  <div id="tabs-1">
    <p>一個目</p>
  </div>
  <div id="tabs-2">
    <p>2個目</p>
  </div>
  <div id="tabs-3">
    <p>3個目</p>
  </div>
</div>
切り替えるコンテンツの中身も全部同じ一個のファイル(テンプレ)に書く、それを出したり、隠したりする、ということになっている。
中身がちょびっとだったらいいけれども、量が多いとソース書く時に長くなるし、見づらくなるし、分割したい訳です!
別ファイルに。

ということで考えてみたんだが、、
HTMLの方は、
<div id="tabs">
  <ul>
    <li><a href="#tabs-1">メニュー1</a></li>
    <li><a href="#tabs-2">メニュー2</a></li>
    <li><a href="#tabs-3">メニュー3</a></li>
  </ul>
  <div id="tabs-1">
  </div>
  <div id="tabs-2">
  </div>
  <div id="tabs-3">
  </div>
</div>
コンテンツ部分を空っぽにしておいて、
$("#tabs").tabs({
  select: function(event, ui) {
    if (ui.index == 0) {
      $(ui.panel).load('index.php');
    }
    else if (ui.index == 1) {
      $(ui.panel).load('menu.php');
    }
    else if (ui.index == 2) {
      $(ui.panel).load('user.php');
    }
  }
});
とするのはどうだろうか。
もちろん、.load() で呼び出すindex.phpとかには<div>の間に入る内容を出力させます。
もっといい方法ありますか?

2010-10-25

postgreSQLで通し番号(シーケンス)をリセットする時に1から始めたい場合

postgreSQL で id とかのフィールドで自動的に番号が増えていく、auto_increment みたいな設定をテーブルにすると、シーケンスが作られる。
例えばこんなテーブルを作ると
CREATE TABLE users(
  id SERIAL PRIMARY KEY,
  name VARCHAR(255)
);
こんなんなる。
 Schema |     Name     |   Type   |  Owner
--------+--------------+----------+----------
 public | users        | table    | postgres
 public | users_id_seq | sequence | postgres
しばらく users にデータをインサートした後で、
このシーケンスに対してセレクトをかけると、
SELECT * FROM users_id_seq ;
こんな結果が返ってくる
 sequence_name | last_value | increment_by |      max_value      | ・・・
---------------+------------+--------------+---------------------+-------
 users_id_seq  |         34 |            1 | 9223372036854775807 | ・・・
この last_value というのが自動で増えていった id の最後の番号で、これが34になったまま、 users テーブルのデータを消してしまうと、次は id が34から始まってしまう。
1からにしたい、という時に、
select setval ('users_id_seq', 1);
とやるんだが、こうすると last_value が1になるので、次は2からになってしまう。
じゃあ、
select setval ('users_id_seq', 0);
としてみたらどうかと思うが、これはエラーになる。

ということでこうするとよい。
select setval ('users_id_seq', 1, false);

一回目は last_value は1のままで、is_called が true になり、二回目は last_value は2になる。

2010-10-21

ruby

今rubyの本読んでる

2010-10-01

テーブルの一番右端の列の値だけを取り出したい

テーブルの一番右端の列の値だけを取り出したい テーブルの一番右端の列に文字が入っていて、中にはリンクが貼られている場合もあるとする。
リンクが貼られている場合はそのURLを、文字だけの場合は、文字を、取り出したい。
var val=''; 
$('tr td:last-child').each(function(n){ 
    if ($(this).find('a').attr('href') != '') { 
        val += $(this).find('a').attr('href')+"\n";
    } else {
        val += $(this).text()+"\n";
    }
});
$('body').append('
' + val + '
');

こんな感じにしてみた。

2010-09-15

jQuery で table をいじるときは tbody を忘れない

まぁ普通に会員の一覧検索みたいな管理画面を作っていて、普通に table でタグが組んであって、それを項目名をクリックしたらその項目名の昇順で並び替えたいとか、そんなような作業ってのは結構あるわけで。
なんかこう、テーブルのそのデータ行の部分だけを Ajax で load するようにしたいなと。
思ったわけです。

で、テーブルは普通に、こんな感じであって、
<table id="result">
  <tr>
    <th>ID</th>
    <th>氏名</th>
    <th>メールアドレス</th>
  </tr>
  <tr>
    <td>1</td>
    <td>山田</td>
    <td>yamada@・・・.jp</td>
  </tr>
  <tr>
    <td>2</td>
    <td>佐藤</td>
    <td>sato@・・・.jp</td>
  </tr>
</table>
このデータ行の部分だけを Ajax で書き換えたいってことなんですが、どうすればいいですかね?
テーブルの2行目以降を一旦 remove() とかで消して、そこに append() すりゃいいんじゃないかとか、いろいろ悩んでみたんだけど、結局、tbodyを使うってことで解決しました。
先のテーブルを以下のように書き直します。
<table id="result">
  <thead>
    <tr>
      <th>ID</th>
      <th>氏名</th>
      <th>メールアドレス</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1</td>
      <td>山田</td>
      <td>yamada@・・・.jp</td>
    </tr>
    <tr>
      <td>2</td>
      <td>佐藤</td>
      <td>sato@・・・.jp</td>
    </tr>
  </tbody>
</table>
そして、
$(document).ready(function() {
  $('#result tbody').load(
    './result.php',
    $('form').serialize(),
    function(data){}
  );
});
と jQuery で書きます。
result.php にはページ中のフォームの値がGETで渡っていくので、それを適当に処理してクエリーをかけて結果を元に
    <tr>
      <td>1</td>
      <td>山田</td>
      <td>yamada@・・・.jp</td>
    </tr>
    <tr>
      <td>2</td>
      <td>佐藤</td>
      <td>sato@・・・.jp</td>
    </tr>
の部分だけを出力してやればよいです。

2010-09-11

jQuery、Form Plugin を使って、file upload する、ファイルを選択したら自動でその画像が表示されるようにする

まあ、とにかくファイルアップロード系のプラグインってのはあるようでないようで、これというのがない。
もう探し疲れたよ、ほんとに。
ファイルのアップロードのインターフェースはこういうのがいいんだ、っていう部分で人によって意見が違いすぎるんだよな、結局。
だから作者によって考えてることが全然別々で。
ということで、一番シンプルで、機能がなくて、ただアップロードできるだけ、というものを考えてみた。
まず、HTML側はこうする。
<form id="upload" method="post" action="form.php" >
  <input type="file" name="sample" id="sample" />
  <img id="sample_img" src="img/sample.jpg">
</form>
sample.jpg はデフォルトの画像で用意してあって、最初から表示されているんだけど、ファイル参照で別の画像を選べばそれに置き換わる、というようなものを作ろうってことだ。

まず、
http://www.malsup.com/jquery/form/
こちらから Form Plugin を入手して、読み込む。
<script type="text/javascript" src="js/jquery-1.4.2.min.js"></script>
<script type="text/javascript" src="js/jquery.form.js"></script>
で、ファイル選択したらファイルアップロードをする php に処理を渡せばいいので、
$(document).ready(function() {
  $("input#sample").change(function(){
    var options = { 
      url:       'upload.php',
      dataType:  'xml', 
      success:   processXml 
    }; 
    $('form#upload').ajaxSubmit(options); 
  });
});
こんな感じに書く。中味は全部 form プラグインの記述。dataType で xml を選ぶのが味噌だ。
json にすると動かないので注意。
ajaxSubmit で form の action 先を upload.php に変更して、自動でサブミットしてくれる。

ということなので upload.php を書く。
いや、これはまあ、普通に $_FILES を使ったファイルアップロード処理を php で書けばいいだけなので詳細は略。
普段自分が使ってるやつでやってくれ。
なんやかんや処理した後に、
header('Content-type: text/xml'); 
echo <<<END
<root>
  <status>$status</status>
  <file_path>$file_path</file_path>
  <emes>$emes</emes>
</root>
END;
というように xml で結果を返す。上記では $status に成功したかどうか、$file_path にアップロードした画像を保存したファイルのパス、$emes にエラーメッセージ、を格納しているつもりである。

で、アップロードに成功すると
success:   processXml 
とあるように、processXml に処理が渡るので、processXml をごりごり書く。
function processXml(responseXML) {
  var status = $('status', responseXML).text();
  if (status == 'success') {
    var file_path = $('file_path', responseXML).text(); 
    $('#sample_img').attr('src', file_path);
  } else {
    var emes = $('emes', responseXML).text();
    alert(emes);
  }
}
xml のデータは
$('status', responseXML).text()
というような書き方で取得できる。
ので、jQuery の .attr を使って画像のパスを書き換える。
$('#sample_img').attr('src', file_path);
これでオッケーだ。
あとは好きなようにいじればよしと。

このブログを検索

Powered by Blogger.

ラベル

php (17) jQuery (13) OSX (10) MySQL (8) Javascript (7) Postgres (7) port (7) apache (6) Java (3) Smarty (2) html (2) pear (2) FCKEditor (1) XAMPP (1) css (1) git (1) perl (1) ruby (1)

Facebookバナー