레이블이 computer인 게시물을 표시합니다. 모든 게시물 표시
레이블이 computer인 게시물을 표시합니다. 모든 게시물 표시

[컴][OS] 리눅스 부팅과정

linux boot process / 리눅스 부팅 절차 / 부팅 순서 / 부팅 되는 법 /


리눅스 boot process

  • 리눅스 커널 이미지 (Linux kernel image) 는 압축된 file 이다. 그래서 이것은 memory 로 load 된 이후에 압축을 풀게 된다.
  • boot process 동안에, boot loader 는 일반적으로 initramfs 라 불리는 임시 RAM file system 을 만든다.
  • 이 파일시스템에는 "실제 root file system"(이것은 main memory 에 없다.) 을 지원하기 위해 설치되어야만 하는 드라이버들커널모듈들을 포함하고 있다.
  • 커널이 시작되고, 필요한 드라이버들이 설치되자마자, 커널은 root file system 의 위치를 임시 RAM 에서 적절한 root file system 위치로 옮긴다.
  • 마지막으로 리눅스는 systemd process 를 생성한다. systemd process 가 system 에서 최초의 process 이다.
  • 그리고 나서 다른 서비스들을 시작한다.(웹서버, db 같은..)
  • 최종적으로 system 은 login prompt 를 보여준다.

Android

  • linux 에서 일반적으로 쓰이는 boot loader 인 GRUB 대신에 boot loadervendors 가 알아서 제작한다.
  • 가장 일반적인 안드로이드 boot loader 는 LK(little kernel) 이다.
  • 안드로이드에서도 압축된 kernel image 를 이용하고, initramfs 를 이용한다.
  • 안드로이드는 initramfs 를 device 의 root file system 으로 이용한다. 하지만, Linux 에서는 모든 필요한 driver 들이 loaded 되고 나서 initramfs 를 버린다.
  • kernel 이 load 되고, root file system 이 mounted 되면,
  • Android 는 init process 를 시작하고, 여러개의 service 들을 실행한다.

대부분의 boot loader 들은 recovery mode, 또는 single-user mode 등으로 booting 을 제공해준다.(windows 안전모드 같은)

See Also

  1. [컴][폰] 안드로이드 부팅과정
  2. [컴] BIOS 동작

Reference

  1. Operating System Concepts 10th edition


[컴][웹] reactjs 에서 dynamic 하게 component 를 load 하는 법

코드 분할 / dynamic loading / react component loading

code splitting 방법들

자세한 내용은 React 문서 "Code-Splitting – React" 를 참고하자.
여기 내용은 client-side rendering 을 위한 것이다.

import()

기본적으로 webpack 을 사용하면, import 를 할 때 dynamic import() 를 사용할 수 있다.

import {add} from './math';
console.log(add(10,10 ));
위의 statment 를 아래처럼 수정해서 사용할 수 있다.
import("./math").then(math => {
    console.log(math.add(10, 10))
});

React.lazy

v16.6 부터 지원한다 : React v16.6.0: lazy, memo and contextType – React Blog

현재 default export 에 대한 지원만 한다. 그래서 만약 named export 를 사용해야 하는 상황이면, 새로운 component 를 하나 만들고, 그 안에서 다시 default export 를 해서 default export 로 만들어서 사용하면 된다.(참고)

이 방법을 사용하면, webpack 에서 chunk 를 나눠준다.

import MyErrorBoundary from './MyErrorBoundary';
const OtherComponent = React.lazy(() => import('./OtherComponent'));
const AnotherComponent = React.lazy(() => import('./AnotherComponent'));

const MyComponent = () => (
  <div>
    <MyErrorBoundary>
      <Suspense fallback={<div>Loading...</div>}>
        <section>
          <OtherComponent />
          <AnotherComponent />
        </section>
      </Suspense>
    </MyErrorBoundary>
  </div>
);

Route-based code splitting

route 를 기준으로 code splitting 을 할 때는 아래처럼 사용하면 된다.
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
import React, { Suspense, lazy } from 'react';

const Home = lazy(() => import('./routes/Home'));
const About = lazy(() => import('./routes/About'));

const App = () => (
  <Router>
    <Suspense fallback={<div>Loading...</div>}>
      <Switch>
        <Route exact path="/" component={Home}/>
        <Route path="/about" component={About}/>
      </Switch>
    </Suspense>
  </Router>
);

See Also

References

  1. Code-Splitting – React

[컴] telegram instant view 만들기

텔레그램, 인스턴트 뷰 만들기 / instant view editor / xpath / 즉시 보기 / 즉시보기 / ivh telegram / instant view


telegram instant view 만들기

참고로 instant view(즉시보기) 는 desktop 에서는 보이지 않는다.

