//        [self.navigationController pushViewController:v animated:NO];

    //    [self presentModalViewController:v animated:YES];

    

    //        NSURL *url = [[NSBundle mainBundle] URLForResource:@"LA" withExtension:@"jpg"];

 

    //        [self.navigationController pushViewController:[self createPhotoEditViewControllerWithPhoto:photo] animated:YES];

    //    photoEditor.configuration.brushToolControllerOptions.defaultBrushSize

    

    

    //    photoEditor.configuration.brushToolControllerOptions.

    //    photoEditorViewCon = [self createPhotoEditViewControllerWithPhoto:photo];

    //    PESDKConfigurationBuilder *photocofbuild = [[PESDKConfigurationBuilder alloc] init];

    //    PESDKBrushToolControllerOptions *brushopt = [[PESDKBrushToolControllerOptions alloc] init];

    //    [brushopt defaultBrushColor] = CGColorCreate(<#CGColorSpaceRef  _Nullable space#>, <#const CGFloat * _Nullable components#>)

    //    PESDKBrushToolControllerOptionsBuilder *confbrush = [[PESDKBrushToolControllerOptionsBuilder alloc] initWithOptions:(PESDKBrushToolControllerOptions * _Nonnull)]

    //    photocofbuild configureBrushToolController:^(PESDKBrushToolControllerOptionsBuilder * _Nonnull) {

    //        <#code#>

    //    }

    //    PESDKConfiguration *photoconf = [[PESDKConfiguration alloc] initWithBuilder:^(PESDKConfigurationBuilder * _Nonnull) {

    //        <#code#>

    //    }]

    

    

    

    //    PESDKConfiguration *configuration = [[PESDKConfiguration alloc] initWithBuilder:^(PESDKConfigurationBuilder * _Nonnull builder) {

    //      [builder configureTransformToolController:^(PESDKTransformToolControllerOptionsBuilder * _Nonnull options) {

    //        options.menuBackgroundColor = UIColor.darkGrayColor;

    //

    //      }];

    //    }];

    

 

 

 

//        builder text

//        [builder configureTextFontToolController:^(PESDKTextFontToolControllerOptionsBuilder * _Nonnull opttxt) {

//            opttx

//        }]

 

 

//    photoEditorViewCon = [[PESDKPhotoEditViewController alloc] initWithPhotoAsset:image configuration:config menuItems:menuItems photoEditModel:photoEditModel];

    

    

    //    [self createPhotoEditViewControllerWithPhoto:<#(PESDKPhoto *)#> and:(PESDKPhotoEditModel *)]

    

    

 

 

 

    //    [self presentViewController:photoEditorViewCon animated:YES];

    

    //    [_mTextViewCnt resignFirstResponder];

    

    ////    data.isCheck = !data.isCheck;

    ////    [data.btnStorage setSelected:data.isCheck];

    //

    

    //

    //    if([data.cnts_req_vrf isEqualToString:@""]) {

    //        isTextFieldEditable = true;

    //        [_mTextViewCnt setText:@""];

    //    }

    //    else {

    //    [_mTextViewCnt setText:data.cnts_req_vrf];

    //        isTextFieldEditable = false;

    //    }

    //

    //    [self checkboxCommonFunction];

 

'Objective-C, SQLite3' 카테고리의 다른 글

PESDKConfiguration dead codes  (0) 2022.02.16
테이블 항목 기본 선택  (0) 2022.02.15
class 변수 쓰지 말자...  (0) 2021.06.11
UIAlertController  (0) 2021.05.31
nullable, nonnull  (0) 2021.05.26

//        [self.navigationController pushViewController:v animated:NO];

    //    [self presentModalViewController:v animated:YES];

    

    //        NSURL *url = [[NSBundle mainBundle] URLForResource:@"LA" withExtension:@"jpg"];

 

    //        [self.navigationController pushViewController:[self createPhotoEditViewControllerWithPhoto:photo] animated:YES];

    //    photoEditor.configuration.brushToolControllerOptions.defaultBrushSize

    

    

    //    photoEditor.configuration.brushToolControllerOptions.

    //    photoEditorViewCon = [self createPhotoEditViewControllerWithPhoto:photo];

    //    PESDKConfigurationBuilder *photocofbuild = [[PESDKConfigurationBuilder alloc] init];

    //    PESDKBrushToolControllerOptions *brushopt = [[PESDKBrushToolControllerOptions alloc] init];

    //    [brushopt defaultBrushColor] = CGColorCreate(<#CGColorSpaceRef  _Nullable space#>, <#const CGFloat * _Nullable components#>)

    //    PESDKBrushToolControllerOptionsBuilder *confbrush = [[PESDKBrushToolControllerOptionsBuilder alloc] initWithOptions:(PESDKBrushToolControllerOptions * _Nonnull)]

    //    photocofbuild configureBrushToolController:^(PESDKBrushToolControllerOptionsBuilder * _Nonnull) {

    //        <#code#>

    //    }

    //    PESDKConfiguration *photoconf = [[PESDKConfiguration alloc] initWithBuilder:^(PESDKConfigurationBuilder * _Nonnull) {

    //        <#code#>

    //    }]

    

    

    

    //    PESDKConfiguration *configuration = [[PESDKConfiguration alloc] initWithBuilder:^(PESDKConfigurationBuilder * _Nonnull builder) {

    //      [builder configureTransformToolController:^(PESDKTransformToolControllerOptionsBuilder * _Nonnull options) {

    //        options.menuBackgroundColor = UIColor.darkGrayColor;

    //

    //      }];

    //    }];

    

 

 

 

//        builder text

//        [builder configureTextFontToolController:^(PESDKTextFontToolControllerOptionsBuilder * _Nonnull opttxt) {

//            opttx

//        }]

 

 

//    photoEditorViewCon = [[PESDKPhotoEditViewController alloc] initWithPhotoAsset:image configuration:config menuItems:menuItems photoEditModel:photoEditModel];

    

    

    //    [self createPhotoEditViewControllerWithPhoto:<#(PESDKPhoto *)#> and:(PESDKPhotoEditModel *)]

    

    

 

 

 

    //    [self presentViewController:photoEditorViewCon animated:YES];

    

    //    [_mTextViewCnt resignFirstResponder];

    

    ////    data.isCheck = !data.isCheck;

    ////    [data.btnStorage setSelected:data.isCheck];

    //

    

    //

    //    if([data.cnts_req_vrf isEqualToString:@""]) {

    //        isTextFieldEditable = true;

    //        [_mTextViewCnt setText:@""];

    //    }

    //    else {

    //    [_mTextViewCnt setText:data.cnts_req_vrf];

    //        isTextFieldEditable = false;

    //    }

    //

    //    [self checkboxCommonFunction];

 

'Objective-C, SQLite3' 카테고리의 다른 글

PESDKConfiguration dead codes  (0) 2022.03.06
테이블 항목 기본 선택  (0) 2022.02.15
class 변수 쓰지 말자...  (0) 2021.06.11
UIAlertController  (0) 2021.05.31
nullable, nonnull  (0) 2021.05.26

[mTableViewRgon selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:NO scrollPosition:UITableViewScrollPositionTop];

 

 

[mTableViewRgon selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:NO scrollPosition:UITableViewScrollPositionTop];

         }

 

 

DDTBT_SITE_LOC_RGON *data1 = [mListRgon objectAtIndex:0];

         [db selectRgonDfctType:mListType withRgonId:data1.id_rgon];

         

         }

         

 

 

if ([mListType count] > 0) {

         [mTableViewType selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:NO scrollPosition:UITableViewScrollPositionTop];

         }

 

 

'Objective-C, SQLite3' 카테고리의 다른 글

PESDKConfiguration dead codes  (0) 2022.03.06
PESDKConfiguration dead codes  (0) 2022.02.16
class 변수 쓰지 말자...  (0) 2021.06.11
UIAlertController  (0) 2021.05.31
nullable, nonnull  (0) 2021.05.26

 

Obj-C 2.0 이상이고, 본인 프로젝트에서 메모리 사용량이 100%에 달하는 구간이 있는 앱이라면,

데이터 처리는 class 변수 말고 @property로 가고 @synthesize는 필수로 쓰세요. 

왠만하면 DB(sqlite)로 데이터 넘기는 구조가 안전합니다.

 

끗.

 

Swift로 무사히 전향 되었다고 생각했었는데, 최근 2년간은 오브젝티브C도 병행하였습니다.

이에, deprecated된 library 는 둘째치고 정말 다양한 상황의 문제점을 만났는데요.

그 중 하나 입니다. 임베디드 분야에 있으면서 메모리 사용량은 항상 봐야하는 것이지만 Swift 4+ 올라왔을 때부터는

거의 안 보고 살았거든요. 혹, legacy code를 보실 분. 그리고 먼 훗날 해당 코드를 다시 볼 때를 대비해서 기록을 남겨 둡니다.

스위프트 마이그레이션 하고 있지만 수년 간 만들어 온 코드를 Swift 로 바꾸기 힘듭니다. xib를 SwiftUI로 바꾸어야 하니...

안드로이드 처럼 쉽게 코틀린으로 바꿀 수 없죠.

(Android Studio 에서 코틀린 변환은 정말 대단하더군요. 프로젝트 전체 변환은 문제가 생기지만 일부 모듈 file by file은

100% 입니다.) 게다가 SwiftUI 까지 적용해야 하니 iOS 마이그레이션 시장은 지금부터 5년까지 꽤 활황일 것 같아요.

 

그럼, 정리 들어갑니다.

 

1. class 변수는 최대한 자제하고 @property 와 @synthesize 를 이용합니다. 

 - 잘 되던 코드가 iOS 업글하면서 class 변수 값이 날아가는 경우가 생겼습니다. 아무런 이유가 없었습니다.

 - copy, retain은 사용하지 않고 nonatomic, assign 으로 충분했습니다. 

 - 정확한 분석은 아니나. 메모리를 거의 풀로 쓰는 모듈(파씽, 데이터 처리 모듈)의 경우 @property 의 attributes가 영향을 주는 것 같긴 합니다.

 

   NSString *mData;   클래스 멤버변수라면 지우고, 

   @property (nonatomic, strong) NSString *mData; 와 같이 프로퍼티로 만들어 씁니다.

   BOOL mIsAll; 라면 클래스에서 지우고

   @property (nonatomic, assign) BOOL mIsAll;

로 쓰는 것입니다. 

 

2. UserDefault 땜빵은 한계가 있습니다. 그리고 @property 이 후 @syncthesize는 필수

  -처음에는 발생하는 문제가 몇 개 밖에 안 되어서, UserDefault 로 땜빵했습니다. 그러나 거대한 코드 더미에서 문제가 발생하는 경우

  난감했습니다. 딱히 setter, getter가 필요 없어서 @synthesize는 안 쓰고 self 나 _ 접두어로 썼습니다. 제 코딩 스타일이 그랬죠. self -> 도 좋아하구요 ^^;;  회사 동료들이 코르도바 사용 프로젝트의 경우에도 변수값 사라지는 문제가 발생하는 것을 리포팅 해서 @syncthesize 로 바꾸었는데 문제가 사라졌습니다. 

 

1, 2 의 문제는 결국 넘기는 데이터 보존이 안되는 문제 입니다. 데이터 넘기는 것은 콜백, 싱글톤, 델리게이트, DB 등 다양한 방법이 있습니다. 그 중 DB가 가장 느리지만 결국 DB가 가장 확실하다는 결론에 이르게 됩니다. Swift의 경우 Coredata 라는 ORM이 있어 참 좋은데. 엔터프라이즈급 data CRID엡은 앱 서버가 RDB를 항상 물고 있습니다. 이에, 해당 데이터는 SQL이 아닌 펼쳐서 재구현 하는 것이 쉽지 않더군요. 

 

임베디드는 아직 메모리를 믿을 단계가 아니다.(여전히) 라는 것입니다. 안드로이드나 iOS나 동일하니 더 좋네요.

 

안드로이드의 경우 액티비티 죽었다 다시 살아날 때 관련 리소스를 모두 재설정 해주는 것이 기법이었는데, iOS 의 경우 뷰컨이 내려간다고 해도 딱히 그런 생각은 없었습니다. 그러나 메모리 풀로 쓰는 모듈이 돌 때 참조가 0이 안된 애들도 청산(주식용어) 되는 것을 보며, 더더욱 DB로 가야 겠다는 생각이 들었습니다.

 

왠만하면 View를 넘나드는 데이터의 경우 전부 DB로 처리한다... 쯤 되겠네요. 예전보다 좋아지긴 했지만... 아직도 메모리 문제는 프로그래밍 언어와 운영체제가 다 알아서 해주는게 맞는 것 같다는 꿈을 꿔 봅니다. 30년도 더 된 일이지만요. 사실 속마음은 이럴거면 ARC  왜 도입 했고, 자바 코스프레 왜 하는겨? 정도네요. 필터카메라 만들 때 강제 gc 미친듯이 호출해야만 하는 상황도 생각나구요. 오래된 프로그래머라 그런지 아직도 메모리 스스로 관리해야하는 C/C++이 맞다는 생각입니다.

 

'Objective-C, SQLite3' 카테고리의 다른 글

PESDKConfiguration dead codes  (0) 2022.02.16
테이블 항목 기본 선택  (0) 2022.02.15
UIAlertController  (0) 2021.05.31
nullable, nonnull  (0) 2021.05.26
select 구현 예제  (0) 2021.05.26

- (IBAction)onClickAmount:(id)sender {

    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"" message:@"" preferredStyle:UIAlertControllerStyleAlert];

    [alertController addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {

        textField.placeholder = @"물량을 입력하세요";

        textField.secureTextEntry = NO;

        textField.keyboardType = UIKeyboardTypeNumberPad;

    }];

    UIAlertAction *confirmAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {

        NSLog(@"물량을 입력하세요 %@", [[alertController textFields][0] text]);

        //compare the current password and do action here

 

    }];

    [alertController addAction:confirmAction];

    UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {

        NSLog(@"Canelled");

    }];

    [alertController addAction:cancelAction];

    [self presentViewController:alertController animated:YES completion:nil];

}

'Objective-C, SQLite3' 카테고리의 다른 글

테이블 항목 기본 선택  (0) 2022.02.15
class 변수 쓰지 말자...  (0) 2021.06.11
nullable, nonnull  (0) 2021.05.26
select 구현 예제  (0) 2021.05.26
sqlite3 파일 생성  (0) 2021.05.26

@property (nonatomic, strong) NSString    * _Nullable id_atch_file;

@property (nonatomic, strong) NSString    * _Nonnull cd_sub_sys;

 

혼자 전체 프로젝트 작업(서버 포함) 할 때는 무조건 Nullable...

 

인터페이스 만들어서 다른 사람에게 줄 때는 NonNull...

 

그게 정석인 것 같다.

'Objective-C, SQLite3' 카테고리의 다른 글

class 변수 쓰지 말자...  (0) 2021.06.11
UIAlertController  (0) 2021.05.31
select 구현 예제  (0) 2021.05.26
sqlite3 파일 생성  (0) 2021.05.26
sql 공통 .h, .m 작성법  (0) 2021.05.26

SELECT
    a.seq
  , a.nm_logi_file
  , a.nm_phys_file
  , a.yn_mbil_add
FROM ddtbt_atch_file_dtil2 a
INNER JOIN ddtbt_tppg b ON a.id_atch_file = b.id_dwg_atch_file
WHERE b.cd_tppg = '';

를 구현한다고 하면...

-(DDTBT_ATCH_FILE_DTIL *) hjhImageFileTitledMapReturn:(NSString *) param
{
    NSString *query = [NSString stringWithFormat:@"select a.seq, a.nm_logi_file, a.nm_phys_file, a.yn_mbil_add from ddtbt_atch_file_dtil2 a \
                       inner join ddtbt_tppg b on a.id_atch_file=b.id_dwg_atch_file \
                       where b.cd_tppg='%@';"
                       ,param
                       ];
    NSLog(@" hjhImageFileTitledMapReturn query = %@", query);
    [self checkBackDB];
    
    if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {  //성공적으로 열림
        const char *sqlStatement = [query cStringUsingEncoding:NSUTF8StringEncoding];
        sqlite3_stmt *compiledStatement;
        if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {
            // Loop through the results and add them to the feeds array
            while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
                DDTBT_ATCH_FILE_DTIL *atch = [[DDTBT_ATCH_FILE_DTIL alloc] init];
                atch.seq = sqlite3_column_int(compiledStatement, 0);
                atch.nm_logi_file = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)];
                atch.nm_phys_file = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 2)];
                atch.yn_mbil_add = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 3)];
                
                NSLog(@"hjhImageFileTitledMapReturn2 %@ %ld %@ %@", atch.nm_logi_file, (long)atch.seq, atch.nm_phys_file, atch.yn_mbil_add);
                sqlite3_finalize(compiledStatement);
                [self checkBackDB];
                return atch;
            }
        }
        // Release the compiled statement from memory
        sqlite3_finalize(compiledStatement);
        [self checkBackDB];
    } else {
        [self checkBackDB];
    }
    
    return nil;
}

 

이렇게 한다.

'Objective-C, SQLite3' 카테고리의 다른 글

UIAlertController  (0) 2021.05.31
nullable, nonnull  (0) 2021.05.26
sqlite3 파일 생성  (0) 2021.05.26
sql 공통 .h, .m 작성법  (0) 2021.05.26
iOS Photokit  (0) 2021.05.26

  https://dudfufl.tistory.com/entry/23-SQLite-%EC%BF%BC%EB%A6%AC%EB%AC%B8-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0

  본래 github에 있던 내용인데 사라졌다.


사용법은 이렇고.
  [SqlUtils checkAndCreateDatabase:true];
