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

[컴][웹] firefox 에서 banner_ 로 시작하는 class 이름

파이어폭스 / 광고 / 배너 / 배너이미지 / 광고 이미지 / 광고 차단 방법

Firefox 에서 banner_ class 사용시 주의사항

firefox 를 사용하는데, class name 을 banner_image 로 설정했다. 그랬더니 firefox 에서 보이지 않게 됐다. 그래서 다른 class name (banner 가 들어가지 않은) 으로 변경하였다.
  • 사용한 firefox version : 7.1.0 64 bit

See Also

[컴][웹] AWS 트래픽 줄이는 방법

aws 에서 비용 줄이는 방법 / aws traffic 감소 / 아마존 웹 서비스 트래픽 감소 / 트래픽 줄이는 방법 / 아마존 저렴하게 이용하는 방법 / 감소 방법 / 감소시키는 방법

AWS 트래픽 줄이는 방법

ref. 1 의 gameanaytics 라는 곳에서 자신들이 aws 의 traffic 을 줄인 방법을 소개했다. 여기서는 대략적인 내용만 적으려 한다. 자세한 이야기는 ref. 1을 읽어보도록 하자.
  1. http header 크기 줄이기

    // 줄이기전 header
    HTTP/1.1 200 OK
    Connection: Keep-Alive
    Content-Length: 15
    Content-Type: application/json
    accept-encoding: gzip
    Access-Control-Allow-Origin: *
    X-GA-Service: collect
    Access-Control-Allow-Methods: GET, POST, OPTIONS
    Access-Control-Allow-Headers: Authorization, X-Requested-With, Content-Type, Content-Encoding
    
    // 줄인 후 header
    HTTP/1.1 200 OK
    Connection: Keep-Alive
    Content-Length: 15
    Content-Type: application/json
    

  2. TLS handshake 횟수를 줄이기
    • TLS handshake 에서 가장 큰 크기는 certificate 의 trust chain 이었다.
    • 만약 client 가 2번째 service 에 접속하는 거면, server 에게 이전에 사용한 TLS session 을 요청한다.
    • 그래서 AWS Load balancer 에서 cache size 등을 조절해 보려했지만, 못찾았다.
    • 그래서 close connection 하는 시간을 10분으로 늘렸다.(기본 세팅은 60초)
  3. 인증서(certificate) 의 크기 줄이기
    • 인증서가 TLS handshake 할 때 certificate 교환을 하기에, certificate size 가 작아야 유리.
    • AWS 에서 무료로 제공하는 certificate 에는 trust chain 에는 intermediate certificate 이 3개나 있어서, size 가 더 컸다.
    • root certificate 만 있으면 되기에, Digicert 에서 따로 구매해서 사용했다.

References

  1. Three ways to reduce the costs of your HTTP(S) API on AWS - GameAnalytics, 2019-12-13

[컴][용어] SSD 관련 용어

용어 / ssd 사기전 알아두면 좋은 용어 / 하드웨어 용어 / 하드 / 플래시메모리 드라이브 / hdd /



SSD 관련 용어

  • SATA
    • 연결 유형(connectivity type)과 전송 프로토콜을 모두 나타낸다.
    • 2.5 인치 및 3.5 인치 하드 드라이브와 SSD를 PC에 연결하는 데 사용
    • SATA III 속도는 약 600MBps
    • 요즘 나오는 대부분의 SSD는 600 MBps 이상을 사용 
  • PCI-E
    • 이 인터페이스는 컴퓨터의 PCIe 레인 4개를 이용
    • PCIe gen. 3 는 4Gbps
    • 고급 NVMe SSD 드라이브 에 사용
    • M.2 드라이브를 PCIe 레인에 끼울 수 있게 해주는 어댑터도 있다.
  • NVMe
    • 비휘발성 메모리 익스프레스 기술(Non-Volatile Memory Express)의 약자
    • 이 기술이 적용된 SSD 드라이브를 제대로 이용하려면 PCIe 의 대역폭이 필수
  • M.2
    • M.2는 폼팩터(모양)
    • 대부분의 M.2 SSD는 NVMe 기술을 사용
    • 일부는 여전히 SATA를 이용 
  • U.2 및 mSATA
    • 오늘날 시장에서는 거의 이용되지 않는 인터페이스
    • 일부 구형 울트라북의 경우 M.2 대신 mSATA를 내장한 경우가 있다. 

References

  1. 2TB 용량이 200달러 이하 진입··· SSD 구매 체크포인트는? - CIO Korea, 2019-11-29



[컴][책] Data Architecture Solution

Data Architecture Solution / 데이터 구조

ITA Information Technology architecture (정보기술구조)

ITA 는 아래 3가지로 구성
  1. Enterprise architecture(전사적 구조)
    • Business Architecture
      • Business Process
      • Information Flows and Relationships : 정보의 흐름, 어디서 생성, 언제 업데이트 언제 폐기 되는 등의 관리 기준, 방법, 절차 등.
    • Data Architecture
      • Data Descriptions and Relationships : 무엇이 데이터이고, 그 데이터간의 관계는 어떻고 등의 이야기. 하지만 요즘의 시대에는 Information 이 곧 data 가 되는 사회라서, 과연 이것을 분리하는 것이 의미가 있는지 모르겠다.
    • Application Architecture
      • Applications : 실질적으로 data 를 이용하고, business 를 수행하는 주체이다. 구체적인 어플리케이션은 변동이 있을 수 있어, 그보다 상위의 application 의 기능에 대한 이야기 들을 주로 정립하는 것이라 보면 된다.
    • Technical Architecture
      • Technology Infrastructure : 물리적 계층 이라고 볼 수 있다. 실질적으로 사용하게 될 기술들에 대한 이야기를 적는다.
  2. Technical Reference Model(기술참조 모델)
  3. Standards Profile(표준 프로파일) : 기술참조모델 을 구현하기 위한 IT 표준들
