2024年6月24日 星期一

PHP 於windows平台啟動 Unable to load dynamic library 'ext\\php_curl.dll' 如何排除?

 

太久沒碰PHP 設定了  在要使用curl時才發現 出現 Unable to load dynamic library 'ext\\php_curl.dll' 問題,原以為是版本或extension 路徑沒指向對,瞎找了一陣子,但後來想想 其它的dll 都可以載入正常為啥就php_curl  和OpenSSL 不能呢?


後來查到原來PHP 在5.6.6 之後可能會有因 php_curl.dll 和 ssleay32.dll/libssh2.dll/libeay32.dll 有匹配的問題,導致模組無法正常啟動,這從LOG檔中只會和你說無法載入,但並沒告訴你是因為它所用到的LIB有問題而造成, 因此如果要修正此問題


就要在 Apache.conf 之中 於loadFile 時手動將會用到dll 設定載入上來,如下:


LoadModule php5_module "C:/php-5.6.40/php5apache2_4.dll"
AddType application/x-httpd-php .php
PHPIniDir "C:/php-5.6.40"
# load curl and open ssl libraries
LoadFile "C:/php-5.6.40/libeay32.dll"
LoadFile "C:/php-5.6.40/ssleay32.dll"
LoadFile "C:/php-5.6.40/libssh2.dll"

再重啟apache 即可正常載入使用

2023年3月24日 星期五

JAVA 連線 Mysql8 出現 Unknown initial character set index '255' received 排除方法

 在進行MYSQL 舊版本升級時,在升級後連線時發現出現 Unknown initial character set index '255' received 這個錯誤訊息,上網查了一下,原來是charset編碼的問題,可以透過mysql client參數的方式去調整連線的編碼方式,可以調整如下:


jdbc:mysql://xxx.xxx.xxx.xxx:3306/DB?useUnicode=true&characterEncoding=utf8


這樣就可以連線上了,除了這個charset的指定外,如要連Mysql8像還有useSSL參數也要指定,不然也是還是會再報出錯誤的

2023年3月23日 星期四

Java 連結 Mysql 8出現java.sql.SQLException: Unable to load authentication plugin 'caching_sha2_password'排除方式

 升級資料庫升級到mysql8後,用JAVA程式連資料庫時出現了

java.sql.SQLException: Unable to load authentication plugin 'caching_sha2_password'.

 的錯誤訊息

上網查了一下,

5.7版本是:default_authentication_plugin=mysql_native_password 8.x版本就是:default_authentication_plugin=caching_sha2_password

一般是要修改密碼加密規則。換回舊的加密方式但這種方式加密規則變舊的安全性應該會有所降低

所以最好的方式就是同時更新JDBC Driver,可到此連結下載 https://dev.mysql.com/downloads/connector/j/






取得最新的JDBC,即可正常連線。

2023年1月5日 星期四

Navicat Mysql 8出現1251- Client does not support authentication protocol 排除方式

 最近在升級系統,資料庫升級到mysql8後,用程式或第三方工具連資料庫時出現了

1251- Client does not support authentication protocol  

或 Unable to load authentication plugin 'caching_sha2_password' 的錯誤訊息

上網查了一下,發現mysql8之前的版本使用的密碼加密規則是mysql_native_password,但是在mysql8則是caching_sha2_password,所以需要修改密碼加密規則。

網路上的解法就是要連入改密碼規則,可以使用

输入use mysql和select user,host,plugin,authentication_string from user;  查看目前使用者的密碼加密規則,如要調整,請執行以下語法:

alter user 'root' @'localhost' identified with mysql_native_password by 'yourpassword';

但這種解法還是用舊有加密規則,所以如要用新版加密規則,你的第三方資料庫連線工具就要升級才行,像Navicat 升到最新就可以支援了

2021年6月21日 星期一

eclipse svn 安裝

 全新的Eclipse ,預設沒有版本控管的程式,所以就要另外加裝,目前已經有非常多資源也很好安裝套件,安裝的方式如下:


