const ca = await ethers.getContractFactory("DasomToken");
const cabi = ca.interface;
cabi.format() // Fragments 확인
cabi.forEachFunction((func, index) => { console.log(func.format()); }); // 각 함수의 시그니처 확인
cabi.forEachFunction((func, index) => { console.log(func.format(), ethers.keccak256(ethers.toUtf8Bytes(func.format()))); }); // 시그니처와 해시 값 확인.
[카테고리:] Development
[ethers.js] Contract Function 실행
const DasomOLI = ethers.getContractFactory('DasomOLI');
const dasomoli = DasomOLI.attach('0x1234567890123456789012345678901234567890');
dasomoli.functionDasom();
WSL Import/Export
Export
wsl.exe --export <DistributionName> <FileName>
WSL 관련 모든 프로그램 닫은 후,
wsl --export Ubuntu-20.04 Ubuntu20.04_dasomoli.wsl
Import
wsl.exe --import <DistributionName> <InstallLocation> <FileName>
Install할 경로 폴더 (C:\Users\dasomoli\AppData\Local\Packages\Ubuntu-20.04-dasomoli)를 만든 후,
wsl --import Ubuntu-20.04-dasomoli C:\Users\dasomoli\AppData\Local\Packages\Ubuntu-20.04-dasomoli Ubuntu20.04-dasomoli.wsl
[git] 추가된 파일이지만 변경은 무시하고 싶은 경우
git에서 repository에 파일은 추가해서 두고 싶지만 해당 파일이 빌드 중 변경되는 등의 이유로 변경은 무시하고 싶은 경우가 있다. 이런 경우 .gitignore에 추가해도 repository에 추가된 파일이므로 변경을 계속 추적하게 된다. 이 변경을 무시하고 싶다면 다음 명령을 주면 된다.
git update-index --assume-unchanged <file>
위 명령을 주면 해당 파일은 변경되어도 git status를 해도 나오지 않고 무시된다. 그러므로 주의해야 한다. 해당 파일을 다시 추적하고 싶다면 다음 명령을 입력한다.
git update-index --no-assume-unchanged <file>
[Javascript] Arrow function 정리
형식
다음은 모두 함수의 선언 혹은 표현식입니다. 마지막 형태가 arrow function입니다.
function dasomoli(arg1, arg2) {}
const dasomoli = function(arg1, arg2) {};
const dasomoli = (arg1, arg2) => {};
function 키워드를 제거하고 “=>” 를 중간에 넣는 형식입니다. 매개 변수 역시 사용 가능합니다.
바로 실행하고 싶은 경우(IIFE: Immediately Invoked Function Expression), 다음과 같이 괄호로 감싸서 실행합니다.
((arg1, arg2) => {
console.log(arg1);
console.log(arg2);
})(window, document);
생략 가능 형태
매개 변수가 하나인 경우, ( ) 생략 가능
매개 변수가 하나인 경우 괄호를 생략 가능합니다. 다음은 예제입니다.
const dasomoli = (arg1) => {};
const dasomoli = arg1 => {};
바로 return하는 경우, { }와 return 생략 가능
arrow function이 바로 return 하는 경우, 중괄호 { } 와 return은 생략 가능합니다. 다음은 예제입니다.
const dasomoli = (arg1, arg2) => {
return arg1 + arg2;
}
const dasomoli = (arg1, arg2) => arg1 + arg2;
바로 { }로 감싼 object를 return 하는 경우, { }와 return은 생략 가능하지만 object를 ( )로 감쌈
예외로 { } 로 감싸는 object를 리턴하는 경우, object 전체를 괄호()로 감싸주어야 합니다. 다음은 예제입니다.
const dasomoli = () => { return { prop1: 1 }; }
// const dasomoli = () => { prop1: 1 } <- 이건 안됩니다.
const dasomoli = () => ({ prop1: 1 });
array는 상관 없습니다.
const dasomoli = () => { return [ v1, v2, v3 ]; }
const dasomoli = () => [ v1, v2, v3 ];
[MySQL] DB auto repair 및 optimize
제공하는 mysqlcheck로 check 및 복구, optimize를 하려면 다음과 같이 한다.
mysqlcheck -u <USER_ID> -p<PASSWORD> --auto-repair <DB_NAME>
mysqlcheck -u <USER_ID> -p<PASSWORD> --optimize <DB_NAME>
예제로 wordpress의 경우, user를 wordpress로 했다면, 다음과 같이 하면 된다.
mysqlcheck -u wordpress -pPASSWORD_HERE --auto-repair wordpress
mysqlcheck -u wordpress -pPASSWORD_HERE --optimize wordpress
근데 wordpress의 경우 테이블을 optimize를 지원하도록 만들지는 않는다…
[C] nm, readelf, objdump, size
링킹 관련 object file을 다루는 binutils 몇가지를 설명하고 command 예제를 보인다.
nm: object 파일 내의 symbol 을 나열한다.
nm dasomoli.o
readelf: symbol table을 보인다.
readelf -s dasomoli.o
readelf -hSl dasomoli.o
몇가지 옵션은 다음과 같다.
-h --file-header Display the ELF file header
-l --program-headers Display the program headers
--segments An alias for --program-headers
-S --section-headers Display the sections' header
--sections An alias for --section-headers
-s --syms Display the symbol table
--symbols An alias for --syms
--dyn-syms Display the dynamic symbol table
--lto-syms Display LTO symbol tables
--sym-base=[0|8|10|16]
Force base for symbol sizes. The options are
mixed (the default), octal, decimal, hexadecimal.
objdump: object file 내의 machine level 명령 및 그 disassembly를 보인다. macOS에서는 gobjdump를 사용한다.
objdump -d dasomoli.o
다음과 같이 -s -j
옵션으로 section 내용 확인이 가능하다. -s 는 선택된 section의 모든 내용을 보여 준다. -j <section> 은 section의 내용을 모두 표시한다.
objdump -s -j .data dasomoli.out
-S 옵션으로는 source disassembly 내용을 표시한다.
objdump -S dasomoli.out
size: static memory layout에 해당하는 세그먼트를 살펴볼 수 있다. POSIX utility program이다. macOS에도 있다.
size dasomoli.out
size -m dasomoli.out
[clang] LLVM clang으로 AST 확인
AST(Abstract Syntax Tree) 확인은 아래와 같이 한다. 컴파일러 백엔드가 생성된 AST를 최적화한다.
clang -Xclang -ast-dump -fsyntax-only dasomoli.c
[Web] “이 사이트의 보안 연결(HTTPS)은 완벽하지 않습니다.” 발생 시
https 적용 후 인증서 적용은 잘 되었지만, “이 사이트의 보안 연결(HTTPS)은 완벽하지 않습니다.”가 발생하는 경우가 있다. 이 경우는 사용하는 리소스 중 일부가 여전히 http를 사용하는 경우 나타난다.
브라우저의 개발자 도구를 이용해서 http를 사용하는 리소스를 찾아 모두 https를 사용하도록 하여 제거해주도록 한다.
[WordPress] 워드프레스 이전 후 카테고리와 댓글 수 이상 문제 해결 방법
워드프레스를 이전하고 나서, 카테고리가 제대로 나타나지 않는다거나, 카테고리 내의 글 갯수가 이상하게 표시되는 경우, 댓글이 이상한 경우 등이 있다.
https://www.wpbeginner.com/wp-tutorials/how-to-fix-category-and-comment-count-after-wordpress-import/ 의 방법을 따르면 된다.
요약하면 UpdraftPlus를 이용해서 사이트 백업 후, 다음 파일을 wordpress 디렉토리 내부에 comments-fix.php로 저장한 후 이를 브라우저에서 로딩해서 실행한다. 내부의 DB_HOST
, DB_USER
, DB_PASSWORD
, DB_NAME
등을 바꾼다. 나의 경우, “localhost”, “dasomoli”, “PASSWORD”, “wordpress” 로 바꿔주었다.
<?php
include("wp-config.php");
$myConnection = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD);
if (!mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD)) { die('Could not connect: ' . mysqli_error()); }
if (!mysqli_select_db($myConnection, DB_NAME)) { die('Could not connect: ' . mysqli_error()); }
$result = mysqli_query($myConnection, "SELECT term_taxonomy_id FROM ".$table_prefix."term_taxonomy");
while ($row = mysqli_fetch_array($result)) {
$term_taxonomy_id = $row['term_taxonomy_id'];
echo "term_taxonomy_id: ".$term_taxonomy_id." count = ";
$countresult = mysqli_query($myConnection, "SELECT count(*) FROM ".$table_prefix."term_relationships WHERE term_taxonomy_id = '$term_taxonomy_id'");
$countarray = mysqli_fetch_array($countresult);
$count = $countarray[0];
echo $count."<br />";
mysqli_query($myConnection, "UPDATE ".$table_prefix."term_taxonomy SET count = '$count' WHERE term_taxonomy_id = '$term_taxonomy_id'");
}
$result = mysqli_query($myConnection, "SELECT ID FROM ".$table_prefix."posts");
while ($row = mysqli_fetch_array($result)) {
$post_id = $row['ID'];
echo "post_id: ".$post_id." count = ";
$countresult = mysqli_query($myConnection, "SELECT count(*) FROM ".$table_prefix."comments WHERE comment_post_ID = '$post_id' AND comment_approved = 1");
$countarray = mysqli_fetch_array($countresult);
$count = $countarray[0];
echo $count."<br />";
mysqli_query($myConnection, "UPDATE ".$table_prefix."posts SET comment_count = '$count' WHERE ID = '$post_id'");
}
?>