posted by dalnimbest 2014. 1. 2. 00:23

xcode5에서 iOS7에서 잘되던 소스가 iOS5.1에서 테스트할려니 제대로 안된다.


dyld: Library not loaded: /System/Library/Frameworks/AdSupport.framework/AdSupport
  Referenced from: /var/mobile/Applications/310B6E09-1CAA-41BD-B8DD-D4031953D713/MyEnglish.app/MyEnglish
  Reason: image not found


그래서 AdSupport.framework가 없어서 그런줄알고(이것도 이상하다. iOS7에서는 이런 에러 안뜨는데...) framework를 추가해주어도 여전히 같은 에러가 뜬다.


해결책은 Required로 주는것이 아니라 Optional로 주면 된다.


posted by dalnimbest 2013. 12. 6. 15:09

1. 첫번째

digraph name1 {

    //그래프가 나타내는 순서가 Top -> Bottom이다. LR은 Left -> Right임

    rankdir = TB;  //default


    //이하의 모든 노드는 Polygon에 blue칼라를 가진다.

    node [shape = polygon, color = blue]

    

    //node1은 node의 속성을 가지고, 속의 색을 blue로 채우고(fill), 테두리를 둥글게 만든다(rounded).

    node1 [style = "filled, rounded"]


    //node2는 record타입이며, 속의 색을 채우는데 채우는 색은 빨간색이다. 테두리색은 따로 지정하지 않았으므로 위에서 선언된 blue칼라를 가진다. 

    //record에 들어가는 칸은 총 3칸이로 첫번째 칸은 1이고 두번째 칸은 2와 3번이 세로로 각각들어가며 마지막탄은 4번이 들어간다.

    //<f2>는 node2에서 연결될때 "4"해당되는 ID이다.

    node2 [shape = record, style = filled, fillcolor = red, label = "1|{2|3}|<f2>4"]


    //순서대로 화살표를 그린다.

    node0 -> node1 -> node2;


    //node2의 f2 ("4"가 있는 부분)에서 node1으로 화살표를 그린다.

    node2:f2 -> node1;

    


    //이 이하부터는 record타입이다. style은 dashed가 적용된다. 색상은 재 지정이 없었으므로 위의 Node에서 지정한 Blue가 적용된다.

    node [shape=record, style = "dashed"];


    //record형 변수(?) struct0을 하나 선언하고 값은 A,B,C,D를 넣어준다.

    struct0 [label= "A | B | C | <f1>D" ];


    //struct1은 3개의 값을 가지는데 각각에 대해서 ID를 부여했다.

    //첫번째는 f0이라는 ID이며

    //두번째는 mid와 dle사이를 띄는데, &#92;가 뭘의미하는지 모르겠음.

    struct1 [label="<f0> left|<f1> mid&#92; dle|<f2> right"];


    //이 이후의 node style은 테두리가 둥글고, 속을 채우며(fillcolor를 따로 지정하지 않으면 color의 값이 테두리에도 사용되고 속을 채우는 색으로도 사용된다, 그래서 내부 선의 색상이 동일해서 안보인다.), 점선이다

    //색상은 red로 바꾸었다. 

    node [style = "rounded, filled, dotted", color = red]

    //  두개의 값을 가짐 (one, two)

    struct2 [label="<f0> one|<f1> two"];


    //이 이후의 node style은 속을 채우는것이다. dotted가 명기 되지 않으면, solid가 default로 사용된다.

    //테두리는 노란색, 채우는 색은 빨간색이다.

    node [style = "filled", color = yellow, fillcolor = red];

    //첫벗째는 hello다음에 개행문자(&#92;n)를 넣어준다.

    //두번째는 {}로 감싸므로 위->아래로 넣는데, b를 맨위로, 그밑에는 다시 {}로 둘러싸므로 c, d, e 순으로 넣는데, d앞에는 "here"라는 ID를 하나 넣어준다. 

    struct3 [label="hello&#92;nworld |{ b |{c|<here> d|e}| f}| g | h"];


    //node1에서 struct의 f1이라는 ID로 화살표를 그린다.

    node1 -> struct1:f1;


    //struct0의 f1 ID에서 struct1의 f0라는 ID로 화살표를 그린다.

    struct0:f1 -> struct1:f0;

    struct1:f1 -> struct2:f0;

    struct1:f2 -> struct3:here;

   

}








