当サイトのDrupalが10になりました

By mattz, 2023/11/08

7から9よりは楽だったと思うけど、それはそれとして一回ぶっ壊れて(ぶっ壊して)泣きそうだった。

phpが8.0系だったのを8.1系に上げなきゃいかんということで上げた。
それによって他のサイトが動かなくなった。
他のサイトはcomposer updateで大体なんとかなったけど。
Drupal自体のアップグレードは、公式の手順通りにやったつもりだけど、7から上げた9だったせいかうまく行かず、元に戻すこともできなくなり、仕方なく別ディレクトリに新規に9をセットアップして、DBの向き先だけ変えたらなんとか読み込めるようになったので、そっからもう一回公式の手順でアップグレードしたらなんとかなった。

だからバックアップしろって。

タグ

Drupalのrobots.txtが大層話題なので一言

By mattz, 2013/05/28

Drupalユーザのひとりとして最初に言っておきたいのですが、Drupalデフォルトのrobots.txtにはまったくなんの問題もありません。

今とても話題になっている例のrobots.txtにも。

まぁ、別のところに問題はあって、脆弱性あるからさっさとアップデートしろや、と言われているバージョンである、6.26を使っていることがばれてしまうCHANGELOG.txtが放置されていることはちょっとまずいです。

DisallowされているURIにアクセスしてみればいいです。このサイトもDrupalだけど、ほとんどのURIはアクセス可能です。*.txtは色々経緯があって置いてないけれど。

まぁ、install.phpとかupdate.phpとかは常に置いておく必要のあるファイルではないけれど、置いといてそこにアクセスされたところでメッセージ表示されるだけであって別に実害はないし。僕のこのサイトも置きっぱなしです。アクセスしたけりゃどうぞ。

※update.phpはあるファイルのある変数をちょっと書き換えると、未ログインでもいくつかできちゃうことがあります。管理者パスワードがわからないとかいう状況にならないと、そんな書き換えをしなきゃいけない状況にはならないですけど。

/admin?何がまずいの?ブルートフォースアタックが可能?ってそれid/passでログインさせる全てのサイトはそうですよね?ちなみに、Drupalにはデフォルトの管理者ユーザというのはありません。最初のセットアップの時に管理者が任意で設定します。drushでインストールすると、デフォルトのadminユーザになっちゃうけど、あとから変更も可能ですし。

Drupalにはある思想があります。めちゃめちゃ乱暴に意訳すると、「拡張するならモジュールとテーマでやれ。アップデートできなくなるからコアには触るな」てな感じ。まぁ、ホワイトハウスで使われているDrupalなんかは相当コアに手を入れている感はありますけど、こういう特殊な例はおいとくとして、robots.txtに書かれているディレクトリ群は、全部コアに関わる部分なので基本的には触っちゃいけないし、Drupalで構築したサイトならば当然存在します。当然そこにあるものなので、そこにアクセスされて問題になるようには作られていないです。もちろん、まだ見つかってない問題がある可能性はありますが。

robots.txtは、ただ単にrobotはクロールしてくれるな、ということを書いてあるだけであって、別に隠そうとしているわけでもなんでもないので、アクセスしたけりゃすればいいんじゃないですか?大体、適当なページのソース表示したりすれば、Disallowされているフォルダのほとんどがそこに存在することは分かる訳ですし、そんなもん隠すわけないじゃないですか。

drupal.orgのrobots.txtもsitemap以外は同じですから、どうぞみなさんそこにもツッコんであげてください。

PostgreSQL 9でDrupal 6が動かない件

By mattz, 2012/10/19

新しくDrupalのサイトを構築するにあたって、あまり深く考えずにPostgreSQLの9を選んでしまった(なんでMySQLじゃないのかとかいうのには諸般の事情とお答えしておきます)のですが、動かない。

最初はさっぱり原因が分からなくて途方に暮れていたのですが、調べていくうちに大体原因がつかめた。

Drupalは色々なキャッシュデータをserializeしてbytea型のカラムに格納して保持しています。PostgreSQLの8までは、bytea型のカラムに値を格納するときはエスケープクォートして格納という形だったのが、9からはhexに変換して格納するという形にデフォルトの形式が変わりました。

