あままこのブログ

役に立たないことだけを書く。

ムーミン問題は良問か悪問か論争まとめ

ムーミン』がどこを舞台にした物語であるかという問題がセンター試験で出され

  • この問題の正答が本当に正答といえるのか
  • センター試験の問題として良問なのか悪問なのか

を巡って、論争が巻き起こっています。

問題について

this.kiji.is
f:id:amamako:20180115221317j:plain

この問題は良問である・問題ないとする立場

blog.goo.ne.jp

  • ムーミンのことをまったく知らなくても解ける問題である
  • 「実生活・実社会と勉強のつながり」に気付くきっかけになる

blogs.itmedia.co.jp

  • 勉強が社会で役に立つのか?という疑問を持つであろう高校生へのメッセージが含まれている

d.hatena.ne.jp

  • 問題文前後の文脈から見て答えは明白であり、問題視するのは馬鹿馬鹿しい

この問題は悪問である・問題あるとする立場

www.sfs.osaka-u.ac.jp

  • ムーミン』がフィンランドを舞台としているものとは断定できない
  • 小さなバイキングビッケ』がノルウェーを舞台としているとも断定できない
  • この設問は解答不能である
  • フィンランド文化の多言語性、とりわけフィンランドにおいてはスウェーデン語のような少数言語の存在を無視する危険性を孕む設問である
  • 日本アニメがつくりあげたステレオタイプな北欧イメージを根拠とする今回の設問は -- 現地語を学ばなくても北欧の実像に迫ることができるといったような安易な発想を植え付けてしまい -- 日本社会に対しては、現地語情報に基づかないことで、多言語・多文化社会のようなリアルな北欧の実像から乖離したイメージを再び広げてしまう危険性を孕んでいる

新聞記事・ネットニュース等

www.asahi.com www.asahi.com nlab.itmedia.co.jp www.sankei.com www.sankei.com this.kiji.is www.nikkei.com

感想

ざっと見たところ、高校教諭や非研究者の間では「良問」と評価する声が多く、逆に研究者の間では「悪問」と評価する声が多いみたい。多分その背景には「わからない問題には安易に答えを出さない」ことを美徳とする、大学の学問の価値観と、「わからない問題でもとにかく答えを出す」ことを美徳とする高校までの教育や、実学の価値観の対立があるのかなーと思ったり。
僕自身の感想としては、「わからない問題はわからないと認める」ことこそが美徳だと思うので、そもそも断定することができない問題で断定することが要求されるこの問題は「悪問」だと思う。
ただ、そうは言っても、そういう悪問に備える学生を受験教育は作り出さなきゃいけないのは事実なわけで、だから高校教諭たちは、それが学問的にはおかしいことを認めつつも、受験テクニックで簡単に解くことができるこの問題が「良問」であると主張してるのかなーと推測します。
でもやっぱり僕は、個人的な好みから言えば、この問題を見たときに、何の疑問も持たず反射的に正答を答えられる人より、ちょっと立ち止まって「うーん……」と考え込んでしまう、そういう人のほうが、受験で不利だとしても「知性」ある人なんじゃないかと思うし、そういう人間こそを高等教育は育てるべきなんじゃないかと思うんだけどね。
そういう「立ち止まる知性」こそが、フェイクやデマがまかり通る日本に今必要とされるんじゃないか、とも。

バーチャルYoutuberが保守速報をRTする日

なんか今インターネット上では、CGモデルを用いてYoutuberをする、バーチャルYoutuberとやらが人気を博しているそうです。
そしてそんな中で、あるYoutuberがまとめブログを好意的に紹介したとかで炎上していたそうです。 togetter.com cr.hatenablog.com で、それらの炎上については、ぶっちゃけそんなに興味もなかったのですが、ふと似非原氏がこの騒動に関連して、こんな発言をしているのがTwitterで目に入りました。

日本のインターネットの歴史からすれば、この予想はおそらく当たると思うんですよ。

VNIネット右翼

そもそも、バーチャルYoutuber自体、技術的な側面を無視して「萌えキャラクターの姿形を借りてインターネット上で何かの表現をする」という点に注目すれば、そんなに新しいものではないわけです。VNIバーチャルネットアイドル)が技術的に進歩したものに過ぎないとも言えるわけで。
そしてVNIの中には、ネット右翼っぽい主張、つまり嫌韓・嫌中・嫌朝日みたいな主張をするVNIも多かったわけです。例えばVNIの代表的なサイトである「ちゆ12歳」についてはこんな議論が起きたことがありましたし。 d.hatena.ne.jp d.hatena.ne.jp bund.jp ちゆ12歳は、今でいえばいわゆる「冷笑系」というカテゴリに入るのでしょうが、そうではなく、ベタにネット右翼ネット右翼的な主張をするVNIも数多くいました。多くのサイトはすでに閉鎖していますが、中には↓のように生き残っているVNIもあったりします。 www.amaochi.com (しかし1999年からずっと続いてるってすげーな……)
そんなわけで、VNIであったことなんだから、それがバーチャルYoutuberで起きたとしたって、何の不思議もないわけです。
(さらに言えば、普通のYoutuberだって、KAZUYAみたいにネット右翼がそのまんまYoutuberになったような人がいるわけなんですから、バーチャルになってそういう人が現れないと思う方がむしろ不自然なわけで)

あくまで「キャラクターの政治利用に反対」を貫くのか、対抗して左派系バーチャルYoutuberを立ち上げるのか

