2019年9月23日月曜日

【MySQL】連番の振り直し

MySQL には「updte ... order by」という方言があるので、番号の振り直しがとても簡単。
@seq := 0;
  update [tablename] set SEQ=(@seq:=@seq+1)
  where [condition...]
  order by [order keys...]

こういう方言は、ありがたい。

2018年3月26日月曜日

USB音源の作り方

車を買い替えたら、マニュアルにUSB音源からの再生ができると書かれている。しかしUSB音源なるものをどのように作成するかの情報は車のマニュアルには載っていない。作業は以下のとおり。
PCの音楽プレイヤーは MusicBee を使っている。iTunes も入っているが、これでは作成できなかった。

A.USB音源の作り方
1.MusicBee を起動し、出力するアルバム、プレイリストまたは曲を選択する。
2.「メニュー→ツール→フォーマットの変換」を選択。
3.「ファイルコンバータ」画面が表示されるので、
 a)エンコード形式(AAC)を確認
 b)「新規フォルダに出力」を選択し、出力先(USBデバイス;例 E\)を選択
 c)「サブフォルダとファイル名を整理する」をチェックしておくと曲ファイル(.m4a)は「アーティスト名→アルバム名」のフォルダ構造の下に作成される。自分でフォルダーを管理することもできる。
 d)〔 進む 〕をクリック
 e)メッセージ欄に進行状況が表示され、最後に「ファイル変換が完了しました」と表示される。


B.プレイリストの作り方
「プレイリスト」を選択して出力しても音源本体が出力されるだけで、プレイリスト自体は自動的には作成されない。自分で作る必要がある。
1.USBドライブ直下にフォルダー「Playlists」を作る。
2.テキストエディタ(メモ帳でOK)を開き、1行1曲で音源へのパスを指定する。
 例)
  ..\いきものがかり\超いきものばかり Disc1\1-01 SAKURA.m4a
  ..\いきものがかり\超いきものばかり Disc1\1-04 茜色の約束.m4a
  ..\いきものがかり\超いきものばかり Disc2\2-07 YELL.m4a
3.フォルダー「Playlists」の下に任意の名前でプレイリスト・ファイルとして保存する。その際、文字コートは  UTF-8、拡張子は「.m3u」とする。
 例:「いきものがかりセレクション.m3u」

2017年10月24日火曜日

【PHP】パスワード生成

パスワードを生成する、ちょっとだけ凝った関数を作ってみた。
特徴と制限  :
1.大文字・小文字・数字と記号をバランスよく含む。
2.始めの文字を大文字または小文字に限定できる。
3.各文字は重複出現しない。
4.50桁程度まで。


  function genpass( $siz=8, $symb=True, $mode='' ) {
  //Returns random letters, numbers and symbols. Each element appears once.
  // $siz  : size of password generated; should not be bigger than element size(49 + symbols).
  // $symb : True .. symbols are included
  // $mode : A .. start with Upper alphabetic; a .. with Lower alphabetic; // '' (default) .. start with Upper or Lower alphabetic; // other .. no restriction; 
    //allowed letters and symbols
    $symbase = ['!','#','$','%','&','+','/','=','-'];
    $upper = array_merge( range('A', 'N'), range('P', 'Z'));        //omit 'O'
    $lower = array_merge( range('a', 'k'), range('m', 'z'));        //omit 'l'
    $symbs = array_merge(( $symb ? $symbase : [] ), range(1, 9));   //omit '0'
    //allot occurrence of upper, lower, and num+symbol
    $sizU = max( 2, intval( $siz * 0.3 ));    
    $sizL = max( 2, intval( $siz * 0.4 ));    
    $sizS = max( 1, $siz - ( $sizU + $sizL ));
    //get password members; can be shorter than siz when siz is big
    shuffle( $upper );  $upper = array_slice( $upper, 0, $sizU );
    shuffle( $lower );  $lower = array_slice( $lower, 0, $sizL );
    shuffle( $symbs );  $symbs = array_slice( $symbs, 0, $sizS );
    //get first letter
    switch ( $mode ) {
      case 'A' :  //start with upper
        $fch = array_shift( $upper );
        break;
      case 'a' :
        $fch = array_shift( $lower );
        break;
      default:
        $fch = '';
        break;
    }
    //merge everything and shaffle
    $pasbase = array_merge( $upper, $lower, $symbs );    shuffle( $pasbase );
    if ( ''===$mode ) {
      while( ! ((('a'<=$pasbase[ 0 ])&&($pasbase[ 0 ]<='z')) || (('A'<=$pasbase[ 0 ])&&($pasbase[ 0 ]<='Z')))) {
        $elm = array_shift( $pasbase );
        $pasbase[] = $elm;
      }
    }
    return $fch . implode( $pasbase );
  }


テスト結果 :
Z6chV9yDg-
Z7cgqtB%V8
WFc-=gv4Ny
V9j3oT%rWq
MzkqNP4f53

zM=Ff!wjL6
r!G1mRJe6x
tQv63Pi=Zh
pA8X3iPxa%
etWv9#KhU7

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