ITA 에서 Enterprise architecture 를 만들기 위해 기술적인 부분이 정의돼야 하는데, 그것과 관련해서 참고해서 사용하는 것이 Technical Reference Model 이다. 즉 Technical Reference Model 에서는 기능에 대해 구체적인 동작? 을 적는다고 보면 된다. 이러이러한 기능이 가능해야 한다. 등 이 Model 을 좀 더 구체적으로 구현하기 위해서 현재의 기술들 중에 적합한 것을 선정할 것이고, 그 기술들에 대한 스펙 같은 것(profile) 을 모아 놓은 것이 Standard Profile 이 된다.
ITA 는 다음 5가지 를 충족할 수 있도록
  • 구조적
  • 시스템화
  • 구체적
  • 데이터화
  • 전문화
요약하면 시스템을 잘 만들어서, 전문화 하자. 인데, 이것을 위한 상위단계인 설계부분(architecture 를 설계하는) 부분도 포함하는 이야기를 하는 것.

Zachman 쟈크만 프레임워크, ITA framework

  1. Scope(Contextual), Planner
    • 먼저 아주 개괄적인 기획
    • 대략적으로 특정 business 에 대해서 구분 짓는다. ‘상품’, ‘사람’, 등
  2. Enterprise Model(Conceptual), Owner
    • 그 다음 기업에서 사용할 모델, 여기까지는 컨셉이다.
    • Contextual 에서 찾은 것을 이제 여러 entity 로 구체화한다. ‘사람’ 에 해당하는 ‘사원’, ‘고객’ 등에 대해서 어떤 종류의 사원이 있는지, 고객이 있는지 등에 대해 정의한다.
    • 여기부터는 DB modeling 이라고 여기면 될 듯 하다.
    • 다만 좀 더 핵심적인 entity 에 집중한다.
  3. System Model(Logical), Designer
    • 기업모델을 좀 더 세밀하게 논리적으로 표현
    • 각 entity 의 속성등을 표현. 특정 사람이 어떤 속성을 가져야 위에서 정의한 Conceptual 을 표현할 수 있는지 고려하고, 그에 맞게 속성, 관계등을 정의하면 된다. 이부분은 db table 의 column 을 정의하고, relationship 등을 정의하는 것등을 생각하면 될 듯 하다.
  4. Technology Model(Physical), Builder
    • 기술적 모델, 시스템 모델을 구현
    • 실질적으로 logical 에서 정의한 내용들을 RDBMS 등에서 table, index, key 등을 이용해서 정의한다.
  5. Detailed Representaions(Out of Context), sub contractor
    • 실질적인 구현, 흔히 프로그래머등이 액션하는 부분
프로그래머들이 어떻게 만들것인가 를 설계하는 과정에는 Enterprise Model, System Model, Technology Model 이 함께 고민된다고 보면 될 듯 싶다.
이미 data 가 존재하고 있는 상황에서는 ITA framework 를 revese engineering 을 통해 현재의 model 을 알아낸다. 그후에 이것을 다시 수정해 나간다.

Data architecture

이 책에서 설명하는 Data Architecture 는 위에서 이야기한 ITA framework 인 ‘쟈크만 프레임워크’ 의 구조를 그대로 가져온다.

Contextual Model

  • 4가지
    • 데이터 영역(Data Area)
    • 데이터 클래스(Data Class)
    • 인터렉션(Interaction)
    • 아티클 (Article) : data object 가 갖는 속성의 set
  • 데이터 영역을 구체화 한것이 Data Class
  • Interaction 도 Data Area 가 될 수 있다.
    • ‘계약’ 같은 데이터는 interaction 이면서 data 이다.
    • 어렵게 생각치 않아도 된다. 그저 db 에 저장할 만한 일인가를 판단하면 된다.
  • 개괄적인 개념이라서, 하위개념에 존재하는 모든 것들에 대한 추상화가 되어 있지 않아도 괜찮다.
    • (me: 하지만, 추후에 하위개념에서 추상적개념이 없던 것이 발생한다면, 관련된 추상화를 찾아서 추가하는 것도 고려해 보는 것도 좋을듯 싶다.)

Conceptual Model

  • Logical Modeling 과 비슷하다. 다만 대상을 핵심 entity 로 제한한다.

Logical Model

  • 데이터 모델링 이라고 보면 된다.
  • 본질적 내용을 중심으로 ‘형상화’, ‘체계화’
  • entity, relationship, attribute 를 정의하는 것
  • ERD 를 통해 표현할 수 있다.

Physical Model

  • ERD 등으로 표현되어진 ‘데이터 모델링’ 의 내용을 구체화 하는 단계다.
  • 예를 들면 RDBMS 등의 table 등의 schema 등을 만드는 것 처럼 구체적으로 구현한다.

Out-of-Context

  • 모델링에 대한 상세한 내역, description 등을 적는다.

계층간 Alignment

  • 현재 계층의 entity 가 상위 계층의 어느 부분을 구현한 것인가, 어떻게 상위 element 가 align 되었는지를 나타내는 것.

See Also

References

  1. Data Architecture Solution

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

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

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


  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





[컴] AI 관련 많이 언급되는 사람들

artificial intelligence / machine learning / ml / 인공지능 guru /