instant view(IV) 를 만드는 것은 IV bot 에게 source page 의 어떤 부분을 가져다가 page 를 만들지를 알려주는 과정이다.
  • My Templates(https://instantview.telegram.org/my) 로 간다.
  • Instant view(IV) 를 만들고 싶은 page 링크를 넣는다.
  • instant view 를 만든다.
    • Instant view format: https://instantview.telegram.org/docs#instant-view-format
      • 여기에 있는 property 를 채우면 알아서 만들어진다. title, body 만 잘 채워지면 preview 에 instant view 가 보이기 시작한다.
    • 주의할 점
      • IV editor 에 보이는 view 를 가지고 작업을 하자. 그렇지 않으면 tag tree 가 좀 다를 수 있다. 예를 들면, mobile, desktop view 가 다른경우.








rules 예


~version: "2.1"

title: //header//span[@class='article__headline']
subtitle: //header//span[@class='article__subheadline']

body: //article/div[has-class("layout-article-body")]
@remove: //article//aside

# @debug: $body

instant view 에서 function 을 지원하는데, 아래처럼 사용할 수 있다.
@function: xpath_query

그러면 function 의 결과는 $@ 에 저장되고, $$ 에는 최근에 실행한 xpath_query 의 결과가 저장된다.

$가 변수를 나타낸다고 보면 된다. assign 방법은 아래 예제를 확인하자.

# Put a picture into a <figure> tag, then set it as the cover
@wrap(<figure>): //img[@id="cover"]
cover:           $@

# Insert a divider before each div.divider that's no longer required
@before(<hr>):   //div[has-class("divider")]
@remove          # this is the same as @remove: $$

# 위에서 set 한 변수 cover 를 아래처럼 사용할 수 있다. 다만, 결과가 list 인 경우 가장 첫 항목만 저장된다.
@after_el("./../../img"): $cover//p

template 제출(Instant View > Publishing templates)

아래처럼 template 에 대해서 10개이상의 url 을 통해서 검증을 하면 아래처럼 submit 을 할 수 있다.

다른 사람에게 적용은 telegram team 의 승인이 필요하다 한다.

하지만 특정 url 을 전송보내서 자신이 만든 template 을 통해 보도록 하는 것은 t.me/iv?url=...&rhash=... 로 가능하다.
ex: https://t.me/iv?url=https%3A%2F%2Fwww.economist.com%2Fbusiness%2F2020%2F02%2F29%2Fhow-asml-became-chipmakings-biggest-monopoly&rhash=05c6986cda93a5






rhash 얻기

아래처럼 view in telegram 을 선택한다. 그러면 주소가 나오는데, 거기에 rhash 가 있다.




template 변경

자신이 만든 template 이 변경되면, 아래처럼, 현재까지 확인했던 다른 template 도 확인 작업을 해야만 한다.

[컴] windows cmd 에서 alias 설정

alias 설정 / 단축키 설정 / .bashrc 설정 / 자동으로 설정 / bash function /


windows cmd 에서 alias 설정

regedit 를 이용해서 아래 처럼 설정하면 된다.

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Command Processor]
"AutoRun"="%USERPROFILE%\\alias.cmd"


위 같이 설정하면, cmd 를 실행할 때마다. %USERPROFILE%\\alias.cmd 를 한번 실행해 주게 된다.

그리고 나서 %UserProfile% 에 alias.cmd 를 아래처럼 작성하면 된다.
@echo off

DOSKEY ls=dir /b
DOSKEY ac=c:\a\envs\$1\Scripts\activate.bat $*
$* : 나머지 모든 parameter


References

  1. alias - Aliases in Windows command prompt - Stack Overflow, 2019-09-30

[컴] V8 관련 글들

크롬엔진 / 크로미엄 엔진 / 노드 엔진 / javascript engine / nodejs engine / j


V8 관련 글들

[컴] 해상도 4K 어원

4k / 8k / uhd / UHD / 모니터 해상도 / TV 해상도 / 4K란? / 4k 가 뭐지? / resoultion

4K 어원

기술적으로 가로 해상도가 4096 pixels 이면 4K 이다.

하지만, 실질적으로 우리가 이야기하는 UHD 는 가로의 해상도가 3840이다.

4K라는 용어는 이것은 Digital Cinema Initiatives 라는 회사가 디지털 시네마 시스템의 표준 구성을 만들었는데, 거기서 사용하던 용어이다. 거기서는 4096x1716 해상도를 이야기 했다.
하지만 이제 모두들 4K 가 UHD 를 뜻한다고 알고 있어서 그냥 그렇게 통용되고 있다.

1080p

주의해야 할 점은 1080p 까지는 세로부분의 해상도를 이야기했다면, 4K가로부분의 해상도를 이야기한다는 것이다. 아래 그림을 참고하자.
출처: https://www.hdmi.org/spec/hdmi2_1

See Also


  1. video - Why is vertical resolution a multiple of 360? - Super User

References

  1. TV resolution confusion: 1080p, 2K, UHD, 4K, 8K, and what they all mean - CNET

[컴] 조직 개편, 정비시 CIO 로서 역할과 관련된 tips


cio /cto / 관리자에게 도움이 되는 글 / 팁들 / 팁 / it 문화를 받아드릴때 주의해야 하는점.

조직 개편, 정비시 CIO 로서 역할과 관련된 tips

조직의 개편에서 놓치면 안되는 것들에 대한 것들이다. 요즘의 회사들이 IT 와 연관성이 많아지면서, 조직의 구조나 문화가 달라지고 있다. 관련돼서 도움이 될만한 이야기이다. 

성공을 위해 필요한 3가지 리더십 자질

출처 : The 2018 State CIO Survey - NASCIO 에서

  1. 소통자(communicator)
  2. 관계 관리자(Relationship manager)
  3. 전략가(Strategist)
  4. 동기부여자(Motivator)
  5. 외교에 능한사람(diplomat)
  6. 변화 관리자(Change Manager)
  7. 협상가(Negotiator)
  8. 조력자(Facilitator)
  9. 기술 전문가(Technologist)
  10. 교육자(Educator)

딜로이트 컨설팅의 CTO 빌 브릭스의 충고

  1. CIO는 애자일 기법 도입과 변화와 관련해 다른 임원과 부서로부터 필요한 것이 무엇인지 파악해야 한다
  2. 새로운 시스템안에서 성과측정을 위한 새로운 지표를 수립하여 측정해야 한다고 조언

