投稿者: koji

  • 嘘をつく理由の3つの次元(ヴレイ)

    まえがき

    『私たちは日々の生活で少なからずウソをつきます。当然、わざわざウソをつくには理由があります。(略)ヴレイは、ウソをつく理由を3つの次元で分類します。』

    リスト

    あとがき

    まえがきをふくめて、阿部 修士『あなたはこうしてウソをつく』(岩波書店、2021年)より。

    人が嘘をつく4つの理由」には引用元がありませんでしたが、こちらはアルダート・ヴレイ (Aldert Vrij – Wikipedia) による分類とのこと。著者が挙げている引用文献の一つを参考文献 (1) に置いておきます。

    かなりフレームワークっぽいですね。どことなくヒト・カネ・モノ(ココロ)を想起させます。

    この本からの他のリスト

    参考文献

    (1) アルダート・ヴレイ 『嘘と欺瞞の心理学: 対人関係から犯罪捜査まで 虚偽検出に関する真実』 (福村出版、2016年)

  • 創造性を開発する4つのツール

    まえがき

    『本書での創造性開発プログラム(略)の特徴は、読者を導き、鼓舞するために、キャメロン自身があみ出した簡単なツールを使う点にある。』

    リスト

    あとがき

    まえがきを含めて、ジュリア・キャメロン、エマ・ライブリー 『いくつになっても、「ずっとやりたかったこと」をやりなさい。』(サンマーク出版、2020年)より。まえがきは「訳者あとがき」からの引用です。

    ちょうど起業した年に『ずっとやりたかったことを、やりなさい。』を読んだ覚えがあります。それから20年弱経って、この本が出ているのを知りました。

    • WordPress: 複数の投稿に対してブロックを一括編集

      概要

      複数の投稿の内容を一括で置換する際、ブロックを使ってみた。

      背景

      千本を超える投稿の数百に対して編集をかける際、これまでは正規表現でコンテンツ (post_contents) を検索・置換 (preg_match_all) していましたが、ブロック単位で実施するやり方を試してみました。

      内容

      例として、複数の投稿に存在している次に示すような段落ブロック

      (参考文献)
      (1) ~

      を、次に示す見出しブロックと段落ブロックに変えました。(参考文献)だけでなく〈参考文献〉としている箇所もあるのでまとめて。

      参考文献

      (1) ~

      これはHTMLレベルでいえば、次の段落ブロック

      <!-- wp:paragraph {"className":"lf_postscript"} -->
      <p class="lf_postscript">(参考文献)<br>(1) ~</p>
      <!-- /wp:paragraph -->

      を次のように変えることです。

      <!-- wp:heading {"level":4,"className":"lf_refernces"} -->
      <h4 class="lf_refernces">参考文献</h4>
      <!-- /wp:heading -->
      
      <!-- wp:paragraph {"className":"lf_postscript"} -->
      <p class="lf_postscript">(1) ~</p>
      <!-- /wp:paragraph -->

      だいたい次のようなコードでいけました(クエリのパラメーターやエラー処理は省略して引用)。

      $q = new WP_Query( array(
        'post_type'      => 'post',
        'post_status'    => 'publish',
        's'              => '参考文献',
        'posts_per_page' => -1,
      ) );
      
      $block_h4 = array(
        array(
          'blockName'    => 'core/heading',
          'attrs' => array(
            'level'     => 4,
            'className' => 'lf_refernces',
          ),
          'innerBlocks'  => array(),
          'innerHTML'    => '',
          'innerContent' => array(
            PHP_EOL.'<h4 class="lf_refernces">参考文献</h4>'.PHP_EOL
          ),
        ),
        array(
          'blockName'    => null,
          'attrs'        => array(),
          'innerBlocks'  => array(),
          'innerHTML'    => '',
          'innerContent' => array( PHP_EOL.PHP_EOL ),
        ),
      );
      
      $pattern = '#((|〈)参考文献()|〉)\<br\>(.+)#';
      
      foreach ( $q->posts as $p ) {
        $blocks = parse_blocks( $p->post_content );
      
        for ( $i = 0; $i < count( $blocks ); $i++ ) {
      
          if ( 'core/paragraph' == $blocks[$i]['blockName'] ) {
            if ( 1 == preg_match( $pattern, $blocks[$i]['innerContent'][0], $matches ) ) {
              $blocks[$i]['attrs']['className'] = 'lf_postscript'; 
              $blocks[$i]['innerContent'][0] = PHP_EOL.'<p class="lf_postscript">'.$matches[3].PHP_EOL;
              array_splice( $blocks, $i, 0, $block_h4 );
              $content = serialize_blocks( $blocks );
              $mypost  = array(
                'ID'           => $p->ID,
                'post_content' => $content,
              );
              wp_update_post( $mypost );
              break;
            }
          }
        }
      }

      L1-6: 編集対象となる投稿をざっくり抜き出します。

      L8-28: 挿入するブロック。ブロックを post_content に格納するために HTML に変換する serialize_block() を見ると、blockName, attrs, innerContent しか使っていないので他の要素は要らないのですが、一応。

      L12: level は文字 ‘4’ でなく 数字 4 でなければなりません(ブロックエディターで読み込むとエラーが出ます)。

      L18: ブロック要素の前後に改行を入れておきます(標準でそのようになっているため)。

      L21-27: なぜか標準ではブロック間に空ブロックが挟まっているので踏襲しました。

      L22: blockName は ‘’ でなく null でなければなりません。空ブロックかどうかを、serialize_block() で is_null() で判定しているため。

      L30: 置換対象となる文字列。(参考文献)と〈参考文献〉を同時に置換するため、結局正規表現を使いました。

      L32-52: 候補の投稿を順次処理していきます。

      L33: 投稿をブロック化します。

      L35-51: ブロックを順次処理していきます。ブロック自体を書き換えるので foreach() でなく for() を選択。

      L37: 段落ブロックなら……

      L38: 段落が、L30 で指定したパターンだったら……

      L39-40: その段落を書き換えます。

      L41: その段落ブロックの直前に、L8-28 で用意した見出しブロックを挿入します。

      L42: ブロックを HTML 化します。

      L43-47: その HTML で投稿を更新します。

      L48: 次の候補投稿へ。

      従来やっていた、投稿コンテンツ全体を正規表現検索・置換するよりはミスが少なそうな気がします。手間はあまり変わらないかな。

    • 新規投稿時にデフォルトのカテゴリやブロックパターンを設定する

      概要

      リストを投稿するべく投稿画面を開いたときに、あらかじめカテゴリが選ばれ、テンプレートが設定され、ブロックパターンが流し込まれた状態にする。

      背景

      当サイトではリスト用の投稿タイプを用意していないため、リストを投稿しようと思って投稿画面を開いたとき、いつもカテゴリを list にセットし、リスト投稿用のブロックパターンを選択しています。これが面倒なので自動化を試みました。

      内容

      add_filter( 'default_content', 'lf_default_content', 10, 2 );
      function lf_default_content( $post_content, $post ) {
      	$is_newlist = $_GET['newlist'] ?? '';
      	if ( $is_newlist ) {
      		// カテゴリを list に設定する
      		$list_catid = get_category_by_slug( 'list' )->term_id;
      		wp_set_post_categories( $post->ID, $list_catid, true );
      
      		// リスト用テンプレートを設定する
      		update_post_meta( $post->ID, '_wp_page_template', 'templates/template-cover.php' );
      
      		// リスト投稿のブロックパターンを読み込む
      		$bpr = WP_Block_Patterns_Registry::get_instance();
      		$bp  = $bpr->get_registered( 'kh/new-list' );
      		$post_content = $bp['content'];
      	}
      	return $post_content;
      }

      L1: ‘default_content’ は編集画面が開く直前に実行されるフックで、本文に予めコンテンツを流し込んでおくことができます。ちなみにタイトルと抜粋についても類似のフィルターフックが用意されています。

      L3: 当サイトではリスト用の投稿タイプを作ったりしていないので、「リストを投稿するべく」編集画面を開いたかどうかを別の方法で検知する必要があります。そこで新規投稿を作成するURLに &newlist=yes のようなパラメータを付与しました。そのリンクからのアクセスであれば、リスト投稿の意思ありとみなします。

      L7: 投稿オブジェクトが作られた直後なので第3引数 ($append) はデフォルトの false でよいのですが、将来この処理の手前に何かの処理を挟む可能性もあるので、念のため true に。

    • 〈臨床の知〉の構成原理

      まえがき

      『〈臨床の知〉は、科学の知の三つの構成原理を先のように端的に、(1)普遍主義、(2)論理主義、(3)客観主義と呼ぶとき、そのそれぞれに対して、(1)コスモロジー、(2)シンボリズム、(3)パフォーマンスとわたしが呼ぶものを構成原理としている。』

      リスト

      あとがき

      まえがきを含めて、中村 雄二郎 『臨床の知とは何か』((岩波書店、1992年)より。

      科学の知(「近代科学の性質」を参照)と臨床の知は次のように対比されています。

      科学の知は、抽象的な普遍性によって、分析的に因果律に従う現実にかかわり、それを操作的に対象化するが、それに対して、臨床の知は、個々の場合や場所を重視して深層の現実にかかわり、世界や他者がわれわれに示す隠された意味を相互行為のうちに読み取り、捉える働きをする

      • タイトル臨床の知とは何か
      • 著者: 中村 雄二郎(著)
      • 出版社: 岩波書店
      • 出版日: 1992-01-21

      この本からの他のリスト

    • 近代科学の性質

      まえがき

      『近代科学がこれほどまでに人々に信頼され、説得力をもったのは、なにゆえであろうか。古今の数ある理論や学問のなかで特別の位置を占めたのは、なにゆえであろうか。それは、(略)自分の説を論証して他人を説得するのにきわめて好都合な三つの性質をあわせて手に入れ、保持してきたからにほかならない。』

      リスト

      あとがき

      まえがきを含めて、中村 雄二郎 『臨床の知とは何か』(岩波書店、1992年)序文より。

      普遍的で論理的で客観的。けっこうじゃないかと感じますが、著者はここから次のような魅力的な問いを立てて「臨床の知」を論じていきます。

      このような原理をそなえた理論によって具体的な現実は捉えられているだろうか。否であろう。むしろ、近代科学によって捉えられた現実とは、基本的には機械論的、力学的に選び取られ、整えられたものにすぎないのではなかろうか。

      • タイトル臨床の知とは何か
      • 著者: 中村 雄二郎(著)
      • 出版社: 岩波書店
      • 出版日: 1992-01-21

      この本からの他のリスト

    • 特定のブロックをキャッシュする

      概要

      フロントページに置いている、データベースクエリをたくさん発行するブロックをキャッシュする。

      背景

      フロントページに、新しい公開リストのタイトルと抜粋を6つ表示しています。これは WordPress 標準の「最新の投稿」ブロックを使っています。

      新しい公開リストを投稿したときにのみ更新されればよい情報なので、キャッシュしてみようと思います。

      内容

      キャッシュには Transient API を使用

      WordPress が標準で提供している永続的なキャッシュシステムである Transient API を使います。

      キャッシュからの取得

      add_filter( 'pre_render_block', 'lf_pre_render_block', 10, 2 );
      function lf_pre_render_block( $pre_render, $parsed_block ) {
      
          $post    = get_post();
          $post_id = $post->ID ?? 0;
      
          if ( $post_id == get_option( 'page_on_front')
              && 'core/latest-posts' == $parsed_block['blockName'] ) {
      
              $slug = &$parsed_block['attrs']['categories'][0]['slug'] ?? '';
              $transient = '';
      
              // 今日のリスト
              if ( 'lotd' == $slug ) {
                  if ( $transient = get_transient( 'LF_BLOCK_LATESTPOSTS_LOTD' ) ) {
                      $pre_render = $transient;
                  }
      
              // 新着リスト
              } elseif ( 'list' == $slug ) {
                  if ( $transient = get_transient( 'LF_BLOCK_LATESTPOSTS_LIST' ) ) {
                      $pre_render = $transient;
                  }
              }
      
              // キャッシュから取得できなかったら
              if ( ! $transient ) {
      
                  // ブロックをキャッシュする
                  add_filter( 'render_block_core/latest-posts', 'lf_render_block_latest_posts', 10, 2 );
              }
          }
      
          return $pre_render;
      }
      
      • L1: ‘pre_render_block’ フックは、フックした関数が返す文字列をそのまま出力します。
      • L4-5: 表示しようとしている投稿を知るための処理。L5 は 404 ページなど $post が作成されないケースへの対応。
      • L7: フロントページかつ「最新の投稿」ブロックの場合のみキャッシュからの取得を試みます。
      • L10: 読みやすさのためと、もしキーが存在していなくてもエラーにならないようにするための処理。
      • L30: キャッシュから取得できなければ、ブロック書き出し後に発火するフィルターフック “render_block_{$this->name}” にコールバック関数を追加します。’render_block_core/latest-posts’ とすれば「最新の投稿」ブロックををレンダリングした直後にのみ起動します。

      キャッシュへの保存

      ブロックに表示するデータが作られた直後に実行されるフィルターフックに、次のような処理を挟みました。

      function lf_render_block_latest_posts( $block_content, $parsed_block ) {
      
          // For readability and safety
          $slug = &$parsed_block['attrs']['categories'][0]['slug'] ?? '';
      
          // 今日のリスト
          if ( 'lotd' == $slug ) {
              set_transient( 'LF_BLOCK_LATESTPOSTS_LOTD', $block_content, WEEK_IN_SECONDS );
      
          // 新着リスト
          } elseif ( 'list' == $slug ) {
              set_transient( 'LF_BLOCK_LATESTPOSTS_LIST', $block_content, WEEK_IN_SECONDS );
          }
      
          return $block_content;
      }
      • L7,11: フロントページでは「今日のリスト」カテゴリの投稿についても「最新の投稿」ブロックを使っているので、両者を識別しないといけません。そこでパースされたブロック情報を調べて、カテゴリスラッグで識別することにしました。
      • L8,12: 第三引数を外せば transient の寿命が無限になるうえにautoload(メモリ上に保存)されます。しかし autoload するような内容でもないので、公開リストの投稿間隔の見積もり以上に長い期間を見込んで寿命を設定しておきました。

      キャッシュの更新(削除)

      「今日のリスト」を入れ替える、リスト投稿が公開されるなど、ブロックの内容を書き換えるべきイベントによって発火するフィルターフックに、Transient の削除処理を登録します。以下は新着リストブロックを書き換える例。

      add_action( 'transition_post_status', 'lf_post_status', 20, 3 );
      
      function lf_post_status( $new_status, $old_status, $post ) {

      // (投稿タイプ、カテゴリ、投稿ステータスなどで絞り込む)
      delete_transient( 'LF_BLOCK_LATESTPOSTS_LIST' );
      }

      この方法を用いれば、どんなにデータベースクエリの多いブロックでも、2回のクエリ( transient とその寿命情報)で済むようになります。

      複数ブロック、あるいは the_content() の出力をまとめてキャッシュできないか?

      簡単な方法が見つかりませんでした。the_content() は次のようにしてブロックを表示しています。

      • テンプレートファイル
        • the_content(): テンプレートファイル中で呼び出している本文表示関数
          • ‘the_content’: 上記関数内のフィルターフック
            • do_blocks(): /wp-includes/default-filters.php で上記にフックされている関数
              • render_block(): 上記関数内で呼ばれている関数

      do_blocks() 内の冒頭&最後にフィルターフックがあればブロックエディタの出力をまるごとキャッシュできそうですが、存在せず。

      the_contents() も同様です。この関数はすべての処理を ‘the_content’ フックに登録したフィルターを使って実施しています。デフォルトのフィルターは default-filters.php にあります。

      すべてのフィルターの前に、つまり最高の優先順位でキャッシュ取得フィルターをフックしておき、もしキャッシュが取得できたら以降のフックを解除してしまう、といった操作を行えばできそうですが、そこまでするのは面倒なので断念。

    • 五蓋 – 道を成就する(目的を達成する)うえでの五つの妨げ

      まえがき

      『道の者よ、迷いに満ちたおのれの心の状態に気づくがよい。そこには〝五つの妨げ〟がある。(略)気づくがよい。このような心の状態では、物事をよく理解することも、正しく考えることもできない。ゆえに苦しみの連鎖は、いつまでも続くであろうと。』

      リスト

      あとがき

      まえがきを含めて、草薙龍瞬 『反応しない練習: あらゆる悩みが消えていくブッダの超・合理的な「考え方」』(KADOKAWA/中経出版、2015年)より。

      まえがきは、『若き修行者への訓誡 マッジマ・ニカーヤ』からの引用とあります。リストは本文からの編集・引用。ただし(貪欲)などの語は 五蓋 – Wikipedia からの引用です。タイトルの「五蓋」もこちらで付けました。

      人生は〝正しい努力〟から〝五つの妨げ〟を引いた「残り」です。

      はじめの2項目は三毒(貪瞋痴)の貪と瞋と重なっているようにみえますが、パーリ語を見ると違う言葉になっているので、カバーしている範囲が違う模様。

      • 「ゼロで死ぬ」ための3つのポイント

        まえがき

        『少しでもあなたの背中を押すために、大胆に行動するための3つのポイントだけ伝えておこう。』

        リスト

        あとがき

        まえがきを含めて、ビル・パーキンス 『DIE WITH ZERO: 人生が豊かになりすぎる究極のルール』 (ダイヤモンド社、2020年)より。

        本書には「ゼロで死ぬ」、つまり経験による思い出を最大化する人生を送るためのルールが9つ提案されていますが、リストは最終章「大胆にリスクを取る」を編集しつつ引用して作成しました。

        • ORID – 内省(的対話)のフレームワーク

          まえがき

          『「ORID法は、主にディスカッションのガイドとして用いられ、20~50人といった多くの人が話し合うときに便利です。それぞれのエネルギーが発散してバラバラにならないよう、焦点を合わせたい時に使います」』

          リスト

          あとがき

          まえがきを含めて、近藤 弥生子 『オードリー・タンの思考: IQよりも大切なこと』(ブックマン社、2021年)より。

          第4項目は Decision でしたが品詞が揃っていたほうがすっきりするので Decisional としたうえで引用しています。検索してみると、揺れはありますが Decisional のほうが多いかな。

          また「内省のフレームワーク」という見出しの下で紹介されていましたが、前書きに書かれているようなディスカッションのプロセスとして用いられていることをふまえて、タイトルに「(的対話)」を追加しました。

          構造としては経験学習そのもので、ほぼ 経験 → 内省 → 概念化 → 実験 をなぞっています。