AI 관련 많이 언급되는 사람들

  1. Noam Chomsky: Noam Chomsky Explains Where Artificial Intelligence Went Wrong | Open Culture
  2. John McCarthy: John McCarthy (computer scientist) - Wikipedia
  3. Marvin Minsky: Marvin Minsky, Pioneer in Artificial Intelligence, Dies at 88 - The New York Times
  4. Allen Newell: Allen Newell - Wikipedia
  5. Ray Kurzweil: Predictions made by Ray Kurzweil - Wikipedia
  6. Andew Ng : Baidu’s Andrew Ng On the Future of Artificial Intelligence | Time

deep learning

  1. Geoffrey Hinton: The Godfather of AI Was Almost a Carpenter - Bloomberg
  2. Yann LeCun: Yann LeCun - Wikipedia
  3. Yoshua Bengio: Yoshua Bengio - Wikipedia

Reference

  1. Who are the "godfathers of AI"? | | The Frase Blog

[컴] VPN 선택시 참고할 만한 글

vpn / virtual private network / 선택 /

vpn 추천


  1. 유료 VPN 추천해주세요 - 인터넷 / 소프트웨어 - 기글하드웨어
  2. (IP우회) 무료,유료 VPN 추천 가성비, 속도 비교 | Net x Hack
  3. 한국 경찰 검찰이 ExpressVPN IP추적 못하는 이유 | Net x Hack
  4. 가장 안전하고 속도 빠른 1위 Express VPN(테스트 결과) | Net x Hack

[컴] gif 관련 도구

짤 / 동영상 소스 / gif 검색 / gif 소스 / 이미지 도구 / 움직이는 이미지

gif 관련 tools

gif 관련 도구, 앱, 어플, 사이트 등


[컴][리눅스] 방화벽 iptables 사용법

iptables / iptable / table / firewall / 방화벽
정리중…
vi 로 /etc/sysconfig/iptables 를 수정해도 된다. 하지만 좋은 방법인지는 모르겠다.

iptables 현재 상태 확인

iptables -S

-S 는 specification 을 뜻한다.
iptables -S 를 하면 어떤 식으로 iptables 이 설정됐는지 보인다.
$ iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -s 127.0.0.1/32 -p tcp -m tcp --dport 22 -j DROP
-A INPUT -s 127.0.0.1/32 -p tcp -m tcp --dport 21 -j DROP
-A INPUT -i eth1 -j ACCEPT
-A INPUT -i tun0 -j ACCEPT
-A INPUT -s 192.168.21.1/32 -j ACCEPT
-A INPUT -s 127.0.0.1/32 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -s 127.0.0.1/32 -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -s 203.133.167.16/24 -j ACCEPT

iptables -L -n --line-numbers

아래처럼 간략하게 볼 수 있다.
$ iptables -L -n --line-numbers
Chain INPUT (policy ACCEPT)
num  target     prot opt source destination
1    DROP       tcp  --  127.0.0.1            0.0.0.0/0            tcp dpt:22
2    DROP       tcp  --  127.0.0.1            0.0.0.0/0            tcp dpt:21
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
4    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
5    ACCEPT     all  --  203.133.167.16/24    0.0.0.0/0
27   DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22

Chain FORWARD (policy ACCEPT)
num  target     prot opt source destination

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source destination

-P 옵션

iptables -P INPUT ACCEPT
policy 설정 , target 은 INPUT, FORWARD, OUTPUT 등 의 built-in chain 만이 가능하다. 자세한 것은 ref.1 을 보자.

-A 옵션

append 이다. 현재 있는 rule 들 뒤에 추가(append) 하는 것이다. -A INPUT 하면 INPUT chain 에 append 하는 것이다.
# INPUT chain 에 다음 rule 을 append 해라 - interface eth1 을 ACCEPT 로 jump 해라.
iptables -A INPUT -i eth1 -j ACCEPT

-j 옵션

jum 를 뜻한다. 정해놓은 rule 에 대해 target(ACCEPT, DROP) 을 정해준다. “target 으로 jump 해라.” 정도로 기억하면 된다.
iptables -A INPUT -s 192.168.21.1/32 -j ACCEPT

-D 옵션

특정 rule 을 지울 때 사용한다.
# INPUT chain 에 있는 녀석을 지워라 - 10 번째 있는 rule
iptables -D INPUT 10

-I 옵션

rule 들이 정해진 순서대로 적용된다. 그래서 먼저 적용돼야 하는 것들은 위쪽에 넣어야 한다.
# INPUT 1 위치에 다음 rule을 insert 한다. - protocol 이 tcp 이고 port 가 80 인 녀석을 ACCEPT 로 jump 한다.
iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT


DB 연결관련 iptable 설정

db 연결에 있어서 iptables 를 사용할 때 만약 아래와 같은 경우라면, 그냥 MySQL 의 inbound 만 열어주면 된다. (?)

Apache ---> MySQL
  • 모든 OUTPUT 은 열고,
  • INPUT 에서 DB쪽은 server 의 ipaddress 를 추가
  • INPUT 에서 server 쪽은 DB 의 ipaddress 를 추가


참고 예제

아래는 ref. 4 에서 가져온 내용이다. 참고하자.


#!/bin/bash

# setup basic chains and allow all or we might get locked out while the rules are running...
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

# clear rules
iptables -F

# allow HTTP inbound and replies
iptables -A INPUT -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

# allow HTTPS inbound and replies
iptables -A INPUT -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT

# limit ssh connects to 10 every 10 seconds
# change the port 22 if ssh is listening on a different port (which it should be)
# in the instance's AWS Security Group, you should limit SSH access to just your IP
# however, this will severely impede a password crack attempt should the SG rule be misconfigured
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 10 --hitcount 10 -j DROP

