Enable MySQL slow query log on CentOS

Enable MySQL slow query log on CentOS

1. แก้ไข MySQL config ได้ที่

vi /etc/my.cnf

หากไม่พบ ให้ลองดูที่ /etc/mysql/my.cnf แทน

2. เพิ่มคำสั่งล่างบรรทัด [mysqld]

slow_query_log = 1
log-slow-queries = /var/log/mysql-slow.log
long_query_time = 2

3.สร้างไฟล์เก็บ log รอไว้

touch /var/log/mysql-slow.log
chown mysql:mysql /var/log/mysql-slow.log

4. Restart MySQL service

service mysqld restart

for MariaDB

service mariadb restart

5. รอเว็บไซต์เรามีการเรียก query ที่ช้า มันจะเก็บข้อมูลลง log เราสามารถตรวจสอบ slow query log ด้วยคำสั่ง

mysqldumpslow -a /var/log/mysql-slow.log
Posted in ไม่มีหมวดหมู่ | Leave a comment

nextjs jest enzyme yarn test

1.ติดตั้ง package

npm install –save-dev jest babel-jest babel-core babel-preset-env babel-preset-react

2.สร้างไฟล์ /config/jest.setup.js ใส่ code ดังนี้

import { configure } from ‘enzyme';
import Adapter from ‘enzyme-adapter-react-16′;
configure({ adapter: new Adapter() });
3. สร้างไฟล์ jest.config.js อยู่ตำแหน่งเดียวกับ package.json ใส่ค่าดังนี้
module.exports = {
setupFilesAfterEnv: [‘./configs/jest.setup’],
moduleNameMapper: {
‘\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)

: ‘<rootDir>/assetsTransformer.js’

},
verbose: true
};
4. สร้างไฟล์ assetsTransformer.js ใส่ค่าดังนี้
const path = require(‘path’);
module.exports = {
process(src, filename, config, options) {
return `module.exports = ${JSON.stringify(path.basename(filename))};`;
}
};
5. สร้างไฟล์ /tests/jest.test.js เป็นไฟล์ test ตัวอย่าง โดยมี mock redux,translator,publicRuntime และใส่ค่าดังนี้
import React from ‘react';
import { shallow, mount } from ‘enzyme';
import { ProgressBox } from ‘components/index';
import PasswordCenter from ‘components/PasswordCenter';
import ProfilePage from ‘pages/index';
import { changePasswordFetcher } from ‘common/fetch';
//mock next/config, redux, function
jest.mock(‘next/config’, () => () => ({ publicRuntimeConfig: { MAIN_URL:”MAIN_URL” } }));
jest.mock(‘react-redux’, () => ({
useDispatch: () => {},
useSelector: () => ({
app: {
urlParams : {
authorization: “Bearer token”,
password: “password”,
deviceId: “deviceId”,
deviceModel: “deviceModel”,
latLong: “latLong”,
},
ipAddress: “ipAddress”
},
user: {
profile: {
account_login: “account_login”
}
}
})
}));
jest.mock(‘common/fetch’, () => ({
changePasswordFetcher: jest.fn()
}));
describe(‘Progress Box Component’, () => {
test(“it’s renders”, () => {
const wrapper = shallow(<ProgressBox />);
expect(wrapper.exists()).toBe(true);
});
});
describe(‘ProfilePage Component’, () => {
test(“it’s renders”, () => {
const wrapper = shallow(<ProfilePage t={(k) => ‘translate hardcoded’} />);
expect(wrapper.exists()).toBe(true);
});
});
describe(‘PasswordCenter Component’, () => {
it(‘is able to mock function’, () => {
let objReturn = {
data: {
status: “1”
}
}
changePasswordFetcher.mockReturnValueOnce(objReturn);
});
test(“it’s renders”, () => {
const wrapper = shallow(<PasswordCenter t={(k) => ‘translate hardcoded’} />);
expect(wrapper.exists()).toBe(true);
});
});
6. ที่ package.json ใส่ script jest สำหรับ run ดังนี้
“test”: “jest –watchAll”,
“test-coverage”: “jest –coverage”
7. ทดสอบ yarn test หรือ yarn test-coverage
Posted in ไม่มีหมวดหมู่ | Leave a comment

NODEJS NEWRELIC

