* 해당 포스트에 업무상 메인 개발 환경과 보조로 사용하는 개발 도구들을 모아봤습니다.
* 현 업무 및 포지션: 서버(게임)




1. 메인 개발툴
 

1) 이클립스
> 주목적: JAVA, JavaScript, 스프링부트, AWS
> 단점

① '전자정부 표준프레임워크'로 나온 이클립스로 작업시, 프로젝트에 svn플러그인이 자동으로 활성되어 있다보니 윈도우 창에서 업데이트나 커밋을 할때 오류가 나고 이클립스쪽이 느리기도 하고 이쪽 svn플러그인은 연결 해제 해두는게 나을지도? 
② 종종 문법상 혹은 아까까지 멀쩡하던 코드에 다른 클래스 코드를 수정하고 프로젝트 클린등을 하고 나면 접점이 전혀없는 코드에서 에러 표시가 날때가 있어서 이럴때마다 이클립스가 참 성가신데 다행히 해결법이 좀 간단합니다. 해당 코드 파일 전체를 잘라내기-붙여넣기-저장하면 멀쩡합니다. 작동 다 확인 한 걸 껐다가 키면 에러표시날 경우에도 제법 써먹을만.


2) SVN
> 주목적: 팀원간 코드공유 및 이력관리
> 단점
① 신입분에게는 사용법 교육을 해드려야&해드리고 (git 안 써본 분도 더러...)
② 제발 trunk에는 구동이 되는거까지는 확인된걸로 올려주세요...
③ 팀원내 보안 이슈가 좀 있어서 접근 권한을 손 보려 했더니, authz파일로 한다는 내용이 대부분이라 저장소내 프로젝트 폴더 구조에서부터 신경써야;;;
 
 
3) 비쥬얼 스튜디오
> 주목적: .netCoreSDK 3.1(netcoreapp 3.0), 유니티, AWS 연동
> 단점
① 로컬 ASP.NET 세팅시 마이너 버전까지 맞춰야 구동이 되서 다른 세팅에 비해 까다로웠음.
 

4) 리눅스
> 주목적: 서버 머신
> 단점
① centOS건 우분투건 버전에 따라 명령어나 설치 경로가 달라지는 경우가 잦아서 매번 찾기 힘들어짐. 우분투의 경우 16인가, 18인가로 그냥 패키지 명령어만 같은 다른 OS로 보는게 속편함.
 
 
 
 

2. 보조용 GUI툴
 
1) Robo 3T [#홈페이지]
> 주목적: (noSQL)mongoDB GUI
> 단점
① 1.4.4가 마지막 버전(#블로그). (해당 프로젝트가 Studio 3T로 변경된다하는데 현재 쓰임새상 옮겨갈 필요가 없으면 굳이?)
② 검색된 결과들을 json으로 보면 중간중간 /*  1  */이 있어서 테이블 일부 입력값을 그대로 옮기는 못해서 정규식으로 중간 주석문을 지워야 함.
 
 
2) HeidiSQL [#홈페이지] & MySQL Workbench[#홈페이지]
> 주목적: (SQL)마리아 DB GUI
> 단점
① UI편의성등으로 HeidiSQL를 쓰긴 쓰는데, 간혹 덤프해둔 SQL문 처리가 안 될때가 있으면 Workbench로 쓰면 입력이 되다 보니 좋게 말하면 상호보완, 나쁘게 말하면 2개를 써야 내 퍼포먼스가 올라가는 이건 대체 무슨?
 
 
3) P3X Redis [#홈페이지]
> 주목적: 레디스 GUI
> 단점
① 기록이 10만을 초과한 랭킹 보드(sorted set)를 조회시, 페이징없이 전체 기록을 출력하는건지 느려진다.
② 프로그램 안정화 문제인지 간혹 실행자체가 안 될때가 있는데, 이럴때는 재설치를 하면 해결된다.





3. 보조용 에디터
 
1) 노트패드++
> 주목적: 
> 단점
① '리눅스: grep 함정과 임기응변'에도 언급했지만, 8.3.3 기준으로는 열린탭들 합쳐서인지 몰라도 500MB를 초과하면 열수 없습니다. 그렇다고 대용량 로그 파일은 못 쓰는가? 아닙니다. 뒤에 나오는 glogg로 해결은 가능합니다.
 

2) glogg [#홈페이지]
> 주목적: 대용량 로그파일 열기
> 단점
① 검색시 특수기호나 띄어쓰기가 있으면 검색이 잘 안 될때가 있어서 가급적 공백이 없고, 특수기호가 없는 단어로 검색해야 한다.
 




4. 기타, 네트워크
 
1) tcping [#홈페이지]
> 주목적: 포트 입력이 가능한 통신확인
> 단점
① 딱히?
 
 
2) WinSCP [#홈페이지]
> 주목적: FTP와 SSH를 하나로. 그리고 SSH포트만 허용된 서버에서 작업
> 단점
① 용량이 클수록(500MB초과)의 경우, Filezilla에 비해 느려지기 시작.
② 다운로드중에는 다른 명령어가 안 되어서 다운로드 목록에 파일이 추가한다거나 다른 디렉토리로 이동이 불가.
 
 
3) 포스트맨 [#홈페이지]
> 주목적: 로컬서버 및 개발서버 통신 테스트
> 단점
① 브라우저 버전(혹은 크롬 확장 프로그램)으로 스프링부트 로컬 서버와 통신시, CORS 문제가 발생할 여지가 있어서 가급적 설치 버전을 권장.





기타. 변경이력

일자
 변경이력
 2022-07-30  초안 작성. [#blogger] [#티스토리]
 오늘은 튜토리얼이나 샘플 코드가 아닌 실무에서 겪은 '괴담'에 가깝습니다.
요약본을 말하자면, 'grep 명령어가 파일 용량에 따라 결과가 상이하다.'입니다.
읽고도 '무슨 헛소리냐'싶어지죠?
저도 잘못 본 거였으면 좋겠지만, 이 이슈로 금요일 오전부터 오후까지 진땀 뺀터라.
 





당시 환경
 

> 우분투 16.04LTS, AWS ec2

> 톰캣 8.5
> 1.2~1.3GB정도 되는 톰캣 로그 3개.
> mongoDB v4.2.12

 테이블 일부를 초기화 시키다 그만 누적을 유지해야 하는 컬렉션까지 날려버린겁니다. 자동 백업본이나 수동 백업본이 아예 없던건 아니지만 시간상 몇 시간 공백이 있다 보니 대체 불가인 자료여서 어떻게든 복원을 시켜야 하는거였죠.
 그런데 어떤 방법으로?



구명 보트를 찾아라.

 noSQL인 몽고DB툴로 Robo 3T를 쓰고 있는데, 툴에 나오는 로그로는 그냥 제 멍청한 실수가 몇 시쯤 시행됐다만 재확인 시켜줄뿐 다른게 없습니다.
 
 그런데 잠깐!
 
 컬렉션에 데이터 입력시 JSON 형식으로 입력해야하는데, 디버깅용 로그가 활성중이라 톰캣 로그에는 온갖 입출력이 다 나와있고 로그 추적을 용이하게 하려고 DB에 입력된 값도 확인할 로그를 심은게 있어요.
 몽고DB건 다이나모DB건 테이블에 입력하는 자체 Item클래스는 map이지만 정규식과 문자열 바꾸기로 JSON형식에 맞게 가공이 가능하니 이제 할 일은 뭐다?

 확인겸 로그 파일에서 해당 자료 유형에만 존재하는 컬럼명을 검색해보니,
jsonPretty로 찍히긴 했어도 영 써먹지 못할 형태까지는 아닌게 확인됐습니다. 혹시 싶어 1 줄 짜리로 출력 되게 심어둔건 없는지 위아래로 찾아보니 다행히 있었습니다.

 입출력 값 로그는 사람이 파악하기 편하게 jsonPretty로 로그를 심는 것도 좋지만,
1줄 짜리 출력을 보조격으로 넣은게 구명 보트가 된거였습니다.



그런데... 보트가 움직이질 않는다?
 
 로그 파일이 다 있지만,
전부 합치면 3.5GB에 육박하는 문자열에서 내가 원하는걸 추려내야 합니다.

1) 특정 컬럼명이 있는 JSON을 한 줄내로 찍은줄만 추출하는 코드를 Junit등으로 작성?
-> 기각!
 아무리 단순 반복 기능이라도 용량상 유니티부터 MOS들이 띄워진 업무PC는 기다리면서 다른걸 한다 해도 과부하 가능성을 무시 못함. 
2) 학부 리눅스 수업에서 뭔가 비슷한 기능을 소개한거 같다.
-> 찾아보자!
 
 제가 찾은 방법은 'grep'입니다.
