備忘録

備忘録

ファイル変更時に自動的にNode.jsを再起動する方法

Ⅰ. はじめに

タイトルの通り「ファイル変更時に自動的にNode.jsを再起動する方法」です。

Ⅱ. やり方

1. nodemon をインストールする
npm install -g nodemon
2. サンプルプログラムを書く

index.js

console.log('hello user001')
3. 実行する
nodemon index.js

実行結果

ファイル変更時、自動的にNode.jsが再起動した

$ nodemon index.js
[nodemon] 1.18.11
[nodemon] to restart at any time, enter `rs`
[nodemon] watching: *.*
[nodemon] starting `node index.js`
hello user001
[nodemon] clean exit - waiting for changes before restart
[nodemon] restarting due to changes...
[nodemon] starting `node index.js`
hello user002
[nodemon] clean exit - waiting for changes before restart

Wiresharkフィルタまとめ

Ⅰ. はじめに

タイトルの通り「Wiresharkフィルタまとめ」です。

Ⅱ. まとめ

TCPポート8080のパケットを表示
tcp.port == 8080
送信元のTCPポートが8080のパケットを表示
tcp.srcport == 8080
宛先のTCPポートが8080のパケットを表示
tcp.dstport == 8080
宛先のIPアドレスが192.168.0.2のパケットを表示
ip.dst == 192.168.0.2
TCPのPSHフラグのみ表示

https://kagasu.hatenablog.com/entry/2018/05/01/184400

tcp.flags.push == 1
HTTPのパケットを表示

※tcpを付け加えると SSDP NOTIFYを除外できる

http && tcp
POSTのパケットを表示
http.request.method=="POST"
TCPヘッダの0バイト目の値が0x01のパケットを表示
tcp.payload[0] ==01
TCPペイロードの0バイト目から1バイトの値が0x01のパケットを表示
tcp.payload[0:1] == 01
TCPペイロードの0バイト目から2バイトの値が0x01, 0x02のパケットを表示
tcp.payload[0:2] == 01:02
MySQLクエリを表示

公式ドキュメント

mysql.query
DELETEを含むMySQLクエリを表示

※大文字小文字が区別される

mysql.query contains "DELETE"

C#でActiveMQを利用する方法

Ⅰ. はじめに

タイトルの通り「C#ActiveMQを利用する方法」です。

CentOSActiveMQをインストールする方法
https://kagasu.hatenablog.com/entry/2019/04/08/195932

Ⅱ. やり方

1. NuGet からライブラリをインストールする
Install-Package Apache.NMS.ActiveMQ.NetStd
2. サンプルプログラムを書く

Consumer.cs

using Apache.NMS;
using Apache.NMS.Util;
using System;

namespace ActiveMQTest
{
  class Program
  {
    public static void Main(string[] args)
    {
      var connecturi = new Uri("activemq:tcp://127.0.0.1:61616");
      var factory = new NMSConnectionFactory(connecturi);

      using (var connection = factory.CreateConnection("user", "password2"))
      using (var session = connection.CreateSession())
      {
        var destination = SessionUtil.GetDestination(session, "queue://test001");

        using (var consumer = session.CreateConsumer(destination))
        {
          consumer.Listener += new MessageListener(OnMessage);
          Thread.Sleep(100); // すぐに connection.Start するとうまく動作しない場合がある
          connection.Start();

          Console.ReadLine();
        }
      }
    }

    static void OnMessage(IMessage receivedMsg)
    {
      var msg = (ITextMessage)receivedMsg;

      // Console.WriteLine(msg.NMSMessageId);
      Console.WriteLine(msg.Text);
    }
  }
}

Producer.cs

using Apache.NMS;
using Apache.NMS.Util;
using System;
using System.Threading;
using System.Threading.Tasks;

