2020年10月28日 星期三

多災多難的Image Editor

事源是, 老闆希望加入一個可以加入文字和加入圖片的banner designer。在網路上找, 最合符需要的就只有toast UI Image Editor, 找來找出都沒有其它適合的。



花了一點時間把它裝嵌以為可用, 結果在CORS卡關卡了很久, 因為圖片不是寄存在自己的伺服器, 設定不到header("Access-Control-Allow-Origin: *");,所以圖片load不到出來, 打算放棄了, 可是要自己build from scratch 跟本無從入手, 感覺快要崩潰了……特然想到試試自行寫一個proxy, 竟然成功了:

<?php
// this file is used for image to bypass CORS policy restrictions from TOAST UI Image Editor

$path = $_REQUEST['path'];

$request = curl_init($path);

header("Content-Type: image/png");

header("Access-Control-Allow-Origin: *");

curl_setopt($request, CURLOPT_FOLLOWLOCATION, true);


                 curl_setopt($request, CURLOPT_SSL_VERIFYPEER, false); 


curl_exec($request);


          ?> 


這個原理是把圖片url 由https://www.aaa.com/a.jpg 改換成https://localhost?path=https://www.aaa.com/a.jpg, 利用curl把圖片下載以及output出來, 那麼因為proxy是在自己伺服器上自定義的, 就可以加入header("Access-Control-Allow-Origin: *"); , 注意curl_setopt($request, CURLOPT_FOLLOWLOCATION, true); 加入這一句後如果圖片本身會redirect的話也不會curl 不到圖片, 結果成功繞過CORS限制, 可以成功load到圖片了!



2020年10月8日 星期四

[Symbolic link] check link folder path

 readlink -f [symlinkName]


use CMD

cd soldeazy-git 

mklink /J bot C:\xampp\htdocs\soldeazy-svn\bot 

2020年10月3日 星期六

學踩單車

 大人先學識踩單車記錄

  • 將腳踏轉去一高一低
  • 放上腳,把高既腳踏踩落去,緊接第二隻腳放上腳踏再踩落去
  • 手要定,腰要坐直
  • 一路踩唔好停
  • 成功學識
落斜學剎制
  • 一路落鈄一路收放後look剎車制,唔好沖落去
  • 成功學識

2020年9月30日 星期三

病情中一些想法

從前的自己常常迫自己諗野,諗到傻左,以下是我發病時寫來開解自己的總結:


情況1

完全諗唔到野,一片空白(感受)

從前的自己會如何面對:皺眉頭 > 嘆氣 > 個人好急 > 好辛苦

開解後的自己:眼放空 > 諗交托


情況2

唔知人地諗乜野

從前的自己會如何面對:估佢諗乜野 > 亂估 > 亂諗野 > 諗埋曬D唔知乜野 > 諗埋一邊 > 控制唔到自己諗乜野 > 繼續亂諗野,諗埋一面

開解後的自己:控制唔到自己諗乜野 > 眼放空 > 交托 > 繼續亂諗野,諗埋一面 > 唔好諗野 > 睇細節,睇其他野 > 轉移視線 > 轉眼仰望耶穌 > 交托 > (諗唔到野)諗交托神


情況3

唔想俾人望住

從前的自己會如何面對:逃避 > 唔想自己亂諗野

開解後的自己:控制自己個腦諗乜野 > 想神 > (諗唔到野)諗交托神



[開發實務日常記錄] 病情中的教導記錄(珍貴記錄)

以下是我發病時,在腦袋中向那位想像出來的人介紹我的工作,所寫的一份記錄。手寫原稿寫得很整齊,在這裏表達不盡,因為對我的意義重大,很想把它記錄下來。

--------------------------------------------------------------------------------------------

Task:
我想係sku page入面既#areaTitleBox (id="areaTitleBox")的CSS入面將 font-weight:600 呢一行line刪除佢

--------------------------------------------------------------------------------------------

Procedure:

1. 打開sku page:

url: _____/sku 

即係 product_details.php 呢個file

為何?

 因為在uri.php (控制所有頁面url, 如

sku = product_details.php

orders = order_main.php

promotion_manager = PromotionManagerController

都是在uri.php 內define出來)

Ctrl-P:Sublime 程式中打開新分頁

Ctrl-W:關閉分頁(通用)

2. 找"areaTitleBox"

Ctrl-F:尋找字串(通用)

3. 刪除 font-weight:600 呢行中line 

4. 在 C:/xampp/... 資料夾中的空白地方按滑鼠右鍵,

找tortoiseSVN > Check for modifications > 按下

顯示出在這個...資料夾中所有曾經修改的檔案

5. 指向product_details.php,按滑鼠右鍵

找compare with base,檢閲曾修改的檔案改動的比較

左邊:未改動前

右邊:改動之後 font-weight:600 已刪除

6. 確定改動正確後,可關閉分頁

7. 在這已修改的product_details.php按下滑鼠右鍵,然後按"commit"

Commit 就是將自己電腦檔案的改動,上傳到repository,即是一個統一儲存程式碼的地方

