2017年12月25日 星期一

[IPPBX] 設定及登入AMI(Asterisk Manager interface)

1.設定manager.conf

[general]
enabled = yes
port = 5038 << 登入的port
bindaddr = 0.0.0.0
displayconnects=no ;only effects 1.6+

[admin] << 帳號
secret = password << 密碼
deny=0.0.0.0/0.0.0.0 << 封鎖的IP
permit=127.0.0.1/255.255.255.0 << 開放的IP
read = system,call,log,verbose,command,agent,user,config,command,dtmf,reporting,cdr,dialplan,originate
write = system,call,log,verbose,command,agent,user,config,command,dtmf,reporting,cdr,dialplan,originate
writetimeout = 5000

2.登入方式
action: login
username: admin
secret: password
Events: on

[linux] samba設定

學習了Elastix及Asterisk多少要接觸linux
但畢竟用vi編輯實在不方便
還是開個samba來編輯檔案快多了
所以筆記一下samba的安裝

1.編輯/etc/samba/smb.conf
[sharename]
path = /etc/asterisk
comment = Asterisk Directory
browseable = yes  << 能否給其他人瀏覽
writable = yes << 能否寫入

security = user << 設定要輸入帳號密碼
security = share << 設定為公開

2.設定使用者
pdbedit -a|-r|-x -u 帳號    << 新增/修改/刪除帳號
pdbedit -L << 列出user清單

3.啟動服務
Elastix安裝好後已經有支援samba但預設沒啟動
網路上google到的有兩個版本都記錄下來
一個版本為
sudo /etc/init.d/smbd start
sudo service smbd start

另一版本
systemctl enable smb
systemctl enable nmb
systemctl restart smb
systemctl restart nmb

另一版本
sudo /etc/init.d/smb start
sudo /etc/init.d/nmb start
chkconfig smb on
chkconfig nmb on

4.重啟、停止服務
sudo service smbd restart
sudo service smbd stop
sudo /etc/init.d/smbd restart
sudo /etc/init.d/smbd stop
如果不行則增加 sudo service nmbd restart

因為是個人使用先以服務能開啟為主
其他部分有空再來深入研究

後記,最近發生了裝好samba後開機時不會自動啟動服務
後來查到設定方法(for CentOS)
請以以下指令確認smb是在啟動時執行的:
chkconfig --list |grep smb

設定smb不於開機時啟動
chkconfig smb off

設定smb於開機時啟動
chkconfig smb on

[IPPBX] 更改Asterisk的sip 5060 port

Asterisk預設的sip註冊的port是5060
但這port容易被攻擊所以最好可以改掉

在sip_general_custom.conf中加入
bindport=1234 <=指定的port

2017年11月30日 星期四

[SQL] MSSQL暫存資料表

當JOIN太多資料表或使用UNION時有時效能會變得很差,語法也相對變得複雜也難閱讀,這時暫存資料表就派上用場


1.使用DECLARE @TEMPTABLE TABLE
資料存放在記憶體,速度快但不太適合存太多筆資料,生命週期為一個批次

DECLARE @TEAMPTABLE TABLE(
  book VARCHAR(30),
  price int,
)

INSERT INTO @TEAMPTABLE (book, price) SELECT book, price FROM books WHERE (price = 100)

SELECT * FROM @TEAMPTABLE


2.使用CREATE TABLE #TEMPTABLE
資料存放在tempdb,生命週期為多個批次,session結束後自動刪除

CREATE TABLE #TEMPTABLE(
  book VARCHAR(30),
  price int,
)

INSERT INTO #TEMPTABLE (book, price) SELECT book, price FROM books WHERE (price = 100)

SELECT * FROM #TEMPTABLE


另外在語法前後加上以下語法可確保#TEMPTABLE有被DROP掉

IF Object_id('tempdb..#TEMPTABLE') IS NOT NULL
BEGIN
  DROP TABLE #TEMPTABLE
END


小技巧1:若有需要從TEMPTABLE回寫原資料表,且要新的ID以免重複時可使用ROW_NUMBER()增加一個新ID欄位

ROW_NUMBER() OVER(ORDER BY RowID) + (SELECT MAX(RowID) FROM book))


小技巧2:快速複製資料表結構
SELECT TOP 0 * INTO #TEMPTABLE FROM book

顯示高亮度程式碼(SyntaxHighlighter教學)

建立了Blogger來當自己的程式小筆記,既然是程式小筆記當然希望程式的範例能夠看起來像是在程式編輯器上的樣式,一個方式可以自訂CSS,好處是速度快但變化較少,另外就是使用外掛,好處是樣式漂亮,缺點是既然是使用第三方的外掛如果服務停止樣式就會失效而且會影響網頁速度,各有利弊請看倌們自己選擇囉。
google了一下找了一個覺得好設定的外掛SyntaxHighlighter,只是設定完後沒多久心血來潮改個主題樣式,改完後馬上傻眼,原來會蓋掉原先加上去的code,不過還好剛剛說了外掛還蠻好設定,一下就復原了,不過怕忘記怎麼設定,還是筆記一下免得下次又做了蠢事還要再google一次,以下為設定方式

請注意,使用此外掛在連結Blogger不能使用https,外掛會失效,以及編輯時無法預覽,建議最後再加上程式碼
以下為加入外掛步驟:
1.進入Blogger後台->主題->編輯HTML
在<head></head>之間加入以下code