これによって、chacheテーブルから取り出した値をunserializeできないというエラーになっていました。

bytea型に格納する形式を、旧来と同様な'escape'形式に変更するというのもできないことはない(ALTER DATABASE database_name SET bytea_output = 'escape')ようなのですが、他にもこのようなハマリポイントがあると厄介ですし、そのたびに検証して対策するという時間も取れそうにないので、結局のところPostgreSQLのバージョンを(実績のある)8系にすることにしました。

ちなみにDrupal 7では、この問題には対応済みのようです。

タグ

色々やりました

By mattz, 2012/09/28

Drupalのテーマを変更しようかなと思って、よさそうなテーマを有効にしてみたところ、なぜか500 Errrorが出るようになりました。
sqliteなんだし、cpコマンド一つでDBのバックアップできるんだからしておけばよかったんですが、それを怠ったために簡単に復旧できず、というか、簡単に、どころか、関連してそうなテーブルを色々とUpdateしてみたりはしたのですが、復旧すること叶わず。いい機会なので、さくらインターネットの共有MySQL以上にパフォーマンスの悪いsqliteでの運用は諦めて、MySQLで復旧させることにしました。

この辺のことを思い出して、エントリ(node)関連とコメント関連のレコードは全部insertしたつもりだったのですが、なぜか本文が表示されないもので、結局本文は全部手作業で入れ直し。

んでもって、さらにいい機会なのでもう少しブログらしくカスタマイズしてみようといくつかモジュールとかブロックを追加してみました。

追加したモジュール

Related Links

個別エントリの下部に「関連しそうなエントリ」を表示するのに便利なモジュール。

関連しそうなエントリを表示できるようなるまでにやったこと。

  1. Releted Linksの設定(admin/config/search/relatedlinks)で、LINK TYPEがDiscovered linksのものだけ有効化。
  2. 同じくコンテンツタイプはブログエントリーのみチェック。
  3. ブロックの管理(admin/structure/block)で、「Related links: Discovered links」をコンテンツの下に表示するように設定。
    1. コンテンツリージョンに表示したブロックはタイトルが表示されないっぽいので、「関連しそうなエントリ」っていう見出しを表示するだけのブロックを作って追加し、「Related links: Discovered links」の上に表示されるように設定。
  4. CSS Injectorで少し表示を調整。

Tagadelic

