カテゴリー: WordPress

  • 最近、jsでrequireが無いと生きれない身体になってしまいました。

    CoffeeScriptから卒業して、ES6でコードを書くようにもしています。ES6のClass構文とかアロー関数が無いと人生辛くなってきました。

    そんなわけで自分はbrowserifyを使ってコードを書いてます。requireを良い感じにコンパイルして1つのファイルにまとめてくれる奴です。

    そんなときに結構困るのがwp_head()や、wp_footer()からscriptタグでjQueryunderscore.jsBackbone.js等の有名処のライブラリが出力される場合があることです。

    functions.phpで無理矢理消しても良いのですがそれは筋が悪そうなので、browserify-shimを使って指定されたライブラリはグローバル変数のものを使うようにします。

    そのコードがこんな感じ。

    gist: https://gist.github.com/torounit/0da591b62d03187b4641

    package.json

    {
      "browserify-shim": {
        "jquery": "global:jQuery",
        "underscore": "global:_",
        "backbone": "global:Backbone"
      },
      "devDependencies": {
        "babelify": "^6.1.3",
        "browserify": "^11.0.0",
        "browserify-shim": "^3.8.10",
        "debowerify": "^1.3.1",
        "gulp": "^3.9.0",
        "gulp-notify": "^2.2.0",
        "vinyl-buffer": "^1.0.0",
        "vinyl-source-stream": "^1.1.0",
        "watchify": "^3.3.0"
      },
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "author": "Toro_Unit",
      "license": "ISC"
    }
    

    gulpfile.js

    'use strict';
    
    // ==================================
    //
    // Config.
    //
    // ==================================
    
    var config = {
        browserify: {
            bundleOption: {
                cache: {}, packageCache: {}, fullPaths: false, //for watchfy.
                debug: true,
                entries: './src/scripts/app.js',
                extensions: ['js', 'jsx'],
            },
            dest: './dist/scripts/',
            filename: 'app.js'
    
        }
    }
    
    // ==================================
    //
    // Load modules.
    //
    // ==================================
    
    var source = require('vinyl-source-stream');
    var browserify = require('browserify');
    var watchify = require('watchify');
    var gulp = require('gulp');
    var notify = require("gulp-notify");
    
    var handleErrors = function() {
        var args = Array.prototype.slice.call(arguments);
        notify.onError({
            title: "Compile Error",
            message: "<%= error.message %>"
        }).apply(this, args);
        this.emit('end');
    };
    
    // ==================================
    //
    // Compile JavaScripts.
    //
    // ==================================
    
    gulp.task('setWatch', function () {
        global.isWatching = true;
    });
    
    gulp.task('browserify', function () {
    
        var b = browserify(config.browserify.bundleOption)
            .transform('babelify')
            .transform("browserify-shim")
            .transform("debowerify");
    
        var bundle = function () {
            b.bundle().on('error', handleErrors)
                .pipe(source(config.browserify.filename))
                .pipe(gulp.dest(config.browserify.dest));
        };
        if (global.isWatching) {
            var bundler = watchify(b);
            bundler.on('update', bundle);
        }
        bundle();
    });
    
    gulp.task('watchify', ['setWatch', 'browserify']);
    

    タスク

    $ gulp browserify //コンパイル
    $ gulp watchify //ファイルの変更を監視して自動コンパイル

    といった格好になります。

    browserify-shim

    browserifyには、transformというAPIがありまして、ここにプラグインを突っ込むことが出来ます。

    アプリケーションコード上のJSから呼び出せるのは通常、node_modulesにインストールされているものか、ファイル名で指定されたJSのみですが、require(‘jquery’) のようなコードを書いたときに、node_modulesではなく、グローバル変数のjQueryを呼んでくることが出来るようになります。

    package.jsonにbrowserify-shimという項目を作ってこんな感じで指定すれば動作します。

    {
      "browserify-shim": {
        "jquery": "global:jQuery",
        "underscore": "global:_",
        "backbone": "global:Backbone"
      }
    }

    debowerify

    debowerifyは、bowerでインストールしたライブラリをrequireやimportできるようにするプラグインです。

    最近オワコンと言われているbowerですが、jQueryプラグインなどをnpmでインストールして持ってくると、そこからnode_modules内のjqueryを取ってきてしまうと言う問題があります。shimの方の設定が悪いのかどうなのか解らないのですが、そんなわけでその手のものは仕方ないのでbowerで持ってきてrequire(import)します。

    npmだけで管理はしたいのでどうにかしたいところです。最悪、jQueryプラグインも普通にscriptタグで読み込ませるコトもたまにやります。

     

    まとめ

    とりあえずこれで、ライブラリの多重インストールを避けつつインストールが出来ます。後はテーマ側で

    $js_path = get_template_directory_uri() . 'dist/scripts/app.js';
    wp_enqueue_script( 'app', $js_path, array( 'underscore', 'jquery' ), '1.0.0', true );
    

    とかやればとりあえずは終了です。

    まぁ、WordPressのunderscore.jsとかBackbone.jsバージョンが古い問題とかもあるんですけどね。。。

     

  • 7/25・7/26の二日間、大阪大学で開催されたWordCamp Kansai 2015に参加してきました。

    今年は宮内さんにお誘い頂いて、東京の堀家さん・長崎のキタジマさん・長野のとろゆにという何とも地方色溢れるメンバーでセッションとハンズオンをやらせて頂きました。

    ワタクシはデプロイ先のサーバーの設定と、自分のプラグインの手動テスト時代の闇を熱く語る担当でした。

    ほぼ初対面のメンバーで45分って・・・思ってたんですけど意外に短いもんですね。

    http://www.slideshare.net/horike37/wordpress-50908456

    http://www.slideshare.net/inc2734/word-campkansai2015-ci

    サーバー自体はあと少しの間は立てておくので、ハンズオン参加者の人は遊んでみて下さい。
    ハンズオン出てないよ!って人とか、サーバーつながらないよーって人は、

    あたりを見るといろんなサーバーでも出来るのでやってみて下さい。

    他には、2日目のリアルフォーラムの回答者をやらせて頂きました。凄い人たちばかりだったのでだいたい全部しゃべって頂いたのでほとんど回答してなかった気はしますが、仕事上の立場や規模、地域などもバラバラなのにほとんど結論が変わらないのがおもしろかったです。行き着くところはだいたい一緒なんですかね。

    http://www.slideshare.net/fukazawakojiro/wordcamp-kansai-2015-wordpressorg

    その他の時間はずーっとコントリビュートスタジオに引きこもっていたのでセッション全然見てないです。後でスライドとか動画を見返したいと思います。

    関西や九州の方々はTwitterやFacebook、Githubやりとりは結構多いのですが、実は話したコト全然無い人たちがたくさん居たのでいろいろ話せたのがとにかく楽しかったです。ネットだと、Contact Form 7の三好さんとWP Multibyte Patchのてんぷらさんの滅茶苦茶濃度の濃い雑談なんて絶対聞けないですし。

    反省とか次回までのTodoとか。

    2日間朝から夜までみたいなのもスピーカーやったのも初めてだったし、いろいろ反省というか。

    飲み過ぎない。

    前日から、2日目の打ち上げまでアホみたいに飲んでました。ずーっと内臓の調子は悪かったような気がします。別に飲まなくても楽しいので、お酒はほどほどにしましょう。

    キタジマさんいろいろごめんなさい。

    あとホテルに戻るときにiPad落として画面割りました。せつないです。

    Tシャツは多めに持っていくor現地調達

    松本市とは湿度がだいぶ違うので、体感温度の差がやばいです。ずーっとサウナに居る気分でした。午前中の時点で汗だくでTシャツが気持ち悪かったです。

    英語のリスニングを勉強する

    WooCommerceの中の人も居て懇親会などでいろいろお話させて頂いたり、プルリクします!みたいな話もさせて貰ったのですが、英語しゃべれたら絶対楽しいと思ったので、英語を聞く耳をちゃんと作ろうと思います。

    感想とか

    とりあえず、YATさんに「ずーっとにこにこしてるねー」って言ってもらえる位楽しんでいたようです。

    地元のビール祭りや学生のイベントに関わらせて頂くことも多いですが、イベントを一から作り上げるって本当にすっごいことだと思います。スタッフの皆さん本当にありがとうございます。

    またそう遠く無いうちに大阪に行くことになりそうなので、直接お礼を言わせて頂ければと思います。ありがとうございました。

     

  • Simple Post Type Permalinks 1.1.0 をリリースしました。

    Simple Post Type Permalinks をアップデートしました。

    ダウンロードはこちら。https://ja.wordpress.org/plugins/simple-post-type-permalinks/

    • get_post_type_archive_linkをサポート
    • WPMLやWooCommerceとの動作テスト
    • アクションフックやフィルターフックの追加
    • テストコードを追加

    等の変更を行っています。

    プルリクなどお待ちしてますー!

    Github Repository

     

  • 最近はconcrete5でおなじみの菱川さんが作った、Really Simple CSV Importerというプラグインがありまして。よくお世話になってます。

    この間、画像データを投稿に紐付ける必要がありまして。

    出来れば画像はWordPressのメディアとして管理して、カスタムフィールドに画像のIDを突っ込めればなー。カスタムフィールドにURL突っ込めばダウンロードしてこれないかなーって要件がありましてた。

    ということで、Really Simple CSV Importerのアドオンプラグインを作りました。

    RS CSV Importer Media Add-Onというまんまな名前のプラグインです。

    一昨年くらいにフォークしてその機能をつけたりしてたのですが、URLをそのまま使いたいこともあったりで、アドオンにしておいた方がいろいろ便利だなと言うことで。

    使い方

    Really Simple CSV Importerをインストールして有効化した後、RS CSV Importer Media Add-Onをインストールして有効化して下さい。

    その後はReally Simple CSV Importerの使い方と一緒です。カスタムフィールドの欄に画像などWordPressのメディアとして扱えるファイルのURLが存在した場合、ダウンロードして記事のカスタムフィールドの値をメディアのIDに変更します。

    CSVのサンプルはこちらを参考にして下さい。https://github.com/torounit/rs-csv-importer-media-addon/blob/master/sample/linux.csv

    IDにして保存するので、モンキーレンチのキタジマさんSmart Custom Fieldsとも相性が良かったりします。

    インポートするファイルの拡張子の設定

    really_simple_csv_importer_media_ext2typeというフィルターフックを作りました。

    これにフックすると、インポートするファイルの拡張子を変更することが出来ます。これで、画像はダウンロードするけどPDFへのURLはそのまま、みたいなことも出来るようになってます。

    Sample Code
    add_filter('really_simple_csv_importer_media_ext2type', 'really_simple_csv_importer_media_ext2type');
    
    function really_simple_csv_importer_media_ext2type( $types ) {
        return array(
            'image'       => array( 'jpg', 'jpeg', 'jpe', 'gif', 'png' ),
            'audio'       => array( 'mp3', 'ogg', 'wav', 'wma' ),
            'video'       => array( 'mov', 'mp4', 'mpeg', 'mpg', 'ogm', 'ogv', 'wmv' ),
            'document'    => array( 'doc', 'docx', 'odt', 'pages', 'pdf', 'psd' ),
            'spreadsheet' => array( 'ods', 'xls', 'xlsx' ),
            'interactive' => array( 'swf', 'key', 'ppt', 'pptx', 'odp' ),
            'text'        => array( 'asc', 'csv', 'tsv', 'txt' ),
            'archive'     => array( 'dmg', 'gz', 'rar', 'tar', 'tgz', 'zip'),
            'code'        => array( 'css', 'htm', 'html', 'php', 'js' ),
        );
    }

    使い方wp_ext2typeへのフックと変わらないです。というか内部的にはこれ使ってます。なのでデフォルトでは、wp_ext2typeが許可しているモノを全て許可します。svgなどWordPressがアップロードを許可してないモノはまた別に設定が必要です。WordPressの管理画面からアップロード可能なモノのみ受け付けます。

    レポジトリ

    Github: https://github.com/torounit/rs-csv-importer-media-addon

    バグなどあったらプルリク下さいー。

  • ちょっと報告が複数あったので対処法などをまとめておきます。

    wp_loaded のactionの最後のほうで、Rewrite Ruleの登録を行うように変更したことに絡んで発生した不具合です。

    flush_rewrite_rulesをregister_post_typeやregister_taxonomyの直後に動作させている場合に発生します。

    register_post_type( 'hoge', $post_type_args );
    register_taxonomy( 'piyo', 'hoge', $taxonomy_args );
    flush_rewrite_rules();

    flush_rewrite_rulesはURLをどのように分解するかというRewrite Ruleというモノを全て削除し再生成するものです。このRewrite Ruleを参照してWordPressはURLを理解しています。

    flush_rewrite_rulesはとても重いので毎回実行すべきものでは無いです。ではいつ動作するのかと言うことですが、管理画面のパーマリンク設定を更新したときに実行されます。そのときに、Rewrite Ruleはデータベースに保存されます。

    参考:

    Custom Post Type Permalinks 1.0.0からは、register_post_typeやregister_taxonomyの時点でrewrite_ruleの登録を行いません。その段階でflush_rewrite_rulesを実行してしまうと、変更されていないモノから生成してしまうので404になってしまうと言うことです。

    Codexでもflush_rewrite_rulesは毎回に動作させるのはバットプラクティスだと名言されているので、この問題についてプラグイン側で修正をする予定はありません。

    もし、flush_rewrite_rulesをregister_post_typeやregister_taxonomyの後に動作させている場合は、flush_rewrite_rulesを削除してください。

  • Custom Post Type Permalinks

    Custom Post Type Permalinks 1.0.0 をリリースしました。

    Plugin Directory: https://wordpress.org/plugins/custom-post-type-permalinks/

    変更点

    wp_loaded のactionの最後のほうで、Rewrite Ruleの生成を行うように変更しました。

    投稿タイプとタクソノミーが絡むパーマリンクの生成時の不具合の修正のための仕様変更です。

    カスタムタクソノミーのアーカイブの時に、post_typeのクエリを渡せるようにしました。

    管理画面から設定できます。これを渡すと、タクソノミーテンプレートより、カスタム投稿タイプのアーカイブテンプレートが読まれます。

    register_post_typeでパーマリンクを設定できるようにしました。

    register_post_type( 'foo',
        array(
            "public" => true,
            'has_archive' => true,
            "rewrite" => [
                "with_front" => true
            ],
            "cptp_permalink_structure" => "%post_id%"
        )
    );

    こんな感じで、設定できるようになってます。管理画面の設定より優先されます。

    バージョン番号をセマンティックバージョニングにしました。

    Plugin Directoryからアクティブなバージョンが見えるようになったというのもあったりで、セマンティックバージョニングするようにしました。なので、とりあえず、1.0.0です。

    その他、バグFix等多数です。

    Other Notes

    プルリク、バグレポート等、くださいー。

    @Toro_Unit

    Github. https://github.com/torounit/custom-post-type-permalinks

    最近プラグインリリース祭りなのですが、姉妹品のSimple Post Type Permalinksや、Powerful Posts Per Page(PPPP)等もよろしくお願いします。

     

    お酒とか下さい。

    Wish List. http://www.amazon.co.jp/registry/wishlist/COKSXS25MVQV/

     

  • pppp

    WordPressの1ページあたりの投稿数(Posts Per Page)を、タクソノミーやカスタム投稿タイプで個別に設定できるようにするプラグイン、Powerful Posts Per Pageの0.8.0をリリースしました。

    1年以上放置してたので、久々の更新です。というか2013年にリリースしたプラグインだったんですね。もっと最近だと思っていたのですが。

    今回のアップデートでは、4.2等でのテスト、テストコードの追加、Classをファイルごとに分割などです。

    内容はほとんど変更してないです。

    これからも細々とメンテナンスしていきます。

     

    Plugin Directory: https://wordpress.org/plugins/pppp/

    Github: https://github.com/torounit/pppp

    プルリクエストなど、お待ちしてますー。

  • WordPress のカスタム投稿タイプのパーマリンクを簡単に変更できるようになるプラグイン「Simple Post Type Permalinks」作った。

    Simple Post Type Permalinks というプラグインをリリースしました。

    名前通り、投稿タイプごとにパーマリンクを設定できるプラグインです。どこかで聞いたことのあるような名前のプラグインですが、それとはまた別物です。

    できること

    • カスタム投稿タイプごとにパーマリンクを設定。%post_id%%postname%が使用可能。
    • register_post_typeで、パーマリンク構造の定義。

    の2種類です。

    できないこと

    • タクソノミー(カテゴリーやタグを含む)等には対応してません。
    • 日付、著者などのタグも使えません。
    • %post_id%%postname%だけしか使えません。
    • アーカイブのパーマリンクを自動的に追加しません。

    とにかく、シングルページのパーマリンクのカスタマイズだけが可能です

    使い方

    管理画面は、こんな感じです。

    sptp

    例のプラグインと同じく「パーマリンク設定」のページの下にパーマリンク設定のセクションがあります。そこから、適当にパーマリンクを設定して下さい。投稿タイプのスラッグを入れない設定などもできますが、投稿や固定ページのパーマリンクと競合すると404になったりします。

    もしくは、register_post_typeで投稿タイプを定義する際にパーマリンクをコードで設定します。

    register_post_type( 'hoge',
        array(
            "public" => true,
            "sptp_permalink_structure" => "foo/%post_id%"
        )
    );

    開発の理由

    Custom Post Type Permalinksというプラグインをすでにリリースしてますが、その機能縮小版のようなプラグインをなぜリリースしたかってコトなんですケド。

    別に、Custom Post Type Permalinksの開発・メンテナンスは止めません。細々とこれからもやりますよー。

    Custom Post Type Permalinksには、パーマリンクの変更のほかにも、日付アーカイブ、カスタムタクソノミー、いろんな機能が入ってたりします。

    それはそれでいいんですけど、「別に日付アーカイブとか要らないし!」ってときに逆に面倒だったり。かといって設定項目追加したらそれもそれで訳わからんなぁー、ってことになり、とにかくシンプルにカスタム投稿タイプの記事のパーマリンク変更するだけのプラグインを作ったということです。

    なので、同じようなプラグインですけど方向性が違います。そのため、Simple Post Type Permalinksでは投稿タイプのスラッグを無視したパーマリンクも設定できるようになってます。

    あとは単純に、Custom Post Type Permalinksを書き直したい欲を満たすためでもあったりします。

    PHP 5.3以上でしか動作しません。PHP 5.2だと、ファイルが読まれないようにしてます。

    とりあえず、プルリクとか待ってますー!

    Github: https://github.com/torounit/simple-post-type-permalinks

  • WordPressでカスタム投稿タイプ + カスタムフィールドってのはよくある話だとは思いますけど、管理画面に表示させたいってことが結構あったので、クラスを書いて簡単に扱えるようにしました。

    並べ替えにも対応しているので、イベントや、商品などを扱うときに便利かと思います。

    2015-02-19

    つまり、こんな感じです。イベントカレンダーなので、並べ替えができるといろいろ便利だったりします。

    コード

    コードはこんな感じです。gistに上げてあるので適当に使って下さい。細かい説明をやり出すとかなり長いのでそこら辺は割愛します。日時欄の前にカスタムフィールドを追加します。

    無名関数や配列の短縮構文を使っているので、PHP5.4以上で動作します。そこらへん適当に直せばもっと古い環境でも動くと思います。

    https://gist.github.com/torounit/64d66203042459a6d25b

    第4引数の$is_numをtrueにすると、並べ替え時に文字列ではなく、数字として並び替えます。価格欄などはtrueにしておくと便利かもしれません。

    また、取得するカスタムフィールドを表示する前に、フィルターをつけてあります。

    それを使うと、

    • カスタムフィールドには画像のIDを保存し、wp_get_attachment_imageなどで、画像を表示する
    • 日付のフォーマットの変更
    • 価格欄に単位をつけて表示
    • WordPressという文字列のPをちゃんと大文字にする

    等のことができるようになります。

    あまり知られてないですけど、管理画面周りでできる事って地味に多いですね。

  • WordPressでカスタムフィールドを使って日付を入力させたりする、なんてことはよくある話だと思います。

    ただしWordPressでは、wp-settings.phpで以下のコードが実行されて、タイムゾーンがUTCに変更されます。

    date_default_timezone_set( 'UTC' );

    なので、PHPのtimezoneの設定がどうなっていようと、UTCになってしまいます。なので、unixtime等を扱うときはかなり注意が必要だったりします。

    対処法

    その1 時差分を追加

    get_option('gmt_offset')で、WordPressで設定されているUTCとの時差が取得できますので、それをmktimeや、strtotimeの返却する値に追加します。

    <?php
    function local_mktime() {
     $defaults = array(
     date("H"),
     date("i"),
     date("s"),
     date("n"),
     date("j"),
     date("Y"),
     -1,
     );
     $args = func_get_args();
     $param = array_merge( $defaults, $args );
     $offset = get_option('gmt_offset') * 60 * 60;
     return mktime( $param[0], $param[1], $param[2], $param[3], $param[4], $param[5], $param[6]) + $offset;
    }
    
    function local_strtotime( $time, $now = null ) {
     $offset = get_option('gmt_offset') * 60 * 60;
     if( $now == null ) {
     $now = time();
     }
     
     return strtotime( $time, $now ) + $offset; 
    }

    その2 一時的にタイムゾーンを変更する

    date_default_timezone_get()で現在のタイムゾーンを取得、date_default_timezone_set( $timezone )で、タイムゾーンを変更できます。なので、これを使って、一時的にタイムゾーンを変更できます。

    <?php
    function local_mktime() {
     $defaults = array(
     date("H"),
     date("i"),
     date("s"),
     date("n"),
     date("j"),
     date("Y"),
     -1,
     );
     $args = func_get_args();
     $param = array_merge( $defaults, $args );
    
     $internal_timezone = date_default_timezone_get();
     date_default_timezone_set( 'Asia/Tokyo' );
    
     $timestamp = mktime( $param[0], $param[1], $param[2], $param[3], $param[4], $param[5], $param[6]);
    
     date_default_timezone_set( $internal_timezone );
    
     return $timestamp;
    }
    
    function local_strtotime( $time, $now = null ) {
     $offset = get_option('gmt_offset') * 60 * 60;
     if( $now == null ) {
     $now = time();
     }
    
     $internal_timezone = date_default_timezone_get();
     date_default_timezone_set( 'Asia/Tokyo' );
    
     $timestamp = strtotime( $time, $now ); 
    
     date_default_timezone_set( $internal_timezone );
    
     return $timestamp;
    
    }

    時差の絡んだ日付の変換はかなりややこしいです。timestampにする必要が無いところはstr_replace等で数値文字列に変換して対処する等する方が、バグなどを埋め込まずに済みそうです。

  • 【助けて】WordPressで不審なユーザーが管理者権限で新規登録されていたんですが。。。 | ラブグアバ

    とりあえず、安全そうなバックアップから復旧しようぜ。としか言えないのですが、それすらない場合にとりあえずやること。

    WordPress・プラグイン・テーマの再インストール

    所謂普通のレンタルサーバーで何も考えずに、WordPressをインストールした場合、テーマ・プラグインが編集できてしまいます。

    つまり、何でもできてしまいます。

    PHPファイルも編集できてしまい、そこからさらに既存のファイルを書き換えたりできてしまうので、WordPressの本体、プラグイン、テーマ、そのほかサーバー上に不正なファイルがないかどうかの検証が必要になってきます。

    正直、検証とかやってられないので、真っ新な環境作って再インストールしましょう。

    wp-config.phpに

    define( 'DISALLOW_FILE_EDIT', true );

    を記述すると、この機能を無効にできます。

    wp-config.php の編集 – WordPress Codex 日本語版

    記事データの検証

    記事データ本文をエクスポートして、変なscriptタグが無いか検査します。結構面倒だとは思いますが、変なサイトへのリダイレクトなどが含まれてないか位は最低限チェックしないとだめな気はします。


    とりあえず、バックアップって大事だなぁって思います。

    あと、パーミッションを適切に設定する、使わない機能を無効にする、信用ならないプラグイン・テーマは使わない、使わないプラグインは消す、あたりは必ずやっておくこと。

    Crazy Bone突っ込んでログイン履歴を取っておく、Spirits and Goblinsで2段階認証を導入するあたりはやっておくと安心かなぁと個人的には思ってます。

    一度不正ログインとか改ざんとかやられると、極論、全てのデータ・ファイルを検査するか破棄するしか安全性が保証できないので、すげー大変だったりします。

    やっぱり事件が起こる前にちゃんとセキュリティには気をつけておきましょう。

  • Custom Post Type Permalinks

    毎度おなじみ、Custom Post Type Permalinks をアップデートしました。

    アップデート内容

    • 階層有りタクソノミーで親にも子にもチェックが入っていた時の挙動を修正
    • %category%と%author%に対応
    • フランス語翻訳
    • テストをすこしずつ導入

    と細かいfixになります。

    プルリクとかくださいー!クリスマスプレゼントとかお年玉ください。