投稿者: koji

  • 定量分析の3つの型

    まえがき

    『どれほど新しい分析表現といえども、実際にはこの3つの表現のバラエティ、および組み合わせに過ぎない。』

    リスト

    あとがき

    まえがきを含めて、安宅 和人 『イシューからはじめよ――知的生産の「シンプルな本質」』(英治出版、2010年)より。リストは本文をすこし編集のうえ引用しています。

    基本的には分析イコール比較であり、その「何らかの共通軸」として空間(構成)と時間(変化)があるといった関係。なので「比較」の例にも「構成」として解釈できそうなものがあったりしましたが、なんにせよ覚えやすく思い出しやすいリストです。

    ほかにも、本書には本サイトにおけるリストの定義たる「箇条書きにまとめられた知恵」がたくさん載っています。

    • ライフデザインに活かせるデザイン思考のマインドセット

      まえがき

      『デザイナーは前進する道を考える (・・・)のではなく築く (・・)のだ。実際にプロトタイプ(試作品)をつくり、自分自身で試し、そのプロセスを大いに楽しむということだ。』

      リスト

      あとがき

      まえがきを含めて、ビル・バーネット、デイヴ・エヴァンス『スタンフォード式 人生デザイン講座』(早川書房、2019年)より。まえがきは本文を一部省略して引用しています。リストは本文の見出しを引用して作成しました。

      デザイン思考のアプローチをライフデザインに転用する試み。

      この本からの他のリスト

    • AEIOU – 行動観察のフレームワーク

      まえがき

      『AEIOU は、行動記録を振り返るときに使える五つの質問の頭文字を表している。』

      リスト

      あとがき

      まえがきは、ビル・バーネット、デイヴ・エヴァンス『スタンフォード式 人生デザイン講座』(早川書房、2019年)より。リストは主に “AEIOU Framework” (EthnoHub Help) を参考にまとめました。

      数年前に、デザイン思考の本のなかで、フィールドワークの分野で使われている行動観察のキーワードである AEIOU を援用しているのを目にしました。そのときにリストを収集し本サイトに登録したたと思ったのですが見つからず……。

      キャリアデザインの解説書である本書では、「自分の新しい面を知るための AEIOU メソッド」という項で、自分の日記を読み返しながら自分の興味の対象を探るためにこのキーワードを援用しています。

      この本からの他のリスト

    • NVCによる紛争解決のステップ

      まえがき

      『NVCを活用して紛争解決する際に重要なのは、どのように表現されていても、必要としていることをそこから聞き取る技術を身につけることだ。』

      リスト

      あとがき

      まえがきを含めて、マーシャル・B・ローゼンバーグ 『NVC 人と人との関係にいのちを吹き込む法 新版』(日本経済新聞出版、2018年)より。

      原著にあたれていませんが、「何を必要としているのか」「必要としていること」「ニーズ」「欲求」はおそらく同じ概念を指します。

      5ステップのうち4ステップまでが、実にお互いのニーズを理解する作業に費やされているところが印象的でした。

      この本からの他のリスト

    • フロントページのタイトルにリスト件数などを載せる

      概要

      フロントページのタイトルを書き換えてリスト件数タグ個数、引用している書籍数を載せる。

      詳細

      フロントページのタイトルを書き換える

      タイトルを取得する get_the_title() に仕込まれている ‘the_title’ フィルターを使う。get_the_title() はメニューやウィジェット中の記事タイトルなどでも呼ばれまくっていて ‘the_title’ フィルターを使うコストは高そう。フロントページの記事タイトルだけを(テーマファイルなどに手を加えずに)動的に変える方法があればよいのだが思いつかず。

      フロントページを処理中であるかどうかは通常 is_front_page() を使うが、フロントページを描画する過程でも get_the_title() が複数呼ばれる。そこで ‘the_title’ フィルターに渡される投稿 ID が get_option( ‘page_on_front’ ) で取得できるフロントページ用の固定ページ ID と同一かどうかで識別する。

      リスト件数を載せる

      投稿 (post) の中で投稿ステータスが publish かつカテゴリが list であるものの数を数えればよいのだが、妥当な方法を思いつくまでに意外に時間がかかった。

      WP_Query() を使うと莫大な数の投稿オブジェクトが作られてしまう。特定の投稿ステータスを持った投稿の数カテゴリの数を個別に得る関数はあるが、それらを組み合わせて投稿数だけを得る負荷の低そうな関数が見当たらず。WP_Query() 中にあるフックを活用して SELECT 文に COUNT を追加する新しいクラスを作る事例もあったが、あまりにも大がかり。

      ただ調べてみると、WP_Query() は 1 回のクエリで取得する投稿オブジェクトの数にかかわらず総件数を取得している(ページネーションする場合総ページ数が必要なため)。なので、取得件数を 1 として WP_Query() を呼べばよいだけであった。

      タグ個数、引用している書籍数を載せる

      wp_count_terms() でOK。正確にはプライベート投稿にのみ属するタグや書籍を除く必要があるが、ほぼゼロであることはわかっているので省略。

      add_filter( 'the_title', 'kh_frontpage_title', 10, 2 );
      function kh_frontpage_title( $title, $id ) {
      	// フロントページ用の固定ページのタイトルであれば書き換える
      	if( $id == get_option( 'page_on_front' ) ) {
      		// posts_per_page => 1 とすれば戻り値に巨大な配列を得ることなく合計件数だけを得られる
      		$args = array(
      			'post_type'      => 'post',
      			'post_status'    => 'publish',
      			'category_name'  => 'list',
      			'posts_per_page' => 1,
      		);
      
      		$q = new WP_Query( $args );
      
      		$title = sprintf(
      			'%s のリスト<br><span style="font-size:smaller; font-weight:normal;">%s 冊の本と %s 個のタグを添えて</span>',
      			$q->found_posts, wp_count_terms( 'asin' ), wp_count_terms( 'post_tag' )
      		);
      	}
      	return $title;
      }
    • 「最近読まれているリスト」機能の実装

      最近アクセスの多いリストを一覧表示するウィジェットとアーカイブページを作る。

      人気のあるリストを紹介する場合、総アクセス数で測ると表示されるリストが固定的になるうえ、露出が高まることでアクセス数が増えるのでアクセス数の差が助長される。逆に直近の24時間など短い時間のアクセス数では変動が大きく、人気のあるリストとは言い難くなる場合もある。そこで直近7日間のアクセス数の多いリストを表示させることにした。


      直近7日間のアクセス数を記録する

      WordPress は投稿ごとのアクセス数を記録しないので、count_history というカスタムフィールドを作り、直近1週間のアクセス数を保存する。たとえば今日が 2021/6/2 とすると次のような配列として保存される。

      Array
      (
          [20210602] => 10
          [20210601] => 20
          [20210531] => 30
          [20210530] => 40
          [20210529] => 30
          [20210528] => 20
          [20210527] => 10
      )

      そのうえで lf_counter という別のカスタムフィールドに合計値(上の例でいえば 160)を保存する。具体的な処理は次の通り。

      $count_history = get_post_meta( get_the_ID(), 'count_history', true );
      
      // アクセス履歴あり
      if( is_array($count_history) ) {
      	// 7日前の日付を取得
      	$expdate = (int)wp_date( 'Ymd', strtotime( '-7 days' ) );
      	foreach( $count_history as $date => $count ){
      		// 7日前以前の記録を削除
      		if( $date <= $expdate ) {
      			unset( $count_history[$date] );
      		}
      	}
      // アクセス履歴なし
      } else {
      	$count_history = array();
      }
      
      // カウンタをインクリメント
      $today = (int)wp_date( 'Ymd' );
      ( isset($count_history[$today]) ) ? $count_history[$today]++ : $count_history[$today] = 1;
      
      // カウント履歴をカスタムフィールドに保存
      update_post_meta( get_the_ID(), 'count_history', $count_history );
      
      // 合計カウント数をカスタムフィールドに保存
      update_post_meta( get_the_ID(), 'lf_counter', array_sum( $count_history ) );
      

      カウント処理は、ページ表示処理の終盤に低い優先度で実行させる。

      add_action( 'wp_footer', 'kh_access_count', 30 );
      function kh_access_count() {
      
          /*
           * 除外するアクセスを識別する
           * and は最初の式がfalseなら次を評価しないのでorより高速
           */
          if ( is_single() // 投稿
            && has_category( 'list' ) // list カテゴリに属している
            && and ! current_user_can( 'administrator' ) // 管理者のアクセスでない
          ) {
              // 通過
          } else {
              return;
          }
      
          // 簡易 Crawler 除外
          // bot, bots, spider で終わる単語が入っていれば Crawler と判断
          $ua = $_SERVER['HTTP_USER_AGENT'] ?? '';
          if ( preg_match( '/.*(bots?|spider)\b/i', $ua ) ) {
              return;
          }
      
          /*
           * カウントする
           */
          (上述の処理)
      
      }

      直近7日間のアクセス数が多いリスト10個をキャッシュし、1時間ごとに更新する

      上述のように、リスト投稿ごとのアクセス数はカスタムフィールドに持たせている。全リスト投稿をカスタムフィールドの値でソートする処理は重そうなのでキャッシュし、1時間ごとに更新することにした。

      キャッシュの更新(スケジュール処理)と取得(ウィジェット表示)で同じ関数を使えるようにするため、下記のような関数を作成。

      function lf_get_popular_lists( $use_cache = true ) {
      	
      	if ( $use_cache ) {
      		$out = get_transient( 'LF_POPULAR_LISTS' );
      		if( false !== $out ) {
      			return $out;
      		}
      	}
      
      	// アクセスカウントを多い順に10取得
      	$q = new WP_Query( array(
      		'post_type'      => 'post',
      		'category_name'  => 'list',
      		'post_status'    => 'publish',
      		'posts_per_page' => 10,
      		'meta_key'       => 'lf_counter',
      		'orderby'        => 'meta_value_num',
      		'order'          => 'DESC',
      		'fields'         => 'ids',
      	) );
      
      	$lists = '<ul>';
      	foreach( $q->posts as $id ){
      		$lists .= '<li><a href="'.get_post_permalink( $id ).'">'.get_the_title( $id ).'</a></li>'.PHP_EOL;			
      	}
      	$lists .= '<li><a href="'.home_url( '/category/list?orderby=popthisweek' ).'">(もっと見る)</a></li>'.PHP_EOL;			
      	$lists .= '</ul>';
      
      	// Transientにキャッシュ
      	set_transient( 'LF_POPULAR_LISTS', $lists );
      }

      この関数を1時間ごとに $use_cache = false で呼び出すようスケジュール登録した。

      if ( ! wp_next_scheduled( 'lf_event_popular_lists', array( false ) ) ) {
          if ( ! $ret = wp_schedule_event( time(), 'hourly', 'lf_event_popular_lists', array( false ), true ) ) {
              // エラー処理
          }
      }
      
      add_action( 'lf_event_popular_lists', 'lf_get_popular_lists', 10, 1 );

      キャッシュした10リストを表示するウィジェットを作成する

      カスタムウィジェットは WP_Widget クラスを継承して作成する必要があったが、最近ではブロックエディタから登録できるようになったので、ショートコードを作った。

      add_shortcode( 'lf_popular_lists' , 'lf_popular_lists' );
      function lf_popular_lists( $args ){
      
          $use_cache = true;
          $out = lf_get_popular_lists( $use_cache );
      
          return $out;
      }

      アーカイブページをアクセスカウント順に表示する

      ウィジェットは10個だけだが、すべてのリストをアクセス数の多い順に並べて見られる機能もつけた。これはカテゴリアーカイブページを流用した。具体的には、

      • <ROOT>/category/list → 通常の新着順
      • <ROOT>/category/list?orderby=popthisweek → 直近7日間のアクセス数順

      とする。以下は Code Snippet に登録したスニペット。

      // /category/list で始まる場合のみ読み込む
      if ( 0 !== strpos( $_SERVER['REQUEST_URI'], '/category/list' ) ) {
          return;
      }
      
      add_action( 'pre_get_posts', 'lf_pre_get_posts_list', 10, 1 );
      function lf_pre_get_posts_list( $query ) {
      
          if ( $query->is_main_query() ) {
      
              if ( 'popthisweek' == get_query_var( 'orderby', '' ) ) {
      
                  $query->set( 'meta_key', 'lf_counter' );
                  $query->set( 'orderby',  'meta_value_num date' );
                  $query->set( 'order',    'DESC');
              }
          }
      }

      Code Snippet は Snippet 全体を eval() するので、最初の if 文のように return するとそれ以降のコードは実行されない。アクションフック ‘pre_get_posts’ はほぼ全ページで実行され得るので、当該ページの表示時のみコールバックを登録するようにした。

    • アルゴリズムの特徴

      まえがき

      『アルゴリズムには三つの鍵となる特徴があり、いずれも私たちにとって重要であり、またいずれも定義するのが幾分困難である。』

      リスト

      あとがき

      まえがきを含めて、ダニエル・C・デネット 『思考の技法 直観ポンプと77の思考術』(2015年、青土社)より。26番めのツール「アルゴリズム」からの引用ですが、リスト作成にあたって文章を改変しています(原文は例示などが添えられていてわかりやすい反面、やや冗長なので)。

      基質中立性とは、本書の例を引用すると、長除法の手続きが書くもの(鉛筆やペン)にも書かれるもの(紙や羊皮紙)にも依存しないということ。

      純粋に論理的で、類推の余地がないほど単純なステップからなる、その実行によって常に同じ結果が保証される手続き

      この本からの他のリスト

    • 上手な批判的コメントの作り方(ラパポートのルール)

      まえがき

      『あなたがこのルールに従ったことで得られる直接的な効果は、標的があなたの批判に対して聞く耳を備えた聞き手となる、ということである。』

      リスト

      あとがき

      まえがきを含めて、ダニエル・C・デネット 『思考の技法 直観ポンプと77の思考術』(2015年、青土社)より。ラパポートのルールは3つめのツールです。

      『社会心理学者でありゲーム理論の研究者であるロバート・ラパポート(ロバート・アクセルロッドによる伝説的な「囚人のジレンマ」トーナメントで勝利する「しっぺ返し」戦略の創始者)がかなり以前に広めた一連のルール』として紹介されていました。

      この本からの他のリスト

    • 夫婦関係に傷を負わせる四つの危険要因

      まえがき

      『ある種の言葉は夫婦関係に致命的な傷を負わせることになる。私はこれを「四つの危険要因」と呼んでいる。』

      リスト

      あとがき

      まえがきを含めて、ジョン・M. ゴットマン他 『愛する二人別れる二人―結婚生活を成功させる七つの原則』(第三文明社、2000年)より。本文を要約してリスト化しました。見出し語に添えた英語は原著からの引用です。

      このリストは「夫婦関係を破綻させる4つの行動」と同一。というか本リストが原典です。訳がけっこう違うので別のリストにしました。

      この本からの他のリスト

    • 結婚生活を成功させる7つの原則

      まえがき

      『私の提唱する七つの原則は、いざこざを上手に処理するガイドブックの役をするだけでなく、いかなる結婚にも、友情がその中心にあり、それを強化することが結婚生活の基本だと教えてくれる教科書ともなる。』

      リスト

      あとがき

      まえがきを含めて、ジョン・M. ゴットマン他 『愛する二人別れる二人―結婚生活を成功させる七つの原則』(第三文明社、2000年)より。リスト項目は目次からの引用です。

      ニュアンスがわかりづらい項目もあったので、”The Seven Principles for Making Marriage Work” (Wikipedia) から英語を引用して添えました。

      『(略)夫婦の言動をわずか五分間観察するだけで、この夫婦がこれから幸福な結婚生活を送れるものか、離婚の道を歩むものか、平均九一%の正確さで予測できるようになった。』というゴットマン博士の知見はビジネス書でけっこう見かけます。ようやく原著(の和訳)を読みました。

      この本からの他のリスト