2018-10-25

初玩 Flutter

環境:win7 x64 + vscode + android studio
參考網頁:https://jonny-huang.github.io/flutter/flutter_001/

依參考網頁的步驟做就行了,但…我在建立首個 Flutter project 之前我有發現我在建立  AVD 時的「Emulated Performance」的 Graphics 是灰的不能選…而且實際啟動 AVD 發現 CPU (i5 4460) 全核是 100% ,然後溫度大概維持在 74度 左右,我當下確實電腦還有在跑其他東西,但使用率 100% 我倒是第一次見過…感覺上是因為都是用軟體模擬的關係造成的…就網路上一直找辦法。

2018-10-17

關於 javascript 的 IIFE

IIFE:Immediately-invoked Function Expressions,是指一個被(瀏覽器)定義完後就馬上執行的函式(或叫方法)的表達方式。

先說明一下,函數的表達有所謂的函數宣告和函數運算式的常用方式;
函數宣告
<script>
a(1);
function a(x) {
  console.log( 'x = ' + x );
}
a(2);
/*
* console output:
* x = 1 ( a(1) 呼叫 a(x) function 運行 console.log( 'x = ' + x ) )
* x = 2 ( a(2) 呼叫 a(x) function 運行 console.log( 'x = ' + x ) )
*/
</script>

函數運算式
<script>
a(1);
var a = function(x) {
  console.log( 'x = ' + x );
}
a(2);
/*
* console output:
* TypeError: a is not a function; ( 不能在函數運算式之前來呼叫函式 )
* x = 2 ( a(2) 呼叫 a(x) function 運行 console.log( 'x = ' + x ) )
*/
</script>
兩種的差別,以我的看法,我覺得所謂函數運算式比較像 object 或變數的定義方式…而 IIFE 好像就沒有函數運算式的定義方式,因為 IIFE 會直接運行,所以會把 IIFE 的結果直接給予定義,然後會依其結果而定義成變數或 object 。
另外,函數宣告和函數運算式在 ECMAscript 的定義上是有其標準的,譬如函數宣告被放在巢狀結構範圍中就不能算是函數宣告,而是函數運算式。

2018-10-16

emoji 文字存進 mysql (mariadb) 中變問號(????)!!!!

現在手邊的這個案子真的讓我碰到不少以前顯少會想到或遇到的小麻煩,麻煩不大,但很碎。

不過會這樣碎,大概也跟我自己亂弄有關吧…

----
回正題

這次遇到的狀況是

「我用 ckeditor 在建立訊息,訊息中用了 emoji speech-ballon (💬) 符號,然後透過 php 將訊息存入 mysql 中,存好後撈出資料放在網頁上,遇到該 emoji 符號變 ???? ,四個問號;檢查資料庫中該符號的狀態,也確實是 ???? 四個問號,但並不是每一個 emoji 符號都是四個問號,也有正常顯示的。」

分析:

  1. 使用 ckeditor
  2. emoji
  3. mysql
debug:
  1. ckeditor 我用的只是單純屬前端的版本,網頁 html, php, mysql 我都有確認都有用 utf8 charset ,而且 emoji 符號在 ckeditor 的編輯區中是正常顯示的,所以 ckeditor 應該是沒問題的。
  2. emoji 本身只要你用的瀏覽器不要太舊,基本都內建,而因為 emoji 是 unicode ,所以網頁最好是用 utf8 ,而這點我確認是 ok 的,而且並不是每個 emoji 都異常。
  3. mysql 我內部設定是使用 utf8mb4 ,db, table 的編碼和 table 有中文的欄位編碼我都是設定 utf8mb4 ,但我 php pdo connection 是設定「charset=utf8」,我在「」看到了版主說明了 utf8 不一定都是 3 bytes ,也有 4 bytes 的,而 mysql 的 utf8mb4 就是支援到了 4 bytes ,然後我在「」查到 💬 是 4bytes ;所以,問題找到了,是我做 php pdo connection 使用 charset=utf8 的關係,雖然大部份的資料寫入資料庫跟從資料庫讀出都沒啥狀況,但遇到 utf8 4bytes 就會有異常, php 處理過程沒有報錯,但資料確實是 utf8 4bytes 塞不進 utf8 3bytes 的 connection 中…所以將 php pdo connection charset 改為 utf8mb4 後,一切都正常了。
總結:
是我懶,用 utf8mb4 是想用新的編碼也是想說可以避過一些文字上的問題,結果,最後的原因還是自己忘了把一切的 connection 改 utf8mb4 ,害自己找資料翻過頭。

SELinux 開放指定的資料匣可以讓 web.service 上傳

這個問題很老我知道…

我從 fedora 2 開始玩到現在的 Centos 7 ,越到後面在用網頁伺服器時最常遇到的就是在透過網頁端上傳資料到伺服端時的權限問題。

