強まっていこう

あっちゃこっちゃへ強まっていくためのブログです。

初級・既得権益とは?(メディア編) まとめ・早見表 - 上杉隆氏



N国の幹事長上杉氏が日本の腐った現状を作り出している根本原因であるメディアの腐敗についてわかりやすく語っています。

ざっとまとめてみました。
_______________________________________________________________________

クロスオーナーシップ - 特定資本が多数のメディアを傘下にして影響を及ぼすこと。
下表の横軸でクロスオーナーシップが結ばれている。

新聞 テレビ ラジオ 出版 インターネット チャレンジャー
読売 日テレ ラジオ日本 角川 ドワンゴ(ニコ動)
毎日 TBS TBS 講談社 ブロゴス 三木谷(楽天)
産経 フジ ニッポン・文化 扶桑社・小学館 ホリエモン
朝日 テレ朝 ニッポン・文化 幻冬舎小学館 Abema 孫正義(ソフバン)
日経 テレ東 InterFM
NHK NHK 立花孝志
MX TFM

電通共同通信時事通信は元々同じ会社(同盟通信社)。

同盟通信社から終戦(1945年)後に、一般報道部門が共同通信社、経済報道部門が時事通信として分離。

何もかもの大ボス = 電通

電通総務省より強い裏ボス出現 = YouTube

これらの既得権益に逆らうとメディアから全干しされる。これらから干された人間こそ本当の改革者。

既得権を保護すると権益だけが潤い国が衰退する。ギリシャ・ローマ時代から歴史が証明している。

日本の 2003年 の一人当たりの GDP は世界 2位。それが2018年には 27 位。もはや日本は先進国ではない。その現実を見せないようメディアが必死に隠している。

立花氏はこれらをぶっこわし、これらの権利を国民に返すのが目的。
_______________________________________________________________________

NHK職員->パチプロ->地方議員->区議会議員->参議院議員->辞職->参議院へ立候補

そんなハチャメチャ立花孝志氏のN国。

立花孝志氏は地方議員になる前からずっと見ていて電通周りの話やパチンコ周りの話をやたら詳しくしてくれるので気に入っていたのですが、この上杉氏もフクイチメルトダウン時からずっと見ている一人です。今やN国の幹事長ですからね。渡辺喜美氏もみんなの党時代に握手をしに行くほど応援をしていたのですが、熊手で爆死しました・・・。その渡辺氏とも組むと言うもう何でも有りっぷりで見ていて飽きないですね、ホントこの方々は。

よくもまぁこんな権力と戦う元気があるものだと感心しつつ自分は何も出来ないなぁと情けなくもなったりします。

なので、せめてまとめでも書くか、と書いてみたわけです。

世の中良い方向に変わって行って欲しいと本当に思います。じゃないとぶっ壊す前に国がぶっ壊れます、ガチで。

Rabbit MQ で RPC(チュートリアル 6 RPC)

今回はチュートリアル 6 RPC についてやっていきます。

まずは RPCのサーバ側です。引数で受けた文字列に日時をつけて返します。

rpc_server.js

#!/usr/bin/env node

const amqp = require('amqplib');
const my = require('./my.js');

async function main() {
  const a = getArgs();
  const conn = await amqp.connect(my.conf).catch(my.die);
  const ch = await conn.createChannel();
  await ch.assertQueue(a.queue, {
    durable: false
  });
  ch.prefetch(1);
  console.log('Waiting queue=%s', a.queue);
  await ch.consume(a.queue,
    req => {
      var msg = req.content.toString();
      var res = `${msg}(${new Date()})`;
      console.log('Response: %s', res);
      ch.sendToQueue(req.properties.replyTo, 
        Buffer.from(res), {
          correlationId: req.properties.correlationId
        }
      );
      ch.ack(req);
    }
  );
};
main();

function getArgs() {
  if (process.argv.length < 3) { usage(); }
  return {
    queue: process.argv[2],
  };
}

function usage() {
  const usage = `rpc_server.js QUEUE_NAME`;
  console.log(usage);
  process.exit();
}
await ch.consume(a.queue,
  req => {
    var msg = req.content.toString();
    var res = `${msg}(${new Date()})`;
    console.log('Response: %s', res);
    ch.sendToQueue(req.properties.replyTo, 
      Buffer.from(res), {
        correlationId: req.properties.correlationId
      }
    );
    ch.ack(req);
  }
);

req.properties.replyTo は、Caller 側に返すための Queue です。
correlationId は RPC のやり取り上で使う一意の ID です。Caller 側で作ります。

次に Caller 側です。

続きを読む

RabbitMQ で Topics (チュートリアル 5 Topics)

