//Create the root user 1 nano /etc/my.cnf //centos7 comment the bind_address (好像不需要) 或是 bind_address 0.0.0.0 2 create user root //(yes, a new user because what exists is 'root@localhost' // which is local access only): CREATE USER 'root'@'%' IDENTIFIED BY '123'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'; 3 restart sudo systemctl restart mysqld
2020年6月20日 星期六
MySQL 8 更改 remote access
2020年6月10日 星期三
2020年5月18日 星期一
MySQL Variables / Status / 優化
MySQL connections variables
Apple MySQL 必要修正一些預設值//show
mysql> show variables like '%conn%'l;
//set
mysql> set global max_connections=10240;
//select
mysql> select @@global.sort_buffer_size;
-
max_connections
最大連線數。
要比歷史連線數 status 的 Max_used_connections 高。
預設:100
建議:看系統
-
max_user_connections
每個使用者最大連線數
-
max_connection_errors
最大連線錯誤數,如果連線錯誤超過此數會出錯。
連線錯誤是指例如帳密錯誤之類。
這個設定沒有實際作用,
是讓你看有多少錯誤。
預設:
建議:1844674407370954751,越大越好
-
connect_timeout
連線逾時(秒)
預設:5
建議:10-15
golang 的 sql package connections 設定
golang mysql apiUnderstanding maxLifeTime on MySQL
-
SetMaxIdleConns
the maximum number of connections in the idle connection pool.
連接池中的最大閒置連線數。
-
SetMaxOpenConns ¶
最大同時開啟連線錯數。
-
SetConnMaxLifetime
連接池中閒置的連線當時間達到設定,就會被關閉。
使用中的連線不會被關閉,
MySQL connections status
mysql=> show status like 'conn%';-
Connection_errors_accept
-
Connection_errors_internal
-
Connections_errors_max_connections
-
Connections
The number of connection attempts (successful or not) to the MySQL server.
有史以來總連接數
-
Max_used_connections
最大同時連接數
-
Max_used_connections_time
最大連線使用時間
-
Thread_connected
The number of currently open connections.
當前連接數
-
Locked_connects
顯示當前連線及執行緒狀況
mysqladmin -u -p extended-status | grep -wi 'threads_connected\|threads_running'
| awk '{ print $2,$4}'
//output
Threads_connected 12
Threads_running 1
Threads_connected: Number of connections
Threads_running: connections currently running some sql
官方文件
MySQL 8 Variables 官方文件MySQL 5.7 Variables 官方文件
網上說明
MySQL 8.0 預設值優化
my.cnf優化Fix poor mySQL default variables
改 variable 及 my.conf
open_files_limit default 10000, optimize 10000
這是read only variable
需要編輯 /usr/lib/systemd/system/mysqld.service
LimitNOFILE=infinity
LimitMEMLOCK=infinityThen run
systemctl daemon-reload and systemctl restart mysql.service.innodb_open_files default 4000,
指定MySQL可同时打开
.ibd文件的最大个数,独立于open_files_limitmax_connections default 151, optimize 5000
max_user_connections default 0, optimize 0 //沒限制
max_connect_errors default 100, optimize 1844674407370954751 //越大越好,這個值沒用
connect_timeout default 10, optimize 15 //加5秒
table_open_cache default 4000, optimize 4000
所有线程打开表的数目。它的作用就是缓存表文件描述符,降低打开关闭表的频率,
table_open_cache_instances default 16, optimize 16
表缓存实例数,为通过减小会话间争用提高扩展性,表缓存会分区为table_open_cache/table_open_cache_instances大小的较小的缓存实例。DML语句会话只需要锁定所在缓存实例,这样多个会话访问表缓存时就可提升性能(DDL语句仍会锁定整个缓存)。默认该值为1,当16核以上可设置为8或16
2020年3月31日 星期二
編程範式:Functional / Imperative / OO / Procedure Programming
常見的編程範式有以下幾種:
functional programming(函數式編程)
imperative programming(命令式編程)
Objective-Oriented programming(物件導向式編程)
procedure programming(程序式編程)
Functional Programming
Functional programming 沒有只是構想,沒有絕對的規定。視程式設計為數學函式,每個函式各自獨立,彼此互不影響,
只要每個各自獨立的函式是正確的,那麼整個程式就是正確的。
各程式語言實作不同,但是有共通點:
- No Side Effect-在表示式(Expression)內不可以造成值的改變。
- First-Class Function-函數被當作一般值,可當傳入參數、傳出結果。
- 資料放在堆疊stack-或由堆疊指向heap。
- 盡量避免[狀態]與[可變資料],一切與函式內部無關。
優點
- Unit test 相對容易。以函式為單位,且只檢查輸入、輸出是否正確,不管其他狀態。
- 好除錯,因為沒有外部變數影響,所以錯誤容易重現,好找。
- 因為可以保留函式內狀態(closure)所以程式可以精簡。
- 適合寫併發(Concurrency)程式,因為不共享記憶體、沒執行緒、不上鎖、不擔心Critical Section。
Functional Programming到底做了什麼?
- Higher-Order Functions-可接受函式當參數,或以函式為回傳值的函式,稱為 higher-order function,容易進行資料處理(排序、過濾、對應)。
- Currying-用currying方式,定義特殊化函式。例如,有個函數為power(x, y),會計算出x的y次方,那麼事先將參數y指定為2,就可以定義一個平方函數square(x)。
- Lazy Evaluation-表示式可拖到真正需要執行才執行,因此編譯器有更大的優化空間。
- Continuations-將一個函數的傳出值,傳進另一個函數當作傳入值,也可以產生循序執行的效果。
- Pattern Matching-模式比對的方式,可以讓系統自動幫我們進行分支與變數的指定。降低switch/case依賴、多型依賴。
- Closure-函式離開後,其context依然保留,保留在內部函式,可當傳出值。
- List processing-有好用的list處理函式。
- Meta-Programming-許多FP語言都提供方便的Meta-Programming工具,讓你可以設計自己的Domain specific language
Imperative Programming(命令式編程)
Imperativ programming 認為程式的執行,就是一連串狀態的改變。資料大量放在heap中。利用大量的流程控制,或狀態判斷還選擇執行的程式。
例如switch/case就是最好的例子。
Objective-Oriented Programming
2020年3月21日 星期六
Javascript mocha
mocha in webstorm
1. npm install mocha --save-dev //安裝在專案目錄
2. npm init esm //讓test file 可以使用 es6 syntax
//如果是舊專案 npm i esm
3.
現在test file 可以使用 require (nodejs)
test file 可以使用 import es6 語法
4. webstorm 設定
Preferences=>
Language & Frameworks=>
Javascript=> Libraries
Add 搜尋 mocha
新增後名稱是 @types/mocha
(這樣mocha 語法不會顯示錯誤)
5. package.json
"scripts": {
"test": "mocha -r esm" //使用es6語法
}
6. 執行測試
npm test
會執行 test 目錄下的 裡面有 mocha test 的檔案 xxx.test.js
2020年3月12日 星期四
gitlab SSH
Gitlab SSH
官方說明//create ssh key eg. rsa ssh key ssh-keygen -t rsa -b 4096 -C "email@example.com" //如果有多組 ssh key,可指定使用哪一組 寫入config檔 ~/username/.ssh/config //範例 # GitLab.com Host gitlab.com Preferredauthentications publickey IdentityFile ~/.ssh/gitlab_com_rsa # Private GitLab instance Host gitlab.company.com Preferredauthentications publickey IdentityFile ~/.ssh/example_com_rsa //測試 ssh -T git@gitlab.com 如果成功,會詢問是否把domain加到known_hosts //刪除 known_hosts 所有的ssh 都會重新詢問一次
2020年3月1日 星期日
Javascript OOJS 物件導向JS
prototype 語言
Javascript 是基於 prototype 的語言,意思是他是利用 prototype 建立起整個語言架構。
有一個最基礎的 null,
然後所有物件的基礎物件 Object 就是繼承自 null 這個 prototype,
Object 本身自己有一個 prototype 屬性,
這個屬性是他讓別人繼承的,
也就是別的物件要繼承自 Object 時,
他其實繼承的是 Object 的 prototype 屬性(這個屬性裡可以包含很多東西)。
所以用 Javascript 寫的程式,
就是這樣,一個物件繼承自另一個物件的 prototype 屬性,逐步建立起整個程式。
建立物件的方式一:function 回傳物件
利用函式回傳一個物件。沒彈性,而且每一個物件都是 object。
function createNewPerson(name) {
var obj = {};
obj.name = name;
obj.greeting = function () {
alert('Hi! I\'m ' + this.name + '.');
}
return obj;
}
建立物件的方式二:Object()建構子
//new Object() 建立空白物件
//再把屬性加上去
var person1 = new Object();
person1.name = 'Chris';
person1['age'] = 38;
person1.greeting = function() {
alert('Hi! I\'m ' + this.name + '.');
}
//或是直接傳入一個物件當參數
var person1 = new Object({
name : 'Chris',
age : 38,
greeting : function() {
alert('Hi! I\'m ' + this.name + '.');
}
});
建立物件的方式三:Object.create() 函式 IE8不支援
var person2 = Object.create(person1); //person2.name //person2.greeting()
建立物件的方式四:建構子函式 constructor function
WDNConstructor funciton 是一種特殊的函式,
用來建立物件。
比用傳統方式建立物件好很多。
function Person(name,interests) {
this.name = name;
this.interests=interests;
this.greeting = function() {
alert('Hi! I\'m ' + this.name + '.');
};
}
var person1 = new Person('Bob',[1,2,3]);
var person2 = new Person('Sarah',[1,2,3]);
console.log(person1['name']); //可以這樣取
console.log(person1.interests[1]); //可以這樣取
console.log(person1.greeting());
console.log(person2.name);
console.log(person2.greeting());
用建構子函式實體化的物件
建構子函式實體化的物件,建構子函式定義的prototype屬性,只會有一份,
不會複製到每個實體上。
繼承(更接近於delegate 委託)
Javascript 的繼承,是[原型繼承](Prototypal inheritance)。子物件不會把父物件可繼承的屬性複製過來,
而是用原型鍊連結他繼承的屬性。
子物件的繼承其實不是繼承,而是連接,
連接父物件prototype屬性。
所以一個父物件,不管延伸出多少子物件,
子物件繼承的屬性都只有一份,
就是存在父物件 prototype 屬性的那份。
//父物件
function Person(first, last, age, gender, interests) {
this.name = {
first,
last
};
this.age = age;
this.gender = gender;
this.interests = interests;
};
Person.prototype.greeting = function() {
alert('Hi! I\'m ' + this.name.first + '.');
};
//子物件
function Teacher(first, last, age, gender, interests, subject) {
//用call 呼叫實體化父物件,把this 傳進去當作owner
Person.call(this, first, last, age, gender, interests);
//Teacher 新增的屬性
this.subject=subject;
}
var t=new Teacher("a","b",3,1,"book","math");
console.log(t.name); //{"a","b"}
每個物件的 prototype 屬性,是要繼承下去的。
所以父物件的 prototype 屬性要連結在子物件的 prototype 屬性上。
而子物件要讓孫物件繼承的屬性,也加到自己的 prototype 屬性上。
//父物件
function Person(first, last, age, gender, interests) {
this.name = {
first,
last
};
this.age = age;
this.gender = gender;
this.interests = interests;
};
Person.prototype.greeting = function() {
alert('Hi! I\'m ' + this.name.first + '.');
};
//子物件
function Teacher(first, last, age, gender, interests, subject) {
//用call 呼叫實體化父物件,把this 傳進去當作owner
Person.call(this, first, last, age, gender, interests);
//Teacher 新增的屬性
this.subject=subject;
}
//繼承父物件的 prototype 屬性
Teacher.prototype=Object(Person.prototype);
//**記得要把 constructor 設成自己,否則會是 Person
Teacher.prototype.constructor = Teacher;
var t=new Teacher("a","b",3,1,"book","math");
console.log(t.name); //{"a","b"}
console.log(t.greeting()); //繼承自父物件的屬性
複寫繼承自父物件的屬性
//父物件
function Person(first, last, age, gender, interests) {
this.name = {
first,
last
};
this.age = age;
this.gender = gender;
this.interests = interests;
};
Person.prototype.greeting = function() {
console.log('Hi! I\'m ' + this.name.first + '.');
};
//子物件
function Teacher(first, last, age, gender, interests, subject) {
//用call 呼叫實體化父物件,把this 傳進去當作owner
Person.call(this, first, last, age, gender, interests);
//Teacher 新增的屬性
this.subject=subject;
}
//繼承父物件的 prototype 屬性
Teacher.prototype=Object(Person.prototype);
//**記得要把 constructor 設成自己,否則會是 Person
Teacher.prototype.constructor = Teacher;
//複寫父物件的 greeting
//**要在 Teacher.prototype=Object(Person.prototype) 之後,才有複寫到
Teacher.prototype.greeting=function(){
console.log('Hi! I\'m teacher.');
}
var t=new Teacher("a","b",3,1,"book","math");
console.log(t.name); //{"a","b"}
console.log(t.greeting()); //變成自己的屬性
訂閱:
文章 (Atom)