2. 두번째

digraph name2 {

    // graph의 크기를 설정하는데 작게는 되는게 크게는 되지 않네...

    size="10,5";


    //노드의 shape, style, font 설정

    node [shape = diamond, color = blue, fontname="Tahoma", fontsize="12"];


    //이하 edge의 색은 blue이다.

    edge [color = blue]


    //A의 속성을 따로 정의합니다. 

    A [shape=polygon, label = "This\nis\nA", peripheries = 2];     


    // A의 Shape은 polygon이지만, 나머지의 shape은 위에서 정한 diamond이다

    // 여기서 사용된 화살표 style는 dotted이며, 빨간색이다. edge에 "test"라는 글자를 뿌려준다. (이는 여기서만 사용되는 style이다)

    A -> B [style = "dotted", label = "test",color = red];    


    //선을 bold로 하고 색상은 green으로 한다.

    B -> C [style = bold, color = green];

    

    //weight는 B의 위치 조절이다, 다른 font를 적용한다.

    B -> D [weight=0, label = "dalnim" ,fontname="arial", fontsize = "9"];


    // B->E;

    // B->F;  이 두개를 한번에 표현하는것이다.

    B -> {E;F} [style = "dashed"];

}






3. 세번째

digraph G {


    node [shape = invtriangle];


    d [shape=lpromoter];

    e [shape=polygon, skew=.5];

    e1 [shape=polygon, skew=.8];

    f [shape=box3d];

    g [shape=underline];

    h [shape=none, label = "shape_none"];

    i [shape=component];

    j [shape=point];

    k [shape=star];

    l [shape=plaintext, label = "shape_plaintext"];

    m [color = lightgray, peripheries=2, style=filled];

    //

    e [shape=polygon,sides=4,distortion=.6];

    a ->b ->c -> { a1; a2} ;

    b ->d;

    d -> e -> e1 -> f -> g -> m;

    h -> i -> j -> k -> l;

}







UML처럼 사용하는건 아래를 참조하자.

http://www.ffnn.nl/pages/articles/media/uml-diagrams-using-graphviz-dot.php



'IT > GraphViz' 카테고리의 다른 글

GraphViz의 Node종류  (0) 2013.12.06
GraphViz에 관하여  (0) 2013.12.06
posted by dalnimbest 2013. 12. 6. 10:24

http://www.graphviz.org/content/attrs#karrowType


Graph는 Node와 Edge로 구성되어 있는데 


Node는 다음과 같은 3가지의 타입이 있다.


1. Polygon-based Nodes


box   circle  star  right arrow 


Record-based Nodes





'IT > GraphViz' 카테고리의 다른 글

DOT을 이용한 Graph그리기  (0) 2013.12.06
GraphViz에 관하여  (0) 2013.12.06
posted by dalnimbest 2013. 12. 6. 09:19


GraphViz는 AT&T에서 만든 Graph Visualization Software로 오픈소스이고 CPL 라이센스를 따른다. 아래와 같은 형태의 Graph를 만들수 있다.

    


홈페이지는 http://www.graphviz.org/Home.php 이다.


Graph 를 그리기 위해서 DOT 스크립트를 사용한다.


아래는 방향성이 있는 그래프를 그리는 기본 문법 형식이다.

digraph name {

    a -> b->c;

    b->d;

}


그러면 아래와 같은 형태의 Graph가 표시된다.



아래는 방향성이 없는 그래프를 그리는 기본 문법 형식이다. 

graph name {

    a -- b--c;

    b -- d;

}






Graph를 파일형태로 저장하기 위해서는 Output File Type과 Output File Name을 지정해줘야 한다.


아래에서는 PNG 포맷으로 바탕화면 밑에 1.png라는 이름으로 저장했다.





Layout Engine에 따라서 Graph의 모양이 여러가지로 달라진다.


