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

 

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

 

TableView 만들기 (Swift + Storyboard)

다수의 Xib가 합쳐진 것이 스토리보드(Storyboard)이므로 Objetive-C 와 완전히 동일하다. Objective-C에서와 같이 테이블 뷰를 만들고 뷰 컨트롤러에 추가한다.

 

var dataTblDong = [String]()
var dataTblTppg = [String]()
@IBOutlet weak var mDongTable: UITableView!
@IBOutlet weak var mTypeTable: UITableView!

 

중요한 것은 바뀐 코드 형식이다. 테이블 2개를 만드는 실무 코드를 살펴보자.

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if tableView == self.mDongTable {
        return self.dataTblDong.count
    } else if tableView == self.mTypeTable {
        return self.dataTblTppg.count
    }
    return 1
}

데이터를 담을 전역 변수, 혹은 멤버 변수로 빼고 해당 변수의 개수로 리스트 항목(table rows)개수를 반환한다.

 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = UITableViewCell()

셀은 코드 내부에서 정의 할 수 있다.


UITableViewCell

UITableViewCell 클래스 원형은 다음과 같다.

open class UITableViewCell : UIView, NSCoding, UIGestureRecognizerDelegate {
.
.
.

    // These properties will always return nil when a non-nil `contentConfiguration` is set.
    @available(iOS, introduced: 3.0, deprecated: 100000, message: "Use UIListContentConfiguration instead, this property will be deprecated in a future release.")
    open var imageView: UIImageView? { get } // default is nil.  image view will be created if necessary.

    @available(iOS, introduced: 3.0, deprecated: 100000, message: "Use UIListContentConfiguration instead, this property will be deprecated in a future release.")
    open var textLabel: UILabel? { get } // default is nil.  label will be created if necessary.

    @available(iOS, introduced: 3.0, deprecated: 100000, message: "Use UIListContentConfiguration instead, this property will be deprecated in a future release.")
    open var detailTextLabel: UILabel? { get } // default is nil.  label will be created if necessary (and the current style supports a detail label).
.
.
.

기본적으로 이미지뷰, 텍스트라벨, 세부 텍스트라벨을 가지고 있다. 이에, 따로 추가 없이 텍스트를 지정할 수 있다.

 

    let obj = self.dataTblDong[indexPath.row]
     cell.textLabel?.text = obj

 

텍스트를 지정하고 셀(cell) 을 리턴(return)하면 바로 텍스트를 볼 수 있다. 셀에 다양하게 속성 적용도 가능하다. 

    cell.backgroundColor = .white
    cell.textLabel?.textColor = .darkGray
    cell.selectedBackgroundView?.backgroundColor = .red
    cell.selectedBackgroundView?.tintColor = .blue
    if cell.description != nil { }

 

TIP! : 보다 자세한 내용은 UITableViewCell에서 cmd+option+0 키를 눌러 해당 함수에 대한 빠른 도움(Quick Help)을 보는 것이다. 가장 아래 Open in Developer documentation 링크를 따라가면 Xcode 에서 바로 사용법을 확인할 수 있다.

 

테이블이 2개인 경우 if 문으로 cell 을 세팅한다.