<!-- Include required JS files -->
<script src="https://alexgorbatchev.com/pub/sh/current/scripts/shCore.js" type="text/javascript"></script>

<!--
  At least one brush, here we choose JS. You need to include a brush for every
  language you want to highlight
  http://alexgorbatchev.com/SyntaxHighlighter/manual/brushes/
-->
<script src="https://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js" type="text/javascript"></script>

<!-- Include *at least* the core style and default theme -->
<link href="https://alexgorbatchev.com/pub/sh/current/styles/shCore.css" rel="stylesheet" type="text/css"></link>
<link href="https://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css" rel="stylesheet" type="text/css"></link>

<!-- Finally, to actually run the highlighter, you need to include this JS on your page -->
<script type="text/javascript">
     SyntaxHighlighter.all()
</script>

另外要顯示不同的script要加入對應的js
<script src="https://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js" type="text/javascript"></script>
shBrushJScript.js改成自己需要的,如果你的Blogger需要多個script就新增多個上去
以下為網站上顯示的對照表
brushes清單

2.使用HTML編輯文章加入以下Code
<pre class="brush: script名稱">
  code....
</pre>
加入就會出現以下結果了

if(a==1)
{
  b=a;
}

2017年11月29日 星期三

[SQL] T-SQL使用CURSOR來跑迴圈

初期在公司主要是寫ASP,DB的部分涉入不深,單純是新增或修改資料表而已,之後才慢慢開始我的資料匯入人生,在一堆資料中打滾,既然要匯入資料當然開始常操作資料庫,覺得還是要多學學T-SQL的語法,有時會需要逐筆更新資料,能夠寫迴圈當然會方便很多啦,看完這些廢話再來就是主題了


使用CURSOR來跑迴圈,以下範例

DECLARE @RowID int
DECLARE @uid varchar(10)
DECLARE @sex varchar(4)

DECLARE temp_cursor CURSOR FOR
  SELECT RowID, uid FROM tempTable
OPEN temp_cursor

FETCH NEXT FROM temp_cursor INTO @RowID, @uid
/*
 @@FETCH_STATUS
 0 FETCH 陳述式順利執行
-1 FETCH 陳述式失敗,或資料列超出結果集
-2 擷取的資料列已遺漏
*/
WHILE @@FETCH_STATUS = 0
BEGIN
  SET @sex=''
  IF LEN(@uid)=8 SET @sex='公司'
  IF LEN(@uid)=10 AND SUBSTRING(@uid,2,1)='1' SET @sex='男'
  IF LEN(@uid)=10 AND SUBSTRING(@uid,2,1)='2' SET @sex='女'

  IF @sex<>''
    UPDATE tempTable SET sex=@sex WHERE RowID=@RowID

  FETCH NEXT FROM temp_cursor INTO @RowID, @uid
END

CLOSE temp_cursor
DEALLOCATE temp_cursor

[SQL] DBCC CHECKDB修復資料庫、CHECKTABLE修復資料表

最近公司資料庫排程一直跳出錯誤,備份資料庫無法作完整驗證、重新組織索引及重建索引都失敗,上網查詢了一下可以使用DBCC CHECKDB檢查資料庫,CHECKDB依硬碟大小及IO能力決定檢查時間,資料庫大時可能要不少時間,平日可以改用CHECKTABLE來分批檢查,沒想到一檢查下去果真出現錯誤,使用REPAIR修復的話可針對資料庫或資料表進行修復,但有資料損失的風險

1. DBCC CHECKDB
重啟伺服器後,在沒有進行任何操作的情況下,在SQL查詢分析器中執行以下SQL進行資料庫的修復,修復資料庫存在的一致性錯誤與分配錯誤。

use master
declare @databasename Varchar(255)
set @databasename='需要修復的資料庫實體的名稱'
--將目標資料庫置為單使用者狀態
exec sp_dboption @databasename, N'single', N'true'
dbcc checkdb(@databasename,REPAIR_ALLOW_DATA_LOSS)
dbcc checkdb(@databasename,REPAIR_REBUILD)
--將目標資料庫置為多使用者狀態
exec sp_dboption @databasename, N'single', N'false'

然後執行 DBCC CHECKDB('需要修復的資料庫實體的名稱') 檢查資料庫是否仍舊存在錯誤。


2. DBCC CHECKTABLE
如果DBCC CHECKDB 檢查仍舊存在錯誤,可以使用DBCC CHECKTABLE來修復。

use 需要修復的資料庫實體的名稱
declare @dbname Varchar(255)
set @dbname='需要修復的資料庫實體的名稱'
--將目標資料庫置為單使用者狀態
exec sp_dboption @dbname,'single user','true'
dbcc checktable('需要修復的資料表的名稱',REPAIR_ALLOW_DATA_LOSS)
dbcc checktable('需要修復的資料表的名稱',REPAIR_REBUILD
--將目標資料庫置為多使用者狀態
exec sp_dboption @dbname,'single user','false'

3. 其他的一些常用的修復命令

DBCC DBREINDEX 重建指定資料庫中表的一個或多個索引

用法:DBCC DBREINDEX (表名,’’) 修復此表所有的索引

不過修復資料庫有損失資料的風險
1.如果是修復資料庫可以先卸離資料庫備份一份後再進行操作
2.如果是修復資料表的話可以先把資料表匯出可存取的資料至新的資料表,再用DBCC CHECKTABLE檢查是否還有錯誤,若沒有錯的話可以將舊資料表刪除後,把新資料表改回原資料表名稱