dot - 계층적, 방향성이 있는 그래프를 그릴때 default로 사용한다. 

      - "hierarchical" or layered drawings of directed graphs. This is the default tool to use if edges have directionality.

neato - "spring model''을 그릴때 사용한다. 그릴 그래프가 너무 크지 않을때.(약 100개 정도의 노드)  

          - "spring model' layouts.  This is the default tool to use if the graph is not too large (about 100 nodes) and you don't know anything else about it. Neato attempts to minimize a global energy function, which is equivalent to statistical multi-dimensional scaling.

fdp - neato와 비슷한데 차이점은?

      -  "spring model'' layouts similar to those of neato, but does this by reducing forces rather than working with energy.

sfdp - multiscale version of fdp for the layout of large graphs.

twopi - radial layouts, after Graham Wills 97. Nodes are placed on concentric circles depending their distance from a given root node.

circo - circular layout, after Six and Tollis 99, Kauffman and Wiese 02. This is suitable for certain diagrams of multiple cyclic structures, such as certain telecommunications networks.

'IT > GraphViz' 카테고리의 다른 글

DOT을 이용한 Graph그리기  (0) 2013.12.06
GraphViz의 Node종류  (0) 2013.12.06
posted by dalnimbest 2013. 12. 4. 22:57

다른사람이 만든 소스를 가지고 와서 컴파일을 하다보니 아래와 같은 에러가 난적이 있다.


/Users/Kallol/Documents/FacebookSDK/FacebookSDK.framework/Versions/A/Resources/FBUserSettingsViewResources.bundle: No such file or directory


Kallol이라는 사람이 만든거 같은데...


이건 Project -> Build Phases -> Copy Bundle Resources에 보면 위의 FBUserSettingsViewResources.bundle 파일이 경로설정이 잘못되어 있는 경우이다.


1. Project

   - 이경우에는 맨 왼쪽의 폴더같은것을 누르고 그 밑의 Project명을 누른다.

     (이 경우에는 MyEnglish)



2. Build Phases가 보이면, 그 밑에 Copy Bundle Resources가 보인다.


3. Copy Bundle Resources를 펼쳐서 보면 FBUserSettingsViewResources.bundle 파일의 경로가 맞지 않는다고 빨간색으로 보인다.



4. 이것의 경로를 제대로 설정해준다. (필자는 지우고 다시 add했다., + 버튼이 맨 밑에 있다.)

posted by dalnimbest 2013. 11. 23. 23:37

* 특정 문자가 들어있는지 파악하기

NSRange rngSpace = [strWordOri rangeOfString:@","];

if (rngSpace.length > 0 ) {

//콤마가 있으면...

}



" 특정문자로 시작하지 않으면

if ([[searchBar.text lowercaseString] hasPrefix:@"http://"] == FALSE) {


}


* 문자열내의 특정 문자를 다른문자로 바꾸기

[searchBarWebUrl.text stringByReplacingOccurrencesOfString:@" " withString:@"+"]


* 문자열 앞뒤의 공백을 제거하기

NSString *searchBarWebUrlText = [searchBarWebUrl.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];




* HTML Tag제거 하기(정규식)

-(NSString *) stringByStrippingHTML:(NSString*)string {
    NSRange r;
    while ((r = [string rangeOfString:@"<[^>]+>" options:NSRegularExpressionSearch]).location != NSNotFound)
        string = [string stringByReplacingCharactersInRange:r withString:@""];
    return string;
}


posted by dalnimbest 2013. 9. 29. 16:13

Version 5.0 (5A1412)에서 App의 Icon을 설정하는 부분이 바뀌었는데 필자는 Lite버전의 App의 아이콘을 설정하는데 상당히 헤매었다. 이에 이과정을 적어둔다.


먼저 원하는 타겟을 선택하고 General을 선택한후에 App Icons르 보면 Source에 Use Asset Catalog를 선택한다.



Migrate를 선택한다.



Source가 AppIcon이라고 바뀐다. 화살표 모양을 선택한다.



아래를 보면 각각의 iOS버전에 맞게 아이콘을 설정할수 있다.