학부에서는 디스크내 파일 검색만 해봤지, 파일내에서 검색은 처음이라 은근히 헤매게 되더군요. (자료 복구가 걸린 일인것도 있지만...)
 
grep '도큐먼트_컬럼명' tomcat_A.2022-05-XX.log
 원하던 형태로 추려져서 검색이 동작한다!
 
 그런데 내가 필요한건 추출본...
검색 결과 그대로 파일에 저장 하는게 뭐였더라로 잠시 또 구글링.
 
grep '도큐먼트_컬럼명' tomcat_A.2022-05-XX.log > tomcat_crop.txt
난 이제 살았다! 자유야!
...
...
로 저기서 해결됐으면 굳이 괴담이라 운을 띄운 글을 남기지도 않았겠죠?
tomcat_crop.txt 용량은 고작 2KB였습니다.
너무 이상한거에요.
 
 분명 테이블을 마지막으로 백업하고 나서 몇 시간 지나고 초기화할 때 누적된 입력 값은 어림짐작으로 잡아도 그 정도 분량이 아닌데 어째서?
tomcat_crop.txt마지막 줄에 찍힌 시간=(UTC.0) 02:XX
tomcat_A.2022-05-XX.log마지막 줄에 찍힌 시간=(UTC.0) 23:XX
 인스턴스가 여러개였으니 특정 인스턴스에만 연속으로 호출이 걸려 한 동안 로그가 뜸한 타이밍이 가능하긴 하겠죠. 그런데 21시간 연속으로 이 인스턴스가 놀았다고?
이상하잖아요?
 
 
(한정된 자원에서)
가능성이 극도로 낮은건 발생치 않는 걸로 간주하는 것도 방법이다.
 
 
그렇다면 설마 이쪽 명령어에도 용량상 처리 가능한 상한선같은게 있는거였나?
 
 
split -b 500m tomcat_A.2022-05-XX.log tomcat_Apart_
 
 그래서 노트패드++로 열어볼려고 용량 상한선에 맞게 500메가바이트씩 잘랐습니다.(8.3.3 기준)
분할된 파일중 하나를 열어 '현재에서 모두찾기'를 하니깐...
아니 대체 왜?
 tomcat_crop.txt는 비교도 안 될 검색 결과 갯수를 보고 어느 단계에서 오류가 있던것인가로 머리속이 멈출... 뻔했는데 다행히 멈추지는 않고 감속정도?
"검색 결과가 이상해, 리눅스 명령어와 노트패드++중 하나가 나를 속이는거 아닌가?
설마?"
 
grep '도큐먼트_컬럼명' tomcat_Apart_* > tomcat_Agrep.txt
약 10KB 2개, 7KB 1개.
이게 무슨 현상이지?
 
 

뻥쟁이가 누군지는 상관없고, 추출 좀 하게 해줘.
 
 일단 로그파일 원본으로 grep를 해서는 정상적인 추출이 안 되는거 같으니 조금 번거롭더라도 파일 분할과 grep 결과 저장을 해결해봐야겠군요. 그래도 굳이 임시 코드 안 짜도 되는거 어디입니까?
 그리고 파일 분할시 용량 기준으로 자르는건 한줄내로 찍힌 JSON가 중간에 잘릴수도 있어 다른 옵션을 써야겠죠?
 
 
wc -l tomcat_A.2022-05-XX.log
wc -l tomcat_B.2022-05-XX.log
wc -l tomcat_C.2022-05-XX.log
전체 용량이랑 노트패드 용량 제한상 일단 약 3등분이 될 라인수로 해봤습니다.
 
 
split -l 100000 tomcat_A.2022-05-XX.log tomcat_Apart_
grep '도큐먼트_컬럼명' tomcat_Apart_* > tomcat_Agrep.txt
 
그리고 '현재에서 모두찾기'로 나오는 결과 갯수들... 아까보다 늘었났어?
 
 설마? [split -l]에서 라인수를 줄일수록 노트패드에 열어둔 파일들에서 검색되는 결과 갯수가 늘어나서 10만에서 시작한 값은 결국 200까지 가고 100으로 시도해본 결과 더는 늘어나지 않더군요.
 
