Archive for Google계열

[Android App] 내손의음력이 플레이스토어에 등록되었습니다.

스크린샷 2014-07-29 16.41.47

https://play.google.com/store/apps/details?id=com.tegine.myhandmooncal

구) 넥서스 7 에서 테스트 하였습니다. 갤럭시 노트 2에서는 조금 짤립니다.

기능은 다른 여타 달력 앱에서 필요 없는 부분 쏙 빼고.. 핵심만 디지털 화 했습니다.

그리고 손없는 날과, 물때, 음력에 해당하는 달 모양을 보여 줍니다.

기록란에는 깨알같은 만든이(저)의 메세지도 나옵니다. 하하하…

반드시는 아니지만 바다로 놀러 가실때라던가.. 음력이 뭔가? 하신 분들은 깔아 보세요.. ㅎㅎ

계속 수정하고 버젼업 할 겁니다. 하하하~ ^^

========================================================================

皆さん…
今太陰暦が必要ですか?
ここに…
デスクトップアプリが出ました。
ただ実行するだけです。
月のイメージと潮の干満の時も分かります.

 

 

[안드로이드] 이클립스에서 AndroidManifest.xml 파일문제

아 참내… 살다 보니 참 별별 문제를 다 만나 봅니다.

“androidmanifest.xml file missing”

이라는 문제인데요.. 분명 프로젝트 안에 androidmanifest.xml은 있는데 말이죠….

전에 분명이 되던 플젝인데.. 좀 뭐가 꼬여서 폴더 지우고,

SVN에서 다시 받은 것 받에 없는데…

아!!! 여기서 힌트를 얻었습니다.

저는 SVN에 커밋할 때 /bin 폴더는 제외했었거든요.

이클립스 IDE 안의  프로젝트 익스플로러에서 걍 root 부분에 있는 androidmanifest.xml 파일을 선택하고 CTRL+C

/bin 폴더를 선택해 주고 CTRL+V 해주었습니다.

그리고 빌드 해보니 올라가네요… 아오…

이거 몰라서 플젝 날리고 다시 만드는 삽질 할 뻔 했네요.. ㅋㅋ 이럴땐 좀 느낌 직감이 좋네요. ㅋㅋㅋㅋ

이상입니다.

=====================================================================

“androidmanifest.xml file missing”

1.选择在Eclipse中的文件 (androidmanifest.xml) -> 复制

2. 选择bin文件夹 ->贴

=====================================================================

“androidmanifest.xml file missing” 時に。。。

プロジェクトrootフォルダがありandroidManifast.xmlファイルが存在し、
/ binフォルダにandroidManifast.xmlファイルがない場合は…コピーして入れて、ビルドしましょう。

=====================================================================

 

 

 

[안드로이드이야기] 이클립스->안드로이드 스튜디오 [빡세요. ㅠㅠ]

우선

http://stackoverflow.com/questions/21464320/android-studio-release-apk-for-flavor

요글 답변자 절라 땡큐!!!! 니가 날 살려다으리…. (엥??)

스크린샷 2014-05-20 오전 2.34.42

 

전에 이클립스로 만들어 두었던 것을 테스트 삼아 안드로이드 스튜디오로 옮겨 보자….

라는 아주아주 무식한 생각을 하고 삽질을 시작하였다… 드뎌 3일만에 가까스로 코드 다 옮기고, apk 도 만들기 완성…

그러나 ap스크린샷 2014-05-20 오전 2.39.17

요지랄 

요러면서 나의 apk 앞크를 뱉는게 아니곘소… ㅠㅠ 허허.. 황당 하더이다…

왜이러지? 이러면서 진짜 거짓말 좀 보태서…  수 십번 빌드 하고 나서 검색 해봐야 겠다하고…

맨위의 주소를 발견 아오…

빌드 설정을 잡아주는 메뉴를 찾았다는 것이 요 입니다.

역시 도구를 다룰때는 책 (혹은 참고서)을 읽어야 하는 체질인가 봅니다.

응용이 안되네으리.

인터넷 검색으로 악명 높은 안드로이드 스튜디오에서 앞크 릴리즈 해보기 성공~ ^^ 입니당. ㅋㅋ

라고 바로 쓰고 싶었으나… (이런 댄장 안되잖아… 성질나 껐다 켜자…. )

된다.. 된다…. 역시 컴퓨터는 리셋이 제맛

 

끝!!!!! ^^ 입니다. 이제 두발 뻗고 잘수 있을 듯 하네요.

[Google SpreadSheet + Objective-C] CSV 파싱후 데이터 밀어넣기

제목 그대로 입니다.

CSV로 관리하고 있는 파일 내용을 1달에 1번씩 집계와 데이터 보존을 위해 구글 스프레드 시트를

이용할 경우에 유용한 팁 입니다.

한달분량의 전 사원 출퇴근 분량이라면, 꽤나 나오겠지요…

 

소스는 걍 일부만 공개 합니다.

실은 DataVO 말고 이게 전부죠… ㅠㅠ 예민한 정보는 대충 얼버무린 String으로 대체 함을 이해해 주세요.

스크린샷 2014-01-19 오후 6.21.38

로드 버튼은 CSV 파싱후 데이터 객체화 까지 이고,

송신은 그 정보를  POST 로 구글에 쏩니다.

//

//  AppDelegate.m

//  CSVImporter

//

//  Created by 한인택 on 2014. 1. 17..

//  Copyright (c) 2014년 wellsystem. All rights reserved.

//

 

#import “AppDelegate.h”

#import “DataVO.h”

 

@interface AppDelegate ()

@property (weak) IBOutlet NSButton *mLoadButton;