헤더와 
  + (void) checkAndCreateDatabase:(BOOL)flag;

구현은 이렇다.

#import "FileManager.h"

+ (void) checkAndCreateDatabase:(BOOL)flag {
    NSString *databaseName = @"mbass4.db";
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDir = [documentPaths objectAtIndex:0];
    NSString *databasePath = [documentsDir stringByAppendingPathComponent:databaseName];
    BOOL success;
    // Create a FileManager object, we will use this to check the status
    // of the database and to copy it over if required
    NSFileManager *fileManager = [NSFileManager defaultManager];
    // Check if the database has already been created in the users filesystem
    success = [fileManager fileExistsAtPath:databasePath];
    // If the database already exists then return without doing anything
    
    if(success && flag) return;
    
    // If not then proceed to copy the database from the application to the users filesystem
    // Get the path to the database in the application package
    NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName];
    
    // Copy the database from the package to the users filesystem
    [fileManager removeItemAtPath:databasePath error:nil];
    [fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil];
    NSLog(@"databasePathFromApp %@ To %@", databasePathFromApp, databasePath);
    
}

https://gist.github.com/tuxcanfly/1205986

 

나 같은 경우 DB 업데이트 할 때마다 db 파일 번호를 올리는데...

DB 구조 변화시 에러를 방지하기 위해서이다. 삼성전자에서 FOTA 할 때는 DB 버전별로 sql 구문을 따로 넣어줬었다.(진짜 개고생...)

물론, 사용자 데이터 보호를 위함이었지만 필드 늘어나고 관계 깨지면 서버에서 걍 다시 다운로드 받는게 맞다.

'Objective-C, SQLite3' 카테고리의 다른 글

nullable, nonnull  (0) 2021.05.26
select 구현 예제  (0) 2021.05.26
sql 공통 .h, .m 작성법  (0) 2021.05.26
iOS Photokit  (0) 2021.05.26
ViewController 자료 교환 방식 수정  (0) 2021.05.20

기본형은

 

sqlite3 *database;
    NSString *databaseName = @"mbass4.db";
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDir = [documentPaths objectAtIndex:0];
    NSString *databasePath = [documentsDir stringByAppendingPathComponent:databaseName];
    NSString *currentProgressString = @"";
    
    if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
    NSString *query = @"select nm_prgs_phs \
           from ddtbt_site;";
           const char *sqlStatement = [query cStringUsingEncoding:NSASCIIStringEncoding];
           sqlite3_stmt *compiledStatement;
           if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {
               // Loop through the results and add them to the feeds array
               while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
                   currentProgressString = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)];
                   break;
               }
           }
        sqlite3_finalize(compiledStatement);
       }
    sqlite3_close(database);
이게 완결이다.

SqlUtils *db = [[SqlUtils alloc] init];

이렇게 쓰게 하기 위해서

- (id) init
{
    if (self = [super init]) {
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        databasePath = [documentsDirectory stringByAppendingPathComponent:@"mbass4.db"];
    }
    return 
}
init을 만든다.- (id) init;
- (void) selectSite:(DDTBT_SITE *)data {
    [self checkBackDB];
    [data clear];
    
    // Open the database from the users filessytem
    if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
        // Setup the SQL Statement and compile it for faster access
        
        NSString *query = @"select cd_site \
        ,nm_site \
        ,nm_site_abrv \
        ,cd_prgs_phs \
        ,nm_prgs_phs \
        ,yn_adtn_phs \
        ,cd_rcpt_phs \
        ,nm_rcpt_phs \
        from ddtbt_site;";
        
        const char *sqlStatement = [query cStringUsingEncoding:NSASCIIStringEncoding];
        sqlite3_stmt *compiledStatement;
        if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {
            // Loop through the results and add them to the feeds array
            while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
                
                data.cd_site = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)];
                data.nm_site = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)];
                data.nm_site_abrv = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 2)];
                data.cd_prgs_phs = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 3)];
                data.nm_prgs_phs = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 4)];
                data.yn_adtn_phs = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 5)];
                data.cd_rcpt_phs = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 6)];
                data.nm_rcpt_phs = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 7)];
                
                break;
            }
        }
        // Release the compiled statement from memory
        sqlite3_finalize(compiledStatement);
        
    }
    [self checkBackDB];
}

기본형과 별 다른게 없다. 그냥 DB 가져오는 부분만 공통이니 뺏을 뿐.
-(void) checkBackDB {
    if(database != nil)  {
        if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
            sqlite3_finalize;
            sqlite3_close(database);
        } else {
            sqlite3_finalize;
            sqlite3_close(database);
        }
    }

sqlite3는 느리고 다른데서 쓰고 있을 때 계속 문제가 생겨서 finalize 와 close를 하나 만들었다.

 

이제 기본형은

//
//  sql3hjh.h
//
//  Created by Junho HA on 2021/05/26.
//  Copyright © 2021 hajunho.com All rights reserved.
//


#ifndef sql3hjh_h
#define sql3hjh_h


#import <sqlite3.h>


@interface sql3hjh : NSObject
{
    sqlite3 *database;
}


@property (nonatomic, strong, readwrite) NSString *databasePath;


- (id) init;


@end


#endif /* sql3hjh_h */
//
//  sql3hjh.m
//
//  Created by Junho HA on 2021/05/26.
//  Copyright © 2021 hajunho.com All rights reserved.
//


#import <Foundation/Foundation.h>
#import "sql3hjh.h"


@implementation sql3hjh
@synthesize databasePath;


- (id) init
{
    if (self = [super init]) {
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        databasePath = [documentsDirectory stringByAppendingPathComponent:@"mbass4.db"];
    }
    return self;
}
@end

'Objective-C, SQLite3' 카테고리의 다른 글

select 구현 예제  (0) 2021.05.26
sqlite3 파일 생성  (0) 2021.05.26
iOS Photokit  (0) 2021.05.26
ViewController 자료 교환 방식 수정  (0) 2021.05.20
잘 되던게, 갑자기 안되는 문제 해결.  (0) 2021.05.20

https://developer.apple.com/documentation/photokit

 

Apple Developer Documentation

 

developer.apple.com

 

Installing PhotoEditorSDK (10.23.1)

Installing imglyKit (10.23.1)

 

포토킷 예제는

 

https://github.com/imgly/pesdk-ios-examples

 

imgly/pesdk-ios-examples

A fully customizable photo editor for your app. Contribute to imgly/pesdk-ios-examples development by creating an account on GitHub.

github.com

objective-C , Swift 코드 둘 다 있어서 비교하기도 좋고...

 

오브젝티브 C 의 경우 정상 동작 확인했다.

 

pod 'PhotoEditorSDK'

 

참, 좋다. 그러나 역시 유료...

 

https://img.ly/pricing/configure-your-product

 

Price Calculator | IMG.LY

Not ready to get started yet? Why don't you take our editors for a test drive with a free trial or browse the FAQs?

img.ly

 

git 에도 안 올라가네...

Enumerating objects: 771, done.

Counting objects: 100% (771/771), done.

Delta compression using up to 16 threads

Compressing objects: 100% (746/746), done.

Writing objects: 100% (749/749), 77.75 MiB | 702.00 KiB/s, done.

Total 749 (delta 47), reused 0 (delta 0)

remote: Resolving deltas: 100% (47/47), completed with 18 local objects.

remote: error: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com.

remote: error: Trace: ce5efb725d2417032acef77cd0abc232f6791cef39146cc2cbac700024735657

remote: error: See http://git.io/iEPt8g for more information.

remote: error: File Pods/imglyKit/ImglyKit.framework/ImglyKit is 150.33 MB; this exceeds GitHub's file size limit of 100.00 MB

 

 

git rm --cached Pods/imglyKit/ImglyKit.framework/ImglyKit

git commit --amend -CHEAD

[rel03 15a5da4] .

 Date: Wed May 26 17:27:21 2021 +0900

 3 files changed, 65 insertions(+), 4 deletions(-)

 delete mode 100755 Pods/imglyKit/ImglyKit.framework/ImglyKit

 

git push

Enumerating objects: 780, done.

Counting objects: 100% (780/780), done.

Delta compression using up to 16 threads

Compressing objects: 100% (755/755), done.

Writing objects:  13% (105/758), 1Writing objects:  14% (107/758), 1Writing objectsWriting objects: 100% (758/758), 77.75 MiB | 1.03 MiB/s, done.

Total 758 (delta 54), reused 0 (delta 0)

remote: Resolving deltas: 100% (54/54), completed with 18 local objects.

remote: error: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com.

remote: error: Trace: 62cf00ddea2368d0eb0fd133d3fa8e9fb309b3448be13de070c88c33b000d361

remote: error: See http://git.io/iEPt8g for more information.

remote: error: File Pods/imglyKit/ImglyKit.framework/ImglyKit is 150.33 MB; this exceeds GitHub's file size limit of 100.00 MB

 

뭐야...

https://stackoverflow.com/questions/19573031/cant-push-to-github-because-of-large-file-which-i-already-deleted

 

Can't push to GitHub because of large file which I already deleted

Currently I have Empty GitHub repo SSH server repo (main) Local Repo SSH server repo was the most up-to-date repo (production site) so I did a Git clone from there to local. I then tried to do a ...

stackoverflow.com

안되잖아.

 

 

git filter-branch --tree-filter 'rm Pods/imglyKit/ImglyKit.framework/ImglyKit' HEAD

WARNING: git-filter-branch has a glut of gotchas generating mangled history

rewrites.  Hit Ctrl-C before proceeding to abort, then use an

alternative filtering tool such as 'git filter-repo'

(https://github.com/newren/git-filter-repo/) instead.  See the

filter-branch manual page for more details; to squelch this warning,

set FILTER_BRANCH_SQUELCH_WARNING=1.

 

Proceeding with filter-branch...

 

Rewrite 6a758d6dca2bdef2f13f60d2d494f411f7168604 (1/133) (0 seconds passed, remaining 0 predicted)    rm: Pods/imglyKit/ImglyKit.framework/ImglyKit: No such file or directory

tree filter failed: rm Pods/imglyKit/ImglyKit.framework/ImglyKit

 

 

git push origin master --force

Total 0 (delta 0), reused 0 (delta 0)

To github.com:hajunho/hanaMaster.git

 + 84e7d84...d45c23c master -> master (forced update)

 

이걸로 해결...

 

에혀... 반쪽짜리 git이다. 이 경험으로 이미지 라이브러리 넣기 전에 고민 좀 하고 넣어야 할 듯.

'Objective-C, SQLite3' 카테고리의 다른 글

sqlite3 파일 생성  (0) 2021.05.26
sql 공통 .h, .m 작성법  (0) 2021.05.26
ViewController 자료 교환 방식 수정  (0) 2021.05.20
잘 되던게, 갑자기 안되는 문제 해결.  (0) 2021.05.20
ImageButton  (0) 2021.05.18

AS-IS : NSMutableDictionary

TO-BE : @property

 

이유... 직전에 세팅값이 넘어 왔다는 직관성은 옳으나 어차피 그 자료 그대로 넘겨 받아서 이용하는 경우 딱히...

다수가 여러개의 모듈로 작업할 때는 커뮤니케이션에 좋겠지만... 또 네트웍 연결 상태일 때도...

혼자서 하는 경우 필요 없다는 결론....

 

 

NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithCapacity:0];

    [dic setValue:data.cd_dong forKey:@"cd_dong"];

    if ([data.cd_dong isEqualToString:@""]) {

        [dic setValue:@"전체동" forKey:@"nm_dong"];

    }

    else {

        [dic setValue:data.nm_dong forKey:@"nm_dong"];

    }

    [dic setValue:data1.cd_flor forKey:@"cd_flor"];

    if ([data.cd_dong isEqualToString:@""]) {

        [dic setValue:@"전체층" forKey:@"nm_flor"];

    }

    else {

        [dic setValue:data1.nm_flor forKey:@"nm_flor"];

    }

    

    if(self.mSegmentedControl.selectedSegmentIndex ==0) {

    

    [dic setValue:data2.nohs forKey:@"nohs"];

    [dic setValue:data2.cd_loc_clsf forKey:@"cd_loc_clsf"];

    [dic setValue:data2.ho forKey:@"ho"];

    [dic setValue:data2.cd_tppg forKey:@"cd_tppg"];

'Objective-C, SQLite3' 카테고리의 다른 글

sql 공통 .h, .m 작성법  (0) 2021.05.26
iOS Photokit  (0) 2021.05.26
잘 되던게, 갑자기 안되는 문제 해결.  (0) 2021.05.20
ImageButton  (0) 2021.05.18
List  (0) 2021.05.18

거의 몇 년 동안 하루에 한 번 이상은 보는 테이블 뷰

 

#pragma mark -

#pragma mark TableView Delegate



if (YES == [mDfct.mode isEqualToString:@"U"] && (YES ==[mDfct.cd_hndl_stat isEqualToString:@"E"] || YES ==[mDfct.cd_hndl_stat isEqualToString:@"X"]))




- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

 

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

 

지겹다…




sqliteFlow 에서는 제대로 나오는 쿼리가

 

SELECT

    cd_tppg

  , id_loc

  , id_uper_loc

  , nm_loc

FROM ddtbt_site_tppg_loc

WHERE cd_tppg = '70A_J'

ORDER BY

    oder_mkar

  , nm_loc;



갑자기 화면에서 나오지 않는다. 서버에서 뭐가 바뀌었다고 한다 ㅡㅡ;

 

 while(sqlite3_step(compiledStatement) == SQLITE_ROW) {

                DDTBT_SITE_TPPG_LOC *data = [[DDTBT_SITE_TPPG_LOC alloc] init];

                data.cd_tppg = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)];

                data.id_loc = sqlite3_column_int(compiledStatement, 1);

                data.id_uper_loc = sqlite3_column_int(compiledStatement, 2);

                data.nm_loc = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 3)];

                [array addObject:data];

            }

 

hmm.. 별 문제 없어 보이는데… BP 찍어보니 sql 에서 채워졌어야 할 data array 에 element가 0이다.




@interface QualityControl2 : BaseViewController<UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate, UIActionSheetDelegate, UIImagePickerControllerDelegate, BaseViewDelegate, MTSpeechRecognizerDelegate> {

    MTSpeechRecognizerClient *speechRecognizerClient;

    

    UITableView *mTableViewLoc;

    NSMutableArray *mListLoc;

 

    @property (nonatomic, strong) NSMutableArray *mListLoc;



    @synthesize mListLoc;



잘 되던 코드가 안되니 프로퍼티로 바꾸어 보았다.

 

똑같다.

 

웃긴 건





  array = [[NSMutableArray alloc] init];



가 들어가면...

 

2021-05-20 10:01:32.937461+0900 MBASS[18252:4236337] 810707 result 70A_J 12442 13 현관1 count: 1

2021-05-20 10:01:32.937579+0900 MBASS[18252:4236337] 810707 result 70A_J 10 9 공용욕실1 count: 2

2021-05-20 10:01:32.937671+0900 MBASS[18252:4236337] 810707 result 70A_J 3 1 침실1 count: 3

2021-05-20 10:01:32.937763+0900 MBASS[18252:4236337] 810707 result 70A_J 4 1 침실2 count: 4

2021-05-20 10:01:32.937848+0900 MBASS[18252:4236337] 810707 result 70A_J 5 1 침실3 count: 5

2021-05-20 10:01:32.937934+0900 MBASS[18252:4236337] 810707 result 70A_J 12967 12 거실1 count: 6

2021-05-20 10:01:32.938029+0900 MBASS[18252:4236337] 810707 result 70A_J 6 2 발코니1 count: 7

2021-05-20 10:01:32.938109+0900 MBASS[18252:4236337] 810707 result 70A_J 12533 19 주방/식당 count: 8

2021-05-20 10:01:32.938193+0900 MBASS[18252:4236337] 810707 result 70A_J 12523 31 다용도실 count: 9

2021-05-20 10:01:32.938277+0900 MBASS[18252:4236337] 810707 result 70A_J 8022 26 드레스룸 count: 10

2021-05-20 10:01:32.938363+0900 MBASS[18252:4236337] 810707 result 70A_J 102 14 부부욕실1 count: 11

2021-05-20 10:01:32.938444+0900 MBASS[18252:4236337] 810707 result 70A_J 15638 29 대피공간1 count: 12

2021-05-20 10:01:32.938627+0900 MBASS[18252:4236337] 810707 result 70A_J 13352 30 실외기실1 count: 13



들어간 array에 카운트가 나온다.

 

빼면...

 

2021-05-20 10:02:46.587067+0900 MBASS[18257:4237001] 810707 result 70A_J 12442 13 현관1 count: 0

2021-05-20 10:02:46.587261+0900 MBASS[18257:4237001] 810707 result 70A_J 10 9 공용욕실1 count: 0

2021-05-20 10:02:46.587414+0900 MBASS[18257:4237001] 810707 result 70A_J 3 1 침실1 count: 0

2021-05-20 10:02:46.587556+0900 MBASS[18257:4237001] 810707 result 70A_J 4 1 침실2 count: 0

2021-05-20 10:02:46.587706+0900 MBASS[18257:4237001] 810707 result 70A_J 5 1 침실3 count: 0

2021-05-20 10:02:46.587851+0900 MBASS[18257:4237001] 810707 result 70A_J 12967 12 거실1 count: 0

2021-05-20 10:02:46.587988+0900 MBASS[18257:4237001] 810707 result 70A_J 6 2 발코니1 count: 0

2021-05-20 10:02:46.588170+0900 MBASS[18257:4237001] 810707 result 70A_J 12533 19 주방/식당 count: 0

2021-05-20 10:02:46.588313+0900 MBASS[18257:4237001] 810707 result 70A_J 12523 31 다용도실 count: 0

2021-05-20 10:02:46.588482+0900 MBASS[18257:4237001] 810707 result 70A_J 8022 26 드레스룸 count: 0

2021-05-20 10:02:46.588620+0900 MBASS[18257:4237001] 810707 result 70A_J 102 14 부부욕실1 count: 0

2021-05-20 10:02:46.588790+0900 MBASS[18257:4237001] 810707 result 70A_J 15638 29 대피공간1 count: 0

2021-05-20 10:02:46.588934+0900 MBASS[18257:4237001] 810707 result 70A_J 13352 30 실외기실1 count: 0



안나온다.

 