タグクラウドを表示するのに便利なモジュール。まぁ実は前からインストールはしてあったんですが、使い方がよくわからなくて使えていなかったのを使えるようにしただけだったりします。
タグクラウドを表示できるようになるまでのステップ。

  • ブロックの管理(admin/structure/block)で、「Tags in Tags」ブロックをサイドバーに表示するように設定。
    1. Tagadelicモジュール(と、Tagadelicに必要なモジュール)を有効化。
    2. tagadelicの設定(admin/config/content/tagadelic)を確認。確か並び順だけ変更。
    3. コンテンツタイプの設定(admin/structure/types)で、ブログエントリーの表示の管理で、フィールドタイプが「ターム参照」、ウィジェットが「タームの自動補完ウィジェット(タグ付け)」なフィールドを追加。
    4. ブロックの管理(admin/structure/block)で、「Tags in Tags」ブロックをサイドバーに表示するように設定。

    追加した自作ブロック

    関連するエントリという見出しを表示するだけのブロック

    (前述)

    前のエントリ、次のエントリへのリンクを表示するためのブロック

    モジュールを探してみたんですが、探し方が悪いのかいいのが見つからなかったので、新規のブロックでフォーマットがPHP Codeなブロックを追加。

    codeの中身はこんな感じ。

    <?php
    $node = node_load(arg(1));
    if ($node->type=='blog') {
    $q = "select a.nid, a.title ,b.alias from {node} a "
       . "left join {url_alias} b on concat('node/',a.nid) = b.source where a.type = 'blog' and a.created < "
       . $node->created." order by a.created DESC limit 0, 1";
    $res = db_query($q);
    if (count($res) ==1) {
      foreach($res as $row) {
        if ($row->alias) {
          $links[] = sprintf(
            '<li class="prev"><a href="/%s">< 一つ前のエントリ<br />%s</a></li>',
            $row->alias, check_plain($row->title)
          );
        } else {
          $links[] = sprintf(
            '<li class="prev"><a href="/node/%s">< 一つ前のエントリ<br />%s</a></li>',
            $row->nid, check_plain($row->title)
          );
        }
      }
    }
    $q = "select a.nid, a.title ,b.alias from {node} a "
       . "left join {url_alias} b on concat('node/',a.nid) = b.source where a.type = 'blog' and a.created > "
       . $node->created." order by a.created ASC limit 0, 1";
    $res = db_query($q);
    if (count($res) ==1) {
      foreach($res as $row) {
        if ($row->alias) {
          $links[] = sprintf(
            '<li class="next"><a href="/%s">一つ後のエントリ ><br />%s</a></li>',
            $row->alias, check_plain($row->title)
          );
        } else {
          $links[] = sprintf(
            '<li class="next"><a href="/node/%s">一つ後のエントリ ><br />%s</a></li>',
            $row->nid, check_plain($row->title)
          );
        }
      }
    }
    echo '<ul id="prev-next" class="clearfix">';
    echo join('', $links);
    echo '</ul>';
    }
    

    はてなブックマーク

    これも新規ブロックでフォーマットがPHP Codeなブロックを追加。

    <?php
    $node = node_load(arg(1));
    $base_url = 'http://mattz.xii.jp/';
    $q = sprintf("select alias from {url_alias} where source = 'node/%d'", $node->nid);
    $url = 'node/' . $node->nid;
    $res = db_query($q);
    if (count($res) > 0) {
      foreach($res as $row) {
        $url = $row->alias;
      }
    }
    echo "<a href='http://b.hatena.ne.jp/entry/$base_url$url'><img src='http://b.hatena.ne.jp/entry/image/$base_url$url' /></a>";
    ?>
    

    まだ少し手を入れたいところはあるけどとりあえずこんな感じで。

    タグ

    MySQLのDrupal 6からSQLiteのDrupal 7へ

    By mattz, 2011/04/25

    各nodeの移行をすべく色々試行錯誤した。ちなみに本文中の「{hogehoge}」ってやつはテーブル名を表していますが、そもそもこのエントリは基本自分用で、Drupalを全く知らない人は全く想定していません。

    まず、Drupal 6のnodeの中身は、基本的に{node}と、{node_revisions}に保存されている。ので、その中身をSelectして、それっぽいテーブルにつっこめばいいだろう、と思ったのだが、Drupal 7には{node}はあっても、{node_revisions}はない。{node_revision}ってのはあったが、本文を保存するカラムがな い。

    色々と探してみて、{field_data_body}のようだと思われたので、{node}、{node_revision}、{field_data_body}の各テーブルのそれぞれのカラムに、Drupal 6のDBからSelectした値を入れてみる。結果、nodeの中身は表示されない。

    もうちょっと探してみたら、{field_revision_body}というテーブルも見つけたのでそこにもそれらしい値を入れてみたが表示されない。

    ここまで来てやっとnodeモジュールのソースを見るという行為に着手。いやまぁ最初にやれって思わないわけではない。というのは置いといて、ソースをざっと見た限りでnode/addするときにupdateしたりinsertしたりするテーブルには他に{history}というのもあるらしいことが分かったので、そこにも値を入 れてみるが表示されない。

    もう値が必須なテーブルはないと思うんだけどなぁ、と思いながら、外部からリンクされていて今でも時々アクセスのあるnode(エントリ)から優先して、手作業で中身を移す。

    四百いくつかあるエントリの50くらいは手作業で移行しただろうか。そこでめんどくさくて飽きる。どうせめったに参照されることもないし、ほっといてもいんじゃね?という思いに作業を中断し3日ほど放置。

    まぁ、ちょっとずつでもやるかなぁと思い直し作業を再開しようと思ったら、なぜか過去のnodeも全て表示できているっぽい。

    ???

    もっとも、データ自体はちゃんとスクリプト書いて必要なテーブルに必要な値は入れたはずなので、元々表示されないほうが不思議だったのだが、何故何もしてないのに表示できるようになったのだろう。Drupalのキャッシュかなぁ?

    タグ

    Drupal 7に移行しました(途中だけど)

    By mattz, 2011/04/19

    暫定的ながら、ブログをDrupal 6からDrupal 7に移行しました。

    コンテンツ(エントリ)の移行は最近の一部のみなので、古いエントリのパーマリンクがかなり死んでたり、内部リンクが色々ダメになってはいますが、追々でやります。

    タグ

    D6to7

    By mattz, 2011/04/14

    このサイトのCMSをDrupal 6から新しいバージョンであるDrupal 7に移行しようと奮闘中です(というこのエントリは、構築中の7側にしか投稿しません)。

    ついでなので、いまいち重くて使いづらかったさくらの共用MySQLをやめ、Drupalが7から新たに対応するようになった、sqliteにしちゃおうかと思っています、というかしました。DBの種類が変わるということで、DrupalのUpgrade機能に頼れませんので、データの移行のほとんどが半分手作業です。でまぁ、どんなことをやったかという辺りの覚え書きです。

    sqliteに変えようと決めて、実際にその作業を今まさに行っているところではありますが、一応、MySQLのままのUpgradeにも挑戦してはいます。まぁ、うまくいかなくて諦めたんですけどね。あと、結構めんどくさい。

    DrupalのUpgradeは、簡単にまとめるとモジュールやテーマなどの設定をいったん初期状態に戻し、更新を適用し、モジュールやテーマの設定を元に戻す、ってのが正しい手順です。が、セキュリティフィックスとかの(小数点第2位)のマイナーバージョンアップであれば、初期状態の戻すの手順は、まぁ省略しても大体うまく行くもので、実際、最初にセットアップしたのが6.11で、その後の6での最新版6.20まで、9回の更新を一度も飛ばさずに行いましたが、初期状態に戻すって、真面目にやってたの最初の2回くらいです(もちろん、個人ブログだからできることであって、商用サイトではそうはいかないでしょうけど)。

    とはいえ6を7に、となるとさすがにそのやり方では無理なので、6で使ってるテーブルを、全て別名でコピーし、まずそちらに向けてDrupal6を構築し、そこでDrupalを7に更新、うまく行ったら、サーバ側の設定でそちらに向ける、なんてことを目論んで何度か試したのですが、全然うまくいきゃしねぇ。

    そんな訳で、sqliteでDrupal 7をさくらインターネットのスタンダードプランで構築する場合のメモです。

    大筋としては、「さくらインターネットサーバでDrupal 6.11を導入した」でやったことと同じですが、今回は./sites/default/settings.php ではなく、 /sites/[FQDN]/settings.phpに設定情報を書いています。この方があとで何かと便利なので。

    あとsqliteですが、DrupalのDB設定は

       $databases['default']['default'] = array(
         'driver' => 'sqlite',
         'database' => '/path/to/databasefilename',
       );
    

    こんな感じで記述する(もうちょっと細かく設定できるけどそこまでやるほどのものでもないので)のですが、databasefilenameは事前に作っておいたりする必要はありません。install.phpにアクセスした時点で勝手に作られます。ただし、次の画面に進む前に、databasefilenameに書き込み権限を付与しましょう。これが分からなくて何回もやり直しました。なおこのファイルは、念のため公開ディレクトリ(さくらなら~/www)の外に置きましょう。

    モジュールとかテーマとかは、7に対応しているものとそうでないものが結構バラバラです。うちの場合、tagadelicとかtrackbackモジュール(とか自作のモジュール)が未対応なので、タグクラウドとかトラックバックとかカレンダー表示とか個別エントリ表示時の前/次リンクあたりが、今のところありません。

    データ(各nodeの中身とか)の移行については多分別エントリで。

    なんにせよ、こんな作業、仕事だったらやってらんね。

    タグ

    Dripal 6.16リリース

    By mattz, 2010/03/04

    Drupalの6.16がリリースされたので、本ブログにも適用しました。

    抄訳

    >セキュリティ脆弱性の修正とその他のバグフィックスだけで、新機能はないよ。新しい機能の追加はもうすぐでる「7」に期待してね。

    >このリリースは、セキュリティ脆弱性の修正だから、さっさとアップグレードすることを推奨するよ。

    その他のバグフィックスから注目点

    > type='button'なformを復活させたよ!

    気になったのはこれくらいかな。あとはホントにバグ修正って感じでした。詳細知りたい人は原文にあたってください。

    タグ

    Drupalのテーマに求める理想と現実

    By mattz, 2009/11/25

    Drupalのテーマについてなんですが、なかなか気に入ったものが見つからない。

    僕が求めているのは、次のようなもの。

    • ゴテゴテしすぎない。
      • でかい画像は使用しない。
        • 特にヘッダ部分にでかい画像とかないでしょ。
        • 別にテーマを見せたい訳じゃないし。
      • リストマーカに画像とか不要だし、画像使った角丸も要らない。
    • できれば1カラム。
      • 2カラムでもいいんだけど、サイドバーにあたる部分はメインのコンテンツ(ブログだったらエントリ本文)より後ろに記述されて欲しい。
        • CSS切ったときに(あるいはCSSの無効な環境。例えばGoogleのモバイルゲートウェイ通したとき)ページの頭の方にサイドバーとかあっても邪魔だと思うから。
    • 幅固定。max-widthはあり。
    • 読みやすい(行間とか)/分かり易い(リンク要素とか)。
    • 配色が僕好みであること。

    使っているこまでのテーマは、上記に照らし合わせるとかなりダメ(幅固定、サイドバー要素がコンテンツより先に記述、大して 必要性のない背景画像やリストマーカ画像)なんですが、配色だけがお気に入りなんですね。

    でもそろそろ嫌になってきたので、テーマ捜索中。

    自作?やだ。めんどくさい。

    追記

    テーマ変えてみたけど、イマイチだなぁ。table使用ってのがねぇ。しばらくころころ変わると思います。

    なんかもう面倒なので素っ裸にしてやった。どうにでもなーれー。

    自分で作るとこうなるんだよ。ホントセンスないよね。

    タグ

    Page titlesモジュールをインストールした

    By mattz, 2009/11/11

    Drupalのデフォルトだと、ページのtitle要素は「エントリのタイトル | サイト名」になる。このエントリの個別ページなら「Page titlesモジュールをイ ンストールした | ま゚^3」だ。

    "|"で繋げるというのはあまり好きではないが、閲覧に甚だしい支障があるというものでもないので、放っておいたのだけど、特に何か探す目的があったわ けでもなく、DrupalスレまとめWiki - 目的別Drupalモジュールを眺めていたら、ページタイトルの" | "を変更したいというのを見つけたので早速インストールした。

    やったこと

    Page Titleモジュールのインストール。さくらインターネットサーバではwgetが使えるので、6.x用のDownloadリンクからURLをコピーして、sites/all/modules/ ディレクトリでwgetして、tar xvfzする。

    「管理セクション ≫ サイトの構築 ≫ モジュール」を開いてみたら、Tokenモジュールに依存している と言われたので(Page Titleモジュールのページにはちゃんとそう書いてある。単に僕がちゃんと読まなかっただけ)、同じようにTokenモジュールもインス トールして、改めてモジュール管理画面を開く。

    インストールしたTokenとPage Titlesの二つのモジュールは「その他」のところにあるので、有効にチェックしてSubmit。Tokenモジュールには、Token actionsとTokenSTARTERというサブモジュールが付属しているけど、とりあえず今回の目的(title要素をいじる)には不要なようなので、この二つは無効のまま 。

    Page Titlesを有効にすると、「ホーム ≫ 管理セクション ≫ コンテンツの管理」にPage Titles用の設定画面が追加されるので、それを開き、デフォルトのところを「[page-title] -[site-name]-」、ブログエントリのところを「[page-title]」に変更。これは僕の好みなので、お好みがある方はお好みのように変えてください。

    [hogehoge]ってのがトークンというやつらしく、ここに適切な値を設定してあげると、実際のページ生成の際にはそれらの値に応じた文字列に置き換えられるという仕組みらしい。使用可能なトークンは、Available Tokens Listてところをクリックするとみよ~んって表示されるので、それを参考にどうぞ。

    簡単簡単。

    タグ