그리는 과정을 기록해 주는 앱
- 아이패드 앱: 프로크리에이트 ProCreator
See Also
References
- 그림 그리는 과정 화면을 녹화? : 클리앙, 2019-07-19
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.%';
c:\> nslookup -debug cocktailfunding.com
이 2개의 record 는 지우면 안된다. 그리고 다른 NS, SOA record 를 생성해도 안된다고 되어 있다.
60초 ~ 900초 수준으로 변경하면 된다.@ControllerAdvice@ModelAttribute@ModelAttribute 는 @RequestMapping 이전에 실행된다.@EnableAsync anootation 을 사용해서, the Executor instance 를 customize 할 수 있다. @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!!!!"); } }