今回はチュートリアル 5 Topics をやっていきます。Topic と言ったって単にワイルドカードを使った部分一致で待ち受けできますよ、と言うだけです。

では早速 Receiver から。

sub_t.js

#!/usr/bin/env node

const amqp = require('amqplib');
const my = require('./my.js');

async function main() {
  const a = getArgs();
  const conn = await amqp.connect(my.conf).catch(my.die);
  const ch = await conn.createChannel();
  await ch.assertExchange(a.exchange, 'topic', {
    durable: false
  });
  const q = await ch.assertQueue('', {
    exclusive: true
  });
  a.routingKeys.split(',').forEach(async routingKey => {
    await ch.bindQueue(q.queue, a.exchange, routingKey);
  });
  console.log('Waiting exchange=%s, routing_keys=%s', a.exchange, a.routingKeys);
  await ch.consume(q.queue, 
    msg => {
      console.log('Received: %s', msg.content.toString());
    },
    {
      noAck: true
    }
  );
};
main();

function getArgs() {
  if (process.argv.length < 4) { usage(); }
  return {
    exchange: process.argv[2],
    routingKeys: process.argv[3]
  };
}

function usage() {
  const usage = `sub_r.js EXCHANGE_NAME ROUTING_KEYS(CSV)`;
  console.log(usage);
  process.exit();
}
await ch.assertExchange(a.exchange, 'topic', {
  durable: false
});

Exchange をタイプ topic で定義します。前回のコードとの違いはこれだけです。

Sender 側は前回のコードと何も変わりません。

続きを読む

RabbitMQ で Routing (チュートリアル4 Routing)

さて今回は本家チュートリアル 4 Routing をやってまいります。
Routing と言ったって Receiver 側で名前を OR で待ち受けれるだけと言う簡単な機能です。

pub_r.js

#!/usr/bin/env node

const amqp = require('amqplib');
const my = require('./my.js');

async function main() {
  const a = getArgs();
  const conn = await amqp.connect(my.conf).catch(my.die);
  const ch = await conn.createChannel();
  await ch.assertExchange(a.exchange, 'direct', {
    durable: false
  });
  const q = await ch.assertQueue('', {
    exclusive: true
  });
  a.routingKeys.split(',').forEach(async routingKey => {
    await ch.bindQueue(q.queue, a.exchange, routingKey);
  });
  console.log('Waiting exchange=%s, routing_keys=%s', a.exchange, a.routingKeys);
  await ch.consume(q.queue, 
    msg => {
      console.log('Received: %s', msg.content.toString());
    },
    {
      noAck: true
    }
  );
};
main();

function getArgs() {
  if (process.argv.length < 4) { usage(); }
  return {
    exchange: process.argv[2],
    routingKeys: process.argv[3]
  };
}

function usage() {
  const usage = `sub_r.js EXCHANGE_NAME ROUTING_KEYS(CSV)`;
  console.log(usage);
  process.exit();
}
await ch.assertExchange(a.exchange, 'direct', {
  durable: false
});

Exchange のタイプを direct にします。

a.routingKeys.split(',').forEach(async routingKey => {
  await ch.bindQueue(q.queue, a.exchange, routingKey);
});

bindQueue する時に、第3引数に対して待ち受ける routingKey を指定します。複数指定が可能です。

次は Sender 側。

続きを読む

RabbitMQ でPub/Sub (チュートリアル3 Publish/Subscribe)

今回は本家チュートリアル 3 Publish/Subscribe です。これは何か?を簡単に言うと、ブロードキャストです。
今までの例では Receiver 側は Sender から送られた Message をどれか一つの Receiver だけで受けていましたが、これを複数の Receiver で受ける事が可能になります。

ではまず Receiver 側です。

pub.js

#!/usr/bin/env node

const amqp = require('amqplib');
const my = require('./my.js');

async function main() {
  const a = getArgs();
  const conn = await amqp.connect(my.conf).catch(my.die);
  const ch = await conn.createChannel();
  await ch.assertExchange(a.exchange, 'fanout', {
    durable: false
  });
  const q = await ch.assertQueue('', {
    exclusive: true
  });
  await ch.bindQueue(q.queue, a.exchange, '');
  console.log('Waiting exchange=%s', a.exchange);
  await ch.consume(q.queue, 
    msg => {
      console.log('Received: %s', msg.content.toString());
    },
    {
      noAck: true
    }
  );
};
main();

function getArgs() {
  if (process.argv.length < 3) { usage(); }
  return {
    exchange: process.argv[2],
  };
}

function usage() {
  const usage = `sub.js EXCHANGE_NAME`;
  console.log(usage);
  process.exit();
}
await ch.assertExchange(a.exchange, 'fanout', {
  durable: false
});

