2022年11月26日 星期六

拯救老電腦












 Sempron 3850

Socket AM1入門四核處理器 2014

8ram 

作業系統 windows 10 1904


評論:

八年的核心,其他的故障電腦拆解零組件都是拼裝.

整體使用上,可以基本文書,瀏覽網站,聽音樂等等都可以接受的。

下次再來繼續搞更多..

JS 產生 清單的大利器 「datatables.js」結合 server-side

 一個例子

採用 GET方式 官方範例

Html


2022年10月21日 星期五

清量級的 XLSX 工具 (PHP版本)

PHP_XLSXWriter 

第二連結 : 避免最後倉庫丟失

        include BASE_PATH . "XlsxWriter.php";
        $headerRow = [];
        $file = $filename;

        $file = str_replace('.xls', '.xlsx', $file);

        # 要使用方案2
        $path =  '../api/data/resources/xlsx/';
        if (!file_exists($path)) {
            mkdir($path, 0777, true);
            $path = $path . $filename;
        } else {
            $path = $path . $filename;
        }

        $writer = new \XLSXWriter();
        # 風格一
        $styles1 = array(
            'font' => 'Arial',
            'font-size' => 12,
            'border' => 'left,top,bottom'
        ); 
        # 配置標題      
        foreach ($data[0] as $key => $value) {
            $headerRow[$value] = '@';
        }
        unset($data[0]);
        $writer->writeSheetHeader('Sheet1', $headerRow, [
            'halign' => 'center',
            'font-size' => 14,
            'border' => 'left,top,bottom',
            'widths' => [40, 20, 20, 25, 25],
        ]);
        foreach ($data as  $key1 => $row) {
            $writer->writeSheetRow('Sheet1', $row, $styles1);
        }
        # 方案一
        header('content-disposition:attachment;filename=' . $file);    //告訴瀏覽器通過何種方式處理檔案
        $writer->writeToStdOut();
        exit;
        # 方案二
        # 這個是 先產實體文件 , 再刪除
        // $writer->writeToFile($path);
        // header('content-disposition:attachment;filename=' . $file);    //告訴瀏覽器通過何種方式處理檔案
        // header('content-length:' . filesize($path));    //下載檔案的大小
        // readfile($path);
        // unlink($path);
        // exit;

2022年10月9日 星期日

PHP 黑科技

節省寫法時間

 

<?php

$array = [
    'name' => 1,
    'phone' => 12345678911
   
];

$arr_key = [
    'name' , 'phone'
];

// 黑科技
foreach ($arr_key as $key => $value) {
   $$value  =  $array[$value] ;
}
echo $name . $phone ;

// 另一個寫法就是
list('name'=>$name ,'phone'=>$phone) = $array ;

?>


這樣寫可以 省去還要 寫一堆 set 的代碼
當然相對地就不是好閱讀
建議還是寫在 func , class 這些 內部邏輯


2020年4月7日 星期二

天涼好個秋

在一個陰雨綿綿的下午,開會開到昏昏欲睡的我,突然一陣雷聲,喚醒了我,原來剛剛主管CUE到我,我沒有任何反應, 這時後我驚醒了,快速地回答所有問題,還被告知等會還有其他會議,此時內心的我...無數個OOOXX跑馬燈跑過。

任務

      1. 開會任務解鎖
      2. 新的會議
      3. 提出建議
      4. 思考
之後的會議是 原廠的 Mongodb 的業務與工程師,來針對我們公司目前遇到的困境做了解答,會議中主講者,還是我之前其他地方認識的人,但是感覺主管們對於上雲這個部分,興致不高,且還在思考想拉回來自己處理..... (自己拉回來不會比較省,只會更多事情)


2020年2月5日 星期三

使用 nginx websocket https to http

最近專案遇到一坑,之前 http 使用 ws 都很順利,但是上了https之後,網頁強制要使用 wss... 就卡住了
Nginx 配置 轉發代理,網路上很多教學都寫一半,最後看懂就~ 這樣寫最精簡,直接 調用ws 去處理後續的東西

