[컴] ko_KR, ko-KR 중 어느것이 맞을까?

 

en_US vs en-US /

ko_KR, ko-KR 중 어느것이 맞을까?

RFC 5646: Tags for Identifying Languages 에서는 -(하이픈) 을 사용한다고 돼있다. RFC 문서의 예제에서도 en-US 를 확인할 수 있다.

en-USIETF language tag - Wikipedia 라고 한다.

java 에서는 표준을 en-US 로 인식하는 듯

ref. 1 에 있는 예제처럼 java Locale 에서도 ‘en_US’ 를 넣으면 Locale 설정이 되지 않는다고 한다.

Locale.forLanguageTag("en-US").toString();
>> en_US
Locale.forLanguageTag("en_US").toString()
>> null

android, ios 에서는 _ 가 표준

ref. 4 에서 보면 android 에서 언어_국가 를 표준처럼 쓰이는 듯 하다.

그런데 이것이 ios 에서도 비슷하다. ref. 5 에 보면 [language designator]_[region designator] 를 확인할 수 있다.

다만 ios 에서는 script designator 라는 개념을 더 사용한다. 그래서 ‘-’(하이픈, hyphen) 도 사용된다. ref. 5 에서 script subtags 에 ISO 15924, ISO/IEC 10646 and Unicode 대한 글을 확인할 수 있다.

References

  1. java - What is the difference between creating a locale for en-US and en_US? - Stack Overflow
  2. java - Should I use _ (underscore) or - (dash) while using locale ID? - Stack Overflow
  3. RFC 5646: Tags for Identifying Languages
  4. Language and locale resolution overview | Android Developers
  5. Language and Locale IDs

[컴][swe] IT 인력 채용시 유의해야 할 점

인력 고용 / interviewer / 면접자 /it인력 고용방법 / 팁

IT 인력 채용시 유의해야 할 점

