2018年2月27日火曜日

WP カスタム投稿の設定

初期設定部分
function initstart() {
        register_post_type(
            'slug',/* 投稿タイプのslug */
            array(
              'labels' => array(
                  'name' => __( '表示名' ),
                  'singular_name' => __( '表示名' )
              ),
              'public' => true,
              'menu_position' => 8, // ,メニュー表示場所
              'supports' => array('title', 'editor', 'author', 'thumbnail', 'excerpt', 'trackbacks', 'custom-fields', 'comments', 'revisions', 'page-attributes') // 編集時に有効にする項目
            )
        );
}
add_action( 'init', 'initstart' );

カスタム投稿にタクソノミー(カテゴリー)を追加する場合
function initstart() {
        register_taxonomy(
            'slug_cate',  // 追加するタクソノミーのslug 
            'slug',   // 追加する投稿タイプのslug
            array(
                'hierarchical' => true,
                'update_count_callback' => '_update_post_term_count',
                'label' => '表示名', // 表示される名前
                'singular_label' => '表示名', // 表示される名前
                'public' => true,
                'show_ui' => true
            )
        );
}
add_action( 'init', 'initstart' );
最低限、これだけ設定すれば使用ができるようになります。
実際にはこの二つはひとつのfunctionに書くと思います。

