ショウジョウバエ研究会オンライン登録プログラム

ショウジョウバエ研究会第7回研究集会で使ったオンライン登録のための PHPスクリプト 松尾隆嗣さん(東京都立大学)の力を借り、都丸雅敏(京都工芸繊維大学)とふたりで作成した2005年のショウジョウバエ研究会のオンライン登録のための PHP スクリプトです。
著作権は松尾と都丸にあります。GNU General Public License version 2 (gpl.txt)または、その上位バージョンの下で配布は自由です。

PukiWiki

レスポンシブデザインに対応する 23 January 2019

基本的な部分は PukiwikiレスポンシブSkin に従った。
加えて、twitter bootstrap にも対応させた。 が、pukiwiki の skin をあまり触らないと bootstrap らしさは何もない。
触ったのは skin と css

メニューをハンバーガー(≡)にするのは難易度が高くてできなかった……。

skin

天下の 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 ?>

css

幅によって表示が変わるように最後に追加

<?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 ?>

自動生成される目次からのアンカーの位置を変更する 13 February 2018

#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 の綴りミスのような気がしないでもないけど、 元々こうなので。

なお、このページは変更はしていませんが、 別なページで実装し、 動作確認済み。

MathJax が使えるようにする 20 February 2015

参考 MathJaxの使い方 by くろきげん

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" />

特定のIP addressからしか閲覧できないページを設定する 08 June 2013

某センターのサービスページで学内専用が必要と思い立った。
某お役所が簡単に見たり、()してや、 グーグルさんに提示されたりしたらあまりハッピーじゃない、 という秘密っぽいことが書けるようにしたいのです。

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

メニューバー内で単語が途中で改行されないようにする 05 June 2013

skin/pukiwiki.css.php の div#menubar(CSSの設定)の word-break の値を break-all から normal に変える

div#menubar{
……略……
 word-break:normal;
……略……
}

参考:generate_tagsプラグインによるタグを用いたページ分類

PukiWikiで上付き文字下付き文字 02 August 2009

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に自動的なリンクを生成させないようにする 22 September 2007

WikiNameのように大文字が2つ入った単語を、pukiwikiのデフォルトでは、 WikiNameと認識して、リンクを作るようになっています。 そういう名前のページがないと、?がついて、クリックするとページを作るように なります。

ふだん、本文中で新しいWikiNameのページを作るような書き方はしないので、 この機能を停止させることにしました。 その結果、「McAfee」、「VirusScan」、「WinEyes」、「OneLook」などに?が付かなくなり、見やすくなりました

pukiwiki.ini.php

/////////////////////////////////////////////////
// _Disable_ WikiName auto-linking
$nowikiname = 1; // 22 September 2007 // 0; -> 1;

pukiwikiで、静的ページhtmlに偽装する 22 September 2007

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 の https でも偽装する 26 April 2018

virtual host の ssl のディレクティブ に(vhost-ssl.conf など)

AllowOverride All

などを入れておく。 All の代わりに FileInfo でもいいらしいのですが試していません。
ssl で override できるよう明示的に指示が必要。 80(s 抜き)で AllowOverride を書いておいても、s付きでは効果なし。
気付くのに何年も掛かってしまった……。

PukiWikiで閲覧は誰でも可、編集・新規ページ作成は登録ユーザのみとするための設定

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認証(のようなもの?)が行われる。

pukiwiki のバージョンアップ 18 April 2018

https://pukiwiki.osdn.jp/?PukiWiki/Install/アップグレード時の注意

1.4.6 → 1.4.7

https://pukiwiki.osdn.jp/?PukiWiki/Download/1.4.7

1.4.7 → 1.5.0

https://pukiwiki.osdn.jp/?PukiWiki/Install/Update/1.5.0

1.5.0 → 1.5.1

https://pukiwiki.osdn.jp/?PukiWiki/Install/Update/1.5.1

php: hypertext processor その2

ファイルの「ダウンロードダイアログ」が常に開くようにする 05June2013

某センターの内部利用のウェブページにて、 テキストファイルを「ダウンロード」する必要がある。 必ずダウンロードしなければならないので、 右クリックさせるのはよくない設計。 ボタンをクリックしたらダイアログが開くのがよい。

テキストファイルは 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: hypertext processor

ちょっとだけ、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 tips

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の文字の間隔に注目!)。

プロポーショナルフォントを使わないようにブラウザを設定しているときは、プロポーショナルフォントを使うようにはなりません。

shell script

htmlファイルを加工する 4th April 2008

下のような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

※ shell scriptを使う場合、パイプが働かないので注意

拡張子追加 4th April 2008

ファイル名がPではじまるものに、拡張子「.txt」を追加

#!sh
for num in P*; 
 do 
  mv $num ${num}.txt;
 done

そのほか

ファイルを検索する 29th April 2016

スーパーユーザ権限を使って、マシンの全ディスク内にある struts という名前を含むファイルをリストアップする

$ sudo find / -name "*struts*"
$ sudo find / -iname "*struts*" ← 大文字小文字を区別しない

perl

URIのリストから、それへのリンク付きのリストのhtmlファイルを作る 15 Jan 2009

こんな感じのリスト(下)をリンク付きのリストの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に貼ってもできますけど……。

タブ区切りテキストからカラムを抜き出す 16th March 2009

タブ区切りテキストの「2列目」と「5列目」を抜き出す

first2and5.pl

#!perl
while(<>){
    chop;
    split /[\t]/;
    print "@_[1]\t@_[4]\n";
}

使い方

perl first2and5.pl <in.txt >out.txt 

これで26めがのファイルから必要な部分が取り出せて、1めがになった。えくせる使うと簡単なようだけど、文字化けとか、ヘンなところにヘンな文字が入るとか、セーブするとヘンになっちゃうとか、エラーが起こるので、テキストのまま処理するほうが確実だったりする。

Today:1Yesterday:0Total:151313 since 02 April 2006

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 17 Feb 2019 (日) 17:00:33 (340d)