Step 1. 在上方選單 H > Eclipse Marketplace  




Step 2. 在Marketplace 下svn 關鍵字,即可找到相關資源
這裡要注意,第一個 Subversive 請不要安裝,因為中間會卡住,沒仔細看,看來版本可能不符,所以別浪費時間安裝再排除問題了,直接往下拉找subclipse 這項套件,就按下install吧


Step 3.就一直往下安裝吧 會有選擇套件,REVIEW LICENSES等 就一直往下走

在此我有遇到一個問題,這只是遇到未加簽的軟體警告,直接按install anyway 

這樣就裝完啦,這時再去New Project,就會看到SVN選項了
END








eclipse IDE for JAVA全新安裝在windows平台

十多年沒有重裝eclipse ,換新電腦就更新至最新版吧

Step 1 .  先到Eclipse官網 下載安裝版



下載windows x86_64,目前只有64位元可以選啦,下載後就直接執行安裝吧

Step 2. 執行安裝檔


然後目前可以選擇要裝哪什麼樣的IDE工具,真是方便,古早先前如要各版本都要不同的安裝檔下載,然後就選擇 Eclipse IDE for Java Developers  
這個版本,他可以內建安裝JRE,我是改自己安裝OpenJDK ,windows 編譯檔在此



不過要注意,目前這個版本eclipse他只支援JDK 11 以上,所以你的版本在這之下,是無法設定上去的

Step 3.  結束

就這麼簡單,現在安裝太容易了!!



2020年5月7日 星期四

PHP程式更新後確沒有更新,有沒有想到是程式碼cache(opcache)?


最近在維護一個客戶的PHP系統
建置及虛擬空間都是別人的,所以很多設定都是不明確的

因此程式碼調整後更新上去,發現似乎沒有作用
花了不少時間確認自己的寫法,最後確認應該不是自己的問題
才想到會不會是 cache  造成?

寫了幾隻小程式,新寫的程式一丟上顯示符合預期
再改再丟上去更新後,顯示還是舊的版本,Shit 真的猜中了

再用個phpinfo() 來看看設定

嗯.....出現了以下錯誤

Warning:phpinfo() has been disabled

很好,沒有php 沒有啟用 phpinfo ,多半管這麼多的,一定設定了很多怪東東
上網查了一下php 的 cache 解決方案

最多人在提的就是 APC  及OPcache

先來試試APC,查了一下 除了設定參數外,可以用以下函式來清除快取,這種最好測試了

apc_clear_cache();
執行後出現了  undefined function ...所以看來不是啟用APC
再來換OPcache,查了一下,一樣他有函式就可以清除快取,執行如下:

opcache_reset();
用了,哈~真的就是它,程式總算可以正常了


相關參考連結:
http://blog.roachking.net/blog/2012/11/30/apc-for-faster-php/
https://www.php.net/manual/en/function.opcache-reset.php

2020年4月29日 星期三

如何隱藏Apache的版本資訊

弱掃被掃到這項 Http Server Type and Version
現在資安這麼嚴格,像這種資訊都是不能讓別人知道,以免被駭客利用該版本的弱點進行攻擊

好的,要隱藏版本資訊也是非常容易,只要在http.conf中加上以上兩個參數即可


ServerTokens Prod
ServerSignature Off

存檔後再重啟即可,要驗證是否有效時,可以使用cUrl工具進行檢查,指令如下:

curl -I -k https://www.yourdomain.com

加上-k 是因為要讀https的,要請工具忽略驗證憑證
原本會看到

HTTP/1.1 200 OK
Date: Wed, 27 April 2020 14:25:00 GMT
Server: Apache/2.4.18 (Ubuntu)
Last-Modified: Wed, 27 April 2020 14:25:00 GMT

Accept-Ranges: bytes
Content-Length: 2432
Vary: Accept-Encoding
Content-Type: text/html

加上後會變成這樣

HTTP/1.1 200 OK
Date: Wed, 27 April 2020 14:25:00 GMT
Server: Apache/2.4.43 (Ubuntu)
Last-Modified: Wed, 27 April 2020 14:25:00 GMT
Accept-Ranges: bytes
Content-Length: 2432
Vary: Accept-Encoding
Content-Type: text/html

