[컴][웹] 파이어 폭스 add-on 이 갑자기 사라졌다면

파폭 / 모질라 / 파이어 폭스 난리 / 플러그인 / 애드온 / 동작 안하는 이유 / 갑자기 동작을 안하는 이유 / 수정 방법 /


update, 2019-05-06

수정버전이 나왔다.


Firefox Add-on 대란

원인

2019년 5월 5일 쯤 인듯 하다. Mozilla 가 Firefox add-on들을 sign 할 때 사용하는 "보안 인증서(certificate)" 가 만료(expired) 됐다. 그래서 그 certificate 을 사용해서 sign 된 모든 add-on 들이 모두 disable 가 됐다.

해결책

아래 링크에서 현재 임시로 배포되는 해결책을 설치하면 된다. ref. 1 의 댓글에서 알려준 이야기다. 실제로 잘 된다. 처음에 들어가면 block됐다고 뜨지만 그 페이지에서 다시 refresh 를 하면 download 가 실행된다.
모질라 blog 에서는 Firefox study 를 이용해서 설치하라고 이야기 하지만 설치되는 시점도 몇시간 후에나 된다고 한다.

reddit 에서도 알려주는 방법중 하나는 about:config 에서 xpinstall.signatures.required option 을 다시 true 로 돌려주면 된다.

Refrences

  1. Update Regarding Add-ons in Firefox | Mozilla Add-ons Blog
  2. Here's what's going on with your Add-ons being disabled, and how to work around the issue until its fixed. : firefox

[컴][MacOS] Homebrew - package manager

홈브루 / 맥os / 맥북 / 자동 설치 / 패키지 매니저  / 간편 설치 / simple install / package manager

Homebrew

Homebrew 는 MacOS 에서 사용할 수 있는 windows 의 chocolatey 처럼 또는 linux 의 apt-get 등 처럼 package manager 이다.
위의 link 에서 간단한 사용법을 확인할 수 있다.
대체로 개발관련 package 설치에 많이 이용하지만, 일반적인 app 을 설치할 때도 App Store 를 사용하지 않고, homebrew 를 사용해서 설치할 수 있다. 아래처럼 명령어를 입력하면 firefox 를 설치할 수 있다.((Homebrew Cask))
$ brew cask install firefox

설치된 package 정보

설치된 app 들이나 package 들의 정보를 알고 싶을 때가 있다. 그리고 list 를 뽑아야 나중에 재설치도 쉽다.
# 모든 설치된 package 를 알려준다.[ref. 1]
$ brew list 
...
# Caskroom 을 이용해서 설치된 package 만 알려준다.
$ brew cask list
...
# dependency 로 깔린 정보들을 제외한 가장 상위 level 의 package 정보만 알려준다.
$ brew leaves

update

brew cask 로 설치된 package 는 app store 를 통한 자동 update 가 되지 않는다. 그러므로 필요한 경우에 아래처럼 udpate 를 해주면 된다.
version 정보가 없거나, app 이 자체적으로 upgrade 를 하는 경우에는 brew cask 로 update 가 되지 않는다. 이 경우에 재설치를 통해서 update 를 해주면 된다. 이것을 해주는 option 이 brew cask upgrade --greedy 이다.
$ brew cask upgrade
...
$ brew cask upgrade --greedy

list 를 재설치

아래와 같은 방법을 이용하면 된다.(참고)
$ xargs brew install < list.txt
...
$ brew install $(< list.txt )

package 의 dependency tree 확인

아래 명령어로 package 들의 dependency 를 확인할 수 있다. 보기좋게 트리모양으로 나온다. 자세한 것은 ref. 1 을 확인하자.
$ brew deps --tree --installed

References

  1. List of all packages installed using Homebrew - Ask Different

[컴][웹][js] v8 Scanner



from: https://v8.dev/blog/scanner

v8 Scanner

v8 이 소스를 파싱해서 AST 로 만든다.abstract syntax tree (AST)
이걸로 프로그램 구조를 표현한다.

v8은 complile 해야 프로그램을 실행할 수 있다.
v8 parser 은 scanner 에서 만들어놓은 token 을 소모한다.

이때 scanner 가 사용하는 character stream의 encoding 은 utf16만 지원한다.
scanner 에 input 으로 제공하기 전에 이전에 모든 encoding 을 utf16으로 convert 하는 과정을 거친다.

scanner는 이 utf16을 decode 해서 unicode 로 만들어서 사용한다.
이 decoded character 들을 이제 가져다 scanner 가 token 을 만든다.



Whitespace

2개의 token 사이에 whitespace 가 있으면 거기에 ;(semicolon)을 넣는다.(ECMAScript® 2020 Language Specification > Auto semicolon insertion)

다음 token 을 scan 하기 전까지 모든 whitespace는 skip 된다.(newline 이 발생하는지 추적하면서)

real world 에서는 대체로 js 들이 minified 돼서 여러개의 whitespace 가 연속해서 나타나는 경우가 드물다.

그래서 V8 은 whitespace 도 하나의 token 으로 취급한다. (Token::WHITESPACE) 그래서 '//' 같이 comment 가 오는 경우에도 Token::WHITESPACE 를 return 해 버린다.  그러면 paring 하는 loop 에서 다른 Token이 나올때 까지 계속 scan 을 이어나갈 수 있게 된다.