카네기 멜론 대학교의 테퍼 경영대학원 비즈니스 기술 조교수 얀 황

  1. 적절한 목표를 수립하기 위해 CIO가 이해관계자에 집중해야 한다
  2.  특정 비즈니스 프로세스를 구조조정하려는 경우라도 CIO는 그 변화가 생태계 전체에 미치는 영향에 대해 생각해 보아야 한다. 프로세스 호환성, 보안공백 등.
  3. 임원들이 당면한 구조조정 요건을 넘어 좀더 장기적인 게임을 해야 한다
    1. CIO는 IT와 비즈니스 니즈가 지속적으로 빠르게 변화하기 때문에 최소한 1-2년 전에 무엇이 효과가 있을지 고려해야 한다
  4. 모두가 새로운 구조에 맞추도록 해야 한다. 따라서 직원에게 기술뿐 아니라 문화 변동에 대해서도 교육하는 프로그램이 필요하다. 그렇지 않으면 가치를 창출할 수 없다
    1. 직원들이 새롭게 구성된 덜 위계적인 구조 내에서 일하는 방식, 이런 환경에서 직원들이 교육하는 방식 등이 충돌을 일으켰다

References


  1. 조직 개편·정비, 'CIO 과제'로 부상 중··· 피해야 할 7가지 실수 - CIO Korea, 2020-01-29

[컴][머신러닝] 파이토치(Pytorch)에 대한 간략한 설명

What if pytorch / pytorch / desc / 파이토치 설명 / 파이토치 차이점. / Machine learning / ML / 머신러닝 / 기계학습

파이토치에 대한 간략한 설명

  • 파이토치는 문턱이 낮다
  • 파이토치는 공식 문서가 잘 만들어져 있다.
  • 자체 운영 포럼이 있다.
  • 연산 그래프 설정에서도 장점
    • 파이토치는 ‘Define by Run’ 방식, 텐서플로우가 ‘Define and Run’ 방식
    • ‘Define and Run’ 프레임워크에서는 연산 그래프를 먼저 정의하고 값을 넣어 결과를 얻는다. ‘Define by Run’ 프레임워크는 연산 그래프가 정의되는 동시에 연산이 이루어진다.(인용)
    • 텐서플로우 2.0의 ‘즉시실행(Eager execution)’ 모드와 비슷하다.

파이토치 tutorial

  1. 영문: Welcome to PyTorch Tutorials — PyTorch Tutorials 1.4.0 documentation
  2. 한글: 파이토치(PyTorch) 튜토리얼에 오신 것을 환영합니다 — PyTorch Tutorials 1.3.1 documentation

See Also

  1. 쿠…sal: [컴][머신러닝] PyTorch 설치

Reference

  1. 블로그ㅣ머신러닝에 관심있다면?··· 이제는 파이토치다 - CIO Korea
  2. 블로그 | 파이토치로 딥러닝해야 하는 5가지 이유 - CIO Korea, 2020-02-27

[컴] callback 함수를 asyn/await 로 변경하기

callback to async/await / how to convert callback function to promise / to async function / callback 을 Promise 로 변경하기

callback 함수를 asyn/await 로 변경하기

callback 을 Promise 로 변경하면 된다.

아래와 같은 callback 을 사용하는 함수가 있다고 하자.

requestTest(param1, param2, 
    function(result){ return 'success'; },
    function(err){ return 'err'; });
await 키워드는 Promise 가 끝날때까지 기다리고, return 을 주게 된다.
그러므로 우리는 Promise 로 만들면 된다. Promise 는 아래와 같은 모습을 갖고 있다.

new Promise(function(resolve, reject){})

우리가 할 일은 callback 부분에서 ‘성공’, ‘실패’ 부분에 Promise 의 resolve, reject 부분만 맞춰서 실행해 주게 만들면 된다.

new Promise(function(resolve, reject){
    ...
    resolve(...);
    ...
    reject(...);
})

그래서 아래처럼 변경해 주면 된다.

resolve(result); 에서 보내는 result 가 await 함수의 return 값이 된다. resovle를 호출하지 않으면 await 으로 호출후 다시 return 돼서 처리되지 못한다. (yield 를 호출하지 않는듯)
const param1, param2;

// ...

const promise = await new Promise(function(resolve, reject){
    requestTest(param1, param2,
        function(result){ 
            resolve(result); // 여기서 보내는 result 가 await 함수의 return 값이 된다.
            return;
        },
        function(err){
            reject(err);
            return; 
        }
    );
})




[컴] Discord 에서 Go 에서 Rust 로 넘어간 이야기

golang



Discord 에서 Go 에서 Rust 로 넘어간 이야기

Discord의 서비스 중에 Read States Service 라는 것이 있는데, 이것을 Go 에서 Rust 로 옮겼다고 함.

Read States 은 message 를 보내고, 읽을때 계속해서 접근하게 된다고 함.

user 의 read state 를 저장하려고, "Read State" 라는 data sturucture 를 가지고 있는데, Discord 가 몇백만개의 Read State 를 갖게 된다. 이 Read State 는 한채널에서, user 당 1개를 갖는다. 그리고 이 Read State 가 여러개의 counter 를 갖고 있다. 예를 들면, 이 채널에서 당신의 @mention 이 얼마나 있는지등에 대한 counter.

이런 counter 의 update 를 빠르게 하기 위해 Read States Server 는 Read State 에 대한 cache 를 갖고 있는데, 이 cache 는 LRU(least recently used, 가장안쓰는 것을 버리는) 방식을 사용한다.
각 cache 에는 몇백만의 users 들이 있고, 몇백만개의 Read States 몇십개가 각 cache 에 있다. 초당 몇백, 몇천의 cache update 가 있다.

그런데, latency and CPU spikes 가 매 2분 마다 있다.

