GTK3, text-input-v3 설정에서 동작.
2024년 12월 19일 목요일
2023년 11월 8일 수요일
wayland 환경에서 크롬 브라우저 설정
개인적으로 fractional scaling 때문에 wayland 가 필요하다. 특히나 두 모니터의 스케일이 다른 fractional scaling 에 필요하다.
fractional scaling 을 그냥 적용하고, 두 모니터의 스케일을 다르게 잡으면 크롬 브라우저의 글씨가 흐리게 나온다.
수정하기 위해서는 chrome://flags 에서 'Preferred Ozone platform' 항목을 wayland 를 지정할 수 있도록 바꿔야 한다. Auto, Wayland 등이 그것이다. 그러나 문제는 여전히 하나 또는 두 가지 남는다.
- 한글을 사용할 수 없다.
- fractional scaling 을 사용하지 않고 배율을 200%로 설정했다면, 여전히 글씨가 흐리게 나온다.
ibus 를 사용할 수 없는 문제는 2023년에 해결되었다. google-chrome, google-chrome-stable 을 다음과 같은 환경변수 및 옵션과 함께 실행하는 것으로 해결할 수 있다.
GTK_IM_MODULE=ibus google-chrome-stable --gtk-version=4
그리고 크롬 브라우저를 재실행하면 한글 입력이 가능하다. Fractional scaling 을 사용하지 않을 생각이라 여전히 화면이 흐리다면 --disable-features=WaylandFractionalScaleV1 설정을 추가한다. google-chrome-stable 을 실행한다면 다음과 같은 형태가 될 것이다.
GTK_IM_MODULE=ibus google-chrome-stable --gtk-version=4 --disable-features=WaylandFractionalScaleV1
.desktop 파일의 Exec 항목에 환경변수를 포함하기 위해서는 env 명령이 필요하다. 다음과 같은 형태가 된다.
Exec=env GTK_IM_MODULE=ibus /usr/bin/google-chrome-stable --gtk-version=4 --disable-features=WaylandFractionalScaleV1
2023년 8월 29일 화요일
우분투 20.04 에서 터미널버전 이맥스 빌드 스크립트
sudo apt install -y autoconf make clang texinfo libgnutls28-dev \pkgconf libjansson-dev libgccjit-9-dev zlib1g-dev gcc libxml2-dev libsqlite3-dev \libtree-sitter-dev libgccjit-11-dev
./autogen.sh && ./configure --with-native-compilation && time make -j8
2021년 9월 29일 수요일
Fedora 에서 이맥스 빌드시 필요한 패키지들
sudo dnf groupinstall -y "C Development Tools and Libraries"
sudo dnf install -y texinfo gtk3-devel libXpm-devel libjpeg-turbo-devel giflib-devel gnutls-devel ncurses-devel libcanberra-gtk3 PackageKit-gtk3-module
2020년 11월 3일 화요일
패키지 설치용 elisp 스크립트
; list the packages you want
(setq package-list '(cyberpunk-theme flycheck yasnippet magit go-mode
hl-todo lsp-mode lsp-ui company))
; list the repositories containing them
(setq package-archives '(("elpa" . "http://tromey.com/elpa/")
("gnu" . "http://elpa.gnu.org/packages/")
("melpa" . "https://melpa.org/packages/")))
; activate all the packages (in particular autoloads)
(package-initialize)
; fetch the list of packages available
(unless package-archive-contents
(package-refresh-contents))
; install the missing packages
(dolist (package package-list)
(unless (package-installed-p package)
(package-install package)))
이걸 *scratch* 에 붙이고 M-x eval-buffer 로 마무리.
2020년 10월 6일 화요일
Cent OS 8 도커 사용하기 전 firewalld 설정.
firewalld 백엔드가 Cent OS 8 에서는 nftables 이고 이것이 도커와 충돌. iptables 로 수정하자.
2020년 6월 15일 월요일
ssh를 통한 X forwarding
- mesa-libGL - 없으면 크래쉬
- mesa-libGLw - 없으면 swrast 에러
- xorg-x11-xauth
- .bashrc 에 `export DISPLAY=localhost:0.0` 추가
- `xauth generate $DISPLAY .` 실행.
2020년 5월 26일 화요일
선호하는 이맥스 설정들
(setq default-input-method "korean-hangul3")
(column-number-mode t)
(show-paren-mode t) (setq read-process-output-max (* 16 1024 1024))
(setq gc-cons-threshold most-positive-fixnum)
2020년 4월 17일 금요일
emacs dart-mode 설정 구문
(defun isr-dart-mode-hook ()
(dart-server)
(lsp)
(local-set-key (kbd "M-*") 'pop-tag-mark))
(add-hook 'dart-mode-hook 'isr-dart-mode-hook)
2020년 3월 26일 목요일
gopls 이후의 emacs 설정
(defun isr-go-mode-hook ()
(lsp-deferred)
(setq lsp-idle-delay 0.500)
(add-hook 'before-save-hook #'lsp-format-buffer t t)
(add-hook 'before-save-hook #'lsp-organize-imports t t)
(local-set-key (kbd "M-*") 'pop-tag-mark)
(require 'yasnippet)
(yas-minor-mode)
(hl-todo-mode))
(add-hook 'go-mode-hook 'isr-go-mode-hook)
2019년 10월 9일 수요일
ssh 로컬 터널링 메모
- port - 로컬에서의 포트
- host - 이 터널링을 이용할 때 호스트가 접속할 주소
- hostport - 이 터널링을 이용할 때 호스트가 접속할 포트
2019년 4월 23일 화요일
emacs Go언어 세팅
- 기본적인 신택스 하일라이팅
- 코드 포매팅 (저장시에 gofmt 실행)
- Go to definition 점프
- 실시간 linting
- 자동완성
- 심볼 하일라이팅
go-mode 신택스 하일라이팅 + 코드 포매팅
(require 'package)
(add-to-list 'package-archives
'("melpa" . "https://melpa.org/packages/"))
go-mode를 설치합니다. 설치한 후 저장시에 자동으로 gofmt가 설정되도록 go-mode-hook에 다음과 같은 내용을 포함되도록 합니다.
(defun isr-go-mode-hook ()
...
;; Call Gofmt before saving
(add-hook 'before-save-hook 'gofmt-before-save)
...
(add-hook 'go-mode-hook 'isr-go-mode-hook)
문서 마지막에 isr-go-mode-hook 전체가 드러나는 예제가 있습니다. 여기서 조각조각 COPY&PASTE 하느라 고생할 필요는 없습니다.
Go to definition 점프, 심볼 하일라이팅, rename
go get -u golang.org/x/tools/cmd/...
emacs에서 go-guru, go-rename 패키지를 설치합니다. 다음의 단축기 설정을 .emacs 파일에 추가합니다. Alt+'.'로 이동, Alt+Shift+*로 되돌아오기입니다. 문서 마지막에 .emacs 파일 전체를 실을 것이므로 여기까지 읽고 따라할 필요는 없습니다.
(defun isr-go-mode-hook ()
...
;; Godef jump key binding
(local-set-key (kbd "M-.") 'go-guru-definition)
(local-set-key (kbd "M-*") 'pop-tag-mark))
;; highlight identifiers
(go-guru-hl-identifier-mode))
...
(add-hook 'go-mode-hook 'isr-go-mode-hook)
flycheck (실시간 문법 체크)
golangci-lint 를 설치합니다.
go get -u github.com/golangci/golangci-lint/cmd/golangci-lint
(defun isr-go-mode-hook ()
...
;; flycheck
(flycheck-mode)
...
(add-hook 'go-mode-hook 'isr-go-mode-hook)
compnay-go (자동완성 기능)
백엔드로 gocode를 사용하므로 설치합니다.
go get -u github.com/nsf/gocode
이맥스에서 package-install로 company-go 플러그인을 설치합니다. .emacs에 추가합니다.
(defun isr-go-mode-hook ()
...
(require 'company)
(require 'company-go)
(set (make-local-variable 'company-backends) '(company-go))
(company-mode)
...
(add-hook 'go-mode-hook 'isr-go-mode-hook)
전체 .emacs 파일을 모으면 다음과 같습니다.
(require 'package)
(add-to-list 'package-archives
'("melpa" . "https://www.melpa.org/packages/"))
(defun isr-go-mode-hook ()
;; flycheck
(flycheck-mode)
;; Call Gofmt before saving
(add-hook 'before-save-hook 'gofmt-before-save)
;; Godef jump key binding
(local-set-key (kbd "M-.") 'go-guru-definition)
(local-set-key (kbd "M-*") 'pop-tag-mark)
;; company-go
(require 'company)
(require 'company-go)
(set (make-local-variable 'company-backends) '(company-go))
(company-mode)
;; highlight identifiers
(go-guru-hl-identifier-mode))
(add-hook 'go-mode-hook 'isr-go-mode-hook)
2019년 1월 17일 목요일
DART 언어 googleapis_auth 예제를 통해서 배운 것.
import "package:googleapis_auth/auth_browser.dart";
...
var id = new ClientId("....apps.googleusercontent.com", null);
var scopes = [...];
// Initialize the browser oauth2 flow functionality.
createImplicitBrowserFlow(id, scopes).then((BrowserOAuth2Flow flow) {
flow.obtainAccessCredentialsViaUserConsent()
.then((AccessCredentials credentials) {
// Credentials are available in [credentials].
...
flow.close();
});
});
또는
import "package:googleapis_auth/auth_browser.dart";
...
var id = new ClientId("....apps.googleusercontent.com", null);
var scopes = [...];
// Initialize the browser oauth2 flow functionality.
createImplicitBrowserFlow(id, scopes).then((BrowserOAuth2Flow flow) {
flow.clientViaUserConsent().then((AuthClient client) {
// Authenticated and auto refreshing client is available in [client].
...
client.close();
flow.close();
});
});
그러면서
obtainAccessCredentialsViaUserConsent, clientViaUserConsent 를 호출할 때는 브라우저의 팝업 방지기능에 걸리지 않도록 event handler에서만 호출할 것을 권하는데, 나는 아래와 같은 코드로 왜 팝업 방지기능에 걸리는지 한참을 헤맸었다.
<material-button (trigger)="onClick">Click me</material-button>
void onClick() {
createImplicitBrowserFlow(id, scopes).then((BrowserOAuth2Flow flow) {
flow.clientViaUserConsent().then((AuthClient client) {
// Authenticated and auto refreshing client is available in [client].
...
client.close();
flow.close();
});
});
}
분명히 onClick 함수 내부에서
clientViaUserConsent 이 호출되는데 무엇이 문제인가? 꽤 오래 고민하다가 stackoverflow에 나와 같은데서 헤매던 사람의 질문에 대한 답을 보고 겨우 깨달았는데, 중간에 .then 문법이 끼어있다는 점이었다. async 메소드가 호출되었으니 then 이하 구절이 onClick과 같은 시점에 호출된다는 보장이 없었던 것.굳이 적는 이유는 이것이 만약에 async 메소드가 아니라 콜백구조였으면 아마 헤매지 않고 event handler에서 호출되지 않았다는 사실을 알았을 것이라는 점 때문이다. 내가 익숙한 방식이 낡아갈 때가 있고, 이 사건은 그걸 보여주는 것이었기 때문. 돌아가는 코드는 다음과 같은 방식이다.
BrowserOAuth2Flow browserOAuth2Flow = null;
// angulardart 컴퍼넌트의 lifecycle에 따라 호출되는 메소드.
@override
void ngOnInit() {
// Initialize the browser oauth2 flow functionality.
createImplicitBrowserFlow(id, scopes).then((BrowserOAuth2Flow flow) {
browserOAuth2Flow = flow;
});
}
void onClick() {
if (browserOAuth2Flow == null) {
return;
}
browserOAuth2Flow
.obtainAccessCredentialsViaUserConsent()
.then((AccessCredentials credentials) {
// Credentials are available in [credentials].
browserOAuth2Flow.close();
browserOAuth2Flow = null;
});
}
2018년 7월 13일 금요일
2018년 7월 13일자 devstack Quick Start 문서의 문제점.
2018년 6월 19일 화요일
대수적 자료형 - Algebraic Data Type
저의 근본없는 러프한 지식으로 말하자면 ADT는 결국 product type 과 sum type 을 제공한다는 의미입니다. 그런데 product type은 모던한 언어든 아니든 실용적으로 사용되는 언어는 결국 다 제공하는 셈이라서, 어떤 언어가 ADT를 제공하는가라는 문제는 사실상 어떤 언어가 sum type을 제공하는가라는 문제와 거의 같은 문제가 됩니다.
product type은 결국 (타입이 정해진) tuple이나 record 타입입니다. 이들이 cartesian product와 유사하다는 의미에서 product type 이라는 명칭을 가지고 있습니다. 어떤 키와 타입이 대응되는 합성된 타입이죠. 다음의 예를 봅시다.
- (int, string, double)
- {age:int, name:string, weight:double}
C/C++/C#의 struct, C++/JAVA/C#의 클래스 등등 딱히 모던하다는 평을 받지 않는 언어로 프로그래밍을 할 때에도 product type을 활용하는 것은 어렵지 않습니다.
let tree = Node(5, Node(1, Leaf, Leaf), Node(3, Leaf, Node(4, Leaf, Leaf)))
자바에서 노드가 트리가 되는 과정은 타입 자체에 나타나지 않습니다. 따로 자료구조를 공부하거나, 아니면 예제코드를 보면서 이해해야 합니다. 그런데 그 예제코드는 어떤 형태일까요?
위의 F# 코드는 declarative합니다. 타입 선언이니까요. 그리고 recursive한 타입이죠. 위의 재귀적 타입을 expand 하는 것은 훈련되지 않았을 때 쉽기만 한 일은 아닙니다만, 그 문턱을 넘을 수 있다면 타입 자체에 자료형이 이미 설명되어 있습니다.
그러나 자바 코드라면 operation일 겁니다. right와 left에 null이나 아니면 다른 노드를 assign하는 '동작'이 들어갑니다. 그 과정을 머리로 굴리면서 이해해야 하는 것이죠.
BNF로 정의된 문법의 파서를 만드는 경우라면 어떨까요? sum type은 abstract syntax를 만드는 데 큰 도움이 된다고 합니다. BNF의 | 기호를 처리하기에 sum type만한 것이 있을 것 같지는 않군요. 아래는 하스켈 코드라고 합니다.
data Expression = Number Int
| Add Expression Expression
| Minus Expression Expression
| Mult Expression Expression
| Divide Expression Expression
모든 경우의 수를 처리했는지 여부를 컴파일러가 도와주므로, AST를 처리하는 과정 역시 비지터 패턴 코드보다 훨씬 즐거울 겁니다.
2018년 5월 4일 금요일
Google IO 2018에서 몇 가지 키워드별 행사 개수
| 클라우드 | 33 |
| Flutter | 11 |
| 머신러닝 | 26 |
| 안드로이드&플레이 | 50개 이상 |
2018년 4월 27일 금요일
Flutter는 커다란 한 수
Flutter는 다트로 한 번 프로그래밍해서 Android와 iOS용 앱을 모두 빌드할 수 있는 프레임웍입니다. 웹앱과 두 가지 모바일 앱을 언어 하나로 모두 개발할 수 있다는 점이 큰 장점으로 다가왔지만, 결국 당장 필요한 웹앱개발의 여건에 TS가 너무나 압도적이라는 판단을 내렸습니다.
Flutter는 리눅스 환경에서는 데스크탑 앱으로도 빌드할 수 있으며 Fuchsia도 Flutter로 UX 작업을 한다고 하니, 구글이 바라보는 Dart는 모든 환경의 클라이언트를 작성하는 언어일 수도 있겠다 싶습니다. 그 목적이 이미 달성되었다면 Dart도 꽤나 매력적인 언어였을 수 있겠다 싶습니다.
문제는 아직 그 때가 아니라는 점이죠 :-/
2018년 4월 24일 화요일
개인 프로젝트를 하지 못하는 이유
내가 쓰려면 결국 웹, 데탑앱 또는 모바일인데 나는 데탑을 주로 리눅스를 쓰므로 저기서 데탑은 리눅스 환경.
또 한 가지는, 개인프로젝트는 돈 받고 하는 것이 아니므로 열받는 것이 없어야 함. 열받는 것이 없음이라 함은 아래의 조건 중에 걸리는 것이 없거나 적어야 한다는 의미.
- 언어 자체가 괜찮을 것
- IDE 나 언어의 툴이 왠만큼 갖추어져 있을 것
- IDE 와 코드의 정적분석툴이 잘 갖추어지려면 결국 정적타입 언어일 수밖에 없음
- 문서를 포함한 프레임웍이 갖추어져 있을 것
- vala - 언어는 나쁘지 않은데 IDE 가 없음
- C - 2018년에 응용앱 짜는 데 C... 논할 가치가 없음
- C++ - 언어 자체를 싫어함. 스펙 두꺼운 언어를 제일 싫어함
- JavaScript - 정적타입이 아니고.. JavaScript horrible language 가 자동완성으로 뜸
- Dart - 진짜 다른 점 다 괜찮은데 망한 언어
- Go - 언어는 괜찮은데 GUI 프레임웍이 없음
DART 언어
그러나 무슨 짓을 해도 떠오르지 않는 인기가 문제인데..
일단 개인프로젝트에 써보려는 중.
2018년 4월 11일 수요일
GCC와 Clang의 RAII
void clean_up(int *final_value)
{
printf("Cleaning up\n");
printf("Final value: %d\n",*final_value);
}
int main(int argc, char **argv)
{
/* declare cleanup attribute along with initiliazation
Without the cleanup attribute, this is equivalent
to:
int avar = 1;
*/
int avar __attribute__ ((__cleanup__(clean_up))) = 1;
avar = 5;
return 0;
}
다음에는 간단한 ref count 시스템을 만들어봐야겠군요 :-)