# allow SSH inbound and replies
# change the port 22 if ssh is listening on a different port (which it should be)
iptables -A INPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

# root can initiate HTTP outbound (for yum)
iptables -A OUTPUT -p tcp --dport 80 -m owner --uid-owner root -m state --state NEW,ESTABLISHED -j ACCEPT
# anyone can receive replies (ok since connections can't be initiated)
iptables -A INPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

# root can do DNS searches (if your Subnet is 10.0.0.0/24 AWS DNS seems to be on 10.0.0.2)
# if your subnet is different, change 10.0.0.2 to your value (eg a 172.31.1.0/24 Subnet would be 172.31.1.2)
# see http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/vpc-dns.html
# DNS = start subnet range "plus two"
iptables -A OUTPUT -p udp --dport 53 -m owner --uid-owner root -d 10.0.0.2/32 -j ACCEPT
iptables -A INPUT -p udp --sport 53 -s 10.0.0.2/32 -j ACCEPT

# apache user can talk to rds server on 10.0.0.200:3306
iptables -A OUTPUT -p tcp --dport 3306 -m owner --uid-owner apache -d 10.0.0.200 -j ACCEPT
iptables -A INPUT -p tcp --sport 3306 -s 10.0.0.200 -j ACCEPT

# now drop everything else
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

# save config
/sbin/service iptables save

See Aslo

  1. linux - Using iptables to redirect traffic to a dynamic DNS name instead of an IP address? - Super User : iptables 에서 DNS 설정이 안되는 이유

References

  1. iptables(8) - Linux man page
  2. How to list all iptables rules with line numbers on Linux - nixCraft
  3. How to edit iptables rules - Fedora Project Wiki
  4. How to Configure iptables on an AWS Instance | QuickStepApps

[컴] Google cloud platform (GCP) 난잡 정리

google cloud platform



Google cloud platform (GCP) 난잡 정리

구글의 가격정책

  • 서버를 오래 띄워놓으면 할인율이 커진다.
  • vcpu 단위로 계약 한다. / vcpu 단위로 commit 을 매입?
  • preemptive use 에 대한 할인??
  • hour 단위보다 낮은 단위 , 분, 초 에 대한 과금도 가능

billing 정보 분석

  • Billing 정보를 BigQuery 로 export 로 받아 놓으면, 쿼리 를 통해서 정보를 자세하게 뽑아낼 수 있다.

BigQuery(빅쿼리) 과금

  • 읽어드리는 데이터 의 용량으로 과금이 된다.
  • select join 등 할 때 사용하는 데이터 의 양이 크면 큰돈
  • 슬롯 정액제 , 특정 슬롯을 구매하고, 그 안에서 계속 사용 가능

과금

  • GCP 는 나가는 traffic 에 대한 비용에 대해 과금한다. (서버에서 나가는)
  • 대륙간 region 을 이동하는 packet 에 대한 과금도 한다.(리전을 넘어가지 않는한 과금을 하지는 않는다.)
과금종류
  • Per-second billing
  • sustained use discounts
  • committed use discounts

Quota 이슈

  • 서비스 릴리즈 전에 quota 관련 test 필요
  • https://bespinglobal.qwiklabs.com/
    • 여기에서 구글 클라우드 관리 할 수 있게 이 베스핀 애들이 만들어 놨다고 함

quota 종류

  1. 확장 불가능한 qutoa
  2. 요청하면 확장을 할 수 있는 quota

google cloud platform 제품 및 서비스

vm instance

  • startup script 를 bucket 에 올려서 instance 를 띄울때마다 원하는 script 을 실행하게 할 수 있다.

GCP 접속 방법

  • Cloud platform Console
  • Cloud Shell and Cloud SDK (shell 은 GCP 접속하면 기본으로 하나 제공됨,CLI)
    • 보안 이슈로 막아야 하는 케이스 들이 있다 고 함...
  • Cloud Console Mobile App
  • Rest-based API

GCP 계층 구조

  • https://cloud.google.com/resource-manager/docs/cloud-platform-resource-hierarchy?hl=ko
  • 베스핀 글로벌 사이트 에서 왼쪽 위 리스트에서 확인가능
  • 모든 리소스는 프로젝트 에 종속된다.
  • organization 아래 organization 은 불가능
  • 권한(IAM, 정책)은 상속된다. 상위 계층에 권한을 주면, 하위 구조에도 영향이 미친다
  • IAM 은 여러개의 permission 을 갖는 개체 , Role 이라 부르는 듯
    • predefined role 들이 존재한다. 이것을 수정해서 자신의 롤을 만들어도 된다.(primitive, predefined, cutom role 이 가능)

서비스 계정 Service Account

  • application 이 gcp 에 접근 하기 위한 계정(apache 의 nobody 계정 같은 느낌)
  • project 내에서 만들어진다.
  • 계층 구조에 있는 상속 이 동작하기 때문에, 프로젝트 위 폴더에서 사용하도록 서비스 계정 을 만들 수 있다???
  • 하지만 편리하게 관리하는 것은 프로젝트 별로 관리하는 것이 낫다?
  • 이건 그냥 auth key 같은 녀석인듯?

VPC

  • VPC 존재 , 아마존이랑 비슷한듯
  • VPC 는 하나의 LAN 이라고 보면 된다.
  • 여러 region 을 하나의 VPC 을 생성할 수 있다.
  • shared VPC 형식으로 네트워크 A 와 네트워크 B 사이에 A와 B 가 공유하는 네트워크 C 를 만들어 쓰기도 한다???