(역주: 다시 말하면, // 가 나와서 이것을 다른 token 으로 정의(Token::COMMENT) 등으로 정의해서 사용하게 되면, loop 을 한번 벗어난 후에 다시 parsing 을 시작해야 하지만, 이것을 whitespace 와 같은 속성으로 취급해 버리면, 이 overhead 를 없앨 수 있게 되는 것이다.)



V8_INLINE Token::Value Scanner::ScanSingleToken() {
  Token::Value token;
  do {
    next().location.beg_pos = source_pos();

    if (V8_LIKELY(static_cast<unsigned>(c0_) <= kMaxAscii)) {
      token = one_char_tokens[c0_];

      switch (token) {
        ...
        
        case Token::DIV:
          // /  // /* /=
          Advance();
          if (c0_ == '/') {
            uc32 c = Peek();
            if (c == '#' || c == '@') {
              Advance();
              Advance();
              token = SkipSourceURLComment();
              continue;
            }
            token = SkipSingleLineComment();
            continue;
          }
          if (c0_ == '*') {
            token = SkipMultiLineComment();
            continue;
          }
          if (c0_ == '=') return Select(Token::ASSIGN_DIV);
          return Token::DIV;
          
        ...

        case Token::WHITESPACE:
          token = SkipWhiteSpace();
          continue;

        case Token::NUMBER:
          return ScanNumber(false);

        case Token::IDENTIFIER:
          return ScanIdentifierOrKeyword();

        default:
          UNREACHABLE();
      }
    }

    if (IsIdentifierStart(c0_) ||
        (CombineSurrogatePair() && IsIdentifierStart(c0_))) {
      return ScanIdentifierOrKeyword();
    }
    if (c0_ == kEndOfInput) {
      return source_->has_parser_error() ? Token::ILLEGAL : Token::EOS;
    }
    token = SkipWhiteSpace();

    // Continue scanning for tokens as long as we're just skipping whitespace.
  } while (token == Token::WHITESPACE);

  return token;
}




Identifier scanning
Internalizing minified identifiers
Keywords
Surrogate pairs
AdvanceUntil


See Also


  1. V8 관련 글들



[컴] 맥의 원격데스크톱에서 한영키 사용하기

원격접속 / 한영키 대체 / 윈도우에서 caps lock 으로 한영키 / in Mac / 맥북

맥의 원격데스크톱에서 한영키 사용하기

한영키 변경

"맥 + 윈도우키보드" 조합을 사용하면서, Remote Desktop App(원격데스크톱) 을 이용해서 windows 10 을 접속할 때, '한/영' 키가 제대로 동작하지 않는다.

그래서 '한/영' 키를 Mac 에서 처럼 CapsLock 으로 대체하는 방법을 사용했다.

이를 위해서 AutoHotKey 를 이용했다. registry 변경등 다른 설정 방법들을 찾아봤지만, 지금으로서는 이방법이 가장 효과적이다.
; key.ahk
; {vk19sc1F1} : 한자키
; shift+space --> {vk15sc138} : 한영키
+space::Send, {vk15sc138}
return

; shift+capslock 으로 CapsLock 을
; caps-lock key 를 "한/영" 키로
+CapsLock::CapsLock
CapsLock::vk15
return



See Also


[컴] edge chromium 의 장점

edge / edg / 크로미엄


작성중...

Edge 의 장점

  • 크롬의 구글 연동 기능이 삭제 : 프라이버시(privacy) 관련하여 구글연동 기능이 제거된 것은 환영할 만 하다.
  • ref 2 에서 크롬이 secret mode 에서도 정보를 빼간다고 했으니, ms 의 edge 가 상대적으로 정보를 덜 빼갈 수도 있다.(물론 MS 에서 더 많은 정보를 빼가려고 할 수는 있다.)


References

  1. MS, '크로미움' 엣지 첫 공개··· "구글 연동 기능 50여 개 삭제" - CIO Korea, 2019-04-12
  2. 구글 집단소송 당해…"크롬 시크릿 모드때도 정보 뻬갔다" - 지디넷코리아, 2020-06-04

[컴][리눅스] cron

크론 / 크론 명령어 / cron command / crontab / how to use crontab

cron

crontab 편집

crontab -e

각 계정에 해당하는 crontab을 편집할 수 있다. sudo crontab -e 를 하면 root의 crontab을 편집하게 된다.

Timezone 설정

crontab 은 timezone 에 따른 시간으로 움직인다.

sudo timedatectl set-timezone Asia/Seoul  


crontab reload

sudo service cron reload
/etc/init.d/cron reload
sudo systemctl start crond.service

crontab 에서 $ 표시는 escape 가 필요하다

echo $(date '+%F_%T') 는 아래처럼 echo $(date '+\%F_\%T') 로 변경돼야 동작한다.

# echo $(date '+%F_%T')
40 10 * * * echo $(date '+\%F_\%T') > ttt.txt

[컴] Slack 에서 특정 Channel 로 메시지 보내기

슬랙 에서 메시지 전성 / webhook / hook / web hook / 슬랙 메세지 / send a message


Slack 에서 특정 Channel 로 메시지 보내기

  1. app creation pgae : app 이름 지정해서 app 을 만든다.
  2. Activate Incoming Webhooks 선택 > On
  3. slack 에서 메시지를 뿌려줄 channel 을 하나 만든다.
  4. "Add New Webhook to Workspace" 클릭 > 채널 선택 > Authorize
  5. 아래 curl 명령어를 실행하면, Hello, World 가 channel 에 보이게 된다.
  6. 이제 원하는 메시지를 아래 처럼 json format 으로 보내면 된다. content-type 은 application/json 으로 해야 한다.

// linux
curl -X POST -H 'Content-type: application/json' --data '{"text":"Hello, World!"}' YOUR_WEBHOOK_URL_HERE

// windows
curl -X POST -H "Content-type: application/json" --data "{\"text\":\"Hello, World!\"}" YOUR_WEBHOOK_URL_HERE


References

  1. Hello world: sending your first Slack app message | Slack