로그 파일 원본으로 직접 grep = 50개 미만
split&grep로 추출 = 약 5천개
 
???
 무슨 작용인지는 모르겠지만, 입력가능한 JSON입력값이니 일단 텍스트 파일 3개를 합쳐서 정규식으로 불필요한 부분 삭제후 DB에 마저 입력하는걸로 이슈 해결.
 
 

위기는 탈출했다. 그런데 그건 뭐였을까?
 
 
이슈는 해결됐으니 다행이죠.
그런데 말입니다. 그건 대체 무슨 원리였을까요?
 
아무튼 기초들은 언제나 사람을 살리는 치트키이자, 구명 보트입니다.
그리고 테이블에서 수동으로 빼거나 넣을때는 무조건 백업스크립트 실행하는거 잊지마세요.





1. 기초+이론


1) 특징

> JSON형태 구조(DOCUMENT)

> 데이터 입력시, objectId라는 필드가 자동생성되며 해당 컬럼에는 중복되지 않는 유일한 값이 들어간다.

: [_id]라는 필드로 존재하고, 12바이트짜리 16진수.

예. ObjectId(5d3d8f39f450a8969574d2e1) [16]

    1글자->1바이트(8비트)

               2진수 8칸(?)->16진수 2칸(?)이므로

5d3d8f39[16]

 f450a8[16]

 9695[16]

 74d2e1[16]

 타임스탬프, 4바이트

 머신 ID, 3바이트

 DB서버 Pid, 2바이트

 순차번호, 3바이트

> db에 입력되는 DOCUMENT 그룹을 collection이라고 부름.

: 동일한 collection에 다수의 데이터 입력가능.

> NoSQL이여서 불필요한 Join 최소화 가능+고정된 스키마X.






2. 설치


1) 필요한 파일

파일명

예시 경로

 MongoDB Community Server [#4.0.11]

 D:\dev_lib\mongodb4



2) 환경변수


3) 실행

-> 서비스 등록없이 예제 테스트만 하려는 목적이라 수동 실행입니다.

-> 총 2개의 프롬프트 창을 띄우게 됩니다.

D:\dev_lib\mongodb4\save 경로로 폴더 생성후 DB 저장 경로 지정+실행

1
2
3
4
5
6
7
8
9
10
11
12
13
D:\dev_lib\mongodb4\bin>mongod --dbpath "D:\dev_lib\mongodb4\save"
2019-07-28T20:48:03.680+0900 I CONTROL  [main] Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'
2019-07-28T20:48:03.683+0900 I CONTROL  [initandlisten] MongoDB starting : pid=13340 port=27017 dbpath=D:\dev_lib\mongodb4\save 64-bit host=ANALOG-GREEN
2019-07-28T20:48:03.683+0900 I CONTROL  [initandlisten] targetMinOS: Windows 7/Windows Server 2008 R2
2019-07-28T20:48:03.684+0900 I CONTROL  [initandlisten] db version v4.0.11
... ... ...
2019-07-28T20:48:03.686+0900 I CONTROL  [initandlisten] options: { storage: { dbPath: "D:\dev_lib\mongodb4\save" } }
... ... ...
2019-07-28T20:48:04.982+0900 I FTDC     [initandlisten] Initializing full-time diagnostic data capture with directory 'D:/dev_lib/mongodb4/save/diagnostic.data'
... ... ...
2019-07-28T20:48:05.338+0900 I INDEX    [LogicalSessionCacheRefresh]     building index using bulk method; build may temporarily use up to 500 megabytes of RAM
2019-07-28T20:48:05.346+0900 I INDEX    [LogicalSessionCacheRefresh] build index done.  scanned 0 total records. 0 secs
2019-07-28T20:48:05.346+0900 I COMMAND  [LogicalSessionCacheRefresh] command config.$cmd command: createIndexes { createIndexes: "system.sessions", indexes: [ { key: { lastUse: 1 }, name: "lsidTTLIndex", expireAfterSeconds: 1800 } ], $db: "config" } numYields:0 reslen:114 locks:{ Global: { acquireCount: { r: 2, w: 2 } }, Database: { acquireCount: { w: 2, W: 1 } }, Collection: { acquireCount: { w: 2 } } } storage:{} protocol:op_msg 361ms
cs


제 경우, [http://localhost:27017]로 접속시
[It looks like you are trying to access MongoDB over HTTP on the native driver port.]

라는 메시지가 브라우저에 출력됩니다.

프롬프트 창을 1개 더 띄워고서

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
D:\dev_lib\mongodb4\bin>mongo
MongoDB shell version v4.0.11
connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb
... ... ...
MongoDB server version: 4.0.11
Server has startup warnings:
2019-07-28T20:53:20.267+0900 I CONTROL  [initandlisten]
2019-07-28T20:53:20.267+0900 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2019-07-28T20:53:20.267+0900 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2019-07-28T20:53:20.267+0900 I CONTROL  [initandlisten]
2019-07-28T20:53:20.268+0900 I CONTROL  [initandlisten] ** WARNING: This server is bound to localhost.
2019-07-28T20:53:20.268+0900 I CONTROL  [initandlisten] **          Remote systems will be unable to connect to this server.
2019-07-28T20:53:20.268+0900 I CONTROL  [initandlisten] **          Start the server with --bind_ip <address> to specify which IP
2019-07-28T20:53:20.268+0900 I CONTROL  [initandlisten] **          addresses it should serve responses from, or with --bind_ip_all to
2019-07-28T20:53:20.268+0900 I CONTROL  [initandlisten] **          bind to all interfaces. If this behavior is desired, start the
2019-07-28T20:53:20.268+0900 I CONTROL  [initandlisten] **          server with --bind_ip 127.0.0.1 to disable this warning.
2019-07-28T20:53:20.268+0900 I CONTROL  [initandlisten]
---
Enable MongoDB's free cloud-based monitoring service, which will then receive and display
metrics about your deployment (disk utilization, CPU, operation statistics, etc).
The monitoring data will be available on a MongoDB website with a unique URL accessible to you
and anyone you share the URL with. MongoDB may use this information to make product
improvements and to suggest MongoDB products and deployment options to you.
To enable free monitoring, run the following command: db.enableFreeMonitoring()
To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---
>
cs






4. 예제


1) 기본 명령어