            [array addObject:data];

가 안되는 것이다.

 

신기한 것은 지금까지 잘 되던 코드인데 갑자기 안된다는 것.



- (NSMutableArray*) RETNselectSiteTppgLoc:(NSMutableArray *)array withTppgCd:(NSString *)tppgCd {

 

포인트 파라미터 방식을 리턴 방식으로 바꾸어서 해결…



에혀… 참 별의 별개 갑자기 안된다.

 

빨리 Swift 세상이 되길…


'Objective-C, SQLite3' 카테고리의 다른 글

iOS Photokit  (0) 2021.05.26
ViewController 자료 교환 방식 수정  (0) 2021.05.20
ImageButton  (0) 2021.05.18
List  (0) 2021.05.18
UIViewController 중첩  (0) 2021.05.18

기업 강의용 이기도 하고... 사실 별 큰 내용은 아닌지라.

 

res drawable minimap values menu layout -> R

 

Images.xcassets

 

 

 

FrontViewController

 

 

 

0 -> 0.05

 

빈번히 볼 수 있는 버그 → 리소스 리빌드, 폴더도 날리고… 엑스코드 재실행 ㅡㅡ;

 

그럼 됨.

 

 

결론 : UI 일그러지게 버튼 잘라서 쓰길래 바꾸었다...  통으로... 난 클릭 영역만 잘라서 쓰는게 편하다.

'Objective-C, SQLite3' 카테고리의 다른 글

ViewController 자료 교환 방식 수정  (0) 2021.05.20
잘 되던게, 갑자기 안되는 문제 해결.  (0) 2021.05.20
List  (0) 2021.05.18
UIViewController 중첩  (0) 2021.05.18
SOAP protocol  (0) 2021.05.18

OverView

Android 에서는 ListView는 iOS Legacy UI 에서는 TableView 로 불리고 SwiftUI에서는 List로 불린다. 이 List Widget 혹은 List Object, List Library, List View & Controls 는 다음과 같은 Creation Route 를 가진다.




[기초] TableView 만들기 (Objective-C + Xib)

테이블 뷰는 데이터 소스를 가져와서 한 줄 씩 화면에 뿌려 주는 객체(Object)이다. 또 데이터 소스를 표현하는 줄(Row)이 길어져서 화면을 넘어가면 자동으로 스크롤바가 붙는다. 라이브러리에서 (⌘⇧L 라이브러리 열기 단축키) 테이블 뷰를 Xib에 D&D(Drag & Drop) 한다.

한 화면에 3개의 테이블 뷰를 배치하면 스토리보드(Storyboard, Xib)에서 다음과 같이 표현된다.



원하는 모양으로 화면 구성(뒤에서는 스토리 보드 작성이라고 말한다)을 한다. 

 

화면 구성 후에는 테이블 세팅을 위해 UIViewController<UITableViewDelegate, UITableViewDataSource> 를 상속 받아 구현해 주어야 한다.


Table 의 섹션 개수를 반환한다.

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

    // Return the number of sections.

    return 1;

}

 

1로 적으면 1개의 섹션이다. 거의 대부분의 테이블은 지속적으로 데이터가 추가되기 때문에 섹션 구분을 하지 않고 보통 1로 두며, 다른 섹션의 경우 별도의 테이블로 만들어 같은 화면에 표시한다. 

 

Table 의 Row 개수를 반환 한다.

- (NSInteger) tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section {

    return [mList count];

}

 

table을 몇 줄로 할 것인지 미리 정한다. 보통 한 파일 내에서 멤버 배열(mList)로 두고 해당 배열의 크기를 row 개수로 정한다.


Table 의 Cell 을 채운다.

하나의 Row를 Cell이라고 한다.

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

     

   if (cell == nil) {

       cell = ... 

   }

    

    return cell;

}

 

요약하면, Table View 에서는 Cell 의 개수 먼저 정하고 Cell 을 만드는 것이 중요하다.


코드로 셀을 추가하는 방법

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

        

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

 

셀을 코드로 만들어 주면 된다.

 

TIP! : legacy code의 경우, 셀을 코드로 추가한 셀이 복잡한 UI인 경우 refresh 할 때 문제가 된다. 

 

if( cell != nil ) {

       for(int i=0; i<[cell.contentView.subviews count];i++)

           if([cell.contentView.subviews objectAtIndex:i] != nil)

               [[cell.contentView.subviews objectAtIndex:i] removeFromSuperview];

}

 

와 같이 수동으로 삭제한 후 다시 그려주어야 한다.


테이블 셀 클래스 정의

테이블 뷰를 추가 했었던 스토리 보드의 오브젝트 리스트를 보면 Table View 아래 Table View Cell이 있다.

Table View Cell 을 Table View 위로 D&D 한 후. Cell 내부 구성 요소를 만들 수 있다.. 이 후, 셀을 위한 클래스 생성하고 해당 클래스에 셀 내부 구성 요소를 연결 한다.

 

import UIKit

class DragonballCell : UITableViewCell {

    @IBOutlet weak var lbMain: UILabel!
    @IBOutlet weak var lbSub: UILabel!
    
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }
}

 

만들어진 셀은 테이블 뷰의 cellForRowAt 에서 원하는 소스를 세팅 한다.

let cell: DragonBallCell
cell = (tableView.dequeueReusableCell (withIdentifier: "DragonballCell") as? DragonballCell)!
cell.lbMain.text = "mainText"
cell.lbSub.text = "subText"
return cell



[실전] sqlite DB와 TableView 연동하기

 

onClickCheckingCategory
onClickSerarchingCategory
onClickDownloadSite

 

    NSMutableArray *tCheck = [NSMutableArray arrayWithCapacity:0];
    SqlUtils *db = [[SqlUtils alloc] init];
    [db selectAll_SITE_TPPG_LOC:tCheck];
    
    if([tCheck count] < 1) {
        [GlobalVar alertMsgOKWithTitle:@"mBASS" message:@"현장 정보 자료 받기를 먼저 해 주세요."];
    } else {
        CheckingCategory *v = [[CheckingCategory alloc] initWithNibName:@"CheckingCategory" bundle:[NSBundle mainBundle]];
        self.title = @"";
        [self.navigationController pushViewController:v animated:YES];
        GlobalVar.globalVar.globalcounterofstack4frontview++;
    }

 

 

View를 만든다.


HoldPointView.xib

 


 


 


 


 


 

#ifndef HoldPointView_h
#define HoldPointView_h

@interface HoldPointView : UIViewController {
    
}
@end

#endif /* HoldPointView_h */


 

#import "HoldPointView.h"

@implementation HoldPointView

@end




 





 




@property (weak, nonatomic) IBOutlet UITableView *mTableView;

 

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[UIViewController _loadViewFromNibNamed:bundle:] loaded the "HoldPointView" nib but the view outlet was not set.'
terminating with uncaught exception of type NSException



#import "HoldPointView.h"

@implementation HoldPointView

-(void) viewDidLoad {
    [super viewDidLoad];
    self.mTableView.dataSource = self;
    self.mTableView.delegate= self;
    [self.mTableView reloadData];
}

#pragma mark -
#pragma mark === TableView DataSource ===
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    // Return the number of sections.
    return 1;
}

- (NSInteger) tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section {
    return 5;
}

#pragma mark -
#pragma mark TableView Delegate
- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

 

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    static NSString *vCell = @"Cell4Default";
    
    UITableViewCell *cell = nil;
    cell = [tableView dequeueReusableCellWithIdentifier:vCell];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:vCell];
        UILabel *vLabel = [[UILabel alloc] initWithFrame:CGRectMake(6, 2, 90, 30)];
        vLabel.textAlignment = UITextAlignmentCenter;
        vLabel.text = @"cell";
        vLabel.textColor = [UIColor blueColor];
        vLabel.backgroundColor = [ UIColor clearColor];
        vLabel.font = [UIFont systemFontOfSize:14];
        [vLabel setAdjustsFontSizeToFitWidth:YES];
        [vLabel setTag:1];
        [cell.contentView addSubview:vLabel];
    }
    return cell;
}

 

@interface HoldPointView : UIViewController <UITableViewDelegate, UITableViewDataSource> {
    
    NSMutableArray *mList;
    
}

 

- (void) selectTable_DDTBT_HPTYPE:(NSMutableArray *)array isAll:(BOOL)isAll {
    NSLog(@"SQLUTILS_selectDong");
    [array removeAllObjects];
    [self checkBackDB];
    if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
        NSString *query = @"select ID_CHK_TYPE \
        ,NM_CHK_TYPE \
        from DDTBT_HPTYPE;";
        NSLog(@"Query = %@", query );
        
        const char *sqlStatement = [query cStringUsingEncoding:NSASCIIStringEncoding];
        sqlite3_stmt *compiledStatement;
        if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {
            while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
                
                DDTBT_HPTYPE *data = [[DDTBT_HPTYPE alloc] init];
                data.ID_CHK_TYPE = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)];
                data.NM_CHK_TYPE = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)];
                
                [array addObject:data];
            }
        }
        sqlite3_finalize(compiledStatement);
    }
    sqlite3_close(database);
}

 

-(void) viewDidLoad {
    [super viewDidLoad];
    if (nil == mList) mList = [NSMutableArray arrayWithCapacity:0];
    SqlUtils *db = [[SqlUtils alloc] init];
    [db selectTable_DDTBT_HPTYPE:mList isAll:YES];
    self.mTableView.dataSource = self;
    self.mTableView.delegate= self;
    [self.mTableView reloadData];
}

 

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    static NSString *vCell = @"Cell4Default";
    
    NSUInteger row = [indexPath row];
    
    UITableViewCell *cell = nil;
    cell = [tableView dequeueReusableCellWithIdentifier:vCell];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:vCell];
        UILabel *vLabel = [[UILabel alloc] initWithFrame:CGRectMake(6, 2, 90, 30)];
        vLabel.textAlignment = UITextAlignmentCenter;
        DDTBT_HPTYPE *vHP = [mList objectAtIndex:row];
        vLabel.text = vHP.NM_CHK_TYPE;
        vLabel.textColor = [UIColor blueColor];
        vLabel.backgroundColor = [ UIColor clearColor];
        vLabel.font = [UIFont systemFontOfSize:14];
        [vLabel setAdjustsFontSizeToFitWidth:YES];
        [vLabel setTag:1];
        [cell.contentView addSubview:vLabel];
    }
    return cell;
}

 

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:vCell];
        UIImage *imageUp = [UIImage imageNamed:@"btn_check_o.png"];
        UIImage *imageDn = [UIImage imageNamed:@"btn_check_d.png"];
        UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
        [btn addTarget:self action:@selector(onClickCheck:) forControlEvents:UIControlEventTouchUpInside];
        [btn setImage:imageUp forState:UIControlStateNormal];
        [btn setImage:imageDn forState:UIControlStateSelected];
        [btn setImageEdgeInsets:UIEdgeInsetsMake(4, 6, 4, 2)];
         [btn setTag:0];
        [cell.contentView addSubview:btn];
        
        UILabel *vLabel = [[UILabel alloc] initWithFrame:CGRectMake(6, 2, 90, 30)];
        vLabel.textAlignment = UITextAlignmentCenter;
        DDTBT_HPTYPE *vHP = [mList objectAtIndex:row];
        vLabel.text = vHP.NM_CHK_TYPE;
        vLabel.textColor = [UIColor blueColor];
        vLabel.backgroundColor = [ UIColor clearColor];
        vLabel.font = [UIFont systemFontOfSize:14];
        [vLabel setAdjustsFontSizeToFitWidth:YES];
        [vLabel setTag:1];
        [cell.contentView addSubview:vLabel];
    }

 

 

 

@interface DDTBT_HPTYPE : NSObject {
    NSString    *ID_CHK_TYPE;
    NSString    *NM_CHK_TYPE;
    BOOL        isCheck;
}

@property (nonatomic, strong) NSString    *ID_CHK_TYPE;
@property (nonatomic, strong) NSString    *NM_CHK_TYPE;
@property (nonatomic, assign) BOOL         isCheck;

- (void)clear;

 

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    static NSString *vCell = @"Cell4Default";
    NSUInteger row = [indexPath row];
    UITableViewCell *cell = nil;
    cell = [tableView dequeueReusableCellWithIdentifier:vCell];
    
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:vCell];
        UIImage *imageUp = [UIImage imageNamed:@"hp_yesorno.png"];
        UIImage *imageDn = [UIImage imageNamed:@"hp_yes.png"];
        UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(0, 15, 22, 22)];
        [btn addTarget:self action:@selector(onClickCheck:) forControlEvents:UIControlEventTouchUpInside];
        [btn setImage:imageUp forState:UIControlStateNormal];
        [btn setImage:imageDn forState:UIControlStateSelected];
        [btn setImageEdgeInsets:UIEdgeInsetsMake(4, 6, 4, 2)];
        [btn setTag:0];
        [cell.contentView addSubview:btn];
        
        UILabel *vLabel = [[UILabel alloc] initWithFrame:CGRectMake(40, 12, 120, 26)];
        vLabel.textAlignment = UITextAlignmentCenter;
        DDTBT_HPTYPE *vHP = [mList objectAtIndex:row];
        vLabel.text = vHP.NM_CHK_TYPE;
        vLabel.textColor = [UIColor blackColor];
        vLabel.backgroundColor = [ UIColor clearColor];
        vLabel.font = [UIFont systemFontOfSize:18];
        [vLabel setAdjustsFontSizeToFitWidth:YES];
        [vLabel setTag:1];
        [cell.contentView addSubview:vLabel];
    } else {
        [((UIButton*)cell.contentView.subviews.firstObject) setSelected:((DDTBT_HPTYPE *)[mList objectAtIndex:row]).isCheck];
    }
    return cell;
}

 

- (void)onClickCheck:(id)sender
{
    // 선택한 로우가 몇번째인지
    UITableViewCell *cell;
    UITableView *tv;
    
    cell = (UITableViewCell*)[[sender superview] superview];
    tv = (UITableView*)cell.superview;
    NSIndexPath *path=[tv indexPathForCell:cell];
    
    NSLog(@"clickCheck4 in BsVrfChkInfoDwIdList");
    
    BOOL chk = NO;
    
    DDTBT_HPTYPE *data2 = nil;
    BOOL ret = NO;
    
    for (int i=0; i<[mList count]; i++) {
        data2 = [mList objectAtIndex:i];
        data2.isCheck = NO;
    }
    [_mTableView reloadData];
    
    DDTBT_HPTYPE *data = [mList objectAtIndex:path.row];
    data.isCheck = YES;
    chk = data.isCheck;
    
    UIButton *btn = sender;
    [btn setSelected:chk];
}


'Objective-C, SQLite3' 카테고리의 다른 글

잘 되던게, 갑자기 안되는 문제 해결.  (0) 2021.05.20
ImageButton  (0) 2021.05.18
UIViewController 중첩  (0) 2021.05.18
SOAP protocol  (0) 2021.05.18
자주 쓰는 팝업 구현방법, 그리고 데이터 넘기기  (0) 2021.05.18







UIActionSheet

     UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:[NSString stringWithFormat:@"%@%@점검 건을 전송 후 사용하십시요.\n미 전송 시는 해당 자료가 삭제됩니다.", sI, sU] delegate:self cancelButtonTitle:@"아니오" destructiveButtonTitle:@"예" otherButtonTitles:nil];

        actionSheet.tag = 1;

        [actionSheet showInView:self.view];





@interface GlobalVar : NSObject<UIAlertViewDelegate> {

 

NSString *appId;

NSDate *loginDate; // 로그인 일자

    

    NSDate *sessionDate; // 세션시작 시간

    NSInteger   sessionTimeout;     // 세션Timeout(분)

    BOOL    onFlagVrfChkList;

UserInfo *userInfo;

    

    DDTBT_SITE  *userSelectionSiteInformation;

    

    //global datas

    NSMutableArray *globalAPlist;

    UINavigationController *globalNavigationController;

    NSInteger *globalcounterofstack4frontview;

    UIBarButtonItem *globalHamberger;

    NSString *globalCanYouSeeThisSword;

}



+ (void)alertMsgOKWithTitle:(NSString *)title message:(NSString *)message;

+ (void)alertMsgOKWithTitle:(NSString *)title message:(NSString *)message wait:(BOOL)isWait;

 

@end




+ (void)alertMsgOKWithTitle:(NSString *)title message:(NSString *)message {

    [self alertMsgOKWithTitle:title message:message wait:NO];

}






+ (void)alertMsgOKWithTitle:(NSString *)title message:(NSString *)message wait:(BOOL)isWait {

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:message delegate:nil cancelButtonTitle:@"확인" otherButtonTitles:nil];

    [alert show];

    

    if (YES == isWait) {

        //버튼 누르기전까지 지연.

        while (alert.hidden == NO && alert.superview != nil)

            [[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01f]];

    }

    

}




'Objective-C, SQLite3' 카테고리의 다른 글

