[컴] 그리는 과정을 기록해 주는 앱

그리는 과정 녹화 / 앱 / 애플 / 아이패드 에서 그림 그리는 과정 녹화

그리는 과정을 기록해 주는 앱


  1. 아이패드 앱: 프로크리에이트 ProCreator

See Also


  1. 27 Procreate Alternatives & Similar Software – Top Best Alternatives

References


  1. 그림 그리는 과정 화면을 녹화? : 클리앙, 2019-07-19

[컴] AWS RDS 추가 계정 생성

aws rds instance 계정 생성 방법 / 추가 계정생성 방법 / aws db instance 계정생성 방법 / grant sql /



AWS RDS 추가 계정 생성 


grant 를 해줄 때 SELECT 만을 주면 안된다. EXECUTE 도 줘야 접속이 가능하다.

CREATE USER 'reader'@'222.111.99.55' IDENTIFIED BY 'mypassword';
DROP USER 'reader'@'222.111.99.55';



GRANT SELECT, EXECUTE
ON *.*
TO 'reader'@'222.111.99.55' WITH GRANT OPTION;

-- 모든 권한
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER ON *.* TO 'all-round-user'@'%' WITH GRANT OPTION;

-- 권한확인
SHOW GRANTS FOR 'bob'@'localhost';
SHOW GRANTS FOR CURRENT_USER;

-- 특정 db 에 대한 모든 권한을 주는 법
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES, CREATE VIEW, EVENT, TRIGGER, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EXECUTE ON mydatabase.* TO 'siteuser'@'%';
FLUSH PRIVILEGES;

아래처럼 주소를 변경할 수 있다.
RENAME USER 'reader'@'222.111.99.55' TO 'reader'@'222.111.99.%';

References

  1. RDS MySQL에서 마스터 사용자 권한이 있는 다른 사용자 생성
  2. Show Privileges in MySQL/MariaDB using SHOW GRANTS, With Examples
  3. mysql - AWS RDS - Access denied to admin user when using GRANT ALL PRIVILEGES ON the_db.* TO 'the_user'@'%' - Stack Overflow 

[컴][웹] 현재 사용하고 있는 DNS server 대신에 AWS 의 Route 53 을 사용하려 할 때

route 53 사용하기 / DNS 서버 설정 / AWS 에서 DNS 설정


현재 사용하고 있는 DNS server 대신에 AWS 의 Route 53 을 사용하려 할 때

AWS .com 등록 비용

옮기기

  1. 기존의 등록된 내용 확인
  2. hosted zone 생성
  3. record 생성하기
  4. TTL
  5. 현재 사용중인 DNS name server 의 NS record 에 AWS ns 를 추가
  6. 도메인 등록 에서 NS 를 AWS 의 NS 로 변경
  7. TTL 을 원래대로 돌려놓는다.

1. 기존의 등록된 내용 확인

c:\> nslookup -debug cocktailfunding.com

2. hosted zone 생성

  • 자신이 소유한 domain 인만 가능하다.
  • 자신의 domain 에 대해 Route 53 에게 어떻게 route 을 할 것인가 에 대해 알려주기 위해 생성해야 한다.
  • domain name 으로 zone 의 이름으로 해서 생성한다.
  • 이 hosted zone 내에서 record 를 생성하게 된다.
hosted zone 을 생성하면 Route 53 가 자동으로 아래 2개 record 를 생성한다. - NS record - 생성된 hosted zone 과 연관된 4개의 name server 들 이 기록된다. --> 여기 name server 를 도메인등록(registration for the domain) 한 곳에 가서 넣어주면 된다. - SOA record : SOA 관한 설명
이 2개의 record 는 지우면 안된다. 그리고 다른 NS, SOA record 를 생성해도 안된다고 되어 있다.

3. record 생성하기

4. TTL

  • NS record 에 대한 TTL 은 보통 2일(172800 초) 정도 이다. 그래서 이것을 임시적으로 낮춰서 빠르게 새로운 NS 로 update 를 시켜줄 필요가 있다.
  • ref.1 에서의 추천은 다음 2곳의 TTL 을 모두 변경하는 것이다. 60초 ~ 900초 수준으로 변경하면 된다.
    • 현재 사용중인 DNS server 의 NS record TTL
    • 위의 “hosted zone 생성” 에서 생성된 NS record 의 TTL
  • 보통 DNS resolvers 가 현재의 DNS service provider 가 제공하는 name server 들의 이름을 caching 하고 있다. 만약 방금 그 내역을 가져왔다면, 2일동안은 계속 그 이름을 기억할 것이다.