1
2
3
4
5
6
7
8
9
10
11
// INSERT.
> db.sampleCollec.insert(
... {
... date:"2019-07-28",
... writer:"MuTeukGi",
... title:"sample insert"
... }
... )
WriteResult({ "nInserted" : 1 })
> db.sampleCollec.find()
"_id" : ObjectId("5d3d8f39f450a8969574d2e1"), "date" : "2019-07-28""writer" : "MuTeukGi""title" : "sample insert" }
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// UPDATE.
> db.sampleCollec.insert(
... {
... date:"2019-07-28",
... writer:"MuTeukGi",
... title:"sample 2",
... tag:"data 2"
... }
... )
WriteResult({ "nInserted" : 1 })
> db.sampleCollec.find()
"_id" : ObjectId("5d3d8f39f450a8969574d2e1"), "date" : "2019-07-28""writer" : "MuTeukGi""title" : "sample insert" }
"_id" : ObjectId("5d3d9325f450a8969574d2e2"), "date" : "2019-07-28""writer" : "MuTeukGi""title" : "sample 2""tag" : "data 2" }
> db.sampleCollec.update(
... {title:"sample 2"},  //조건문.(in SQL, where)
... {$set: {ver:1}} //update 쿼리문
... )
WriteResult({ "nMatched" : 1"nUpserted" : 0"nModified" : 1 })
> db.sampleCollec.find()
"_id" : ObjectId("5d3d8f39f450a8969574d2e1"), "date" : "2019-07-28""writer" : "MuTeukGi""title" : "sample insert" }
"_id" : ObjectId("5d3d9325f450a8969574d2e2"), "date" : "2019-07-28""writer" : "MuTeukGi""title" : "sample 2""tag" : "data 2""ver" : 1 }
cs


dynamoDB와 달리 update시, 조건문을 이용해서 N개의 아이템에서 특정 컬럼값만 수정되게 지정이 가능하고,

$set, $pull등 특정 컬럼값 수정에 대한 처리가 가능.






기타. 참조자료


01. MongoDB(몽고디비) Study - NoSQL 이란? 그리고 MongoDB 소개

[MongoDB] 강좌 1편: 소개, 설치 및 데이터 모델링 | VELOPERT.LOG


조대협의 블로그 :: MongoDB 30분만에 이해하기.. (설치,테스트 및 자바 샘플)

[mongoDB] mongoDB 설치하기 / 환경설정 - windows - DWFOX

몽고디비 윈도우 설치 (zip 파일) : 네이버 블로그


MongoDB CRUD Operations — MongoDB Manual

[MongoDB] 강좌 5편 Document 수정 – update() 메소드 | VELOPERT.LOG






기타. 변경이력


일자

변경이력

2019-07-28

 초안.



* 기존의 'Java SE 설치 & 경로지정'등을 변형해서 사용중인 방식입니다.

* 윈도우10 기준입니다.


적용대상

> JDK

> Python

> 아파치 톰캣

> NDK

등등. 언어용 개발킷 및 각종 설치형 개발도구






변수명

예시

 DEV_LANG

 C:\Java\jdk1.8.0_111\bin;C:\Python

 DEV_TOOL

 D:\dev_lib\apache_tomcat_9;D:\dev_lib\mysql_winx64\bin;D:\TortoiseSVN\bin;D:\dev_lib\android_ndk

 Path  //기존변수, 삭제금지

 %DEV_LANG%와 %DEV_TOOL%추가




'프로그래밍note > 미분류.' 카테고리의 다른 글

리눅스: grep 함정과 임기응변  (0) 2022.05.21
NoSql: MongoDB 기초  (0) 2019.07.28
개발용 환경변수 설정(Path 설정)  (0) 2017.03.30
UML: 다이어그램 기초 및 툴  (0) 2017.03.30
게임 수학&물리 (1)  (0) 2016.04.29
어셈블리 기초 PDF  (0) 2015.11.18






1. UML이란?


1) 개요

> 통합 모델링 언어(UML, 영어: Unified Modeling Language)

> SW 산출물을 시각적으로 문서화 하는데 사용된다.



2) UML 다이어그램 종류

 클래스 다이어그램

 UML 2 Class Diagram Guidelines

> 클래스 라벨

 <<Interface>>

 <<type>>

 <<implementation>>

 <<utillity>>

 <<metaclass>>

> 내부 표기사항

 + It is public func/var

 # It is protected func/var

 - It is private func/var

 ~ package_name

> 화살표 기호(일부)

 부모/슈퍼클래스◁── 자식클래스

 요청하는_클래스 → 요청받는_클래스 // '관계명' 방식이 좀더 식별성이 좋을지도?

                 전체◇──구성원

> [#참조. 클래스 다이어그램 : 네이버 블로그]

 액티비티 다이어그램

 UML 2 Activity Diagramming Guidelines

> 계층 혹은 레이어별 영역을 정한 다이어그램

 시퀀스 다이어그램

 UML 2 Sequence Diagramming Guidelines

 컴포넌트 다이어그램

 UML 2 Component Diagramming Guidelines

 디플로이먼트 다이어그램

 UML 2 Deployment Diagramming Guidelines

> 시스템 구성원들이 연결된걸 표시한 구조도

 상태 머신 다이어그램

 UML 2 State Machine Diagramming Guidelines
> 선택지에 따른 흐름도랑 비슷
 유즈 케이스 다이어그램 UML 2 Use Case Diagramming Guidelines
> 사용자 기준으로 시스템내 행동들을 기호화 및 정리
 기타.

 UML 2 Communication Diagramming Guidelines
 UML 2 Composite Structure Diagram
 UML 2 Interaction Overview Diagram
 UML 2 Object Diagrams: An Agile Introduction
 UML 2 Package Diagrams: An Agile Introduction
 UML 2 Timing Diagrams: An Agile Introduction






2. 툴


1) 파피루스(Papyrus) [#]

> 이클립스 플러그인으로 유명

코드 보관함: [Eclipse] 이클립스 Papyrus(파피루스)를 이용해서 UML 다이어그램 그리기

Papyrus User Guide - Eclipsepedia



2) UMLet [#]

> 스탠드얼론/이클립스 플러그인 버전 제공

> 몇몇 화살표 기호가 없지만, 소스분석하면서 클래스 다이어그램으로 메모해두는게 용이.



3) WebSequenceDiagrams [#]

> 웹기반 툴

> 시퀀스 다이어그램에 적합.



4) ObjectAid [#]

> 이클립스 플러그인으로만 제공 / Java만 가능.

> 클래스 다이어그램은 무료이고, 시퀀스 다이어그램은 유료라고 한다.






기타. 참조자료


통합 모델링 언어 - 위키백과, 우리 모두의 백과사전

Introduction to the Diagrams of UML 2.X


Design - 좋은 UML 툴 추천






기타. 변경이력


일자

변경이력

2017-03-30

 초안

'프로그래밍note > 미분류.' 카테고리의 다른 글

NoSql: MongoDB 기초  (0) 2019.07.28
개발용 환경변수 설정(Path 설정)  (0) 2017.03.30
UML: 다이어그램 기초 및 툴  (0) 2017.03.30
게임 수학&물리 (1)  (0) 2016.04.29
어셈블리 기초 PDF  (0) 2015.11.18
이클립스: 사용중인 플러그인  (0) 2015.04.15

해당 포스팅은 '까먹은거 다시 하기'가 목적이며 아래의 목차내에서만 다루겠습니다.

포스팅상 다루지 못하는 파트의 경우,

구현상 필요할때마다 찾아서 쓰는게 효율적이라 생각되어 생략했습니다.


수학

물리

1. 방정식: 1, 2, 3차

2. 직선

3. 원&구

4. 선형대수

  > 행렬&행렬식&역행렬

  > 벡터

5. 미적분

  > 삼각함수 미분

  > 적분, 적분을 이용한 넓이와 부피

1. 속도와 가속도

2. 운동의 법칙

3. 운동량과 충격량

4. 일과 에너지


* 포물선은 내용상 물리에서 종합적으로 정리






1. 방정식


1) 1차 방정식

