2017年6月21日水曜日

【 Wordpress 】the_title() で付加される公開状態を削除する

Wordpress の the_title() や get_the_title() で投稿のタイトルを取得すると、頭に「非公開: 」といった余分な情報が付加されるという不快・おせっかいな仕様になっている。
幸い、フィルターが用意されているので、これで削除することができる。
以下を functions.php に追加する :

  function remove_category_from_title( $format ) {
  /* 投稿の公開状態が protected や private であった場合、タイトルの前に公開状態が追加されるので、
   * これを表示させない。 */
    return $'%s';
  }

  add_filter( 'private_title_format', 'remove_category_from_title');

クラスでは add_filter をコンストラクタに書く :
  add_filter( 'private_title_format', [$this, 'remove_category_from_title']);


2017年4月28日金曜日

【 Wordpress】ユーザー登録の姓名の表示順をどうするか

問題点

Wordpressの標準日本語翻訳ではFrist Name = 名、Last Name = 姓 と、『意味的』に正しい翻訳になっている。このため、ユーザプロフィールの表示・編集画面では 名(Frist Name)・姓(Last Name)の順に表示され、これを日本式に逆転する機能は用意されていないので非常に違和感がある。

解決策の検討

もっとも簡単な解決策は「気にしない」である。利用者が限られている場合は我慢してもらうことを選択肢から排除する必要はないだろう。しかし一般ユーザが登録するサイトではそうもいかない。
ネット上で多く提案されている解決策は、JavaScriptによってユーザプロフィール画面の名・姓の表示順を入れ替えるものである。また、これはプラグイン「last_name_first_name」を採用することでコードを書くことなく簡単に実現できる。

使い方は簡単で、プラグインをインストールして有効化するだけ。設定等は何もない。このプラグインはWordpress本体に関しては十分に実用的な解決策だが、姓名を扱う他のプラグインを使用するサイトでは同様の問題を解決する必要がある。

2017年4月5日水曜日

【 Excel 】シートの最後のセル(xlLastCell)をリセットする

シートの行や列を削除しても使用範囲(UsedRange)は元の範囲のままとなっており、実際の使用範囲を反映するように手動で調整するのは面倒である。
これをプログラムで行う。

Sub ResetLastCell()
' シートの xlLastCell の位置を再調整する
' 削除範囲にデータがあっても確認せずに削除するので、注意。
'【 使い方 】LastCell にしたいセルを選択して呼び出す。実行後、ブックを開き直すこと。
  Dim wCell As Range, wRet As Integer
  Dim wNewRow As Long, wNewCol As Long, wCurRow As Long, wCurCol As Long
 
  Set wCell = ActiveCell
  wRet = MsgBox( _
          wCell.Address + "を LastCell にします。" + vbCrLf  + vbCrLf + _
          "他のセルを指定するには「No」を押してください。", _
          vbYesNoCancel, "LastCell の位置を再調")
  If (wRet = vbCancel) Then GoTo ResetLastCellExit
  If (wRet = vbNo) Then
    Set wCell = Application.InputBox(Prompt:="新しい LastCell を選択してください。", Type:=8)
    If (wCell Is Nothing) Then GoTo ResetLastCellExit
    On Error GoTo 0
  End If
  wCell.Parent.Activate
  wNewRow = wCell.Row + 1:    wNewCol = wCell.Column + 1
  Set wCell = wCell.SpecialCells(xlLastCell)
  wCurRow = wCell.Row:    wCurCol = wCell.Column
  ' 削除による参照先エラーを避けるため、Cells で指定する。
  If (wCurRow > wNewRow) Then           ' 行を調整
    Range(Cells(wCurRow, wCurCol), Cells(wCurRow, wCurCol)).EntireRow.Cut Destination:=Range(Cells(wNewRow, wNewCol), Cells(wNewRow, wNewCol)).EntireRow
    Range(Cells(wNewRow, wNewCol), Cells(wCurRow, wCurCol)).EntireRow.Delete Shift:=xlUp
  End If
  If (wCurCol > wNewCol) Then           ' 列を調整
    Range(Cells(wCurRow, wCurCol), Cells(wCurRow, wCurCol)).EntireColumn.Cut Destination:=Range(Cells(wNewRow, wNewCol), Cells(wNewRow, wNewCol)).EntireColumn
    Range(Cells(wCurRow, wCurCol), Cells(wNewRow, wNewCol)).EntireColumn.Delete Shift:=xlLeft
  End If
  MsgBox "ブックを保存し、開き直してください。", vbOKOnly
ResetLastCellExit:
End Sub


2017年3月13日月曜日

【Excel】 Range のサブレンジを返す

以下の関数はRange の部分範囲を返す。範囲は基準となる Range に対して「開始行、開始列、終了行、終了列」を 0 から始まるオフセット値で指定する。