8. svn 就是 subversion source control system,它把一個系統的源程式碼,儲存到同一個地方,不同的程式開發人員可以"checkout"提取源程式碼,由儲存源程式碼的地方(repository)提取到自己電腦進行修改,再commit放回repository上。

9. Recent message 就是每次commit改動的大約描述,描述後按commit,就能把改動放回到repository。


--------------------------------------------------------------------------------------------


[開發實務日常記錄] 加入新的sample templates

 Task: 我想在「template designer」加入新的「sample templates」

Sample templates包括:

  1. 名稱
  2. 圖片
  3. 類別
  4. json codes
------------------------------------------------------------------------------------------

Sub-task 1) 
我想在template.php中加入圖片、名稱、類別等array指令,和把圖片放到css/img/sample_templates/ folder之中,名稱為 xxxxxx-800.jpg 或 xxxxxx-small.jpg

Step a) 將圖片放到css folder之中
Step b) 修改圖片名稱附合格式
Step c) 把圖片名稱放到template.php裏記錄分類
Step d) 把圖片分類放到template.php

Sub-task 2)
從twist server中export模版JSON源碼

Step a) > cd .../bot/template
Step b) > php template_export.php export.json 1234 4567 ...
Step c) 這將此export append到src中的export.json
Step d) edit setting_template_name @ export.json file
Step e) > php template_import.php 0 C:/.../export.json

Sub-task 3)
Add Chinese translations

2020年9月24日 星期四

[開發進程] Image Processor

總結一下Image Processor的製作流程:

  1. 想出如何實現用戶需求
  2. 依據需求編制程序
  3. 優化所寫程序
  4. 錯誤處理
  5. 系統整體優化


例子: [用戶需求] 在模版中把文字貼在shop banner上

由不知道->知道 (User requirement)

嘗試找出用什麼技術可以實現用戶需求


開始編制 (Development)

一步步實現用戶需求、由UI Frontend到Backend, 或由Backend到UI Frontend皆可, 一步步擴充功能, 再進一步優化logic, 來來回回

例如: 使用php function imagettftext()能把需求實現; 用OO比function為佳; 先以jpeg為試驗, 和以少量text-font選擇作為測試, 再擴充功能


錯誤處理 (Error Handling)

處理報錯, 但不要用die

(因为die的意思是程序终止,如果合成banner失败,我的任务不应该影响客户的操作(sync up, listing, verify ebay items),而且die()也不会返回错误消息,网页就是一片空白,queue job也显示中断退出。这样会给客户造成很大的困惑。)

  • 可以用 return ['result' => false, 'error_message' => '...']; 返回, 再使用 log file 記錄錯誤
  • 可以在不同地方用 isset 檢查資料是否正常存在
  • 其他處理方式, 例如在我的case, 若果error就返回用原來的圖片加文字分開的方式顯示


程序及資源優化 (Optimization)

試試整個流程用法, 想想在什麼地方可以更優化系統

例如在我的case, 把圖片 url save 到 datasheet 可以把功能實現, 卻浪費資源; 假如把圖片 url save 到 template 比 save 到 datasheet 為佳, 因為可以重覆使用, 減少 generate 時間, 和圖片伺服器資源

又例如原本設計是 template 有修改, 圖片連結就會重新記錄, 因為有機會改動 shop banner 的一些參數; 但日常很少機會修改template shop banner, 所以系統修改成更改 template 時如沒有修改與 shop banner 有關的fields, 就會保留圖片連結

=====================

Commit list:

  1. UI 加入 shop_banner_stick_text_to_image option (User requirement)
  2. 加入genTextedImage function (support jpeg only) (support 3 google fonts only) 
    use php function imagettftext() to put text on top of image (Development) 
  3. 加入所有text font files (Development) 
  4. save to datasheet extra data (Development) 
  5. 加入genTextedImage (support jpeg & png) (Development) 
  6. move logic to HTImageProcessor (Development) 
  7. don't use die, use return for error handling (Error Handling)
  8. store texted shop banner to template instead of datasheet (Optimization)
  9. error handling when generate error (return result = false) (Error Handling)
  10. 加入genTextedImage (support jpeg, png & gif) (User requirement)
  11. error handling (Error Handling)
  12. revised image output image size logic (User requirement)
  13. move HTImageProcessor to Helper folder (Development)
  14. change text font file relative path (Development)
  15. make font path array compatible when sync up template (Development)
  16. image processing error enhancement (Error Handling)
  17. image processing error enhancement (if error , fall back to original text + image display; write error to template designer error log) (Error Handling)
  18. error handling for cdncloud upload error (use isset($cdnurl[$realfilename]['url']) ) (Error Handling)
  19. error handling check (use isset($data['shop_banner_url'][$shop_idx]) ) (Error Handling)
  20. added [Template Designer]: retain shop_banner_url if shop banner-related fields do not change; else clear to generate text-combined image next time  (Optimization)

Random Exhibition Title Generator

  https://www.mit.edu/~ruchill/lazycurator.html