如何關閉Apache的80 Port


因資安弱點掃描,原本有一對外的服務走的是Https 443 port,不過弱掃出來 中了這項

Web Servers HTTP TRACE / TRACK Methods  Allowed  Port 80

雖然對外防火牆只開443Port, 應該不會造成問題才是,不過即然掃出來了就封起來吧
預設apache是開啟80 Port ,443 Port是要另外開啟的,往往都另外開啟 443 Port  就忘了應該關閉80 Port,其實關閉的方式很簡單,只要在 httpd.conf 中找尋

Listen 80

把這行加上 # ,註解掉,再重啟 apache 即可

當然如果你是用VirtualHost,就要再去VirtualHost裡去改設定


話說目前各家瀏覽器對安全性要求愈來愈高,看來之後apache內建的預設版本可能會是預設啟用https


2020年3月20日 星期五

Fullcalendar 如何更改游標為手指

 Fullcalendar 行事曆套件蠻強大的,在許多案子上均有使用
但預設移至行事曆上游標是沒有手指符號的,其實Goggle行事曆也是沒有
不過真的要達到時,要如何處理呢?

測了很多,因為大多都是舊版的作法,新版 4.x 資訊很少
所以蠻多都無用途,不過有找到以下作法,加以調整後測試是可行的

照著下面加上後,就可以達到效果

.fc-today {
       cursor: pointer;
}
.fc-future:not(.fc-sat):not(.fc-sun) {
    cursor: pointer;
}
.fc-td-emptycell {
    pointer-events: none;
}
.fc-bgevent-skeleton {
    pointer-events: none;
}

.fc-bgevent-skeleton .fc-bgevent {
        pointer-events: auto;
}

.fc-content-skeleton {
    pointer-events: none;
}

 .fc-content-skeleton .fc-event {
        pointer-events: auto;
 }

記下來方便日後使用

參考資料:
https://stackoverflow.com/questions/58526184/fullcalendar-tooltip-not-working-correctly-when-events-rendering-option-is-equa

2020年2月14日 星期五

SQL Server 透過指令備份資料庫

在客戶的主機安裝系統,想說要幫忙設定備份資料庫
沒想到,SQL Server Agent 啟無法啟用

所以只好想到使用指令的方式進行備份,看你目前需要什麼樣的備份就執行以下的 script


1.完整備份
DECLARE
@backupTime VARCHAR(20)
DECLARE
@fileName VARCHAR(1000)
SELECT
@backupTime=(CONVERT(VARCHAR(8), GETDATE(), 112) +REPLACE(CONVERT(VARCHAR(5), GETDATE(), 114), ':', ''))
SELECT
@fileName='D:\Backup\DB\DBNAME_'+@backupTime+'.bak'
BACKUP DATABASE [DBNAME] TO  DISK =@fileName  WITH NOFORMAT, NOINIT,  NAME = N'db-ALL', SKIP, NOREWIND, NOUNLOAD,  STATS = 10

GO

2.差異備份
DECLARE
@backupTime VARCHAR(20)
DECLARE
@backupWeek VARCHAR(2)
DECLARE
@fileName VARCHAR(1000)
SELECT
@backupTime=(CONVERT(VARCHAR(8), GETDATE(), 112) +REPLACE(CONVERT(VARCHAR(5), GETDATE(), 114), ':', ''))
SELECT
@backupWeek=datepark(wk,getdate())
SELECT
@fileName='D:\Backup\DB\DBNAME_'+@backupTime+'_'+@backupWeek+'.bak'
BACKUP DATABASE [DBNAME] TO  DISK =@fileName  WITH DIFFERENTIAL, NOFORMAT, NOINIT,  NAME = N'db_DIFFERENTIAL', SKIP, NOREWIND, NOUNLOAD,  STATS = 10

GO