    if tableView == self.mDongTable{
        let obj = self.dataTblDong[indexPath.row]
        cell.textLabel?.text = obj


UIButton

기본으로 제공되는 ImageView를 이용하지 않고 버튼을 삽입 하려면 이미지 사이즈 조절 extension이 필요하다. cell 내부 이미지 사이즈 조절을 위한 extension 이다.

 

extension UIImage {

    func imageResize (sizeChange:CGSize)-> UIImage{
        let hasAlpha = true
        let scale: CGFloat = 0.0 // Use scale factor of main screen

        UIGraphicsBeginImageContextWithOptions(sizeChange, !hasAlpha, scale)
        self.draw(in: CGRect(origin: CGPoint.zero, size: sizeChange))
        let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
        return scaledImage!
    }
}

https://stackoverflow.com/questions/24709244/how-do-set-a-width-and-height-of-an-image-in-swift

 

UIImage에 붙는 extension 이므로 사용법은 간단하다.

let imgUnChecked = UIImage(named: "hjh_icon_checkbox_none")?.imageResize(sizeChange: CGSize.init(width: 30, height: 30))
let imgChecked = UIImage(named: "hjh_icon_checkbox_checked")?.imageResize(sizeChange: CGSize.init(width: 30, height: 30))



이를 활용하여 다음과 같이 이미지 세팅된 버튼을 삽입 해보자.

      let imgUnChecked = UIImage(named: "hjh_icon_checkbox_none")?.imageResize(sizeChange: CGSize.init(width: 30, height: 30))
        let imgChecked = UIImage(named: "hjh_icon_checkbox_checked")?.imageResize(sizeChange: CGSize.init(width: 30, height: 30))
        
        let btn = UIButton(frame: CGRect(x: 10, y: 10, width: 30, height: 30))
        btn.addTarget(self, action: #selector(customCellButtonTapped), for: .touchUpInside)
        
        btn.setImage(imgUnChecked, for: .normal)
        btn.setImage(imgChecked, for: .selected)
        btn.imageEdgeInsets = UIEdgeInsets(top: 1, left: 6, bottom: 5, right: 2)
        btn.tag = 0
        cell.contentView.addSubview(btn)

 

다른 테이블도 동일하게 적용 가능하다.

        
    } else if tableView == self.mTypeTable
    {
        let obj = self.dataTblTppg[indexPath.row]
        cell.textLabel?.text = obj
        let imgUnChecked = UIImage(named: "hjh_icon_checkbox_none")?.imageResize(sizeChange: CGSize.init(width: 30, height: 30))
        let imgChecked = UIImage(named: "hjh_icon_checkbox_checked")?.imageResize(sizeChange: CGSize.init(width: 30, height: 30))
        let btn = UIButton(frame: CGRect(x: 10, y: 10, width: 30, height: 30))
        btn.addTarget(self, action: #selector(customCellButtonTapped2), for: .touchUpInside)
        btn.imageView?.contentMode = .scaleAspectFit
        btn.setImage(imgUnChecked, for: .normal)
        btn.setImage(imgChecked, for: .selected)
        btn.frame = CGRect(x: 0, y: 0, width: 44, height: 44)
        btn.imageEdgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
        btn.tag = 0
        cell.contentView.addSubview(btn)
    }
    return cell
}

 

TIP! : 필자의 경험상 개발 초기에 UI 관련해서는 중복 코드를 놔두는 것이 좋다. 메소드 추출(Extract Method)을 이용하여 공통 부분을 리팩토링(Refactoring) 한 이후, 개발에서 세부적이고 개별적인 수정 사항에 대해 빠른 대응이 어려워진다. 왜냐면 추출된 공통 부분에서 또 공통 모듈이 추출되기 때문이다. 협업을 하다보면, 최종적으로 하나의 기능만 하는 모듈만 따로 분리되어 재 사용성을 높히는데 의견이 모아진다. 그러나 커스텀 UI와 관련된 부분은 UI Guide Line 이 없는 경우 공통 Method 로 빼는 것을 가장 마지막에 할 작업으로 넘기는 것이 좋다. 최종 코드에서 완벽히 공통된 코드를 D&D 와 메소드로 추출 기능 한 번이면 손쉽게 리팩토링이 가능하다. 그럼에도 불구하고 앱개발 경험이 별로 없이 아키텍트라고 하는 사람들이 앱 코드 수정은 하지 않고 코드 리뷰로 일반적이고 상식적이며 뻔히 알고 있는 이야기로 개발이 된 후, 다시 지속적인 변경된 요구사항 받을 때는 결국 상품과 끝 단의 개발자만 홀로 남게 된다. 재 사용성을 높히고자 했던 많은 작업 때문에 공통 코드의 공통 코드를 따라가며 연결된 파라미터를 다시 코드로 펼치는 작업을 하는 경우가 태반이었다. 매우 아랫단(low level)의 코드를 구현 할 때는 for문을 쓰는 것과 똑같은 코드를 펼치는 작업이 CPU 파이프라인을 타는 부분도 다를 경우가 있어서 reset이 되는 문제가 있었다. Application 단에서 그런 경우를 접하거나 어셈블리 코드로 코드의 형평성을 따질 필요는 없지만 요구 사항에 기민하게 대응하는 것이라면 오히려 경험 많은 개발자의 말을 따르는 편이 좋다. 앱 개발을 안다고 해서 API가 내려 간 그 하부단 운영체제 시스템콜의 시퀀스를 모두 고려할 것이 아니라면 말이다. 요약하자면, 코드 리팩토링은 가장 마지막에 하는 것이 맞다. 시장에서도 완전히 안정화 된 상태. 관련 라이브러리나 실행 시스템의 메이저 버전업은 예상되지 않는 상태. 인수인계 직전 등 내 손에서 코드가 떠나기 전인 마지막을 말한다.

 

'Swift & Python 실무 > {APP} SOCANNER APP' 카테고리의 다른 글

iOS용 openCV 라이브러리 나왔으면 좋겠다.  (0) 2021.05.20
POD  (0) 2021.05.20
UINavigationBar  (0) 2021.05.18
오늘자 troubleshooting  (0) 2020.04.08
namedtuple  (0) 2020.04.08

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

 

 

[기초] Overview

Apple에서 정의하는 UI Navigation Bar의 정의는 화면 최상단의 스크린을 탐색바이다. 이해 쉬운 그림은 다음(https://developer.apple.com/documentation/uikit/uinavigationbar)과 같다. 

실무에서는 Navigation Bar를 없애고 Custom 하게 구성하는 경우가 대부분 이었다. iOS를 직접 만들지 않는 이상 앱 튜닝의 끝은 순정 API라는 말처럼 iOS 업데이트에 자동으로 맞춰주고, 테마(Theme)에 따라 자동 변하는 것의 구현. 정상적인 뷰컨트롤러라이프 사이클과 신기술에 기민하게 대응하기 위해 NavigationBar를 애플에서 제공하는 기본으로 유지하는 경우가 많아졌다. 그러나 여전히 legacy code에서의 사용률은 높기 때문에 기본적 사용법과 더불어 커스터마이징 하는 방법도 살펴본다. API를 소개할 때도 네비게이션 바를 혼용해서 사용되는 프로젝트에서 동작하는 코드를 예제로 실무에서 바로 적용이 가능토록 한다.


Basics

일반적으로 Android 에서 화면 구성 단위는 Activity 이고, iOS에서는 ViewController 이다. Android 에서 startActivity로 화면을 연결한다고 하면, iOS의 경우 pushViewController로 연결한다. 주의할 점은 Activity LifeCycle이던, ViewController LifeCycle 이던 임베디드 환경인 휴대폰에서는 Resource 보존에 더 취약하다는 것이다. 화면 실행 단위별로 세팅된 변수, 메소드 리턴값들이 화면이 바뀌었을 때 100% 그대로 유지된다는 보장은 하기 힘들다. 이 점을 간과하면 앱이 죽는데 이유를 찾지 못하는 경우가 많다. 이에, 안드로이드에서는 SharedPreferences를, iOS 에서는 UserDefaults를 적극 활용한다. SQLite3 로컬 DB 로 통일하기도 하지만 복잡한 모듈에서는 속도가 매우 느린다. 이런 기초를 미리 설명하는 이유는 화면 단위를 PUSH, POP 으로 저장하는 스택(stack)이라고 해도 해당 스택에서 튀어나온(pop) 액티비티 혹은 뷰 컨트롤러가 완벽하게 모든 자원(resource)를 가지고 있을 거라는 추측은 삼가해야 한다는 점이다. 필자는 안드로이드 플랫폼만 수년 간 만들다 앱 개발로 갔을 때 하부에서는 심각하게 고민하는 Resource leak 을 단순히 폰 문제로만 단정하는 경우를 많이 보았다. 그도 그럴 것이 프레임웍은 정적 분석이 필수인데 앱의 경우 다양한 이유로 정적 분석을 하지 않기 때문이었다. 다양한 이유 중 하나는 특별히 큰 기능이 없고, 복잡한 모듈의 경우 통합 플랫폼이나 엔진이라고 불리는 컴포넌트, 라이브러리, 서비스 등의 API 덩어리에 던져 버리기 때문이다. 이에, C/C++ 시니어 프로그래머가 앱 개발로 전직할 경우 가장 안정적인 앱을 만들 수 있다는 선입견이 있다.

UX 설계

인스타그램이 나온지 10년이 넘었는데 갤럭시 패드나, 아이패드 용 앱은 아직 화면이 작다. 즉, 전혀 맞지 않는다. 그럼에도 모바일 기획자라고 하면 모든 모바일 기기에 맞춰서 개발해야 한다는 UX 설계자를 만난다. 모바일 쪽에 깊은 지식이 있는 경우가 아니라 모바일 산업이 대세가 되니 갑자기 전직한 경우, 타블렛과 휴대폰은 화면 크기와 비율이 달라 UX 자체가 바뀌는데도 똑같이 보여야 한다는 생각을 가진 사람을 만난다. 심지어 facebook도 초창기엔 Android와 iOS UI를 다르게 갔었는데 그 사용경험(UX)은 동일하게 유지하였었다. Android와 iOS 모두 각 회사만의 철학이 있다. 그러나 하이브리드 앱을 제창하며 모두 회사가 정한 같은 디자인 이어야 한다는 생각이 있는 것 같다. 그 정도의 생각이 있다면, 운영체제도 만들고 성공한 모바일 폰 개발도 직접 하면 좋겠다는 생각이 많이 든다. 휴대폰 회사에서 제공하는 기본 API로 만들어야 운영체제 자체가 업그레이드 되었을 때 바뀐 UI 컨셉으로 앱의 통일성을 유지할 수 있다. 이 몇 줄 안되는 지식을 몰라 출발점부터 어긋나는 경우가 많았다. 그리고 iOS의 경우 화면 호출 방식이 다음과 같은 stack 방식이다.

 

즉, 유저 화면 이동을 고려할 때 TREE 형태로 구성하고 화면을 노드로 하면 유저 경로 탐색은 DFS를 먼저 고려해야 한다는 것이다. 굳이 정의하지 않아도 모든 ViewController는 NavigationBar를 기본 장착하고 있기 때문에 self 예약어로 접근 가능하다.


API

Swift_커스텀 네비게이션바

처음부터 모든 앱을 만든다면 네비게이션 바 관련 코드는 애플 개발자 사이트 혹은 스택오버플로만 참고하면 된다. 그러나 이미 커스텀네비게이션 바를 사용하는 경우 새로운 ViewController를 삽입할 때는 동작 코드가 궁금해 진다. 커스텀 네비게이션 바를 쓰는 뷰에 다음과 같이 viewWillAppear, viewWillDisappear 이벤트 콜백에 각각 해당 코드를 넣어, 커스텀 네비게이션 바를 유지 해준다.

 

override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(true)
        self.navigationController?.navigationBar.isHidden = true
}



override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(true)
        self.navigationController?.navigationBar.isHidden = false
}


기본 네비게이션바 장착한 VC

스토리보드에 새로운 뷰를 만들고 연결한 뷰 컨트롤러에서 네비게이션 바를 달기 위한 코드를 살펴본다.

우선, 네비게이션바의 숨김 속성을 false로 해야 한다. 이번에는 메소드를 이용해 보자.

self.navigationController?.setNavigationBarHidden(false, animated: true)

 

제목 내용 변경 코드는 다음과 같다.

self.navigationItem.title = "First View Title"





navigationController?.setNavigationBarHidden(false, animated: true)

 

override func viewDidLoad() {

        super.viewDidLoad()

        self.navigationController?.navigationBar.isHidden = false

}




backItemTitle Icon changing

 

override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(true)
        