ref. 1 을 보면 다음 내용은 IT 리더 및 채용담당자들과의 대화에서 나온 이야기라고 한다.

  1. 무례한 태도의 신호: Great on paper, rude at interview;
    • 아웃리치(Outreach)의 채용 책임자 제니 랜섬
    • “엔지니어링 조직을 구성한다면 직무를 수행하고 제품을 개선할 수 있으면서도 다른 엔지니어들과 잘 협력하고 다른 조직과 교차 협업할 수 있는 사람들이 필요하다. 필요한 하드 스킬을 모두 갖고 있지만 프로세스 내내 채용 팀 또는 존중하는 태도가 부족한 사람과 면접을 진행한 경험이 있다. 다양한 업무 스타일을 수용하고 인식해야 하지만 다른 이들에 대한 무례는 적색 신호이다. 다행히도, 검증 프로세스를 통해 그 사람이 고용되기 전에 미리 조사할 수 있었다”
  2. 암기한 듯한 대답: Canned answers
    • 아웃리치(Outreach)의 채용 책임자 제니 랜섬
    • 암기한 대답을 사용하는 구직자는 문제의 조짐이다. 암기한 대답은 사려 깊음과 비판적 사고의 부재를 보여준다.
    • “때로는 지원자가 포괄적인 대답을 하는 경우가 있다. 그럴 수도 있다고 생각한다. 하지만 비판적이며 창의적인 프로세스, 해결책에 도달한 방식, 팀에서 자신에게 중요한 것이 무엇인지 알아내야 한다”
  3. 회사의 사명을 이해하지 못함 : Doesn’t understand the company’s mission
    • 컴피테라(Competera)의 CTO 유진 네이데노브
    • “지원자가 우리의 제품, 시장 영역, 실제 세계에서 이것이 해결하는 문제에 대해 신경을 쓰지 않고 순수하게 기술 지향적인 사람이라면 적색 신호라고 생각한다. 실질적인 비즈니스 사례를 해결하고 최종 사용자에게 최대한 실질적인 가치를 제공할 수 있어야 한다”
    • 제니 랜섬: “양쪽 모두에 어느 정도 주의를 기울여야 한다.”
    • “만약 후보자가 그들의 연구를 짧게라도 하지 않았다면, 그것은 단지 어느기업이 그들에게 가장 많은 돈을 지불할 수 있는지만 보고 지원한 것이다. 회사가 무엇을 하고, 지원자가 무엇을 만들 수 있는지에 대한 요소가 결정을 내리는 요소로 작용하지 못할 경우, 향후 채용 결정이나 유지 문제로 이어질 수 있다.”
  4. 기술에 관해서만 이야기함 : Only talks tech
    • FRG(Frank Recruitment Group)의 CEO 제임스 로이드 타운쉔드
    • “두문자어를 술술 이야기하고 장황한 기술 용어로 답할 수 있는 지원자는 기술에 능한 면접관을 안심시킬 수 있다. 하지만 그렇다고 항상 기술 또는 기술 지식을 활용해 비즈니스 문제를 해결할 수 있는 방법을 이해하는 것은 아니다”
    • 질문을 할때 전문용어를 사용하는 것을 피하고, 지원자가 암기한 답변을 하는 것처럼 보이는 경우 추가적인 설명을 요청하라고 조언
    • “그들이 그렇게 할 수 없는 경우 그들이 형편없는 의사소통자 이거나 최악의 경우 해당 기술 또는 프로세스를 완전히 이해하지 못하고 있다는 뜻일 수 있다”
  5. 믿기 어려운 스킬 목록 : Implausible skills list
    • OSP 인터내셔널(OSP International)의 CEO 코넬리우스 피시트너
    • “특히, IT에서는 그렇다. 자신의 스킬을 과장하는 지원자들이 아주 흔하다”
    • 지원자에게 과제를 할당하되 제출 시한을 설정하고 비용을 지불하라고 조언.
    • “우리는 그들이 최선을 다하도록 동기를 부여하고 최고의 인재를 놓치지 않기 위해 비용을 지불한다. 또한 그들은 과제를 더욱 진지하게 받아들인다. 이 방식으로 업무를 완수할 사람과 시간과 돈을 낭비할 사람을 구분할 수 있다. IT에서는 말보다 행동이 우선이기 때문에 우리는 지원자가 후보자가 할 수 있다고 한 일을 할 수 있는지 알아야 한다”
  6. 그저 일자리만 구하려는 태도 : Not career-minded
    • IH(Intermountain Healthcare)의 CIO 크레이그 리차드빌
    • “지원자 스스로 조직의 ‘사명’과 ’목표’에 기여할 계획을 가지고 있어야 한다. ’학습’, ‘성장’, ‘개발’, ‘지속적인 기여’ 욕구가 있어야 한다. 그들이 비즈니스에 어떻게 영향을 미치려는지에 대한 계획에 대한 생각이 없고, 커리어 발전에 대한 계획에 대한 생각이 없을 수록, 잘 맞을 가능성이 낮다”
    • 베츠(Betts)의 수석 채용 담당자 멜리사 허쉬
    • 지원자가 사려 깊게 조사하지 않은 것 같은 느낌일 때 적색 신호가 나타난다고 말했다.
    • “그들은 수십 개의 회사에 지원한다. 면접관은 항상 지원자가 정말로 그 직업을 원하고 조사를 했는지, 마지못해 하는지 그리 어렵지 않게 알 수 있다”
  7. 구체적으로 설명할 수 없음 : Can’t get specific
    • 캘리포니아대학교 얼바인 캠퍼스의 CDO 겸 정보, 기술, 데이터 부총장 톰 안드리올라
    • 원자에게 직무 관련 경험에 대한 설명을 요청한다. 구직자가 구체적으로 설명할 수 없을 때 경고 조짐을 감지
    • “변화와 전환을 추진하는 주요 역할의 경우, 조직이 헤쳐 나아가도록 도운 경험과 이에 수반되었던 문제를 명확히 표현할 수 있는 사람들이 있다. 나는 그것의 깊이를 테스트하고 싶다”
    • 베츠의 허쉬
    • 세부사항의 부재가 문제 신호일 수 있다는 점에 동의
    • “대화 당시에 회사와 구체적으로 관련되지 않았으며 다른 기업의 다른 면접에서 반복될 수 있는 질문에 답하는 경우 조심해야 할 수 있다”
    • 컨설팅 기업 DT(DifferentThinking)의 설립자 겸 CEO 지비트 인바
    • 지원자에게 문제를 해결한 방식의 예를 묻고 ’그들이 직면했지만 잘 해결되지 않았던 문제에 관해 질문’하는 경우가 많다. 인바는 “일부 지원자는 올바르게 해결하지 못했던 문제를 기억하지 못한다. 하지만 우리 모두는 문제에 직면하고 실수를 범한다. 이를 인정하지 않는 것이 적색 신호이다”
  8. 원격면접 시 카메라 비활성화 : No picture
    • 허쉬
    • 원격 면접에서 비디오 없이 회의에 참석하는 것은 자신감의 부족, 또는 의지의 결여를 의미
  9. 독불장군 : Goes it alone
    • 세이프티컬처(SafetyCulture)의 CTO 제임스 심슨
    • 지원자가 이전 직장에서 동료의 기여도를 인정하지 않을 때 우려
    • “그들이 자신의 기여도 측면에서만 직업 생활 업적을 설명하고 참여했을 수 있는 팀에 대한 언급을 누락하는 경우 다시 한번 생각하게 된다”
    • 지원자가 업무상 내려야 했던 어려운 결정이 무엇이었는지에 대해 질문하는 경우가 많다. 그는 기술보다는 동료에 대한 초점을 살펴본다.
    • “나는 코칭, 주도, 성과 관리 등 사람과 관련된 이야기를 듣고 싶다. 사람들은 업무에 있어서 가장 복잡하지만 중요한 부분이다. 하지만 때로는 지원자가 그들이 내린 기술 결정에 관해 이야기한다. 그 부분도 관심이 있지만 이를 통해 그들의 초점이 드러난다”
    • “나는 또한 누군가 범했던 가장 중대했던 실수와 그들이 배운 교훈에 관해 질문한다. 그들이 경험으로부터 교훈을 얻을 수 있다면 좋은 것이다. 나는 그것을 원한다. 하지만 경우에 따라 자신의 잘못이 아니었던 이유, 또는 다른 사람이 문제였던 사연만 풀어놓는 이들이 있다”
  10. 채용 프로세스 중 태도의 변화 : Shifting expectations from first interview to final
    • GA(General Assembly)의 인재 및 다양성, 평등, 포용 부사장 티파니 어빙
    • 초기 면접과 최종 면접 단계 사이의 차이가 보이는 경우가 증가
    • “근무 시간 및 보상 측면에서 다른 기업의 제안 때문인 경우가 많다. 고용팀은 역할에 적합한 사람을 찾았다고 기뻐하다가 나중에 고용에 실패한다. IT 전문가에 대한 수요가 지속적으로 증가함에 이런 일이 더욱 자주 발생하고 있다”
    • 이런 우려에도 불구하고 원칙을 유지하는 것이 중요하다고 말했다. 엄격한 면접과 조사 프로세스를 유지하지 않으면 나중에 대가를 치를 수 있다.
    • “기술 인재를 고용할 때 시간적 제약이 따르는 경우 더 신속히 처리하기 위해 수정하는 경우가 있다. 그러나 편법은 잘못된 고용의 지름길이다. 나중에 자신이 결국 책임지게 될 수도 있다”