namespace ActiveMQTest
{
  class Program
  {
    public static void Main(string[] args)
    {
      var connecturi = new Uri("activemq:tcp://127.0.0.1:61616");
      var factory = new NMSConnectionFactory(connecturi);

      using (var connection = factory.CreateConnection("user", "password2"))
      using (var session = connection.CreateSession())
      {
        var destination = SessionUtil.GetDestination(session, "queue://test001");

        using (var producer = session.CreateProducer(destination))
        {
          connection.Start();
          producer.DeliveryMode = MsgDeliveryMode.NonPersistent;
          producer.RequestTimeout = TimeSpan.FromSeconds(10);
          
          for(var i = 0; i < int.MaxValue; i++)
          {
            // 1秒ごとにメッセージを送信する
            var request = session.CreateTextMessage($"Hello {i}");
            // request.Properties["myHeader"] = "hoge";
            producer.Send(request);
            Console.WriteLine("send ok");

            Thread.Sleep(TimeSpan.FromSeconds(1));
          }
        }
      }
    }
  }
}
実行結果

f:id:kagasu:20190408224459p:plain

CentOSにActiveMQをインストールする方法

Ⅰ. はじめに

タイトルの通り「CentOSActiveMQをインストールする方法」です。

Ⅱ. インストール方法

環境
$ cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core)
1. JRE をインストールする
yum install -y java-1.8.0-openjdk
echo "JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::")" | sudo tee -a /etc/profile
source /etc/profile
2. ActiveMQ をダウンロード、展開する

以下から最新版バイナリのURLを取得します
http://activemq.apache.org/download

wget http://ftp.meisei-u.ac.jp/mirror/apache/dist/activemq/5.15.9/apache-activemq-5.15.9-bin.tar.gz
tar zxvf apache-activemq-5.15.9-bin.tar.gz -C /opt
3. systemd ユニットファイルを作成する
sudo ln -s /opt/apache-activemq-5.15.9 /opt/activemq
vim /usr/lib/systemd/system/activemq.service

activemq.service

[Unit]
Description=activemq message queue
After=network.target
[Service]
PIDFile=/opt/activemq/data/activemq.pid
ExecStart=/opt/activemq/bin/activemq start
ExecStop=/opt/activemq/bin/activemq stop
User=root
Group=root
[Install]
WantedBy=multi-user.target

Ⅲ. 動作テスト

1. ActiveMQ を起動する
# systemctl enable activemq.service
systemctl start activemq.service
2. Consumer を起動する
cd /opt/activemq
./bin/activemq consumer --brokerUrl failover://tcp://127.0.0.1:61616 --destination queue://test001
3. Web管理画面を開く

http://127.0.0.1:8161/admin

User admin
Password admin
4. メッセージを送信する

f:id:kagasu:20190408195546p:plain
f:id:kagasu:20190408195618p:plain

5. 実行結果

f:id:kagasu:20190408195831p:plain

FAQ

Q1. Web管理画面の資格情報を変更したい

A. 以下のファイルを変更する

/opt/activemq/conf/jetty-realm.properties
Q2. MessageBroker の資格情報を変更したい

A. 以下のファイルを変更する
/opt/activemq/conf/activemq.xml

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}">
  <plugins>
    <simpleAuthenticationPlugin anonymousAccessAllowed="false">
      <users>
        <authenticationUser username="admin" password="password1" groups="users,admins"/>
        <authenticationUser username="user" password="password2" groups="users"/>
        <authenticationUser username="guest" password="password3" groups="guests"/>
      </users>
    </simpleAuthenticationPlugin>
  </plugins>
</broker>

Node.js + TypeScript + puppeteerでevaluateを非同期で利用する方法

Ⅰ. はじめに

TypeScriptのようなAltJSで以下のコードを実行すると、以下のエラーが出力されます。

await page.goto('http://example.com')
let str = await page.evaluate(async () => {
  let res = await window.fetch('http://example.com')
  return await res.text()
})
console.log(str)
UnhandledPromiseRejectionWarning:
  Error: Evaluation failed:
    ReferenceError:
      __awaiter is not defined

解決方法

方法1

引数を文字列として渡す

let str = await page.evaluate(`(async () => {
  let res = await window.fetch('http://example.com/1')
  return await res.text()
})()`)
方法2

トランスパイル先としてECMAScript 2018を指定する
tsconfig.json

{
  "compilerOptions": {
    "target": "es2018"
  } 
}