@property (weak) IBOutlet NSButton *mSendButton;

@property (strong, retain) NSString *loadFilePath;

@property (weak) IBOutlet NSTextField *statusLabel;

@property (nonatomic, retain) NSMutableArray *csvVOArr;

@property (nonatomic, retain) NSMutableArray *csvVOArr2;

@end

@implementation AppDelegate {

BOOL isRequest;

NSTextField *_statusLabel;

__weak NSButton *_mLoadButton;

__weak NSButton *_mSendButton;

NSURLConnection *conn;

NSMutableData *_responseData;

int datasResponse;

}

@synthesize loadFilePath;

@synthesize statusLabel;

@synthesize csvVOArr;

@synthesize csvVOArr2;

 

int MAX_COUNT = 14;

 

– (void)applicationDidFinishLaunching:(NSNotification *)aNotification

{

isRequest = false;

[_mSendButton setEnabled:NO];

}

– (IBAction)mLoadButtonClick:(id)sender {

csvVOArr = [[NSMutableArray alloc] initWithCapacity:0];

csvVOArr2 = [[NSMutableArray alloc] initWithCapacity:0];

NSArray *fname = openFiles();

for (NSString *item in fname) {

NSLog(@”%@”,item);

loadFilePath = item;

}

NSString *dataStr = [NSString stringWithContentsOfFile:loadFilePath

encoding:NSUTF8StringEncoding error:nil];

NSArray *array = [dataStr componentsSeparatedByString: @”,”];

 

int j=0;

NSMutableArray *temp;

for (int idx = 0; idx<[array count];idx++){

NSString *tempStr = [NSString stringWithFormat:@”%@”,array[idx]];

if (idx == 0){

temp = [[NSMutableArray alloc] initWithCapacity:0];

}

if (j<12){ // 같은 줄의 데이터를 모음.

[temp addObject:array[idx]];

}else{

NSArray *tempArr = [tempStr componentsSeparatedByString: @”\n”];

[temp addObject:tempArr[0]];

NSLog(@”count : %u _______ this[0] : %@”,[temp count],[temp objectAtIndex:0]);

[csvVOArr2 addObject:temp];

if (tempArr[1]){

temp = [[NSMutableArray alloc] initWithCapacity:0];

[temp addObject:tempArr[1]];

}

j=0;

}

j+=1;

}

 

//    NSLog(@”Check”);

//    for (int i=0;i<10;i++){

//        NSLog(@”array: %@”, [csvVOArr2[i] no]);

//    }

if (array.count >0) {

[self createVO];

}else{

csvVOArr = nil;

}

}

 

– (void) createVO{

//    NSMutableArray *arr = [[NSMutableArray alloc] initWithArray:csvVOArr2];

for (int i = 0;i < csvVOArr2.count;i++){

DataVO *dvo = [[DataVO alloc] initWithArray:[csvVOArr2 objectAtIndex:i]];

[csvVOArr addObject:dvo];

}

[_mSendButton setEnabled:YES];

_statusLabel.delegate = self;

[_statusLabel setStringValue:[NSString stringWithFormat:@”送信クーリク”]];

 

}

 

– (void) sendLogic {

NSURL *url = [NSURL URLWithString:@”https://docs.google.com/a/어쩌고 저쩌고.. 여러분의 계정…/forms/d/여러분의 아이디…../formResponse”];

int i=0;

for (i=0;i<csvVOArr.count;i++){

NSString *chul1 = [[csvVOArr objectAtIndex:i] no];

NSString *chul2 =[[csvVOArr objectAtIndex:i] dateData];

NSString *chul3 =[[csvVOArr objectAtIndex:i] opt3];

NSString *chul4 =[[csvVOArr objectAtIndex:i] opt4];

NSString *chul5 =[[csvVOArr objectAtIndex:i] inoutStatus];

NSString *chul6 =[[csvVOArr objectAtIndex:i] opt6];

NSString *chul7 =[[csvVOArr objectAtIndex:i] opt7];

NSString *chul8 =[[csvVOArr objectAtIndex:i] opt8];

NSString *chul9 =[[csvVOArr objectAtIndex:i] cardNo];

NSString *chul10 = [[csvVOArr objectAtIndex:i] opt10];

NSString *chul11 = [[csvVOArr objectAtIndex:i] cardRegNo];

NSString *chul12 =[[csvVOArr objectAtIndex:i] userID];

NSString *chul13 =[[csvVOArr objectAtIndex:i] opt13];

NSString *chul14 =[[csvVOArr objectAtIndex:i] opt14];

//데이터 셋 구성 entry.1626580426 등의 ID 를 알아내는 것이 핵심!!! [Chrome 의 요소분석 혹은 소스 보기.. 쿨럭]    , 집어넣을 데이터 컬럼 갯수 만큼 생성해야 하며, 한글등의 정보는 NSUTF8StringEncoding 이 필수 – 이 거때문에 필자는 몇시간을 삽질 하였다지요…. ㅠㅠㅠ]

NSDictionary *data=[[NSDictionary alloc] initWithObjectsAndKeys:

[chul1 stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],@”entry.1626580426″,

[chul2 stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],@”entry.5xxxxxxxx”,

[chul3 stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],@”entry.1xxxxxxxx”,

[chul4 stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],@”entry.7xxxxxxxx”,

[chul5 stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],@”entry.1xxxxxxxx”,

[chul6 stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],@”entry.2xxxxxxxx”,

[chul7 stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],@”entry.1xxxxxxxx”,

[chul8 stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],@”entry.1xxxxxxxx”,

[chul9 stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],@”entry.7xxxxxxxx”,

[chul10 stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],@”entry.1xxxxxxxx”,

[chul11 stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],@”entry.5xxxxxxxx”,

[chul12 stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],@”entry.3xxxxxxxx”,

[chul13 stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],@”entry.1xxxxxxxx”,

[chul14 stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],@”entry.1xxxxxxxx”,nil];

//===========

NSMutableArray * content = [NSMutableArray array];

for(NSString * key in data){

//NSLog(@”%@”,[NSString stringWithFormat: @”%@=%@”, key, data[key]]);

[content addObject: [NSString stringWithFormat: @”%@=%@”, key, data[key]]];

}

NSString * body = [content componentsJoinedByString: @”&”];

NSData * bodyData = [body dataUsingEncoding: NSUTF8StringEncoding];

NSMutableURLRequest * request =

[[NSMutableURLRequest alloc] initWithURL:url];

NSString * msgLength =

[NSString stringWithFormat: @”%ld”, (unsigned long)[bodyData length]];

[request

addValue: @”application/x-www-form-urlencoded; charset=utf-8″

forHTTPHeaderField: @”Content-Type”];

[request addValue: msgLength forHTTPHeaderField: @”Content-Length”];

[request setHTTPMethod: @”POST”];

[request setHTTPBody: bodyData];

//=====

//    if ( !isRequest ){

conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];

//        isRequest = true;

//    }

}

[self showMessage:@”CSVデータ転送を完了しました。” title:@” Completed….”];

[_statusLabel setStringValue:@””];

}