ImageButton  (0) 2021.05.18
List  (0) 2021.05.18
SOAP protocol  (0) 2021.05.18
자주 쓰는 팝업 구현방법, 그리고 데이터 넘기기  (0) 2021.05.18
실무 : 데이터를 넘기는 방법 - SQLite 이용...  (0) 2021.05.18

쏩은 XML이다. 삼성에서도 진저리 나게 했는데...

십년 이상 더 보네... JSON 으로 가자 ㅠㅠ

 

- (NSInteger)download_holdpoint {
    HttpRequest* httpJob = nil;
    NSInteger ret = 0;
    @try {
            //---------------------------------------------
            // 전송 SQL문자열을 생성하여 추가한다.
            //---------------------------------------------
            XMLRequest* xmlRequest = [[XMLRequest alloc]init];
        
     
            
            [xmlRequest addFetchSQL:[NSString stringWithFormat:@"<reqhead method='hptype' id='%@'><devicespec platform='ios' line1number='' deviceid='' ver='%@' /></reqhead><reqbody><data cd_site='%@' /></reqbody>"
                                     ,GlobalVar.globalVar.userInfo.userId
                                     ,[GlobalVar currentBundleVersion]
                                     //                                 ,[GlobalVar loadFromUserDefaults:@"udglobalCDSite"] //,mSiteCd/
                                     ,[GlobalVar loadFromUserDefaults:@"udglobalCDSite"]
                                     ]];
            
            //---------------------------------------------
            // 추가된 요청 SQL을 이용하여 송신 XML 문자열을 생성한다.
            //---------------------------------------------
            NSString* sRequestXML = [xmlRequest makeXML];
            NSLog(@"download_Siteeeeeeeeeeeeeeeee sRequestXML:%@", sRequestXML);
            
            //---------------------------------------------
            // 서버에 전송하여 요청결과 XML을 수신한다.
            //---------------------------------------------
            httpJob = [[HttpRequest alloc] initWithURL:SERVERURL timeOut:60];
            NSString* sReceivedXML = @"";
            
        NSRange range = [SERVERURL rangeOfString:@"salesbstest"];
        if(range.location == NSNotFound) { testbed = false; }
        else { testbed = true; }
        
        if(testbed) {
            sReceivedXML = [httpJob requestUrl:sRequestXML];
            NSLog(@"hptype sReceivedXML:%@", sReceivedXML);
            NSData *data = [sReceivedXML dataUsingEncoding:NSUTF8StringEncoding];
            [self saveDataWithData:data withFileName:@"hp002.txt"];
        } else {
            NSString *path = [[NSBundle mainBundle] pathForResource:@"hp001" ofType:@"txt"];
            NSLog(@"local Path: %@",path);
            NSData *returnData=[NSData dataWithContentsOfFile:path];
            NSLog(@"NSData: %@", returnData);
            sReceivedXML = [[NSString alloc]initWithData:returnData encoding:NSUTF8StringEncoding];
            NSLog(@"str of NSData: %@", sReceivedXML);
        }
            
        NSLog(@"hptype2222 sReceivedXML:%@", sReceivedXML);
            //---------------------------------------------
            // 에러가 발생하였다면
            //---------------------------------------------
            if ( nil == sReceivedXML )
            {
                //[self checkErrorMessage: error];
                [GlobalVar alertMsgOKWithTitle:@"mBASS" message:@"자료 받기[현장정보]에 실패하였습니다."];
                return -1;
            }
        
        //---------------------------------------------
        // 수신한 XML전문을 parsing 한다.
        //---------------------------------------------
        NSMutableArray *list = [NSMutableArray arrayWithCapacity:0];
        NSString* sResult = [XmlBizParser parsehptype:sReceivedXML array:list];
        /*
         if (0 == [list count]) {
         [GlobalVar alertMsgOKWithTitle:@"mBASS" message:@"권한 현장이 없습니다."];
         return -1;
         }
         */

        //---------------------------------------------
        // parsing중 에러가 발생하였다.
        //---------------------------------------------
        if ( 0 != sResult.length )
        {
            //[self 에러처리함수: sResult ];
            [GlobalVar alertMsgOKWithTitle:@"mBASS" message:sResult wait:YES];
            //[GlobalVar alertMsgOKWithTitle:@"mBASS" message:@"로그인에 실패하였습니다."];
            return -1;
        }

        SqlUtils *db = [[SqlUtils alloc] init];
        [db insertTable_DDTBT_HPTYPE:list];
        
    } @catch (NSException * e) {
        //[self 에러처리함수:[e reason]];
        [GlobalVar alertMsgOKWithTitle:@"mBASS" message:[e reason]];
        return -99;
    }
//    //**********************************************************************
//    // end
//    //**********************************************************************
    return ret;
}



 

 

팝업 라이브러리 많은데... 뷰 컨트롤러가 편하다. 이미 있는 뷰컨을 붙이기도 좋다. (다들 공감하실 듯)

 

VC에 property 붙이고 

@property (assign, nonatomic) IBOutlet UITextField *mTextDfctCnts;

@property (weak, nonatomic) IBOutlet UILabel *mHiddenNipt;

 

@property (nonatomic, strong) NSString *mDongCd;

@property (nonatomic, strong) NSString *mNohs;

 

 호출할 때 세팅해 주고 호출하면 된다.

#import "HJH_Nipt.h"

- (IBAction)onClickNipt:(id)sender {

    HJH_Nipt *areaSelectView = [[HJH_Nipt alloc] initWithNibName:@"HJH_Nipt" bundle:nil];

    areaSelectView.mDongCd = mDongCd;

    areaSelectView.mNohs = mNohs;

    areaSelectView.mTextDfctCnts = mTextDfctCnts;

    areaSelectView.mHiddenNipt = _mHiddenNipt;

    self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;

    [self presentModalViewController:areaSelectView animated:YES];

    areaSelectView.view.alpha = 0;

    [UIView animateWithDuration:0.5 animations:^{

        areaSelectView.view.alpha = 1.0;

    }];

}

 

 xib는 덤. Swift에서도 잘 쓰는 패턴이지만 왠만하면 스토리 보드로 하려고 한다.(팝업에 뭔 스토리 보드냐만... Swift UI 까지는 아니더라도 보낼 껀 보내줘야 한다는 생각이다.)

 

<?xml version="1.0" encoding="UTF-8"?>

<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="15705" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" colorMatched="YES">

    <device id="retina4_0" orientation="portrait" appearance="light"/>

    <dependencies>

        <deployment identifier="iOS"/>

        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15706"/>

        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>

    </dependencies>

    <objects>

        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="HJH_Nipt">

            <connections>

                <outlet property="mBackgroundView" destination="Lb2-JR-zbW" id="4Cg-J5-AMD"/>

                <outlet property="mBtnClose" destination="T4o-ib-duN" id="pJi-NV-1U1"/>

                <outlet property="mBtnSubmit" destination="dOR-Xt-bzK" id="KzB-bv-P6O"/>

                <outlet property="mTableViewMainList" destination="DcY-JW-cU7" id="Rte-nI-gdt"/>

                <outlet property="mTextViewCnt" destination="Lb2-JR-zbW" id="wAS-6v-0Co"/>

                <outlet property="pantaegi" destination="N2a-Bs-zGH" id="ngu-Vc-jMj"/>

                <outlet property="view" destination="1" id="43"/>

            </connections>

        </placeholder>

        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>

        <view contentMode="scaleToFill" id="1">

            <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>

            <autoresizingMask key="autoresizingMask" widthSizable="000000000" heightSizable="YES"/>

            <subviews>

                <view clipsSubviews="YES" contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="N2a-Bs-zGH" userLabel="pantaegi">

                    <rect key="frame" x="26" y="37" width="267" height="443"/>

                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>

                    <subviews>

                        <button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="dOR-Xt-bzK">

                            <rect key="frame" x="157" y="390" width="70" height="30"/>

                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>

                            <fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>

                            <state key="normal" title="점검요청">

                                <color key="titleColor" systemColor="systemBlueColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>

                            </state>

                            <connections>

                                <action selector="onClickSubmit:" destination="-1" eventType="touchUpInside" id="sqI-Hp-Hca"/>

                            </connections>

                        </button>

                        <button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="T4o-ib-duN">

                            <rect key="frame" x="52" y="390" width="56" height="30"/>

                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>

                            <fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>

                            <state key="normal" title="닫기">

                                <color key="titleColor" systemColor="systemBlueColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>

                            </state>

                            <connections>

                                <action selector="onClickClose:" destination="-1" eventType="touchUpInside" id="cZf-88-3b1"/>

                            </connections>

                        </button>

                    </subviews>

                    <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>

                </view>

                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="별매품 현황" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="hlE-i0-sBR">

                    <rect key="frame" x="95" y="44" width="130" height="46"/>

                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>

                    <fontDescription key="fontDescription" type="boldSystem" pointSize="19"/>

                    <color key="textColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>

                    <nil key="highlightedColor"/>

                </label>

                <tableView clipsSubviews="YES" contentMode="scaleToFill" fixedFrame="YES" alwaysBounceVertical="YES" style="plain" separatorStyle="none" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="DcY-JW-cU7">

                    <rect key="frame" x="26" y="98" width="267" height="252"/>

                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>

                    <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>

                    <connections>

                        <outlet property="dataSource" destination="-1" id="ags-GI-0bR"/>

                        <outlet property="delegate" destination="-1" id="yef-C7-2gK"/>

                    </connections>

                </tableView>

                <textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" fixedFrame="YES" text="점검 요청 내역" textAlignment="natural" translatesAutoresizingMaskIntoConstraints="NO" id="Lb2-JR-zbW">

                    <rect key="frame" x="30" y="358" width="259" height="59"/>

                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>

                    <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>

                    <color key="textColor" systemColor="labelColor" cocoaTouchSystemColor="darkTextColor"/>

                    <fontDescription key="fontDescription" type="system" pointSize="14"/>

                    <textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>

                </textView>

            </subviews>

            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>

            <simulatedNavigationBarMetrics key="simulatedTopBarMetrics" barStyle="black" prompted="NO"/>

            <point key="canvasLocation" x="138.75" y="119.36619718309859"/>

        </view>

    </objects>

</document>

 

sql이 사용하기 편하다 - 단점은 느리다 ㅡㅡ;

 

https://www.sqlite.org/download.html

  1. SQLite 의 SQL 문은 대소문자 구분이 없다.



#import <sqlite3.h>


sqlite3 *database;
NSString *databaseName = @"audreyDev001.db";;;;;;;;;;;;;;;;;;;
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);;;;;;;;;;;;;;
    NSString *documentsDir = [documentPaths objectAtIndex:0];;;;;;;;;;;;;;;;;;;;
    NSString *databasePath = [documentsDir stringByAppendingPathComponent:databaseName];;;;;;;;;;;;
    NSString *currentProgressString = @"";
    
    if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
        NSString *query = @"select mId \
        from table_user;";
        const char *sqlStatement = [query cStringUsingEncoding:NSASCIIStringEncoding];
        sqlite3_stmt *compiledStatement;
        if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {
            // Loop through the results and add them to the feeds array
            while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
                currentProgressString = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)];
                break;
            }
        }
        sqlite3_finalize(compiledStatement);;;;;;;;;;;;;;;;;;;;;;;;;;
    }
    sqlite3_close(database);;;;;;;;;;;;;;;;;;;;;;;;;;;;



DFCT_LIST*data=[[DFCT_LISTalloc]init];
data.id_mbil=sqlite3_column_int(compiledStatement,0);
data.cd_dong=[NSStringstringWithUTF8String:(char*)sqlite3_column_text(compiledStatement,1)];
data.nohs=[NSStringstringWithUTF8String:(char*)sqlite3_column_text(compiledStatement,2)];
data.id_rgon=sqlite3_column_int(compiledStatement,13);



NSString *col = [NSString stringWithUTF8String:(char *)sqlite3_column_name(compiledStatement, i)];
                    NSString *data = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, i)];

 

 

 

SELECT 

select user_id from audrey_user_id;

 

select count(a.myid) from mylist a;

 

 

나머지는 ... 다른 곳이 워낙 잘 나와있어서... 구글링 ㄱ

서버에서 primary key 를 하나에서 2개로 변경하던지 혹은 비슷한 상황이 오면 로컬 DB에 제대로 데이터 저장이 안 된다.

 

2021-05-18 09:19:28.617492+0900 MBASS[17630:4039723] row insertion error

 

커뮤니케이션 미스가 빈번하니... 로컬 DB 관계는 계속 풀게 되네.

 

어차피 그냥 JSON처럼 텍스트로만 나가는게 나은 것일지도 모르겠다.

 

믓튼 로컬에서는 키를 풀었다.

PRAGMA foreign_keys = OFF;

BEGIN;

CREATE TABLE _DDTBT_TPPG_new (
    CD_LOC_CLSF VARCHAR(10)
  , CD_TPPG VARCHAR(10)
  , ID_DWG_ATCH_FILE VARCHAR(100)
  , NM_TPPG VARCHAR(10)
);

INSERT INTO _DDTBT_TPPG_new (
    CD_LOC_CLSF
  , CD_TPPG
  , ID_DWG_ATCH_FILE
  , NM_TPPG
)
SELECT
    CD_LOC_CLSF
  , CD_TPPG
  , ID_DWG_ATCH_FILE
  , NM_TPPG
FROM DDTBT_TPPG;

DROP TABLE DDTBT_TPPG;

PRAGMA legacy_alter_table = ON;

ALTER TABLE _DDTBT_TPPG_new RENAME TO DDTBT_TPPG;

PRAGMA legacy_alter_table = OFF;

COMMIT;

PRAGMA foreign_keys = ON;

책을 편집하던 중에 새로운 기술이 계속 나오고,

지난 레거시는 버리려고 해도 개발 의뢰가 너무 많아서...

 

정리한 것도 블로그에 올려서 나 스스로도 복습하고,

다른 사람에게도 조금이나마 도움이 되었으면 하는 바램으로...

 

그렇게 하루에 조금씩 조금씩...

 

이 게시판은 Objective-C와 sqlite3를 다룹니다.

 

Swift는 당연히 coreData를 다루겠지요.

서론(안 읽어도 됨)

모바일 기기가 일반화되고, 우리 아이 세대들은 더 이상 디지털 유목민, 이주민 소리를 듣지 않고 디지털 네이티브 세대로 불리게 되었다.

 

https://news.joins.com/article/21737997

 

수화기 귀에 갖다 대면 요즘 아기들이 보이는 반응

전화기를 모르는 세대가 등장했다는 소식에 온라인이 들썩이고 있다. 7일 한 온라인 커뮤니티에는 "충격적인 세대 차이 실화"라는 제목으로 한 트윗이 소개되었다. 아기가 물건이 전화기의 수화

news.joins.com

수화기 귀에 갖다 대면 요즘 아기들이 보이는 반응

전화기를 모르는 세대가 등장했다는 소식에 온라인이 들썩이고 있다. 7일 한 온라인 커뮤니티에는 "충격적인 세대 차이 실화"라는 제목으로 한 트윗이 소개되었다. 아기가 물건이 전화기의 수화

news.joins.com

 

 

이제 전화기를 모르기 때문에 전화가 왔다고 하면 손을 굽혀서 귀에 가져다 대지(휴대폰 쓰는 것처럼), 우리 세대처럼 새끼손가락과 엄지만 펼쳐서 귀에 가져다 대지 않는다.

 

그래서 나이 든 사람이라도 알아야 하는 기본 IT 지식이 있다. 꼭 아랫 세대와 소통하기 위해서도 아니고 본인이 상품을 구매할 때도 디지털 기기를 사야 하는 상황에서 알아야 하는 지식이 있다.

 

서론이 더 길어졌는데 앞으로 이런 류의 간단한 IT 용어를 편하게 말하기 위해서라도 글을 쓰겠다는 전체적 서론으로 보면 되겠다.

 

오늘은 USB-C와 썬더볼드(Thunderbolt) 3을 이야기하려고 한다. USB4와 썬더볼트 4도 이미 개발되었지만 알다시피 상용화되고, 또 호환성을 가지거나 혹은 완전히 새롭게 관련 장치들이 바뀌는 데에는 꽤 시간이 오래 걸린다. 그럼에도 USB-C는 애플의 맥북 충전기가 한 단계 퇴보를 하면서까지 도입한 규격이다. 자석 타입이라 케이블과 노트북이 더 안전한데도 불구하고 더 불편한 USB-C가 일반화되었다. 그럼에도 휴대폰은 USB-C가 아니라 라이트닝을 그대로 쓰는 것은 아직 그만큼의 기술력이 안되어서 그렇다고 보면 되겠다.

 

USB-C, Thunderbolt3

우선, 두 용어는 휴대폰 같은 장치 연결 타입이라고 보면 본다. 썬더볼트 1, 2 때와 썬더볼트 3의 소켓은 다르다. USB-C와 Thunderbolt3의 소켓은 동일하다. 그러나 썬더볼트 3가 USB-C 보다 빠르므로 같은 가격이면 썬더볼트 3을 고르는 것이 좋다. 노트북을 고르던, 연결 케이블을 고르던, 독(dock)을 고르던, 젠더를 고르던 말이다. 추가로 USB-C처럼 생겼는데 번개 표시(썬더볼트 표시)랑 숫자 3이 있으면 그것이 더 빠르 다고 생각하면 된다. USB-C를 살 때는 USB-PD 지원이라던지. 3.1이라던지. 100W 지원을 고르면 되겠다. 가장 중요한 것은 100W라는 것이겠다. 이것을 알아야 마케팅 용어에 속지 않는다. 애초에 썬더볼트 3나 USB-C가 USB세상을 거의 통일하게 된 것은 전송 속도보다는 100W 충전 지원이기 때문이다.

