2019年4月4日 星期四

[macOS] 製作 macOS High sierra USB 安裝碟 @ macOS 10.13.6

build macOS USB install 10.13

手上這台 Macbook Pro 已經無法安裝 macOS 10.14 了,正準備更換 SSD ,因此想先準備 USB 安裝碟時,發現竟然無法製作 Orz 透過官網教學文才找到 macOS 10.13 下載位置  ( https://itunes.apple.com/tw/app/macos-high-sierra/id1246284741?ls=1&mt=12 ) ,發現僅 15MB 的大小,執行指令時會看到以下錯誤訊息:

$ time sudo /Applications/Install\ macOS\ High\ Sierra.app/Contents/Resources/createinstallmedia --volume /Volumes/8GUSB/
/Applications/Install macOS High Sierra.app does not appear to be a valid OS installer application.


最後研究一下,原來要靠安裝流程,讓系統根目錄 macOS Install Data 會產生必要的資料,接著安裝過程下載完必須的軟體時,會停在要重開機的路上,這時就可以關閉安裝,並把必要的資料取出來使用。

$ tree /macOS\ Install\ Data/ ; sudo du -hd1 /macOS\ Install\ Data/
/macOS\ Install\ Data/
├── AppleDiagnostics.chunklist
├── AppleDiagnostics.dmg
├── BaseSystem.chunklist
├── BaseSystem.dmg
├── InstallESDDmg.pkg
├── InstallInfo.plist
├── Locked\ Files
└── index.sproduct

1 directory, 7 files
 20K /macOS Install Data//Locked Files
4.9G /macOS Install Data/


接著可透過"顯示套件"的方式,在 Install macOS High Sierra.app 內的 Contents 中,建立 SharedSupport 目錄,並把 macOS Install Data 複製進去:

$ tree /Applications/Install\ macOS\ High\ Sierra.app/Contents/SharedSupport
/Applications/Install\ macOS\ High\ Sierra.app/Contents/SharedSupport
├── AppleDiagnostics.chunklist
├── AppleDiagnostics.dmg
├── BaseSystem.chunklist
├── BaseSystem.dmg
├── InstallESDDmg.pkg
├── InstallInfo.plist
└── index.sproduct

0 directories, 7 files


就可以製作 USB 安裝碟:

$ time sudo /Applications/Install\ macOS\ High\ Sierra.app/Contents/Resources/createinstallmedia --volume /Volumes/8GUSB/
Password:
Ready to start.
To continue we need to erase the volume at /Volumes/8GUSB/.
If you wish to continue type (Y) then press return: Y


Updated @ 2019/04/06:

雖說可以順利製作出開機碟,但發現該 USB 無法完成 10.13.6 作業系統的安裝。推論是系統安裝流程已被修改的關係,應當是系統安裝時,會要求要安裝的系統碟的根目錄上,配有 "/macOS Install Data/" 資料,才能重開機後完成安裝流程。

以上並未驗證 :P 因為這次重安裝是為了把筆電換上新的 SSD ,因此單純先把原本的系統碟透過外接方式重啟,並跑正常的系統安裝流程,安置在新的 SSD ,而安裝過程就完全不靠 USB 開機碟。

或許把 SharedSupport 複製一份到新 SSD 的 "/macOS Install Data/" 有可能就可以搞定?!

2019年3月17日 星期日

[書] 給力:矽谷有史以來最重要文件NETFLIX 維持創新動能的人才策略

給力

這書買了半年,堆積了一陣子後,今年陸續清ㄧ清,直到今天終於看完最後章節。最後章節是在講如何跟公司內不適任的同事分手 XD 明明是很簡單的概念,卻很難執行。我在工作上也曾被長官要求評估成員績效,並要求要認真考慮是否適任,因此閱讀起來特別有共鳴。

回過頭來,給力這本書還滿不錯的,醒腦。書裡提的管理、文化建置的概念是對的事,但實務上很難,難在需要權限,難在如何讓公司成員明知彼此的供需問題,難在用家庭成員情感經營時,很難開除家人。甚至身為一般階級的管理者也難以展現,大概只有公司創辦人/高階管理者才行吧?可惜的公司開得越久,也越難執行,實在是人多就有政治,人老就會油條。

目前我比較偏向在新團隊的建置時,可以引入這等概念,包含聘請高手時,要想想該人的薪資是否符合市場,要想想公司的營收是否可以支持,若該人可以有兩人以上的貢獻時,要解放成本概念,大膽給予兩倍、三倍薪資。一切的目的是為了公司加速成長,以此維持公司競爭力。

透過 Google Search 評估 subdomain 類服務人數規模

google-search-subdomain

例如 tumblr.com 的服務是每一個用戶可以創建多個部落格,但每一個部落格就是一個 subdomain.tumblr.com,對於這類服務的發展,這時就靠 Google Search 來評估使用人數,雖然 Google Search 的資料筆數也是推估的,但如果服務使用人不多,還是可以快速跳掉最終頁拿查看。

allinurl:tumblr.com site:.tumblr.com -www.tumblr.com

如此,搭配其他資續,可以推敲一下服務市佔率。

2019年3月16日 星期六

Google Analytics 使用筆記 - 設定目標(Goal)追蹤關鍵字成效

ga-goal-tracking

很久以前就想研究,一直拖到工作上買 Adwords 需要追蹤成效時,才開始學習 XD 而設定 Goal 其實非常簡單,就是在專案管理介面上,切換到最右邊有個"目標"可以設定,填一填就搞定,其中用 GA event 是最彈性的是部分,可以在對應的網頁動作上,發個 GA event 就能追蹤了。

ga-goal-setup-01

ga-goal-setup-02

ga-goal-setup-03

ga-goal-setup-04

如此回到 GA 專案 -> 客戶開發 -> 廣告活動 -> 所有廣告活動/付費關鍵字/隨機關鍵字 ,就可以看到 “轉換” 那邊,可以有目標來關注,十分方便。

就 Adwords 就可以不斷調整、找尋最洽當的關鍵字購買。

2019年2月20日 星期三

Google Sheets 透過 IMPORTXML / XPath 匯入網頁資料 - 以 Alexa.com Top Sites in Taiwan 為例

Google Spreadsheets - importxml

與其說 匯入 網頁資料,倒不如說已經可以爬網頁資料出來,在做格式化!例如去掉多餘的資訊,未來可轉換成 csv/tsv 等等應用。

官方文件在此:https://support.google.com/docs/answer/3093342?hl=zh-Hant

操作對象:http://www.alexa.com/topsites/countries/TW

轉換方式:人眼挑戰!或是靠 Chrome browser 檢視元素和 Copy XPath 小改即可

Chrome Copy XPATH

範例 - 網站列表:
  1. 人眼定位
    • =importxml("https://www.alexa.com/topsites/countries/TW","//div/div/div/p/a")
  2. 透過 Chrome Browser - Copy XPath
    • 分析結果:
      • //*[@id="alx-content"]/div/div/section[2]/span/span/div/div/div[2]/div[2]/div[2]/p/a"
    • 小改:先改到能輸出資料,在去掉指定資料筆數看能不能輸出 array
      • //div/div/div[2]/div/div/p/a
本次練習所有欄位都...人眼享受... XD
  • =importxml("https://www.alexa.com/topsites/countries/TW","//div[contains(@class, 'site-listing')]/div[contains(@class, 'td')][1]")
  • =importxml("https://www.alexa.com/topsites/countries/TW","//div/div/div/p/a")
  • =importxml("https://www.alexa.com/topsites/countries/TW","//div[contains(@class, 'description')]/text()[1]")
  • =importxml("https://www.alexa.com/topsites/countries/TW","//div[contains(@class, 'site-listing')]/div[contains(@class, 'td') and contains(@class, 'right')][1]")
  • =importxml("https://www.alexa.com/topsites/countries/TW","//div[contains(@class, 'site-listing')]/div[contains(@class, 'td') and contains(@class, 'right')][2]")
  • =importxml("https://www.alexa.com/topsites/countries/TW","//div[contains(@class, 'site-listing')]/div[contains(@class, 'td') and contains(@class, 'right')][3]")