關於網路那些事...

網路行銷,SEO,網路趨勢,教學文章,網頁設計,生活時事

如何在 Mac分享 VPN網路作為 Wi-Fi 熱點分享來源

如何在 Mac分享 VPN網路作為 Wi-Fi 熱點分享來源

近期開發產品,需要再非公司的場合應用到固定IP。

由於這次產品使用的場合無法立即取得固定IP網路環境,並且實體網路也沒有的情況下,進行了幾種方式,最終找到可行的方式。

在這裡將流程進行紀錄。


最後,如果你喜歡這篇文章,請幫忙點個讚



最完整 如何解決 .git 檔案過大, git clone 產生 Swap Out of memory 問題

最完整 如何解決 .git 檔案過大, git clone 產生 Swap Out of memory 問題

.git 檔案過大,會需要依照當時專案的環境做不同處理,這裡將各種可能的狀況,提供解決方案。

當 .git 檔案過大,伺服器記憶體不足時,會出現以下錯誤:

swap Out of memory, malloc failed (tried to allocate xxxxxxxxxx bytes)

通常會發生這問題,原因都在於這個 git repository 已經使用一定時間,提交次數非常多,導致 .git 檔案過大

例如,.git 檔案就佔據 2Gb

遇到這狀況時,可能遇到一些問題,例如:主機環境是否能變動,commit 資訊是否要保留等

以下針對各種問題,提供對應的解決方法:


最後,如果你喜歡這篇文章,請幫忙點個讚



Python 運行 Selenium 入門

Python 運行 Selenium 入門

這裡支援 Python 2.7, 3.4+

安裝 Driver

下載瀏覽器 driver ,請依照你瀏覽器目前的版本下載對應的 Driver

Chrome: https://sites.google.com/a/chromium.org/chromedriver/downloads
Edge: https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
Firefox: https://github.com/mozilla/geckodriver/releases
Safari: https://webkit.org/blog/6900/webdriver-support-in-safari-10/

在這裡,我們目前 Chrome 版本是 79.x,因此下載的是 chromedriver 79.x版本,

下載完成後,將 driver 放置環境變數,並且給予執行的權限

sudo cp chromedriver /usr/local/bin
sudo chmod +x /usr/local/bin/chromedriver

Python 安裝 selenium

安裝

pip install -U selenium
//or
pip3 install -U selenium

建立專案

vim test.py

建立爬蟲腳本,前往奇摩首頁,搜尋欄輸入 seleniumhq 後,送出搜尋

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

browser = webdriver.Chrome()

browser.get('http://www.yahoo.com')
assert 'Yahoo' in browser.title

elem = browser.find_element_by_name('p')  # Find the search box

elem.send_keys('seleniumhq' + Keys.RETURN)

browser.quit()

執行

sudo python test.py

透過 Chrome Seleinum IDE 快速建立腳本

在 Chrome 安裝擴充 Seleinum IDE

開啟 IDE,建立新 Project,接著點選 Rec

錄製完畢後,可以重複播放看看是否正確。

完成後,在左側專案的右邊 點擊三個點,出現選單

點選 Export 可選擇輸出腳本格式

輸出的腳本預設只有 class

可以自由應用,例如

# Generated by Selenium IDE

import pytest
import time
import json
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

class TestTest():
  def setup_method(self, method):
    self.driver = webdriver.Chrome()
    self.vars = {}
  
  def teardown_method(self, method):
    self.driver.quit()
  
  def test_test(self):
    # Test name: test

    # Step # | name | target | value | comment

    # 1 | open | / |  | 

    self.driver.get("https://www.google.com/")
    # 2 | setWindowSize | 1256x900 |  | 

    self.driver.set_window_size(1256, 900)
    # 3 | click | name=q |  | 

    self.driver.find_element(By.NAME, "q").click()
    # 4 | type | name=q | adon988 | 

    self.driver.find_element(By.NAME, "q").send_keys("adon988")
    # 5 | sendKeys | name=q | ${KEY_ENTER} | 

    self.driver.find_element(By.NAME, "q").send_keys(Keys.ENTER)
    # 6 | click | css=div:nth-child(2) > .rc .LC20lb |  | 

    self.driver.find_element(By.CSS_SELECTOR, "div:nth-child(2) > .rc .LC20lb").click()
    # 7 | click | linkText=Mac 強制移除本地 mysql 佔用 3306,解決無法 kill 3306 process 問題 |  | 

    self.driver.find_element(By.LINK_TEXT, "Mac 強制移除本地 mysql 佔用 3306,解決無法 kill 3306 process 問題").click()
    # 8 | click | name=q |  | 

    self.driver.find_element(By.NAME, "q").click()
    # 9 | type | name=q | docker | 

    self.driver.find_element(By.NAME, "q").send_keys("docker")
    # 10 | sendKeys | name=q | ${KEY_ENTER} | 

    self.driver.find_element(By.NAME, "q").send_keys(Keys.ENTER)
  