        let button1 = UIBarButtonItem(
            image:  imageLiteral(resourceName: "arrowThinRight"),
            style: .plain,
            target: self,
            action: #selector(self.backBtnTapped(_:))
        )
        self.navigationItem.leftBarButtonItem  = button1
    }
    
    @objc func backBtnTapped(_ sender: UIBarButtonItem) {
        self.navigationController?.popViewController(animated: true)
    }





http://minsone.github.io/programming/ios-custom-imageliteral-on-framework-bundle

imageLiteral



[실전] Obj-C_커스텀 네비게이션바

 

self.title = @"HP 점검";



    UIButton *back = [UIButton buttonWithType:UIButtonTypeCustom];
    UIImage *imgUp = [UIImage imageNamed:@"backward_arrow.png"];
    [back setBackgroundImage:imgUp forState:UIControlStateNormal];
    [back addTarget:self action:@selector(cancel:) forControlEvents:UIControlEventTouchUpInside];
    back.frame = CGRectMake(0, 0, imgUp.size.width, imgUp.size.height);
    UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithCustomView:back];
    self.navigationItem.leftBarButtonItem = cancelButton;



- (void)cancel:(id)sender
{
    [self.navigationController popViewControllerAnimated:NO];
}



'Swift & Python 실무 > {APP} SOCANNER APP' 카테고리의 다른 글

POD  (0) 2021.05.20
List  (0) 2021.05.18
오늘자 troubleshooting  (0) 2020.04.08
namedtuple  (0) 2020.04.08
python.c  (0) 2020.04.08

쏩은 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를 다루겠지요.

##

# Group Database

#

# Note that this file is consulted directly only when the system is running

# in single-user mode.  At other times this information is provided by

# Open Directory.

#

# See the opendirectoryd(8) man page for additional information about

# Open Directory.

##

nobody:*:-2:

nogroup:*:-1:

wheel:*:0:root

daemon:*:1:root

kmem:*:2:root

sys:*:3:root

tty:*:4:root

operator:*:5:root

mail:*:6:_teamsserver

bin:*:7:

procview:*:8:root

procmod:*:9:root

owner:*:10:

everyone:*:12:

_taskgated:*:13:_taskgated

group:*:16:

staff:*:20:root

_networkd:*:24:

_installassistant:*:25:

_lp:*:26:

_postfix:*:27:

_postdrop:*:28:

certusers:*:29:root,_jabber,_postfix,_cyrus,_calendar,_dovecot

_keytabusers:*:30:_calendar,_jabber,_postfix

_scsd:*:31:

_ces:*:32:

_appstore:*:33:_appstore

utmp:*:45:

authedusers:*:50:

interactusers:*:51:

netusers:*:52:

consoleusers:*:53:

_mcxalr:*:54:

_appleevents:*:55:

_geod:*:56:

_devdocs:*:59:

_sandbox:*:60:

localaccounts:*:61:

netaccounts:*:62:

_mdnsresponder:*:65:

_uucp:*:66:

_ard:*:67:

dialer:*:68:

network:*:69:

_www:*:70:_devicemgr,_teamsserver

_eppc:*:71:_eppc

_cvs:*:72:

_svn:*:73:

_mysql:*:74:

_sshd:*:75:

_qtss:*:76:

_mailman:*:78:

_appserverusr:*:79:

admin:*:80:root

_appserveradm:*:81:

_clamav:*:82:

_amavisd:*:83:

_jabber:*:84:

_appowner:*:87:

_windowserver:*:88:

_spotlight:*:89:

accessibility:*:90:

_tokend:*:91:

_securityagent:*:92:

_calendar:*:93:_teamsserver

_teamsserver:*:94:_devicemgr

_update_sharing:*:95:

_installer:*:96:

_atsserver:*:97:

_lpadmin:*:98:

_unknown:*:99:

_lpoperator:*:100:

_softwareupdate:*:200:_softwareupdate

_guest:*:201:

_coreaudiod:*:202:

_screensaver:*:203:

_developer:*:204:

_locationd:*:205:

_detachedsig:*:207:_locationd

_trustevaluationagent:*:208:

_odchpass:*:209:_teamsserver

_timezone:*:210:

_lda:*:211:

_cvms:*:212:

_usbmuxd:*:213:

_postgres:*:216:_devicemgr,_calendar,_teamsserver,_xserverdocs

_devicemgr:*:220:

_webauthserver:*:221:_teamsserver,_devicemgr

_netbios:*:222:

_warmd:*:224:_warmd

_dovenull:*:227:

_netstatistics:*:228:

_assetcache:*:235:

_coremediaiod:*:236:

_launchservicesd:*:239:

_iconservices:*:240:

_distnote:*:241:

_nsurlsessiond:*:242:

_displaypolicyd:*:244:

_astris:*:245:

_gamecontrollerd:*:247:

_mbsetupuser:*:248:

_ondemand:*:249:

_analyticsusers:*:250:_analyticsd,_networkd,_timed,_reportmemoryexception,_mbsetupuser

