2020年5月27日 星期三

Sequelize 作subquery 範例

orm作單一table查詢 若需要查詢的條件需引用自子查詢
以下是簡單的範例
sql作法

select * from maintable where uid in(select uid from uidTable where flag='Y')
以sequelize model執行方式
mainTableModel.findAll(
  {
    where:{
      uid: {
        [Op.in]: [sequelize.literal(`(select name, uid from maintable where uid in(select uid from uidTable where flag='Y')`)]
      }
    }
  }
)

2020年5月26日 星期二

Linux log journal清除

Linux log檔案放在/var/log下
查log佔的容量
sudo du -sh 
發現 /var/log/journal內佔最多的容量

sudo journalctl --vacuum-size=10M

讓jounnal只保留10m
參考來源
https://blog.csdn.net/sunboy_2050/article/details/89530790

2020年5月24日 星期日

徒步 高雄四維路

一直很喜歡以徒步的方式在都市裡旅行
徒步看到的風景 跟騎車是截然不同的視野
走過才會記得沿路的風景
以前總在國外才會進行的方式
想想 對於自己所居住的地方
也可以用這樣的方式 去看看

四維路的東邊這端
從河南河北路切入四維路
不過是大概兩個車道的道路
到了凱旋才比較寬闊起來
廣州街文化中心一帶 林立的店家
這一帶 舊名林德官
很多賣吃的老店 都是平常騎車不會注意到的
好吃的金龍水煎餃 每回走過 總會停下來吃個幾顆再走

光華到中山之間的四維路
寬闊的林蔭行人道 是四維路最舒服的一段
因為是走路 所以對於紅綠燈的秒數 總特別敏感
靠近復華中學的明權路口
大概有至少8個車道寬 卻只有30秒的時間
每次都不需要小跑步過馬路才來的及
而像仁愛街口那樣 大概走不超過20步就可過的馬路
竟然有90秒的時間 很不解紅綠燈秒數是如何設計
早到快接近中山路口
可以看到路人咖啡就在這裏
再往前穿過了中華路 穿過了自強路
四維公園旁鄰近的苓雅市場
鼓山亭 大概就是我步行的終點
在這裡點個香拜拜 坐一下
再回家
時間還夠 可以步行返回
騎公共腳踏車 回程也是不錯的選擇






2020年5月20日 星期三

nodejs上RabbitMQ 使用amqplib 紀錄

在nodejs上實作rabbitMQ的client端
使用amqplib module
依照文件做一些紀錄

Overview
  1.在與RabbitMQ建立連線connection後
    在connection上是可以建立多個channel
  2.RPC端透過AMQP與Server連接 都是透過非同步的方式的溝通
    也就是說 RPC不是直接與RPC溝通 而是透過中介的RabbitMQ Server
    傳送與接收
    因此大多數amqplib提供的操作method 並不會由server取得回應
    或只是接收到boolean的回傳值
Dealing with failure
  大多數AMQP的操作,只要沒達到預期的狀態就會當作錯誤
  因為錯誤可能造成channel關閉,錯誤發生或可能產生的效應
  1.目前發生錯誤的RPC會被reject
  2.使用的channel物件會因為錯誤 造成之後的操作發生問題
  3.任何等待傳送的RPC 都會被reject
  4.造成channel物件emit 'error'
  5.造成channel物件emit 'close'
  當channel發生錯誤有可能是其他的RPC所造成
  而非當下連線的RPC造成
  要去找到問題發生原因可以透過
  try catch捕捉到錯誤e的stackAtStateChange會是有用的錯誤資訊
connection.createChannel().then(function(ch) {
  ch.close();
  try {
    ch.close();
  }
  catch (alreadyClosed) {
    console.log(alreadyClosed.stackAtStateChange);
  }
});

Flow Control
channel的運作會類似於stream.Writable
  1.當呼叫publish或sendToQueue時會回傳
    true:代表 'keep sending'
    false:代表 please wait for a 'drain' event
  2.呼叫以下這些method則不會有任何server的回傳
    包括ack, ackAll, nack, nackAll, and reject
  3.ConfirmChannel則會以callback來接收boolean值
    當server有確認了message時 callback會被呼叫

Argument handling
  許多的method操作都會吃一個option參數
  option本身有一些預設的option參數值
  如果傳入非option定義的參數內容會被忽略
  通常會把option合併成一個單一物件便於使用
var common_options = {durable: true, noAck: true};

var bar_opts = Object.create(common_options);
bar_opts.autoDelete = true;

var foo_consume_opts = Object.create(common_options);
// 使用arguments table方式priority,必須以x-格式寫, 
foo_consume_opts.arguments = {'x-priority': 10};

var bar_consume_opts = Object.create(foo_consume_opts);
// 覆寫之前已經設定的prooprity值
bar_consume_opts.priority = 5;

Field table values
  在publish與sendToQueue的option內
  包括arguments與headers都是 field table值
  都是key-value object型式
  有一些特別的value型態會在table內被encode
  當js內會以!語法來標明其型態
ex:
  {'!': 'int8', value: 64}
  {'!': 'decimal', value: {digits: 4999, places: 2}}

2020年5月15日 星期五

RabbitMQ noAck設定

當接收者設定監聽訊息時 可以設定是否要回應MQ

noAck:true 表不需做任何確認
也就是說MQ將訊息送給consumer(接收者)後
就會立刻把這筆訊息由queue清掉

預設noAck為false
當producer送出訊息到MQ上
MQ將會通知有設定監聽的consumer
接收端在設定接聽時可以透過noAck設定是否必須要回應MQ
noAck:fasle 表一定要回應讓MQ知道工作已完成
若沒有回應,則訊息還在MQ內並不會被清除
下次還是會再重送
consumer的確認動作
只要執行channel.ack(msg)就可以了
注意 這裡的msg是由mq送過來的訊息物件
不要做任何修改 直接當作ack的參數

當接收者不在線上
sender發出後
當接收者後來才上線
無論noAck設定為何都會收到