Update WordPress Inside Docker Container Required FTP Access

今日Update WordPress 既時候出現了
輸入FTP資料的畫面

To perform the requested action, WordPress needs to access your web server. Please enter your FTP credentials to proceed. If you do not remember your credentials, you should contact your web host. 

原因是因為有些wordpress 的資料夾沒有 權限去access
解決方法
我們只需要把這個資料夾的ownership 設定和這個container一樣便可

e.g.

sudo chown -R www-data:www-data wordpress

Hope you find it useful

VSCode config trim trailing space when saving file

如果有用開source control, 做code view 或 compare files 時 whitespace / Tab 會造成一些不必要既麻煩
很多IDE 都有一些設定或 plugin 可以在你儲存檔案時除去尾隨空格
Visual Studio Code 有一些很好用的 settings
大家可在Settings 上搜尋 “files.trimTrailingWhitespace
之後便可以啟用這個設定

Hope you find it useful

Linux updated folder and subfolder’s ownership

只要把這個folder的ownership 轉為 www-data 便可
我們可以使用 sudo chown user:usergroup folder/*

今日發現自從把wordpress 轉了用docker host 之後便不能 upload file
原因是我把之wordpress site 的檔案從 FTP upload 到新server 的 uploads folder
的ownership 是我FTP 的user名 而不是 run wordpress 的www-data

解決放法

sudo chown www-data:www-data uploads/*

Hope you find it useful

Bind Address Already In Use

Linux look for the process bound to a certain port

今日嘗試執行 Docker-Compose 去啟動Nginx Container 時出現以下的錯誤信息

Cannot start service nginx: driverfailed programming external connectivity on endpoint nginx 
 erland proxy: listen tcp 0.0.0.0:80: bind: address already in use
Cannot start service nginx: driverfailed programming external connectivity on endpoint nginx
erland proxy: listen tcp 0.0.0.0:80: bind: address already in use

原因是因為 port 80 已經在使用中..
怎樣知道那些process 正在使用 port 80呢?
我們可以使用以下command

sudo lsof -i -P -n | grep ":80 (LISTEN)"
linux command check which process use specific port
Linux command check which process use specific port

知道那些process 正在使用port :80之後 我們便可以 kill 了他們

Kill Linux Process
kill process

Hope you find it useful

C# Distinct List of Object

今日在Code Review 同事的Code 時候發現了一個有趣的寫法
他想做的是 Return 一個Distinct 左既 List Of Object

好直接既想法是使用 Distinct

List.Distinct();

之後發現Distinct 是不能 Distinct Object的
同事的寫法是用了 List 加 GroupBy 和Select First()

List.GrounBy(x=> x.key).Select(x => x.First())

之後發現.. 原來我們可以使用 GroupBy 加 First 來做到 Distinct Object的效果
以下是我的 Code Sample

void Main()
{
	var list = new List<Example>();
	list.Add(new Example() {Id=1, Name="Example 1", Comment="Comment 1" });
	list.Add(new Example() {Id=1, Name="Example 1", Comment="Comment 1" });
	list.Add(new Example() {Id=1, Name="ExamplE 1", Comment="Comment 2" });
	list.Add(new Example() {Id=2, Name="Example 2", Comment="Comment 3" });
	list.Add(new Example() { Id = 2, Name = "example 2", Comment = "Comment 3" });
	list.Add(new Example() { Id = 3, Name = "Example 3", Comment = "Comment 3" });
	list.Add(new Example() { Id = 4, Name = "Example 4", Comment = "Comment 3" });
	list.Add(new Example() { Id = 5, Name = "Example 5", Comment = "Comment 3" });

	Console.WriteLine("Use List.Distinct()");
	list.Distinct().Dump();

	Console.WriteLine("Use Group By Fields");
	list.GroupBy(x => new {x.Id, Name=x.Name}).Select(x =>x.First()).Dump();

	Console.WriteLine("Use Group By and make it ignore case");
	list.GroupBy(x => new {x.Id, Name=x.Name.ToLower()}).Select(x =>x.First()).Dump();
}

public class Example
{
	public int Id { get; set; }
	public string Name { get; set; }
	public string Comment {get;set;}
}

Output:

Hope you find it useful