이것이 Go 의 Garbage Collector 때문이었다. 소스로 확인한 결과, Go 가 강제로 최소 매 2분마다 GC 를 돌리도록 하고 있다.

나중에 보니, spike 의 이유는 ready-to-free memory 가 많아서가 아니라, 어떤 메모리를 free 해야 하려고, GC 가 LRU cache 를 scan 하는 과정 때문이었다.

그래서 LRU cache size 를 줄여서 GC 가 scan 하는 시간을 줄였다. 그리고 한 서버에서 LRU cache 를 여러개로 쪼개서(partitioned) 가졌다. 그런데 cache size 가 줄면서, 이것이 database 의 load 로 이어졌다. 그래서 여러번의 load testing 으로 최적의 setting 을 찾아서 설정했다.

하지만, 결과적으로 Rust 로 옮긴 것이 golang 에서 최적의 setting 을 한 것보다 나은 결과를 가져왔다.

...

Reference


  1. Why Discord is switching from Go to Rust - Discord Blog, 2020-02-05



[컴] 네이버 지도 api 사용

naver map api /


네이버 지도 api 사용

  1. Map Api 는 네이버 클라우드 플랫폼(https://www.ncloud.com/product/applicationService/maps) 으로 옮겼다.[ref.2 참고]
  2. 네이버 클라우드 플랫폼 에 가입하자.
  3. 로그인 후 console 로 가서 Application 등록
  4. Application 이름 입력
  5. Service 선택 –> Web Dynamic Map
  6. 서비스 환경 등록 –> Web 서비스 URL 등록(ex: http://localhost)
  7. 인증 정보 클릭 –> client id / client secret 을 얻을 수 있다.

네이버 api 하루 허용량

API 일 허용량
Clova Face Recognition 1,000 회
Clova Speech Recognition 3,600 초
Clova Speech Synthesis 10,000 글자
Papago 번역 10,000 글자
Papago 언어감지 2,000,000 글자
검색 25,000 회
단축 URL 25,000 회
데이터랩 (검색어트렌드) 1,000 회
데이터랩 (쇼핑인사이트) 1,000 회
캡차 (음성) 1,000 회
캡차 (이미지) 1,000 회
한글인명-로마자변환 25,000 글자
지도 월 1000만회 [ref. 3], 무료

References

  1. 네이버 오픈API 종류 - Open API 가이드
  2. 지도 Open API를 NAVER MAPS Enterprise API로 개편합니다. - 공지사항, 2018-10-11
  3. NAVER CLOUD PLATFORM 네이버 클라우드 플랫폼, 2019-11-29
  4. 네이버 Map API 사용 설명서

[컴][javascript] webpack 을 이용해서 compile 시 process.env 사용



webpack 을 이용해서 compile 시 process.env 사용

webpack 을 이용해서 compile 시 React 에서 process.env 등의 값을 이용할 수 있다.

DefinePlugin

webpack.config. 에서 아래처럼 DefinePlugin 을 통해서 React code 에 process.env 를 넣어준다.
그리고 이로인해 만약 if(false) 같은 code 가 생기면, 이것은 unglify 같은 것들을 통해서 배포시 제외시킬 수 있다.
// webpack.config.js

function getClientEnvironment(publicUrl) {
  const raw = Object.keys(process.env)
    .filter(key => REACT_APP.test(key))
    .reduce(
      (env, key) => {
        env[key] = process.env[key];
        return env;
      },
      {
        // Useful for determining whether we’re running in production mode.
        // Most importantly, it switches React into the correct mode.
        NODE_ENV: process.env.NODE_ENV || 'development',
        // Useful for resolving the correct path to static assets in `public`.
        // For example, <img src={process.env.PUBLIC_URL + '/img/logo.png'} />.
        // This should only be used as an escape hatch. Normally you would put
        // images into the `src` and `import` them in code to get their paths.
        PUBLIC_URL: publicUrl,
      }
    );
  // Stringify all values so we can feed into Webpack DefinePlugin
  const stringified = {
    'process.env': Object.keys(raw).reduce((env, key) => {
      env[key] = JSON.stringify(raw[key]);
      return env;
    }, {}),
  };

  return { raw, stringified };
}


const env = getClientEnvironment(publicUrl);

...
module.exports = {
  ...
  plugins: [
    ...
    // Makes some environment variables available to the JS code, for example:
    // if (process.env.NODE_ENV === 'development') { ... }. See `./env.js`.
    new webpack.DefinePlugin(env.stringified),
    ..
  ],
}

References

  1. DefinePlugin fails to inject process.env.NODE_ENV into React without UglifyJSPlugin · Issue #868 · webpack/webpack · GitHub

[컴] 개인정보 보호강화에 따른 광고의 새흐름

데이터 수집 / 광고 고민 / 안드로이드 수집 데이터 제한, / 제한되는 데이터와 앞으로의 광고시장 / privacy / 프라이버시 강화와 앞으로의 마케팅 / 구글 광고 정책 변화 ad policy

개인정보 보호강화에 따른 광고의 새흐름

줄어드는 위치정보 수집

  • Location Sciences 에 따르면, iOS13 이후, 마케터들의 위치정보 수집68% 감소.
    • iOS13 에서 위치정보 수집할 때 popup 을 띄운다.
  • app이 forground 일때 수집된 data 도 24% 감소.
  • 구글, user 들이 자신들이 앱을 사용할때만 위치데이터 를 공유할 수 있는 option 이 있는 경우, 이 옵션을 선택하는 비율은 50% 정도.
    • Android 10 에서 iOS 와 비슷하게, 사용중일때만 데이터 수집 가능하게 할 수 있고,
    • 설치된 app 이 백그라운드에서 위치정보를 수집할 때 user 에게 alert 을 띄운다.
  • Digiday 기사, 광고기술업체 대표 말 인용, app 들이 사용중이 아닐때 위치데이터 를 수집하는 비율은 50% 이하이다.

위치 정보 수집의 제안에 따른 대안

  • 그래서 이제 GPS 위치 데이터 대신에 ip address 를 수집할 듯 하다.
    • 현재로선 android, iOS 전부 ip address 수집을 막지는 않는다.
    • 하지만 vpn 등의 사용을 할 수 있어, ip address 가 항상 정확치는 않다.
  • 다른 대안들
    • contextual clues(문맥적인 단서들)을 이용하는것
      • 예를 들면, 만약 누군가 런던에 앉아서 여행에 대한 글을 본다면, 항공편 관련 광고를 보여주는 것.
      • 이러면 정확한 위치정보가 필요하지 않다.
    • 광고의 타겟팅이 아주 좋지 않기때문에, 다음에 집중해야 한다.
      • 브랜드들은 상품 가치에 더 중점을 둬야 하고,
      • 자신의 데이터를 기꺼이 제공하는 고객직접적인 관계를 맺는 것
    • 광고가 좀 더 똑똑해져야 한다.
      • user 의 기분, 순간, 마음가짐, 감정 에 따라 다른 광고를 보여줘야 한다.

광고 에이전시의 대안

  • 광고 산업이 하는 일은 제품과 구매 욕망을 연결시키는 것. 하지만 개인들이 무엇을 원하는지 또는 어떤 커뮤니티에 속하는지까지 광고 에이전시가 정확히 알 필요는 없다.
  • 광고 에이전시의 대안
    • 이전처럼 하면된다. 이전에도 개개인에 대한 targeting 이 되지 않았다.
    • 그들이 타겟팅하고 싶은 커뮤니티의 사람들이 사용하는 앱과 서비스후원
    • 한 음료 회사가 히트시킨, 맥주를 마시는 느낌을 내주는 간단한 아이폰 앱
    • 이미 광고 회사나 기술 기업은 머신 인텔리전스, 특히 온디바이스 인텔리전스(On-device Intelligence)를 통해 개인 정보에 대한 접근을 제한하면서 광고주가 원하는 것을 더 많이 제공할 수 있다.
    • 연합학습(Federated Learning)
      • 단말기에서 인공지능을 학습시키는 기술
      • iOS 13의 시리에 사용

See Also

References

  1. Apple and Google’s location privacy controls are working, 2020-01-23
  2. 블로그 | 애플이 광고업계에 쏘아올린 작은 공 - CIO Korea, 2019-12-16

[컴] 서버리스 컴퓨팅 하기 전 알아두면 좋은 점

서버리스 컴퓨팅 도입하기전에 확인해야 할 점 / 서버리스 장단점 / serverless computing

서버리스 컴퓨팅 하기 전 알아두면 좋은 점

서버리스 컴퓨팅 serverless computing[ref. 3]

  • 특정 코드 조각을 실행할 때 필요한 컴퓨팅 리소스와 스토리지를 동적으로 할당
  • 그만큼에 대해서만 요금을 부과
  • 서버의 프로비저닝유지보수를 전적으로 제공 업체가 책임.
  • 서비스 제공업체가 해주는 일
    • 하드웨어 프로비저닝
    • 가상 머신 및 컨테이너 관리
    • 애플리케이션 코드에 자주 내장되는 멀티쓰레딩 같은 작업 등

서버리스를 사용하는 것이 유리한 작업

  • 특정 상황에서 동시에 많은 이벤트 요청을 처리해야 하는 애플리케이션
  • IoT 디바이스에서 제한된, 또는 간헐적인 인터넷 연결로 전송되는 데이터를 처리하는 애플리케이션
  • 특정 종류의 배치 프로세싱

서버리스관련 프레임워크

  • "서버리스 프레임워크"(이름이 서버리스)
    • 지원되는 플랫폼:  AWS 람다, 애저 펑션, 구글 클라우드 펑션, IBM 오픈위스크
    • 모든 플랫폼에서 동일한 경험을 제공
  • 에이펙스(Apex)
    • 특정 제공업체에서 원래 사용할 수 없는 몇몇 언어를 활용하는 데 도움

지원되는 언어

  • AWS 람다
    • Node.js
    • 자바
    • 고(Go language)
    • C#
    • 파이썬
  • 애저 함수
    • 자바스크립트
    • C#
    • F#

트리거

  •  AWS 람다
    • 가장 풍부, 그중 상당수는 AWS 플랫폼 전용
  • 구글 클라우드 펑션
    • 일반 HTTP 요청에 의해 트리거될 수 있다. 

테스트 방법

  • AWS SAM(Serverless Application Model)
    • 오프라인으로 람다 코드를 테스트할 수 있는 로컬 기능을 제공
  • 서버리스(Serverless) 애플리케이션 프레임워크
    • 로컬에서 코드 실행이 가능한 서버리스-오프라인(serverless -offline) 플러그인

물론 서버는 여전히 사용되지만 프로비저닝과 유지보수를 전적으로 제공 업체가 책임

원문보기:
http://www.ciokorea.com/news/125655#csidx9f3a9658ad9d50ca1e597a4b956498c

장점

  • 비용
    • 높은 비용 효율성
      • 서버리스 컴퓨팅 아키텍처는 태생적으로 다른 접근 방법에 비해
      • 사용하지 않을 때는 비용도 없다
    • 소비에 대한 비용만 지불
      • 서버리스 기술에서 고객은 용량이 아닌 소비에 비용을 지불
      • 부가적인 인프라와 유지보수 없이 딱 필요한 작업에 대한 비용만 내는 것
      • 서버리스 컴퓨팅이 리소스의 과도한 할당과 관련된 비용을 줄인다.
    • uptime 비용없다 : 사용한 만큼 비용을 내므로 업타임 비용이 없다
  • 애플리케이션이 클라우드 내에 빠르고 값싸게 배포하고 분산이 가능
    • 애플리케이션을 작은 용도별 기능으로 분할
  • IT 워크로드를 경감
    • 직원들이 서버 성능 관리, 안정성, 유지보수, 보안 업무 등에 상시 매달릴 필요가 없다
    • 애플리케이션 업타임을 보장하기 위한 작업을 서버리스 플랫폼에서 해준다.
      • 상태 확인을 구현
      • 기반 OS를 관리
      • 최신 보안 패치를 적용
      • 인프라에 최대 워크로드를 감당하기에 충분한 용량이 프로비저닝되도록 확인하는 일 등
  • 개발자의 부담도 덜어준다.
    • 개발자는 인프라 관련 문제가 아닌 자신이 작성하는 코드의 비즈니스 목표에 집중
    • 코드, 특히 인프라 코드를 덜 쓴다 --> 인프라 프로비저닝은 서버리스 기술에 맡기고 더 많은 개발자를 비즈니스 기능 구축에 투입 --> 개발 속도가 빨라진다. --> 조직은 민첩성과 혁신을 개선할 수 있다.
    • 개발 주기의 속도가 빨라지고, –> 제품화 기간도 개선 –> 조직은 지속적인 개선과 고객 만족에 집중

단점

  • 서버리스로 인해 오히려 워크로드가 늘어나는 경우도 있다.
    • 기능을 만들고 여러 API를 연결해 비즈니스가 요구하는 작업을 수행하는 데 더 많은 일이 필요하다
  • 버그 잡기
    • 표준화된 보안, 테스트, 모니터링, 구성 관리가 없는 경우 서버리스에 버그가 퍼질 수 있다.
    • 각자가 알아서 만들면, 코드가 여러가지가 돼서, 관리가 어려워 지고, 버그가 생기면 일괄적으로 수정하기 어려울 수 있다.
  • 장기간 지속되는 작업에는 적합하지 않다.
    • 계산에 오랜 시간이 걸리는 작업
    • 현재 애저 펑션(Azure Functions)과 AWS 람다(AWS Lambda)는 각각 최대 10분, 15분만 실행이 가능
  • 콜드 스타트(cold start) 역시 서버리스의 단점.
    • 보통 수십 밀리초 정도
    • 대다수 사용 사례에서 무시해도 되는 시간
  • 벤더 종속 : 주요 서버리스 시스템이 상호 호환되지 않는다
    • AWS 람다
    • 애저 펑션
    • 구글 클라우드 펑션
    • IBM 클라우드 펑션(IBM Cloud Functions) : 오픈소스 아파치 오픈위스크 플랫폼을 기반
  • 보안 측면
    • 기본적으로 서버리스는 짧은 실행 시간과 기반 호스트 OS로부터의 격리로 인해 위험이 제한된다
    • 다른 리소스에 대한 액세스 권한을 획득하기 위한 공격에서 중간 단계로 서버리스 함수가 사용될 수도 있다
      • 함수가 너무 많은 권한을 갖거나
      • 취약한 구성요소를 포함
      • 서버리스를 안전하게 구성하고, 이후 이상 현상과 악용을 모니터링해야 한다
  • 자동확장으로 인한 비용
    • 전통적인 서버는 용량이 초과하면 그냥 작동을 멈추므로 부가적인 비용이 발생할 일이 없다. 그러나 서버리스는 상대적으로 제한 없이 확장이 가능하므로 주의하지 않으면 상당한 비용으로 이어질 수 있다
  • 인건비 상승
    • 기술에 초점을 둔 기업에서 경비가 많이 할당되는 분야 중 하나는 개발자 채용
    • 스킬을 갖춘 적격 개발자가 적어 고용하고 보유하려면 많은 비용이 든다

서버리스 도입시 주의점

  • 구현에 앞서 충분한 시간 동안 서버리스 제품에 대해 알아봐야 한다
  • 최소한 롤백 프로세스는 마련해 둬야 한다.
  • 현재 시스템의 성능을 측정해서 계획 중인 서버리스와 비교해 가능한 운영 및 비용 상의 이점을 알아봐야 한다.
  • 서버리스에 반드시 ‘올인’해야 할 필요는 없다. 필요에 따라 적게 사용할 수도, 많이 사용할 수도 있다

서버리스 도입시 여전히 고려해야 할 점

  • 여전히 애플리케이션효율성에 중점을 두어야 한다.
    • 자원이 자동으로 할당된다.(애플리케이션의 요청에 의하거나, 서버리스 판단에 의해)
    • 만약 애플리케이션의 자원 요청이 언제 어떻게 이루어질지를 제대로 설계하지 않으면, 서버리스 시스템은 자원을 과잉 할당할 가능성이 크고, 결국 비용은 커지고 효율은 나빠질 것.
  • 여전히 관리 지점을 구축
    • 애플리케이션 안으로 향하는 API를 설계해야 하고,
    • 모니터링을 위한 외부 관리 툴로의 데이터도 설계해야 한다는 의미
    • 장기적으로 잘 관리하기 위해선 이런 인터페이스가 있어야 한다.
  • 설계 단계부터 보안이 필요
    • 설계와 계획이 없는 애플리케이션은 덜 안전한 애플리케이션이 된다.
    • 데이터 유출은 흔히 개발자의 실수와 설계에서 시작.

References

  1. 준비되었는가? 서버리스 컴퓨팅을 둘러싼 모든 장점과 의사 결정 - ITWorld Korea, 2020.01.17
  2. IDG 블로그 | 서버리스 시스템도 설계가 중요한 이유 - ITWorld Korea, 2019.10.23
  3. '이유 있는 인기'··· 서버리스 컴퓨팅의 효용 - CIO Korea, 2019-07-08

[컴] 개인을 식별하는 방법

개인 식별 코드 / unique id / uuid / 구분 / 개인 구분

개인을 식별하는 방법

아래의 것들을 이용해서 개인을 구별할 수 있다.

  • 고유 개인 식별자
    • 장치 식별자
    • 쿠키
    • 비콘
    • 픽셀 태그
    • 모바일 광고 식별자 및 유사 기술
    • 기타 형태의 영구 식별자 또는 확률적 식별자
  • 온라인 식별자
  • 인터넷 프로토콜 주소

References


  1. 칼럼ㅣ삼성이 당신의 데이터를 팔고 있을 수 있다 - CIO Korea, 2020-01-29

[컴] RabbitMQ 로 celery메시지 보내기

publish message / 메시지 보내기 / publishing messages / celery  사용 / 메세지 / rabbitmq monitor


RabbitMQ 로 celery메시지 보내기

NodeJS에서 celery RabbitMQ 로 메시지 보내기

아래는 celery 가 사용하는 rabbitMQ 로 보낼때 사용하는 code 이다.

celery 는 기본적으로 queue 이름을 celery 로 exchange 를 celery 로 만들고, routingKey 는 없다.(empty)

'use strict';

const amqplib = require('amqplib');
const Logger = use('Logger');

class MsgIssuer {

    constructor() {
        // for test
        this.rabbitMqUrl = 'amqp://userid:userpw@192.168.10.136//';
    }


    issueTask() {
        this._issuing('tasks.issueTask', {}, 'cbill0');
    }

    _issuing(task, kwargs, idHead) {


        const open = amqplib.connect(this.rabbitMqUrl);

        const body = {
            id: `${idHead}-${(new Date()).getTime()}`,
            task: task,
            args: [],
            kwargs,
            retries: 0,
            timelimit: [null, null],
        }

        // Publisher
        const routingKey = 'celery';
        open.then(function (conn) {
            return conn.createChannel();
        }).then(function (ch) {
            // return ch.purgeQueue(routingKey); // to purge message in the queue
            return ch.assertQueue(routingKey)
                .then(function (ok) {
                    return ch.sendToQueue(
                        routingKey,
                        Buffer.from(JSON.stringify(body)),
                        {
                            contentType: 'application/json',
                            contentEncoding: 'UTF-8',
                            deliveryMode: 1,
                        });
                });
        }).catch(Logger.error);
    }
}
module.exports = MsgIssuer;

python 에서 celery RabbitMQ 로 보내기


import pika
import json
parameters = pika.URLParameters(
    "amqp://id:pass@14.14.117.10/%2F"
)
connection = pika.BlockingConnection(parameters)
ch = connection.channel()
ch.queue_declare(queue="celery", durable=True)
ch.basic_publish(
    exchange="celery",
    routing_key="celery",
    body=json.dumps(
        {
            "id": "myid",
            "task": "task.tasks.mytask",
            "args": [],
            "kwargs": {
                "mykey1": "123",
                "mykey2": "456",
            },
            "retries": 0,
        }
    ),
    properties=pika.BasicProperties(
        content_type="application/json", content_encoding="utf-8"
    ),
)

monitoring

web browser 에서 http://localhost:15672/ 로 접속해서 확인하자.(참고)

여기서 queue 에 message 가 몇개 있는지 등도 알 수 있게 message 를 publish 할 수도 있고, 어떤 queue 가 현재 존재하는지 등도 알 수 있다.(Management Plugin — RabbitMQ)
sudo rabbitmq-plugins enable rabbitmq_management

The RabbitMQ management plugin이 제공하는 것

  • HTTP-based API
    • 관리(management)
    • RabbitMQ nodes and clusters 에 대한 monitoring
  • browser-based UI
  • command line tool, rabbitmqadmin.

rabbitmqadmin

rabbitmqadmin 은 .py 이다. 그래서 python rabbitmqadmin 이런식으로 사용하면 된다. rabbitmq 가 설치되면 downlod 는 아래처럼 하면 받을 수 있다.
curl http://localhost:15672/cli/rabbitmqadmin > rabbitmqadmin

queue, exchange 확인

python rabbitmqadmin.py list queues vhost name messages
python rabbitmqadmin.py list exchanges 

# 그냥 rabbitmqctl 로도 가능하다
sudo rabbitmqctl list_queues name messages messages_ready messages_unacknowledged

purge

rabbitmqadmin purge queue name=name_of_the_queue_to_be_purged  

queue 삭제

python3 rabbitmqadmin.py delete queue name='celery' 

그 외

다음 같은 것들을 할 수 있다.
  • Get a list of exchanges
  • Get a list of queues, with some columns specified
  • Get a list of queues, with all the detail we can take
  • Connect to another host as another user
  • Declare an exchange
  • Declare a queue, with optional parameters
  • Publish a message
  • And get it back
  • Export Configuration (Definitions)
  • Import Configuration (Definitions), quietly
  • Close all connections


See Also

  1. php 에서 Celery 사용하기
  2. 쿠...sal: [컴] RabbitMQ 자료들
  3. rabbitmqctl - Is it possible to view RabbitMQ message contents directly from the command line? - Stack Overflow

References

  1. GitHub - squaremo/amqp.node: AMQP 0-9-1 library and client for Node.JS
  2. RabbitMQ tutorial - "Hello World!" — RabbitMQ
  3. javascript - RabbitMQ Node JS Validate User ID - Stack Overflow, 2020-01-08


[컴][유틸] fzf - fuzzy finder

linux command line util / bash util / tools / 쓸만한 툴 / totalcmd / 리눅스에서 유용한 툴 / fuzzy search / fuzzy

fzf

우연찮게 한 커뮤니티에서 이 프로그램이 좋다고 해서 한번 사용해 보려한다. 개발자가 한국인이라서 더 궁금하다.

설치

choco install fzf

사용

아래처럼 pipe 를 이용해서 사용하면 된다.
c:\> dir c: /b /s | fzf

demo 영상

다양한 예제

개인적인 의견

linux 에서는 꽤나 쓸모있어 보인다. 더구나 bash 에서 다양한 function 을 만들어서 사용하면 정말 효과적인 듯 하다.

하지만, 윈도우즈 환경에서는 잘 모르겠다. 개인적으로 windows 에서는 launchy, totalcmd 를 많이 사용하는데, 이 2개를 사용하는 이점이 fzf 를 사용하는 것보다 더 큰 듯 보인다.

그리고 전체 파일에서 찾기를 시도했는데,(dir /b /s | fzf) 이것은 일단 file 을 전부 보여주는 시간이 오래 걸려서 유용하지 않다.

특정 파일을 검색하는 command(dir "\*.mp4" /b /s 등) 과 함께 사용하는 건 괜찮을 듯도 하다.

windows 환경
- cpu : i3-2100 3.1GHz
- RAM : 8GB


[컴][웹] node-simple-encryptor 의 decrypt 를 python 으로 구현하기

node-simple-encryptor 를 python  에서 / 복호화 함수 / 암호화 함수 / 아도니스 암호화 / 복호화 / 파이썬으로

node-simple-encryptor 의 decrypt 를 python 으로 구현

Adonijs 의 Encryptor 는 node-simple-encryptor 를 사용한다. 여기서는 Encryptor.decrypt() 의 decrypt 부분을 python 으로 구현해 보자.


node-simple-encryptor 의 decrypt() 부분


module.exports = function(opts) {
  if( typeof(opts) == 'string' ) {
    opts = {
      key: opts,
      hmac: true,
      debug: false
    };
  }
  var key = opts.key;
  var verifyHmac = opts.hmac;
  var debug = opts.debug;
  var reviver = opts.reviver;

  ...
  // Use SHA-256 to derive a 32-byte key from the specified string.
  // NOTE: We could alternatively do some kind of key stretching here.
  var cryptoKey = crypto.createHash('sha256').update(key).digest();
  ...

  function decrypt(cipherText) {
    if( !cipherText ) {
      return null;
    }
    try {
      if( verifyHmac ) {
        // Extract the HMAC from the start of the message:
        var expectedHmac = cipherText.substring(0, 64);
        // The remaining message is the IV + encrypted message:
        cipherText = cipherText.substring(64);
        // Calculate the actual HMAC of the message:
        var actualHmac = hmac(cipherText);
        if( !scmp(Buffer.from(actualHmac, 'hex'), Buffer.from(expectedHmac, 'hex')) ) {
          throw new Error('HMAC does not match');
        }
      }

      // Extract the IV from the beginning of the message:
      var iv = new Buffer(cipherText.substring(0,32), 'hex');
      // The remaining text is the encrypted JSON:
      var encryptedJson = cipherText.substring(32);

      // Make sure to use the 'iv' variant when creating the decipher object:
      var decipher = crypto.createDecipheriv('aes256', cryptoKey, iv);
      // Decrypt the JSON:
      var json = decipher.update(encryptedJson, 'base64', 'utf8') + decipher.final('utf8');

      // Return the parsed object:
      return JSON.parse(json, reviver);
    } catch( e ) {
      // If we get an error log it and ignore it. Decrypting should never fail.
      if( debug ) {
        console.error('Exception in decrypt (ignored): %s', e);
      }
      return null;
    }
  }

python 구현

class NodeSimpleEncrypter:
    """

    """


    KEY = b"FFfBEVh5Dr1BhJiEi3mnCsB6nByGv1iL"
    IV_LEN = 16

    def __init__(self):
        pass


    @staticmethod
    def decryptForV2(value):
        m = hashlib.sha256()
        m.update(NodeSimpleEncrypter.KEY)
        key = m.digest()

        cipherText = value[64:]

        ivstr = cipherText[:32]
        iv = binascii.unhexlify(ivstr)

        encodedBody = cipherText[32:]
        body = base64.b64decode(encodedBody)

        # CBC MODE
        # https://gist.github.com/forkd/168c9d74b988391e702aac5f4aa69e41
        # https://pycryptodome.readthedocs.io/en/latest/src/cipher/classic.html#cbc-mode
        aes = AES.new(key=key, mode=AES.MODE_CBC, iv=iv)

        return unpad(aes.decrypt(body), AES.block_size)

[컴] 게임 엔진 클론 오픈 프로젝트

게임 클론 / 게임 엔진 오픈 프로젝트 / 오픈 소스 프로젝트 / 엔진 개발 기초 자료 /  참고자료

game clone open projects

[웹] github 에서 issue templates 설정하기

github 이슈 커스터마이징 / customize / customization / customizing / new issue / github template / github templates / 템플릿 / issue 템플릿

github 에서 issue templates 설정하기

  •  repository 선택 --> settings tab --> options --> Feature 부분


template 을 추가하고, issue 를 누르면 아래처럼 보인다.
그러면 아래처럼 template 이 보이게 된다.



References

  1. Configuring issue templates for your repository - GitHub Help