Fin.

 

'Objective-C, SQLite3' 카테고리의 다른 글

서버 개발자와 작업시 찾기 힘든 에러...  (0) 2021.05.18
순수 학문으로 다시 돌아 갑니다.  (0) 2021.05.18
노인이 될 준비  (0) 2021.01.20
오후 반차 쓴 유튭 개발자  (2) 2020.09.14
스트레스  (0) 2020.09.12

UN에서 정한 노인의 국제적 기준 연령이 65세인데, 이제 41살인 내가 벌써부터 노인이 될 준비 한다고 하면 주변 어르신들이 황당해하실 것이라 생각할 수 있다. 그러나 아실 이런 이야기는 주변에 해 온지 십 년은 넘었고 중년기 다음이 노년기이므로 글을 쓸 수는 있을 것 같다. 자의적이기라기보다는 주변 사람들의 영향 때문이다. 주변에 암 환자들이 많았고, 그중 돌아가시는 분이 계셨고 우울한 가정사에 나는 김광석을 매우 좋아했다.

https://www.youtube.com/watch?v=Il52fKokmcM&ab_channel=leejinyoungful

심리학자인 친구는 우울한 시간이 나에게 정말 도움이 많이 되는 시간이라고 했다. 자기 성찰이 되고 성장하는 시기가 이렇게 블루 한 시간이라고 했었다. 그런 시간 후에 굳은 땅에서 서른둘의 나이로 떠나던 김광석 보다 어른스럽게 세상을 보고 있는지 스스로에게 물어본다.

아닌 것 같다.

 나이가 들어 생기는 신체적 변화는 코털이 어느 순간부터 밖으로 자란다. 그래서 코털 정리도 해 주어야 한다. 또 쉽게 지친다. 내 기억에 젊은 시절에는 이틀, 길게는 3일까지 잠을 안 자도 금방 회복이 되었다. 그러나 지금은 하루만 밤 새도 그다음 4일이 힘들다. 길게는 일주일 내내 정신 못 차릴 때도 있다. 40살이 되면서 어느 순간 노안이 왔는데 잘 보이던 많은 것들이 보이지 않았다. 생체 시계는 참 정확한 것 같다. 체력은 확실히 떨어졌지만 면역력은 홍삼 덕분인지, 마스크 덕분인지 최근 6~7년 감기에 걸리지 않았다. SK의 가습기 살균제 때문에 천식이 생겨서 감기, 코로나는 더욱더 위험하기에 주의하는 것도 있다. 사족이지만 내 신용카드 조회를 통하여 가습기 살균제에 대해 사회적 참사 특별조사위원회 : http://www.healthrelief.or.kr/ / TEL. 1833-9085에서 직접 나에게 연락을 주었다. 내가 자세히 다루지는 않았지만, 아마 폐 상태는 이미 노인이라고 자부한다. 뭐, 자랑이고...

 

나에게 이런 폐를 만들어준 SK라는 기업을 알아보다 보니 정말 내 생각보다 너무도 더러웠다. 그러나 그렇게 더 오래 생각해 보니 정말 나쁜 사람들이 그랬다기보다. 정말 여러 단계에서 조금씩 양심을 져 버린 그 결과 수 없이 많은 신생아와 어린이들을 죽이거나 평생 불구로 살게 만들었다는 결론을 스스로 내었다.

그 누구도 책임질 사람이 없었다. 내가 시스템을 설계하는 방법 중 하나가 indirection layer를 여러 개 만드는 것이었다. 컴퓨터에서 쓰는 시스템을 사회로 가져와 보겠다. 가령 문재인 대통령이 있고 사회 시스템을 만든다고 하면, 문재인 대통령은 원리/원칙 주의자로서 역할을 하도록 단 하나의 임무만을 준다. 그 외 다양한 일과 책임질 만한 특정한 일은 여러 사람에게 나누어 주고 일이 잘되면 그 사람 공으로 또 일이 안되면 그 사람이 책임지도록 하는 것이다. 최고로 잘할 사람을 앉히겠으나 그 일은 꼭 필요한 일이기에 교체 가능하도록 한다.

 

나는 SK에서 만들지는 않았지만 양산하는 백신은 맞고 싶은 생각이 없다. 만약, 그것을 알 수 있다면 말이다. 대기업 순환출자 구조는 사실 재벌만을 위한 것이다. 그리고 각 회사는 실제적으로 보면 매우 약하게 연결되어 있다. 각 임직원들 간의 자존심 때문만이 아니라 정말 그렇다. 그러나 문재인 대통령이 되고 사회적 비리가 줄어들고, 또 드러나지 않던 것들이 공개되는 이유는 바로 그가 대통령이기 때문에 그렇다. 

인간성은 그룹 계열사를 넘어 강한 지배력이 있다. 

삼성만 봐도 비리 경영진이 구속될 때마다 오히려 주가가 뛰었다. 그렇다 하더라도 난 경영진보다는 그 경영진에게 이렇게 하면 내가 입신양명하겠구나 하는 사람들이 더 문제라고 생각한다. 문재인이 삼성으로 간다거나 SK의 수장이 되면, 그 누구도 부정한 방법으로 회사를 살리려는 시도 자체를 하지 않을 것이다. 그러나 반대의 사람이 앉아 있다면. 이익을 위해서라면 저렇게 수많은 아이들을 죽이고도 시스템을 잘 만든 자신을 뿌듯하게 여기고 다른 사람은 이 위치에 있을 수 없으니 내가 더 나은 삶이었다고 뒤 돌아보는 삶이라면? 내가 스티브 잡스나 빌 게이츠를 욕할 때도 있지만 사실 이 정도로 더럽게 살지 않아도 그들보다 두 세배가 아닌 , 몇십 배는 더 많은 재산을 모았다. 세상은 참 어렵다. 재벌이라도 진정성 있는 사과를 할 수 있는 위치는 아니다. 법무팀의 변호사들은 죄를 인정하면 안 된다고 이야기를 할 텐데 그 수만, 수백 명이다. 게다가 판결하는 판사와 사법고시 동기 거나 선 후배 사이일 것이다. 잡아떼다 갑자기 증거가 나왔을 때는 사실 또 어쩔 도리가 없다. 그러나 생각보다 나쁜 것들이 잘 먹히는 세상이었다.

나는 이 기자들을 욕하고 싶지 않다. 왜냐면 이런 영상에 댓글로 욕하는 사람들이 날 응원해 줄 때도 있었지만 욕할 때도 있었기 때문이다. 대중은 그렇다. 다만, 이재용 가방을 들도록 기획한 놈들은 참 잘못했다는 생각이다. 그래서 이재용은 여기서 나쁘지 않다고 이야기를 한 적이 있는데, 어느 다른 분이 그런 사람을 아래에 두는 것도 무능한 것이라고 한 적은 있다. 사회에서 높은 위치에 있다고 스스로 여겨지면 책임질 것도 자연스레 많다는 것을 다시금 깨달았다. 믓튼, 이 기자는 어느 정도 돈을 벌어서 가족 부양을 했다면, 삼성을 나와서 많은 이야기들을 해주었으면 좋겠다. 그러나 아마 삼성이 그렇게 하지 못하도록 노후 보장도 해 줄 것이다. 그게 아니라면 꼭 주변 지인들에게 연락하거나 유튜브 혹은 나에게 연락해서 같이 방송을 해줬으면 하는 바람이다. 어차피 한 번뿐인 인생이고 우리는 다 같은 한 민족이지 않은가?

 

내가 노인이 될 준비는 바로 이런 이야기 들에 기반을 두고 있다. 주름이 생기고 피부는 흐물흐물 해지고, 등은 굽고 흰머리에 기억력은 감퇴되겠다. 또, 다양한 질병에 걸린 위험에 노출되겠지만. 늘 그랬듯이 현실의 더러움과 타협하지 않고 옳다고 생각하는 것을 하며 사는 일반인이 되는 것이다.

 

그리고 솔직히 말해서 기자들 너무 박봉이다. 저널리즘을 돈으로 더럽히고 싶지는 않으니 국가가 좀 나서야 한다고 생각했다. KBS, YTN 만 지원금을 주는 것도 좀 웃기다. 뉴스타파 같은 언론은 시민의 힘으로 살아가고 오마이뉴스의 경우 정말 배고프고 고독하게 살아가는데 미래 보장도 없다. 국가에 생각이 있는 사람들이 있다면 국민들이 중립적으로 또 저널리즘을 가지고 보도하는 기자들은 공무원으로 편입을 해야 한다. 공무원으로 편입하면 국가의 개가 되니 어쩌고 하는 사람들이 있을 것 같은데 근로기준법과 별개로 사법부에서 강력하게 언론일을 보호하는 방식이 되어야 한다. 진보가 판단하던, 보수가 판단하던 진실 기반에서 판단을 해야 할 텐데 그런 source 자체가 더럽혀지면 안 되기 때문이다. 호방한 인물 + 현실과 타협하지 않는 정의감 넘치는 사람 + 국가가 노후 보장 + 행정부 허튼짓을 사법부가 감시하도록 입법.

 

공수처도 좋은 방법이긴 하다. 그리고 걸출한 이 시대의 호걸 2명을 희생시키며, 어렵게 출범시켰다. 그러나 대한민국이 아직 미래가 있는 것은 숨기는 것이 밝혀졌을 때 나쁜 놈들이 그래도 그것이 나쁜 줄은 안다는 것이다. 그냥 어두운 곳에 불만 밝히면 된다. 그리고 이미 한국의 수많은 기자들이 그 길을 걸었고, 노년이 되어 가는데 그 누구도 알아봐 주지 않는 대중에 실망해서 사람뿐 아니라 시사 in, 경향 같은 깨끗했었던 언론 자체도 시나브로 바뀌는 뉘앙스를 느낀다.

 

나 역시 설산의 청초하게 핀 난과 같은 사람은 아니기에, 그런 사람들을 욕할 자격도 없다. 성철 스님도 아니고 말이다. 다만, 노년이 되어 정말 그 누구도 어쩌지 못하는 악인을 만났을 때 다른 사람들이 정해 놓은 길은 거의 걷지 않았던 이력이 사회에 도움되도록 뭔가를 하고 싶다. 그러면 나 스스로 미련 없이 세상을 떠날 수 있을 것 같다.

 

'Objective-C, SQLite3' 카테고리의 다른 글

USB-C, Thunderbolt3  (0) 2021.02.28
노인이 될 준비  (0) 2021.01.20
스트레스  (0) 2020.09.12
이전... 지금까지 이전한 글은 수정해서 다시 발행할 예정이다.  (0) 2019.02.10
브런치 이전  (0) 2019.02.10

우선 전자 담배도 몸에 해로운 것은 마찬가지. 우선, 스트레스 측정부터

www.ymhc.or.kr/html/information/own/own6.html

 

스트레스측정

 

www.ymhc.or.kr

 

gs.iseverance.com/health/self_test/stress/stress01.asp

 

스트레스측정 < 강남세브란스헬스체크업

 

gs.iseverance.com

여긴 이상하다.

www.ywmc.or.kr/web/healthcare/measure_stress

 

스트레스측정 - 체크업센터

 

www.ywmc.or.kr

나무위키에도 스트레스 풀 때 흡연은 없다.

namu.wiki/w/%EC%8A%A4%ED%8A%B8%EB%A0%88%EC%8A%A4

 

스트레스 - 나무위키

서버나 하드웨어의 부하(load)를 의미하며, 무언가를 정식 출시하기 전에 서버가 얼마나 버틸 수 있는지 시험하는 것을 스트레스 테스트라고 한다.

namu.wiki

 

-=-=-=-=-=-=--=0-=0=-0=0=-0-=0=-0=-0=0=0=-0=-0=0=-0=-0=-0=0=0

스트레스로 담배를 피는 사람들이 있다.

 

아래 내용은 아스파이어 AVP PRO 

흡연가(X), 흡증가(O) 증기: vapor   흡증가 : vaper

Vaper 출처: urbandictionaryA user of electronic cigarettes

이렇게 생겼다. 공식 홈페이지도 매장을 운영 한다.

www.aspirecig.com/aspire-kits/aspire-kits629.html

 

Aspire AVP Pro - Aspire® Official Site

Are you 21 or older? AGE VERIFICATION WARNING : To use the ASPIRE official website you must be aged 21 years or over. Please verify your age before entering the site.

www.aspirecig.com

내가 아마존 매니아라 해외 배송할까도 생각을 했지만, 매장 하나 알아두면 좋을 것 같아서 주변 매장을 둘러보았는데 D타워라 20걸음만 가면 되는 르메이에르 건물에 3개나 있더라... 

 

결론적으로 여기서 샀다. 전자 담배에 대해서 가장 많은 정보를 주던 곳이었다.

 

아마 물건이 있었다면 여기 처음 갔었는데 바로 여기서 샀을 것 같다. 아저씨께서 AVP PRO는 현재 문제가 있어서 전량 반품했고 9월 말에 다시 들어 온다고 하셨다. 인터넷에 찾아 보니 정말 그랬고, 지인을 통해 알아보니 2006, 2007 이 문제 있다는 것을 알았다. 그리고 첫 번째매장 (내가 구매한 매장)을 통해 2006, 2007은 생산 년도가 아니라 공장 라인 번호고 모든 2006, 2007이 문제가 아니라 문제있는 뒷 번호 조합이 있어 그것은 모두 반품 회수 처리 되고 있다는 것이다. 종로 계신다면 여기 무조건 강추!!!