vm instance

리전 Region

HW 하드웨어

  • standard, SSD, local SSD 가 있는데,
  • local SSD 는 cache 로만 제공한다.
  • 동일단가 대비 disk 성능이 좋다
  • 용량을 늘리면 성능이 올라간다.
  • SSD 는 타사 대비 2배 ?

preemptible instance

  • 이녀석은 매우 저렴
  • preemptible instance 는 24시간 이후에 자동으로 삭제
  • 이녀석은 주위에 instance가 필요하면 가져가 버린다.
  • OS 에서 preemption 을 하는 것처럼 instance 가 GCP 에 의해 preemption 이 가능한 듯 하다. 그래서 구글 맘대로 가져가 버리고, 우리가 그것을 계속 차지 하고 있지 못한다.
  • 항상 ready 해야 하지 않고, 빠른 응답이 중요하지 않은 경우 쓰면 좋을 듯

migration

  • instance 는 짧게는 일주일 길게는 한달에 한번 migration 이 구글에 의해 일어난다.
  • gpu instance 를 활용해서 머신러닝 하는게 제일 저렴
  • gpu instance 는 live migration 시점에 서버를 내린다.(하드웨어 종속성이 커서 그렇다)
  • 다른 instance 는 그저 알람 하나를 주는 정도다.

load balancer

proxy

앞단에 google front engine 에 존재(gfe 가 proxy역할), 단일 ip 를 물고 있다.
proxy 기반 load balancer
  • global https
  • global ssl proxy
  • global tcp proxy

regional

도쿄 리전 을 만들고 리전에 위치한 프론트가 그 트래픽을 받아준다. 프록시를 통하지 않는다. 클라이언트 아이피가 직접 도달한다.
DSR 형태로 동작
그래서 리저널은 그냥 라우팅만 해주는 정도이다.(TCP/UDP 단에서 라우팅) 성능 저하가 없다.
특정한 정책을 넣거나, 자동 모니터 등을 제공하진 않는다.
  • regional
  • regional internal : 내부 L4 switch 라고 보면 된다.

DNS

  • 클라우드 DNS
  • internal dns service 도 제공

CDN

  • 대용량 스트리밍 관련 CDN도 제공
  • 백엔드로 붙일 수 있는게, global load balancer 에 대해서만 CDN활성화 가능
  • 버킷에 올라가 있는 것만 가능??
  • 타사대비 가격 경쟁력이 있다고 한다??

interconnect option , vpn

회사 내부 망과 gcp 와의 통신을 위한 여러 interconnect option 을 제공
특정 아이피에서 접속할 때 gcp에 접근할 때 빠르게 해준다.
  • direct peering: 구글이 직접 라우팅
  • carrier peering : 망사업자를 통해 지원 ?
서울 리전 이 들어오고 나야 가능? 하다고 함.
  • dedicated interconncet : 구글 데이터 센터에 직접 전용선을 붙이는 것, 데이터 센터가 인접할 수록 유리
  • partner interconnect : ISP 나 망사업자 를 통하는 방식

GCP web page 에서 instance 에 있는 ssh 버튼 으로 접속시

자세한 내용은 찾아봐야 할 듯
  • 구글의 ssh proxy 를 이용해서
  • 접속 하면서, 그때 키를 받아서 메타데이터를 업데이트 해서 접속?

클라우드 스토리지 Cloud Storage

  • 초당 수만번의 파일을 쓰거나 읽거나, 급격한 요청이 들어오면, 약간의 delay 가 발생할 수 있지만, - 실서버에서 큰 이슈가 된 적은 없다.
  • 퍼포먼스에서 문제는 없다.
  • 스토리지 레벨의 암호화는 되고 있다. 암호화를 할 때 별도의 키 를 세팅할 수 있다.
  • 대량의 데이터를 올릴 때는 그냥 데이터 센터에 보내면 자기내 들이 올리는 서비스 도 제공해 준다.
  • 클라우드 스토리지 파일들은 bucket 으로 구성된다.

Storage class

  • 멀티 리저널(multi regional), 리저널, Nearline, Coldline
  • 리저널은 차이가 없다.
백업용
  • Nearline, Coldline 은 저장용으로 적당
    • Nearline 은 한달에 한번 쓸때
    • Coldline 은 사고날때 쓰는 용도
  • 저장용량당 비용이 싸다. 대신 한번에 읽기 쓰기 할 때의 비용이 비싸다.

클라우드 SQL

  • MySQL, PostgresSQL 만 제공

Cloud BigTable

  • Cloud BigTable 은 NoSQL 에 의해 managed 된다.
  • 대량 처리에 특화된다.
  • 대량의 데이터 insert , select
  • 키 기반으로 빠른 결과 얻을 때
  • HBase API
  • instance 를 많이 늘릴 수록 빨라진다.
  • 클러스터의 노드 수가 많아 질 수록 속도가 올라간다.(반응성이 좋아진단 소린가?)

cloud spanner

  • 국내 게임사는 아직 선택 안했다.
  • 많이 비싸다
  • 자동 복사 가 가능
  • horizontally scalable RDBMS
  • global consistency 를 보장
  • 해외사례는 있지만, 국내 사례는 없다.

BigQuery

  • 대량의 데이터에 대한 query 등, 데이터 사이언스 쪽에서 필요
  • 다루는 data 양에 따라 과금된다. 결과가 아니라 과정에서 사용되는 data 양

Google Container Registry

  • 사설 컨테이너 저장소 를 제공해준다.

cloud source repository

  • 사설 git
  • 사용용량에 따라 가격