さて、ではそういうネット右翼バーチャルYoutuberが現れた時、どう対抗していくべきか。
僕の基本的な立場は、これまで書いた記事

amamako.hateblo.jp amamako.hateblo.jp で何回も述べてきましたが、右であれ左であれ、二次元のキャラクターに自分の政治的主張を仮託するなです。その点からいえば、あくまで「キャラクターの政治利用」そのものを批判するのが、正しいやり方でしょう。
でもなー、正直そうやって方法論の正しさにこだわり続けてきたから、左派はいつまでたってもネット上でヘゲモニーを奪取できないんじゃないかという感じもするんですよね。
むしろ、相手がそういう絡め手を取ってくるなら、こっちもそれを利用しない手はないわけで、いわゆる左派系バーチャルYoutuber、保守速報やnetgeekに対抗するリテラみたいな立場のバーチャルYoutuberを立ち上げちゃうというのだって、選択肢としてはないわけではないわけです。
……うーん、でもその先に待ってるのは、右と左の美少女キャラクターが、Youtubeの動画上でバトルしあう、地獄絵図だよなあ。いやまあ、そんな地獄絵図こそ、実は健全な民主主義の形なのかもしれないけど、ねぇ。

「戦時下」のおたく

「戦時下」のおたく

Amazon Echoに今NHKで放送している番組を教えてもらう (Alexa Skills Kit & AWS Lambda & NHK番組表API)

Amazon Echo Dotがやっと家に来ました。

Amazon Echo Dot (Newモデル)、ブラック

Amazon Echo Dot (Newモデル)、ブラック

ので、こいつでも何か自作のアプリを作ってみようと思い、前の記事 amamako.hateblo.jp で作ったものと同じような機能を持つアプリの、Amazon Alexa版を作ってみることにします。 結果がこちらです。


Amazon Echoに今NHKで放送している番組を教えてもらう

作り方

下記のページの「スキル開発を始める」をクリックし、Amazonのアカウント情報を入力して開発を始めます。 developer.amazon.com https://gyazo.com/56e3c2188f80c9e562078668d0c0311b
Alexa Skill Kitの「始める」をクリック。
https://gyazo.com/7bd9aeebc64557c08de2480b9618218a
「新しいスキルを開発」をクリック。 https://gyazo.com/a233219432163db35de4e0207a9f58eb 「カスタム対話モデル」を選択し、言語・スキル名・呼び出し名などを入力していき、画面下部の「次へ」をクリックします。
https://gyazo.com/fb95eb9021ea74fb1d3cc87a6566189b
そうするとこの画面になります。
ここで前回の記事でも行ったように、IntentやSlots(前回の記事で言うEntities)の登録を行っていきます。 Intentとは要するに「こういう文がきたらこういう機能を呼び出すよ」という文例の定義で、Slotsは「文中にこういう単語が入りうるよ」という単語集の定義です。詳しくは公式のドキュメント
developer.amazon.com
や解説記事
dev.classmethod.jp
などをご参照ください。
ただ、実はこの画面からは簡易的な定義しかできません。ちょっと複雑な定義、例えば同じ単語に2つ以上呼び名がある場合などのSlotsの定義はここからはできないので、画面の「スキルビルダーを起動する」からスキルビルダーを起動します。
https://gyazo.com/fd9407a6d7fd2dc9f0f6608e0ae255dc
そうするとこんな画面が出てきます。ここでCode Editorを選択し
https://gyazo.com/9562fc63138f4e13e1768b3e9da33e6e
以下のコードを入力。「Apply Changes」、「Save Model」、「Build Model」とクリックしていきます。

{
  "languageModel": {
    "types": [
      {
        "name": "LIST_OF_STATIONS",
        "values": [
          {
            "id": "sougou",
            "name": {
              "value": "NHK総合テレビ",
              "synonyms": [
                "総合テレビ",
                "NHK",
                "総合",
                "nhk 総合テレビ",
                "nhk"
              ]
            }
          },
          {
            "id": "etv",
            "name": {
              "value": "NHK教育テレビ",
              "synonyms": [
                "教育テレビ",
                "教育",
                "nhk 教育テレビ"
              ]
            }
          },
          {
            "id": "bs1",
            "name": {
              "value": "NHKBS1",
              "synonyms": [
                "BS1",
                "nhkbs1"
              ]
            }
          },
          {
            "id": "bspremium",
            "name": {
              "value": "NHKBSプレミアム",
              "synonyms": [
                "BSプレミアム",
                "nhk bsプレミアム",
                "bsプレミアム"
              ]
            }
          }
        ]
      }
    ],
    "intents": [
      {
        "name": "AMAZON.CancelIntent",
        "samples": []
      },
      {
        "name": "AMAZON.HelpIntent",
        "samples": []
      },
      {
        "name": "AMAZON.StopIntent",
        "samples": []
      },
      {
        "name": "GetTVProgram",
        "samples": [
          "{Station} で放送している番組を教えて",
          "{Station}"
        ],
        "slots": [
          {
            "name": "Station",
            "type": "LIST_OF_STATIONS"
          }
        ]
      }
    ],
    "invocationName": "ほたるの番組表"
  }
}