Ax+B=0  [A!=0]

> 직선

> (A/B)x=0으로 기울기 구하는데 쓰임. [이하, 기울기 M]

> 두 직선이 직교(수직으로 겹치는거)할 경우, 두 직선의 M을 곱했을때 -1

  예. (B/A) * (-A/B) = -1




2) 2차 방정식

Ax^2+Bx+C=0  [A!=0]


① 근의 공식 만들기






상수를 우변으로 넘긴후,

좌변에서 2차의 상수를 없애고,

좌변을 완전제곱으로 만듭니다.


제곱을 ^(1/2)시켰기 때문에 우변에 ±가 붙습니다.


짝수 공식의 경우, [B=2k]등으로 대입시키면 공식의 표현이 좀더 간결해집니다.














② 근을 이용한 계수의 관계

x의 근이 α와 β로 정의시,


2차 함수 그래프

  예: (X+1)(X-2)


 Ax^2+Bx+C는 포물선형 그래프가 된다.

> A>0, 포물선이 아래로 막힘.(=최소값 존재)

> A<0, 포물선이 위로 막힘.(=최대값 존재)

-> 연상법. 바닥이 둥근 컵에 물을 채우는데,

   물을 담으면(+) 컵을 세운거고, 물을 쏟으면(-) 컵을 엎은것.


 근의 갯수만큼 X축과 겹친다.

> 2개: (x+α)(x+β)

        B^2 - 4AC > 0

> 1개: Ax(x+α)

        B^2 - 4AC = 0

> 0개: Ax^2+C

        B^2 - 4AC < 0



* 그래프 툴 #PAGE

 



3) 3차 방정식

Ax^3+Bx^2+Cx+D=0  [A!=0]


① 3차 함수 그래프

 X축과 접하는 갯수 == 근의 갯수

 



4) 활용, 충돌체크

-> 두 직선이 만나는가?

    Ax+B=0, A'x+B'=0

    Ax+B = A'x+B'

    (A-A')x = B'-B 






2. 직선


1) 점과 직선

① 두 점 사이의 거리

-> A(x1, y1), B(x2, y2)

    { (x1-x2)^2+(y1-y2)^2 }^(1/2)

1
2
3
4
5
6
7
8
import math;
 
def PrintDistance(pt_a, pt_b):
    result = math.sqrt( math.pow(pt_a[0]-pt_b[0], 2+ math.pow(pt_a[1]-pt_b[1], 2) );
    print result;
    pass;
 
PrintDistance([20,16], [49]);
cs


② 두 직선 관계성

 

평행

일치

수직

표준형

  y = mx + a  // m이 기울기

  y = m'x + b // m'이 기울기

m = m'

 b

m = m'

a = b

m * m' = -1

일반형

  ax+by+c=0

  a'x+b'y+d=0

a/a' = b/b' ≠ c/c'

a/a' = b/b' = c/c'

a*a' + b*b' = 0

연립 방정식 근의 갯수

X

 ∞

1

> 수직이 되는 두 직선의 유형중, 접선과 법선도 있다.


2) 점과 직선 사이의 거리