google kubernetes engine

  • 쿠버네티스 엔진 을 이용해서 구글에서 만든 컨테이너 만이 아니라, 로컬에 구성된 컨테이너도 같이 관리 할 수 있는 서비스를 제공을 시작했다.
  • gke 에서는 칼리코(Calico) 를 사용 하고 있다.
현재 클라우드의 인스턴스는 가격 이 중요한 차별점이다. 그래서 인스턴스에 대해서 차별화 에 대한 고민을 하지 않는다. 장애율만 낮으면 된다.
그래서 구글은 쿠버네티스 와 빅데이터 쪽을 차별화 하려하고 있다.

google app engine

  1. standard app engine
    • 자동 scaling
    • local file system 못 쓴다.
    • request 의 timeout 이 1분 (무조건)
    • 3rd party library 설치 제약
    • 신속한 auto scaling
    • flexible 보다 이게 더 비쌈
  2. flexible environment
    • instance 를 우리가 정하고, 여기에 node 를 띄울 수 있다.
    • instance 에 ssh 접속을 허용
    • auto scaling 이 빠르게 되지 않는다. (상당히 느리다)

Cloud Functions

  • aws lambda 같은 것
  • 사용된 computing 정도에 따라 가격

가능한 trigger

  • http request
  • 특정파일이 생길때 : log 가 발생할때 등
  • ...

Deployment Manager

  • instance 배포 등, 인프라 매니지먼트 서비스
  • .yaml 하나 만들어놓고, 한번에 deploy 하는 것
  • terraform 비슷한 서비스
  • api 도 제공

Stack Driver

  • 모니터링
  • 로깅
2개 를 위해 주로 사용
  • 디버그
  • 에러 리포팅
  • 트레이스
  • 프로파일링
에도 사용
  • 로그 저장소로 보면 된다.
  • 임계치가 넘으면 알람을 받을 수 있다.
  • 개인 로그등도 stack driver 로 보내서 모니터링을 할 수 있다.
  • 메트릭은 6주, 로그는 400일, 개인이 개인적으로 쌓은 로그는 1개월 보관
  • 특정 로그들을 받아서 필터링 해서 바로 원하는 곳으로 보낼 수 없다.

사용

pub /sub 에서 받아서 dataflow 에서 처리하고 big query 에 저장하는 식으로 사용

[컴][안드로이드] rootbeer 피하기

rootbeer / rootbeerfresh / root beer



Rootbeer 피하기

updated

이 방식으로는 어려운 듯 하다. 다만 여기 좋은 글이 있다.

Magisk Hide detection

Magisk Hide 에 대한 감지 방법(detection) 으로 32-digit Unix Domain Socket 을 이용한다.

Magisk Hide 가 기존의 32-digit UDS 를 랜덤한 32 character string 으로 변경하는데 그것을 이용해서 detection 을 한다.

자세한 내용은 아래를 참고하자

Magisk Hide detection 피하기

그래서 간단하게 /proc/net/unix 에 접근하지 못하게 막는다. 그외에 다양한 이야기들을 아래 링크에서 확인할 수 있다.
su -c chmod 440 /proc/net/unix


Busybox uninstaller




[컴][웹] tomcat 에서 log 를 영어로 나오게 하는 법

region / locale / language 변경 /

톰캣 / 톰켓

tomcat log 를 영어로 나오게 하는 법

catalina.bat

chocolatey 를 사용해서 tomcat 을 설치했는데, catalina.bat 를 사용해서 실행하니, 한글로그가 깨져서 나왔다. terminal 을 UTF-8 으로 열면 해결 되지만, 그러고 싶지 않았다.

그래서 catalina.bat 를 수정해서 log 를 영어로 나오도록 설정했다.


language, region option 추가

catalina.bat 에서 JAVA_OPTS 가 설정되는 부분을 찾았다.
  • c:\ProgramData\chocolatey\lib\Tomcat\tools\apache-tomcat-9.0.26\bin\catalina.bat

그리고는 아래처럼 language 와 region 부분을 추가해 줬다.
if not "%JSSE_OPTS%" == "" goto gotJsseOpts
set "JSSE_OPTS=-Djdk.tls.ephemeralDHKeySize=2048 -Duser.language=en -Duser.region=US" 
:gotJsseOpts
set "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS%"




References

  1. Set Tomcat’s Default Locale – Knowm.org


[컴][머신러닝] Recurrent Neural Networks 예제

ML / machine learning


Recurrent Neural Networks, RNN


관련글 :  The Unreasonable Effectiveness of Recurrent Neural Networks


원본 소스 : https://gist.github.com/karpathy/d4dee566867f8291f086

python 3 버전

# encoding=utf8

"""
Minimal character-level Vanilla RNN model. Written by Andrej Karpathy (@karpathy)
BSD License
"""
import numpy as np
import codecs