그리고 여기는 마지막 매장. 같이 간 분이 왜 이렇게 불친절 하냐고 했던 곳인데 사실 하루 3번이나 갔기 때문에 그럴만도 했다. 결론적으로 2006, 2007 문제 있다는 사실 인지도 안 되고 있었는데 들어보니 이번 주에 매장을 뺀다고 한다. 첫 방문 때 점원이 안에서 담배를 피던데... 보통 내가 부산에 있을 때는 깡년이라고 하며 싸우곤 했지만 이제 나이도 들고 그러려니 한다. 그 때 구입하던 아저씨가 있었는데 같이 설명 들어야 하는데 본인만 생각하는 끼어들기 질문이나 주변 사람 안중에도 없는 내가 낸데 스타일(일수 가방에 깍두기 머리에 몸매 안 좋은데 쫄리는 티셔츠 등로 딱 내가 싫어하는 타입이라 2006, 2007 이야기 꺼내지 않았다. 매장 사라지면 다른 매장 가서 개짓거리 할 것 같다는 생각이 들지만 뭐 안 봤으니 지레 짐작은 말아야지. 물론, 판매 제품이 2006, 2007 뒷 자리가 문제 없어서 회수 통보를 못 받았을 수도 있는 등 여러 고려 사항이 있어 섣부르게 끼어들기는 금지. 그래도 더 알아 보라는 말은 사려는 친한 친구에게만 했다.

주말에 가면 이렇게 물을 준다.

몇 걸음 더 가면 아이코스도 있다. 아이코스는 한정판 종류별로 사서 주변 사람들 선물로 100만원 넘게 썼는데 사실 비추천 한다. 우선, 받은 사람 3명이 심이 뿌러져서 교환을 했다. 그리고 보상 판매로 신제품을 받았는데 그 신제품도 문제가 있어 A/S 하러 왔다. 너무 친절해서 좋았지만 서로 무엇이 문제인지 문제 인식이 안되는 것 같아서 난 비흡연자에 아이코스 사용자가 아니지만 조언을 했다. 히팅 문제로 보이는데 온도 측정 가능한 기기로 시간별 그래프 그리면서 담배 태울 때 히터 능력 측정해서 그래프 공유하면 소비자랑 분쟁이 없을 것 같다고 했다. 그러니 그 기계이 이제 들어온다는 것이다. 헐...

믓튼, 아이코스 친구랑 AVP PRO 친구랑 만났는데 아이코스 친구도 AVP PRO로 넘어 간다고 한다. 난 좀 더 알아보고 있지만 우선, 액상은 타르가 없다고 한다. 니코티만 있는데 그 니코틴 함량도 1달 피면 담배 2~3까치 정도의 양이라는 말을 들었다. 물론, 이 글 이후로 계속 탐구하겠지만 해외에서는 액상 담배를 금연 보조제로 쓴다는 말을 들었고, 니코틴은 중독성이 있지만 카페인 보다는 나을 것 같다는 요즘 생각이라...

추 후 더 포스팅 하면서 탐구해 볼 생각이다.

최민식이 말했다. 내 마음은 가족도 모른다고, 내 속을 들어갔다 나온 녀석은 담배 밖에 없다고... 그리고 예술 하는 사람들은 대마를 참 많이 하더라... 네덜란드는 마약류 중 합법인 것도 많고... 

 

참, 홍대 쪽 가게는 기계값 현금가로 4만원인데 지금 무슨 연합 같은게 있어서 6.2만원에 통일하라는 말이 돈다고 한다. 친구는 4만원에 샀고, 난 6.2에 산게 사실이라. 참고하시길... 

니코틴, 출처 나무위키 2020년 9월 12일 버전

유기화합물

[ 펼치기 · 접기 ]

유기화합물 - 알칼로이드

[ 펼치기 · 접기 ]

 



1. 주요한 특성2. 유해성3. 위험성



Nicotine. 알칼로이드의 하나다.

니코틴이라는 이름은 브라질에서 자국으로 흡연 문화를 전파한 프랑스의 외교관이자 언어학자인 장 니코(Jean Nicot)의 이름에서 유래했다. 가지과의 식물인 담배에 많이 들어있는 염기성 유기 화합물로[1], 말초신경을 흥분시키거나 마비시키기 때문에 쥐약의 원료로 사용된다.

1. 주요한 특성[편집]

  • 반수 치사량 - 알려진 LD50 치사량은 kg당 0.5~1mg, 즉 60mg 정도이다.(성인 기준. 50mg/kg는 쥐, 3mg/kg는 생쥐, 어린이는 0.1mg/kg. 참고로 청산가리의 LD50은 1mg/kg이다.) 그러나 실제 치사량은 대략 6.5~13mg/kg 이상이라고 한다.[2] 담배를 피울 때 실제로 흡수되는 양으로 따진다면, 60mg은 담배 6백~1천 개피 수준이다.
    하지만 이건 성인이 정상적으로 피웠을 때 얘기고, 어린아이의 경우엔 소량으로도 치명적이어서 영유아가 멋모르고 아빠의 담배를 먹다 사망하는 사고가 드물게 발생하기도 한다. 또한 전자담배에 넣는 니코틴 액상을 실수로 다른 통에 넣었는지 모르고 마신 사람에 따르면 일단 맛 자체는 혀를 녹여버릴 듯한 싸함과 구역질이 날 정도로 쓰고, 마시고 약 10분 정도가 지나자 소주를 병나발로 분 듯 한 어지러움과 구토증세가 발현되고 그 뒤로 몇 분 지나니 죽을 것 같은 공포감과 심해지는 어지러움에 빨리 화장실로 가서 구토를 해서 겨우 살았다는 이야기가 있다.[3] 옛날에 주당들이 꽁초관리를 잘못 해서, 어두운 술병을 다 비운 다음에 병 속에 든 담배꽁초를 발견하는 일이 가끔 있었다. 이러면 시간이야 짧지만 니코틴과 타르를 알콜로 추출해 마신 격..[4]

  • 반감기 - 혈중 니코틴의 반감기는 대략 40분정도이며 체내에서 2시간 정도(카페인은 5시간) 상당히 짧다. 그렇기 때문에 반수 치사량이 카페인보다 높지만, 지속 섭취해도 체내 농도가 계속 높아지지는 않는다. 담배 한 개비는 0.1mg~0.6mg정도의 니코틴을 함유하고 있고, 담배를 피우면 여기에서 약 1/10 정도가 흡수되는 데, 이를 위의 반수치사량에 대입해보면 아무리 골초라고 해도 체내 농도가 위험 수준에 이르는 것은 불가능하다.

  • 발암 물질 - 흔히들 담배의 타르, 카드뮴 등이 발암성을, 니코틴이 중독,각성 효과를 가진다고 생각하지만 이는 틀린 정보이다. 폐암세포에서 니코틴 수용체가 발현되어, 니코틴이 폐암세포의 세포자살을 억제함으로서 발암성에 관여한다고 알려져 있다.

  • 중독성과 의존도 - 일반적인 흡연 정도의 투여량으로 비추어 볼 때 니코틴의 경우 인체에 대한 유해성은 비교적 낮지만, 중독성, 즉, 의존도는 상당히 높은 물질이다. 의존도에서 대마초[5], 알코올[6]보다 높으며 그 무시무시한 헤로인, 코카인 바로 아래라고 보면 된다. 더군다나 가장 일반적인 니코틴 공급 통로인 담배(연초)는 니코틴 이외에도 담배회사에서 맛을 위해 첨가된 가향 및 다양한 물질이 있어서 더 쉽게 중독된다.

  • 각성효과 - 니코틴의 대표적인 효과로 각성효과가 있다. 니코틴에 중독되면 흡연할 때 몸속에 극도의 스트레스 기전이 발동한다. 니코틴은 스트레스 호르몬인 코르티솔 아드레날린을 과다 분비하도록 하여 교감신경을 흥분시켜 몸이 각성하게 된다.[7]일시적인 집중력 향상의 효과가 있으나 장기적으로는 뇌기능이 떨어지게 된다.[8] 또한 도파민계 중추신경을 강제로 자극해서 도파민이 과다 분비되고 일시적인 행복감을 준다. 이 물질이 줄어들면 흡연 욕구가 생기고 이때 니코틴 공급이 안 되면 금단증상이 나타난다. 옛날의 흡연은 담뱃잎을 태워 나오는 연기를 그대로 마셨는데 주술사들은 그때 발생하는 각성효과를 이용해서 다른 사람들에게 예언을 해주곤 했다. 스티븐 킹도 이런 각성 효과의 도움을 많이 받았는데, 자서전인 유혹하는 글쓰기에서 니코틴은 창작과 필력에 도움을 주지만 영혼을 갉아먹는다라고 말했다.

2. 유해성[편집]

흔히 담배에 포함된 타르, 일산화탄소 등 유해물질에 가려지고 소변으로 모두 배출된다하여 상당히 저평가 받고 있지만, 니코틴은 의존, 중독 증세를 일으킬 수 있는 향정신성 물질로 혈압을 높여 고혈압을 유발할 수 있으며 그에 따른 각종 심혈관계 질환[9]의 원인이 될 수 있다. 예를 들어 심장에서 방출된 혈액이 전신을 한 바퀴 순환하고 나면 흡수된 니코틴의 35%가 뇌에 전달되는데 이로 인해 뇌졸중이 발생할 수도 있으며, 미세혈관 수축으로 인한 탈모를 유발하거나 인슐린 대사를 막을 수 있다.

중추신경을 자극하기 때문에 불면증을 일으킬 수 있다. 다만 체내에 니코틴이 머무를 때의 증상이기 때문에 담배를 끊으면 충분히 개선할 수 있다. 하지만 전자담배는 연초와 비슷한 목넘김을 위해 연초보다 더[10] 많은 양의 니코틴을 첨가하기 때문에 장기적으로 문제가 될 수 있다. 또한 금연 중인 사람이 붙이는 니코틴 패치를 보면 붙이고 잠을 청할 경우 악몽을 꾸거나 불면증에 시달릴 수 있다는 경고문을 볼 수 있다.

미국드라마 X파일에서의 한 에피소드에서 담배의 변이기생충[11]에 감염된 멀더가 골골대고 있을 때 만성 골초였던 한 담배 테스터[12]만 멀쩡하다는 것을 안 스컬리가 멀더를 치료할 때 쓴 것도 바로 이 니코틴이다. 그때 스컬리가 했던 말은 담배는 무엇보다도 강한 천연 제충제라는 설명으로 그의 몸에 직접적으로 니코틴을 투여했다. 이후 몸 상태가 회복된 멀더는 한동안 금단증상에 시달렸다(...).

최근 한 연구에서 쥐에게 니코틴을 투여하자 신경활성도가 200배 정도 높아졌다고 하여 화제가 되었는데 어디까지나 쥐의 경우다. 사람의 경우 오히려 뇌의 혈관 확장에 관여하는 물질을 억제하여 악영향을 미친다.

3. 위험성[편집]

니코틴 농도가 990mg/ml 이상인 것을 퓨어 니코틴(고농도 니코틴)[13]이라고 부르는데, 사이안화포타슘과는 차원이 다른 독극물이며, 피부를 통한 체내 흡수도 굉장히 빠르다. 일본 추리만화 소년탐정 김전일에 상당히 자주 등장한 살해수단이다.

입에 고농도 니코틴이 들어가면 사망할 수 있으며, 눈에 들어가면 실명한다. 또한 피부에 소량만 묻어도 피부로 흡수되어 구역질을 동반한 어지러움을 유발한다. 실제로 퓨어 니코틴을 실수로 오용하여 사망하거나 병원을 방문한 사례도 있다.

퓨어 니코틴의 위험성

따라서 취급 시에 반드시 환기가 잘 되는 곳에서 긴팔, 긴바지, 양말, 고글이나 안경, 장갑, 마스크를 착용해야 한다. 냄새 또한 가급적 맡아선 안 되며, 절대로 피부에 닿지 않게 주의해야 한다. 혹시 피부에 닿았을 경우 즉시 흐르는 물로 세정하고 즉시 병원으로 가야한다.

이 위험성을 이용하여 니코틴으로 자살을 기도하는 사례가 늘고 있다. 하지 말자. 음독 자살이 그렇듯이 성공 가능성은 지독하게 낮고, 후유증은 지독하게 크다. 시도 사례는 많지만 뉴스화된 성공 사례는 2년 동안 3건에 불과하다는 점에서 효용성을 짐작할 수 있다. 100% 순수 니코틴을 음독했을 시 점막에 닿자마자 쇼크가 온다. 식도가 타는 듯이 아프고 토사곽란과 오한이 이어지며 그 다음부터는 자살 실패에 따르는 비참함 뿐이다. 하지 말자.

기어이 살인사건까지 발생했다. 남양주 니코틴 살인사건, 신혼여행 니코틴 살인사건 참조.

[1] 식물 중에는 니코틴을 함유한 종류가 많으며 그 중 가지과, 특히 담배에 특히 많이 들어있다.[2] Mayer B (January 2014). "How much nicotine kills a human? Tracing back the generally accepted lethal dose to dubious self-experiments in the nineteenth century"[3] 오프라인 전자담배 매장에서 파는 니코틴 액상은 99%가 희석 니코틴이며 퓨어 니코틴의 위험성은 하단의 마지막 문단을 참조.[4] 실제로 니코틴은 알코올에 잘 용해된다. 음주 후 담배가 땡기는 이유가 이 때문이라고.[5] 마리화나는 마약으로 분류됨에도 의외로 의존도가 낮은 물질이다. 의존도는 카페인보다 낮다. 단, 그렇다고 해서 의존도만으로 약물 유통의 기준을 정한다면 환각 버섯이나 LSD 등도 생산해서 퍼트려야 할 것이다(…) 국가에선 이미 담배와 주류에 높은 수준의 제재를 거는 중이고, 이런 건 강해졌으면 강해졌지 완화되는 일은 없다.[6] 니코틴이 의존도가 더 높다. 단, 중독 시 금단증상 자체만으로는 알코올은 니코틴 및 웬만한 마약도 쉽게 못 따라올 수준으로 강렬하다. 니코틴 중독이 알코올 중독보다 더 쉽게 발생하나, 중독 시 끊기는 알코올이 더 어렵다. 니코틴은 의존도도 높고 금단현상이 지속적으로 발생하긴 하지만, 중독증상이 심하진 않다. 반면, 알코올은 몇 번 마신다고 해서 쉽사리 중독자 되거나 술 생각이 지속적으로 나지는 않지만, 한번 중독되면 알코올 중독자만 봐도 쉽게 알 수 있듯이 곧 죽을 듯 금단현상이 심하게 나타난다. 심할 경우 진짜로 죽는다[7] 흡연 행위는 스트레스 해소가 아니라 몸에 스트레스를 가하는 행위다. 도파민의 과다 분비가 일시적 행복을 준다고 착각하게 만드는 것일뿐.[8] 미국 예일대 정신과에서 실시한 연구 결과, 흡연자의 뇌는 비흡연자의 뇌보다 왼쪽 대뇌피질이 얇을 뿐 아니라 흡연량이 많고 흡연기간이 길수록(어린 나이에 흡연할수록) 대뇌피질 두께가 더 얇아진다는 것이 밝혀졌다.[9] 우리나라 사망률 1위는 이지만 2위는 심장질환, 3위는 뇌혈관질환이다.[10] 연초에는 니코틴 외에 다른 수십가지의 물질의 연소 과정이 발생하기 때문에 목넘김이 훨씬 독하고, 이를 '타격감이 강하다'라고 표현한다.[11] 담배에 알로 잠복하고 있다가 담배를 태우면 담배연기를 매개체로 폐로 들어가 기생한다. 그리고 폐 조직을 먹어치우며 성장하여 기도를 통해 나온다.[12] 이 사람이 테스트하는 담배가 바로 사건의 근원이다. 드라마 내 설정에서 이 사람이 멀쩡할 수 있었던 이유는 폐 안이 니코틴으로 가득 차서 벌레가 살 만한 공간이 아니었기 때문이다.[13] 니코틴은 물과 비슷한 밀도(1.01 g/cm^3)를 지니기 때문에 정확하진 않더라도, 대략 1g이 1ml라고 생각해도 무방하다. 990mg을 부피로 환산하면, 0.9999ml가 되므로, 이 정도면 순도 99.99%라고 보면 된다. 거의 순수한 니코틴에 가깝다. 대부분 PG와 희석하며, 보통 니코틴 농도 100~200mg/ml로 만들어 전자담배 액상에 첨가하여 사용한다.

2006, 2007 AVP PRO 가 문제 있다는 것을 알았는데 뒷 번호도 무슨 조합이 있다고 했다. 그래도 안 믿고 2006, 2007 아닌 제품으로 구입을 해서 별 문제 없었는데 끼워 팔던 Pod을 샀는데 2007 뭐시기 였다. 사자마자 누수가 있었는데 구멍에 고이는 수준이고 떨어지는 것은 아니라 그냥 썼다. 3일 째 기계에 묻어 나와서 일주일 정도 더 보다가 이건 확실히 누수라고 생각해서 바꾸러 갔는데...

결론은 내가 예민하다는 것으로,

그리고 팟은 계속 쓰는게 아니라 코일 처럼 갈아 주는 것이라며,

AVP PRO 말고 XTAL이 좋다며...(이건 인터넷 찾아 보니 켜짐 문제가 있던데...)

믓튼, 기구 하는 사람만 있으면 이런 제품 만드는 것은 어려운게 아닌 사람이라. 2006, 2007의 문제는 코무패킹이나 스프링 문제로 보인다. 그리고 제대로 교환이 안되는 것으로 봐서 국내에서 들여오는 총판도 무역만 하는 차떼기니 그냥 아마존이나 알리(made in china) 혹은 홈페이지에서 직접 구입하는게 싸다는 말도 하고 싶다. 

액상도 살 필요 없다. 액상 3만원에 팔고 2만원 대 + 사은품 + 할인 쿠폰 등으로 유혹하는데

dkfactory.co.kr/

 

[디케이팩토리]

[상품간략설명]

dkfactory.co.kr

에서 사거나 직접 제조해서 쓰는게 낫다는 판단이다. A/S 하나 제대로 안 되는 제품을 파는 사람들이 파는 액상을 뭘 믿고 핀담? 아무리 전자담배가 일반 담배보다 덜 해롭다고 쳐도. 굳이 살거면 종로에떼에서 구입하길 바란다. 참고로 지인 아니다. 거기서 물건 사지도 않았고 단지 솔직한 사람이라는 점만 알고 있다.

암튼, 전담 액상 따로 2개 더 해서 4개 구입했는데, 담배도 아니고 내 스타일은 아니라 며칠 쉬고 있다. 전담 조금 펴보고 넘어 가지 말고 그래도 꽤 오래 펴보고 넘어갔으면 한다. 보통 길어야 3년 만에 다시 연초로 넘어 간다고 한다.

 

담배는 백해무익. 안 피는게 맞다. 나도 끊은지 오래되어서 보험사에서 소변 검사해도 전혀 나오지 않았다. 최근 스트레스에 대해서 알아보며, 그래도 연초 필 때는 덜했었나? 하던 차에 친구가 추천해줘서 이 제품에 대해서 조금 깊게 알아 보았다. 물론, 난 하면 제대로 하는 타입이라 여러 매장도 돌고, 인터넷도 많이 보고, 니코틴(45%)도 구입해서 직접 제조도 해 보았다.

아이코스 분해해보면 연초가 매~우 적게 들어가 있는 것을 알 수 있다. 그리고 파이프를 해 보면 정말 다른 것 보다 타르 라는 놈이 폐를 까맣게 만든다는 것을 알 수 있다. 전자 담배는 니코틴만 들어 있는데 당연히 그것도 뺄 수 있다. 그런데 폐에 들어가는 다른 액상들이 정말 폐에 아무런 영향이 없을까? 먼 훗날 전담 인구가 늘어나고 그들의 평균 수명과 질병 기록등이 공개되면서 추측을 제대로 던지고 계속해서 검증되기 까지 시간이 꽤 걸릴 것 같다.

해외에서 금연 보조제로 쓰는 거면 아예 국가가 나서서 연구하는 것도 좋아 보인다. 12조의 세수 시장이 작은 것은 아니니까. 

evape.kr/bbs/board.php?bo_table=free&wr_id=2072963

 

이베이프

전자담배 커뮤니티, 포럼, 궐련형, 쥴, JUUL, CSV, 아이코스, 글로, 릴, 중고장터, 공동구매, 레시피, 액상, 전담

evape.kr

금연 보조제로 확실하다면 이런 매장은 나이드신 분이 많은 곳에 생겼으면 좋겠다.

0-=0-=0-===-0-=0=0=00-=0=-0-=0=-0-=0=-0=-0=-0-=0

일주일도 안 되었는데 매스꺼움 때문에 전담 끝. 전담은 담배가 아닐런지는 몰라도 몸에 안 좋은 것은 확실하다.

evape.kr/bbs/board.php?bo_table=review&wr_id=67740

 

이베이프

전자담배 커뮤니티, 포럼, 궐련형, 쥴, JUUL, CSV, 아이코스, 글로, 릴, 중고장터, 공동구매, 레시피, 액상, 전담

evape.kr

 

tobaccofreeca.com/korean/e-cigarettes/nicotine-the-unknown-poison/

 

니코틴: 알려지지 않은 독성물질

Learn more about how tobacco harms all Californians. Read about tobacco's impact, tips to quitting and ways to help others quit tobacco.

tobaccofreeca.com

뭐든, 조절하면 좋겠지만 전담은 연초보다 더 조절이 안된다는 의견이 많다.

조절할 수 있다면, 통제할 수 있다면 좋겠지만 본인에게 맞지 않아 건강이 나빠지는 것이라면 피해야 겠다.

m.segye.com/view/20160127000871

 

95년간 흡연해온 네팔 112세 할머니…장수비결은?

 네팔의 112세 할머니가 1세기 가까이 담배를 피워 온 사연이 공개돼 네티즌들의 눈길을 끌고 있다.지난 26일(현지시간) 영국 미러 등 외신들에 따르면 1903...

m.segye.com

www.insight.co.kr/newsRead.php?ArtNo=77823

 

75년동안 매일 담배 20개비 펴온 ‘102세 장수 할머니’

102세 나이에도 하루에 담배 20개비를 피우는 할머니의 건강한 장수 비결이 궁금증을 자아낸다.

www.insight.co.kr

ilyo.co.kr/?ac=article_view&entry_id=67871

 

ㅋㅋㅋ댓글 - 100세 장수 할머니는 골초에 애주가

흡연의 직·간접적인 피해로 인해 백해무익하게 여겨지는 담배. 그런데 최근 평생 담배를 46만 개비나 피우고도 건강하게(?) 100세를 넘긴 할머니가 해외언론에 소개돼 화제다. 영국 <데일리메일>

ilyo.co.kr

www.ohmynews.com/NWS_Web/View/at_pg.aspx?CNTN_CD=A0000896856

 

식사 때 반주로 소주 원샷... 담배도 즐겨 피워

100세 할머니의 환한 미소... 건강 비결은?

www.ohmynews.com

www.lass.co.kr/read.php/2061370

 

'90세 시골 할머니' 흡연경력 76년...14살 때 첫 담배 '장수의 비결'은?

담배 할머니는 올해 90 세라는데요. 산시성 진난의 시골 사람들은 할머니의 나이에 관해 이야기 하고 싶어한답...... [더보기]

www.lass.co.kr

nownews.seoul.co.kr/news/newsView.php?id=20160531601006

 

현존 세계 최고령자는 러 120세 할머니? 장수 비결은?

러시아에 사는 120세 할머니가 인터넷상에서 화제가 되고 있다. 영국 일간 데일리메일은 30일 러시아 아스트라한 크라스니야르 지역 알차 마을에 사는 120세 여성 탄질야 비셈베예바(Tanzilya Bisembey

nownews.seoul.co.kr

 

최민식 처럼 담배로 스트레스를 풀 수 있다면

www.fmkorea.com/best/553603167

 

최민식의 담배 예찬

 

www.fmkorea.com

스트레스 보다 담배가 나은 것 같다.

그러나 하정우처럼

news.joins.com/article/23161378

 

하루 3만보 걷는 하정우 "걷기는 최고의 투자"

서울에서 해남까지 동료들과 함께 577㎞를 걷는 ‘국토대장정’을 했고, 하와이에선 하루 10만보 걷기에 도전한 적도 있다.

news.joins.com

스트레스 해소까지 하며, 걸을 수 있다면 더 좋은 방법인 것 같다. 물론, 걷는 중에 자동차 매연을 더 마신다면 차라리 담배가 나을 지도... 다양한게 생각해 봐야 한다.


여행기

미국 관련, 제주도 준비 관련



byHAJUNHOMay 30. 2016


미국 이야기는 펜딩 해 두고 제주도 이야기가 많이 올라올 것 같아서 변명 및 예고입니다.





시카고, 달라스, 매디슨 시티, 캔자스... 사진을 못 찾겠네요 ㅠ 사실 사진을 보여 드리는 게 독자에 대한 예의이긴 하나 하디드스크의 파다에서 사진을 건진 후에 말씀드려야 할 것 같습니다. (사진이 너무 많아서 드랍박스 비즈니스 쓰다가 구글 언리밋과 아마존 언리밋 같이 쓰고 있어요)




미국 관련





- 에스띠로더 어드벤스드 나이트 리페어(하도 배달을 해대서 외웠습니다.) 아웃렛에서 가끔 개수 수량으로 세일하면(생각보다 자주 해도) 삼십 달러에 살 수 있습니다. 한국은 그 가격의 3배이죠.





- 자동차도 쌉니다. 다들 아시겠지만 같은 현기차라도 미국에서 이름만 다른 같은 모델은 가격이 더 싸고 품질이 더 좋습니다. 사실 현기차만 그런 것도 아닙니다. 인피니티도 한국 30% 가격이라서 수년간 타다가 한국 가시는 분들은 그냥 가지고 가는 경우도 있습니다. 배로 보내기 때문에 6개월은 걸리긴 하지만 싸니까요.





- 골프 쌉니다. 친척 중에 골프 하시는 분 있는데 2억 걸어 놓으면 3~6만 원이면 이용 가능한데 미국은 그런 거 안 걸어도 만원도 안 해요. 구글 맵 찍어 보시면 주변에 골프장 천지입니다.(축복받은 땅) 요트도 싸요.





- 세금이랑 보험, 의료비, 집값 다 비쌉니다. 변두리에 살면 됩니다. 오히려 집값이 더 쌀 수도 있겠네요. 다운타운이랑 30~40분 떨어지면 2층 집에 뒤에 잔디밭 있어서 바비큐도 구울 수 있는 곳이 수도권 아파트 가격 정도니까요. 타운마다 조금씩 다르겠지만, 흑인 타운 밤에 갔을 때는 눈 하고 이빨만 보이는데 정말 무섭습니다. 인종 차별이라고 하시면 할 말 없습니다. 흑형들이랑 말도 잘 섞는데 그냥 무서웠다고요. 매디슨은 지인이 아침 조깅하는데 백인한테 권총 강도당했습니다. 다행히 지폐가 있었기에... (아프리카 다니면 250불은 꼭 넣어 다니라고 하잖아요. 돈 없으면 그냥 쏴 죽이고 간다고) 같이 일하는 분 아드님이 페북 신입으로 들어가서 12만 불 계약되었는데요(아이비리그 출신). 관련해서 이것저것 이야기하다 보니 삶의 질은 한국 대기업 수준과 다를 바 없더군요. 물론, 골프, 요트 같은 거 좋아하시면 비교가 안 되겠지만, 스타크래프트 좋아하시면 한국이 훨씬 나을 수도. 인터넷 겁나 느리거든요.





- 짝퉁이 거의 없습니다. 이건 인식의 차이인 것 같은데요. 내가 쓸 건데 왜 짝퉁 써? 하는...





- 특 정 주는 돈이 별로 없는 것 같아요. 이건 해당 주에 수십 년간 사는 분들에게 질문을 했었습니다. 도로가 다 파였는데 왜 보수 공사를 안 하는 거냐라고 물었을 때. 정부가 돈이 없다고 했습니다. 전후좌우 다 따지고 통계자료 조사해 봐야겠지만, 적어봅니다. 그리고 들은 이야기지만, 논리라고 말하고 싶어요. 왜냐면,


사실 얼마 전에 어느 작가가 쓴 글을 까는(?) 포스팅을 보았는데 통계자료 조사해서 등록금 상승률, 임금 상승률 어쩌고 하더군요. 저도 그 세대의 사람이라 책이 진실을 말한다는 것을 알고 있었는데 결국 작가는 수정하지도 않고 수정본을 업데이트하면서 그래도 통계 자료 인용한 내가 맞다고 하는 것을 보고... 아 정말 세상에 ㅄ 많구나. 하는 생각이 들었습니다. 또 한편으로는 제가 모를 때는 얼마나 ㅄ 소리 들었을까라는 부끄러움도 들었고요. 큰 단체는 통계치를 낼 기관 하나씩 가지고 있고요. 그것도 표현하고자 하는 의도에 따라 fact지만 해석 방식이 다르게 한다는 것을 직접 들은 경험이 있는 사람만이 아는 분야일 테니까요.





- 미국에서 자리 잡은 사람들은 한국에 오고 싶지 않아합니다. 미국에서 성공 못하고 스펙 좀 쌓고 한국에서 떵떵거릴 수 있다는 인식을 가진 사람들이 많습니다.(뭐, 이미 시대는 변했지만) 대부분의 평균 이상 성공한 사람들은 한국에 오고 싶지 않아합니다. 그 이유를 분석해보니... 저녁이 있는 삶이 가능한 곳이 미국입니다. 밤 되면 불이 거의 다 꺼지니까요. 빨리 마치고 석양을 보면서 맥주 한잔하면서 골프 치는 게 싸다고 생각해 보세요. 인생의 종착역은 '사람'일 텐데 그 '사람'을 향하는 취미 생활이 자유로우니 그럴 법도 하겠구나라고 생각합니다. 여러 문제점도 있겠지만 적어도 자신만의 집과 공간을 가지는 사생활도 있으니 말입니다. 결정적으로 문화의 차이고 분석해서 말하고 싶지만 민족주의자 성향이 짙은 저로서 자세한 설명은 생략하고 싶네요.





- 인종 차별 여전히 존재합니다. 유리천장도 있습니다. 박사 과정도 달라요. 미국에서 박사 할 거면 더 까다롭고, 외국에서 와서 학위 따고 외국 갈 거면 학비는 2배 비싼데 쉽게 줍니다. 뭐 이건 미국에서 카더라 통신도 아니고 한국에서 정책 연구하시는 분들에게 들은 것도 있습니다. 양쪽 다 하는 말이 맞으니 맞는 말이지요.





- 사람 잘 자릅니다. 한국 문화하고 달라요. 그래서 미국에서 이직 자주 한 사람은 이사나 커리어 관리 등 개인 사정도 있겠지만 유리천장과 실력에 대한 고려도 해야 한다는 것입니다. 좋은 대우로 이직하는 케이스도 많지만 스카우트 방식이 아닌 다른 방식으로의 이직은 큰 회사로 가도 연봉이 깎인다고 보시면 됩니다.





- 동료 한분이 감기, 몸살 걸렸는데 100만 원 썼습니다. 오래 일하는 분이 많은 것은 대체로 40일 넘는 휴가와 저녁이 보장되는 삶도 그 이유겠지만, 의료비 때문이라는 말을 들었습니다. 우리나라도 민영화되면 곧 그리 되겠지만. 세금 많이 냅시다! 아니면 나라가 돈 벌 궁리를 좀 하던지... 사실 국가가 한전이나 증권사들 먹고 가격 조정하면 돈 걷는 거야 한 순간이죠. 국가가 돈 없다고 해도 사람 목숨까지 뺏을 수 있는(법으로) 국가잖아요.





- 그 외 소소한 이야기들은 언젠가 사진 찾으면 할게요. 흑인, 러시아인, 마약, 클럽, 인종차별, 훈훈한 이야기, 공산품 시세 차익 등... 소소한 이야기가 아닐 수도 있지만.




제주도 준비 관련





- 자동차 관련 : 우선 아우디와 볼보 자동차 정비소가 있습니다. 아우디 제주 정비소 (064-744-0911), GM 대우 제주 정비사업소(064-756-9400). 현기차는 아니더라도 기아차는 참 좋아합니다. 요즘도 가끔 용서 고속 타면 190까지 밟습니다. 물론 Km 아닙니다.(자기보호) 선호하는 차가 볼보인 이유는 제가 가장 중요하게 생각하는 게 안전 이기 때문입니다. BMW는 불나고 벤츠나 폭스바겐은 고속도로에서 문제 일으키고, 현기차는... 굳이 말 안 할게요. 뭐, 그렇다고 해서 싸고 렌트가 편한 현기차를 싫어하지는 않습니다. 어차피 탈거 믿어야지요. 그러나 여건이 된다면 가족과는 아우디나 볼보를 타야지요. 뭐... 저야 프라이드로 190 밟는데 어차피 120킬로 넘으면 아무리 좋은 차라도 전, 무조건 죽는다고 믿습니다.





- 드론 관련 : 팬텀 2... 풀 HD 영상은 찍어야죠.





- 사계절을 나려면 옷을 많이 들고가야 합니다. 옷장에 있는 옷을 다 꺼내니 200벌은 넘는 것 같네요. 싸구려도 안 버리는 넝마 습성이 있어서... 내려가는 김에 좀 버려야 겠어요.





- 카메라 : NX11 인데 삼성이 미러리스 카메라를 접는다는 소식을 들었네요. 뭐 소식 나오기 전에 지인들이 한화로 가길래 예상했던 것이지만. 그리고 이럴 줄 알았으면 그냥 캐논 살걸.... 고장 날 때까지 찍어보려고 합니다. 캐논 사기 위해서. 니콘도 좋지만 한번 떨어뜨리고 수리비가 카메라 가격만큼 나오는 널 보며...(아직 못 버림 ㅠㅠ)





- 기타 들고 갑니다. 기타 매거진에 코드 업뎃이 좀 있을 것 같네요. 아직 안 지웠던가?





- 스노클링, 수영장비 챙겨 갑니다. 서핑도 좀 배워보려고 합니다. 2달간 수영쉬니 몸이 근질근질 하네요. 살도 5킬로 쪄버렸고 ㅠㅠ 제주 간 김에 서핑도 좀 배워봐야겠어요. 괜찮은 스팟이 있을 때 정리해서 올리겠습니다.





기타 장비는 예고편과 관련없는 것들이라...





여행 매거진 업뎃이 너무 뜸해서 올려봤습니당~

keyword

미국

자동차

magazine여행기

미국 관련, 제주도 준비 관련 현재글

하와이

일본 여행


HAJUNHO

경험주의자




댓글0





작가와 글에 대해 이야기를 나누어 보세요!

스티커

확인

작가의 이전글사랑은 별빛


취소 완료


매거진 선택


키워드 선택 0 / 3검색



'Objective-C, SQLite3' 카테고리의 다른 글

오후 반차 쓴 유튭 개발자  (2) 2020.09.14
스트레스  (0) 2020.09.12
브런치 이전  (0) 2019.02.10
홈페이지 이전 수정  (0) 2019.02.10
브런치 이전  (0) 2019.02.10

http://t-school.kr/


그들이 맞는지도 모르겠다. 브런치에 올린 글에 심하게 말했던 적이 있다.


삼성 PS 받고 나왔냐고?


그렇다고 했다.


그래서 회사를 이용할 대로 이용해 먹고 회사 욕하냐는 식으로 말을 했었다.


게다가 쓴 책에는 삼성 출신이라고 했으니...




난 PS를 받지 않았고, 충분히 받을 수 있었던 위로 수당 1억 정도를 날렸다.


난 그래서 당당하다고 생각했다.


지금은 생각이 바뀌었다.


난 당당하지 않다.


그 돈이 아쉽다.



더 재미있는 것은 비트 코인 잘될거라 생각해서 투자 했다가 돈이 없어서 뺐는데

놔뒀으면 그게 4억 정도가 된다는 것이다. 일년 조금 넘었는데 그때는 천만원도

아쉬웠다. PS만 2천이 넘는데 말이다.


그렇다... 나름 나도 내 클라스의 쳇바퀴 속에 돌고 있지만,

딱히 여유가 없다.


삼성 다닐 때 생각해서 삶을 설계 했는데, 거지같은 인간들의 말을 믿다보니 계획이 견실하지 않게 된 것이었다.


딱히 퇴사학교도 그냥 감성적으로 위로할 뿐.


논리적 지식을 채우진 않을 것 같다. 그러나 그런 사람들이 많이 뭉치면 힘이 된다.


아쉬운 건 우리 엔지니어 들이야 모래알 같아서 잘 뭉치지 않지만 뭉치면 도움이 되는 원천 솔루션을 만들어 낸다. 즉, 피자를 만들어 낸다. 마케팅의 경우 그 피자를 나누기에 피자를 만든 사람들이 받아야할 몫은 줄어든다. 물론, 피자만 쌓아놔봤자 썩기만 할 뿐이라 잘 팔아야 겠지만. 피자 만드는 사람은 얼마 안되는데 파는 사람만 많으면 생산자만 등골이 휜다.


많이 경험했다. 아는 형이 찌질한 앱이라고 한 블라인드가 차라리 나을거다.

돈 이야기는 하기도 듣기도 힘들지만 액수를 듣고 또 어떻게 돈으로 남의 등을 치는지

잘 알아야 계획에 빈틈이 없고 삶은 생각한 대로 굴러가기 때문이다.



'Objective-C, SQLite3' 카테고리의 다른 글

스트레스  (0) 2020.09.12
이전... 지금까지 이전한 글은 수정해서 다시 발행할 예정이다.  (0) 2019.02.10
홈페이지 이전 수정  (0) 2019.02.10
브런치 이전  (0) 2019.02.10
브런치 이전  (0) 2019.02.10

Son, husband, father, Programmer, Teacher

LinkedIn

Brunch(Korean)

Freelance(deprecated)

ASM, C based Embedded or Security Cracking

PostgresQL + C# SI project

Android(JAVA) + Azure

SI : Bash Shell, gcc, linux, uC/OS-iii - Embedded System, C/C++, C# using Visual Studio 2015 & Azure


Focused on

The words, Justice, Peace, Love

& Writing, Math, freeRTOS, UnrealEngine

Visual Studio 2015+, Android Studio 2.2.1+, XCODE 8.0+, Unreal Engine

webRTC


Books

Developers Secrets (March, 2017)

Basic Programming written in CMD, JAVA and C++ (March, 2017)

C/C++ and JAVA with JVM internals (March, 2017)


Any question? Email me! mynameis@hajunho.com

Thanks to wordPress team & Floki theme developer.


에서 우선 Father, Husband, Son, Friend, Programmer, Teacher 로 순서를 바꾸었다. 옛날 방식에 따르면 Teacher를 가장 앞에 두고 후진 양성을 해야 겠지만. 요즘엔 각 객체 결합도를 낮추면서 가르침을 전달하는게 더 효과적이라는 생각이 있기에 가장 뒤에 놓았다. 나머지 커리어는 다 바꾸기로 했다.


너무도 다양한 선행 과제를 하고 또 새로운 것들을 하면서 정작 중요한 것은 이제 내가 무엇을 공부하고 싶은지가 중요하다는 것을 깨달았기 때문이다.


그래서 다음과 같이 좋아하는 것으로 바꾸려고 한다.


Father, Husband, Son, Friend, Programmer, Teacher

blogger

LinkedIn


Focused on

ARM Firmware & Assembly

Big data & Block Chain

C/C++, Objective-C, Rust, JAVA, *.js, python

FreeRTOS, Windows, Linux, Android, iOS


Books

Developers Secrets (March, 2017) - only published 300EA

C & JAVA Practical Programming (June, 2017) - yes24KYOBOBANDI/LUNI'S


우선 브런치는 삭제 했다. 블로그에 통합했으니. 자연스레 블로거를 상위 링크로 두었고(앗 대문자로 바꿔야 겠네)


비밀 발간된 책은 그림 삽입만 해야 겠다. 초고 그림이 있으니. 출판된 책은 링크를 달고.


3D도 적고 싶은데 사실 공부할 시간이 없어서 포기했다. Focused on 은 내가 나이 50이 되면 모두 프로젝트로 공개하려고 한다. 원천기술은 미국가서 하는게 맞다고 생각한다. 우리나라가 핵을 만들지 않듯이. 어쩔 수 없는 부분은 그냥 인정하려고 한다. 이건 국익을 버리는게 아니라 그냥 미국도 우리나라랑 같다는 생각을 해야 결국 세상이 그렇게 바뀐다는 것이다. 시민권 이런 것도 미래에는 없어질거라 생각한다. 운석이 충돌해서 지구가 사라진다는 명확한 시각(time)이 나온다면 말이다.


빈센트 반 고흐도 자기 그림이 이렇게 비싸게 거래될 줄 모르고 살았을 것이다.


나 역시 그렇다. 세계통일본부란 것을 어릴 적 만들었지만 여전히 꿈을 꾸고... 평생을 꿈꾸다 가도 행복할 것 같다는 생각이 든다. 미하이 칙센트미하이의 몰입도 꿈꿀 커다란 대상이 있어야 계속해서 빠져들 수 있기 때문이다.


세계는 결국 통일될 것이다. 원천 기술은 미국이 하고 융합 기술은 한국이 하고, 결국엔 미국 한국 구분없이 왔다갔다 하며 살게 될 것이다. 내가 융합 엔지니어가 될 수 밖에 없어서 그런게 아니라 그냥 FSF 정신이나 그 산물을 가져다가 자기꺼 라고 말하는 사람들 속에 지쳐서 그런다. 새로운 바람이 불어야 한다.


미국은 역사가 수천년 되는 우리 나라에 비해 역사가 없다고 할 수도 있다. 그래서 새롭다. 흠... 홈페이지를 어줍잖은 영어로 채우는 이유에 대해서 너무 변명이 심했나보다.  ^^


믓튼, 회사원으로 살면서도 이제 서비스를 설계하고 추진할 단계가 되니 기술이 별로 중요하지 않게 보인다. 그리고 내가 에트리나 삼성 사람들 이야기는 안하듯이 회사의 정말 중요한 정보를 빼고는 다 공유를 하는게 맞다고 생각한다.


그렇게 배운 친구들이 회사로 들어와서 기여를 하고 있고.

대한민국 이미지를 좋은 개발자들이 좋게 만들어 줘서(특히 삼성, LG)

구주, 미주권이 돌아가며 한국 개발자를 찾는다고 믿고 있다.


요즘 의식의 흐름에 맡겨 쓰는 글이 많아진다.


'Objective-C, SQLite3' 카테고리의 다른 글

이전... 지금까지 이전한 글은 수정해서 다시 발행할 예정이다.  (0) 2019.02.10
브런치 이전  (0) 2019.02.10
브런치 이전  (0) 2019.02.10
브런치 이전  (0) 2019.02.10
브런치 이전  (0) 2019.02.10

이제 뜨지 않는다. 이제 다른 사람 글도 많아져서 처음에 올려지지도 않는다.


글도 정말 풍화되어 사라지는 거라고 생각한다.


계속해서 써 나가지 않는 한.


블로그로 옮기길 잘했다.


다음에서도 브런치는 블로그로 분류를 하는구나.


블로그는 정말 인터넷 필수템이 되어버린 듯.


facebook 이나 twitter 변형이 얼마나 오래 갈지는 미지수.


구글 애드센스는 미래를 미리 본 듯한 느낌이다.



'Objective-C, SQLite3' 카테고리의 다른 글

브런치 이전  (0) 2019.02.10
홈페이지 이전 수정  (0) 2019.02.10
브런치 이전  (0) 2019.02.10
브런치 이전  (0) 2019.02.10
브런치 이전  (0) 2019.02.10



경험주의자

'외모지상주의'는 잘못된 말



byHAJUNHOJan 19. 2016



정말 못생긴 남자 둘이서 니 얼굴이 괜찮네. 내 얼굴이 괜찮네. 연예인은 누구 얼굴이 낫네...라고 이야기를 하고 있는 장면을 목격한다면. 어떤 생각이 들까?





나는 이탈리아 거지, 볼보이, 청소부를 보며,





우리가 하는 말들이 '꼴값'이지 '외모지상주의'라는 거창한 수식어를 붙일 수 있는지 의심해 보았다.








HAJUNHO

경험주의자




댓글7


제갈 냥이Jan 19. 2016


ㅎㅎ 못생긴 그애들 좀 웃기네요

아루가Jan 19. 2016


ㅋ 일전에 인터넷 기사에 남자들은 자신의 외모를 평균이상으로 더 높게 평가하는 비율이 10 명중 8명은 된다는 이야기가 왠지 수긍되는 첫문단이네요.반면에 여자들은 자기의 외모가치를 넘 낮게 보는 편이라 하더군요~~^^

HAJUNHOJan 19. 2016


@제갈 냥이 저 포함해서 대부분 그런 것 같아요 ^^;; @아루가 아무래도 평균적으로 남자들은 여자의 외모만 보니까요. 상대적으로 여자들은 남자의 능력에 치중하기 때문에 남자들은 자기가 타는 차에 대해서 늘 낮게 평가하는 면이 있는 것 같습니다. 평균적으로 여자들은 차종에 관해서 많이 알지 못하는데 말이죠. 여자들은 얼굴에 화장을 하지만 남자들은 자동차에 튜닝하는 것도 비슷한 이치 입니다. (서툰개그 매거진 임을 감안해 주시길) 서로 이성에게 잘 보이고 싶은 마음이랄까요. 자동차 이야기가 나와서 말인데, 보기 싫은 외관이지만 몇억 짜리 엔진을 달고서도 트랙을 돌면 엔진이 녹아 내리는 F1 머신과 같이, 심장을 불태워 달리는 목표를 향해 달리는 마음을 가진 사람에게는 외모가 그리 중요치는 않은 점은 사람과 동일합니다. https://www.youtube.com/watch?v=cpJ751g4QyA

아루가Jan 19. 2016


@HAJUNHO 전혀,never!!서툰 개그가 아니게 명괘하고 일목요연한 글전개에 감탄이 드네요~~진짜 남녀사이의 가치척도의 갭과 상이함이 너무 크다는 생각 저도 늘 하거든요~마지막의 F1머신에 비유되는 남자가 정말 멋짐을 느끼겠지만 아무래도 일생의 고락을 함께할 구속아닌 구속 (?)은 많이 어렵겠죠?ㅎ 우리가 빠져드는 드라마들이 너무 획일적인 편견의 잣대를 만드는 우를 범하는 죄 (!)가 아주 무겁다고 저는 생각한답니다(ㅋㅋ 그래도 재밌다고 본방챙겨보는 이 놈의 근성이란~~^^;;)

HAJUNHOJan 20. 2016


@아루가 저도 와이프 덕에 드라마를 가끔 시청합니다.(본래 게임을 하기에 TV 자체를 안봐서 연예인도 잘 모르는...) 드라마의 강점은 작가가 쓴 허구이기에 외부 변수가 많지는 않아서, 뒤에 일어날 일이 2가지 정도로 예측 가능하다는 것입니다. 미처 예측을 못했더라도 결과를 보고 "아~"하고 이해되도록 극을 쓰는 것 같습니다. 쌩뚱맞은 결말을 맞으면 욕을 많이 먹는 이유도 그런 이유인 것 같습니다. 이에 반해 인생은 워낙 버라이어티해서 좀 재미가 없지요.(가령 갑자기 로또가 되어 인생이 바뀌어 착한 사람이 흥청망청이 된다던지(차라리 그러면 드라마처럼 재미있을 듯, 또 보통은 직장생활 하고 아픈 부모님 돌봐드린다던지...), 주인공 재벌2세가 비행기 타다가 사고가 나서 드라마가 종결되는...) 드라마처럼 우리 삶도 좀 더 단순화 할 수 있다면 좋겠습니다. 그리고 왜 본방 사수하는지 몰랐는데, 축구 경기와 올림픽에서 느껴지는 LIVE 긴장감이 전해지더라구요.

아루가Jan 20. 2016


@HAJUNHO 말씀하신것처럼 정말 실제 인생은 예측불가능한 버라이어티를 전개하기도 하지요. 드라마작가가 집필하는 예측결말 가능한 것도 나름 시청자의 다양한 공감대를 이끌어내기도 하고요.그래도 아쉬운건 "이 드라마는 이 결론으로 갈게 뻔해~"하고 단정지어지고 또 그게 예정대로 일치하는것에서 만족감을 느끼는것도 좋지만 실제 인생에서는 버라이어티한 양념이 첨가되는 전개도 더 재밌지 (?)않을까하는 욕심도 나지요.일단 사는게 지루하고 매너리즘에 빠지는 건 좀 덜하지않을까~그게 인생의 안정권을 비껴가는 우를 범하기도 한다고해도요. 제가 감성과 재미에 둔감해진 나이가 되어서 그런건지 요즘 드라마는 봐도 남는건 허전함이 너무 크더라구요.그래도 보는 동안 약간의 현실도피 (!)가 되어서 괴로운 현실을 잠깐씩이나마 잊는다면 나름대로의 순기능이겠죠? 날씨가 넘 춥군요,감기 조심하시구요.좋은 글 계속 연재 부탁드립니다~~*^^*

HAJUNHOJan 21. 2016


@아루가 잘 읽어 주셔서 감사합니다. 저도 게임을 하는 이유가 현실도피성도 있는 것 같아요. 게임 세상 에서는 노력한 만큼 댓가가 돌아오고. 같이 힘을 합쳐서 깰 수 있는 미션이 있어 협업하게 되고. 능력이 없더라도(저랩) 커뮤니티(클랜)에서 도와주죠. :)




작가와 글에 대해 이야기를 나누어 보세요!

스티커

확인

작가의 이전글세상은 냉정하다


취소 완료


매거진 선택


키워드 선택 0 / 3검색



'Objective-C, SQLite3' 카테고리의 다른 글

홈페이지 이전 수정  (0) 2019.02.10
브런치 이전  (0) 2019.02.10
브런치 이전  (0) 2019.02.10
브런치 이전  (0) 2019.02.10
브런치 이전  (0) 2019.02.10






경험주의자

법은 공개된다.







byHAJUNHOJun 08. 2016







사생활이라는 것을 참 중요하게 생각한다. 특히나 나에게 불가항력적으로 그렇게 되어야만 하는 이유가 있다.













그러나 인생철학은 이와 반대로 공개되지 않는 것 중에 제대로 된 것은 없다고 생각한다.













온갖 비리




돈 버는 방식













이 두 가지 설명하는 모든 현상들이 특히 그렇다.













법은 왜 공개가 될까? 사람 사이에 조화를 이루고 잘잘못을 저울질하려면 서로가 법을 알아야 하기 때문이다. 해석의 불문 명함으로 똑똑한 사람들이 이익을 챙겨가는 수단에 불과하지만 없는 것보다는 나은 정도다. 그러나 http://www.law.go.kr 에 공개되어 있다.

국가법령정보센터



www.law.go.kr





그리고 수많은 판례와 핫이슈 되는 판결까지도 언론을 통해 공개된다. 이미 판결된 부분도 사회적으로 논란이 된다. 아마 판결했던 판사 입장에서는 대기업 임원처럼 돈을 많이 받는 것도 아닌데 마음이 많이 쓰릴 것이다. 그러나 공개되는 일을 한다는 것은 명예로운 일이다. 그들에게는 명예가 주어진다.
















일전에 일하는 직장에서 디자이너가 필요해서 최소 연봉 8000 정도 생각하고 디자이너를 구하려고 했었다. (디자이너를 매우 중시하는 나만의 착각이었지) 카카오 캐릭터들이 예뻤다. 유명한 '호조'라는 분은 모바일 쪽과 맞지 않을 수도 있다는 판단이 들어서 그것을 이용하는 카카오의 디자이너를 영입하고 싶었다. 공개된 채널을 통해서 이래저래 알아봤는데 알 수 없었다. 카카오에 문의를 해도 작가 공개는 되지 않는다고 했다. 뽀로로 원작자가 제대로 대우받지 못하고 라이선스를 회사에 다 뺏겼다는 비화를 듣고 이해가 되는 것은 나 역시 직장 생활을 꽤 했으니까 당연한 것이라고 생각했다. 처음 캐릭터를 만들었던 '호조'도 뽀로로 제작자와 같은 길을 걸었다. 아마 시간이 지나면 돈과 친한 언론들이 모든 진실도 덮어버릴 것을 알고 있다. 나도 그런 일을 했었으니까.
















공개 방식과 비공개 방식에는 둘 다 장/단점이 있다. 길게 설명하고 싶지는 않다. 단지 이것 하나만 말하고 싶다. 공개 방식이 더 낫다는 것을 수천 가지 말할 수 있다.(수조 가지 말할 수 있지만 물리적 시간이 부족할 것 같다.) 이는 비공개 방식이 낫다는 것을 설명하는 것에 대한 반박으로 말할 수 있다는 뜻이다. 사람이 혼자 살 수 없기에 사회라는 것이 만들어졌고 그 사회 속에서 공개/비공개의 개념도 생겼다.













아무리 강한 사람도 아무것도 없이 다 크고 굶주린 호랑이와 1:1로 이길 수 없다.













사람은 똑같다. 사람 위에 사람 없고 사람 아랫사람 없다.













그러나 욕심이 있기에 













사람 위에 서서 편하게 살아가고 자신이 더 뛰어나다는 착각 속에서 생을 마감하고 싶어 한다.













그러기 위해서는 다른 사람을 부려야 한다.













그래서 비공개 방식이 나온 것이다.













비공개 방식의 태생적 특성은 이렇다.













크리티컬 한 예로 선거를 예를 들어 보자. 비공개 선거 안 해도 된다. 세상 모든 것이 공개라면.













비공개로 불이익을 주지 않는다면 왜 내가 투표한 사람에 대해서 당당하지 못할까?




노무현, 문재인 뽑았다.













그러나 만약 박근혜 뽑았다고 해도 당당할 것이다. 













그러나 불이익을 받는다. 숱한 사람들이 비난할 것이다. 그러나 비난하는 자의 신상이 공개되어 있다면?




충분히 비난할 자격이 있다는 사람의 모든 것도 공개되어 있다면?













털어서 먼지 하나 없는 사람 없다는 말도 괜히 나온 이야기가 아닐 것이다.













그러나 우리는 비공개가 난무하는 세상 속에 살아간다.













그 근본은 인간의 욕심에 있다.













내가 뛰어나니까




어차피 너희들은 모르니까




내가 더 많이 경험했으니까.






















그렇게 비공개로 일하는 사람의 노동을 착취하는 것이.




당연하다고 생각하기에 모두들 프레임웍을 만들려고 한다.













판을 짜서 위에 춤을 추게 하고 거기서 돈을 버는 것은 자신이 똑똑해서 




내가 판을 잘 짰기에 그렇다고 생각한다.













그리고 죽는 순간까지 자신이 똑똑하다고 믿고 간다.






















처음을 모르기 때문이다.




아무것도 모르고 태어나서 부모님이 믿는 종교 따라가는 것처럼.













일말의 의심도 없이 그냥 주변에서 하는 그대로 따라가기 때문이다.













사람들에 의해 만들어진 욕심이라면,




정녕 욕심대로




마음대로 하고 살았다는 인생도 아니라는 것이다.
















어차피 모든 인간은 죽는다.













틀린 인생도, 인생의 정답도 없다.













법도 정답이 아니다. 그래서 매년 바뀐다.













그러나 공개되어 있다. 공개된 것은 바른 길을 찾아간다. 법처럼













마더 테레사처럼













자신의 인생에서 많은 것들을 공개할 수 있는 만큼.













명예를 가질 자격이 주어 진다는 것을 명심해야 한다.













나도 명심하겠다. 만약 명예를 바란다면 명심하겠다.










keyword

공개

사람

magazine경험주의자

법은 공개된다. 현재글

나에게 몇가지 질문

'외모지상주의'는 잘못된 말






HAJUNHO

경험주의자










댓글2






제갈 냥이Jun 08. 2016




좋은 글 보고 가요 ~~



HAJUNHOJun 09. 2016




@제갈 냥이 고맙습니다~












작가와 글에 대해 이야기를 나누어 보세요!

스티커

확인

작가의 이전글제주 버스 여행




취소 완료




매거진 선택




키워드 선택 0 / 3검색

'Objective-C, SQLite3' 카테고리의 다른 글

브런치 이전  (0) 2019.02.10
브런치 이전  (0) 2019.02.10
브런치 이전  (0) 2019.02.10
브런치 이전  (0) 2019.02.10
브런치 이전  (0) 2019.02.10

+ Recent posts