5. 현재 사용중인 DNS name server 의 NS record 에 AWS ns 를 추가

이렇게 해서 제대로 동작하는지 확인을 1차적으로 할 수 있다.

개인적인 생각은 도메인 등록기관(registrar) 의 NS 등록에 추가하는 것도 괜찮을 듯 하다.

6. 도메인 등록 에서 NS 를 AWS 의 NS 로 변경

도메인 등록기관(registrar) 에서 domain 에 대한 NS 를 설정하게 하는데, 그곳에 가서 NS 를 Rout53 으로 변경해 주자.

7. TTL 을 원래대로 돌려놓는다.

See Also

  1. Amazon Route 53 pricing - Amazon Web Services

References

  1. Making Route 53 the DNS Service for a Domain That’s in Use - Amazon Route 53

[컴] 오브젝트 스토리지(Object Storage)

백업 방법 /  여러리즌으로 / back up / 운용 / 주기적인 백업 / object storage

오브젝트 스토리지(Object Storage)

  • 아마존의 심플 스토리지 서비스(Simple Storage Service, S3)
  • 애저의 블롭 스토어
  • 구글의 클라우드 스토리지

Object storage System

계층적 디렉토리 및 서브디렉토리 구조가 없는 일종의 파일 시스템
  • 오브젝트 스토리지 시스템에 저장된 모든 오브젝트는 콘텐츠에 따라 고유 식별자(Unique IDentifier, UID)가 주어진다.
  • 보통 uid 는 SHA-1 같은 hash algorithm 응 이용해서 만든다.

오브젝트 스토리지와 블록 스토리지 간의 큰 차이

  • 오브젝트 스토리지에 저장된 모든 오브젝트는 최소한 3곳의 가용 구역으로 자동으로 복사된다
  • 오브젝트 단위로 복제를 한다.
    • 클라우드 블록 스토리지 및 보편적 RAID 시스템은 블록 수준에서 복제가 이루어진다.
  • 오브젝트는 절대로 변경되지 않는다. (위키의 편집같은 것을 생각해보자.)
    • 오브젝트가 변경되어야 한다면 그냥 새 오브젝트로 저장
    • 버전 분류가 지원된다면 이전 오브젝트 버전은 역사적 목적으로 저장
  • 오브젝트 스토리지는 위해를 끼칠 수 있는 여러 원인을 방어하는 여러 보호 수준을 자동으로 포함
  • 선택적인 WORM(Write-Once-Read-Many) 보호
  • 교차-지역 복제 등 이용 가능한 모든 베스트 프랙티스를 준수
  • 오브젝트 스토리지가 여전히 오류를 범할 수 있는 인간에 의해 작성 –> 오브젝트 스토리지 내 데이터가 미션 크리티컬이라면 백업하는 것이 적절

다른 백업 서비스 이용

  • AWS 글레이저 딥 아카이브
  • 애저 아카이브 스토리지
  • 구글 콜드라인
  • 상이한 계정 및 지역 을 이용해야 한다.

블록 볼륨 백업

  • 블록 볼륨은 백업해야 한다.
  • 스스로 이들을 백업.
  • 블록 스토리지 스냅샷
    • 다른 지역 및 계정으로 복제

오브젝트 스토리지 백업

  • 오브젝트 스토리지는 여러 가용 구역으로 복제가 자동으로 이루어진다.
  • 하지만 완벽이란 없다 –> 필요하다고 판단되면 백업을 해라.

See Also

  1. 백업 방식들

Reference

[컴] GSMA IMEI Database

imei blacklist / IMEI 블랙 리스트 / 도난 당한 폰 / 폰 도난 방지 시스템 / 중고 / 해외에 중고로 판대

GSMA IMEI Database

GSMA 가 International Mobile Equipment Identity Database (IMEI Db) 로 알려진 유일한 시스템을 유지보수한다.

블랙리스트에 올라간 IMEI 들이 GSMA 중앙 IMEI DB 에 제공된다. 그러면 이 DB를 이용해서 통신업자들이 국제, 국내망 여러 네트워크에서 그 기기를 block 할 수 있다.

하지만, 이것은 완전하진 않다. ref.2 에서 이야기하듯이 IMEI 값은 변경이 가능하다.