3.交易備份
DECLARE
@backupTime VARCHAR(20)
DECLARE
@backupWeek VARCHAR(2)
DECLARE
@fileName VARCHAR(1000)
SELECT
@backupTime=(CONVERT(VARCHAR(8), GETDATE(), 112) +REPLACE(CONVERT(VARCHAR(5), GETDATE(), 114), ':', ''))
SELECT
@backupWeek=datepark(wk,getdate())
SELECT
@fileName='D:\Backup\DB\DBNAME_'+@backupTime+'_'+@backupWeek+'tran.bak'
BACKUP DATABASE [DBNAME] TO  DISK =@fileName  WITH NO_TRUNCATE, NOFORMAT, NOINIT,  NAME = N'db_transaction', SKIP, NOREWIND, NOUNLOAD,  STATS = 10

GO


可以選擇其一種 存到sql script file (EX: dbbackup.sql),再執行以下command 指令 進行執行
sqlcmd -S  instanceName -E -i c:\dbbackup.sql

這樣就可以備份資料庫啦
再利用工作排程把這個指令加入排程即可

2020年1月22日 星期三

CSS SPAN 如何設定不換行 (nowrap)

HTML TABLE HEADER 有個nowrap 屬性,可以讓標題過長時不換行,對照CSS
也有類似的參數可以設定
只要在那個 span 設定以下CSS 即可排除

span
{
white-space : nowrap
}

在此記下來,就不多解釋了,想看原理,可參考以下連結文章
他寫的很完整又有示意

https://www.puritys.me/docs-blog/article-31-CSS-語法,文字換行,強迫不換行。.html

2020年1月7日 星期二

Tomcat 在windows 服務中的設定


很久沒有安裝Tomcat ,又忘了差不多了
在windows平台上,安裝好 tomcat 後,應要再調整一下記憶體的設定
因為原本的設定,在執行比較大的系統時很容易會Out of Memory
所以安裝後第一件事就是要依目前主機的配置調大記憶體的設定

就在右下方常駐區 找到Apache Tomcat 的圖示,滑鼠右鍵按下選第一個configure
跳出以下視窗時,選擇Java Tabab,會到看到下圖




















然後就可以在Java Option: 區塊 加上一些參數
-Dfile.encoding=UTF-8       (這參數有中文亂碼再加上 不然可能會有亂碼 )
-XX:+HeapDumpOnOutOfMemoryError (如果要觀察Memory leak)
-XX:HeapDumpPath           (參數指定log輸出的位置,請注意資料夾寫入權限的問題)。

-XX:PermSize=64m
-XX:MaxPermSize=192m
-XX:ReservedCodeCacheSize=48m

下方也記得給上初始記憶體及最大記憶體的大小

當套用後,再啟動服務,如服務啟動失敗,多半就是記憶體設太大造成資源無法取得所以啟動失敗,可以再重新調整一下

上述是GUI的調整方式,當然還有其它調整法,但如果是採用 windows  服務啟動Tomcat,就建議利用這種方式設定,簡單不麻煩。

2019年8月1日 星期四

Laravel 驗證訊息如何設定顯示自訂欄位名稱?



Laravel 的驗證功能蠻強大的,但一般的Example在寫時都沒有標示如何顯示自訂欄位名稱
導致在檢核欄位失敗要出現錯誤警訊時,只會顯示html 表單變數名稱,其實 Laravel的驗證模組就有包含這部份的設定了,只是在官網上似乎也沒有多做什麼說明,查了一下,使用上非常容易,只是大多的參考文件都是在強調如何設定自定的錯誤訊息,而非自定欄位名稱

好,那我們來看看要如何設定,如果使用$this->validate進行驗證,則範例如下:
$this->validate($request, [
                    'info' => 'required',
                    'data' => 'required',
                ], ['required' => '這是必填喔'],
                    [
                        'info' => '參考資訊',
                        'data' => '資料',
                    ]
                );


第一個參數傳入  request,  第二個傳入驗證欄位及驗證規則,第三個參數為自定義顯示錯誤,第四個參數就是自定義欄位名稱,就是這麼簡單,不過也花了不少時間去查
如果是使用Validator::make,可以使用setAttributeNames 進行設定,範例如下:

$niceNames = array(
    'info' => '參考資訊',
    'data' => '資料',
);

$validator = Validator::make(Input::all(), $rules);
$validator->setAttributeNames($niceNames);


參考連結:
https://segmentfault.com/q/1010000011839409
https://laravel.tw/docs/master/validation
http://blog.tonycube.com/2015/01/laravel-14-form.html
https://www.ccc.tc/article/laravel-validator-custom-crror-messages

2019年7月18日 星期四

PHP 日期格式字串的轉換EX: YYYY-MM-DD 轉換 MM/DD/YYYY

PHP 日期格式字串的轉換 像YYYY-MM-DD 轉換 MM/DD/YYYY 要如何進行呢?

原本想可能有點麻煩,沒想到出乎意料的容易
真是強大的語言呀

今天要來介紹的就是  strtotime,不過要換格式還是要搭配 date函式,在PHP date 一開始就可以使用制定的格式產出日期字串 ,以下就是Date的格式參數:

a am 或 pm
A  AM 或 PM
d 日,二位數,不足二位數補零; 如 01至 31
D 星期,三個英文字; 如 Fri
F 月份,全名; 如 January
g 小時,12 小時制; 如: 1 至 12
G 小時,24 小時制; 如: 0 至 23
h 小時,12 小時制,不足二位數補零; 如 01 至 12
H 小時,24 小時制,不足二位數補零; 如 00 至 23
i 分; 如: 00 至 59
j 日; 如: 1 至 31
l 星期,全名; 如: Friday
m 月,二位數,不足二位數補零; 如 01 至 12
M 月,三個英文字; 如: Jan
n 月; 如: 1 至 12
O 和格林威治標準時間的小時差異數
s 秒; 如: 00 至 59
S 日之後加的序數; 如: th、nd
t 月的總天數; 如: 28 至 31
T 本機的時區
U 自 1970/1/1 00:00:00 以來的秒數
w 星期,個位數字; 如 0 至 6
Y 年,四位數; 如: 1999
y 年,二位數; 如: 99
z 一年的第幾天; 如: 0 至 365

不在上列的字元將直接顯示。

看來和其它語言的Date Format差不多,但它只點搭配strtotime就更強大了,我們先來解答一下如何將 YYYY-MM-DD 格式的日期字串轉換 MM/DD/YYYY格式呢?
$date1=date("Y-m-d");
$showDate=date("m/D/Y",strtotime($date1));

簡簡單單短短一行就搞定了,原本還想說要自己先將字串 轉成日期變數再去重新定義日期格式產出字串,現在都不用了,而且strtotime判斷日期格式的字串功力還非常的強大,除此之外還有一些特別的日期運算能力,我就不多說直接看範例:

echo strtotime("now"), "\n";
echo strtotime("10 September 2000"), "\n";
echo strtotime("+1 day"), "\n";
echo strtotime("+1 week"), "\n";
echo strtotime("+1 week 2 days 4 hours 2 seconds"), "\n";
echo strtotime("next Thursday"), "\n";
echo strtotime("last Monday"), "\n";

這樣看的懂嗎? 很簡單吧,它還可以進行日期的加總或以設定的時間產出日期字串,除此之外也可以拿來進行日期格式的驗證,範例如下 :

$str = 'Not Good';
// previous to PHP 5.1.0 you would compare with -1, instead of false
if (($timestamp = strtotime($str)) === false) {
echo "The string ($str) is bogus";
} else {
echo "$str == " . date('l dS of F Y h:i:s A', $timestamp);
}

所以對日期格式的轉換或驗證是不是在PHP上更加的容易呢?

參考資料:
https://www.php.net/strtotime

2019年7月16日 星期二

如何排除 Laravel 問題:Cannot use object of type stdClass as array in Laravel



在使用DB查詢後取得查詢結果時出現這個錯誤Cannot use object of type stdClass as array ...
查了一下,發現在Laravel好像蠻多人都有遇到這個問題