-> [#참조]   [#증명]

-> 점과 평면의 경우, 해당 공식을 3차원으로 늘려서 사용하면 가능.

P(x1, y1)

직선 ax2+by2+c = 0

① 수선(점과 직선이 수직으로 만나는) 방정식

-> y - y1 = (x-x1) * {(y2-y1)/(x2-x1)}

② 직선과 교점의 좌표

③ A와 B의 거리


1
2
3
4
5
6
7
8
9
10
11
12
13
def PointToLine(pt_a, line):
    result = pt_a[0]*line[0+ pt_a[1]*line[1+ line[2];# aX+bY+c
    
    if result < 0:
        result *= -1;
        pass;
    
    result /= math.sqrt( math.pow(pt_a[0], 2+ math.pow(pt_a[1], 2) );
    
    print result ;
    pass;
 
PointToLine([0-1], [3-21]);#example
cs






3. 원&구


1) 원의 방정식

-> (평면기준) 중심점(a, b)에서 일정한 거리(반지름r)에 있는 점들의 연속.

① 표준형: (x-a)^2+(y-b)^2 = r^2

② 일반형: x^2+y^2+Ax+By+C = 0



2) 거리관계

① 두원의 위치관계

 * 두 원의 반지름은 각각 r, r' [단, r>r'] / 원의 중심점사이의 거리=d

d > r+r'   두 원은 접점이 전혀 없다. (충돌X)

d = r+r'   (접점이 1개인) 외접.

r-r < d < r+r'   두 원의 접점이 2개.

d = r-r'    (접점이 1개인) 내접.   //작은 원이 큰원 속에 포함.

d < r-r'   //작은원이 큰원 내부

② 공통 접선의 거리

 * 원의 중심점사이의 거리=d

공통외접선 l: (d^2 - (r-r')^2)^(1/2)

공통내접선 l: (d^2 - (r+r')^2)^(1/2)

③ 원과 접선

 * 원밖의 점(a,b)

접선의 방정식

  y-b = m(x-a)


*활용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import math;
 
def GetCollision(circle1, circle2):
    distance = math.sqrt( math.pow(circle1[0]-circle2[0], 2+ math.pow(circle1[1]-circle2[1], 2) );
 
    if circle1[2]<circle2[2]:#반지름 길이에 따른 추가처리
        tmp = circle2[2];
        circle2[2= circle1[2];
        circle1[2= tmp;
        pass;
 
    if distance <= (circle1[2- circle2[2]):
        print "It's a bullet hole. remove bullet";
        pass;
    elif distance > (circle1[2+ circle2[2]):
        print "NOT Collision";
        pass;
    elif distance==(circle1[2+ circle2[2]):
        print "light scratch";
        pass;
    elif distance < (circle1[2+ circle2[2]):
        print "deep scratch";
        pass;
    pass;#    END. GetCollision
 
GetCollision([002], [3-42]);#NOT Collision
GetCollision([002], [3-43]);#light scratch
GetCollision([002], [3-44]);#deep scratch
GetCollision([002], [3-410]);#It's a bullet hole. remove bullet
cs



3) 구의 방정식

① 표준형: (x-a)^2+(y-b)^2+(z-c)^2 = r^2

② 일반형: x^2+y^2+z^2 = r^2







1) 행렬

-> [#위키백과, 행렬]

① 행렬의 합/차

 합하려는 행렬들의 규격이 일치해야 한다.

 계산하려는 행렬의 순서를 바꿔도 계산에 지장X

 ② 행렬의 곱

 곱하려는 행렬들의 규격이 호환되어야 한다.(?)

-> 2*4행렬과 4*3행렬 [O]

    2*4행렬과 3*4행렬 [X]

 계산하려는 행렬의 순서를 바꿔도 계산에 지장O

 [#슈트라센 알고리즘, Strassen algorithm]

 ③ 항등행렬

 I로 표기되곤 한다.

 왼쪽 위->오른쪽 아래방향 대각선의 행렬원이 1이고 나머지가 0인 행렬.

 ④ 전치행렬[A^t]

 [#참조]
예. 4x2행렬 --(행렬의 전치)-->2x4행렬

-> (연상법)손바닥을 가로방향&엄지가y+방향일때 손바닥을 뒤집어 손등이 보이고 엄지가 x+방향이 되는 회전.



2) 행렬식

① 행렬식의 성질

* 한 행에만 N배를 하면, 행렬식의 값도 N가 된다.  [단, N차 정방행렬]

* 두행의 원소가 비례관계이면 행렬식은 0

* 특정행을 N배해서 다른행에 더해도 행렬식값이 변하지 않는다.

* |A| = |A 전치행렬|

* |A*B| = |B|*|A|


② 계산

-> '행렬을 인수분해' / '일반화된 N차 정방행렬'이 라는 표기로도 있다.

 * 2차원 행렬

 A = [[a, b],

        [c, d]] 일때, 

 │A│ = Det(A) = ad-bc

 * 3차원(이상) 행렬

-> laplace전개 활용

 A = [[a, b, c],

        [d, e, f],

        [g, h, i]] 일때, 2가지 방법으로 구할수 있으나 공식으로는 동일하다.

 Det(A) = a(ei-fh) - b(di-fg) + c(dh-eg)

-> [#참조링크]



3) 행렬 연산

-> [#참조, 가우스 소거법]

-> 행렬식 값이 0이면 역행렬은 존재X

->  [#참조, 역행렬의 성질]


① 2차원 행렬, 역행렬

-> 역대각선(우측상단에서 좌측하단)기준으로 뒤집고, 대각선 행렬원소는 *=-1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import math;
 
def InverseMatrix_2D(matrix):
    tmp = 1.0/(matrix[0][0]*matrix[1][1- matrix[0][1]*matrix[1][0]);
    print tmp;#(1/행렬식의 값)
    if tmp==0:
        print "Inverse matrix isn't exist."
        return;
        pass;
 
    tmp2 = matrix[0][0];
    matrix[0][0= matrix[1][1];
    matrix[1][1= tmp2;
    matrix[0][1*= -1;
    matrix[1][0*= -1;
 
    for row in range(02):
        for col in range(02):
            matrix[row][col] *= tmp;
            pass;
        pass;
    
    print matrix;
    pass;
 
matrix = [[3040], [-20-10]];
InverseMatrix_2D(matrix);
cs


② 3차원 행렬, 역행렬

-> 1/│A│ * adj(A)

-> [#계산법]

-> [#참조 링크]


행렬의 계수

* 성질

-> 전치행렬화 해도 계수는 동일

-> 두행을 바꾸어도 동일한 계수

-> 특정행만 N배해도 계수는 동일 [단, N은 0이 아님]

-> 특정행을 N배해서 다른행에 더해도 계수는 동일

-> 0으로만 구성된 행은 추가/제거해도 계수는 동일


④ 1차 연립방정식과 계수

-> 행렬A와 B의 계수값에 따라 연립방정식 근의 갯수가 달라진다.



5) 벡터

① 벡터의 성질

-> [#참조링크]


② 연산

 합

 →     →     →

 AB + BC = AC

* 3단 논법과 같은 흐름.

  A에서 B로 이동, B에서 C로 이동.

  결론. A에서 C로 이동했다.

 차

 →    →     →

 AC - AB = BC

 →      →      →

 AC +(-AB) = BC  //벡터는 방향과 크기를 나타내는거라서


 →     →     →

 AC + BA = BC  //벡터의 성질상 합&차는 순서를 바꿔도 계산에 지장X 


③ 벡터의 성분

 평면벡터

 →              →

 a = (a1, a2), b = (b1, b2)

 →

 AB = (b1-a1, b2-a2)  //성분

  →

 |AB| = {(b1-a1)^2 + (b2-a2)^2}^(1/2)  //크기

 공간벡터

 →

 a = (a1, a2, a3)

 →

 |a| = {a1^2 + a2^2 + a3^2}^(1/2)

 방향코사인 [#참조링크]


④ 벡터의 내적

> 두 벡터의 내적은 스칼라다. (=크기값만 있다.)

 평면벡터의 내적

 →   →
 a  ·  b  = |a||b| * cosΘ   //여기서 cos각은 

 성분표시

 →              →

 a = (a1, a2), b = (b1, b2) 일때

 →   →
 a  ·  b  = (a1 * b1) + (a2 * b2)

 내적의 성질 교환법칙 가능
 분배법칙 가능
 결합법칙 가능
 벡터의 수직
 (영벡터가 아닌 두 벡터)
 →   →   →   →
 a ⊥ b,   a  ·  b = 0   // cos 90° == 0
 벡터의 평행
 (영벡터가 아닌 두 벡터)
 →       →
 a = k * b


⑤ 벡터의 외적

> 방향과 크기를 동시에 가짐.

> 벡터 a&b로 이루어지는 평면에 수직하는 벡터가 나온다.

Crossproduct.png
FAL, https://commons.wikimedia.org/w/index.php?curid=334210

 평면벡터의 외적

 →    →   →    →
 a  x  b = a  ∧  b = |a||b| * sinΘ

  →                  →

 a = (a1, a2, a3), b = (b1, b2, b3) 일때,

 a  x  b

 => │ a1  a2  a3 │

      │ b1  b2  b3│

      │ x    y    z  │

=> (x y z) = (a2*b3-a3*b2, a1*b3-a3*b1, a1*b2-a2*b1)


⑥ 기타

> 단위벡터: 크기가 1인 벡터, 방향만 계산할때 유용.

> 일반벡터(Normal Vector): [#참조링크]






5. 미적분


* 미분<->적분의 관계

> 구체를 일정한 칸으로 자르면 미분, 칸칸히 잘랐던 오브젝트를 다시 붙이면 적분.


1) 삼각함수

① 그래프

Sine cosine plot.svg
By Qualc1 - Self-made using gnuplot and Inkscape This image was created with gnuplot., CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=762177

Tangent.svg
By No machine-readable author provided. Ktims assumed (based on copyright claims). - No machine-readable source provided. Own work assumed (based on copyright claims)., 퍼블릭 도메인, https://commons.wikimedia.org/w/index.php?curid=649670

특수각

> sinΘ:   0°=0, 30°=1/2, 45°=√2/2, 60°=(√3)/2, 90°=1

> cosΘ:  0°=1, 30°=(√3)/2, 45°=√2/2, 60°=1/2, 90°=0

> tanΘ:   0°=1, 30°=1/(√3), 45°=1, 60°=√3, 90°=∞


* 상단의 그래프 기준으로 1/2π당 사분면 1 영역과 대응되므로 그에 맞춰 루프등을 시키면 계산 가능.


② 연산

 덧셈정리

sin(α+β) = sinα*cosβ + sinβ*cosα

sin(α-β) = sinα*cosβ - sinβ*cosα      //[0, π]기준으로 각도가 클수록 값이 커서

con(α+β) = cosα*cosβ - sinα*sinβ

con(α-β) = cosα*cosβ + sinαβ*sinβ   //[0, π]기준으로 각도가 클수록 값이 작아서

tan(α+β) = (tanα+tanβ)/(1-tanαtanβ)

tan(α-β) = (tanα-tanβ)/(1+tanαtanβ)

 삼각함수간 관계

tanΘ = (sinΘ)/conΘ

(sinΘ)^2+(cosΘ)^2 = 1

1 + (tanΘ)^2 = (secΘ)^2

1 + (cotΘ)^2 = (cosecΘ)^2

 배각의 공식

sin2α = 2sinα*cosβ

cos2α = (cosα)^2 - (sinα)^2

         = 2*(cosα)^2 - 1 = 1 - 2*(sinα)^2

tan2α = (2*tanα) / (1-(tanα)^2)


sin3α = 3sinα - 4(sinα)^3

cos3α = 4*(cosα)^3 - 3*cosα

tan3α = (3*tanα-(tanα)^3) / (1-3*(tanα)^2)

 그외.

 반각공식 [#참조링크]

 곱<->합,차 변환



2) 미분종류별 미분공식

* 함수 f(x)에서 도함수 f'(x)를 구하는것을 함수를 x에 대하여 미분한다고 한다.

-> 도함수 f'(x) == y' == dy/dx == d/dx f(x)


① 기본 미분법

 ※ 다항함수

 f(x) = c [c는 상수]이면, f'(x) = 0

 {cf(x)}' = cf'(x)

 {f(x) ± g(x)}' = f'(x) ± g'(x)

 {f(x) * g(x)}' = f'(x)*g(x) + f(x)*g'(x)

 f(x) = (ax+b)^n [n은 자연수]일때,

          f'(x) = (ax+b)' * (ax+b)^(n-1)


 분수

> y = f(x)/g(x)

      = f(x) * (g(x)^-1)

   y' = {f'(x)*(g(x)^-1) + -1 * f(x)g'(x)}*{g(x)}^2

      = {f'(x)*(g(x)^-1) - * f(x)g'(x)}*{g(x)}^2

② 삼각함수

(sinΘ)' = cosΘ

(cosΘ)' = -sinΘ

(tanΘ)' = (secΘ)^2

          = 1+(tanΘ)^2


(cosecΘ)' = (1/sinΘ)'

             = -(1/sinΘ)*cotΘ

(secΘ)' = (1/cosΘ)'

          = secΘ * tanΘ

(cotΘ)' = (1/tanΘ)'

          = -(cosecΘ)^2

 [#참조링크, 삼각함수의 미분]
③ 로그함수&지수함수

 (ln x)' = 1/x [단, x>0]  //로그 밑수가 e면 ln으로 표기

 (logax)' = 1/(x * ln a) [밑수a>0, a!=1, x>0]

   -> 참고로 logax = log x/log a  [밑수는 10으로 생략]

   -> logax = 1/logxa

   -> logax * logxc = logac

 {ln |f(x)|}' = f'(x) / f(x)


 (e^x)' = e^x

 (a^x)' = a^x * lna --> a^x  [단, a>0]

 {e^f(x)}' = {e^f(x)} * f'(x)

 {a^f(x)}' = {a^f(x)} * lna * f'(x)

④ 편미분

 함수에서 x나 y를 상수로 간주한채 미분한다.

 예.

-> f = ax^2 + bxy + cy^2일때,

    ∂/∂x f = 2ax + by + 0

    ∂/∂y f = 0 + bx + 2cy

⑤ 그외

 N계도함수(or 고계도함수)

> 함수를 N번 미분하는것이다.

예. y = ax^2 + bx + c

    y' = 2ax + b

    y'' = 2a //2계 도함수



3) 미분과 활용

① 속도와 가속도

위치 x=f(t)일때

> (위치)' = 속도

>             (속도)' = 가속도


② 함수관련

 증가와 감수

 증가함수

> f'(x) ≥ 0

> f'(x) > 0인 구간에서 증가함수


 감소함수

> f'(x) ≤ 0

> f'(x) < 0인 구간에서 감소함수

 극대와 극소 극대/극소의 경우 f'(x) = 0인 값을 활용.

 평균값의 정리

 [#참조링크, 롤의 정리]

 [#참조링크, 평균값 정리]



4) 적분

① 부정적분

 ∫f(x) dx = F(x) + c

② 정적분

\int_{a}^{b} f(x)dx=\lim_{n \to \infty}  \sum_{k=1}^{n}f(x_k) \Delta x \quad \left( x_{k} = a + k \Delta x,\ \Delta x =\frac {b-a} {n} \right)

[#출처: 위키백과, 적분]


 미분된 함수 f(x)를 폐구간[a, b]를 기준으로 계산

 F(b) - F(a)

③ 2중 적분

 적분을 2중으로 계산하는것.

④ 활용법

 넓이와 부피






기타. 참조자료


WINNER 교육전략


[아꿈사] 게임 기초 수학 물리 1,2장

게임 프로그래머를 위한 기초 수학 및 물리 - [#8장][#9장]


게임 개발 포에버 :: Box2D Lite 소개 (물리엔진 공부의 좋은 시작)

게임에서 사용할 수 있는 포물선 운동

PC Assembly Language

> 한국어판 PDF 무료제공


초보자들을 위한 어셈블리어 기초

> 1편, 2편

> 앞서 소개한 drpaulcarter.com쪽을 참조해서 정리된 자료라고 한다.

     


 Eclipse Marketplace 공식페이지에서 카테고리별로 더 찾아볼수 있습니다.






1. 에디터 관련


플러그인 명

기타사항.

 Eclipse CDT

 VS 프로젝트를 이클립스 CDT로 포팅[#]이 가능하긴 하나, 다이렉트X는 안 되는듯.

 PyDev

 이클립스기반 파이썬 개발 플러그인중 비교적 무난함.




2. 개발 보조툴 관련


플러그인 명

기타사항.

 Android Development Tools(ADT)

 안드로이드 개발 필수 플러그인


* SVN이나 DB관련 플러그인도 쓰긴 했지만,

연동된 개발 라이브러리가 늘어나거나 프로젝트가 복잡해질수록 이클립스 속도가 느려지기 때문에

가급적 별도의 설치버전이 낫다고 봅니다.




3. UI 및 테마 관련


플러그인 명

기타사항.

 Eclipse Color Themes [#1] [#2]

 프로젝트 view까지 배경색상이 적용됩니다.

 Eclipse Moonrise UI Theme 0.8.9

 제공하는 테마가 다양한 종합패키지격.






기타. 변경이력


일자

변경이력

2015-04-15

 초안.







0. 필요한 파일

파일명

예시 경로

 가상머신

 [#vmPlayer6_다운로드]

 C:\Program Files\VMware\VMware Player

 android-x86 iso

 [#다운로드]

 (해당사항 없음)







1. 안드로이드 설치







참고자료.


Install Android on PC through vmware player - YouTube

Installing Android x86 4.0 in Vmware Player | WWWalter






기타. 변경이력


일자

변경이력

2014-11-23

 초안



* 특정 언어 혹은 주제/다수의 언어등 취급인지와 국내권/해외권으로 크게 4가지로 나눴습니다.

* ABC 순서입니다.






1. 단일, 국내


C# 프로그래밍 배우기 (Learn C# Programming)

-> C#만 파고드는 강좌 사이트.

-> 샘플코드나 설명문들을 보면 가독성에 제법 신경쓴것 같다.



Data Structures and Algorithms

-> 성공회대 자료구조와 알고리즘

-> 초안 작성 시점에서 접속이 원활치 못함.



'파이썬 프로그래밍 연습' 웹 자습서

-> 파이썬(2.3)기준



Lectures on Game Programming

-> 다이렉트X 9.0

-> 해당 사이트의 샘플코드들은 directx sdk 2010 jun 기준으로 테스트가 됐다고 한다.

-> 메인페이지는 해외권 자료같지만, 사실은 국내권.






2. 복함, 국내권


안드로이드, 유니티 게임만들기 :: 네이버 블로그

-> 순수 안드로이드 API: 2D 슈팅게임 예제

-> 유티니3D: 슈팅 게임을 이용한 예제


SoEn:소프트웨어 공학 연구소

-> 과거 'Win32 API 연구사이트'였던곳. 사이트내 컨텐츠는 동일하고 도메인만 바뀜.

-> 윈도우즈 API정복 저자 & 안드로이드 프로그래밍 정복등의 기술서적 저자가 운영한다.

-> C, C++

-> Win32 API

-> 안드로이드

-> 닷넷


기타, 추천자료

> 알고리즘 사이트 총정리 : 네이버 블로그

一生牛步行 :: 알고리즘 학습 사이트 및 서적 모음






3. 단일, 해외권


Program Arcade Games With Python And Pygame

-> 파이썬(3.x) & pyGame기반.


Unity - Learn - Modules

-> 유니티 공식 홈페이지에서 제공하는 튜토리얼 영상


Unity - Scripting

-> 유니티3D


visualgo

-> 각종 알고리즘을 시각한 자료실.

-> 알고리즘이 실행될때마다 코드와 시행화면을 동시에 보여주기때문에

알고리즘 개념을 잡는데 유용






4. 복합, 해외권


Code School

-> Ruby

-> 자바스크립트, jQuery, node.js

-> HTML, CSS, HTML5

-> iOS: objective-c, xcode

-> 기타: Electives


GDN

-> 복합 튜토리얼

-> 비디오 튜토리얼

-> 유니티2D튜토리얼


Danim Studios - www.Danim3D.com

-> 3D 및 모델링

-> 유니티3D 샘플 프로젝트






기타. 변경이력


일자

변경이력

2014-06-28

 초안

2014-10-02

 Danim Studios - www.Danim3D.com 추가

2015-01-22

 visualgo 추가

2015-03-18

 Unity - Learn - Modules 추가.


  1. Favicon of https://zenwriting.net/tankertaste31/pigsa-bei-eiteuwa-gateun-saiteureul-eodne.. BlogIcon medic_dmz 2020.11.19 00:05

    도움되는 글 잘 보고 가용~

+ Recent posts