GSMA IMEI DB 에 기록하는 정보

IMEI 는 15자리의 숫자이며, 모바일 네트워크에서 기기를 구분하기 위해 사용된다.

IMEI DB에는 “3GPP 를 따르는 기기들” 제조사들의 모든 공식적인 기기들의 정보를 기록한다.
  • IMEI 번호 : “3GPP 를 따르는 기기들” 제조사들의 모든 공식적인
  • 제조사 이름
  • 모델이름
  • 주요 네트워크 능력(주파수 대역, 기기타입 등)

References

  1. GSMA IMEI Blacklisting - Services
  2. International Mobile Equipment Identity - Wikipedia

[컴][웹] Spring 의 thread 관련 정보

annotation / 어노테이션 /

Spring 의 thread 관련

@ControllerAdvice

기본적으로 @ControllerAdvice 는 모든 controller 에서 접근가능하다.

@ModelAttribute

@ModelAttribute@RequestMapping 이전에 실행된다.

AsyncConfigurer class

AsyncConfigurer 를 상속하고, @EnableAsync anootation 을 사용해서, the Executor instance 를 customize 할 수 있다.
Executor instance 는 async method 를 호출을 처리 한다(thread 를 만들어서 처리한다.). 주로 AsyncConfigurerSupport 를 사용하면 된다.

예시

@Configuration
@EnableAsync(proxyTargetClass = true)
@EnableScheduling
public class AsyncConfiguration extends AsyncConfigurerSupport {

    // `@Autowired` 에 의해 `threadPoolTaskExecutor` 에 bind 된다.?
    @Autowired
    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
    ...

    // 그래서 `@Resource(name = "secondThreadRun")` 에 의해서 
    // `secondThreadRun` 에 bind 된다. 이때 `secondThreadRun` 은
    // `ApplicationContextTestResourceNameType application context` 에
    // define 되어야 한다.
    @Resource(name = "secondThread")
    private ThreadPoolTaskExecutor secondThread;

    @Override
    public Executor getAsyncExecutor() {
        return threadPoolTaskExecutor;
    }

    ...
    @Bean(destroyMethod = "shutdown")
    public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
        // `@Bean` 을 creation 을 하고, `threadPoolTaskExecutor` 이름으로
        // Bean 이 하나 생성되고, 
        // 이것이 `@Autowired` 에 의해 `threadPoolTaskExecutor` 에 bind 된다.?
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(10);
        executor.setMaxPoolSize(10);
        executor.setQueueCapacity(50);
        executor.setThreadNamePrefix("mythread-");
        executor.initialize();

        return executor;
    }

    /**
     * `createSecondThreadPool` 의 bean 은 `secondThread` 라는 이름으로 생성된다.
     *
     * @return
     */
    @Bean(name = "secondThread")
    @Qualifier
    public Executor createSecondThreadPool() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(TASK_BATCH_CORE_POOL_SIZE);
        executor.setMaxPoolSize(TASK_BATCH_MAX_POOL_SIZE);
        executor.setQueueCapacity(TASK_BATCH_QUEUE_CAPACITY);
        executor.setBeanName(EXECUTOR_BATCH_BEAN_NAME);
        executor.initialize();
        return executor;
    }
}
@Service
public class NhBatchThreadRun {
    ...
    @Autowired
    MyService1 myService1;
    @Autowired
    MyService2 myService2;

    /**
     * `@Async("secondThread")` 는 `secondThread` 라는 
     * name 의 bean 을 이용한다. 
     * 이 bean 은 configuration class 에 정의되어 있어야 한다. 
     * (`AsyncConfiguration.createSecondThreadPool` 를 확인하자.)
     * 
     * `secondThread` executor 가 `secondThreadRun` 를 실행하게 된다.
     * 
     * @ref: [How To Do @Async in Spring | Baeldung](https://www.baeldung.com/spring-async)
     *
     * @param str
     */
    @Async("secondThread")
    public void secondThreadRun(String str) {

        logger.debug("THREAD START!!!");
        // batch Start!!
        try {
            while(!Thread.interrupted()) {
                logger.debug("THREAD ING!!!! "+new Date().toString());
                myService1.send();
                myService2.insertIntoDB();
                ...
                Thread.sleep(1000 * 5);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        logger.debug("THREAD END!!!!");
    }
}

See Also

  1. java - stopping ExecutorService Threads in Tomcat - Stack Overflow