하기의 경우에는 iOS7의 앱의 아이콘이 없다. 아이콘을 설정하는방법은 Finder에서 원하는 아이콘을 드래그&드롭으로 가져다 놓으면 된다.




iOS7용 앱을 설정하고 나서의 화면





여기서 Target는 현재 두개 있는데 둘다 선택해야 한다.




이름을 알기 쉽게 바꾸었다. (Lite버전 타겟용이기 때문이다.)





이제 새로운 App Icon을 추가하자 (Pro버전)


"+"를 누른후 New App Icon을 선택하면








중요) 다시 앞으로 돌아가서 Target에 맞는 App Icons의 Source를 선택한다.


(Lite버전)


(Pro버전)




이제 각 Target에 맞게 Compile을 하게 되면 Target에 맞에 아이콘이 Device에 깔리게 된다.

posted by dalnimbest 2013. 9. 24. 22:52
  • 버튼이 파란색으로 나오면...xib에서 버튼의 type을 system이 아닌 custom으로 바꾸어 준다.


  • 화면이 위로 밀려올라가 보일때
    if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)]) {
        self.edgesForExtendedLayout = UIRectEdgeNone;
    }



  • status bar를 표시 안하기

Ready2Read-Info.plist에서 View controller-based status bar appearance를 추가하고 NO로 둔다.



  • alertview에 textfield가 표시안될때

   if ([myCommon getIOSVersion] >= IOSVersion_7_0) {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"FileName", @"")
                                                        message:@"" // 중요!! 칸을 내려주는 역할을 합니다.
                                                       delegate:self
                                              cancelButtonTitle:NSLocalizedString(@"Cancel", @"")
                                              otherButtonTitles:NSLocalizedString(@"OK", @""), nil];
       
        alert.tag = 1;

        alert.alertViewStyle = UIAlertViewStylePlainTextInput;

        UITextField *txtFldBookNameLocal = [alert textFieldAtIndex:0];
        txtFldBookNameLocal.autocapitalizationType = UITextAutocapitalizationTypeNone;
        txtFldBookNameLocal.clearButtonMode = UITextFieldViewModeWhileEditing;
        txtFldBookNameLocal.backgroundColor = [UIColor whiteColor];
        txtFldBookNameLocal.text =[NSString stringWithFormat:@"%@_%@.txt", strYearMonthDay, strHourMinute];
        txtFldBookNameLocal.keyboardType = UIKeyboardTypeDefault;
       
        CGAffineTransform moveUp = CGAffineTransformMakeTranslation(0.0, 0.0);
        [alert setTransform: moveUp];
        [alert show];
        [alert release];
    } else {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"FileName", @"")
                                                        message:@"\n\n" // 중요!! 칸을 내려주는 역할을 합니다.          
                                                       delegate:self                                
                                              cancelButtonTitle:NSLocalizedString(@"Cancel", @"")      
                                              otherButtonTitles:NSLocalizedString(@"OK", @""), nil];
       
        alert.tag = 1;   
        txtFldBookName.text = @"텍스트";
        [alert addSubview:txtFldBookName];    
        [alert show];   
        [alert release];
    }
   


* tableview의 특정 컨트롤이 속한 cell을 가져오기

ios7부터는 중간에 UITableViewCellScrollView이 하나 더 있기 때문에 superview를 한번더 불러야 한다.

Using iOS 6.1 SDK

  1. <UITableViewCell>
  2.    | <UITableViewCellContentView>
  3.    |    | <UILabel>

Using iOS 7 SDK

  1. <UITableViewCell>
  2.    | <UITableViewCellScrollView>
  3.    |    | <UIButton>
  4.    |    |    | <UIImageView>
  5.    |    | <UITableViewCellContentView>
  6.    |    |    | <UILabel>


    NSString *strTemp = @"";
    NSIndexPath *indexPath;
    if ([myCommon getIOSVersion] >= IOSVersion_7_0) {
        UITableViewCell *cell = (UITableViewCell *)[[[sender superview] superview] superview];
        indexPath = [tblViewMain indexPathForCell:cell];
    } else {
        indexPath = [tblViewMain indexPathForCell:(UITableViewCell *)[[sender superview] superview]];
    }

    //현재선택한 셀의 줄을 가져온다.