カスタムフィールドの入力エリア追加
function add_post_fields() {
    add_meta_box( 'slug', 'スラッグ', 'insert_custom_fields', 'slug', 'normal');
}
add_action('admin_menu', 'add_post_fields');
// カスタムフィールドの入力エリア
function insert_custom_fields() {
    global $post;
    if ($post -> post_type == 'slug') {
        echo '
'; } } // カスタムフィールドの値を保存 function save_custom_fields( $post_id ) { if(!empty($_POST['inputname'])){ update_post_meta($post_id, 'inputname', $_POST['inputname'] ); }else{ delete_post_meta($post_id, 'inputname'); } } add_action('save_post', 'save_custom_fields');

編集時の「投稿の編集」等の文言を変えたい場合
function initstart() {
        global $wp_post_types;
        $labels = &$wp_post_types['slug']->labels;
        $labels->all_items             = '投稿一覧'; // 投稿一覧
        $labels->add_new               = '新規追加'; // 新規追加
        $labels->add_new_item          = '新規投稿を追加'; // 新規投稿を追加
        $labels->edit_item             = '投稿の編集'; // 投稿の編集
        $labels->search_items          = '投稿を検索'; // 投稿を検索
        $labels->not_found             = '投稿が見つかりませんでした。'; // 投稿が見つかりませんでした。
        $labels->not_found_in_trash    = 'ゴミ箱内に投稿が見つかりませんでした。'; // ゴミ箱内に投稿が見つかりませんでした。
        $labels->featured_image        = 'アイキャッチ画像'; // アイキャッチ画像
        $labels->set_featured_image    = 'アイキャッチ画像を設定'; // アイキャッチ画像を設定
        $labels->remove_featured_image = 'アイキャッチ画像を削除'; // アイキャッチ画像を削除
        $labels->use_featured_image    = 'アイキャッチ画像として使用'; // アイキャッチ画像として使用
}
add_action( 'init', 'initstart' );

カスタム投稿一覧表示の時に項目を追加、変更したい場合
function slug_column($columns){
	$columns = array(
        'title' => 'タイトル',
	'slug' => 'スラッグ',
	'date' => '日時'
	);
	return $columns;
}
add_filter( 'manage_edit-slug_columns', 'slug_column');

2018年2月26日月曜日

WP 管理画面の投稿画面のタイトル上部とか文字を表示する方法

タイトル上部に文字を出す。
function title_note($post){
    if($post->post_type == "post"){
        echo "この内容は投稿の編集画面で出ます。";
    }
    echo "この内容は全ての編集画面で出ます。";
}
add_action( 'edit_form_top', title_note );
この内容では投稿ですが、"post"の部分を書き換える事で固定ページ等に変更出来ます。
'edit_form_top'を変更することで、タイトル下部(パーマリンク下)というよりはエディター上部<やエディター下部<にも表示出来ます。
'edit_form_after_title' -> タイトル下部
'edit_form_after_editor' -> エディター下部<
となります。

2018年2月23日金曜日

WP ログイン画面をカスタマイズ

この辺はカスタマイズ案件だと必須に近い項目かも。

ログインロゴを変える場合。CSSで変更してます。
function custom_login_script() { ?>
  <style>
    .login #login h1 a {
      width: 274px;
      height: 63px;
      background: url('https://~') no-repeat 0 0;
    }
  </style>
 <?php }
add_action( 'login_enqueue_scripts', 'custom_login_script' );


タイトルロゴのとび先を変える方法
function login_logo_url() {
    return get_bloginfo( 'url' );
}
add_filter( 'login_headerurl', 'login_logo_url' );
wordpressで設定したTOP画面になります。
get_bloginfo( 'url' )の部分を"https://~"に変更すれば任意のURLに設定もできます。

ロゴのタイトル属性変更(カーソルを当てると表示される名前)
function login_logo_title() {
    return get_option( 'blogname' );
}
add_filter( 'login_headertitle', 'login_logo_title' );

背景などもCSS部分の設定する事で変更出来ます。

2017年3月24日金曜日

MySqlで巨大データのチューニング

現在作成してるものでメインデータ700万件超。
メインデータに紐づくタグデータ 6000万超。
と個人でなんとかするには無茶なデータ量。
当然、INDEXを張ったりなんだり。

覚えておく事として、mysqlは基本、1INDEXしか使わない。
複数のINDEXをしようして検索しませんよと。サブクエリーとかはまたそこでINDEXを使います。
1SQLで1INDEXというわけではないので注意。

で、当然こんだけあると遅い、遅い。
せめて1秒くらいで欲しいデータをだしたい。

そこで解析に使うのが[EXPLAIN]ですが、項目の簡単な見方。
あくまで簡易的であり私の私見なので間違ってたりするかもしれません。

table:
どのテーブルが対象なのかを表してます。

type:
検索パターンを示してます。ALLは基本的には無くす方向でチューニングします。
indexの場合には要注意くらいでも大丈夫かも。

possible_keys:
INDEX名が表示されます。

row:
実行するために必要だと判定したレコードの件数。
実際の件数ではないが、その件数を見る予定なので乱暴だが少ない方がいいと考えてよい。

Extra:
色々ありますが、Using filesort、Using temporaryが表示された場合は注意した方がいい。

2017年3月22日水曜日

MYSQLでキャッシュをつかわない。

mysqlで1回目は遅いけど同じSQLでは早い。 キャッシュを使ってるので当然といえば当然ですが、チューニングしてる場合にはキャッシュを使わずに計測したい。
いつも間違うのがこっち
SELECT NOCACHE col1,....

正しいのはこっち
SELECT SQL_NO_CACHE col1,...

というわけで備忘録です。

2017年3月7日火曜日

MySQLで縦列を横列にカンマ区切りにしたい。

MySQLで縦列を横列にカンマ区切りにしたいと思い色々検索してみる。 実際にはカラムにカンマ区切りで入れたいってのが要望です。 色々調べてみるが力技がほとんど。有ってもpivotが引っかかる。 どうも自分がしたい感じではない。 タグ表示に近い。 メインデータ
mainidデータ1データ2
1AB
タグデータ
tagidmainidname
11C#
21MySQL
31PHP
とDBに登録されているとして。こう表示させたい
idデータ1データ2タグ
1ABC#,MySQL,PHP
色々調べた結果MySQLに便利な関数がありました。
GROUP_CONCATです。常識?今回の件で初めてしりましたよ。 以下、こんな感じで書き求めてる結果を出せました。
SELECT * 
FROM main 
  LEFT JOIN (SELECT 
      mainid,
      GROUP_CONCAT(name separator ',') AS タグ
      FROM tag
      GROUP BY mainid) tagd ON tagd.mainid = main.mainid

2013年8月18日日曜日

DataGridViewのスクロールバーがおかしくなる

VS2010で自分用のプログラムを書いててDataGridViewの動きがおかしい。

            this.dataGridView1.Rows.Clear();
            DataTable xx;
            xx= データ取得;
            foreach (DataRow viewdr in xx.Rows)
            {
                this.dataGridView1.Rows.Add(viewdr.ItemArray);
            }
とやってるのだがスクロールバーで全部のデータが見られない。
ヘッダーカラムをクリックしてソートしたり、カーソルキーなどで移動すると全部できる。

DataGridViewのスクロールバーエラーとかで、いろいろ検索してみると。
.VirtualMode = True
.VirtualMode = False

とするといいとかある。
.ScrollBars = ScrollBars.None;
.ScrollBars = ScrollBars.Both;
で、治ったとか。
なんか、おまじないくさくてやだ。
リフレッシュそたらなおるのかな?と思って
            this.dataGridView1.Refresh();
としてみるが、ダメ。
おまじないにしないとだめかなと思ったところでちょっと思いつく。
            this.dataGridView1.SuspendLayout();
            this.dataGridView1.Rows.Clear();
            DataTable xx;
            xx= データ取得;
            foreach (DataRow viewdr in xx.Rows)
            {
                this.dataGridView1.Rows.Add(viewdr.ItemArray);
            }
            this.dataGridView1.ResumeLayout();
で解決。描画を止めて、セットしてから描画するという手段で回避しました。
きっと、この動作自体はバグなんでしょうね
これも、おまじないだが自分の気分的にはこちらのほうがいい。

2013年8月16日金曜日

MDBのカラム名とコメント取得

MDBのカラム名とコメント取得
 
DataTable schemaTable = conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new Object[] { null, null, null, "TABLE" });