Reference

  1. “급하다고 질러가지 마라” IT 채용 시 유의해야 할 10가지 조짐 - CIO Korea, 2022-08-17
  2. 10 red flags to watch for when hiring, 2022-08-15

[컴][웹] http request 취소 방법

 

abort / request cancel the request/

http request 취소

AbortController 를 사용하면 된다.

아래는 ref. 1 의 예제이다.

downloadBtn 을 누르면, fetch 가 시작되며, abortBtn 을 누르면, controller.abort() 가 호출되는 구조이다.

controller.abort() 가 호출되면, fetch() 는 AbortError 라는 DOMException 을 발생시킨다.

let controller;
const url = 'video.mp4';

const downloadBtn = document.querySelector('.download');
const abortBtn = document.querySelector('.abort');

downloadBtn.addEventListener('click', fetchVideo);

abortBtn.addEventListener('click', () => {
  if (controller) {
    controller.abort();
    console.log('Download aborted');
  }
});

function fetchVideo() {
  controller = new AbortController();
  const signal = controller.signal;
  fetch(url, { signal })
    .then((response) => {
      console.log('Download complete', response);
    })
    .catch((err) => {
      console.error(`Download error: ${err.message}`);
    });
}

Reference

  1. And when that is invoked, the signal gets notified. controller.abort();
  2. AbortController - Web APIs | MDN

[컴][swe] 전임자의 나쁜 코드를 대하는 태도

 

나쁜 코드 욕나오는 코드 대하는 훌륭한 방법/ 개똥 / crap code / 이전 코드 / 나쁜 코드 수정할 때

전임자의 나쁜 코드를 대하는 태도