それぞれの定義の意味、特にidやsynonymsについては、下記のドキュメントを見てください。
developer.amazon.com
次に、画面の「Configuration」をクリックします。するとこんな画面が出てきます。
https://gyazo.com/60c2bf20383609acc07925b545780e1a
前回の記事ではFirebaseを用いてバックグラウンドの処理を実装したわけですが、今回はAmazonのサービスなのでAWS Lambdaを用います。
というわけでAWSのコンソールに入り、Lambdaを選択。
https://gyazo.com/c5457b6336fe8245f32f5d9f514bd6ad 「新しい関数を作成」を選択。 https://gyazo.com/2c3552f64222a01150052ee4cca87ce1
「設計図」を選択し、下の検索欄に「Alexa」と入力するとAlexaのテンプレートが出てくるので、「alexa-skills-kit-color-expert」を選択し、「設定」をクリックします。
https://gyazo.com/574c431f7e1b3ce6cc3dcbe12667c96f
すると以下のような画面が出てくるので、名前を入力し、ロール(アプリが他のAWSのリソースにアクセスする権限をまとめたもの)としてテンプレートから新しいロールを作成、ページ下部にある「関数を作成」をクリックします。 そうすると以下のような画面が出てきます。
https://gyazo.com/ab3d12f8d6a07630059376970f60dec2
コード編集欄でコードを編集していきます。今回のアプリではテンプレートをもとに以下のようなコードにしました。

'use strict';

const http = require('http');
const AREA = '';//取得したい番組表の地域ID
const API_KEY = '';//ここにNHK番組表のAPI_KEYを入れておきます。

/**
 * This sample demonstrates a simple skill built with the Amazon Alexa Skills Kit.
 * The Intent Schema, Custom Slots, and Sample Utterances for this skill, as well as
 * testing instructions are located at http://amzn.to/1LzFrj6
 *
 * For additional samples, visit the Alexa Skills Kit Getting Started guide at
 * http://amzn.to/1LGWsLG
 */


// --------------- Helpers that build all of the responses -----------------------

function buildSpeechletResponse(title, output, repromptText, shouldEndSession) {
    return {
        outputSpeech: {
            type: 'PlainText',
            text: output,
        },
        card: {
            type: 'Simple',
            title: title,
            content: output,
        },
        reprompt: {
            outputSpeech: {
                type: 'PlainText',
                text: repromptText,
            },
        },
        shouldEndSession,
    };
}

function buildResponse(sessionAttributes, speechletResponse) {
    return {
        version: '1.0',
        sessionAttributes,
        response: speechletResponse,
    };
}


// --------------- Functions that control the skill's behavior -----------------------

function getWelcomeResponse(callback) {
    // If we wanted to initialize the session to have some attributes we could add those here.
    const sessionAttributes = {};
    const cardTitle = 'こんにちわ';
    const speechOutput = 'こんにちわ、ほたるの番組表です。 ' +
        'いま放送している番組を知りたい、テレビ局を教えて。';
    // If the user either does not reply to the welcome message or says something that is not
    // understood, they will be prompted again with this text.
    const repromptText = 'いま放送している番組を知りたい、テレビ局を教えて。';
    const shouldEndSession = false;

    callback(sessionAttributes,
        buildSpeechletResponse(cardTitle, speechOutput, repromptText, shouldEndSession));
}

function handleSessionEndRequest(callback) {
    const cardTitle = 'Session Ended';
    const speechOutput = 'さようなら。';
    // Setting this to true ends the session and exits the skill.
    const shouldEndSession = true;

    callback({}, buildSpeechletResponse(cardTitle, speechOutput, null, shouldEndSession));
}

/**
 * Sets the color in the session and prepares the speech to reply to the user.
 */
function getTVProgram(intent, callback) {
    const cardTitle = "いま放送している番組";
    const stationNameSlot = intent.slots.Station;
    let repromptText = '';
    let sessionAttributes = {};
    let shouldEndSession = true;
    let speechOutput = '';
    const tvStation = {
        "sougou": "g1",
        "etv": "e1",
        "bs1": "s1",
        "bspremium": "s3"
    };
    console.log("called Station Name");
    console.log(stationNameSlot.value);
    let tvStationId = undefined;
    let tvStationName = undefined;
    if(stationNameSlot.resolutions 
        && stationNameSlot.resolutions.resolutionsPerAuthority[0].values
        && tvStation[stationNameSlot.resolutions.resolutionsPerAuthority[0].values[0].value.id] ){
        tvStationId = tvStation[stationNameSlot.resolutions.resolutionsPerAuthority[0].values[0].value.id];
        tvStationName = stationNameSlot.resolutions.resolutionsPerAuthority[0].values[0].value.name;
    }
    if (tvStationId) {
        shouldEndSession = true;
        //オプションを定義
        var url = 'http://api.nhk.or.jp/v2/pg/now/' + AREA + '/' + tvStationId + '.json?key=' + API_KEY;
        http.get(url, function(res) {
          var body = '';
          res.setEncoding('utf8');
          res.on('data', function(chunk) {
            body += chunk;
          });
          res.on('end', function() {
            var ret = JSON.parse(body);
            speechOutput = `いま ${tvStationName} で放送している番組は` + ret.nowonair_list[tvStationId].present.title + 'です'; // Send simple response to user\
            repromptText = speechOutput;
            callback(sessionAttributes,
                buildSpeechletResponse(cardTitle, speechOutput, repromptText, shouldEndSession));
          });
        }).on('error', function(e) {
          console.log(e.message);
        });
    } else {
        shouldEndSession = false;
        speechOutput = "すみません、よくわかりません。";
        repromptText = "すみません、よくわかりません。";
        callback(sessionAttributes,
            buildSpeechletResponse(cardTitle, speechOutput, repromptText, shouldEndSession));
    }

}