foreach (DataRow dr in schemaTable.Rows)
{
    DataTable table = conn.GetSchema("Columns", new string[4] { null, null, dr["TABLE_NAME"].ToString(), null });

    DataRow[] table2 = table.Select("", "ORDINAL_POSITION");
    foreach (DataRow dr2 in table2)
    {
        List<string> col = new List<string>();
        col.Add("\"" + dr2["TABLE_NAME"].ToString() + "\"");
        col.Add("\"" + dr2["COLUMN_NAME"].ToString() + "\"");
        col.Add("\"" + dr2["DESCRIPTION"].ToString() + "\"");
    }

}

メモ書きとして。

2013年8月1日木曜日

MySQLのCHARSET

文字化けするのでPDOでSET NAMEみたいなのって調べたら
SET NAMEは脆弱性の元とかいってダメとか。

 $con = new PDO(
     "mysql:host=".consClass::dbserver."; dbname=".consClass::dbname,
     consClass::dbuser,  consClass::dbpass,
     array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET utf8")
 );

接続時にこれでOKでした。

2013年7月31日水曜日

AMAZONのAPI(AWS)でkindleを除外する条件

パラメータに
Power=binding:not kindle
追加するだけ。

すげー簡単に終わった。

パラメータでKindle除外できるやん。

2013年7月18日木曜日

MYSQL クエリーログ

my.iniのConfigに追記。 デバッグ用と思って本番ではコメントにしないと危険(おもに、容量的に)
[mysqld]
log=myquery.log

2013年7月17日水曜日

VBA ファイル作成してデータ出力

VBAが嫌いで避けてたのですがファイル作成してデータ出力が
必要になったのでメモ。

    Dim fn As String
    Dim FSO: Set FSO = CreateObject("Scripting.FileSystemObject")
    Dim fs As Object

    fn = Format(Now, "mmddhhnn") & ".sql"

    Set fs = FSO.OpenTextFile(fn, 2, True, -2)
    sheetCNT = Sheets.Count

    For i = 2 To sheetCNT
       fs.writeline (Sheets(i).Name)
    Next

    fs.Close

2013年7月10日水曜日

MySql