Exchange を定義します。Exchange については第1回の記事で少しだけ触れましたが、ここで改めて説明し直します。
基本的には Queue と同じですが違いは送受信方法や、名前に対して部分一致、OR などで受信が可能になります。
この Exchange には Queue を格納します。durable の意味は Queue と同じです。
そして Queue と同じように RabbitMQ 側に定義が残ります。一覧と削除は以下で可能です。

続きを読む

RabbitMQ でタスク処理(チュートリアル2 Work queues)

前回、単純なメッセージ送信を行いました。今回は本家チュートリアル 2 Work queues にあたる、タスク処理を行ってみます。タスク処理で大事なのはきちんとタスクが完遂されることです。なので、もし処理途中でプロセスが死んだ場合、他のプロセスがタスク処理を引き受ける必要があります。以下のコードでそれが実現できます。

worker.js

#!/usr/bin/env node

const amqp = require('amqplib');
const my = require('./my.js');

// worker の処理が正常終了した場合 ack でmsg を投げるとMQ 側からキューが消える
// それが行われずプロセスが死んだら他のワーカーがそのキューを処理する
async function main() {
  const a = getArgs();
  const conn = await amqp.connect(my.conf).catch(my.die);
  const ch = await conn.createChannel();
  await ch.assertQueue(a.queue, {
    durable: true
  });
  console.log('Waiting queue=%s', a.queue);
  ch.prefetch(1);
  await ch.consume(a.queue,
    task => {
      var secs = task.content.toString().split('.').length - 1;
      console.log('Received: %s', task.content.toString());
      setTimeout(() => {
        console.log('Done');
        ch.ack(task);
      }, secs * 1000);
    }
  );
};
main();

function getArgs() {
  if (process.argv.length < 3) { usage(); }
  return {
    queue: process.argv[2],
  };
}

function usage() {
  const usage = `worker.js QUEUE_NAME`;
  console.log(usage);
  process.exit();
}
await ch.assertQueue(a.queue, {
  durable: true
});

durable: true にするのは RabbitMQ が死んだ時でも残る Queue にするためです。
durable: false が指定された Queue がすでに存在する場合はその Queue を消す必要があります。

続きを読む

RabbitMQ でメッセージ送受信(チュートリアル1 "Hello World!")

RabbitMQ を仕事で使う必要があり使い始めたんですがこれがまた分かり辛い。むちゃくちゃ単純な代物なのにやたらと難しくする病気を患っているシリーズです。
自分は Node.js から使うんですが、本家チュートリアルのコードがコールバック地獄コードだったり、
他の人が書いているものもPromise 地獄コードだったりしてどうも具合が悪かったり。

同じように困っている人がいるのでは?と思いましてキーを打ち始めたわけです。一助となればと。

では、まず主要な用語を説明します。これがコアなのでしっかり把握してください。

Producer: 送信者(以後 Sender)
Consumer: 受信者(以後 Receiver)
Message: 送受信するメッセージ
Queue: Message を入れるものでラベルを付ける事が出来きそのラベルを使った送受信が可能
Exchange: Queueを入れるもので送受信の方法を切り替える事が出来る
     Queue同様ラベルを付ける事が可能で OR や部分一致での受信が可能になる

Sender がクライアントで Receiver がサーバ的なノリです。
Queue と Exchange の関係が最初はわけがわからんと思います。そらそうです。本来であれば別に分けなくても良いですから・・・。不毛に複雑化してますが我慢するしか無いです。

まずは一番単純な Queue に Message を詰め込んで送る方法を説明しましょう。本家サイトのチュートリアル1に相当します。
コードは JS です。

まず npm で必要なライブラリを入れます。

npm i amqplib -S

Receiver 側のコードが以下になります。

recv.js

#!/usr/bin/env node

const amqp = require('amqplib');
const my = require('./my.js');

async function main() {
  const a = getArgs();
  const conn = await amqp.connect(my.conf).catch(my.die);
  const ch = await conn.createChannel();
  await ch.assertQueue(a.queue, {
    durable: false
  });
  console.log('Waiting queue=%s', a.queue);
  await ch.consume(a.queue,
    msg => {
      console.log('Received: %s', msg.content.toString());
    },
    {
      noAck: true
    }
  );
};
main();

function getArgs() {
  if (process.argv.length < 3) { usage(); }
  return {
    queue: process.argv[2],
  };
}

function usage() {
  const usage = `recv.js QUEUE_NAME`;
  console.log(usage);
  process.exit();
}

このコマンドは QUEUE_NAME を引数で受けてメッセージを待ち受けます。

recv.js QUEUE_NAME

コードの説明をしていきます。

続きを読む