어떤 외국어를 처음 접할 때 느꼈던 감정은 항상 같다.
일본어 중국어 스페인어 맛만 볼 때도
어순이 다른 것도
성조 유무
문법과 숙어
그리고 끝으로 해당 언어를 문화에 이르기까지
알면 알수록 깊고 넓은 언어인데
컴퓨터 언어도 마찬가지 아닌가.
2013년도에 함께 캘리포니아에서
마주쳤을지도 모르는 페어분과 나눈 이야기 일부이다.
(너무 반가웠...)
언어라는 게 다를 게 없는 것 같다.
상대가 찰떡 알아 먹고 내가 꿀떡 알아 먹고.
프로그래밍언어에서 상대는 컴퓨터이고 이놈이
세상 논리적이고 성실한 도구이기에
손으로 부리기 위해서는 내가 이 놈을 더 잘 이해해야 한다.
언어 공부에서 숙어와 문화에서 항상 어려움을 느낀 것은
충분히 그 언어에 젖지 않아 그렇다.
그래도 이론으로 충분히 젖었다 생각 했는데 문법 공부만 파다가
실전에서 한 마디도 던지지 못 했던 상황처럼 지금의 상황이 그러함을 실감한다.
항상 새로운 언어에 도전할 때 읽었던
롬브 커토 할머니의 [언어공부]를 또 읽어야 하나.
16개 국어를 유창하게 했던, 언어 자체를 사랑했던 그 분의 무모한 도전기는
미지의 세계에 발 담그기 직전에 언제고 도움이 된다.
블록체인과 크립토 마켓에 대한 인사이트도 공유했다. (사실 이 부분이 오늘의 핵심)
이더리움의 불완전성을 대채하고 NFT에 최적화 된 코인인
솔라나와 마켓플레이스에 대해 모호했던 시각이 어느정도 재적립된 것이다.
로열티를 타켓으로 하는 준비중인 프로젝트에 적합한 모델이다.
이더리움 가스피가 부적절하다는 것과, 그것에 비해 훨씬 유리한 거래가
솔라나에서 가능하다는 것은 솔라나가 현금흐름상
홀더와 크리에이터에게 유리하며 NFT 가치 제고에도 큰 이점을 지닌다.
솔라나의 마켓플레이스가 빠르게 그 순위를 올리고 있고,
마켓도 활성화 중이라는 사실을 확인했다.
민팅과 아트웍을 솔라나에서도 진행하는 것을 하나의 선택지로 해 두자.
이런 교류를 위해 블록체인 부트캠프를 포기하지 않았는데,
그 선택이 틀리지 않았음을 다시 한 번 확인한다.
📍자, 오늘 TIL 초안이다
꽤 재미있던게 많았지
정리 해서
뇌에 박아 놓자
가장 빠르게 실력이 늘고 있다고 느끼는 지점이 문제를 파악하는 속도이다. 어려운 문제였는데 다행히도 첫 단추를 성공적으로 끼웠다.
function stringifyJSON(obj) {
if( typeof obj === "number" || typeof obj === "boolean" || obj === null ){
return `${obj}`
}else if( typeof obj === "string" ){
return `"${obj}"`
}else if( Array.isArray(obj) ){
const resultA = [];
for (let i of obj){
resultA.push(stringifyJSON(i))
}return `[${resultA}]`
}
let resultO = [];
if(Object.keys(obj).length === 0) {
return `{}`;
}
else {
for(let key in obj) {
if(typeof obj[key] === `string` || typeof obj[key] === `boolean` || obj[key] === null) {
let strKey = stringifyJSON(key);
let strVal = stringifyJSON(obj[key]);
let strArr = strKey + `:` + strVal;
resultO.push(strArr);
} else if(Array.isArray(obj[key])) {
let arrKey = stringifyJSON(key);
let arrVal = stringifyJSON(obj[key]);
let arrArr = arrKey + `:` + arrVal;
resultO.push(arrArr);
} else if(typeof obj[key] === `function` || obj[key] === undefined) {
delete obj[key];
stringifyJSON(obj);
} else {
let objKey = stringifyJSON(key);
let objVal = stringifyJSON(obj[key]);
let objObj = objKey + `:` + objVal;
resultO.push(objObj);
}
}
}
return `{${resultO}}`;
}
// your code goes here
// 다음 코드는 결과 제출을 위한 코드입니다. 신경 쓰지 않아도 좋습니다.
if (typeof window === "undefined") {
module.exports = stringifyJSON;
}
어려웠던 부분은 오브젝트의 키와 벨류를 분리해서 각각 정리하는 지점이었다.
for 문을 좀 더 잘 쓸 수 있는 방법을 생각 해 보자.
오늘 스프린트 리뷰 담당자 분은 forEach 문을 잘 쓰시던데 곱씹어 보자.
// if(Array.isArray(obj)){
// let result = [];
// obj.forEach((element) => {
// result.push(stringifyJSON(el))
// });
// }
JavaScript Demo: Array.forEach()
const array1 = ['a', 'b', 'c'];
array1.forEach(element => console.log(element));
// expected output: "a"
// expected output: "b"
// expected output: "c"
result.html을 먼저 봤다면 쉽게 해결 했을 문제이다.
조금 헤맸지만 다행히 해결책을 잘 찾았다.
// TODO: createTreeView 함수를 재귀(자기 자신을 계속 부르게 함)호출하여 테스트케이스를 통과하세요.
// GOAL: 최종 결과가 resut.html와 같은 모습으로 나와야 합니다.
const root = document.getElementById('root');
function createTreeView(menu, currentNode) {
for(i of menu){
const list = document.createElement('li')
//root.append(list)
if(i.children){
const check = document.createElement('input')
list.append(check)
check.setAttribute('type', 'checkbox')
check.type = 'checkbox'
const span = document.createElement('span')
list.append(span)
span.textContent = i.name
const ul = document.createElement('ul')
list.append(ul)
currentNode.append(list)
createTreeView(i.children, ul);
}else{
list.textContent = i.name;
currentNode.append(list)
}
}
// TODO: createTreeView 함수를 작성하세요.
}
createTreeView(menu, root);
오랜만에 document.createElement와 append를 요구해서
조금 헤맸던 것 같다.
찬찬히 감상하면서 소화시키자.
내일은 재귀보다 더 귀여운 자료구조
스택 큐 반갑다. 꼭꼭 씹어넘겨줄게.
오늘도 수고했다.