NGINX配置文件
server {
    server_name             域名;

    location / {
        root                   PATH;
        index                  index.php index.html index.htm;
        try_files              $uri $uri/ /index.php?$query_string;
    }
 
    location ~ \.php$ {
        root                   PATH;
        fastcgi_pass           unix:/var/run/php-fpm/www.sock;
        fastcgi_index          index.php;
        fastcgi_param          SCRIPT_FILENAME
        $document_root$fastcgi_script_name;
        111111
        include                fastcgi_params;
    }
 
    listen                  443 ssl; # managed by Certbot
    ssl_certificate         證書
    ssl_certificate_key     證書
    include                 /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam             /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
 
    location / {
        proxy_pass             服務位置
        #例如                    http://127.0.0.1:8092/ws;
        proxy_http_version     1.1;
        proxy_set_header       Upgrade $http_upgrade;
        proxy_set_header       Connection "Upgrade";
        proxy_set_header       X-Real-IP $remote_addr;
        add_header             Access-Control-Allow-Origin *;
        proxy_connect_timeout  60s;
        proxy_read_timeout     500s;
        proxy_send_timeout     500s;
    }
 
}
server {
    if ($host = 域名) {
        return                 301 https://$host$request_uri;
        }                      # managed by Certbot
 
        listen                 80;
 
        server_name            域名;
        return                 404; # managed by Certbot
 
    }
Go Server
package main

import (
    "log"
    "net/http"
 
    "github.com/gorilla/websocket"
)
 
func main() {
    upgrader := &websocket.Upgrader{
        //如果有 cross domain 的需求,可加入這個,不檢查 cross domain
        CheckOrigin: func(r *http.Request) bool { return true },
    }
    http.HandleFunc("/"func(w http.ResponseWriter, r *http.Request) {
        cerr := upgrader.Upgrade(w, r, nil)
        if err != nil {
            log.Println("upgrade:", err)
            return
        }
        defer func() {
            log.Println("disconnect !!")
            c.Close()
        }()
        for {
            mtypemsgerr := c.ReadMessage()
            if err != nil {
                log.Println("read:", err)
                break
            }
 
            log.Printf("receive: %s\n", msg)
            msg = []byte("伺服器接收成功")
            log.Printf("re_send: %s\n", msg)
 
            err = c.WriteMessage(mtype, msg)
            if err != nil {
                log.Println("write:", err)
                break
            }
        }
    })
    log.Println("server start at :8000")
    log.Fatal(http.ListenAndServe(":8000"nil))
}
Go Client
package main

import (
    "log"
 
    "github.com/gorilla/websocket"
)
 
func main() {
    // ws_connection := "ws://fishstg.1c5game.com:8000/echo"
    // ws_connection := "wss://18.139.24.117:8092/ws"
    ws_connection := "wss://fishstg.1c5game.com/ws"
    // ws_connection := "wss://echo.websocket.org/"
    log.Printf("ws_connection: %s\n", ws_connection)
    c_err := websocket.DefaultDialer.Dial(ws_connection, nil)
    if err != nil {
        log.Fatal("dial:", err)
    }
    defer c.Close()
 
    i := 1
    for i <= 10 {
        // fmt.Println(i)
        send_msg := "{\"protocol\"  : \"platform_debit_all\",  \"data\"  :{ \"id\":1 , \"gametoken\":123456465 }}"
        log.Printf("send_msg: %s\n", send_msg)
        err = c.WriteMessage(websocket.TextMessage, []byte(send_msg))
        if err != nil {
            log.Println(err)
            return
        }
        _msgerr := c.ReadMessage()
        if err != nil {
            log.Println("read:", err)
            return
        }
        log.Printf("received: %s\n", msg)
        i++
    }
}
----------------------

2019年12月24日 星期二

PHP 數值格式化

<?php

$s  = 1000000;
$s1 = 1000000.1111110;
echo return_number_int_or_floor($s,2) . "<hr>";
echo return_number_int_or_floor($s1,2) . "<hr>";

function return_number_int_or_floor($number, $floor = 0)
{
    if (floor($number) == $number) {
        return $formattedNum = substr(rtrim(number_format($number, $floor, ".", ","), 0), 0, -1);
    }
    return $formattedNum = rtrim(number_format($number, $floor, ".", ","), 0);
}

數值處理,正格式化,剃除整數最後字串為.00的方法



2019年12月18日 星期三

Clear Cache in Laravel

Clear Cache in Laravel
第一次遇到 route 被 Cached...........................................
最快解法
Route::get('/clear-cache', function() {
    Artisan::call('cache:clear');
    return "Cache is cleared";
});

拯救老電腦

 Sempron 3850 Socket AM1入門四核處理器 2014 8ram  作業系統 windows 10 1904 評論: 八年的核心,其他的故障電腦拆解零組件都是拼裝. 整體使用上,可以基本文書,瀏覽網站,聽音樂等等都可以接受的。 下次再來繼續搞更多..