_xserverdocs:*:251:

_wwwproxy:*:252:

_mobileasset:*:253:

_findmydevice:*:254:

_datadetectors:*:257:

_captiveagent:*:258:

_ctkd:*:259:

_applepay:*:260:

_hidd:*:261:

_cmiodalassistants:*:262:

_analyticsd:*:263:_analyticsd

_webdeveloper:*:264:

_fpsd:*:265:_fpsd

_timed:*:266:

_nearbyd:*:268:_nearbyd

_reportmemoryexception:*:269:_reportmemoryexception

_driverkit:*:270:_driverkit

_diskimagesiod:*:271:_diskimagesiod

_logd:*:272:_logd

_appinstalld:*:273:_appinstalld

_installcoordinationd:*:274:_installcoordinationd

_demod:*:275:_demod

_rmd:*:277:_rmd

_fud:*:278:_fud

_knowledgegraphd:*:279:_knowledgegraphd

_coreml:*:280:_coreml

_trustd:*:282:_trustd

com.apple.access_ftp:*:395:

com.apple.access_disabled:*:396:

com.apple.access_sessionkey:*:397:

com.apple.access_screensharing:*:398:

com.apple.access_ssh:*:399:

com.apple.access_remote_ae:*:400:

_oahd:*:441:_oahd

'진행 프로젝트 > [진행] Useful Logs' 카테고리의 다른 글

코빗 공지사항 모음  (0) 2021.03.21
My Notes  (0) 2021.03.07
Play Console 서비스 약관  (0) 2021.03.04
한국경제신문  (0) 2021.02.16
Android Studio 4.1.2 release notes  (0) 2021.02.15

www.endor.com/social-physics

 

Social Physics

After years at MIT, Endor invented the “Google for predictive analytics”, providing automated accurate predictions, fast, with no data science expertise required.

www.endor.com

이런 코인이 있었네. ICO 300 원 했는데 100원도 안한다.

다른 것 보다 멤버 대박...

구글도 파트너네.

 

그런데... 지금은 상페 위기라는 설이 있고 후오비 글로벌에서는 이미 삭제되었다고 한다. 후오비에서 확인 해 보시길.

coinpriceforecast.com/litecoin-forecast-2020-2025-2030

 

LITECOIN PRICE PREDICTION 2021 - 2025 - 2030

© 2017-2021 Coin Price Forecast Center. About Us Contact Us We shall be not liable for any inaccuracies or delays in our content, or for any actions taken by you in reliance thereon. Your use of the content is at your sole risk. Republication or redistrib

coinpriceforecast.com

Year Mid-Year Year-End Tod/End,%
2021 $761 $1,174 +204%
2022 $1,616 $2,073 +437%
2023 $2,180 $2,591 +572%
2024 $3,009 $3,330 +763%
2025 $3,748 $3,902 +911%
2026 $4,303 $4,708 +1,120%
2027 $5,117 $5,530 +1,333%
2028 $5,947 $6,245 +1,519%
2029 $6,610 $7,025 +1,721%
2030 $7,443 $6,823 +1,668%
2031 $7,190 $7,559 +1,859%
2032 $7,930 $8,303 +2,052%

 

zdnet.co.kr/view/?no=20210331074838

 

페이팔, 암호화폐 결제 시작..."전환점 맞았다"

글로벌 핀테크 업체 페이팔이 암호화폐 결제 서비스를 미국에서 시작했다. 댄 슐만 페이팔 최고경영자(CEO)는 이번 지원으로 암호화폐가 투자용 자산을 넘어 일상적인...

zdnet.co.kr

 

왜 라이트 코인을 선택했는지는 개발 자료 찾다가 알게 되었다.

바로 1100만원 태웠고 집 선택하고 나서 10년 간 집값이 저정도 올랐으니 10년 뒤에는 4억이 있을 것 같다.

내가 장투할 때는 정말 제품 다 써보고 하는데... 유튜브 창업자가 만들었다던 세타 토큰, 세타퓨엘은 실망 그 자체였다. 퓨엘이 조금씩 들어오는데... 간에 기별도... 400원 들어왔다. 하루 종일 켜 놓고. BTT는 1년 동안 내 BTT 중 반만 받았다. 뭐 포스팅 했지만...

 

비트토렌트 기술은 넷플릭스가 다 가져간게 맞고.

유튜브는 그냥 유튜브가 짱이다.

 

개발 소스나 개발풀 커뮤니티 등을 고려했을 때 라이트 코인이 최고로 보인다.

 

개발자스러운 투자가 성공할런지는 3년 뒤 확인하면 되겠다.

해킹 사건
오너리스크
스캠 상장
은 아무 것도 아니다.


기본이 문제인 것 같다. 내 UID 보고 직원이 자기 지갑에 돈 넣고 해킹 당했다고 안 하면 다행이다.

방법은 있다. 하이브리드 개발자 교육시켜서 네이티브 개발자로 만들면 된다.

코박앱에서 자꾸 이벤트 하라고 알림 떠서 믿고 개인 정보도 넣는데 앱 다운 앱 다운 앱 다운...

아니 토큰으로 돈 모아서 이것 밖에 안되냐는 생각.

그냥...

차라리 와지르엑스가 낫다.

안녕 코박 내 돈 먹고 잘 살아라. 앱 좀 잘 만들고

쳇 농협은 왜 한도 안 풀어주는 거야


주변 사람들은 변동성이 크다고 하지만


그래프는 길게 봐야지.

ㅋ 근데 굳이 길게 안봐도
기술를 아는 내가 지난 코인들의 행보는 모두 맞추고 수억 번, 수십억 번, 사람들도 나에게 질문하는 요즘.

얘는 황금 같은 애다.

두 달 간 140 종목을 단타 쳤는데... 업비트는 오류 열번 떠서...

못해먹겠더라

그래프 6개 띄워 놓고 개고생 하면 뭐하냐

시그템 오류로 수백만원이 한 방에 가는데 개썩을

바낸 단타가 훨씬 낫더라. 백퍼 시장가 매도도 막아죽고

전환도 빠르고


빗썸은 해킹 사건이 많아서 단타 시드 다 넣었지만 반감기까지 존버용은 바낸에서 샀다.

망할 며칠 전 50퍼 먹었다고 팔고 자는 바람에

지금은 돈을 2배 더 넣고도 그 때만큼 못 산다 ㅠ

그래프 상으로는 오를 것 같아서...

오늘 제품 분석을 좀 하다보니... 플랫폼 구축 능력은 되는 것 같은데 결국 탈 중앙화가 아니라 중앙화다.
앱 설치 후 할 수 있는게 아무 것도 없다. 개인 정보를 보와 신분증 등을 보내야 가능하다.

해킹에 대응할 자신이 있다면 하지 않을... 비트코인은 탈 중앙화라 해도 해킹에 뚫리지도 않았었는데 여긴, 하지 않았던 일을 한다.

뭐 나름 플랫폼 구축하겠지만 그건 은행들도 할 수 있는 일이라...