// --------------- Events -----------------------

/**
 * Called when the user launches the skill without specifying what they want.
 */
function onLaunch(launchRequest, callback) {
    console.log(`onLaunch requestId=${launchRequest.requestId}`);

    // Dispatch to your skill's launch.
    getWelcomeResponse(callback);
}

/**
 * Called when the user specifies an intent for this skill.
 */
function onIntent(intentRequest,callback) {
    console.log(`onIntent requestId=${intentRequest.requestId}`);

    const intent = intentRequest.intent;
    const intentName = intentRequest.intent.name;

    // Dispatch to your skill's intent handlers
    if (intentName === 'GetTVProgram') {
        getTVProgram(intent, callback);
    } else if (intentName === 'AMAZON.HelpIntent') {
        getWelcomeResponse(callback);
    } else if (intentName === 'AMAZON.StopIntent' || intentName === 'AMAZON.CancelIntent') {
        handleSessionEndRequest(callback);
    } else {
        throw new Error('Invalid intent');
    }
}


// --------------- Main handler -----------------------

// Route the incoming request based on type (LaunchRequest, IntentRequest,
// etc.) The JSON body of the request is provided in the event parameter.
exports.handler = (event, context, callback) => {
    try {


        if (event.request.type === 'LaunchRequest') {
            onLaunch(event.request,
                (sessionAttributes, speechletResponse) => {
                    callback(null, buildResponse(sessionAttributes, speechletResponse));
                });
        } else if (event.request.type === 'IntentRequest') {
            onIntent(event.request,
                (sessionAttributes, speechletResponse) => {
                    callback(null, buildResponse(sessionAttributes, speechletResponse));
                });
        } else if (event.request.type === 'SessionEndedRequest') {
            callback();
        }
    } catch (err) {
        callback(err);
    }
};

コードを入力後、関数を保存、ARNをコピーし、Configurationの画面に戻り入力、「次へ」を入力すると、自身のAmazon Echoでアプリを動かすことが可能になります。

感想

スマートスピーカーのアプリの作り方は、Google AssistantもAmazon Alexaも似たようなものみたいですね。

元始ブロガーは太陽であった

元始、ブロガーは実に太陽であった。真正の人であった。
今、ブロガーは月である。アフィリエイトに依って生き、PV数によって輝く、病人のやうな青白い顔の月である。

「読まれるテキストは読者へのおもてなしの構造を持っている」という記事を読んで

mizchi.hatenablog.com この記事、はてブでは主に文章作法として読まれたりして、そしてそういう面から論評する記事とかもある*1わけだけれど、著者が本当に言いたいことは、下記を読むと、むしろそういう文章技法が求められる、日本のウェブ空間への苛立ちのように思えてならないのです。

大学生だった当時、梅田望夫の本を読んではてなにやってきた僕は、ブログ論壇への憧れだけがあって、技術者にもなれず、時流のテーマに対して書くべきテーマを持たず、ただ実家の宗教に対する恨みだけを書き綴っていた。

なぜ僕がそんな読み方をするかといえば、それこそ、「はてなブログ」がまだ「はてなダイアリー」であり、「はてなブックマーク」との間である種幸福な蜜月関係か成立し、まさしく「ブログ論壇」というものが存在していた、そんな時代を知っているからです。
それは、もしかしたら過去というものへのありふれたノスタルジーに過ぎないのかもしれませんが、それでもその時代を知っている人間からすると、今のはてブはあまりにも劣化しすぎているように思えてならないんですよ。2009年ごろ、梅田望夫はてブを指して

はてな取締役であるという立場を離れて言う。はてぶのコメントには、バカなものが本当に多すぎる。

と言い放ち、多くの批判を集めましたが、それから8年経ち、はてブコメントに読むに値するコメントがいくつあるか。かつて、150文字にありったけの情熱を注ぎ、それにも飽き足らず二階三階と積み上げていき、idコールを投げつけるほどのエネルギーが今はてブにはあるか。というか、もはや「二階」とか「idコール」という言葉そのものが死語と化してないか。

相手のいなくなったプロレスラーは、ただの道化師である

なんでこんなことになってしまったか。答えは簡単です。ブログ同士の論争というものがなくなってしまったからですよ。
それこそ、かつて「ブログ論壇」というものが存在していた頃は、論争の主役というのは、あくまでブログ・ブロガーだったわけです。誰かが記事を書く、それに対して別の誰かが反論したいときは、自分のブログで反論記事を書き、相手の記事にトラックバックを投げつける、それこそが喧嘩を売りつける王道のやり方だったわけです。そこにはブロガーとブロガーが対等の立場で殴り合うリングが存在し、人はそれを「論壇プロレス」と呼んだわけです。そしてその論壇プロレスにおいてははてブtwitterなんてものはあくまでリングの外の野次に過ぎないものだったんであって、主役はあくまでブロガー同士の対決だったんです。
そこには綺羅星の如く様々なベビーフェイスやヒールが存在しました。しかし一度論争が勃発すれば、相手の記事一パラグラフ一パラグラフごとに揚げ足を取り、自分の記事で相手を完膚なきまでに叩き潰そうとする、そんなバトルが繰り広げられていたわけです。それは、部外者にとっては恐怖すら与えるような壮絶なものだったわけですが、しかし少なくともそこでは、相手を対等な立場と認めるからこそ、全力で戦うことができる、そんな奇妙な信頼関係もあったわけです。
ところが、はてなダイアリーはてなブログに代わり、トラックバック機能が削除され、人々がtwitterに移っていく中で、いつしかそんなネットバトルというものは時代遅れのものになってしまったわけです。そんな中、旧来のスタイルを貫くブロガーたちは、戦う相手もなく、ただ一人でリングに立ちすくみ、はてブtwitterから投げかけられる野次を受け続ける、そんな道化師になってしまったのです。道化師ですから、求められるのは真面目な文章を書くことではなく、タイトルと章題ですべてを説明し、「自分は○○の味方であり✗✗の敵です」ということで、○○から賞賛を得て✗✗からブーイングを受ける、そんな単純な記事を書くことなのです。