Function SubRangeOf(wRng As Range, wBgnRow As Long, wBgnCol As Long, Optional wEndRow As Long = 0, Optional wEndCol As Long = 0) As Range
' wRng.Cells(wBgnRow, wBgnCol)~wRng.Cells(wEndRow, wEndCol) の範囲を返す。
' wEndRow、wEndCol を省略すると wRng の右下までを返す。

  Set SubRangeOf = Nothing
  If ((wEndRow <= 0) Or (wEndRow > wRng.Rows.Count)) Then wEndRow = wRng.Rows.Count
  If ((wEndCol <= 0) Or (wEndCol > wRng.Columns.Count)) Then wEndCol = wRng.Columns.Count

  If ((wBgnRow <= wEndRow) And (wBgnCol <= wEndCol)) Then
    Set SubRangeOf = wRng.Offset(wBgnRow - 1, wBgnCol - 1).Resize(wEndRow - wBgnRow + 1, wEndCol - wBgnCol + 1)
  End If
End Function


使い方 :
set RepoWindow = Range("C16:P25")
'RepoWindow の2行目の5列目から右下までをクリア
SubRangeOf(RepoWindow , 2, 5).ClearContents

2016年11月16日水曜日

【PHP】 「今日は今年の何日目?」と、property の readonly 属性

1) 「今日は今年の何日目?」を返す機能が見つからなかったので、作ってみた。
2) PHP の property には readonly 属性がないので、作ってみた。

class myDateTime extends DateTime {

  function __get($name) {
    //プロパティの取得
    switch ($name) {
      case 'days':
        return $this->getDays();
        break;
      default:
        throw new Exception('undefined propery : '.$name);
        break;
    };
  }

  function __set($name, $value) {
    // readonly の実装
    switch ($name) {
      case 'days':
        //これがないと __get で定義された property も値を変更できる
        throw new Exception('readonly propery : '.$name);
        break;
      default:
        //このクラスで定義されていない property はエラーとする
        throw new Exception('undefined propery : '.$name);
        break;
    };
  }

  private function getDays() {
    //基準日の元旦を 0 として、何日目かを返す
    $base = new DateTime($this->format('Y').'-1-1');
    return $this->diff($base)->days;
  }
}
?>

※※※ 使い方 ※※※

  $date = new myDateTime();
  echo '今日は今年の '.($date->days + 1).' 日目です。';
  $date = new myDateTime("2016-12-31");
  echo '2016 年は '.($date->days + 1).' 日あります。';
?>

2016年10月31日月曜日

メモ : 光合成

植物を構成するCHONのOは空気ではなく水からきている。
さらに、1941年、ルーベン(S. Ruben)とケーメン(M, D. Kamen)は、酸素の同位体18Oを用いて、光合成で生じる酸素分子が水分子の酸素原子に由来し、二酸化炭素中の酸素原子には由来しないことを証明している。 (p.42)

光合成は・・・水と二酸化炭素を原料にして、光のエネルギーで酸素とデンプンを作り出すはたらきである。この化学式は12H2O + 6CO2 → C6H12O6 + 6O2 + 6H2Oさて、植物のはき出す酸素は、光合成前の二酸化炭素分子からくるのだろうか、それとも水分子からくるのだろうか?植物は「二酸化炭素を取り入れ酸素をはき出す」ので、二酸化炭素CO2の分子から酸素原子Oが取り出されて酸素O2を発生させると考えがちであるが、そうではない。p.42で述べたルーベンとケーメンの実験により、そのことが実証されている。 (p.44)
一部表現は引用者が編集》

『「人工光合成」とは何か』(光化学協会・井上晴夫; ブルーバックス)





2016年10月4日火曜日

【wordpress】 プラグインのクラス化

ショートコードで呼べるプラグインを作るのはとても簡単 :
(以下、機能文字は全角で記載してあるので、半角に読みかえること。)

1.(site)\wp-content\plugins\ の下にフォルダーを作る。プラグイン名と同じがよい。
2.そこに「プラグイン名.php」をつくる。 例 : my_plugin_1.php
3.内容はこんな感じ :

<?php
/**
Plugin Name: my plugin 1
Plugin URI:
Description: my test plugin no_1.
Author: Author Name
Author URI:
Text Domain:
Domain Path:
Version: 0.0.0
*/
add_shortcode("show_my_plugin_1", "my_plugin_1_page");

function my_plugin_1_page() {
  return ’<p>何かのコンテンツ</p>’;
}

4.ダッシュボードのプラグイン一覧を開くと、「my plugin 1」が載っているので、有効化する。表示されている名称はコード冒頭の「Plugin Name」で指定したもの。
5.投稿中に [show_my_plugin_1  と書くと、「何かのコンテンツ」が表示される。


これをクラスにするにはこんな感じ :

class myPlugin1Class {

  public function __construct() {
    //コンストラクタで add_shortcode する。
    //以下の、配列にして $this を渡すことがミソ。
    add_shortcode("show_my_plugin_1", array($this, "my_plugin_1_page"));
  }
  public function my_plugin_1_page() {
    return ’<p>何かのコンテンツ</p>’;
  }

}
//インスタンスを生成; 変数への保存は不要
new myPlugin1Class();

6.例によって、「ミソ」を発見するのに一苦労あったので、メモ。