리플처럼 볼륨감 있거나 저변화 되거나 최전선에서 싸울게 어니라, 그래프 보고 투자 코인으로만 보는 것이 좋다는 생각이다.



패이코인은 유명한 작전주 세력 코인이다. 실물 경제랑 연결되어 있다고 해서 투자를 했는데 짧은 시간 변동 성 봐라. 백만원 이상 마이너스다. 올릴 때는 지들 끼리 뭉쳐서 적은 물량으로 올리고 털 때 주식 시장 처럼 공시라도 하는 줄 아나? 페이코인 사서 아이스 크림 결제 하려고 보면 아마 코인 반토막 나서 아이스크림 반만 살 수 있을 것이다. 또 돈 충전하는 동안 또 반토박 나겠지.

오르면 되지 않냐고? 도지코인 소리 좀 작작... 일론 머스크 같은 SK들...


선 매수 후 제품 조사하고 아니다 싶으면 파는게 많다. 선 매수를 하는 이유는 매수를 해야 피 말리듯이 알아 볼 수 있기 때문. 순식간에 제품을 받고 사용해 본 결과 절대 유튜브 경쟁은 안되겠다는 판단이 들었다. 

쌔타토큰도 마찬가지다. 그나마 쌔타는 엘비알와이크레딧 보다 나은 제품으로 보여 아직 지우지는 않았지만 쎄타 edge를 켜두면 맥북 프로를 뜨겁게 달구고 있다.

 

자세한 스크린샷은 남기지 않는다. 본래도 귀찮아 하지만, 얼마 전 도지 코인 사기 당할 뻔 하고, 자세하고 상냥한 포스팅이 얼마나 위험한 것인지 알게 되었다. 본인은 사기를 당했다고 하는데 본문에서 분명 원금 회수했다는 말이 있어서 투자를 결정했었던 것이다. 돈이 도는 곳이라 그런지 사기가 많으니 그래도 정의 구현해서 방송 출연까지 했던 사람이 이야기 한다면 어느 정도는 들을 거라 생각해서 적어둔다.

유튜브처럼 제품부터 제대로 만들고 토큰을 만들었으면 한다. 제품이 제대로 안 되어 있는데 토큰을 발행하면, 그 토큰을 횡령할 것임을 쉽게 예상할 수 있고, 광고용으로 쓰는 목적도 분명해 진다. 물론, 난 정보만 적을 뿐 영향력이 없으니 제대로 제품 만든 회사가 ... 자라나는 새싹이 밟힐 일도 없다.

 

쌔타는 따로 포스팅 하지 않겠다. 그래도 유튜브가 따로 토큰 발행 안하고 유튜브 공동창업자였던, 쌔타에 힘을 실어 주고 있는 것 같다. 제품도 괜찮긴 하지만 BTT 만큼은 또 아닌 것 같아서... 트론TV와 양분되지 않을까라는 생각이 든다. 트론이 BTT를 인수했고 그 기술로 유튜브나 넷플릭스가 돌아가니 말이다.

향 후에는 컨텐츠 싸움이고 얼마나 돈을 나누어 줄 수 있는지 싸움인데, 유튜브도 1등 하고 나서는 돈을 많이 못 나눠주는 플랫폼이 되어 버렸다. 이에, 신흥 세력의 기회가 있긴 하지만.... 난 당장엔 유튜브랑 넷플릭스가 편하다.

 

쎄타나 LBC는 약간 HAM(아무추어무선통신) 같은 느낌..

 

http://www.blockmedia.co.kr/

 

블록미디어 | 믿고 보는 No1. 블록체인 뉴스

[블록미디어] 골드만삭스는 비트코인 관련주 주가 상승률이 S&P 500을 능가한다고 밝혔는데요.(관련 기사 보기) 해당 분석이 적용된 19개 종목 리스트는 아래와 같습니다. 골드만은 세 가지 기준

www.blockmedia.co.kr:443

https://www.tokenpost.kr/

 

대한민국 블록체인·디지털 자산 미래를 여는 미디어 | 토큰포스트

EconoTimes와 함께하는 블록체인·디지털 자산 전문 미디어, 비트코인 이더리움 디지털 자산 정보 커뮤니티

www.tokenpost.kr

https://blockinpress.com/

 

Home - 블록인프레스

블록인프레스는 국내 블록체인 관련 소식을 빠르고 정확하게 전달하기 위해 설립되었습니다.

blockinpress.com

https://coincode.kr/

 

코인코드

해외 비트코인·암호화폐 소식을 빠르게 의역해 전달하는 블록체인 커뮤니티.

coincode.kr

https://www.decenter.kr/

 

블록체인의 모든것, 디센터

디센터(Decenter)는 블록체인 업계의 핵심소식들을 생생히 보도하는, 탈중앙화 시대로 가기 위한 모든 정보가 흐르는 열린 뉴스 허브입니다.

www.decenter.kr

https://kr.coinness.com/

 

코인니스 | 암호화폐 마켓 정보 | 비트코인

비트코인 그리고 블록체인, 코인니스는 가장 빠르고 정확한 가상화폐 투자 정보 뉴스 플랫폼입니다.

kr.coinness.com

 

https://kr.investing.com/

 

주식시장 시세와 금융뉴스 - Investing.com

Investing.com은 무료 실시간 시세, 포트폴리오, 챠트, 최신 금융 뉴스, 주식시장 데이터 및 기타를 제공.

kr.investing.com

http://m.coinreaders.com/

 

코인리더스

비트코인 전문지, 가상화폐, 블록체인, 4차산업혁명, 칼럼, 포럼 안내

www.coinreaders.com

https://joind.io/

 

조인디(JoinD):가치있는 진실

NO.1 Blockchain Media 조인디(JoinD):가치있는 진실(Valuable Truth)을 추구합니다

joind.io

https://www.coindeskkorea.com/

 

코인데스크코리아

코인데스크코리아

www.coindeskkorea.com

 

*LOGS 1. http://cointoday.co.kr/ 망해서 뺌.           

 

남은 포인트는 네이버 포인트로 보냈다. 한국 금융위 금감원 은행연합회 잘하네!

스피드메이드 뭐 이만 얼마 짜리로 교환해 준다길래 그러라고 했더니 유통기한 있는걸로 줘서 내 돈을 날려버리네

나 포인트 적립한거 아니고 산거야 이 사기꾼 들아

https://news.kbs.co.kr/news/view.do?ncd=2222550

OK 캐쉬백, 개인정보 관리구멍…유출 심각

개인정보 유출, 어제 오늘 일이 아닙니다만 그 정도가 더욱 심각해지고 있습니다. 대기업인 SK가 제공하는...

news.kbs.co.kr

https://www.fnnews.com/news/202104211225516954

 

다날, 큐텐에서 ‘페이코인' 결제하면 50% '페이백'