ref. 1 에서 제시하는 방법

  1. 불평하지 마라, 누구도 듣고 싶어하지 않는다.
  2. 시간이 있을때 수정하자.
  3. 다른이들도 같이 수정하게 하자.
  4. 모두를 위한 모범예제를 하나 만들자.
  5. 수정하기전에 test code 를 추가하자.
  6. 수정을 위해 단기, 장기계획 모두를 세우자.
  7. 빠르게 수정하고, 이슈가 생기면 다시 돌아가서 수정하면 된다.

from: ref. 1 의 마지막 문단(Endnote)

성급하게 고치지 마라, 당신이 이해하지 못하는 이유가 있을 수 있다. 그런 코드외에도 개똥같은 코드들은 있다. 불평하지 마라, 누구도 듣고 싶어하지 않는다. 자신들이 일을 어지럽혔다는 소릴 듣고 싶어하지 않는다. 당신도 그런말을 들으면 싫어할 것이다.

항상 방문하고 나서 떠날때 자리를 치우고 가자. 깨진 창문을 수리하자. 시간이 있을때, 다른 이들도 그것들을 수리하도록 해라.

버그를 수정하기 전에 test 를 추가해라 시간이 지나면, 수정 또는 refactoring 을 한 것에 대해 더 자신감을 갖게 될 것이다. 모두를 위한 예제를 만들어라, 하나씩 이 예제를 통해 모두가 조금씩 기여하고, 코드베이스를 더 나은 곳으로 만들 수 있다. 하룻밤사이에 만들어지지 않지만, 시간이 지나면, 누구도 인식하지 못할 것이다.(me: 아마도 지난 코드를)

만약 그것이 정말 끔찍하다면, 그것이 무엇인지, 왜 그것이 끔찍하다고 생각하는지 지적해라. 그것을 고치거나 고치지 않는 것이 어떻게 그것이 비지니스를 반영할것인가? 당신이 향상시킬 수 있는 것에 대한 짧은 계획, 긴 계획을 만들어라. 그러면, 당신은 항상 가치를 가져올 것이다.

그리고 기억해라, 다음 싸움은 언제든 일어날 수 있지만, 불이 끝난 이후에 다시 돌아와서 그것을 수정할 필요가 있다는 것이 잘 전달됐다면, 지름길을 가는 것을 두려워 하지 마라.

결국 당신은 휴일에 추가 케이크를 먹는 것으로 체중이 더 늘지 않을 테지만, 매일 추가적인 케잌을 먹으면 그럴 수 있다.

개인적인 생각

코드를 수정하면서 욕이 나오면, 고치면서 욕을 해라, 그것이 정신건강에 좋다. 다만, 혼자있을 때 하자. 남들이 들으라고 욕을 하지 말자.

그러나 더 나은 코드로 수정도 하지 않고, 그 코드를 욕만 하는 것은 대안없이 욕을 하는 듯 보인다.

See Also

  1. “Who wrote this s**t, asked the CTO. Flustered, he checked git blame, and the answer was him” : programming : 어떻게 코딩을 해야 하는지에 대한 답글들이 재밌다.

Reference

  1. Who wrote this shitty code? | OverfittedCat | Medium, 2022-01-20

[컴] 블록체인에 대한 생각

blockchain / 고찰 / 블록체인 /

블록체인에 대한 생각

reddit 에서 블록체인을 언제 써야 하는지에 대한 글이 인기를 끌었다. 개인적으로 동의하는 이야기이다.

글의 요지는 blockchain 이 일종의 ‘분산된 database’ 이지만, 한계가 있다는 이야기다. 그래서 다음 3가지의 조건을 모두 만족하는 경우에만 사용하는 것이 좋다는 이야기다.

  1. 분산 데이터베이스가 필요하다.
  2. 분산 DB 를 host 하는 믿을 수 있는 party 가 없다.
  3. 다른 것이 전혀 필요없다.

즉, 여기서는 bitcoin 같은 coin 의 원장(ledger) 의 역할까지만 할 수 있다는 이야기다. 여기에 다른 기능을 붙이는 것들은 오히려 문제를 야기할 수 있다는 이야기다.

개인적인 생각

개인적인 생각과 위글의 내용을 고려해서 결론을 내본다면, 결국 기존의 database 를 잘 이용하고 있는 시스템에 굳이 blockchain 을 도입할 이유가 없다고 보여진다.