「論壇」が存在し得ない時代

そして、どうやらそのような変化は、ネットに限らず、日本の言論空間全体を覆っているようです。
ブログ論壇」という言葉は、あくまで既存の「論壇」というものが存在する日本の言論空間を前提としていました。「論壇」とは、様々な立場の人間が、異なる立場の人間を説得し合う、そういった議論の場でした。
しかし皆さんご存知のように、その論壇が長年存在していた論壇誌というものも、どんどん潰れていき、残った論壇誌も、自分の立場を旗幟鮮明にし、その立場に合致する論客を囲い込む、そんな場になれ果ててしまったわけです。それは論壇誌に限ったことではありません、もはやネット・リアル問わず、論争相手の首根っこ捕まえて、本気で相手を論破しようとする議論は殆ど無いでしょう。あるのは自分が属する勢力を慰撫し、まだ無知な人々をなんとか自陣営に引き込もうとするプロパガンダ合戦です。もちろん、誰もが口では「こんな状況はよくない。論壇を再興しなければ」と言うわけですが、しかし実際やることはといえば、「サロン」や「ラウンジ」、「有料メルマガ」とか言って、自分たちの賛同者を囲い込むことばっかり。本気で論壇なるものを再興したいなら、まず自分が一番隊として敵陣に乗り込んでいくべきでしょうに。
もはや誰も、自分と異なる考えの人を説得できるとは信じていないのです。なぜなら、自分がまさに、そういう「敵側の言葉」で説得されると思っていないから。

誰がブログのリングを管理するか

そういう時代全体の風潮がある中で、ただそれに乗っかって儲けようとするなら、今のはてブのシステムは実に理にかなっているわけです。安全圏から野次を飛ばし、自分の属する勢力を慰撫する、そんな言葉を発する場を与え、コメンテーターに満足感を与え、自分たちはPVを得る。
でも、そんなことを繰り返していればリング上のブロガーは、誠実な人間ほど疲弊していくわけで、残るのは炎上を糧に生きていくような炎上芸人か、誰も傷つけない当たり障りのない言葉しか書かない善良な市民ブロガーだけになってしまうでしょう。そんなつまらないネット、本当にみんな望んでるんですかね?
ブロガーの多様性をもし残そうとするなら、そこではベビーフェイスだろうがヒールだろうが、野次に向かってではなく、相互に信頼できる相手とバトルができる環境を整えなきゃならないわけです。更に言うなら、野次もある程度コントロールする責任もあるはずなんです。しかし今のはてなは、そのどちらもあまりやっているようには見えない。むしろその逆に、トラックバックを廃止する一方で代替策を示さないで、ブログ同士の交流があまり起きないアーキテクチャにしているし、コメントにおいては、スターが多いブコメが単純に上位に来るようにして、炎上を加速させてしまっている。せめてAmazonのカスタマーレビューみたいに、批判側と擁護側が同程度に表示されるようにするとか、ある程度ネガティブ評価を集めたコメンテーターは、ブコメ上位に表示しないとかできないものかと、ぼくは思うわけです。
そもそもはてブコメントというのは150文字しか書けない以上、本質的に的確な批判とかはできないものなんですから、そんなに大事に扱ってやる必要はないでしょう。批判がしたいならきちんと自分のブログを持って、そこでやればいいはずなんです。その度胸がないなら、本来批判なんてものはしてはいけない。ただ、野次が全くないプロレスというのもそれはそれでつまらないから、バトルの盛り上げ要員として存在を許されている。そこのところを、はてなブックマークの管理側はきちんと理解しないといけないんじゃ、ないでしょうか。

今回の選挙に行く前に読んでほしい文、それは憲法前文