[파이낸셜뉴스] 다날은 글로벌 쇼핑 플랫폼 큐텐(Qoo10)에서 오는 5월 21일까지 '다날-유니온페이 모바일 선불카드' 이용자를 대상으로 페이코인(PCI) 페이백 이벤트를 실시한다고 21일 밝혔다. 이벤

www.fnnews.com

단톡 커뮤니티에서 페이 코인 이야기 한 사람들이 한결 같이 상장사에서 직접 개입 하지 않고 김치 코인 가격을 이렇게 까지 다운 시키지 못한다고 말하고 있습니다. 저도 대부분의 코인에 투자하지만 페이코인 투자 여러 번 들어가도 세력이 아닌 상장사라는 느낌이 있구여. 나중에 관계자 업비트에서 상장사 관계자 수익 서류 제출하거나 고액 수익자 상장사 연계점 분석이 꼭 법제화 되기를 바랍니다.
그리고 어차피 결제 시스템 가지고 있으면 페이팔처럼 결제 코인이랑 바로 연결하지 저런 기사 띄워서 모르는 사람 현혹하려고 하지 말았으면 합니다.
다 같이 미래를 보는 상승장에서 다 같이 노력하던가 가수 비 처럼 사기를 치려고 그래. 국가대표 김치코인들 다 같이 물 먹이는 짓입니다.

이 글을 읽는 다른 분들은 꼭 제 말을 참고 해서 조심스럽게 투자하시길 바랍니다.

 

그리고 더러운 돈 찍어 내지 말고

www.blockchaintoday.co.kr/news/articleView.html?idxno=15870

 

페이팔, 오늘부터 비트코인·이더리움·라이트코인·비트코인캐시 결제 지원 - 블록체인투데이

[블록체인투데이 정승원 기자] 온라인 결제 대기업인 페이팔(PayPal)의 암호화폐 수용 결정에 대한 소문이 뉴스로 퍼진 후 페이팔 CEO 댄 슐만(Dan Schulman)은 30일(현지 시각) 로이터와의 인터뷰에서 \

www.blockchaintoday.co.kr

페이팔처럼 회사 목적에 맞는 플레이를 하세요. 암튼, 나중에 금감원, 금융위에서 돈 찍고 시세 조작해서 얼마나 벌었는지 다 밝혀내 줬으면 합니다.

도지 코인이 사기가 아니라 채굴 서비스가 사기라는 이야기.

www.clien.net/service/board/cm_vcoin/16075905

 

와우도지(WoWDoge.io) 접속 불가 및 트위터 계정 삭제됨 : 클리앙

(구글 검색을 통해 퍼온 이미지입니다.) 최근 들어서 도지코인을 채굴할 수 있다는 광고글이 꽤 많이 보였습니다. 그 사이트가 와우도지(WowDoge.io) 였습니다. 왜 과거형이냐면... 사이트 내리고 튄

www.clien.net

클리앙에 글이 올라왔다.

 

 

아래 글 보고 나도 해 보려고 했었는데,

ideainven.tistory.com/404

 

도지코인(Doge) 무료로 채굴하는 방법