– (IBAction)mSendButtonClick:(id)sender { // POST, send data to google server

if (csvVOArr == nil){

return;

}

[self sendLogic];

}

 

 

 

static NSArray * openFiles()

{

NSArray *fileTypes = [NSArray arrayWithObjects:@”csv”,nil];

NSOpenPanel * panel = [NSOpenPanel openPanel];

[panel setAllowsMultipleSelection:NO];

[panel setCanChooseDirectories:NO];

[panel setCanChooseFiles:YES];

[panel setFloatingPanel:YES];

NSInteger result = [panel runModalForDirectory:NSHomeDirectory() file:nil

types:fileTypes];

if(result == NSOKButton)

{

return [panel URLs];

}

return nil;

}

 

– (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {

_responseData = [[NSMutableData alloc] init];

}

 

– (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {

// Append the new data to the instance variable you declared

[_responseData appendData:data];

}

 

– (NSCachedURLResponse *)connection:(NSURLConnection *)connection

willCacheResponse:(NSCachedURLResponse*)cachedResponse {

// Return nil to indicate not necessary to store a cached response for this connection

return nil;

}

 

– (void)connectionDidFinishLoading:(NSURLConnection *)connection {

// The request is complete and data has been received

// You can parse the stuff in your instance variable now

NSLog(@”CSVデータ転送を完了しました。”);

}

 

– (void) showMessage:(NSString*) kString1 title:(NSString*)title {

NSTextView *accessory = [[NSTextView alloc] initWithFrame:NSMakeRect(0,0,200,15)];

NSFont *font = [NSFont systemFontOfSize:[NSFont systemFontSize]];

NSDictionary *textAttributes = [NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName];

[accessory insertText:[[NSAttributedString alloc] initWithString:kString1

attributes:textAttributes]];

[accessory setEditable:NO];

[accessory setDrawsBackground:NO];

NSAlert *alert = [[NSAlert alloc] init];

[alert setMessageText:title];

[alert setInformativeText:@””];

[alert setAccessoryView:accessory];

[alert runModal];

}

 

– (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {

isRequest = false;

}

@end

 

====================================================================

 

이것이 대략적?? 인 소스 전체 입니다.

www.한인택.com에 파일로 올려 놓으려다가… 그냥 여기서 소스 공개로 마무리 할까 합니다. ㅋㅋㅋ

아 이제 Visual Studio로 c# 으로도 같은 작업 하는 프로그램을 제작해야 겠네요. ㅎ

이런 간단하고 간단한 유틸성 앱 만들기 좋아요..ㅋㅋㅋ

아참 어디 보면 Properties 단순 편집기 있을텐데 찾아봐야 겠습니다.

그럼 이만… 다음 post 까지 안녕히 계세용. 꾸뻑!

[script] 구글 양식 – 응답보기, 스프레드시트 자동 채우기

회사에서 업무가 어디 아이폰, 안드로이드에 국한된 업무만 올까요?

아니죠… 정말 이 시대를 살아가는 저희 IT쪽은 팔방미인을 넘는 팔백방미인(?)을 원하는 것 같네요.

각설하고…

경비를 기존 시스템에서 구글 서버로 옮기는 작업중에 양식을 만들어서 사원들의 답을 받아올 수 있다는 것을 알았네요. 매일 쓰는 구글이지만 안쓰면 모른다는… ㅜㅜ

아무튼 구글 양식으로 답을 받으면 아래 처럼 응답 양식 스프레드시트 회색음영부분 처럼 데이터가 삽입됩니다.

gc-1

 

흰색 부분을 자동으로 채우는 게 목표지요… ㅎㅎ

회색부분에서 값을 읽어서 기존에 미리 준비해둔 사원 주소록과 비교해서 매칭되는 값을 읽어오는 것입니다.

자 그럼 스크립트 에디터 부터 열어 볼까요?

 

gc-2

 

도구 > 스크립트 편집기를 선택합니다.

gc-3

 

원래는 행번호 1부터 인데 작업 해둔것이 있어서 처음 보이는 부분만 일단 노출시키려다 보니 15 부터 시작되네요.. 양해 부탁 드립니다.

여하튼….

기존에 데이터가 들어 있는 상황을 가정하고… (제가 삽질한 순서대로 기술 합니다.)

우선 구글링을 통해서,

https://developers.google.com/apps-script/guides/sheets

이 사이트 내에서 여러 함수들을 확인하고나서, 바로 들어갑니다.

sheet.getRange(9,5).setValue(sheet.getRange(8,5).getValue());

아래 그림을 보시면 아시겠지만 당장 위의 구문만을 설명하자면, 8,5==>E8 의 값을

E9에 셋팅하라는 뜻이지요…

저는 E8에 값이 아닌 식을 셋팅 했었지만, 위의 식은 단지 값을 복사하네요… 꽝입니다.

아… 그 전에… 어차피 같은 Row에 colume 이 다르지만 작업 내용은 윗줄 복사해 넣는 것임으로

반복할 필요없이 바로 for 들어 갔습니다. [ 이 함수는 빈칸 채운다 해서 fillEmptyCell 이라 명명 하였습니다.]

for ( var colume = 5;colume<12;colume++ ){

// sheet.getRange(9,colume).setValue(sheet.getRange(8,colume).getValue());

sheet.getRange(9,colume).setFormula(sheet.getRange(8,colume).getFormula());

}

후후… 헐 .. 역시나… 윗줄을 잘 복사해 오네요… 어라? 값이 이상합니다.

(캡쳐에는 없지만 금액을 틀리게 했었거든요. 그런데도 윗 줄과 완전 동일한 값이 나왔습니다.) ㅠㅠ

(뭔소리 냐면… =search(“@”,b8) 공식은 e9 에서는 =search(“@”,b9) 가 되어야 하는데…. e9 행에서도 =search(“@”,b8)로 입력이 되었다는 것이지요.. ㅜㅜㅜ)

이거 뭐죠? 헐…

그때 얼핏 자동완성에서 setFormulaR1C1을 본 기억이 났습니다.

에랏 모르겠다. 적용해 봅니다.

sheet.getRange(rIdx,colume).setFormulaR1C1(sheet.getRange(rIdx-1,colume).getFormulaR1C1());

그리고 어차피 빈칸 다 채워야 하므로, 마지막 행 값도 읽어와 봤습죠…

일단 로그를 찍어 보았습니다. (cmd+enter, 스크립트 편집화면 보기>로그)

Logger.log(rows.getLastRow());

여기서는 9.0 이겠군요. 잘 떴고요.

기왕 이렇게 된거 빈칸이 여러줄 생길지 어찌 알겠습니까?

row 도 for를 돌렸습니다.(rIdx)

그리고 초기화셋 위한 작업이라는 주석이 달린 것은 데이터가 하나도 없는 경우에 대비한 것입니다.

(오작동… 공란을 가져다 복사해 넣는다거나 하는 ㅜㅜㅜ)

sheet.getRange(“E2”).setFormular(“=search(\”@\”,B2)”);

이때 setFormular 는 setFormulaR1C1 아닙니다. 이것 때문에 몇시간을 날렸지요.. ㅜㅜ

gc-4

 

암튼 스크립트 언어들을 잘 다룬다는 것은 쉽지 않은 여정인 것 같네요.

휴~ 아무튼 두서없이 쓴 글을 읽어 주셔서 감사합니당.~ ^^

복 받으실 겁니다.

대박나세요… ㅎㅎ

이상입니다.

 

[구글] 구글 검색어- 흥미롭게 다뤄 보시지요 ㅎ

요기는 계속 업뎃 해보려 합니다. ^^

1차 : 2014년 1월 2일 헐 3일이구나… 자야겠다. ㅠ

URL : www.google.com/preferences > 설정
search > intitle:”index of” > 페이지 제목에서 검색
intitle:”index of” “backup files” –
intitle:”index of” index.php.bak
allintext:”hack” > 페이지 본문에서 검색
inurl:”tegine”
allinurl:”tegine”
site:tegine.net
filetype:pdf
inanchor:www.tegine.com > text 내에서 <a href= …”></a> 에서 검색
info:www.tegine.com
filetype:ini inurl:ws_ftp
filetype:xls + password
allinurl:admin mdb
inurl:/admin/login.asp
phpMyAddmin inurl:main.php
intitle:”Apache Tomecat” “Error Report”
“#Dumping data for table”
netcat download
inurl:sploits
“#include <stdio.h>” usage exploit

 

Dart-Box2d 가 벌써 포팅되어 나왔군요. ㅠㅠ

Dart 언어를 안지 몇일 안된 시점인데 검색하니 벌써 참으로 많은 것들이 되어 있었습니다.

https://github.com/dart-lang/dart-box2d

벌써 박스2d가 다트로 포팅되었네요 ㅎㄹ

http://japhr.blogspot.kr/2011/12/getting-started-with-dart-editor-and.html

여기도 참조할 만한 사이트 인것 같아서 정리차원에서 긁어 왔습니다.

 

[DART] Dart: Up and Running 스터디 해봐요. 4

안녕하세요~ 갑부인택입니다.

하하하… 지난 번까지는 완전 화면 스샷도 없고 이상한 글로만 도배해서 재미가 없었습니다.

네네 인정합니다.

그래서 이번에는 속죄양으로 webgl 을 이용한 뭐 간단한 도형들을 출력해 보려고요.

소스출처는 https://github.com/jtmcdole/dart-webgl 입니다.

github 가 열리는 데요. 거기서

스크린샷 2013-11-26 오전 5.28.31

Download ZIP 을 누르십니다. ㅋㅋ 우측 하단 보이시죠? ㅋㅋㅋㅋ

압축을 풀고 나서 DartEditor 에서

스크린샷 2013-11-26 오전 5.30.28

 

File > Open Existing Folder 를 선택하십니다. (사실 저는 다 아시겠지만 에디터의 좌측 창 (흰부분에서 우측클릭을 더 자주 이용 합니다.) 아 저 센스 없게 뒤에서 이미 결과가 캡쳐 되어 버렷군요. 네 맞습니다 저게 이번 강좌 내용중 결과 일부 입니다.

도형들 출력되면서 막막 돌아가요.. ㅋㅋㅋ

소스도 봐야 되는데 아 막 막 걱정되요. ㅋ

저는 참으로 이쁜걸 좋아합니다. 아… 286AT에서 Turbo-C 2.0띄워놓고 안녕하세요 Turbo-C 로 기억되는 책의 예제를 따라 친후.. 흑백화면에 하트가 떴을때의 그 기분… 캬….. 요걸 17년 지난 지금 또 느껴보려 하고 있네요.. ㅋㅋ 캬…

원래는 막막 화려하게 돌아가는 lesson 4를 보시죠 하고 싶었지만… ㅠㅠ 현실은 lesson 1 을 가져 오네요… ㅠㅠ

===========================================================================

// Copyright (c) 2013, John Thomas McDole.

/*

* Licensed under the Apache License, Version 2.0 (the “License”);

* you may not use this file except in compliance with the License.

* You may obtain a copy of the License at

*

*     http://www.apache.org/licenses/LICENSE-2.0

*

* Unless required by applicable law or agreed to in writing, software

* distributed under the License is distributed on an “AS IS” BASIS,

* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

* See the License for the specific language governing permissions and

* limitations under the License.

*/

part of learn_gl;  // 이거 좀 분량 되더라고요.. learn_gl의 일부래요.

 

/**

* Staticly draw a triangle and a square!

*/

class Lesson1 extends Lesson { // Lesson을 상속받네요.

GlProgram program; // GlProgram 클래스를 선언합니다.

 

Buffer triangleVertexPositionBuffer, squareVertexPositionBuffer;

 

Lesson1() {

program = new GlProgram(”’

precision mediump float;

 

void main(void) {

gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);

}

”’,”’

attribute vec3 aVertexPosition;

 

uniform mat4 uMVMatrix;

uniform mat4 uPMatrix;

 

void main(void) {

gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);

}

”’, [‘aVertexPosition’], [‘uMVMatrix’, ‘uPMatrix’]);

gl.useProgram(program.program);

 

// Allocate and build the two buffers we need to draw a triangle and box.

// createBuffer() asks the WebGL system to allocate some data for us

triangleVertexPositionBuffer = gl.createBuffer();

 

// bindBuffer() tells the WebGL system the target of future calls

gl.bindBuffer(ARRAY_BUFFER, triangleVertexPositionBuffer);

gl.bufferDataTyped(ARRAY_BUFFER, new Float32List.fromList([

0.0,  1.0,  0.0,

-1.0, -1.0,  0.0,

1.0, -1.0,  0.0

]), STATIC_DRAW);

 

squareVertexPositionBuffer = gl.createBuffer();

gl.bindBuffer(ARRAY_BUFFER, squareVertexPositionBuffer);

gl.bufferDataTyped(ARRAY_BUFFER, new Float32List.fromList([

1.0,  1.0,  0.0,

-1.0,  1.0,  0.0,

1.0, -1.0,  0.0,

-1.0, -1.0,  0.0

]), STATIC_DRAW);

 

// Specify the color to clear with (black with 100% alpha) and then enable

// depth testing.

gl.clearColor(0.0, 0.0, 0.0, 1.0);

}

 

void drawScene(num viewWidth, num viewHeight, num aspect) {

// Basic viewport setup and clearing of the screen

gl.viewport(0, 0, viewWidth, viewHeight);

gl.clear(COLOR_BUFFER_BIT | DEPTH_BUFFER_BIT);

gl.enable(DEPTH_TEST);

gl.disable(BLEND);

 

// Setup the perspective – you might be wondering why we do this every

// time, and that will become clear in much later lessons. Just know, you

// are not crazy for thinking of caching this.

pMatrix = Matrix4.perspective(45.0, aspect, 0.1, 100.0);

 

// First stash the current model view matrix before we start moving around.

mvPushMatrix();

 

mvMatrix.translate([-1.5, 0.0, -7.0]);

 

// Here’s that bindBuffer() again, as seen in the constructor

gl.bindBuffer(ARRAY_BUFFER, triangleVertexPositionBuffer);

// Set the vertex attribute to the size of each individual element (x,y,z)

gl.vertexAttribPointer(program.attributes[‘aVertexPosition’], 3, FLOAT, false, 0, 0);

setMatrixUniforms();

// Now draw 3 vertices

gl.drawArrays(TRIANGLES, 0, 3);

 

// Move 3 units to the right

mvMatrix.translate([3.0, 0.0, 0.0]);

 

// And get ready to draw the square just like we did the triangle…

gl.bindBuffer(ARRAY_BUFFER, squareVertexPositionBuffer);

gl.vertexAttribPointer(program.attributes[‘aVertexPosition’], 3, FLOAT, false, 0, 0);

setMatrixUniforms();

// Except now draw 2 triangles, re-using the vertices found in the buffer.

gl.drawArrays(TRIANGLE_STRIP, 0, 4);

 

// Finally, reset the matrix back to what it was before we moved around.

mvPopMatrix();

}

 

/**

* Write the matrix uniforms (model view matrix and perspective matrix) so

* WebGL knows what to do with them.

*/

setMatrixUniforms() {

gl.uniformMatrix4fv(program.uniforms[‘uPMatrix’], false, pMatrix.buf);

gl.uniformMatrix4fv(program.uniforms[‘uMVMatrix’], false, mvMatrix.buf);

}

 

void animate(num now) {

// We’re not animating the scene, but if you want to experiment, here’s

// where you get to play around.

}

 

void handleKeys() {

// We’re not handling keys right now, but if you want to experiment, here’s

// where you’d get to play around.

}

}

 

에잇….

스크린샷 2013-11-26 오전 5.42.04

 

실행된 화면만 캡쳐해 보아요… ㅠㅠ

스크린샷 2013-11-26 오전 5.44.19

스크린샷 2013-11-26 오전 5.44.55

 

Lesson 3 은 요, Lesson2 의 도형들이 막 회전해요.

스크린샷 2013-11-26 오전 5.46.10

 

스크린샷 2013-11-26 오전 5.46.48 스크린샷 2013-11-26 오전 5.47.27

 

아시겟지만 Lesson6은 커서를 누르면 막 돌아요… ㅋㅋ

 

스크린샷 2013-11-26 오전 5.48.33

 

 

스크린샷 2013-11-26 오전 5.49.10

스크린샷 2013-11-26 오전 5.49.44

 

 

스크린샷 2013-11-26 오전 5.59.16

 

 

레슨 10은 캡쳐 포기.. 11은요.. 달인데요… 마우스로 잡고 드래깅 하면 우어 막 돌아요… ㅋㅋ 마우스 따라서 회전… ㅎㅎ

 

스크린샷 2013-11-26 오전 6.01.24

 

12는 달과 상자가 서로 보면서 공전? 해요.. ㅋㅋ 자전은 모르겠어요. ㅋㅋ

13도 달과 상자인데 좀 크게 확대되서 돌고요… – 그래서 캡쳐 포기.

14는 주전자가 나와요 막 돌아요… ㅋㅋㅋ… 돈데크만이 생각나는것은 왜일까요? ㅋㅋㅋㅋㅋㅋ

스크린샷 2013-11-26 오전 6.02.57

15는 지구가 막 막 자전해요. ㅋㅋ

스크린샷 2013-11-26 오전 6.04.31

 

16은 노트북이랑 그 화면안에 객체들이 막 움직여요… ㅋㅋ

스크린샷 2013-11-26 오전 6.05.32

 

왠지 이번 시간엔 공부 안하고 땡땡이 친 기분이네요… . ㅋㅋㅋ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

[DART] Dart: Up and Running 스터디 해봐요. 3

앗 이것은 지난 시간의 짜투리 입니다.

const bar = 1000000;       // Unit of pressure (in dynes/cm2)
    const atm = 1.01325 * bar; // Standard atmosphere

 

아하~ 갑부인택이가 또 왔습니다.

갑부는 진짜 갑부라기 보다 갑부를 꿈꾸는 제 별명정도 입니다. ㅋㅋㅋㅋ

이번에는 Dart의 Built-in Types 입니다.

The Dart language has special support for the following types:

  • numbers
  • strings
  • booleans
  • lists (also known as arrays)
  • maps

다 아시겠지만… 확인차 … 에험.. 목을 가다듬고 .. 적어 볼게요.

Dart 언어는 다음 형식을 특별히 지원하지요.

numbers 숫자, strings 문자, booleans 논리형, lists (arrays로도 알려져 있지요… 배열정도? ㅋ), 그리고 maps(dictionary 라고도.. ㅋㅋ KeyValue .. )

 

1. Numbers 에는 int 형과 double 형이 있네요.

int (임의크기의 인티져),

var x = 1;
    var hex = 0xDEADBEEF;
    var bigInt = 346534658346524376592384765923749587398457294759347029438709349347;

double (64-bit (double-precision) floating-point numbers, as specified by the IEEE 754 standard )

var y = 1.1;
    var exponents = 1.42e5;

문자를 숫자로 혹은 그 반대롱…

// String -> int
    var one = int.parse('1');
    assert(one == 1);
    // String -> double
    var onePointOne = double.parse('1.1');
    assert(onePointOne == 1.1);
    // int -> String
    String oneAsString = 1.toString();
    assert(oneAsString == '1');
    // double -> String
    String piAsString = 3.14159.toStringAsFixed(2);
    assert(piAsString == '3.14');

물론 비트 연산도

assert((3 << 1) == 6);  // 0011 << 1 == 0110
    assert((3 >> 1) == 1);  // 0011 >> 1 == 0001
    assert((3 | 4)  == 7);  // 0011 | 0100 == 0111

 

Strings

A Dart string is a sequence of UTF-16 code units. You can use either single or double quotes to create a string:  – 다트 String은 UTF-16코드 개체의 연속(반복)입니당.

var s1 = 'Single quotes work well for string literals.';
    var s2 = "Double quotes work just as well.";
    var s3 = 'It\'s easy to escape the string delimiter.';
    var s4 = "It's even easier to just use the other string delimiter.";

 

by using ${expression}.  요놈도 사용가능하고요.

var s = 'string interpolation';
assert('Dart has $s, which is very handy.' ==
           'Dart has string interpolation, which is very handy.');
    assert('That deserves all caps. ${s.toUpperCase()} is very handy!' ==
           'That deserves all caps. STRING INTERPOLATION is very handy!');
헐 여러줄 문자열도 가능합니다.
var s1 = '''
    You can create
    multi-line strings like this one.
    ''';
    var s2 = """This is also a
    multi-line string.""";

You can create a “raw” string by prefixing it with r.  앞에 r붙여서 :raw; 문자 생성도 가능하죠.
var s = r”In a raw string, even \n isn’t special.”;

 

Booleans (논리형 입니다. 참 혹은 구라.. 가 아니라 거짓. ㅋ)

To represent boolean values, Dart has a type named bool.  – 다트에선ㄴ bool 입니다. 불불불….

true, false 리터럴이죠.

var name = 'Bob';
    if (name) {
      print('You have a name!'); // Prints in JavaScript, not in Dart.
    }

 

If you run this code as JavaScript, without compiling to Dart, it prints “You have a name!” because name is a non-null object. However, in Dart running in production mode, the above doesn’t print at all because name is converted to false (because name ! = true). In Dart running in checked mode, the above code throws an exception because the name variable is not a bool.  – 요거를 자바스크립트에서 실행하면 (다트에서 컴파일 안하고요..) 유 해브 어 네임 이 출력 되요. 왜냐면 name은  null이 아닌 객체잖아요. 하지만 Dart에서 production 모드로 실행하면 출력안해요. name 은 참이 아니고 false로 변환되서요. ㅠㅠ Dart checked mode 에서 실행하면요 이거 불값 아니데요?? 라면서 예외를 던집니당. ㅋㅋㅋ

Here’s another example of code that behaves differently in JavaScript and Dart:

    if (1) {
      print('JavaScript prints this line because it thinks 1 is true.');
    } else {
      print('Dart in production mode prints this line.');
      // However, in checked mode, if (1) throws an exception
      // because 1 is not boolean.
    }
// Check for an empty string.
    var fullName = '';
    assert(fullName.isEmpty());
    // Check for zero.
    var hitPoints = 0;
    assert(hitPoints <= 0);
    // Check for null.
    var unicorn;
    assert(unicorn == null);
    // Check for NaN.
    var iMeantToDoThis = 0/0;
    assert(iMeantToDoThis.isNaN());

 

Lists

아마 왠만한 프로그래밍 언어에서 열라게 쓰이는 일반적인 collection 일겁니다 리스트.. ㅋㅋ

순서가 있는 객체 그룹 (뭐 array라고도 하지요)이죠. Dart 에서도 어레이를 List 객체라고 하니깐 lists로 부르죠. ㅎㅎ

var list = [1,2,3]; // javaScript 스럽죠?
var list = [1,2,3];
    assert(list.length == 3);
    assert(list[1] == 2);

 

* Maps

맵 하면 Key Value죠… ㅋㅋ 영한사전 같은 .. ㅋㅋ apple = ‘사과’ 뭔 이런… ㅎㅎ

 

Here’s a simple Dart map: – 다트의 맵 객체 데모용… ㅋㅋㅋ

    var gifts = {                         // A map literal
    // Keys       Values
      'first'  : 'partridge',
      'second' : 'turtledoves',
      'fifth'  : 'golden rings'

};

var map = new Map();
map[1] = 'partridge';
map[2] = 'turtledoves';
map[5] = 'golden rings';
// use a map constructor.
// key is 1; value is 'partridge'.
// key is 2; value is 'turtledoves'.
// key is 5; value is 'golden rings'.

 

이렇게도 생성 가능하지용.

You add a new key-value pair to an existing map just as you would in JavaScript:

    var gifts = { 'first': 'partridge' };
    gifts['fourth'] = 'calling birds';    // Add a key-value pair

You retrieve a value from a map the same way you would in JavaScript:

    var gifts = { 'first': 'partridge' };
    assert(gifts['first'] == 'partridge');

If you look for a key that isn’t in a map, you get a null in return.

    var gifts = { 'first': 'partridge' };
    assert(gifts['fifth'] == null);

Built-in Types

Use .length to get the number of key-value pairs in the map:

    var gifts = { 'first': 'partridge' };
    gifts['fourth'] = 'calling birds';
    assert(gifts.length == 2);

 

아아아아아… 이거 멋진 웹앱은 언제 만들려나요? ㅠㅠㅠ

아 몰라요.. 이번화는 여기서 짤 입니당. ㅋ

36/136 했네요. ㅠ

 

 

 

[DART] Dart: Up and Running 스터디 해봐요. 2

시작 하고 몇자 끄적인 것 밖에 없는데 벌써 Chapter 2를 맞이 하였습니다.

하핫 ^^;;;

각설하고 바로 학습으로 들어갈게요…

// => 역시나 Dart 에서도 주석으로 채택되었네요. ㅋ

num : A type. Some of the other built-in type are String,int,and bool.

num은 숫자 타입이고요. 다른 타입들로는 String,int 그리고 bool 이 있습니다.

100 : A number is literal. Literals are a kind of compile-time constant.

100 : 숫자는 리터럴 입니다. 리터럴들은 컴파일 시에 상수의 한 종류이지요.

print() : A handy way to display output.

print():출력함수죠.

$varialeName : (or ${expression})

String interpolation : including a variable or expression’s string equivalent inside of a string literal.

문자열 리터럴의 내부 변수 나 식의 문자열.

main() : The special, required, top-level function where app execution starts.

main()  함수 : 특별한 (꼭 있어야 함), 최고 레벨의 함수입니다. (앱 실행의 시작점 이죠.)

var : A way to declare a variable without specifying its type.

var : 특정 타입 없이 변수를 선언할때 사용함.

 

* Important Concepts

Dart 언어를 배울때, 요고를 기억해 주세용.

1. Everything you can place in a variable is an OBJECT!!, and every object is an instance of a class.

Even numbers and functions are objects. All objects inherit from the Object class.

1.  당신이 변수에 배치 할 수있는 모든 것은! OBJECT이며, 모든 객체는 클래스의 인스턴스입니다.

어떤 수와 함수들은 Object 입니다. 모든 개체는 Object 클래스에서 상속합니다.

 

2. Specifying static types (such as num in the preceding example) clarifies your intent

and enables static checking by tools, but it’s optional. (You might notice when you’re

debugging your code that objects with no specified type get a special type: dynamic.)

2. (전의 예제의 num 같은) 정적 변수를 선언은 여러분의 의도를 명확하게 하고, 도구에 의해 정적 검사를 가능하게 합니다.

(여러분은 코드를 디버깅 할때 동적 타입을 알수 있습니다.) – 뭔소린지.. 발 번역은 넘기고 원본 참고 하세요.. ㅠㅠ 이런 영어.. ㅠㅠ

• Dart parses all your code before running it. You can provide tips to Dart—for example, by using types or compile-time constants—to catch errors or help your code run faster.

Dart는 실행 전에 모든 코드를 파싱합니다. Dart에게 팁을 제공할수 있습니다. 예를 들자면, type이나 상수를 컴파일 시에 사용하거나, catch error 등을 사용한다면, 코드 실행을 좀더 빠르게 하는데 도움이 됩니당.

아 번역이 점점 더 어려워 집니다.

그냥 영어 보실까요??

  • Dart supports top-level functions (such as main()), as well as functions tied to a class or object (static and instance methods, respectively). – Dart 는 최고레벨 함수 (main()같은)를 지원합니다. 함수는 클래스나 객체와 연관되죠.
  • Similarly, Dart supports top-level variables, as well as variables tied to a class or object (static and instance variables). Instance variables are sometimes known as fields or properties. – 마찬가지로, 다트는 최상위 변수뿐만 아니라, 클래스 또는 객체 (정적 및 인스턴스 변수)에 묶여 변수를 지원합니다. 인스턴스 변수란게 뭐 있나요 종종 필드 또는 속성불리는 그거죠…
  • Unlike Java, Dart doesn’t have the keywords public, protected, and private. If an identifier starts with an underscore (_), it’s private to its library. For details, see “Libraries and Visibility” (page 46). – 헐, 자바와는 다르게 Dart는 public,protected,private 등의 키워드를 갖지 않아요. 밑줄로 시작하는 식별자를 지니면 그 private 라이브러리네요.
  • Identifiers can start with a letter or _, followed by any combination of those char‐ acters plus digits. – 식별자는 문자, 밑줄로 시작가능하고요. 문자와 함께 쓰인 숫자도 가능하네요.
  • Sometimes it matters whether something is an expression or a statement, so we’ll be precise about those two words. – 뭐래니? 때때로 수식이나 구문이다, 두 단어로 가능하다고?
  • Dart tools can report two kinds of errors: warnings and errors. Warnings are just hints that your code might not work, but they don’t prevent your program from executing. Errors can be either compile-time or run-time. A compile-time error prevents the code from executing at all; a run-time error results in an exception (page 32) being raised while the code executes. – Dart 는 두종류의 오류를 보고 하는데요. 경고와 오류죠. 경고는 단지 동작하지 않는 코드에 대한 힌트가 아닌 실행시 여러분의 프로그램이 예방하지 못하는 거고요, 오류는 컴파일 시나 런타임때 둘다 가능합니다. 컴파일 오류는 실행시 모든 오류와 예외발생시 결과를 보여줍니다.
  • Dart has two runtime modes: production and checked. Production is faster, but checked is helpful at development. – Dart는 두 실행 모드가 있어요. Production 과 checked입니다. Production이 빠르죠. 하지만 Checked는 개발시에 도움을 줍니당.

Runtime Modes

개발시 디버그는 Checked 모드에서 하고요, deploy는 Production 모드라 일컫죠.

프로덕션 모드는요 … 다트 프로그램 의 속도에 최적화 된 기본 설정 실행 모드입니다.

체크모드는요 개발 친화적인 모드인데요.. 실행하는 동안에 뭐 좀 오류 같은거 잡아줍니다. 예를 들자면, num으로 선언한 변수에 number 아닌거 할당한 경우에요, 예외를 던져 주죠…ㅋㅋㅋ 뭔지 감 오시죠?

 

Variables

변수 입니다.

var name = ‘Bob’; 인데 var name = ‘인택’; 으로 할게요.. 제가 인택인지라… ㅋㅋㅋ

변수는 참조(references)입니다. name 변수는 String object 인  ‘Bob’ 혹은 ‘인택’을 참조 (가르킨다)하는 거죠.

 

Default Value

초기화 안된 변수는 null값으로 초기화 해요. numeric타입 변수를 포함한 모든 변수들은 null로 초기화 된다네요. 왜냐면.. 위에서 그랬잖아요. Numbers 도 객체니깐여. ㅋㅋ

int lineCount;
    assert(lineCount == null);
    // Variables (even if they will be numbers) are initially null.

 

* assert는 production 모드에서는 무시 되요. Checked mode 에서는 조건이 참이 아니면 예외를 마구 던져되죠.

 

Optional Types

변수 선언할때요 정적 타입으로 할수 있어요. String name = ‘인택’;

Final and Const

값 불변을 원한다면 Final 이나 Const를 사용해요.

final 변수는 오직 한번 값이 설정될 수 있고요. const 변수는 컴파일 시 상수 입니다.

최고 레벨 local 혹은 클래스 변수 final 을 사용해 초기화 선언시에 사용합니다.

final name = 'Bob';   // Or: final String name = 'Bob';
    // name = 'Alice';    // Uncommenting this results in an error

 

아 좀 길어 진것 같아요… 제 맘대로 여기서 끊습니다. 하하하

Built-in type 은 다음으로 미룰게요. 캬캬 다음도 기대해 주세요. 훗.