最初に言っておくと、僕は今回の選挙では明確に立憲民主党共産党社民党支持です。ただ、今回の記事ではそのことはとやかく言いません。それぞれの党の政策について知りたい人は公式ホームページとかを見てもらえばいいんでないかと。
cdp-japan.jp
www.jcp.or.jp
社民党OfficialWeb┃政策┃衆議院選挙2017
そうではなく、選挙に行く前に、そもそもどういった基準・価値観から候補者・政党を選べばいいか、その基準を悩んでいる人に、こういう文から考えてみてもいいんじゃないかと、提示してみたいのです。
その文はこちらです。
憲法条文・重要文書 | 日本国憲法の誕生

 日本国民は、正当に選挙された国会における代表者を通じて行動し、われらとわれらの子孫のために、諸国民との協和による成果と、わが国全土にわたつて自由のもたらす恵沢を確保し、政府の行為によつて再び戦争の惨禍が起ることのないやうにすることを決意し、ここに主権が国民に存することを宣言し、この憲法を確定する。そもそも国政は、国民の厳粛な信託によるものであつて、その権威は国民に由来し、その権力は国民の代表者がこれを行使し、その福利は国民がこれを享受する。これは人類普遍の原理であり、この憲法は、かかる原理に基くものである。われらは、これに反する一切の憲法、法令及び詔勅を排除する。

 日本国民は、恒久の平和を念願し、人間相互の関係を支配する崇高な理想を深く自覚するのであつて、平和を愛する諸国民の公正と信義に信頼して、われらの安全と生存を保持しようと決意した。われらは、平和を維持し、専制と隷従、圧迫と偏狭を地上から永遠に除去しようと努めてゐる国際社会において、名誉ある地位を占めたいと思ふ。われらは、全世界の国民が、ひとしく恐怖と欠乏から免かれ、平和のうちに生存する権利を有することを確認する。

 われらは、いづれの国家も、自国のことのみに専念して他国を無視してはならないのであつて、政治道徳の法則は、普遍的なものであり、この法則に従ふことは、自国の主権を維持し、他国と対等関係に立たうとする各国の責務であると信ずる。

 日本国民は、国家の名誉にかけ、全力をあげてこの崇高な理想と目的を達成することを誓ふ。

この文章をどのように基準にするか、それはあなたの自由です。
「こんな理想論ばっか言っている憲法は良くないから、憲法改正を主張している候補者・政党に投票しよう」でも構いません。
ただ、今回の選挙では、どうも「そもそも何を基準にして候補者・政党を選べばいいか」ということがよくわからなくなっているように感じます。結果として、「周りが○○と言っているから○○」とかいうように、漠然とした雰囲気で決めたり、そもそも決めることを放棄して棄権してしまう人も多いのではないでしょうか。
そういう人は、まずこの文章に立ち返って考えてみてはどうでしょうか。良くも悪くも、日本国の政治というのがどうあるべきか、それを最も根幹において示してきたのが、この文なのですから。

Google Homeに今NHKで放送している番組を教えてもらう(Actions On Google & DialogFlow & NHK番組表API)

というわけで、購入しましたGoogle Home。

Google Home

Google Home


下記のサイトを参考にしながら色々遊んでみたりしています。
appllio.com
azanaerunawano5to4.hatenablog.com
qiita.com
matagotch.hatenablog.com
特にIFTTTと組み合わせると面白いですね。ただ、IFTTTだけだと、いまいち複雑な処理とかができなくて億劫。
そんな中下記のサイトに気になる記述を発見。
qiita.com

Action on Googleによる機能追加

Actions on Googleを利用することで、自作のアプリをGoogleアシスタント内で提供することができる。 https://developers.google.com/actions/

これは面白そう、というわけで自作のアプリ、というかチャットボットをちょっと作ってみました。
結果がこちらです。
youtu.be
目玉は家族に勝手につけられましたので気にしなくていいです。

作り方

とりあえずまず、下記のサイトを参考にしてGoogle Homeで受け答えしてくれるようなチャットボットをGoogle Assistant上に作ります。
qiita.com
次に、下記サイトを参考に、テレビ局の単語をEntitiesに登録し、登録したIntentに少し手直しします。
tokibito.hatenablog.com
僕のボットだとこんな感じです。
f:id:amamako:20171016031641p:plain
f:id:amamako:20171016031650p:plain
Webhookにチェックを入れるのを忘れずに。
続いてFulfillmentの方へ行き、「Inline Editor(Powered by Cloud Functions for Firebase)」という項目をENABLEにします。
これの使い方は下記のサイトを参考にしましょう。 qiita.com
ここに、情報を受け取って、処理し、返答を返すコードをNodeJSで書きます。
具体的には次のようなコードを追加しました。

//リクエストの取得
const http = require('http');

//(中略)

    'getTVProgram':()=>{
        var tvStation = {
            "sougou" : "g1",
            "etv" : "e1",
            "bs1" : "s1",
            "bspremium" : "s3"
            
        }
        //URLを定義
        var url = 'http://api.nhk.or.jp/v2/pg/now/{area}/' + tvStation[parameters.TVStation] + '.json?key={apikey}';
        console.log(url);
        if (requestSource === googleAssistantRequest) {
            //リクエスト送信
            http.get(url, function(res) {
                var body = '';
                res.setEncoding('utf8');
                res.on('data', function(chunk) {
                    body += chunk;
                });
                res.on('end', function() {
                    var ret = JSON.parse(body);
                    sendGoogleResponse('いま放送している番組は' + ret.nowonair_list[tvStation[parameters.TVStation]].present.title + 'です'); // Send simple response to user
                });
            }).on('error', function(e) {
                console.log(e.message);
            });
        } else {
            //リクエスト送信
            http.get(url, function(res) {
                var body = '';
                res.setEncoding('utf8');
                res.on('data', function(chunk) {
                    body += chunk;
                });
                res.on('end', function() {
                    var ret = JSON.parse(body);
                    sendResponse('いま放送している番組は' + ret.nowonair_list[tvStation[parameters.TVStation]].present.title + 'です'); // Send simple response to user
                });
            }).on('error', function(e) {
                console.log(e.message);
            });
        } 
    },

なんかrequestモジュールが使えなかったのでhttpモジュールを使ってます。
なお、この情報の取得にはNHK番組表APIを使っています。
NHK番組表API
{area}と{apikey}に何を入れるかは上記のページを参照して登録してください。
コードを書いて、DEPLOYを押したら作業完了です。

