毎週Beds24のAPIから稼働室数をメールするスクリプトを書いた。
前回と前々回の記事から作った。
//メインの関数 function mailOccupancyData(){ getDataFromBeds24() mailToMyself('yourmailaddress') } //Beds24からいろいろ情報を取ってくる。 function getDataFromBeds24() { //初期設定などはここから //username はBeds24で登録しているメアド var username = "your@mailaddress" //passwordはBeds24のAPI KEY var password = "yourAPIKEY" //このスクリプトを配置しているSpreadsheetのID var shid = "yourspreadsheetid" //いつから(datefrom)いつまで(dateto) var datefrom = "2019-10-01" var dateto = "2020-01-31" //roomid(Beds24の部屋ID) var roomid = ["roomid","roomid"] //ここまでは各自書き換えてください。 var url = "https://www.beds24.com/api/csv/getroomdailycsv" var sp = SpreadsheetApp.openById(shid) var sheets = sp.getSheets() if(roomid.length>sp.getNumSheets()){ for (var i=1 ; i <= roomid.length; i++){ sp.insertSheet() } } for (var i=0 ; i < roomid.length ; i++){ var options = { method:"post", followRedirects:false, payload:{ username:username, password:password, propid:"yourpropid", roomid:roomid[i], datefrom:datefrom, dateto:dateto } } var res = UrlFetchApp.fetch(url,options) var csvfile = Utilities.parseCsv(res) Logger.log(i) var firstsh = sheets[i] firstsh.clear() firstsh.getRange(1,1,csvfile.length,csvfile[0].length).setValues(csvfile) Utilities.sleep(5000) } //最後のシートにクエリ関数を作成する var sh = sheets[sheets.length-1].activate() var formula = "=QUERY({" for (i in roomid){ formula += sheets[i].getName() + '!A2:L;' } formula = formula.slice(0,-1) formula += '\},\"select Col1 ,Col2 ,sum(Col5) where Col2 is not null group by Col1 , Col2 label sum(Col5) \'\'\")' //Logger.log(formula) sh.getRange('A1').setFormula(formula) //Logger.log(sh.getRange('B4').getValue()) } //稼働率を計算してメールするスクリプト function mailToMyself(mail){ var sh = SpreadsheetApp.getActive().getSheets() var data = sh[sh.length-1].getDataRange().getValues() var message = "" for (i in data){ Logger.log(i) message += data[i][0] + '年' + data[i][1] + '月の稼働部屋数は' + data[i][2] + 'です\n' } MailApp.sendEmail(mail,'稼働率報告',message) }
これをトリガー登録できるようにしておしまい。
gasでBeds24のAPIにアクセスする②
今度はCSVファイルをSpreadsheetに書き込んでみた。
パスワードがAPI KEYであることに気づかずに結構グダったが、まぁできた。
function myFunction() { var username = "yourusername" var password = "youAPIKEY!!!" var url = "https://www.beds24.com/api/csv/getbookingscsv" var options = { method:"post", followRedirects:false, payload:{ username:username, password:password, datefrom:"2019-12-31", dateto:"2020-01-01" } } var res = UrlFetchApp.fetch(url,options) var csvfile = Utilities.parseCsv(res) var sp = SpreadsheetApp.create("テストです") sh = sp.getSheets()[0] sh.getRange(1,1,csvfile.length,csvfile[0].length).setValues(csvfile) }
gasでBeds24のAPIにアクセスする
備忘録的な話
beds24というPMSを使うことにした。なぜならAPIによるアクセスが出来るから。
手始めにGASでAPIにアクセスしてみた。なぜGASなのかというと・・
ということでその辺をよしなにやってくれるGASで試してみた。
必要なもの
- APIキー
beds24の設定>アカウント>アカウントアクセス>API KEY で確認できる
- 施設キー
beds24の設定>プロパティ>概要>リンク で確認できる
- 部屋ID
beds24の設定>プロパティ>部屋 で確認できる
以下コード今回は単純にLogger.logで出力しているが、JSON.parse()とかを使えばあとは好きな風にできると思う。
APIエンドポイントは今回はRoomDatesを使ったが、ほかのURLでも同じようにJSONをPOSTすれば望んだJSONを得ることができると思う。
それではよいAPIライフを!
function beds24apitest(){ var FACILITY_AT = "youraccesstoken" var PROPERTY_AT = "yourpropkey" var url = "https://api.beds24.com/json/getRoomDates" var payload = { "authentication": { "apiKey":FACILITY_AT, "propKey": PROPERTY_AT }, "roomId": yourroomid, "from": "20191231", "to": "20200101", "incMaxStay": 0, "incMultiplier": 0, "incOverride": 0, "allowInventoryNegative": 0 } var options = { method : "POST", contentType:"application/json", muteHttpExceptions:true, payload : JSON.stringify(payload) } var res = UrlFetchApp.fetch(url,options) Logger.log(res) }
Powershellを始めてみる
だって面白そうだったから・・
PowerShell実践ガイドブック ~クロスプラットフォーム対応の次世代シェルを徹底解説~
- 作者: 吉崎生
- 出版社/メーカー: マイナビ出版
- 発売日: 2018/05/30
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
これを少しずつ写経していくことにする
まずインストール。え、powershellって最初から入ってるんじゃないの??
→どうやら最初から入ってるのはWindows Powershell こっちで使うのはPowershell Coreでどちらもほぼ同じだが機能が一部違うらしい。
文章作り、item1.txtからitem10.txtを作ってみる。
\PowerShellPractice> 1..10 | ForEach-Object{"" > item$_.txt}
1行だ、簡単。
なんでも1..10
で連番が使えるらしい。ということは・・・
>$exmpl = 1..10 >ForEach-Object{"" > item$exmpl.txt}
としてみた。
なぜか思ったようには動かなかった。
今日はそんくらい。じっくり覚えようか迷う。正直Pythonでもいいんだけど新しい言語覚えるのは楽しい。
windowsにprophetをインストールする。
普通にpip install fbprophet
だと入らなかったので。
バックエンドでpystanを使用しているのだが、それがwindowsだとpipで入らないのでいくつかの準備が必要だった。
ここをみながらインストールした。
前提としてAnacondaを利用してインストールする。
Anacondaのインストールはこちら
まずはupdate
conda update conda
conda install libpython m2w64-toolchain -c msys2
依存関係のインストール
conda install numpy cython -c conda-forge conda install matplotlib scipy pandas -c conda-forge
pystanのインストール
conda install pystan -c conda-forge
最後にfbprophetのインストール
pip instal fbprophet
最後だけpip
なのはconda install fbprophet -c conda-forge
で入らなかったため。
本当は混ぜたらいけないのだけれど、なぜかpipだと入った。
さくらのVPSにAsteriskを設定し、内線通話するまで
自分用に
- まずはOSを選択
- アップデートとaptitudeのインストール
- fail2banのインストール
- 設定ファイルを書く
- iptablesの設定
- asteriskのインストール
- sip.conf, extensions.confのバックアップを取った後、適当に書き換える
- 出典
まずはOSを選択
自分はUbuntu 16.04 LTS
を選びました。Asteriskが簡単にインストールできるため。
ただしスタートアップスクリプトでufwは使わないほうがいいと思います。fail2banとコンフリクトしそうな気がします。
アップデートとaptitudeのインストール
sudo apt update sudo apt upgrade sudo apt-get install aptitude
fail2banのインストール
sudo aptitude install fail2ban
設定ファイルを書く
最初にfail2banはjail.confファイルを直接編集することは推奨されていないため、jail.localファイルを編集するようにする。
cd /etc/fail2ban sudo cp jail.conf jail.local sudo nano jail.local
jail.localに以下の文を追記する
[asterisk-iptables]と[blacklist]を設定してやる
[asterisk-iptables] enabled = true filter = asterisk action = iptables-allports[name=ASTERISK, protocol=all] sendmail-whois[name=ASTERISK, dest=root, sender=fail2ban@example.org] logpath = /var/log/asterisk/security maxretry = 5 bantime = 259200 [blacklist] enabled = true logpath = /var/log/fail2ban.* filter = blacklist banaction = blacklist bantime = 31536000 ; 1 year findtime = 31536000 ; 1 year maxretry = 10
blacklistの作成
// /etc/fail2ban/filter.d/blacklist.conf の作成 $ cd /etc/fail2ban/filter.d $ sudo wget https://raw.githubusercontent.com/mitchellkrogza/Fail2Ban-Blacklist-JAIL-for-Repeat-Offenders-with-Perma-Extended-Banning/master/filter.d/blacklist.conf -O blacklist.conf // /etc/fail2ban/action.d/blacklist.conf の作成 $ cd /etc/fail2ban/action.d $ sudo wget https://raw.githubusercontent.com/mitchellkrogza/Fail2Ban-Blacklist-JAIL-for-Repeat-Offenders-with-Perma-Extended-Banning/master/action.d/blacklist.conf -O blacklist.conf
/etc/fail2ban/filter.d
のasterisk.conf
ファイルを編集する
まずはファイルのバックアップ
cd /etc/fail2ban/filter.d mv asterisk.conf asterisk.conf.old
nano asterisk.conf
で以下の内容のファイルを作る
# Fail2Ban configuration file # # # $Revision: 250 $ # [INCLUDES] # Read common prefixes. If any customizations available -- read them from # common.local #before = common.conf [Definition] #_daemon = asterisk # Option: failregex # Notes.: regex to match the password failures messages in the logfile. The # host must be matched by a group named "host". The tag "<HOST>" can # be used for standard IP/hostname matching and is only an alias for # (?:::f{4,6}:)?(?P<host>\S+) # Values: TEXT # failregex = SECURITY.* SecurityEvent="FailedACL".*RemoteAddress=".+?/.+?/<HOST>/.+?".* SECURITY.* SecurityEvent="InvalidAccountID".*RemoteAddress=".+?/.+?/<HOST>/.+?".* SECURITY.* SecurityEvent="ChallengeResponseFailed".*RemoteAddress=".+?/.+?/<HOST>/.+?".* SECURITY.* SecurityEvent="InvalidPassword".*RemoteAddress=".+?/.+?/<HOST>/.+?".* # Option: ignoreregex # Notes.: regex to ignore. If this regex matches, the line is ignored. # Values: TEXT # ignoreregex =
fail2banの再起動
sudo service fail2ban restart
起動する場合はsudo service fail2ban start
iptablesの設定
/etc/iptables/iptables.rules
を設定する
まずはバックアップ
cd /etc/iptables sudo mv iptables.rules iptables.rules.old
んでsudo nano iptables.rules
で以下を記述する
port:5060 UDP:10000~20000だと乗っ取りが怖いので多少変更してやる
具体的にはport:15060 UDP:20000~30000
設定がうまくいかなかったため、そのままでいくことにした。
*filter :INPUT DROP [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -p udp -m udp --dport 5060 -j ACCEPT -A INPUT -p tcp -m tcp --dport 5060 -j ACCEPT -A INPUT -p udp -m udp --dport 10000:20000 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT
sudo iptables-restore > /etc/iptables/iptables.rules
でiptablesを再起動する。
sudoが絶対必要なので忘れない!!
asteriskのインストール
sudo aptitude install asterisk
sip.conf, extensions.confのバックアップを取った後、適当に書き換える
cd /etc/asterisk sudo mv sip.conf sip.conf.old sudo mv extensions.conf extensions.conf.old
sip.conf
[general] context=default port=5060 bindaddr=0.0.0.0 language=ja allow = ulaw allow = alaw allow = gsm allow = ilbc dtmfmode = inband [201] type=friend defaultuser=201 secret=pass host=dynamic canreinvite=no nat = force_rport,comedia [202] type=friend defaultuser=202 secret=pass host=dynamic canreinvite=no nat = force_rport,comedia
extensions.conf
[default] ; ; By default we include the demo. In a production system, you ; probably don't want to have the demo there. ; ;include => demo exten => 201,1,Dial(SIP/201,30,r) exten => 201,2,Hangup() exten => 202,1,Dial(SIP/202,30,r) exten => 202,2,Hangup() exten => 203,1,Answer() exten => 203,2,Playback(hello-world) exten => 203,3,Hangup()
以上でつながるはず。
出典
【Android Studio】Ankoが入らない
110P~Ankoセットアップについて
こちらの勉強をしているのだがバージョンの為か微妙に入らなかった。
- 作者: 金田浩明
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2018/04/20
- メディア: 単行本
- この商品を含むブログを見る
P110には正誤表があるのでそれをもとに最新のAnkoのバージョンにしたが、P111も訂正しなくてはいけなかった。
×:implementation "org.jetbrains.anko:anko-common:$anko_version"
〇:implementation "org.jetbrains.anko:anko-commons:$anko_version"