MySQL Connector/Netが入ってなかった 下のリンクから取得。(リンクのファイル名は私が取得した時のバージョン) mysql-connector-net-6.7.4-noinstall.zip 取得するのにOracleのアカウントが必要。 特にお金がかかるわけではないのでさくっと登録。 「.NET & MONO」を選択してダウンロード。 解凍すると。V2とV4のフォルダができます。 .Net4はV4のフォルダの「mysql.data.dll」を参照して追加します。 これで使えるようになるはず。

2013年7月8日月曜日

WaveIF

Waveの録音再生を簡単に出来ないかとさがしたら、みつかったのがこの
WaveIF。んで、C#の資料が少なかったのでメモ書き。
録音するときは
axWaveIn_OnDoneイベントでデータを保存する。

        private void rec(){
            axWaveIn.Open();
            for (short i = 0; i < axWaveIn.NumBuffers; i++)
            {
                axWaveIn.AddBuffer(i);
            }
            axWaveIn.Start();
        }
        private void axWaveIn_OnDone(object sender, AxWaveInterfaceLib._DWaveInEvents_OnDoneEvent e)
        {
            short BufferIndex = e.bufferIndex;
            long BytesRecorded = e.bytesRecorded;

            //' データが録音されていれば、
            if (BytesRecorded > 0)
            {
                // 録音されたデータを取得します。
                // .Netでは、GetDataが使えないのでこの取り方
                int bufferNum = axWaveIn.GetBufferAddress(e.bufferIndex);
                wifGetDataAny(recBuffer, bufferNum, e.bytesRecorded);

                if (Information.UBound(recBuffer) > BytesRecorded - 1)
                {
                    Array.Resize<byte>(ref recBuffer, (int)BytesRecorded - 1);
                }
                // テンポラリ、モニタ保存
                FileStream fs = null;
                fs = null;
                fs = new System.IO.FileStream(writeFile, System.IO.FileMode.Append);
                // データ保存
                fs.Write(recBuffer, 0, recBuffer.Count());
                fs.Close();
            }
            if (!e.bStopped)
            {
                axWaveIn.AddBuffer(BufferIndex);
            }
        }
と、こんな感じで録音できる。以外と時間がかかった。

次に、再生のソース。
イベント時に再生用のバッファを追加するのを忘れずに。
        private void rec(){
          axWaveOut.Open();
          axWaveOut.Pause();
          for (int bufCnti = 0; bufCnti < axWaveOut.NumBuffers; bufCnti++)
          {
                SizeToPlay = axWaveOut.BufferSize;

                Array.Resize(ref buffer2, SizeToPlay);
                buffer2 = playData.Take(SizeToPlay).ToArray();
                playData = playData.Skip(SizeToPlay).ToArray();

                axWaveOut.SetData(buffer2, (short)bufCnti);
                axWaveOut.AddBuffer((short)bufCnti, SizeToPlay);
           }
            axWaveOut.Restart();
       }
       private void axWaveOut_OnDone(object sender, AxWaveInterfaceLib._DWaveOutEvents_OnDoneEvent e){
                axWaveOut.SetData(buffer2, e.bufferIndex);
                axWaveOut.AddBuffer(e.bufferIndex, SizeToPlay);
       }
と、すごくざっくりしてるけどこんな感じで再生、録音できました。

2013年7月3日水曜日

ブログにソースコードを綺麗に表示させる

ってことで、調べてみました。
「SyntaxHighlighter」ってのがどうやらいいらしい。

Syntax Highlighter Scripts Generator ‹ Blogger Widgets | Tips | Tricks | Templates : Way2Blogging
って、タイトルなげーよ。

「Select a Theme」で見た目を選択。
「Select Brushes」で対象ソースを選ぶらしい。
「Generate」で生成してくれます。
「Copy To ClipBoard」で後は貼り付けるだけです。

とりあえず、テストで貼り付けましょう。 C#でだれもが見るソースです。




        /// <summary>
        /// 使用中のリソースをすべてクリーンアップします。
        /// </summary>
        /// <param name="disposing">マネージ リソースが破棄される場合 true、破棄されない場合は false です。</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);

<pre class="brush: c#;"> </pre>の間にコードを書けばOKです。
Dishes Dishes を参考にさせてもらいました。