//    NSIndexPath *indexPath = [tblViewMain indexPathForCell:(UITableViewCell *)[[sender superview] superview]];
    strTemp     = [[self.arrDicSetting    objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];


posted by dalnimbest 2013. 8. 9. 01:00

개인적으로 집에서 Local로 개발을 하다보면 소스 백업문제와 버전관리가 문제가 될수 있다.

그냥 소스를 통채로 압축해서 날짜별로 보관하다보면 곧 한계에 다다른다.


회사 후배가 Git을 사용하면 백업과 버전문제가 해결된다고 해서 요즘 열심히 공부중이다.


GIT서버로 Bitbucket이 괜찮다고 소개해서 간단하게 사용법을 적어보았다.



Bitbucket은 요즘 뜨고 있는 이슈관리시스템인 JIRA를 만든 호주의 atalassian에서 만들었다.


GitHub와는 다르게 Private가지원되고 일정유저이하로는 무료로 사용할수 있다.

(참고로 외국에서는 프로그래머를 채용할때 GitHub에 있는 소스를 보고 실력을 파악한다고 한다. 사실 우리나라에서는 인원을 채용할때 짧은 면접시간에 당락이 결정되는 경우가 많은데 프로젝트에 아주 작은 역활만 수행하더라도 면접시 제대로 파악하기가 어렵다. 이렇게 공개적으로 인정받을수 있는 싸이트에 자기만의 코드가 당당히 올라가 있고 많은 사람들의 피드백을 받는 한국 프로그래머가  많아지길 바라는 마음이다.)



BItbucket를 사용할려면 Git에 대한 지식이 조금은 있어야 한다. 기본 사양법은 구글링 하면 나오고 제대로 공부하고 싶으면 http://git-scm.com/book/ko 를 참고하기 바란다.


회원가입하고 나면 Repository를 만드는 버튼이 있다. 간략하게 정보를 적어주고 화면 맨밑의 Create repository를 눌러준다.




사실 위에서  Repository를 만들면 그다음에는 맥에 있는 소스코드를 Reporitory에 올리면 된다. 올리려는 프로젝트가 이미 git에 있으면 그냥 push하면 되고 git이 없으면 터미널로 프로젝트의 디렉토리에 가서 git init를 실행하고 git에서 관리 하지 않을 파일들은  .gitignore에 등록하고 나머지파일들을 모드 git add * 로 git에 등록하면 된다. (아래화면은 remote repository에 등록하기 위한화면이다.)


어쨌든 Bitbucket에 아래와 같은 화면이 뜬다.

Bitbucket에 올릴려는 프로젝트가 아직 Git을 한번도 안했으면 "I'm starting from scratch"를 선택하자. 소스코드를 처음 만들거나  이미 있는 프로젝트가 Git을 쓰지 않고 있을때 사용한다.


이미 Repository가 워킹디렉토리에 있으면 "I have an existing project to push up"을 선택하면 된다. 참고로 필자는  git init하지 않은 상태인데 이 메시지를 이해하지 못해서, "I have an existing project to push up"를 눌러서 한참 해멨다. 사실 git init을 하고 안하고의 차이뿐인데...



아래 화면이 보인다. 프로젝트가 없으면 mkdir로 폴더를 만들고 이미 프로젝트가 있으면 cd명령어로 프로젝트가 있는 폴더로 간다.






필자는 이미 프로젝트가 있으므로 거기로 가서 ls -al을 하면 .git라는 디렉토리가 없다. 즉 아직 git을 사용하지 않는 프로젝트다.



git init를 하면 이 프로젝트에 git을 사용할수 있다. ls -al을 하면 .git폴더가 생긴것을 볼수 있다.


어떤 파일들은 백업이나 버전관리를 안하고 싶을때가 있다. 예를 들어 컴파일할때 생기는 중간파일등이다. .gitignore파일에 git에서 관리하지 않을 파일들을 넣어두면 된다. 직접만들어도 되고 구글링해도 나온다. 첨부파일도 필자가 구글링해서 가져온것이다.


파일을 넣은 화면



이제 위의 마지막 명령어인 원격저장소를 설정하자. 위의 마지막 명령어를 복사하여 엔터를 치면 아무것도 안나온다. 원격저장소가 설정된것이다. 한번더 해보면 이미 있다고 나온다.



이제 프로젝트에 있는 파일들을 git에 add하자 add되지 않은 파일은 git이 관리하지 않는다.

git add * 로 add하면 시간이 좀지나면 add된다. 뭐가 추가 되었는지 볼려고 git status로 확인하면 new file들이 쫙 나온다. (캡쳐는 파일 1개 까지만 했다 너무 길어서...)





commit를 해보자. 참고로 커밋할때 메시지는 반드시 있어야 한다.



아직 Bitbucket에 만든 원격저장소(BitBucket_Git)에는 파일이 올라간것이 아니다.

이제 원격저장소에 올려보자. 한창 시간이 걸린다.

명령어 : git push -u origin --all # to push up the repo for the first time




자 이제 Bitbucket에 소스파일이 올라갔다.


백업과 버전관리가 드디어 되는것이다.


참고로 git을 이해하면 알겠지만 Remote Repository에 소스를 올릴때는 commit이 아니라 push명령어를 사용한다. commit는 Local에서 작업한것을 Local Repository 에 올리는것이다.










posted by dalnimbest 2013. 8. 5. 12:20



Hadoop은 200년 시작된 웹 검색엔진인 Nutch Project(By Apache)에서 시작되었다. 검색엔진 기술은 일부 회사(야후, 구글등)만 가지고 있어서 오픈소스로 개발하면 좋겠다고 생각한 Doug Cutting과 Mike Cafarella가 오픈소스를 개발하였다. 10억 페이지규모의 색인을 유지하기 위해서 매달 3만달러의 운영비와 연간 50만 달러의 비용으로 검색엔진을 구축할수 있는 기술을 2004년도 ACM Queue 에서 Building Nutch:Open Source Search로 발표하였다.


<Doug Cutting>

   



<Mike Cafarella>

                                                 


사실 Nutch Project이전에는 1999년도에 Lucene Project가 있었다. 웹이 폭발적으로 성장하던 시기로 웹페이지에서 텍스트를 추출하는것이 중요한 기술로 이를 빠르게 찾기 위해서 Doug Cutting은 Lucene을 개발하였고 오픈 소스화 하였다.


Nutch는 10억 페이지 규모의 색인을 유지할수 있었지만 이걸로는 방대한 웹페이지를 핸들링하기가 어려웠는데 2003년 구글이 The Google File System을 발표하였는데 Doug Cutting은 여기서 아이디어를 가져와 Nutch Distributed File System을 만들었는데 이는 웹 크롤링과 색인 과정에서 생성되는 엄청나게 큰 파일드을 생성하기에 알맞은 구조를 가지고 있는 파일시스템이다.


또한 구글은 2004년 Google File System위에서 대용량 데이터를 간단하게 처리할수 있는 MapReduce를 발표하였고 Nutch Project는 MapReduce까지 프로젝트에 포함하였다.


2006년 Nutch Project로 부터  Nutch Distributed File System과 MapReduct를 독립시켜서 대용량의 데이터를 처리할수 있는 Hadoop프로젝트를 시작하였고 이때 Doug Cutting은 야후에 입사하여 2008년에 Hadoop을 야후에 적용시켰고 그해 2월에 Apache 재단에 Hadoop을 최고의 프로젝트에 등극하게 된다.


참고로 Hadoop을 사용하지 않았을때 1TB의 데이타를 읽기위해서 초당 100MB씩 읽어들이면 약 3시간정도 걸리는것이 Hadoop를 사용했을때 2007년도에는 297초에 읽어들였다. 나중에 2009년 5월에는 62초만에 1TB의 데이터를 읽을만큼 기술이 발달하였다.


2011년 12월 27일에 드디어 정식버전인 1.0을 발표하였다.





Reference

http://hadoop.apache.org/

http://gigaom.com/2013/03/04/the-history-of-hadoop-from-4-nodes-to-the-future-of-data/