最近2.7か2.8にアップグレードしたあたりからか、イメージ追加でのサムネイルが選択できなくなった。
サーバにPHPのGDライブラリが入っていないことが原因のようだ。以下のようにインストールして直った(Ubuntuの場合)。
$ sudo apt-get install php5-gd
$ sudo /etc/init.d/apache2 restart
最近2.7か2.8にアップグレードしたあたりからか、イメージ追加でのサムネイルが選択できなくなった。
サーバにPHPのGDライブラリが入っていないことが原因のようだ。以下のようにインストールして直った(Ubuntuの場合)。
$ sudo apt-get install php5-gd
$ sudo /etc/init.d/apache2 restart
smarty内部で変数を定義。
assignを使う。ここではiを設定して一個ずつ増やしている。xoopsなので{ }じゃなくて<{ }>を使っている。
1 2 3 4 5 6 7 8 |
<{ assign var="i" value=0 }> <{foreach item=data from=$zenbu}> <{ assign var="i" value=$i+1 }> <tr id="tr_<{$i}>" class="<{cycle values="even, odd"}>"> <td><{$data.name}></a></td> <td>×</td> </tr> <{/foreach}> |
リリースビルドでもデバッグ情報をある程度付け足してビルドすることができるのでその方法。
1、メニューの「ビルド」「構成」からリリースビルドの構成を元に新しい構成を作成する。
2、プロジェクトの設定の、「C/C++」でデバッグ情報を「プログラムデータベースを使用」にする。「リンク」で、「デバッグ情報を生成する」をチェックする。
3、実行してエラーが出てくれれば、行番号などのある程度の情報はわかる。
上の方法でエラーが出てくれないとき。
1、リリースビルドのプロジェクトの設定の「リンク」で「MAPファイル生成」をチェックし、ビルドすると拡張子MAPのファイルができる。このファイルは関数のアドレス情報がわかる。
2、実行してエラーを再現して、エラーの起きたアドレスを調べる。以下の場合ならアドレスは0x401106になる。
3、MAPファイルからこのアドレスがどの関数かを調べる。左の数値ではなく右のほうの400000あたりから始まる数値。
4、頑張ればコールスタックも調べられる。
初期状態のmysqlサーバ(rootパスワードなし)をphpMyAdminからアクセスするための、config.inc.phpの設定。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?php /* Servers configuration */ $i = 0; /* Server localhost (config:root) [1] */ $i++; $cfg['Servers'][$i]['host'] = 'localhost'; $cfg['Servers'][$i]['extension'] = 'mysqli'; $cfg['Servers'][$i]['connect_type'] = 'tcp'; $cfg['Servers'][$i]['compress'] = false; $cfg['Servers'][$i]['controluser'] = 'root'; $cfg['Servers'][$i]['controlpass'] = ''; $cfg['Servers'][$i]['auth_type'] = 'config'; $cfg['Servers'][$i]['user'] = 'root'; $cfg['Servers'][$i]['password'] = ''; $cfg['Servers'][$i]['AllowRoot'] = true; $cfg['Servers'][$i]['nopassword'] = true; $cfg['Servers'][$i]['AllowNoPassword'] = true; $cfg['Servers'][$i]['AllowNoPasswordRoot'] = true; /* End of servers configuration */ ?> |
nopasswordとAllowNoPasswordRoot,AllowNoPasswordをtrueにする。
最近のsambaのアップデートで通信がやたらと遅くなる現象が発生した。原因はoplock(なんらかのファイルロック機構と思われる)がクライアントが正常終了しない場合、かなりの時間残ってしまうことのようだ。oplockはユーザ毎に持つようだが、sambaへのアクセスを同じユーザにしている場合この問題が発生しやすいようだ。
oplockを無効にすることでとりあえず回避。oplockの設定はディレクトリごとにできる。
smb.conf
1 2 3 4 5 |
[Share] path = /share/folder writeable = yes guest ok = yes oplocks = no |
WebBrowserのNavigateメソッドは非同期で動くので、コールしたあとすぐにはページが読み込まれておらず解析できない。そこでReadyStateがCompleteになるまで待てば解析できる。まつにはDoEventを使う。
タグの数を数えるプログラム(C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
private void button1_Click(object sender, EventArgs e) { webBrowser1.Navigate(@"http://ambiesoft.com/blog/archives/1603"); while (webBrowser1.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); } HtmlDocument doc = webBrowser1.Document; System.Collections.Generic.Dictionary<string, int> tagcounter = new Dictionary<string, int>(); foreach(HtmlElement elm in doc.All) { int val; if (!tagcounter.TryGetValue(elm.TagName, out val)) val = 0; tagcounter[elm.TagName] = val + 1; } StringBuilder sb = new StringBuilder(); foreach(KeyValuePair<string,int> kv in tagcounter) { sb.Append(kv.Key); sb.Append(" : "); sb.Append(kv.Value); sb.AppendLine(); } MessageBox.Show(sb.ToString()); } |
ApacheとかXOOPSはインストールされているものとする。
ここでスケルトンを作成できるので作ってmodulesディレクトリの下におく。ここではモジュール名はbunkoにした。そしてこのモジュールを管理画面からインストールする。成功したらトップページのメニューにBUNKOが追加されるので、クリックして実行できた。
一般ユーザ(非登録ユーザ)で実行できないので、以下のようにしてアクセス可能にする。
あとは作っていくわけだがこれもなかなか難しい。デフォルトのindex.phpは以下のようになっている。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php include 'header.php'; // this page uses smarty template // this must be set before including main header.php $xoopsOption['template_main'] = 'bunko_index.html'; include XOOPS_ROOT_PATH.'/header.php'; $xoopsTpl->assign('lang_title', _XD_TITLE); include XOOPS_ROOT_PATH.'/footer.php'; ?> |
bunko_index.htmlはtemplatesディレクトリにあるファイルを指定している。これがテンプレートになっていて、このファイルの中で使われる変数の定義をしているのがassignの行だろう。_XD_TITLEはlanguageで定義されている。つまりbunko_index.htmlがMVCのビューに相当して、index.phpがモデルとコントローラになるのか?
このスケルトンにはデータベース関係が含まれていないので、少し書いてみたい。mysqlディレクトリにあるmysql.sqlはこのモジュールのインストール時に実行され、必要なデータベースが作られると思われる。まずmysql.sqlを以下のように編集する。
1 2 3 4 |
CREATE TABLE bunkodata ( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , title VARCHAR( 511 ) NOT NULL ) ENGINE = InnoDB |
次にxoops_version.phpの以下の行のコメントをはずしてからモジュールの再インストールを行ってみる。
1 |
$modversion['sqlfile']['mysql'] = "sql/mysql.sql"; |
fc6515_bunkodata ができた。
このテーブルにアクセスしてみる。ここではあらかじめデータを入れておき読み込みのみを考える。入ってるデータは以下。
まずbunko_index.htmlを以下のようにする。
1 2 3 4 5 6 7 8 9 10 |
<h4 style="text-align:left;"><{$lang_title}></h4> <table> <tr><td>id</td><td>title</td></tr> <{foreach item=data from=$zenbu}> <tr><td><{$data.id}></td><td><{$data.title}></td></tr> <{/foreach}> </table> |
<{で始まってるのはsmartyの文法なのか?まあいいや。 次にindex.phpを以下のようにする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?php include 'header.php'; // this page uses smarty template // this must be set before including main header.php $xoopsOption['template_main'] = 'bunko_index.html'; include XOOPS_ROOT_PATH.'/header.php'; $xoopsTpl->assign('lang_title', _XD_TITLE); $sql = "SELECT id, title FROM ".$xoopsDB->prefix("bunkodata"); $result = $xoopsDB->query($sql); while($row = $xoopsDB->fetchArray($result)) { $zenbu[] = $row; } $xoopsTpl->assign('zenbu', $zenbu); include XOOPS_ROOT_PATH.'/footer.php'; ?> |
templateを編集した場合は、モジュールのアップデートをしなければならないのでアップデートしてから以下のようにできた。
最後にはユーザによる処理分けについて。
これは$xoopsUserというのを使うらしい。これが定義されていなければ未登録ユーザ。定義されていればいろいろ情報を持ってこれる。
これを使って以下のようにできた。
bunko_index.html
1 2 3 4 5 6 7 8 9 10 11 12 |
<h4 style="text-align:left;"><{$lang_title}></h4> Hello <{$username}>!! <table> <tr><td>id</td><td>title</td></tr> <{foreach item=data from=$zenbu}> <tr><td><{$data.id}></td><td><{$data.title}></td></tr> <{/foreach}> </table> |
index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<?php include 'header.php'; // this page uses smarty template // this must be set before including main header.php $xoopsOption['template_main'] = 'bunko_index.html'; include XOOPS_ROOT_PATH.'/header.php'; $xoopsTpl->assign('lang_title', _XD_TITLE); if ( $xoopsUser ) $xoopsTpl->assign('username', $xoopsUser->uname()); else $xoopsTpl->assign('username', "GUEST"); $sql = "SELECT id, title FROM ".$xoopsDB->prefix("bunkodata"); $result = $xoopsDB->query($sql); while($row = $xoopsDB->fetchArray($result)) { $zenbu[] = $row; } $xoopsTpl->assign('zenbu', $zenbu); include XOOPS_ROOT_PATH.'/footer.php'; ?> |
★ここにあるソースのライセンスはGPLを継承。
CygwinはWindowsで動くUNIXのコマンドラインツール。
Cygwinのソースコードを取ってくる。
$ cvs -d :pserver:anoncvs@cygwin.com:/cvs/src login
Logging in to :pserver:anoncvs@cygwin.com:2401/cvs/src
CVS password:anoncvs
$ cvs -d :pserver:anoncvs@cygwin.com:/cvs/src co winsup
U src/.cvsignore
U src/COPYING
U src/COPYING3
U src/COPYING.LIB
U src/COPYING3.LIB
U src/COPYING.NEWLIB
U src/COPYING.LIBGLOSS
U src/ChangeLog
U src/MAINTAINERS
U src/Makefile.def
.........
std::setは要素を格納する。重複なし。順番気にしない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 |
#include "stdafx.h" #pragma warning(disable:4786) #include <set> #include <iostream> #include <string> using namespace std; // 後で使うクラス class FUTU { int i_; string s_; public: FUTU(int i, const string& s) { i_ = i; s_ = s; } FUTU(int i, const char* p) { i_ = i; s_ = p ? p : ""; } FUTU(const FUTU& f) { i_ = f.i_; s_ = f.s_; } bool operator==(const FUTU& f) const { return i_==f.i_ && s_==f.s_; } bool operator!=(const FUTU& f) const { return !(*this==f); } bool operator<(const FUTU& f) const { return (i_<f.i_) || (i_==f.i_ && s_<f.s_); } friend ostream& operator<<(ostream& o, const FUTU& f); }; ostream& operator<<(ostream& o, const FUTU& f) { o << f.i_ << '\"' << f.s_ << '\"'; return o; } int main(int argc, char* argv[]) { set<int> is; set<int>::iterator it; is.insert(10); is.insert(20); is.insert(30); size_t count = is.size(); // =3 is.insert(10); // 同じの挿入エラーなし count = is.size(); // =3 // 削除 is.erase(20); // 削除した個数を返すみたい =1 count = is.size(); // 2 // ないのを削除 is.erase(20); // =0 is.erase(11111); // =0 count = is.size(); // 2 // あるか調べる it = is.find(10); if ( it != is.end() ) printf("aru"); else printf("nai"); it = is.find(2222); if ( it != is.end() ) printf("aru"); else printf("nai"); // 全部列挙 for ( it = is.begin() ; it != is.end() ; ++it ) { cout << *it; cout << ' '; } cout << endl; // 文字列で set<string> ss; set<string>::iterator it2; ss.insert("aaa"); string s("bbb"); ss.insert(s); ss.insert("ccc"); s = "ddd"; ss.insert(s); count = ss.size(); // =4 ss.erase("bbb"); it2 = ss.find("ccc"); if ( it2 != ss.end() ) printf("aru"); else printf("nai"); it2 = ss.find("AAA"); if ( it2 != ss.end() ) printf("aru"); else printf("nai"); for ( it2 = ss.begin() ; it2 != ss.end() ; ++it2 ) { cout << *it2 << endl; } // 普通のクラスで set<FUTU> ff; set<FUTU>::iterator it3; ff.insert(FUTU(0,"")); ff.insert(FUTU(1,"aa")); ff.insert(FUTU(2,"bb")); ff.insert(FUTU(3,"cc")); count = ff.size(); // =4 // 同じの入れる ff.insert(FUTU(3,"cc")); count = ff.size(); // =4 ff.erase(FUTU(3,"cc")); // あるやつ ff.erase(FUTU(3,"xx")); // ないやつ ff.erase(FUTU(100,"AAAAAAAAAAAAAA")); // ないやつ count = ff.size(); // =3 FUTU f(2,"bb"); it3 = ff.find(f); if ( it3 != ff.end() ) printf("aru"); else printf("nai"); it3 = ff.find(FUTU(2,"yy")); if ( it3 != ff.end() ) printf("aru"); else printf("nai"); for ( it3 = ff.begin() ; it3 != ff.end() ; ++it3 ) { cout << *it3 << endl; } return 0; } |
FUTUクラスを作るのが難しい。ここでも適当に作った。
用語の整理。
最終成果物は拡張子swfのファイル。
swfはFlash Player上で動かせる。
ActionScript:用いるプログラミング言語
MXML:XMLで書く、UIコントロールのレイアウト情報
Flex:開発環境と実行環境全体のことか?実体はActionScriptのクラスライブラリ+SDK(コンパイラとか)+Flash Playerも含む?
ここからflex_sdk_3.zip(121M)をダウンロードして解凍。
ここを参考に以下のファイル MyFirst.mxmlを作る。
1 2 3 4 5 |
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" horizontalAlign="center" verticalAlign="center"> <mx:Button id="myButton" label="I'm a button!" /> </mx:Application> |
これをflexsdkのbinフォルダにあるmxmlcコンパイラでコンパイルすればいいらしいのでやってみる。
1 2 3 |
C:\T\Flex>c:\Flex\bin\mxmlc MyFirst.mxml 設定ファイル "C:\Flex\frameworks\flex-config.xml" をロードしています C:\T\Flex\MyFirst.swf (173498 bytes) |
MyFirst.swfができた。このファイルをIEへD&Dしてみる。
動いた。結構簡単にできた。
次にこのswfファイルをこのサーバのルートにアップロードして、以下の記述を加えてみた。
1 2 3 4 5 6 |
<OBJECT classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000 width=300 height=80> <PARAM NAME="Movie" VALUE="/MyFirst.swf"> <PARAM NAME="Src" VALUE="/MyFirst.swf"> </OBJECT> <hr> <embed type="application/x-shockwave-flash" src="/MyFirst.swf"> |
1 2 3 4 5 6 7 8 9 |
public class MyFirst extends mx.core.Application { [Bindable] /** * @private **/ public var myButton : mx.controls.Button; |
MyFirstがアプリケーションクラスになって、myButtonがその中の変数になるようだ。
コードの話に戻って、ここではボタンがクリックされたら”Hello World”をメッセージボックスみたいなので出すコードを考えてみる。以下のようにできた(途中省略)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" horizontalAlign="center" verticalAlign="center"> <mx:Script> <![CDATA[ private function myHandler ( event:flash.events.MouseEvent ):void { mx.controls.Alert.show("Hello World"); } ]]> </mx:Script> <mx:Button id="myButton" label="I'm a button!" click="myHandler(event);" /> </mx:Application> |
swfのファイル名をMyFirst2.swfにしてアップロードして実験してみる。