1) goto root folder
2) sudo npm install newrelic –save
3) copy node_module/newrelic/newrelic.js to root folder
4) edit newrelic.js
‘use strict’
/**
* New Relic agent configuration.
*
* See lib/config/default.js in the agent distribution for a more complete
* description of configuration variables and their potential values.
*/
exports.config = {
/**
* Array of application names.
*/
app_name: [‘AAA.FN-MYACCOUNT.Alpha’],
/**
* Your New Relic license key.
*/
license_key: ‘e33447c501a500a1929d4a50aeeb02a1cce50312′,
logging: {
/**
* Level at which to log. ‘trace’ is most useful to New Relic when diagnosing
* issues with the agent, ‘info’ and higher will impose the least overhead on
* production applications.
*/
level: ‘info’
},
/**
* When true, all request headers except for those listed in attributes.exclude
* will be captured for all traces, unless otherwise specified in a destination’s
* attributes include/exclude lists.
*/
allow_all_headers: true,
attributes: {
/**
* Prefix of attributes to exclude from all destinations. Allows * as wildcard
* at end.
*
* NOTE: If excluding headers, they must be in camelCase form to be filtered.
*
* @env NEW_RELIC_ATTRIBUTES_EXCLUDE
*/
exclude: [
‘request.headers.cookie’,
‘request.headers.authorization’,
‘request.headers.proxyAuthorization’,
‘request.headers.setCookie*’,
‘request.headers.x*’,
‘response.headers.cookie’,
‘response.headers.authorization’,
‘response.headers.proxyAuthorization’,
‘response.headers.setCookie*’,
‘response.headers.x*’
]
},
distributed_tracing: true ,
error_collector: {
ignore_status_codes: [400,403,500]
}
}

1) goto root folder2) sudo npm install newrelic –save3) copy node_module/newrelic/newrelic.js to root folder4) edit newrelic.js’use strict’/** * New Relic agent configuration. * * See lib/config/default.js in the agent distribution for a more complete * description of configuration variables and their potential values. */exports.config = {  /**   * Array of application names.   */  app_name: [‘AAA.FN-MYACCOUNT.Alpha’],  /**   * Your New Relic license key.   */  license_key: ‘e33447c501a500a1929d4a50aeeb02a1cce50312′,  logging: {    /**     * Level at which to log. ‘trace’ is most useful to New Relic when diagnosing     * issues with the agent, ‘info’ and higher will impose the least overhead on     * production applications.     */    level: ‘info’  },  /**   * When true, all request headers except for those listed in attributes.exclude   * will be captured for all traces, unless otherwise specified in a destination’s   * attributes include/exclude lists.   */  allow_all_headers: true,  attributes: {    /**     * Prefix of attributes to exclude from all destinations. Allows * as wildcard     * at end.     *     * NOTE: If excluding headers, they must be in camelCase form to be filtered.     *     * @env NEW_RELIC_ATTRIBUTES_EXCLUDE     */    exclude: [      ‘request.headers.cookie’,      ‘request.headers.authorization’,      ‘request.headers.proxyAuthorization’,      ‘request.headers.setCookie*’,      ‘request.headers.x*’,      ‘response.headers.cookie’,      ‘response.headers.authorization’,      ‘response.headers.proxyAuthorization’,      ‘response.headers.setCookie*’,      ‘response.headers.x*’    ]  },  distributed_tracing: true ,  error_collector: {      ignore_status_codes: [400,403,500]  }  }

Posted in ไม่มีหมวดหมู่ | Leave a comment

robot framework wait until element is clickable – not working

robot framework wait until element is clickable – not working

Your screen not see the element then just scroll to top first

Execute JavaScript    window.scrollTo(0,0)
Sleep    7s
Wait Until Element Is Visible         ${btn_publish}       10
Sleep    2s
Click Button                   ${btn_publish}
Posted in ไม่มีหมวดหมู่ | Leave a comment

วิธี Bind DNS Server ใน virtualmin/webmin

วิธี Bind DNS Server ใน virtualmin/webmin

การจะผูก domain กับ dns server ไม่ว่าจะเป็น Hosting แรก หรือเป็นการย้าย Hosting จะต้องทำขั้นตอนนี้คือ วิธี Bind DNS Server สร้างชื่อ dns ของเราเอง และนำ DNS ไปผูกใส่กับ domain ของเรา ถ้าซื้อ domain จาก godaddy ก็เข้าไปจัดการที่ godaddy ทำตามรูป

1. Webmins > Servers > BIND DNS Server > เลือก zone โดเมนเรา > Edit Record File

2. สร้าง DNS ชื่อโดเมนเราเอง เพิ่ม Record 4 บรรทัดตามรูป xxx.com คือ โดเมนของคุณ และ yourip คือไอพีของคุณ และกด save

3. ถ้าจะใช้ของ digitalocean ง่ายกว่ามาก ให้เข้าไปล็อคอิน เลือก Networking จากนั้นใส่ Domain และเลือก droplet เราจะได้ ns1-ns3.digitalocean.com มา

4. ไปที่ผู้ให้บริการจดโดเมนของคุณ > เข้าสู่ระบบ > และเข้าไปแก้ไข DNS เป็น ns1.digitalocean.com ns2.digitalocean.com ns3.digitalocean.com

5. รอ DNS เปลี่ยนมาที่ใหม่ ใช้เวลาภายใน 24 ชม. ถ้าเปลี่ยนไว อาจจะติดเรื่อง local dns cache ทำให้เวลาเราเรียก domain ในบางครั้งอาจกลับไปได้ IP เก่า บางครั้งได้ IP ใหม่ ต้องรอซักระยะครับ

Posted in ไม่มีหมวดหมู่ | Leave a comment