$data = DB::table('users')->where('id',$id)->first();
if($data) {
    $user->isOpen=$datapen=$data['isOpen'];
 }

原以為他是Array,應該直接這樣取值即可,但就是會報錯
去查了一下原來要改用以下方式取值才不會報錯

$data = DB::table('users')->where('id',$id)->first();
if($data) {
    $user->isOpen=$datapen=$data->isOpen;
 }

不知為何原理,變成物件了? 但如果直接用dd  去看又說它是array
還是先記下來,以後有空再深入瞭解。

2019年7月3日 星期三

Laravel 如何登出系統?



記錄一下,在Laravel未登出前如果導向到登入頁
預設還是會登入的,所以要先手動登出系統才行

如果在Auth之中,則用以下指令即可
$this->guard()->logout();

如果是從Controller 或是其它地方,則可以直接使用Auth物件
if (Auth::check()) {

Auth::logout();

};

2019年6月25日 星期二

Docker 中如何重啟apache & OPcache reload

最近進行中的專案,有用到OPCache
很怪,OPCache 常常會無法照Cache檔顯示
狀況不明,在沒空查參數情況下,重啟就能正常更新 當然直接更新再說

在Docker中要重啟apache就能讓OPCache reload,所以我們可以執行以下指令來達到重啟 (以CentOS為例):


docker-compose exec your-image-name httpd -k graceful

graceful 也可以換成restart,我以前都是使用restart 但上網看了其它人的說明

我們如果要在不重新啟動 Apache 的情況下重新載入設定檔,就要用到 graceful 這個指令,它會傳送一個 SIGUSR1 的信號(signal)給 Apache 伺服器,讓 Apache 很優雅的(graceful)重新啟動。如果 Apache 本來就沒有在執行,那麼它會直接啟動(start)。

graceful 跟 restart 不太一樣,他不會像 restart 一樣直接中斷目前正在進行的連線,而是會等待所有的連線都結束之後,才會重新啟動、載入設定檔,並且重新開啟 log 紀錄檔。而 graceful 在重新啟動之前,也會使用 apache2ctl configtest 來測試設定檔是否正確。

看來graceful 是更加完善的重啟,所以之後多半就改用這個吧!!

2019年6月13日 星期四

Laravel 重新安裝套件


Laravel 重新安裝套件

最近在小試Laravel 一開始執行的還算順利
但不知為何,在下完清cache指令後就都無法正常執行了

php artisan cache:clear
php artisan config:clear
php artisan view:clear
只會出現Error 500

在為了不想花時間追這怪問題(其實也已經花了不少)
所以想說重新再來一次好了

但重新再來一次,發現無法正常運行 出現啟動不了問題
出現了 ...vendor/autoload.php  not Found
查了一下發現是Vendor並沒有在第一次啟用時下載載入

蠻怪的,該不會是先前的project 已載入,所以就不載入? 
看來之後要先去好好看一下Laravel的架構才行

排除方式,執行

composer update

讓他更新下載, 有點久因為算是第一次載入
完成後,第二次建立的專案,就可以正常運行了


2019年4月4日 星期四

PHP 強大的substr

用久了其它語言再來用PHP
就會覺得 PHP真是強大

程式可以寫的也愈來愈少行,當然愈來愈寫的看不懂 哈
今天來讚嘆一下substr ,最近在處理PHP時才發現原來PHP的substr

之前在寫JAVA,當遇到要從字串截右方算起3字時,程式要寫成這樣


String data=new String("123456abcdef");
data.subString(data.Length()-3,data.Length());

javascript 要用以下寫法:

var data="123456abcdef";
data=data.substr(data.length - 3);

不然也有slice() 可以使用

var data="123456abcdef";
data=data.slice(-3);

而PHP更利害了,可以直接像javascript slice()的寫法就可以了

$data="123456abcdef";
$data=substr($data,-3);

簡簡單單又少人家一些程式碼
真怕寫久了,其它語言回去會有障礙 哈 哈