# data I/O
with codecs.open('input.txt', 'r', encoding='utf-8') as fp:
    data = fp.read()
    # data = open('input.txt', 'r').read() # should be simple plain text file
    chars = list(set(data))
    data_size, vocab_size = len(data), len(chars)
    print ('data has %d characters, %d unique.' % (data_size, vocab_size))
    char_to_ix = { ch:i for i,ch in enumerate(chars) }
    ix_to_char = { i:ch for i,ch in enumerate(chars) }

    # hyperparameters
    hidden_size = 100 # size of hidden layer of neurons
    seq_length = 25 # number of steps to unroll the RNN for
    learning_rate = 1e-1

    # model parameters
    Wxh = np.random.randn(hidden_size, vocab_size)*0.01 # input to hidden
    Whh = np.random.randn(hidden_size, hidden_size)*0.01 # hidden to hidden
    Why = np.random.randn(vocab_size, hidden_size)*0.01 # hidden to output
    bh = np.zeros((hidden_size, 1)) # hidden bias
    by = np.zeros((vocab_size, 1)) # output bias

    def lossFun(inputs, targets, hprev):
      """
      inputs,targets are both list of integers.
      hprev is Hx1 array of initial hidden state
      returns the loss, gradients on model parameters, and last hidden state
      """
      xs, hs, ys, ps = {}, {}, {}, {}
      hs[-1] = np.copy(hprev)
      loss = 0
      # forward pass
      for t in range(len(inputs)):
        xs[t] = np.zeros((vocab_size,1)) # encode in 1-of-k representation
        xs[t][inputs[t]] = 1
        hs[t] = np.tanh(np.dot(Wxh, xs[t]) + np.dot(Whh, hs[t-1]) + bh) # hidden state
        ys[t] = np.dot(Why, hs[t]) + by # unnormalized log probabilities for next chars
        ps[t] = np.exp(ys[t]) / np.sum(np.exp(ys[t])) # probabilities for next chars
        loss += -np.log(ps[t][targets[t],0]) # softmax (cross-entropy loss)
      # backward pass: compute gradients going backwards
      dWxh, dWhh, dWhy = np.zeros_like(Wxh), np.zeros_like(Whh), np.zeros_like(Why)
      dbh, dby = np.zeros_like(bh), np.zeros_like(by)
      dhnext = np.zeros_like(hs[0])
      for t in reversed(range(len(inputs))):
        dy = np.copy(ps[t])
        dy[targets[t]] -= 1 # backprop into y. see http://cs231n.github.io/neural-networks-case-study/#grad if confused here
        dWhy += np.dot(dy, hs[t].T)
        dby += dy
        dh = np.dot(Why.T, dy) + dhnext # backprop into h
        dhraw = (1 - hs[t] * hs[t]) * dh # backprop through tanh nonlinearity
        dbh += dhraw
        dWxh += np.dot(dhraw, xs[t].T)
        dWhh += np.dot(dhraw, hs[t-1].T)
        dhnext = np.dot(Whh.T, dhraw)
      for dparam in [dWxh, dWhh, dWhy, dbh, dby]:
        np.clip(dparam, -5, 5, out=dparam) # clip to mitigate exploding gradients
      return loss, dWxh, dWhh, dWhy, dbh, dby, hs[len(inputs)-1]

    def sample(h, seed_ix, n):
      """ 
      sample a sequence of integers from the model 
      h is memory state, seed_ix is seed letter for first time step
      """
      x = np.zeros((vocab_size, 1))
      x[seed_ix] = 1
      ixes = []
      for t in range(n):
        h = np.tanh(np.dot(Wxh, x) + np.dot(Whh, h) + bh)
        y = np.dot(Why, h) + by
        p = np.exp(y) / np.sum(np.exp(y))
        ix = np.random.choice(range(vocab_size), p=p.ravel())
        x = np.zeros((vocab_size, 1))
        x[ix] = 1
        ixes.append(ix)
      return ixes

    n, p = 0, 0
    mWxh, mWhh, mWhy = np.zeros_like(Wxh), np.zeros_like(Whh), np.zeros_like(Why)
    mbh, mby = np.zeros_like(bh), np.zeros_like(by) # memory variables for Adagrad
    smooth_loss = -np.log(1.0/vocab_size)*seq_length # loss at iteration 0
    while True:
      # prepare inputs (we're sweeping from left to right in steps seq_length long)
      if p+seq_length+1 >= len(data) or n == 0: 
        hprev = np.zeros((hidden_size,1)) # reset RNN memory
        p = 0 # go from start of data
      inputs = [char_to_ix[ch] for ch in data[p:p+seq_length]]
      targets = [char_to_ix[ch] for ch in data[p+1:p+seq_length+1]]

      # sample from the model now and then
      if n % 100 == 0:
        sample_ix = sample(hprev, inputs[0], 200)
        txt = ''.join(ix_to_char[ix] for ix in sample_ix)
        print ('----\n %s \n----' % (txt, ))

      # forward seq_length characters through the net and fetch gradient
      loss, dWxh, dWhh, dWhy, dbh, dby, hprev = lossFun(inputs, targets, hprev)
      smooth_loss = smooth_loss * 0.999 + loss * 0.001
      if n % 100 == 0: print ('iter %d, loss: %f' % (n, smooth_loss)) # print progress
      
      # perform parameter update with Adagrad
      for param, dparam, mem in zip([Wxh, Whh, Why, bh, by], 
                                    [dWxh, dWhh, dWhy, dbh, dby], 
                                    [mWxh, mWhh, mWhy, mbh, mby]):
        mem += dparam * dparam
        param += -learning_rate * dparam / np.sqrt(mem + 1e-8) # adagrad update

      p += seq_length # move data pointer
      n += 1 # iteration counter 
fdsfds


결과

무한 loop 이라, 적정한 시점에 알아서 멈추면 된다.

아래 결과는 대략 12시간 정도를 돌렸다. 컴퓨터 스펙은 아래와 같다.

  • CPU:  i7-6700, 3.40GHz
  • RAM: 16GB
----
 beahngy
amo k ns aeo?cdse nh a taei.rairrhelardr nela haeiahe.
Ddelnss.eelaishaner” cot AAfhB ht ltny
ehbih a”on bhnte ectrsnae abeahngy
amo k ns aeo?cdse nh a taei.rairrhelardr nol e iohahenasen
----
iter 9309400, loss: 0.000086
----
 e nh a taei.rairrhelardr naioa aneaa ayio pe e bhnte ayio pe e h’e btentmuhgehi bcgdltt. gey heho grpiahe.