追記 2017-10-16 4:06

書き忘れてました、このコード、Firebase上で動いてるんですが、Firebaseでは課金しないと外部のネットワークにアクセスできません。というわけで課金しましょう。

感想

おもったより簡単にできてびっくり。

次にしたいこと

これ公開できれば良いんだけどどうやって公開するんだろう

お詫び

私あままこ(https://twitter.com/amamako/)がはてブ及びtwitterで行った台湾のライトノベルについての言及は、あまりに的外れで、台湾のライトノベルに対する誤解を招き、名誉を不当に傷つけるものでした。ここにお詫びし、下記URLの発言を削除いたします。 台湾ラノベ翻訳姫の方には、誤りを指摘していただき深く感謝いたします。

削除した文

http://b.hatena.ne.jp/entry/344361761/comment/amamako https://twitter.com/amamako/status/904470643655114752

台湾ではライトノベルの「本土化」が進んでおり、二・二八事件や兵役をテーマにしたライトノベルなども出版されているらしい。逆に異世界ものや俺TUEEEEは飽きられていると。なんつーか、日本よりむしろ進んでない?

https://twitter.com/amamako/status/904475670759092224

その点からすれば、台湾ラノベが、あくまで「ライトノベル」でありながら、しかし一般的にライトノベル的なテーマとされがちなものから広がっていき、社会派的なテーマでも語れるんだという可能性を示してきたことは、むしろ日本も学ぶべきなんじゃないだろうか。

中国・上海に行ってきました(2017/5/18~21)―3:田子坊~新天地~上海宣伝画芸術中心編

DSC_0367
amamako.hateblo.jp
中国・上海旅行記。今回は田子坊から、新天地にある中共一大会址(中国共産党第一次全国代表大会会址)を見て、その後いよいよ今回の旅のメインイベント、上海宣伝画芸術中心へと訪れます。なお今回は共産趣味分多めになっております。

田子坊へ

DSC_0321
朝起きて、猫におはようのあいさつをしながらまずは地下鉄に乗り、打浦橋駅へ向かいます。駅を出ると目の前にはもうこんな門が。これが田子坊の入り口です。
DSC_0322
DSC_0323
いかにも「田子坊」って感じのキャラクターが出迎えてくれます。
DSC_0324
中に入っていき、まず向かうのはKommune(公社)、まずは現代上海において共産趣味がどんな感じで消費されているかをヲチしてみましょう。
www.shanghainavi.com
DSC_0328
店の中はこんな感じ。
DSC_0330
DSC_0331
DSC_0335
DSC_0336
ガチの共産主義っぽいものを持ってきたっていうよりは、やっぱりある程度小奇麗にされた、それこそゴダールの『中国女』に描かれたようなオサレmeetsマオイズムって感じですな。でもまあ、こういうのもこういうので、嫌いではない。
とりあえずコーヒーを頂く。これまたオサレだなー。
DSC_0334
お店を出て、朝の田子坊を散策してみます。
DSC_0340
DSC_0350
こういうごちゃごちゃして、それでいてセンスがいい町並みって好きです。日本で言う原宿とかみたいな感じなのかしら。原宿そんなに歩いたことないけど。
変なキャラクターもいっぱいいる。
DSC_0325
DSC_0353
DSC_0355
DSC_0356
DSC_0357
他にも変なものが色々売っている。
DSC_0342
DSC_0343
この化粧品はわりと上海の色んな所で見た。
DSC_0346
DSC_0347
いろいろ危うい。
DSC_0345
DSC_0351
DSC_0358
看板もセンスがいい。
そんなわけで、一通り田子坊を堪能したのち、今度は新天地にある、中国共産党の第一回大会が開かれた場所、中共一大会址へと向かうことにします。

新天地・中共一大会址

新天地に向かう途中、地下鉄の駅で撮ったポスター。
DSC_0360
台湾・高雄の地下鉄のポスター
amamako.hateblo.jp
ほどではないですけど、ピンク髪のキャラクターとか、顔文字っぽいキャラクターとか、妙にネットっぽいですな。
新天地駅に着くと早速出迎えてくれるこんな看板
DSC_0362
鎌と槌のマークがわくわくさせてくれます。
しかし駅を出てみるとこんな光景があたりには広まっていたり。
DSC_0365
新天地は現在おしゃれなショッピング街。なんか六本木ヒルズ周辺っぽい。
しかしそんな風景の中を歩いていくと、妙に垢抜けない観光客がいっぱい居るエリアへ。きましたきました。
DSC_0366
さっそく中に入ってみて、荷物検査を抜けると、壁には中国共産党第一次全国代表大会のメンバーの銅像
DSC_0367
そしてその横には中国共産党党旗。
DSC_0368
これこれ、こーいうのがが見たかったんだなぁ。
中に入ると、中国における共産主義革命の歴史が。
DSC_0372
れーにん!れーにん!( ゚∀゚)o彡
DSC_0374
このデザインが良いよなぁ。
DSC_0375
共産党宣言の翻訳。マルクスがカッコイイ。
DSC_0376
『覚悟』ですよ『覚悟』。こんな題名付けますかあなた。右翼団体みたいだ。
……と思って調べてみたら、この『覚悟』っていう雑誌は、下記のサイトによると、共産党の創設以前の学生の団体で、周恩来とかが参加していたそうで、さらにいうと中国語で「覚悟」というのっは、日本語で言うと「自覚・覚醒」の意味らしい。
yuzitj.exblog.jp
DSC_0377
陳独秀と李大釗。この二人が中国共産党を結成していくわけですな。
DSC_0379
中国のロシア人コミュニティの中にも、共産主義がじわりじわりと広まっていったり。
DSC_0380
COMMUNIST。
DSC_0382
共産党宣言の翻訳をしたタイプライター。ちなみに中国の共産党宣言の翻訳は幸徳秋水堺利彦が日本語に訳したものを底本にし、英訳も参照しながら書かれたものらしい*1
DSC_0383
中国共産党の初期メンバーたち。いかにもいいとこの坊っちゃん嬢ちゃんという感じ。
DSC_0385
メーデー、漢字にすればそりゃ「五月一日」になりますわな。
DSC_0386
中国共産党第一回大会の参加者。日本の大学に留学していた人も結構多い。
DSC_0387
毛沢東たん。絶対写真修正してる。
DSC_0388
毛沢東の描いた論文が載っている本。
DSC_0393
DSC_0391
DSC_0389
その他なんかカッコよかったメンバー。大半が多分ろくな死に方してないんだろーなー。
DSC_0399
DSC_0397
DSC_0395
共産党大会の様子。ここから↓までになるんだから、やっぱ中国共産党ってサクセスストーリー歩んでるよなぁ。
中国共産党第17回全国代表大会 -- pekinshuho
DSC_0400
毛たんの書。
DSC_0401
結成後現在まで、中国共産党のために尽力してきた人たち。
DSC_0408
はためく五星紅旗
というわけで、中国共産党党史を頭に叩き込んで、すっかり心は革命闘士、という感覚で外に出てみると、待ち受けるのはこんな光景なわけです。
DSC_0410
DSC_0409
……ま、豊かになってよかったネ。
DSC_0412
DSC_0411
ちなみに近くには大韓民国臨時政府の跡もあったりしました。残念ながらその日は休館日だったので入ることはできず。

毛太設計

というわけで、現代中国共産党の公式見解を見た後は、フランス租界を進みながら、共産趣味っぽいお店を目指します。
まずは常熟路駅の近くにあるという「毛太設計(Madame Mao's Dowry)」というお店へ向かってみます。調べてみると、文革グッズとかがたくさんあるらしくて、わくわく。
www.shanghainavi.com
DSC_0415
DSC_0414
DSC_0413
旧フランス租界のオサレな町並みを歩いていくと、あったあった。
DSC_0417
DSC_0416
さっそく中に入ってみます。
しかし、なーんか思ってたのと違う。なんか骨董品ばっかで雑貨があまりない。お店の雰囲気もこじゃれていて、場違いな感覚がして早々に退散。ここは、共産趣味的視線からするとあんまりおもしろくないお店なのでした。

上海宣伝画芸術中心

しかーし、その次に行った場所、上海宣伝画芸術中心は、まさに共産趣味者大興奮な場所なのでした。
ただ、この場所、まず行くのが大変に難しい。とりあえずGoogleマップに「宣伝画芸術中心」と書かれた場所
Google マップ
に向かって
DSC_0423
DSC_0422
DSC_0420
DSC_0418
オサレな街を進んでいたのですがこれが全然たどり着きません。
DSC_0424
かわいい猫の落書きはあるんだけどなー。
結論から言うと、Googleマップの場所は間違っています。本当の場所はこっち。
Google マップ
マップをみればわかりますが、団地の中にあったりします。総統公寓という看板がかかっている、華山路と武康路と鎮寧路の交差点にある、こんな感じの団地の入り口
DSC_0432
を入り、
DSC_0426
猫に挨拶しながら進んでいくと4号棟があるので
DSC_0431
その中に入り、地下一階に行くと、
DSC_0429
到着します。
DSC_0430
ちなみに僕は分からなかったので、団地の入口にある、守衛さんに場所を聞きました。するとこんな名刺大の地図をくれた(左のは入場券)
DSCF6210
ので、やっぱり迷う人は多いみたいですね。
さて、では中はどんな感じなのか、写真でご紹介!……と行きたかったんですが、中は残念ながら撮影禁止。まあ、色々政治的に微妙だったりもするのかもしれません。
というわけで、言葉で説明するとですね、とにかく日中戦争の頃から、改革開放の頃まで、中国で生み出されたプロパガンダポスターが、それぞれの時代ごとの壁一面に貼られています。横には英語で説明文もあって、それぞれの時代、どんな政治的状況から、どういうモチーフのポスターが多く描かれたか等が説明されていたりします。
もー共産趣味者なら興奮間違いなし。一部、複製ポスターをお土産で買ってきましたのでそれを紹介してみます。
DSCF6204
DSCF6202
DSCF6201
こんな感じのポスターが所狭しと並んでいるわけです。
図録も買ってきたりしました。
DSCF6206
中はこんな感じ。
DSCF6207
中華人民共和国成立のときの有名な絵ですが、時代ごとに、粛清されちゃった人が描かれなくなったりしたという説明があったり。
DSCF6209
DSCF6208
激アツの反米ポスターが紹介されていたりします。これらも、上海宣伝画芸術中心にはきちんと原寸大の実物が展示されていたりするわけです。
これらの画像を見て、ピンときた人は是非!行くべきでしょう。
というところで今回はここまで。次回は圓苑や豫園、上海环球金融中心など、上海の定番観光地を回ります。
つづく。