投稿者: koji

  • 社会的費用便益分析の手順

    まえがき

    『1930年代から米国の規制ツールボックスの一部として、費用便益分析は(略)標準的な方法が確立されていて、明確に定められた手順に従うことになっている。』

    リスト

    あとがき

    まえがきを含めて、ハワード・スティーヴン・フリードマン 『命に〈価格〉をつけられるのか』 (慶應義塾大学出版会、2021年)より。引用元はアンソニー・E. ボードマン 『費用・便益分析: 公共プロジェクトの評価手法の理論と実践』とのこと。

    ステップは体系的ですが、規制の対象として誰を当事者にするか、どの指標を選択するか、その指標に関連付けられる費用と便益をどう見積もるか(そのなかで、本書のテーマである「命の価格」も見積もられます)など、仮定の置きどころがたくさんあり、それにによって分析の結果が大きく変わります。

    また影響が国境を超えるような事象に対しては一国家が課せる規制には限界があります。

    とはいえ、そういった仮定を明示できる点、分析のステップは透明なので第三者も検証できる点などはメリットで、実際にはさまざまな工夫を施して使われている様子が本書では描かれています。

    なお、タイトルの「社会的費用便益分析」という言葉は、政府の規制機関による費用便益分析という意味合い。企業が行うそれは「私的費用便益分析」です。

    • タイトル命に〈価格〉をつけられるのか
    • 著者: ハワード・スティーヴン・フリードマン、南沢 篤花(翻訳)
    • 出版社: 慶應義塾大学出版会
    • 出版日: 2021-04-17
      • タイトル費用・便益分析―公共プロジェクトの評価手法の理論と実践
      • 著者: ボードマン,アンソニー・E.(著)、ヴァイニング,アイダン・R.(著)、ワイマー,デヴィッド・L.(著)、グリーンバーグ,デヴィッド・H.(著)、Boadman,Anthony E.(原著)、Weimer,David L.(原著)、Vining,Aidan R.(原著)、Greenberg,David H.(原著)、光永, 岸本(翻訳)、亨, 出口(翻訳)、日出彦, 小滝(翻訳)、俊彦, 阿部(翻訳)
      • 出版社: ピアソンエデュケーション
      • 出版日: 2004-12-01
      • 5つの指数関数的テクノロジー

        まえがき

        『現時点でリーダーが無視してはならない5つのテクノロジーがある。私はそれらを「エクスポネンシャル・ファイブ」と呼んでいる。』

        リスト

        あとがき

        まえがきを含めて、トニー・サルダナ 『なぜ、DXは失敗するのか?: 「破壊的な変革」を成功に導く5段階モデル』(東洋経済新報社、2021年)より。

        まえがきの「現時点」は2019年半ば(原著の出版日)と思われます。第5項目にこれでもかと詰め込んであって the “Exponential Five” とは呼びがたい気もしますが……

        この本からの他のリスト

      • 戦術的あざむき(欺瞞)の5類型

        まえがき

        『人間や人間以外の霊長類(チンパンジーやオランウータンなど)は、臨機応変な戦術的あざむきを行うことができます。(略)確かにあざむきであると見なせる霊長類の行動事例(略)は5つのグループに分類されます。』

        リスト

        あとがき

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

        動物のあざむき(欺瞞)には、このリストが対象としている戦術的あざむきのほかに、遺伝的あざむきがあります。これは擬態や托卵など、生まれながらに備わった行動。

        言葉を使わなくても、これだけの方法で他者をあざむける。4 や 5 はかなり高度な欺瞞のように思えます。

        この本からの他のリスト

        参考文献

        Whiten, Andrew, and Richard W. Byrne. “Tactical deception in primates.” Behavioral and brain sciences 11.2 (1988): 233-244.

      • 嘘をつく理由の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 にあります。

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