Ddelnss.eelaishaner” cot AAfhB ht ltny
ehbih a”on bhnte ectrsnae abeahngy
amo k ns aeo?cds
----
iter 9309500, loss: 0.000086
----
 jCTCnhoofeoxelif edElobe negnk e iohehasenoldndAmdaI ayio pe e h’e btentmuhgehi bcgdltt. gey heho grpiahe.
Ddelnss.eelaishaner” cot AAfhB ht ltny
ehbih a”on bhnte ectrsnae abeahngy
amo k ns aeo?cds
----
iter 9309600, loss: 0.000086
----
 negnk e iohehasenoldndAmdaI ayio pe e h’e btentmuhgehi bcgdltt. gey heho grpiahe.
Ddelnss.eelaishaner” cot AAfhB ht ltny
ehbih a”on bhnte ectrsnae abeahngy
amo k ns aeo?cdse nh a taei.rairrhelardr
----
iter 9309700, loss: 0.000086
----
 aI ayio pe e h’e btentmuhgehi bcgdltt. gey heho grpiahe.
Ddelnss.eelaishaner” cot AAfhB ht ltny
ehbih a”on bhnte ectrsnae abeahngy
amo k ns aeo?cdse nh a taei.rairrhelardr neli ae e angnI hyho gben
----
iter 9309800, loss: 0.000086
----
 gehi bcgdltt. gey heho grpiahe.
Ddelnss.eelaishaner” cot AAfhB ht ltny
ehbih a”on bhnte ectrsnae abeahngy
amo k ns aeo?cdse nh a taei.rairrhelardr nela dr iohecgrpiahe.
Ddelnss.eelaishaner” cot AA
----
iter 9309900, loss: 0.000086
----
 piahe.
Ddelnss.eelaishaner” cot AAfhB ht ltny
ehbih a”on bhnte ectrsnae abeahngy
amo k ns aeo?cdse nh a taei.rairrhelardr nol e iohahenasenese hbea bhnte ectrsnae abeahngy
amo k ns aeo?cdse nh a t
----
iter 9310000, loss: 0.000086
----
 er” cot AAfhB ht ltny
ehbih a”on bhnte ectrsnae abeahngy
amo k ns aeo?cdse nh a taei.rairrhelardr nela hamnaI ayio pe e h’e btentmuhgnhi beahe
Ddabealohe bee amoi bcgdltt. gey heho grpiahe.
Ddeln
----
iter 9310100, loss: 0.000086
----
 bih a”on bhnte ectrsnae abeahngy
amo k ns aeo?cdse nh a taei.rairrhelardr nol gyio pe e h’e btentmuhgehi bcgdltt. gey heho grpiahe.
Ddelnss.eelaishaner” cot AAfhB ht ltny
ehbih a”on bhnte ectrsnae
----
iter 9310200, loss: 0.000086
----
 beahngy
amo k ns aeo?cdse nh a taei.rairrhelardr ntlhnegnns. e
amo k ns aeh?cdse nh a taei.rairrhelardr nol e iohehengrpiahe.
Ddelnss.eelaishaner” cot AAfhB ht ltny
ehbih a”on bhnte ectrsnae abeah
----
iter 9310300, loss: 0.000086
----
 e nh a taei.rairrhelardr nol’e btentmuhgehi gcdslatha arenbggcodaeta tehr he ni.rhelaney gehnha e ar i ho  bee amote ectrsnae abeahngy
amo k ns aeo?cdse nh a taei.rairrhelardr nol nyio chge heiohecgr
----
iter 9310400, loss: 0.000086
----
 jCTCnhoofeoxelif edElobe negnk e iohehasenoldndAmdaI ayio pe e h’e btentmuhgehi bcgdltt. gey heho grpiahe.
Ddelnss.eelaishaner” cot AAfhB ht ltny
ehbih a”on bhnte ectrsnae abeahngy
amo k ns aeo?cds
----
iter 9310500, loss: 0.000086
----
 negnk e iohehasenoldndAmdaI ayio pe e h’e btentmuhgehi bcgdltt. gey heho grpiahe.
Ddelnss.eelaishaner” cot AAfhB ht ltny
ehbih a”on bhnte ectrsnae abeahngy
amo k ns aeo?cdse nh a taei.rairrhelardr
----
iter 9310600, loss: 0.000086
----
 aI ayio pe e h’e btentmuhgehi bcgdltt. gey heho grpiahe.
Ddelnss.eelaishaner” cot AAfhB ht ltny
ehbih a”on bhnte ectrsnae abeahngy
amo k ns aeo?cdse nh a taei.rairrhelardr nelardae abeahngy
amo k
----
iter 9310700, loss: 0.000086
----
 gehi bcgdltt. gey heho grpiahe.
Ddelnss.eelaishaner” cot AAfhB ht ltny
ehbih a”on bhnte ectrsnae abeahngy
amo k ns aeo?cdse nh a taei.rairrhelardr ntl negnk t hi rsnse nhk br ne” a naeiarairr elirs
----
iter 9310800, loss: 0.000086
----
 piahe.
Ddelnss.eelaishaner” cot AAfhB ht ltny
ehbih a”on bhnte ectrsnae abeahngy
amo k ns aeo?cdse nh a taei.rairrhelardr nelardaenabeahngelareierhi. aif edElobe negrcih gey gey heho grpiahe.
Ddel
----