위 글에서 이야기하듯이 위변조의 어려움이 오히려 사기꾼에게 도움을 주기도 한다. 예를들어, 우리가 보이스피싱을 당했다고 한다면, 그것을 되돌리거나, 정지시킬 수 없다.

게임머니를 생각해봐도 그렇다. 뭔가 잘못된 부분이 있는 경우 database 의 원복을 필요로 하거나, 특정부위의 거래만 수정해야 한다. 그런경우 blockchain 은 어렵다. 특정 시점으로 되돌리는 것은 가능할 수도 있겠으나, 특정부분만 수정하는 것은 불가능할 수 있다.

그리고 속도의 문제도 있다. 분산에 대한 동기화는 항상 속도의 이슈를 가져올 수 밖에 없다. sync 에 걸리는 시간이 없는 분산 db 는 없다. 하지만 그 node 의 분산이 너무 멀다면, 그 sync 의 속도는 현저히 늦어질 수 밖에 없다.

그리고 이전에도 분산db에 대한 시도는 있었다. 대표적인 p2p file share application 인 torrent 를 생각해보면 된다. 이 것의 응용버전인 냅스터(napster)나 우리나라 ‘소리바다’ 같은 것들이 존재했다. 하지만 결국 그들은 성공하지 못했다. 그것이 왜 그런 절차를 밟았는지에 대한 고려는 해볼 필요가 있다.

blockchain 은 computer science 중 하나의 기술일뿐이다. silver bullet 이 아니다.

[컴][db] mongodb script 를 java 에서 실행하는 법

how to run javascript script in java driver / java driver / how

mongodb script 를 java 에서 실행하는 법

결론

미리 결론을 이야기 하면, ref. 2 에서의 이야기는 java 에서 mongodb 에서 js 를 실행시키는 방법이 없다. 그래서 mongo shell process 를 띄우고 거기서 수행해야 한다고 한다.

명확치는 않지만, ref.1 을 보면, javascript로 된 script 를 실행해 주는 주체는 mongosh 인듯 보인다. 즉, java driver 에서 script 를 실행하는 방법은 mongo shell process 를 이용할 수밖에 없어 보인다.

아니면, js script 를 java 로 다시 작성하면 된다.

mongosh 를 이용해서 javascript file 을 실행하는 방법

참고로 과거의 shell 인 mongo 에서 실행하는 방법도 있다.

script 를 js 에 저장하고 그것을 load() 로 실행하는 방법

mongosh 를 열고, mongodb 에 접속후 아래처럼 load 를 이용하면 된다.

load(step1.js)
...
load(step2.js)

mongosh 를 이용해서 command line 의 argument 로 넘겨서 실행하는 방법

2개의 js 를 실행할때는 아래처럼 한다.

monogsh mongodb://mydb.com:27017/mydb -u myuid -p 'my-pass' --file step1.js --file step2.js

eval 은 사용할 수 없다.

MongoDB 4.2 부터 eval command 는 사라졌다.(참고: How do I execute a MongoDB js script using the Java MongoDriver - Stack Overflow)

Reference

  1. Write Scripts — MongoDB Shell
  2. how can I execute a javascript file by the Java Mongodb driver, 2014-11-06

[컴] mongodb runCommand 를 java 에서 실행하는 법

 

java mongodb driver / mongo db driver / how to run command in java / mongodb.runCommand

mongodb runCommand 를 java 에서 실행하는 법

was 등의 application 에서 mongodb.runCommand 를 수행하고 싶을때를 위해 기록.

아래 예제는 java driver v4.3 의 예제이다.

package usage.examples;

import org.bson.BsonDocument;
import org.bson.BsonInt64;
import org.bson.Document;

import com.mongodb.ConnectionString;
import com.mongodb.MongoClientSettings;
import com.mongodb.MongoException;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoDatabase;


public class RunCommand {
    public static void main(String[] args) {
        // Replace the uri string with your MongoDB deployment's connection string
        String uri = "<connection string uri>";

        try (MongoClient mongoClient = MongoClients.create(uri)) {

            MongoDatabase database = mongoClient.getDatabase("sample_mflix");

            try {
                Bson command = new BsonDocument("dbStats", new BsonInt64(1));
                Document commandResult = database.runCommand(command);
                System.out.println("dbStats: " + commandResult.toJson());
            } catch (MongoException me) {
                System.err.println("An error occurred: " + me);
            }
        }
    }
}

Reference

  1. Run a Command — Java
  2. MongoDatabase (driver-sync 4.3.1-SNAPSHOT API)