印象中很早前好像還沒有 SELinux 的保護機制,然後直到開始使用這個機制時有真的會累到乾脆就停用算了…不然一直在找解決方法或者 setsebool 改來改去都覺得累,關掉比較一了百了。

-----
回正題上…

主要是現在在 Centos 7 上用 nginx + php-fpm ,前端在用 ckeditor + ckfinder 時,因為 ckfinder 會使用上傳,相關的動作就是建檔、建資料匣、覆寫、刪除,以前自己手邊有系統時,說真的,我是直接就把 SELinux 給關了,但後來在接案子跟在處理資安的事情時就比較會去避免「直接關掉」的作法。

後來在 google 上翻到我不太確定這樣做適不適合,但感覺至少比直接關掉 SELinux 來的好的做法就是
chcon -R -h -t httpd_sys_script_rw_t [dir]
chcon:用來修改 SELinux 權限的東西
-R:指定 [dir] 以下的所有東西,包括子資料匣與其檔案
-h:等同用 --no-dereference  ,意指不參照其所在的權限(應該是獨立設定,而不承接父層)
-t:等同用 --type,指定使用「httpd_sys_script_rw_t」的安全權限

---
一般在 web.service 對應的 documentRoot ,--type 應該都是 httpd_sys_content_t ,我個人猜應該是指「單純文件」,也就是只給「讀取」或「被執行」的權限,所以 php、apache、nginx 大至上一開始的都是如此的,因為「網頁」本來就是給人「看」的。

因為服務類型的網站大都會是可以讓 client 端傳上文件、資料匣,若是用來存放 client 上傳的東西的目的地只有「看」的權限,那就會出現被 SELinux 擋掉的狀況,所以這時可以把指定的資料匣改成 httpd_sys_script_rw_t 或 httpd_sys_content_rw_t 就是允許該資料匣能透過 web.service 由 client 上傳東西來儲存了。

此狀況不一定只用在 web.service ,ftp 也行,但就不能用 httpd_sys_script_rw_t 這種一看分類就是給 web.service 用的…特有的 service 還是要用特用的 type ,這樣比較安全。

2018-10-14

Bootstrap 4 - dropdown 按第一次沒反應,要第二次以後才正常

最近的案子是寫一個簡單的後台讓丟案公司透過此後台來修改或公告一些東西,我就用 jQuery 3 + Bootstrap 4 再加上網路上找到免費的 dashboard 網頁來做 view …

剛好正在做 dashboard 右上角有關登入角色資訊,點擊後會有下拉選單可以點選一些資料或登入的操作,正在試做時發現原則上網頁產生過程是沒問題的,但就是那個資訊要點出下拉選單時,第一次點擊總是沒有反應,第二次以後的操作都正常…狀況如下

可以看到我第一次點「管理者」時,底色是有變暗,這代表我有「click」下去,但下方的選單沒有展開,第二次再點就正常…使用 chrome 的「開發人員工具」看反饋資訊,console 是沒有報錯的。

有關 PHP 檔案中的起啟標記 的使用

一開始在學 php 程式時,通常找到的教學資料都會說要在 *.php 中要寫 php 語言時,要用一個特有的標記 (tag) 將所寫的程式包起來,這樣將 php 檔案傳給 php engine 運行時才會做出程式碼所對應的行為…這個 tag 如下
<?php
?>
註:<?php 的 php 會因為 php.ini 是否有啟用 enable-short-tags 而增減,有啟用的話就只要輸入 <? 就好了

 這個 tag 跟在寫 jsp 或 classicASP 時會用 <% ... %> 在 *.jsp 或 *.asp 中的意義一樣,就是指在這個 tag 範圍內的是「程式語言」,而不是 html code。

不過我最近在網路上看到一些案子跟最近我自己正在改用 Visual Studio Code (簡稱 vscode) 來寫程式而裝了一個叫「php cs fixer」的套件時,發現一個狀況…感覺蠻特別的。

我在使用「php cs fixer」來美化排版 php 檔時,我會看到某一些 php 檔中結尾的標記符號「?>」消失了…我一開始以為是這個排版套件的異常,但因為不是所有的 php 檔都這樣,而是沒有和 html 語言混用的 php 檔才會這樣,所以我就上 google 翻資料。

後來在「PHP Manual」中找到「PHP tags」中有說明
If a file is pure PHP code, it is preferable to omit the PHP closing tag at the end of the file. This prevents accidental whitespace or new lines being added after the PHP closing tag, which may cause unwanted effects because PHP will start output buffering when there is no intention from the programmer to send any output at that point in the script.
大至上的說明是「如果檔案內容是純 php 程式碼的,最好是不要在檔案的最後使用結尾標記。其是為了避免不小心在結尾標記之後多輸入了空白符號或空行,以導致輸出了這一些無意義的東西。」

說是無意義,確實有時像網頁在編排或什麼的有時真的會有這類狀況…不過我本來以為會是安全的角度,看來是我想太多。