도지 코인(Doge) 무료로 채굴하는 방법 현재(2021년 4월19일 08:09분 기준으로 아직까지 와우도지 홈피가 열리지 않고 있으며 와우도지 프로모코드를 받던 트윗계정도 전체 삭제가 한번 되고 누군

ideainven.tistory.com

지금은 사기라는 식으로 업데이트 된 상태다. 

도지 코인(Doge) 무료로 채굴하는 방법

현재(2021년 4월19일 08:09분 기준으로 아직까지 와우도지 홈피가 열리지 않고 있으며 와우도지 프로모코드를 받던 트윗계정도 전체 삭제가 한번 되고 누군가 그계정을 그대로 다시 열어서 프로모 코드 없이 운영중인 상태입니다.

DOGEDAY가 4월20일이라고 하는데요. 조심스럽네요.

 

원래 와우도지의 트윗 프로필 사진은 아래처럼 채굴자였는데, 지금은 시바견에 D가 붙은 프로필로 바뀐 것을 보면 아무래도 많이 조심스럽지만 "먹튀"를 하지 않았나 하는 생각이 듭니다.

만약 20일이 지나도 아무런 조치가 없다면, 한참 운영할 때 정보를 기반으로 해서 신고를 할 예정입니다. 

Domain registry Iceland
Registrant Organization: Privacy service provided by Withheld for Privacy ehf
Street: Kalkofnsvegur 2
 City: Reykjavik
Registrant State/Province: Capital Region
Registrant Postal Code: 101
Registrant Country: IS
Registrant Phone: +354.4212434

물론 20일 이후에 정상화가 된다면 위의 내용들은 지우겠습니다. 또한 밑에 글들은 기록이 될 수 있으므로 지우지 않기로 결정했습니다.(가입을 눌러도 어차피 사이트가 없다면 가입불가) 추후에 필요한 정보가 있을 수도 있으며, 역사는 기록되어야 하니까요.

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

이 분도 마음 아프겠지만 나도 당할 뻔. 원화 입금해서 24시간 출금 막아 준 업비트에 머리 숙여 매우 감사... 3000 다 넣을 건 아니었고 500만 넣어서 채굴 시키려고 했는데 나의 500만원을 업비트가 구해 준 셈.

 

더 웃긴건 도지코인 사기는 이게 처음이 아니라고 합니다. 

quasarzone.com/bbs/qf_cryptocurrency/views/137184

 

도지코인 채굴사이트 먹튀

원래 코인은 가치 1도 없는 거고 지금 돈벌면 그만이니 하는 것.무얼하든 모든 책임은 자기자신에게 있고 아무…

quasarzone.com

기록되지 않은 역사는 되풀이 되는군요.

 

아무쪼록 사기 피해 입으신 분이 없으시길 바랍니다 ㅠㅠ


사기꾼이 떠난 자리 슬피우는 개미. 두 번의 매매로 20만원 날린. 세력이나 부자가 올 수 있겠지만 wallet 기본 기능은 되는지 확인하고 부디 물리지 말길.

가상 화폐의 장점은 이체시 국경을 넘나드는 편의성에 비해 매우 낮은 수수료다.

3915 255 998325 1135350 35 137025

오늘자 엔진코인(ENJ) 가격 3,915 원이다.

100만원 가량(1,135,350)을 보내는데 수수료가 10만원이 넘는다. 137,025 ...

 

트론, BTT 수수료가 거의 없는 것과는 매우 대조적인 모습.

게임용 코인이 왠만한 소비자가 지불할 수 있는 게임 가격을 넘는다고?

투자하신 분 있다면 어서 빨리 빼시길 바랍니다.

 

PyCharm 2021.1 is out!
The highlights of this major release include:
Faster indexing.
Enhanced WSL 2 support.
Code insight: Auto import on module member completion.
Tool window for Python packages.
Collaborative development tool: Code With Me.
Built-in HTML preview.

 

 

'진행 프로젝트 > [진행] My tools.' 카테고리의 다른 글

다른 사람에 대한 오지랖은 끄기로 했다.  (0) 2021.03.25
청원 올라오다.  (0) 2021.01.26
세 번째 글  (0) 2021.01.24
두 번째 글  (0) 2021.01.24
네 번 째 정의구현. 시초는 바로 이 글  (0) 2021.01.24

파이썬을 메인 BE로 지정하기 어려운 점이다... 파이썬은 BE language로 쓰긴 하지만 메인은 역시 자바...

In Python, member variables (attributes) are not inherently private like they might be in languages such as Java. In Python, all member variables are public by default, meaning they can be directly accessed from outside the class. However, the Python community follows naming conventions to indicate the intended access level for variables:

  • Public Members: Variables or methods declared normally are accessible from anywhere. For example, a member variable self.name is accessible from outside the class and is considered public.
  • Protected Members: Variables or methods that start with a single underscore (_) are considered protected. This convention suggests that these members are intended for use only within the class and its subclasses, and access from outside should be avoided. Example: self._name
  • Private Members: Variables or methods that start with a double underscore (__) are considered private and are intended to be used only within the class. Python performs name mangling on these members to make direct access from outside more difficult. For example, to access self.__name, you'd have to use _ClassName__name from outside the class.

Python uses these conventions to indicate the access control of member variables, but these are not enforced by the language itself. It aligns with the Python philosophy "We are all consenting adults here", implying that developers are expected to follow these conventions and not the language enforcing strict access control.

 

 

=== 사족 === 

www.a-ha.io/questions/45be375c892279c99e0f98338d25ade7

 

트론 블록체인의 단점이 있나요? | 전문 지식 검색은 아하!

블록체인 기술, 장점, 트론, 단점, 특징 - 이오스와 이더리움 설명이 많이 되어 있는데 트론 블록체인은 많이 알려져 있지 않는거 같네요.... 트론 블록체인의 장점이나 단점, 아니면 특징에 대해

www.a-ha.io

트론은 POW나 POS외에 위임된 지분증명을 통해 모든 노드 자격을 가진 주주들이

블록생성에 참여 하면서 상위노드에게 권한을 위임하는 DPOS를 사용하고 있습니다.

트랜잭션 처리가 빠르고 비용이 낮은 장점을 보유하고 있습니다.

하지만 단점도 있습니다.

  1. 엄청난 발행량
  2. 낮은가격대와 가격의 변동성이 큼
  3. 소수의 독점현상
  4. 트론은 매일 50만건정도의 트랜잭션 처리밖에 하지못합니다.
  5. 이더리움은 이의 1000배를 처리합니다. 범위가 다릅니다.
  6. 실질적인 댑의 이용수가 적다
  7. 프로젝트 개발보다는 마케팅에만 치우친다
  8. 트론은 스마트컨트랙트보다는 엔터에만 치중된 코인입니다.

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

아하 지식 플랫폼이 너무 잘 되어 있어서 이 정도 회사라면 투자해도 좋다고 생각해서 이쪽으로 다 옮겨왔는데 트론은 계속 오르고 있다. 슬프다. 아무리 생각해도 150원, BTT 는 15원이 한계일 것 같은데...

왜냐면 BTT는 실제 비트토렌토에서 이용이 가능한데. 이 가격이 2배로 뛰면 비트토렌토에서 빠르게 이용하려는 이용자의 부담도 2배가 되므로 외면 받을 것이기 때문이다. 엄청나게 뛰어난 기술이 아닌 다음에야 실 가치 부여가 되지 않는 코인/토큰은 사라질 것이라고 생각된다.

'{BE} Python 3.1x' 카테고리의 다른 글

how to see the encoding  (0) 2021.05.26
AI 기본은 필수...  (0) 2021.05.20
VoyagerX 창업자_개발 능력 요구사항  (0) 2020.12.29
PEP8 code layout  (0) 2020.12.05
0 matrix  (0) 2020.12.01

그래도 지금 가격 보면 1000만원 안 날려서 다행ㅋ

 

a-ha.io  홈페이지에 접속합니다.

 

아하(Aha) | 전문 지식 검색은 아하!

광고 없는 전문 지식 답변을 원하세요? 세상의 모든 전문 지식이 모여있는 곳. 변호사, 노무사, 세무사, 회계사 등 사전에 검증된 전문직 및 현업 실무자로 부터 받을 수 있는 신뢰할 수 있는 전

www.a-ha.io

우측 상단 로그인 버튼을 누릅니다.

 

카카오로 로그인 합니다.

좌측 상단의 햄버거 버튼을 누릅니다.

 

 

메뉴가 열리면 출석 스탬프를 누릅니다.

출석체크 후 친구 초대 배너를 누릅니다.

 

배너를 누르고 나면 자신의 초대 코드가 있고 아래에 입력할 수 있는 텍스트 박스가 보입니다.

전달받은 추천인 코드에 넣으면 됩니다.

끝.

 

노하우, 친구를 초대하고 본인 추천인 코드를 가르쳐 주고 친구꺼도 입력하면 같이 받습니다. 번거러우신 분은  8B4BDA 를 입력합니다. ㄱㅅㄱㅅ

 

[Aha] [협조요청] 아하Q&A 답변자 업비트 거래소 원화 거래를 위한 정보 조사새창으로 읽기

이메일주소 접기보낸사람지식커머스플랫폼 아하<hello@a-ha.io>주소록 추가수신차단관심친구

21.04.28 12:59

중요메일 표시 켜기받는사람<hajunho@kakao.com> 주소록 추가

이미 본 조사에 참여하신 전문가님은 본 메일을 무시하셔도 됩니다.

---

안녕하세요. 전문가님.

지식커머스플랫폼 아하 입니다.

아하Q&A에서 적극적인 지식 답변 활동에 깊은 감사의 말씀을 드립니다.

아하Q&A 서비스에서 보상으로 지급되는 아하토큰은 현재 업비트 거래소 (두나무 주식회사)에 상장이 되어 있으며, 해당 거래소의 거래를 통해 현금 교환이 진행되고 있습니다.

▶ 본 조사의 목적

최근 업비트 내 강화된 내부 정책 (이상거래내역 모니터링, 자금세탁방지 모니터링 등)에 따라, 업비트로 부터 업무 협조 요청이 있었으며, 아하Q&A에서 답변자로 활동중이신 전문가님의 정보 수집을 진행하고, 해당 정보를 업비트에 전달하여 이상거래내역 등으로 원화 출금에 차질이 생길 수 있는 상황을 미연에 방지하고자 합니다.

즉, 본 조사에 참여해주시는 전문가님께서는 업비트 내에서 이상거래, 자금세탁 등을 진행하는 회원이 아님을 증명하는데 그 목적이 있습니다.

(정상적인 서비스 답변 활동 후 > 업비트 거래소로 출금 > 아하토큰 거래 > 원화 출금이 정지 되는 사례가 생기고 있어, 전문가님들의 아하토큰 거래를 원활하게 하는 것을 목적으로 함)

▶ 본 조사를 통해 수집된 정보의 이용

상기 말씀드린바와 같이, 본 조사를 통해 수집되는 전문가님의 개인 정보 (성명, 전화번호, 이메일 등)는 업비트 거래소에 전달하는 용도로만 활용되며, 그 어떠한 경우에도 해당 목적 외 사용을 하지 않습니다.

더불어 본 조사 요청 메일은 아하팀에서 송부드린 정상적인 이메일이 맞으며, 스팸성 메일이 아니오니, 참고 부탁 드립니다.

▶ 정보 수집 기간

2021년 4월26일(월) 15:00 ~ 2021년 4월30일(금) 15:00 까지

▶ 설문조사 참여 주소https://forms.gle/F7CWGFGB3haKyJyN7▶ 참고 사항

  1. 해당 정보 조사 내용은 아하Q&A 홈페이지 '아하토큰 소식' 공지 내용에서도 확인이 가능합니다.
     https://www.a-ha.io/token-news/75
  2. 반드시 상기 기재 된 '정보 수집 기간' 내에 본 조사에 참여해주시길 부탁 드립니다. 해당일 이후에는 본 설문조사 폼을 통한 정보 수집이 불가능합니다.
  3. 상기 정보 수집기간 내에 정보 작성에 참여하지 않으신 전문가님께서는 업비트 거래소내에서 원활한 아하토큰 거래가 불가능할 수 있으며,이에 동의하는 것으로 간주합니다. 더불어, 업비트내에서 소명 요청이 있을 경우 자체적으로 해결을 하셔야 하며, 이에 동의하는 것으로 간주합니다.
  4. 반드시 실명, 실제 사용중인 전화번호, 실제 카카오톡 계정과 연동되어 있는 이메일 주소 입력 등을 부탁 드립니다. (만약 정보가 상이할 경우 원활한 거래에 차질이 생길 수 있사오니 참고 부탁 드립니다)
  5. 본 이메일은 전문가님의 원활한 아하토큰 거래를 위하여 진행되는 내용으로, 수신 여부와 상관없이 발송되는 이메일이오니, 너른 양해 부탁 드립니다.
  6. 기타 문의 사항 및 요청 사항이 있으실 경우 hello@a-ha.io 로 연락 부탁 드립니다.

 

거래는 좀 아닌 것 같다. 아무리 생각해도 이 기업에서 털고 있는 의구심을 지울수가 없다. 지식인들이 받는 물량은 진짜 얼마안되거든...

내 거래 리스트다. 알아서 판단하시고... 해봤던 사람으로 아하는 1원에서 회생 불가한 토큰이 될 수도 있겠다는 생각이다. 중간에 그렇게 해 먹으면 사람들 신뢰 없어져서 다 떠나버리거든... 나중에는 운영비나 주머니 채울 사람은 이미 다 채워서 끌어 올릴 동력도 없을테고. 걍 아하 너란 사이트가 없었다면 내가 130만원 날릴 일도 없었겠지. 꾸준히 활동은 하겠지만 토큰 관련 민감한 이야기 나올 때마다 게시글 삭제하는 사이트가 오래 갈리는 만무하다. 는 것이 결론.

 

 

 

 

 

 

 

공홈(공식홈페이지)

www.aergo.io/

 

Main

“BLOCKO, the South Korean enterprise blockchain provider backed by Samsung, has launched in the UAE after raising funding in Asia Pacific and Europe, the company said.”

www.aergo.io

유튜브

www.youtube.com/watch?v=2cniIRbzyGg&t=2s&ab_channel=AERGO

2021 로드맵

www.aergo.io/news/aergo-2021-vision-and-roadmap/

 

AERGO 2021: Vision and Roadmap

Since the AERGO mainnet upgraded to 2.0 update in late 2019, we have been working hard to enhance both the usability and stability of the AERGO network to prepare for mainstream adoption. Building the Foundation In 2020, we saw the introduction of AERGO En

www.aergo.io

github

github.com/aergoio

 

aergo

aergo Project. aergo has 76 repositories available. Follow their code on GitHub.

github.com

Chrome Wallet

chrome.google.com/webstore/detail/aergo-connect/iopigoikekfcpcapjlkcdlokheickhpc

 

Aergo Connect

Wallet for Aergo Mainnet, Testnet, and private networks

chrome.google.com

 

시가 총액 보는 사이트

www.coingecko.com/ko

 

CoinGecko: 암호화폐 가격 및 시가총액

최신 암호화폐 시장 개요 및 분석(가격, 시가총액, 거래량 등)을 확인해 보세요.

www.coingecko.com

에서

www.coingecko.com/ko/%EC%BD%94%EC%9D%B8/aergo

 

Aergo(AERGO) 시세, 시가총액, 차트 및 정보 | 코인게코

Aergo(AERGO) 시세, 거래대금, 시가총액, 유통량, 거래소, 뉴스 등 암호화폐 거래에 도움이 되는 다양한 핵심 정보를 받아보세요.

www.coingecko.com

 

 

마이닝은 안되는듯? 블로코에 페이스북에 문의함. 

www.awesomeminer.com/software/zenemy-nvidia-miner

 

Awesome Miner - Manage and monitor mining operations

The leading solution to manage and monitor mining operations of any size up to 200,000 miners. ASIC, GPU and CPU support.

www.awesomeminer.com

얜 관계 없는 듯.

 

facebook

www.facebook.com/BLOCKO.Official/

 

Facebook에 로그인

메뉴를 열려면 alt + / 키 조합을 누르세요

www.facebook.com

 

기술 블로그

www.blocko.io/blockchain/aergo-dapp-%EA%B3%BC%EC%A0%95-iii/?utm_source=facebook&utm_medium=social&utm_campaign=fb_aergo-dapp-iii&utm_content=tech-blog

 

이더리움 대신 아르고로 DApp 쉽게 만들기3 - 블로코 기술블로그

스마트 컨트랙트는 블록체인에서 작동되는 일종의 프로그램으로 1994년 처음 제안되었고, 2013년 이더리움이 스마트 컨트랙트를 블록체인에 도입해 구현함으로써 '스마트 컨트랙트'하면 자연스

www.blocko.io

 

 

카카오

open.kakao.com/o/gVRYNGnb

 

[공식] AERGO 한국 유저 커뮤니티

#아르고#aergo#기업용#하이브리드#블록체인#플랫폼#블로코#트레이딩

open.kakao.com

 

텔레그램

https://t.me/aergoofficial

유튭에 있는 링크 

홈페이지: https://www.block-cloud.io/ 비지니스 백서: https://paper.aergo.io/AERGO_Whitepap... 기술 백서: https://paper.aergo.io/AERGO_Chain_Te... 텔레그램: https://t.me/aergoofficial 텔레그램(공지): https://t.me/aergoannouncements 블로그(미디움): https://medium.com/aergo 비하인드 ICOs: http://blog.behindicos.com/ 구글스프레드시트: https://docs.google.com/spreadsheets/...

+ Recent posts