ショウジョウバエ研究会第7回研究集会で使ったオンライン登録のための PHPスクリプト
松尾隆嗣さん(東京都立大学)の力を借り、都丸雅敏(京都工芸繊維大学)とふたりで作成した2005年のショウジョウバエ研究会のオンライン登録のための PHP スクリプトです。
著作権は松尾と都丸にあります。GNU General Public License version 2 (gpl.txt)または、その上位バージョンの下で配布は自由です。
PukiWiki公式ページの 欲しいプラグイン/417 「twitterの特定のツイートを貼る(埋め込む)機能」のコメントで、 ペナーさんが作成したもの+takayanさんの修正のプラグイン tweet_inc.inc.php を plugin ディレクトリにコピー
#tweet_inc(ツイートのURL);
でおっけい。実装は、例えば 附属図書館のツイートで
基本的な部分は
PukiwikiレスポンシブSkin
に従った。
加えて、twitter bootstrap にも対応させた。
が、pukiwiki の skin をあまり触らないと bootstrap らしさは何もない。
触ったのは skin と css
メニューをハンバーガー(≡)にするのは難易度が高くてできなかった……。
天下の Google さんの
モバイルフレンドリーテスト
で不合格とされないために、
<head> に
を追加
これで、Google のモバイルフレンドリーテストでは合格になります。
が、これだけじゃ不足。<body> 部分も触る必要がある。
<head> 部分
<?php // 23 January 2019 ?> <?php // from https://getbootstrap.com/docs/4.2/getting-started/introduction/ ?> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <!-- Bootstrap CSS --> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css"></script> <?php // End of 23 January 2019 ?>
<body> 部分その1
pukiwiki は <table> を利用してレイアウトされているので、
<table> タグの部分を削除する。
Before
<?php if ($menu !== FALSE) { ?> <table border="0" style="width:100%"> <div id="contents"> <tr> <td class="menubar"> <div id="menubar"><?php echo $menu ?></div> </td> <td valign="top"> <div id="body"><?php echo $body ?></div> </td> </tr> </table> </div> <?php } else { ?> <div id="body"><?php echo $body ?></div> <?php } ?>
After(コメントアウト)
<?php if ($menu !== FALSE) { ?> <?php // 23 January 2019 // http://reddog.s35.xrea.com/wiki/PukiwikiレスポンシブSkin.html //<table border="0" style="width:100%"> ?> <div id="contents"> <?php // 23 January 2019 // <tr> // <td class="menubar"> ?> <div id="menubar"><?php echo $menu ?></div> <?php // 23 January 2019 // </td> // <td valign="top"> ?> <div id="body"><?php echo $body ?></div> <?php // 23 January 2019 // </td> // </tr> //</table> ?> </div> <?php // end of 23 January 2019 ?> <?php } else { ?> <div id="body"><?php echo $body ?></div> <?php } ?>
After(削除後)
<?php if ($menu !== FALSE) { ?> <div id="contents"> <div id="menubar"><?php echo $menu ?></div> <div id="body"><?php echo $body ?></div> </div> <?php } else { ?> <div id="body"><?php echo $body ?></div> <?php } ?>
<body> 部分その2
一番下に、bootstrap のおまじないを追加する
<?php // 23 January 2019 ?> <?php from // https://getbootstrap.com/docs/4.2/getting-started/introduction/ ?> <!-- Optional JavaScript --> <!-- jQuery first, then Popper.js, then Bootstrap JS --> <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.6/umd/popper.min.js"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js"></script> <?php // End of 23 January 2019 ?>
幅によって表示が変わるように最後に追加
<?php // 23 January 2019 ?> <?php // from reddog.s35.xrea.com/wiki/PukiwikiレスポンシブSkin.html ?> @media (max-width: 480px) { div#contents { display:table; table-layout:fixed; width:100%; } div#menubar { display:table-footer-group; width:100%; } div#body { display:table-row-group; width:100%; } } @media (min-width: 481px) { div#contents { display:table; table-layout:fixed; width:100%; } div#menubar { display:table-cell; vertical-align:top; width:120px; } div#body { display:table-cell; } } @media (min-width: 800px) { div#contents { display:table; table-layout:fixed; width:100%; } div#menubar { display:table-cell; vertical-align:top; width:180px; } body { // max-width: 800px; } } <?php // End of 23 January 2019 ?>
#contents
によって自動的にそのページの目次が生成され、
目次の各項目をクリックすると、
小見出し(* や **、*** のところ)に飛ぶようになる。
しかし、そのリンク先のアンカーが小見出しの最後になってしまうので、
小見出しが長く2行になってしまうようなときには、
「ここはどこ?」「ワタシはダレ」状態になってしまうことがある。
そこで、アンカーを小見出しの前に設定するように変更する。
lib/convert_html.php の 947行目、Add heding のところを変更すればよい。
// Add heding return array($anchor . $text, $this->count > 1 ? "\n" . $top : '', $autoid); // 13 Feb 2018 tomaru // return array($text . $anchor, $this->count > 1 ? "\n" . $top : '', $autoid);
heding は、heading の綴りミスのような気がしないでもないけど、 元々こうなので。
なお、このページは変更はしていませんが、 別なページで実装し、 動作確認済み。
pukiwiki.skin.php の <head> と </head> の間に下のコード(ミニマム設定[$ $ は使えない])を入れればおっけい。
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML"> </script>
出力例:
コード
\(\sum_{n=1}^\infty \frac{1}{n^2} = \frac{\pi^2}{6}\)
出力
\(\sum_{n=1}^\infty \frac{1}{n^2} = \frac{\pi^2}{6}\)
コード
\[ \sum_{n=1}^\infty \frac{1}{n^2} = \frac{\pi^2}{6} \tag{3} \]
出力
\[
\sum_{n=1}^\infty \frac{1}{n^2} = \frac{\pi^2}{6}
\tag{3}
\]
くろきさんの、
デフォルトの設定では \( \) のみが使用できるが、このファイルでは $ $ も 使えるようにしてある。$ $ がデフォルトの設定で使えないようにしてある理由は 米語の文書に $ が頻出するからである。日本語で書く場合には も使えた方が便利 だと思う。
のコード(下)をそのまま利用すると、地の文に $ が入っているところが化けてしまうので採用せず。
<script type="text/x-mathjax-config"> MathJax.Hub.Config({ tex2jax: { inlineMath: [['$','$'], ["\\(","\\)"]] } }); </script> <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML"> </script> <meta http-equiv="X-UA-Compatible" CONTENT="IE=EmulateIE7" />
某センターのサービスページで学内専用が必要と思い立った。
某お役所が簡単に見たり、
Natsuko's Homepage の PukiWiki/アクセス制限 を参考に設定しました。 ほぼそのままですが、一カ所修正しています。
pukiwiki.ini.php
// Read auth (0:Disable, 1:Enable) $read_auth = 1; $read_auth_pages = array( // Regex Username );
$read_auth を有効にしないと、IP address による制限ができないとのこと。
$read_auth_pages の中身を空にすると、誰でも閲覧可になる。
ので、$read_auth を有効にしても問題ない。
lib/auth.php
Basic authentication (function basic_auth) に追加(2ヶ所)
172行目に追加
Natsuko さんのは、in_array でページ名の一致を見ているコードですが、 プリフィクス KITdoc があるページは全て学内専用となるようにしたかったため、 preg_match で判断させました。違いはここだけです。
// 08 June 2013 for access limit page by IP address $auth_network = '/^133.16./'; $auth_network_pages = '/^KITdoc/'; if (preg_match($auth_network, $_SERVER['REMOTE_ADDR']) || ! preg_match($auth_network_pages, $page)) { // End of 08 June 2013 for access limit page by IP address
挿入場所
global $auth_method_type, $auth_users, $_msg_auth; <<ココ!>> // Checked by: $target_str = ''; if ($auth_method_type == 'pagename') {
198行目に追加
// 08 June 2013 for access limit page by IP address } else { $user_list = array(); $auth_flag = false; } // End of 08 June 2013 for access limit page by IP address
挿入場所
global $auth_method_type, $auth_users, $_msg_auth; // Basic-auth with $_SERVER['HTTP_AUTHORIZATION'] list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = explode(':', base64_decode($matches[1])); } <<ココ!>> if (PKWK_READONLY || ! isset($_SERVER['PHP_AUTH_USER']) || ! in_array($_SERVER['PHP_AUTH_USER'], $user_list) || ! isset($auth_users[$_SERVER['PHP_AUTH_USER']]) || pkwk_hash_compute(
どちらも消すものはありません。追加のみ。
真似して、diffの出力も貼り付けときます。
173,179d172 < // 08 June 2013 for access limit page by IP address < $auth_network = '/^133.16./'; < $auth_network_pages = '/^KITdoc/'; < < if (preg_match($auth_network, $_SERVER['REMOTE_ADDR']) || ! preg_match($auth_network_pages, $page)) { < // End of 08 June 2013 for access limit page by IP address < 206,211d198 < // 08 June 2013 for access limit page by IP address < } else { < $user_list = array(); < $auth_flag = false; < } < // End of 08 June 2013 for access limit page by IP address
skin/pukiwiki.css.php の div#menubar(CSSの設定)の word-break の値を break-all から normal に変える
div#menubar{ ……略…… word-break:normal; ……略…… }
参考:generate_tagsプラグインによるタグを用いたページ分類
PukiWiki/1.4/ちょっと便利に/上付き下付き文字 にしたがって、pluginフォルダに、pluginのファイル(super.inc.php、subsc.inc.php)を入れた。文字の大きさも少し調整して80%に。リンク先とは調整がちょっと違います。
return "<span style=\"font-size:80%;vertical-align:super\">$body</span>"; または return "<span style=\"font-size:80%;vertical-align:sub\">$body</span>";
これで
Super&super{super}; & Sub&subsc{sub};
とすると右のようになる Supersuper & Subsub
PukiWikiプラスなら、もとからプラグインがあったんですが、う〜ん
WikiNameのように大文字が2つ入った単語を、pukiwikiのデフォルトでは、
WikiNameと認識して、リンクを作るようになっています。
そういう名前のページがないと、?がついて、クリックするとページを作るように
なります。
ふだん、本文中で新しいWikiNameのページを作るような書き方はしないので、 この機能を停止させることにしました。 その結果、「McAfee」、「VirusScan」、「WinEyes」、「OneLook」などに?が付かなくなり、見やすくなりました
pukiwiki.ini.php
///////////////////////////////////////////////// // _Disable_ WikiName auto-linking $nowikiname = 1; // 22 September 2007 // 0; -> 1;
pukiwikiの各ページは「index.php?ほにゃほにゃほにゃ」のようになるので、
いまひとつ。そこで、「ほにゃほにゃほにゃ.html」となるように設定
http://terai.xrea.jp/PukiWiki/RewriteEngine.html のとおりに .htaccessに加えた。
もっとワザを使う場合にはいろいろあるようですが、これが一番単純なので
これだけにしている。
実際の設定は、01 July 2006
.htaccess(pukiwiki.ini.php のあるディレクトリのもの)に追加
DirectoryIndex index.php RewriteEngine on RewriteBase /~tomaru/pukiwiki RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)\.html(#.*)?$ index.php?cmd=read&page=$1$2 [L]
※ 追記 2018年4月18日
なんと、10年以上も書き忘れていました。.htaccess の設定だけでは、リンク文字列が偽装できません。そこで、/lib/make_link.php の書き換えも必要です。これも http://terai.xrea.jp/PukiWiki/RewriteEngine.htmlに従い修正。
実際の設定は、01 July 2006
/lib/make_link.php の修正(700行め位 1.4.6、750行め位 1.5.1)
return $al_left . '<a ' . 'href="' . $script . $s_page . '.html' . $anchor . // 01 July 2006 // For Static URL // http://terai.xrea.jp/PukiWiki/RewriteEngine.html // // return $al_left . '<a ' . 'href="' . $script . '?' . $r_page . $anchor .
virtual host の ssl のディレクティブ に(vhost-ssl.conf など)
AllowOverride All
などを入れておく。
All の代わりに FileInfo でもいいらしいのですが試していません。
ssl で override できるよう明示的に指示が必要。
80(s 抜き)で AllowOverride を書いておいても、s付きでは効果なし。
気付くのに何年も掛かってしまった……。
pukiwiki.ini.phpの設定(抜粋) 1.$auth_usersを設定する $auth_users = array( 'foo' => 'foo_passwd', // Cleartext ); 1−2. Authentication methodを変える(これをしないと不具合があるようだ 01 July 2006) //$auth_method_type = 'contents'; // By Page contents $auth_method_type = 'pagename'; // By Page name 02 April 2006 2.$edit_auth を有効にする $edit_auth = 1; 3.Edit auth regex を設定する(正規表現!) $edit_auth_pages = array( '/^.*$/' => 'foo', ); これで、編集・新規ページ作成のときにBasic認証(のようなもの?)が行われる。
https://pukiwiki.osdn.jp/?PukiWiki/Install/アップグレード時の注意
https://pukiwiki.osdn.jp/?PukiWiki/Download/1.4.7
https://pukiwiki.osdn.jp/?PukiWiki/Install/Update/1.5.0
https://pukiwiki.osdn.jp/?PukiWiki/Install/Update/1.5.1
某センターの内部利用のウェブページにて、 テキストファイルを「ダウンロード」する必要がある。 必ずダウンロードしなければならないので、 右クリックさせるのはよくない設計。 ボタンをクリックしたらダイアログが開くのがよい。
テキストファイルは php が生成したものなので、php で作った。
が、しかし、その方法がわからず……
結論としては、
Content-Disposition: attachment; filename=fname.ext
だそうな。
[HOWTO] 既知の MIME タイプに対し [ファイルのダウンロード] ダイアログ ボックスを開く(マイクロソフトのページ)
で、実装は……、
<?php $myfile = $_GET['file']; $myid = $_GET['id']; $mydate = date('Y-m-d'); header('Content-Disposition: attachment; (← 実際はココで改行せず。) filename="'.$mydate.'-'.$myfile.'-'.$myid.'.txt"'); readfile($myfile.'.txt'); exit; ?> (↑これが全てです)
との php ファイルを form で呼び出す。
<form action="download.php?file=return&id=<?php echo $myid?>" method="post"> <input type="submit" value="ファイルをダウンロードする"> </form> (抜粋です)
ダウンロード用の php ファイルが呼び出されると、 サーバにあるテキストファイルを 「日付-名前-ID.txt」とのファイル名で ダウンロードするダイアログが開く。
という具合です。
formの側で、名前と id を post 渡ししているので、 ちょっとだけ使い回しができています。
他に参考にしたもの
ちょっとだけ、phpのコードがあります。ショウジョウバエ遺伝資源センターでは、ユーザがのストックリストを検索して、必要なショウジョウバエの系統をリクエストするページを提供しています。 php + postgreSQL で作っているので、そのときに覚えてしまった(!)ことをちょっとだけ。
ショウジョウバエ遺伝資源センターでは、ユーザがのストックリストを検索して、必要なショウジョウバエの系統をリクエストするページを提供しています。
検索し、そのなかから複数の系統を一時的に記憶し、最後に確認の後にリクエストする、ということを行います。お買い物サイトと同じです。
ストックリストは、リレーショナルデータベースの postgreSQL を使い、その操作とweb インタフェイスには、phpを使いました。ページが変わっても情報を保持しつづけるために、セッションを使っています。セッションを使えばクッキーを使わずにすむし、いろいろ複雑なことも出来て便利なようです(使いこなせていませんが)。慣れれば簡単なのでしょうけれども、セッションにはちょいと苦しめられました。ソースコードは下に。
Under construction (ちょっと待ってて)
そのほかのことも。
1. ブラウザの判定:<button> </button> が使えるブラウザを判定する。使えるのは、マイクロソフトインターネットエクスプローラとネットスケープ6。
$str = $HTTP_USER_AGENT; $dgrc_browser; if(eregi("MSIE", $str) || eregi("Netscape6", $str)) { $dgrc_browser="IENN6"; } else { $dgrc_browser="NN4"; }
html のちょっとしたこと(小技?)を
上のようにして、ストックを検索するページを作るときに、結果的に html のちょっとしたこと(小技?)を学んでしまいました(無用な知識?が増えてしまった……)。
1. 別なサイトから呼び出されたときに、フレームの中では開かないようにする。下のコードを <head> </head> の中に書いておけばよい。
<script language="JavaScript"> <!-- if(self != top){ top.location.href = self.location.href; } //--> </script>
2. 文字セットをISO 8859-1(=Latin1)にする。下のコードを <head> </head> の中に書いておけばよい。こうしておくと日本語は確実に読めません
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
3. ○秒後に別なページへ飛ぶ。下のコードを <head> </head> の中に書いておけばよい。
<meta http-equiv="Refresh" content="3; URL=移動先のURL">
この例では3秒後に移動する。
4. プロポーショナルフォントを使わないようにする。 <tt> と </tt> で囲む。
<tt>non proportional</tt> ← プロポーショナルフォントにならない。 proportional ← プロポーショナルフォントになる(tとiとoの文字の間隔に注目!)。
プロポーショナルフォントを使わないようにブラウザを設定しているときは、プロポーショナルフォントを使うようにはなりません。
下のようなhtmlファイル(ファイル名:P001.html:具体的にはエクセルから吐き出されたもの)を加工する
<html> | head.htmlと差し替え |
<head> | |
…… | |
<…… shift_jis ……> | |
…… | 残す(upper.html) |
</head> | |
<body> | P001title.htmlと差し替え |
…… | 残す(lower.html) |
</body> | tail.htmlと差し替え |
</html> |
#!sh grep -A 10000 "shift_jis" P001.html >temp01.html; grep -v "shift_jis" temp01.html >temp1.html; grep -B 10000 "<body" temp1.html > temp0.html; grep -v "<body" temp0.html> upper.html; grep -A 10000 "<body" temp1.html > temp2.html; grep -v "<body" temp2.html > temp22.html; grep -v "</body" temp22.html > temp23.html; grep -v "</html" temp23.html > lower.html; cat head.html upper.html P001title.html lower.html tail.html > temp3.html; sed -e s/"str border=0"/"str border=1"/g temp3.html> temp4.html; nkf --utf8 -Lu temp4.html > P001.html
grep -A num 文字列: 文字列とその下num行を表示 grep -v 文字列: 文字列を含まない行のみ表示 grep -B num 文字列: 文字列とその上num行を表示
※ shell scriptを使う場合、パイプが働かないので注意
ファイル名がPではじまるものに、拡張子「.txt」を追加
#!sh for num in P*; do mv $num ${num}.txt; done
スーパーユーザ権限を使って、マシンの全ディスク内にある struts という名前を含むファイルをリストアップする
$ sudo find / -name "*struts*" $ sudo find / -iname "*struts*" ← 大文字小文字を区別しない
こんな感じのリスト(下)をリンク付きのリストのhtmlファイルにする
in.txt
http://www.kit.ac.jp/ http://www.yahoo.co.jp/ http://www.google.co.jp/
makelink.pl
#!perl print "<html>\n"; print "<body>\n"; print "<ul>\n"; while(<>){ chop; print "<li><a href=\"$_\" target=\"_blank\">$_</a>\n"; } print "</ul>\n"; print "</html>\n"; print "</body>\n";
使い方
perl makelink.pl <in.txt >out.txt
メールに貼り付けて Thunderbird ででも受け取ればできちゃうのですけど、Pukiwikiに貼ってもできますけど……。
タブ区切りテキストの「2列目」と「5列目」を抜き出す
first2and5.pl
#!perl while(<>){ chop; split /[\t]/; print "@_[1]\t@_[4]\n"; }
使い方
perl first2and5.pl <in.txt >out.txt
これで26めがのファイルから必要な部分が取り出せて、1めがになった。えくせる使うと簡単なようだけど、文字化けとか、ヘンなところにヘンな文字が入るとか、セーブするとヘンになっちゃうとか、エラーが起こるので、テキストのまま処理するほうが確実だったりする。
Today:3 | Yesterday:0 | Total:153930 since 02 April 2006 |