a = TestTest()
a.setup_method('test')
a.test_test()

透過 Firefox 擴充套件 Katalon Recorder 快速建立腳本

開啟 Firefox ,至擴充套件安裝 Katalon Recorder

開啟擴充後,可以直接錄製腳本,接著點擊 Export 輸出腳本

腳本格式選擇 python2 (沒錯,目前只有 Python2)

例如:

# -*- coding: utf-8 -*-

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
import unittest, time, re

class UntitledTestCase(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome()
        self.driver.implicitly_wait(30)
        self.base_url = "https://www.google.com/"
        self.verificationErrors = []
        self.accept_next_alert = True
    
    def test_untitled_test_case(self):
        driver = self.driver
        driver.get("https://www.google.com.tw/")
        driver.find_element_by_name("q").click()
        driver.find_element_by_name("q").clear()
        driver.find_element_by_name("q").send_keys("adon988")
        driver.find_element_by_id("tsf").submit()
    
    def is_element_present(self, how, what):
        try: self.driver.find_element(by=how, value=what)
        except NoSuchElementException as e: return False
        return True
    
    def is_alert_present(self):
        try: self.driver.switch_to_alert()
        except NoAlertPresentException as e: return False
        return True
    
    def close_alert_and_get_its_text(self):
        try:
            alert = self.driver.switch_to_alert()
            alert_text = alert.text
            if self.accept_next_alert:
                alert.accept()
            else:
                alert.dismiss()
            return alert_text
        finally: self.accept_next_alert = True
    
    def tearDown(self):
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)

if __name__ == "__main__":
    unittest.main()

參考

https://learngeb-ebook.readbook.tw/intro/selenium.html

https://morvanzhou.github.io/tutorials/data-manipulation/scraping/5-01-selenium/


最後,如果你喜歡這篇文章,請幫忙點個讚



Workerman 入門 - 安裝及啟動

Workerman 入門 - 安裝及啟動

Workerma 是一個老牌的 PHP socket 服務架構。

這裡記錄基於 CentOS, PHP7 環境的安裝流程:


最後,如果你喜歡這篇文章,請幫忙點個讚



工廠模式 (Factory)

工廠模式 (Factory)

在 Design Pattern 中,工廠模式(Factory) 基本的理念是建構一套完整工廠鍊,可以用來生產各種類別品項。

例如,建構資料庫工廠,可以用來產生 mysql, mongodb, redis.... 等物件。

對於使用者而言,他只需要在初始化工廠時,指定要生產的是什麼,

後續在操作資料庫的行為,都會一致。


最後,如果你喜歡這篇文章,請幫忙點個讚



建構者模式 (Builder)

建構者模式 (Builder)

建構者模式,主要透過條件堆疊取得產物。

每一個堆疊的步驟,都是一個 Builder,例如透過 set 的方式來傳入 Builder。

實際用途,可運用在設計資料庫查詢器的功能,例如,要查詢一個用戶,名字為 john


最後,如果你喜歡這篇文章,請幫忙點個讚



什麼是繼承抽象 Abstract

Abstract 可以用來定義 Abstract 類、一般方法名稱及參數,Abstract 方法。

一般的方法可以實作邏輯。

如果是 Abstract 方法,則僅作描述,不實作邏輯。邏輯會保留到某個類別繼承(extends)時,來實作(強制)。

透過抽象,可以讓我們定義好規則以及實作一些方法,讓其他類別擴充時,可遵照規則實作,以及直接可使用這些方法。


最後,如果你喜歡這篇文章,請幫忙點個讚



Mac 強制移除本地 mysql 佔用 3306,解決無法 kill 3306 process 問題

在本地預計使用docker 建構 mysql ,卻發現 3306 port 被佔用的情況。

這時,透過 刪除指定進程方式,來移除佔用 3306 port 的 process

先將 3306 process 找出,並且移除


最後,如果你喜歡這篇文章,請幫忙點個讚



解決,請求過大導致 The request record is too big

解決,請求過大導致 The request record is too big

Nignx & PHP-FPM 架構中,發送單一請求若header傳輸量過大,就會爆出 request record is too big 的錯誤,

可以檢查是否直接透過http params 方式來夾帶參數

當參數過大,就會導致內容無法送達而爆出錯誤。


最後,如果你喜歡這篇文章,請幫忙點個讚



Guzzle PUT 傳輸參數方式說明

Guzzle PUT 數據方式說明

使用 Guzzle

使用 Guzzle 只能透過 POST 方式來傳遞 application/x-www-form-urlencoded form params

( 官方原文:form_params - Used to send an application/x-www-form-urlencoded POST request. )

若使用 PUT, DELTE 則需要改用 body 或者 json 格式傳輸,例如:


最後,如果你喜歡這篇文章,請幫忙點個讚