SENIOR PROJECT MANAGER, SECURITY

SecurityIrvine, California

 

 

You must have a strong and demonstrated aptitude for CYBERSECURITY, PHYSICAL SECURITY, AND IT, supported by extensive and diverse experience in leading high-profile technical programs and projects. Your responsibilities will span into the domain knowledge of Enterprise IT Security, IT Engineering, IT Operations, and Application Development. You will provide overall leadership guidance and direction to your project teams.

ESSENTIAL JOB FUNCTIONS:

  • Responsible for delivering Global Security programs and projects with Security partners, IT, Game Teams, Compliance, and Legal.
  • Help to improve the Security project management framework and reporting.
  • Manage day to day department tasks and issues.
  • Support the Change Management, Cyber Security Incident Management, Physical Security Incident Management, and Asset Management/Tracking.

RESPONSIBILITIES:

  • Lead direct/indirect project teams that collaboratively work well with each other as well as other external teams.
  • Facilitate communication with stakeholders and senior management teams to ensure expectations are managed correctly.
  • Draw on extensive technical experience to understand change implications from a broad technical perspective, adding a ‘big picture’ view to the discussions.
  • Facilitate regularly scheduled team meetings to track project progress and keep the team informed of changes in priority/scope. 
  • Define, negotiate, communicate, implement and monitor quality standards on all project deliverables.
  • Lead workgroup for technical requirements, design deliverables, or closure acceptance list.
  • Ensure project documents are up to date and stored appropriately in Confluence.
  • Identify, analyze, prioritize, mitigate and communicate project risks and issues.
  • Manage project backlog and continuously groom it.
  • Collaborate with stakeholders to identify acceptance criteria.
  • Act as project team leader and become primary interface to all stakeholders.
  • Drive the team cadence - project, communication and partner engagements (internal & external).
  • Ensure 3rd party vendors understand and can deliver on expectations and acceptance criteria.
  • Forecast, track and manage project budgets, POs and invoices.
  • Effectively apply Project Management standards and practices in the areas of project planning, coordinating, budget management, scheduling and monitoring.
  • Present proposals, progress reports and recommendations to the highest levels in the organization, both verbally and in writing.
  • Drive the beginning to end stakeholder experience.
  • Manage sensitive cross-team engagements on subjects such as dependency alignment, schedule alignment, and managing expectations with internal and external customers.
  • Manage multiple simultaneous projects.
  • Provide support to incident, problem and change management.

MINIMUM JOB REQUIREMENTS:

  • Certification in PMP or PSM is strongly needed. ITIL (methodology), COBIT, MCSE, and/or ISSP are highly desired.
  • Bachelor's or Master’s degree in Computer Science or related field, or equivalent experience.
  • Basic understanding of accounting principles.
  • Minimum 4+ years of continuous experience as an IT engineer or Technical Project Lead.
  • Vast technical knowledge of IT infrastructure is a must:
    • Cyber Security frameworks (ISO, NIST, CIS, ect…)
    • N tiered architecture
    • Network (TCP/IP, Firewall concepts)
    • OS concepts: Linux, AIX, Windows Server
    • Storage (SAN, NAS)
  • Strong understanding of Agile/Scrum or KANBAN framework.
  • Thoroughly versed in SDLC concepts and practices, particularly as it relates to promotion and deployment of routine fixes and major releases into a production environment.
  • Proficiency in Confluence and JIRA toolset. Admin Level is highly desired.
  • Strong organization and leadership skills with the ability to facilitate technical sessions and perform mentoring for less senior team members.
  • Capable of communicating complex technical information to a non-technical audience and of communicating structured production process requirements to a technical audience.

We are an Equal Opportunity Employer. All qualified applicants will receive consideration for employment without regard to race, color, religion, sex, sexual orientation, gender identity, gender expression, national origin, protected veteran status, or any other basis protected by applicable law, and will not be discriminated against on the basis of disability.

Blizzard Entertainment is a global company committed to growing our employees along with the business. We offer generous benefits and perks with an eye on providing true work/life balance. We've worked hard to foster an intensely collaborative and creative environment, a diverse and inclusive employee culture, and training and opportunity for professional growth. Our people are everything. Our core values are real, and our mission has never changed. We are dedicated to creating the most epic entertainment experiences… ever. Join us!

'Blog History' 카테고리의 다른 글

개 발 일 지 047  (0) 2019.12.10
개 발 일 지 046  (0) 2019.12.10
개 발 일 지 044  (0) 2019.12.10
개 발 일 지 043  (0) 2019.12.10
개 발 일 지 042  (0) 2019.12.10

SENIOR RED TEAM SPECIALIST

SecurityIrvine, California

 

 

As a member of the red team, you provide the technical expertise required to carry out internal and external hacking exercises.  You will seek out and bring to light company crushing vulnerabilities in real-world scenarios using any methods at your disposal.  From here you will create and provide presentations to executive management highlighting outcomes of the team’s operations with recommendations for remediation or mitigation.  

This is a position for highly driven autonomous security professionals that work well in a team-oriented environment.

Responsibilities

  • Plan and conduct attacks on internally or externally hosted applications and infrastructure on a global scale with an emphasis on critical functions.
  • Be flexible with regard to schedule to accommodate the most effective time to carry out attack campaigns depending on objectives defined.
  • Design and develop scripts, frameworks, tools, and the methods required for facilitating and executing complex attacks, emulating malicious actor behavior aimed at avoiding detection.
  • Review the results of any operation in order to determine the severity of findings and identify potential remediation or mitigation strategies.
  • Work in a fast-paced, tightly knit and coordinated team within a highly technical environment and have the willingness to learn new skills as required.
  • Compile and present comprehensive campaign results to process/system owners as well as senior leadership.
  • Create extensive documentation and be able to present your findings to the rest of the team or subject matter experts as necessary.
  • Define and develop an agenda for training and educating employees on advanced exploits, tools, and frameworks.
  • Research emerging technologies and exploitation methods relevant to the company.
  • Explore opportunities to discover previously unknown or undisclosed vulnerabilities.
  • Execute on your comprehensive knowledge and specialization in the assigned areas of skill in complex and challenging situations.
  • Possess and employ a high level of proficiency in one or more disciplines employed within the red team, such as web applications, system exploitation, network-based attacks, reverse engineering, social engineering, etc.

Qualifications

  • Bachelor’s degree in Computer Science, Information Security, a related program, or equivalent work experience
  • A minimum of 6 years’ of professional experience in information security as a penetration tester, reverse engineer, researcher or threat analyst / IR team member
  • Able to operate at an advanced level of written and spoken communication
  • Prior experience or expertise performing red team operations

Disciplines / Specializations Preferred

  • High level of knowledge in application, system and network exploitation or enumeration techniques utilized today ranging from an injection, privilege escalation, buffer overflows, fuzzing, scanning, and anything else a minion of Diablo would perform
  • Experience with writing and demonstrating proof of concept work from an exploitation or attack perspective
  • Capable to create and employ modules and tailored payloads for common testing frameworks or tools
  • Extensive understanding of cryptography, its role in the enterprise, and its strengths as well as weaknesses
  • Knowledge of tactics, techniques, and procedures that could be used for recon, persistence, lateral movement, and exfiltration
  • Programming exposure and familiarity with languages such as C /C# / C++, Java, or Assembly
  • Proficiency in one or more scripting languages, e.g. Perl, Python, PowerShell or shell scripting
  • Prior experience with reverse engineering, malware analysis, and forensic tools
  • Solid understanding of networking topologies, protocol usage, and enterprise hardware including switches, routers, firewalls and their roles in security
  • Knowledge of access control methodologies, network/host intrusion detection, vulnerability management tools, patch management tools, penetration testing tools, and AV solutions
  • Knowledge or experience in infiltration of physical systems such as lock picking, social engineering, and hardware authentication bypass
  • Experience with hardware hacking or building custom hardware for the purpose of exploitation

Required Application Materials

  • Resume
  • Cover Letter (optional) which should include:
      • Why you are interested in working at Blizzard
      • What games you are currently playing

Blizzard Entertainment is a global company committed to growing our employees along with the business. We offer generous benefits and perks with an eye on providing true work/life balance. We’ve worked hard to foster an intensely collaborative and creative environment, a diverse and inclusive employee culture, and training and opportunity for professional growth. Our people are everything. Our core values are real, and our mission has never changed. We are dedicated to creating the most epic entertainment experiences...ever. Join us!

'Blog History' 카테고리의 다른 글

개 발 일 지 046  (0) 2019.12.10
개 발 일 지 045  (0) 2019.12.10
개 발 일 지 043  (0) 2019.12.10
개 발 일 지 042  (0) 2019.12.10
개 발 일 지 041  (0) 2019.12.10

SENIOR PROJECT MANAGER, SECURITY

SecurityIrvine, California

 

 

You must have a strong and demonstrated aptitude for CYBERSECURITY, PHYSICAL SECURITY, AND IT, supported by extensive and diverse experience in leading high-profile technical programs and projects. Your responsibilities will span into the domain knowledge of Enterprise IT Security, IT Engineering, IT Operations, and Application Development. You will provide overall leadership guidance and direction to your project teams.

ESSENTIAL JOB FUNCTIONS:

  • Responsible for delivering Global Security programs and projects with Security partners, IT, Game Teams, Compliance, and Legal.
  • Help to improve the Security project management framework and reporting.
  • Manage day to day department tasks and issues.
  • Support the Change Management, Cyber Security Incident Management, Physical Security Incident Management, and Asset Management/Tracking.

RESPONSIBILITIES:

  • Lead direct/indirect project teams that collaboratively work well with each other as well as other external teams.
  • Facilitate communication with stakeholders and senior management teams to ensure expectations are managed correctly.
  • Draw on extensive technical experience to understand change implications from a broad technical perspective, adding a ‘big picture’ view to the discussions.
  • Facilitate regularly scheduled team meetings to track project progress and keep the team informed of changes in priority/scope. 
  • Define, negotiate, communicate, implement and monitor quality standards on all project deliverables.
  • Lead workgroup for technical requirements, design deliverables, or closure acceptance list.
  • Ensure project documents are up to date and stored appropriately in Confluence.
  • Identify, analyze, prioritize, mitigate and communicate project risks and issues.
  • Manage project backlog and continuously groom it.
  • Collaborate with stakeholders to identify acceptance criteria.
  • Act as a project team leader and become the primary interface to all stakeholders.
  • Drive the team cadence - project, communication and partner engagements (internal & external).
  • Ensure 3rd party vendors understand and can deliver on expectations and acceptance criteria.
  • Forecast, track and manage project budgets, POs, and invoices.
  • Effectively apply Project Management standards and practices in the areas of project planning, coordinating, budget management, scheduling, and monitoring.
  • Present proposals, progress reports and recommendations to the highest levels in the organization, both verbally and in writing.
  • Drive the beginning to end stakeholder experience.
  • Manage sensitive cross-team engagements on subjects such as dependency alignment, schedule alignment, and managing expectations with internal and external customers.
  • Manage multiple simultaneous projects.
  • Provide support to incident, problem and change management.

MINIMUM JOB REQUIREMENTS:

  • Certification in PMP or PSM is strongly needed. ITIL (methodology), COBIT, MCSE, and/or ISSP are highly desired.
  • Bachelor's or Master’s degree in Computer Science or related field, or equivalent experience.
  • Basic understanding of accounting principles.
  • Minimum 4+ years of continuous experience as an IT engineer or Technical Project Lead.
  • Vast technical knowledge of IT infrastructure is a must:
    • Cyber Security frameworks (ISO, NIST, CIS, etc…)
    • N tiered architecture
    • Network (TCP/IP, Firewall concepts)
    • OS concepts: Linux, AIX, Windows Server
    • Storage (SAN, NAS)
  • Strong understanding of Agile/Scrum or KANBAN framework.
  • Thoroughly versed in SDLC concepts and practices, particularly as it relates to promotion and deployment of routine fixes and major releases into a production environment.
  • Proficiency in Confluence and JIRA toolset. Admin Level is highly desired.
  • Strong organization and leadership skills with the ability to facilitate technical sessions and perform mentoring for less senior team members.
  • Capable of communicating complex technical information to a non-technical audience and of communicating structured production process requirements to a technical audience.

We are an Equal Opportunity Employer. All qualified applicants will receive consideration for employment without regard to race, color, religion, sex, sexual orientation, gender identity, gender expression, national origin, protected veteran status, or any other basis protected by applicable law, and will not be discriminated against on the basis of disability.

Blizzard Entertainment is a global company committed to growing our employees along with the business. We offer generous benefits and perks with an eye on providing true work/life balance. We've worked hard to foster an intensely collaborative and creative environment, a diverse and inclusive employee culture, and training and opportunity for professional growth. Our people are everything. Our core values are real, and our mission has never changed. We are dedicated to creating the most epic entertainment experiences… ever. Join us!

'Blog History' 카테고리의 다른 글

개 발 일 지 045  (0) 2019.12.10
개 발 일 지 044  (0) 2019.12.10
개 발 일 지 042  (0) 2019.12.10
개 발 일 지 041  (0) 2019.12.10
개 발 일 지 040  (0) 2019.12.10

SENIOR GAMES WRITER, OVERWATCH

OverwatchIrvine, California

 

 

Blizzard Entertainment is looking for an experienced senior game writer to join the Overwatch team. As part of the writing team, your day to day responsibilities will include dialogue writing, story development, and content implementation. In addition, you will frequently be called upon to assist with editing, research, and intellectual property management.

The ideal candidate will have demonstrated success as an experienced game developer with strong creative writing experience, excellent collaboration skills, and a real passion for Overwatch.

Responsibilities

  • Quickly write and iterate on compelling dialogue for characters, missions, and cinematics
  • Write an in-game backstory for the world, factions, and characters
  • Contribute to the story development of the Overwatch universe
  • Maintain the vision of the Overwatch universe
  • Do research gathering and documentation
  • Perform editing tasks as needed
  • Perform other duties that may be assigned by team management

Requirements

  • 3+ years of industry experience as a writer/story developer
  • At least one shipped AAA game title in a writing or game design role
  • Understanding and knowledge of the universe of Overwatch
  • Excellent written and verbal communications skills
  • Able to create dynamic dialogue for Overwatch heroes
  • Able to act independently on writing tasks
  • Excellent organizational skills and able to work well under deadlines
  • Work and thrive in a collaborative team environment
  • Knowledge of current successful intellectual properties in today’s popular culture
  • Plays and has knowledge of modern video games
  • Technically proficient to learn toolsets to implement work into the game

Pluses

  • Experience in game design
  • Understand various game toolsets
  • Successfully published writing work (novels, short fiction, film, television, comics)
  • Bachelor's degree or equivalent experience

Application Materials

  • Links or attachments of writing samples/portfolio (preferred)
  • Cover Letter (preferred)
  • Resume (required)

Blizzard Entertainment is a global company committed to growing our employees along with the business. We offer generous benefits and perks with an eye on providing true work/life balance. We’ve worked hard to foster an intensely collaborative and creative environment, a diverse and inclusive employee culture, and training and opportunity for professional growth. Our people are everything. Our core values are real, and our mission has never changed. We are dedicated to creating the most epic entertainment experiences…ever. Join us!

'Blog History' 카테고리의 다른 글

개 발 일 지 044  (0) 2019.12.10
개 발 일 지 043  (0) 2019.12.10
개 발 일 지 041  (0) 2019.12.10
개 발 일 지 040  (0) 2019.12.10
개 발 일 지 039  (0) 2019.12.09

LEAD EDITOR, CREATIVE DEVELOPMENT

Creative DevelopmentIrvine, California

 

 

Blizzard Entertainment is looking for a talented and experienced publishing editor for the Story and Franchise team in Irvine, California. Story and Franchise focus on developing Blizzard Entertainment’s universes through a variety of media, including animation, cinematics, illustrations, novels, comics, and more, working with internal as well as external talent.

The lead editor, publishing, will work closely with the director of creative development to create epic published products and grow Blizzard’s exciting publishing program in a bold new direction.

The lead editor will also interface heavily with Blizzard’s licensing and game teams and will be the day-to-day point of contact with our publishing partners’ editorial staff. The ideal candidate will have exceptional creativity and the ability to oversee the development of multiple projects at once, providing program management as well as strong editorial feedback on manuscripts in various forms of published media.

Responsibilities:

  • Develop, contribute to, and manage comics, novels, young readers, art books and specialty books.
  • Partner with the director of creative development on creative and strategic ideation and planning.
  • Partner with development, game teams, and licensing teams on new and existing published products.
  • Manage the Blizzard publishing program’s editorial and strategic direction in partnership with licensing and Story and Franchise leadership.
  • Manage a team of editors.
  • Develop and route approvals for published Blizzard Entertainment products.
  • Function as a publisher on all internally produced Blizzard published products.
  • Serve as the point of creative contact to external partner editorial staff.

Requirements:

  • A minimum of 7 years’ experience as a senior editor working on high-profile published properties
  • Excellent organizational skills and a detail-oriented approach to problem-solving
  • Able to communicate effectively across multiple teams, with excellent written and oral communication skills
  • Able to creatively collaborate and facilitate creative environments for partnered talent
  • A strong desire to explore new directions in the ever-changing publishing landscape
  • Strong connections and relationships with colleagues in the publishing industry, including authors, artists, agents, and designers.
  • Extensive knowledge of story development from concept to the final product
  • Knowledge of publishing in a variety of media
  • Able to work well in a collaborative team environment and within an iterative development process
  • Strong storytelling skills and the ability to provide constructive criticism
  • Strong understanding of trans-media theory and the desire to apply it
  • Working knowledge of Blizzard Entertainment’s intellectual properties
  • A passion for story, art, and the future of the publishing industry

Pluses:

  • A passion for games, movies, graphic novels, and other elements of pop culture
  • Extensive understanding of one or more of Blizzard Entertainment’s intellectual properties
  • Extensive knowledge of Blizzard Entertainment’s published products, including the novels, comics, manga, and online publications

Application Materials:

  • Resume (PDF Preferred)
  • Cover Letter which should include:
    • Why you are interested in working at Blizzard and position
    • What games you are currently playing

Primary Location: United States-CA-Irvine

Blizzard Entertainment is a global company committed to growing our employees along with the business. We offer generous benefits and perks with an eye on providing true work/life balance. We’ve worked hard to foster an intensely collaborative and creative environment, a diverse and inclusive employee culture, and training and opportunity for professional growth. Our people are everything. Our core values are real, and our mission has never changed. We are dedicated to creating the most epic entertainment experiences…ever. Join us!

We are an equal opportunity employer and value diversity at our company. We do not discriminate on the basis of race, religion, color, national origin, gender, sexual orientation, age, marital status, veteran status, or disability status.

'Blog History' 카테고리의 다른 글

개 발 일 지 043  (0) 2019.12.10
개 발 일 지 042  (0) 2019.12.10
개 발 일 지 040  (0) 2019.12.10
개 발 일 지 039  (0) 2019.12.09
개 발 일 지 038  (0) 2019.12.09

 

 

EDITOR, CREATIVE DEVELOPMENT

Creative DevelopmentIrvine, California

 

 

Blizzard Entertainment is looking for a talented and experienced editor for the Story and Franchise Development team in Irvine, California. Story and Franchise focus on developing Blizzard Entertainment’s universes through a variety of media, including animation, cinematics, illustrations, novels, comics, and more, working with internal as well as external talent.

As part of an editorial team, this role will create epic published products and help to expand Blizzard’s exciting publishing program in bold, new directions.

The editor will interface heavily with Blizzard’s licensing and game teams, managing the creative vision for each assigned project. In addition, the editor will work directly with the editorial and design staffs of our various publishing partners on licensed projects.

You have exceptional creativity and the ability to oversee the development of multiple projects at once, providing strong editorial feedback on manuscripts and accompanying art in various forms of published media.

Responsibilities:

  • Pitch, develop and edit a variety of books, including comics, novels, art books, and specialty books
  • Responsible for all aspects of editorial oversight on assigned titles, including line editing, art direction, and copywriting
  • Acquire and develop new writing and artistic talent
  • Serve as the point of creative contact to external partner editorial staffs
  • Work with lead editor and director of story development on publishing strategy, ideation and planning
  • Support larger franchise initiatives
  • Represent Blizzard Entertainment at industry conventions as needed

Experience:

  • Minimum 3 years of editorial experience working on high-profile published properties
  • Excellent organizational skills and a detail-oriented approach to problem-solving
  • Able to communicate effectively across multiple teams, with excellent written and oral communication skills
  • Able to creatively collaborate and facilitate creative environments for both colleagues and partnered talent
  • A strong desire to explore new directions in the ever-changing publishing landscape
  • Knowledge of story development from concept to the final product
  • Knowledge of publishing in a variety of media
  • Able to work well in a collaborative team environment and within an iterative development process
  • Strong storytelling skills and the ability to provide constructive criticism
  • Aware of trends and competition
  • Working knowledge of Blizzard Entertainment’s intellectual properties
  • A passion for story, art, and the future of the publishing industry

Pluses:

  • A passion for games, movies, graphic novels, and other elements of pop culture
  • Extensive understanding of one or more of Blizzard Entertainment’s intellectual properties
  • Extensive knowledge of Blizzard Entertainment’s published products, including novels, comics, art books, specialty books, manga, and online publications

Application Materials:

  • Resume (PDF Preferred)
  • Cover Letter which should include:
    • Why you are interested in working at Blizzard and position
    • What games you are currently playing

Primary Location: United States-CA-Irvine

Blizzard Entertainment is a global company committed to growing our employees along with the business. We offer generous benefits and perks with an eye on providing true work/life balance. We’ve worked hard to foster an intensely collaborative and creative environment, a diverse and inclusive employee culture, and training and opportunity for professional growth. Our people are everything. Our core values are real, and our mission has never changed. We are dedicated to creating the most epic entertainment experiences…ever. Join us!

We are an equal opportunity employer and value diversity at our company. We do not discriminate on the basis of race, religion, color, national origin, gender, sexual orientation, age, marital status, veteran status, or disability status.

'Blog History' 카테고리의 다른 글

개 발 일 지 042  (0) 2019.12.10
개 발 일 지 041  (0) 2019.12.10
개 발 일 지 039  (0) 2019.12.09
개 발 일 지 038  (0) 2019.12.09
개 발 일 지 037  (0) 2019.12.06

.zshrc
0.00MB

zshrc

 

have been attached.

 

 

!-- 텍스트 필드 선택시 화면 올리기.

- (void)textFieldDidBeginEditing:(UITextField *)textField {

    if (textField == self.userId) {
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDelegate:self];
        [UIView setAnimationDuration:0.5];
        [UIView setAnimationBeginsFromCurrentState:YES];
        self.view.frame = CGRectMake(self.view.frame.origin.x, (self.view.frame.origin.y - 100), self.view.frame.size.width, self.view.frame.size.height);
        [UIView commitAnimations];
        static_userpw_int = 0;
    }
    else if (textField == self.userPw) {
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDelegate:self];
        [UIView setAnimationDuration:0.5];
        [UIView setAnimationBeginsFromCurrentState:YES];
        self.view.frame = CGRectMake(self.view.frame.origin.x, (self.view.frame.origin.y - 100), self.view.frame.size.width, self.view.frame.size.height);
        [UIView commitAnimations];
        static_userpw_int = 1;
    }
}

- (void)textFieldDidEndEditing:(UITextField *)textField {
    if (textField == self.userId) {
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDelegate:self];
        [UIView setAnimationDuration:0.5];
        [UIView setAnimationBeginsFromCurrentState:YES];
        self.view.frame = CGRectMake(self.view.frame.origin.x, (self.view.frame.origin.y + 100), self.view.frame.size.width, self.view.frame.size.height);
        [UIView commitAnimations];
        static_userpw_int = 0;
    }
    else if (textField == self.userPw) {
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDelegate:self];
        [UIView setAnimationDuration:0.5];
        [UIView setAnimationBeginsFromCurrentState:YES];
        self.view.frame = CGRectMake(self.view.frame.origin.x, (self.view.frame.origin.y + 100), self.view.frame.size.width, self.view.frame.size.height);
        [UIView commitAnimations];
        static_userpw_int = 2;
        [textField resignFirstResponder];
    }
}

- (IBAction)textFieldDoneEditing: (id)sender {

if ([sender tag] == 0) {
}
else {
[sender resignFirstResponder];
}
}








!-- 카메라 diable한 경우 사용자는 화면 까매져도 잘 몰라서 넣는 코드.

#import <AVFoundation/AVFoundation.h>

Adding build phases -> Link binary with libraries -> AVFoundation.framework



AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];

        switch (status){

            case AVAuthorizationStatusAuthorized:{

                    // 동의함

                };

                break;

            

            case AVAuthorizationStatusNotDetermined:{

                    // 정의 안됨 (동의전)

                    [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {

                        if (granted) {

                            //Granted access to mediaType

                            dispatch_async (dispatch_get_main_queue (), ^{



                            });

                        }

                    }];

                };

                break;

            

            case AVAuthorizationStatusDenied:{

                    // 동의안함

                    UIAlertController * alert=   [UIAlertController

                                                  alertControllerWithTitle:@"카메라 접근 요청"

                                                  message:@"카메라 접근 권한이 허용되지 않았습니다.\n'확인' 버튼을 누르시면 접근권한 설정 화면으로 이동합니다."

                                                  preferredStyle:UIAlertControllerStyleAlert];

                

                    UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"확인" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action)

                                               {

                                                   [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]

                                                                                      options:@{}

                                                                            completionHandler:nil];

                                               }];

                    UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"취소" style:UIAlertActionStyleDefault handler:nil];

                

                    [alert addAction:okAction];

                    [alert addAction:cancelAction];

                

                    UIViewController *rootView = [[[[UIApplication sharedApplication] delegate] window] rootViewController];

                    while (rootView.presentedViewController) {

                        rootView = rootView.presentedViewController;

                    }

                    [rootView presentViewController:alert animated:YES completion:nil];

                

                }

                break;

            

            case AVAuthorizationStatusRestricted:{

                };

                break;

            

        }

'Blog History' 카테고리의 다른 글

개 발 일 지 041  (0) 2019.12.10
개 발 일 지 040  (0) 2019.12.10
개 발 일 지 038  (0) 2019.12.09
개 발 일 지 037  (0) 2019.12.06
개 발 일 지 036  (0) 2019.12.04

      UIAlertController *AlertView = [UIAlertController alertControllerWithTitle:@"popup" message:@"추가 저장 하시겠습니까?"    preferredStyle:UIAlertControllerStyleActionSheet];
                           
                           UIAlertAction *ok = [UIAlertAction actionWithTitle:@"예" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action)
                                                {
                               
                               [self WTF];
                               
                               
                               [AlertView dismissViewControllerAnimated:YES completion:nil];
                           }];
                           
                           UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"아니요" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action)
                                                    {
                               [AlertView dismissViewControllerAnimated:YES completion:nil];
                           }];
                           
                           [AlertView addAction:ok];
                           [AlertView addAction:cancel];
                           [self presentViewController:AlertView animated:YES completion:nil];
                           

target does not implement selector


doBackgroundWork -> doBackgroundWork:

.h
NSConditionLock *theConditionLock;


.m


enum {
    kWorkTodo = 1,
    kNoWorkTodo = 0
};


theConditionLock = [[NSConditionLock alloc] initWithCondition: kNoWorkTodo];
   [theConditionLock unlockWithCondition:kWorkTodo]; // Wait until there is work to do
  [self startDoingWork];


- (void)doBackgroundWork:(id)arg {
    while (thread1) {
        NSLog(@"thread===`==========================================");
        [theConditionLock lockWhenCondition:kWorkTodo]; //스스로 멈춤.
    }    
}


- (void)startDoingWork {
    [NSThread detachNewThreadSelector:@selector(doBackgroundWork:) toTarget:self withObject:nil];
}


Variable is not assignable (missing __block type specifier)

    [theConditionLock lock];

    [theConditionLock unlockWithCondition:kWorkTodo]; //언락시 다시 돎. 언락 때마다 실행 가능.


'Blog History' 카테고리의 다른 글

개 발 일 지 040  (0) 2019.12.10
개 발 일 지 039  (0) 2019.12.09
개 발 일 지 037  (0) 2019.12.06
개 발 일 지 036  (0) 2019.12.04
개 발 일 지 035  (0) 2019.12.04

https://developer.apple.com/documentation/uikit/inter-process_communication/allowing_apps_and_websites_to_link_to_your_content/defining_a_custom_url_scheme_for_your_app

2019-12-04 17:38:52.732915+0900 AXRuntimeCommon] This class 'SwiftUI.AccessibilityNode' is not a known serializable element and returning it as an accessibility element may lead to crashes
onClickBTN
true
2019-12-04 17:38:54.007397+0900 Can't end BackgroundTask: no background task exists with identifier 2 (0x2), or it may have already been ended. Break in UIApplicationEndBackgroundTaskError() to debug.

엥? url 호출이 fork() 류 인가?
검색

https://stackoverflow.com/questions/23882495/cant-endbackgroundtask-no-background-task-exists-with-identifier-or-it-may-ha

얜 백그라운드 프로세스 관련...

https://zetal.tistory.com/entry/Cant-end-BackgroundTask-%EC%98%A4%EB%A5%98

iOS 13오류라는 카더라.

뭐지, ... 어떻던 간 해결해야 하는데 ㅠㅠㅠ

HI!
I can confirm that, for me have also same issue with  AVCaptureSession, the App is 10y+ old, but i think
doesen't matter how old, the AVCaptureSession is stopping.
"Can't end BackgroundTask: no background task exists with identifier 13 (0xd), or it may have already been ended. Break in UIApplicationEndBackgroundTaskError() to debug."

요것도 있고,
Same here with empty new project in iOS 13 GM with Xcode 11 GM on iPhone XS Max & on iOS 13.1 Beta 3 on iPhone XS.

 

Can't end BackgroundTask: no background task exists with identifier 2 (0x2), or it may have already been ended. Break in UIApplicationEndBackgroundTaskError() to debug.

이것도 있군...

일단 재부팅 각이다.

잘된다.

역시 복구 메커니즘은 업데이트 메커니즘과 더불어 가장 힘든 작업이겠지.

!-- 회사의 방향성.

하이브리드 버리고 네이티브로 가자고 말한지 2달. 모든 앱 통합하지 말고 앱 끼리 연결하자고 말한지 2달.
엔터프라이즈 배포 말고, 앱 스토어 배포로 가자고 말한지 2달 되었는데 다 그렇게 되고 있다.
설득할 때 현대/기아의 대기업 앱 배포 방식이 엔터프라이즈에서 앱 스토어로 바뀌었다고 말한 것도 설득력 있었지만,
카카오 같이 대형 앱 회사도 그렇게 간다고 한게 가장 설득력 있었다.
카카오 땡쓰. 내가 생각하는 방향성과 계속 맞아서 좋다.




'Blog History' 카테고리의 다른 글

개 발 일 지 039  (0) 2019.12.09
개 발 일 지 038  (0) 2019.12.09
개 발 일 지 036  (0) 2019.12.04
개 발 일 지 035  (0) 2019.12.04
개 발 일 지 034  (1) 2019.12.04

URL 호출  


//
//  ContentView.swift
//  URLcaller
//
//  Created by Junho HA on 2019/11/15.
//

import SwiftUI

struct ContentView: View {
    
    var body: some View {
        Button(action: {
            btnClick()
        }) {
             Text("Open anotherApp")
             }
    }
}

func btnClick() {
    print("onClickBTN")
    guard let s = URL(string : "yourappurl://") else {
        return }
    
    if UIApplication.shared.canOpenURL(s) {
        UIApplication.shared.open(s, options: [:]) { (b ) in
            print(b)
        }
    }
    
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

'Blog History' 카테고리의 다른 글

개 발 일 지 038  (0) 2019.12.09
개 발 일 지 037  (0) 2019.12.06
개 발 일 지 035  (0) 2019.12.04
개 발 일 지 034  (1) 2019.12.04
개 발 일 지 033  (0) 2019.11.26

2016 나무위키 글인데 지금 글을 찾아 보면 보면 쓰레기들이 상당히 붙어서 작업을 했다는 것을 알 수 있다.

 

 

꼭, 지금 나무위키와 비교해 보길.

 

-- 지금 글 --

https://namu.wiki/w/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8

 

프로그래머 - 나무위키

국내에서는 보안 관리자, 보안 시스템 유지보수 전문가 등으로 부른다. 하지만 영어권에서는 개발자가 아니라 Operator라고 분명히 구분해준다. 국내에 이런 오퍼레이터 전문 육성 코스가 없어서 다들 프로그래밍을 하다가 이쪽으로 넘어오는데 전공 지식을 거의 활용할 수 없어서 기초부터 새로 배워야 하는 경우가 부지기수다. 오퍼레이터는 프로그래머의 하위 분류가 아니라 이웃 분류이다. 동등한 전문성을 갖추고 있는 반면 그 전문 영역이 별로 겹치지 않는다. 이들은

namu.wiki

 

-- 예전 글 --

 


• 랜덤(A)
• 특수문서
• 바뀐글(더)
• 편집(E)
• 역링크
프로그래머
• 직업 관련 정보, 컴퓨터 관련 정보, C
1. 개요
1.1. 거창한 알고리즘 연구자가 아니다
2. 최초의 프로그래머
3. 프로그래머의 종류(스펙트럼)
3.1. 일반 프로그래머
3.2. 융합형 프로그래머
3.3. 코더
4. 프로그래머가 되는 방법
4.1. 학위(대학 졸업장 등) 필요여부
4.2. 난 고수가 되고 싶어요
4.3. 필요한 능력
5. 이 속성을 가진 캐릭터
6. 유사 용어
1. 개요

 



▲ 유재석이 홍진호가 찬 명찰에 '프로그래머'라고 써 있는 것을 보고 제작진에게 한 질문. 제작진은 프로게이머와 프로그래머를 헷갈렸고 유재석은 프로그래머라는 직업을 몰랐다.
직업병 "한 포기" 하고 말하면 "타입이 일치하지 않습니다. 그램으로 넣어주세요." 라는 예외가 난다 인스타그램, 텔레그램, LG PC gram: 흠칫
프로그래머란 컴퓨터 프로그램을 만드는 사람이다. 전 세계적으로 유명한 프로그래머로는 존 카멕, 성공한 사람들 중엔 빌 게이츠 같은 사람이 있다. 이 나무위키도 프로그래머의 손 끝에서 탄생한 것이다. 무슨 주문을 외웠길래 이런 위키가 만들어졌는지 알고 싶고 지금 크롬으로 접속했다면 Ctrl+U를 눌러보자.(또는 F12도 된다).대강 무슨 주문을 외웠는지 엿볼 수 있을 것이다. 물론 관련 지식이 없다면 주문의 내용을 해석할 수는 없겠지만, 일단 주문의 모습은 볼 수 있을 것이다.
서양에서는 '프로그래머들 중엔 비만이 많다'는 편견이 있다고 한다. 하루종일 컴퓨터 앞에 앉아서 간식 처묵하는 이미지 때문인 듯하다.(...) 물론, 실제로 프로그래머들은 대부분 의자에 앉아 있는 시간이 많으므로 대개 운동이 부족한 것은 사실이다. 그러나, 실제 제대로된 프로그래머들 중에서는 비만이 거의 없는데, 왜냐하면 생각하느라 먹을 생각을 잘 안하기 때문이다. 쓸만한 프로그래머들은 내가 만드려는 프로그램에 대해 생각하는데 80%이상의 시간을 쓰고, 그걸 구현하는데는 20%의 시간도 안쓴다. 그리고 프로그래머들은 자신의 능력을 이용해 간혹 기발한 일을 벌이기도 하는데[1], 그게 나쁜 쪽으로 발현되는 것 중의 하나가 바로 크래킹이다. 같은 맥락에서 프로그래머는 보통 개인주의적 괴짜 집단 내지 틀에 박힌 것에 거부감을 지닌 이미지로 연상되기도 한다.
1.1. 거창한 알고리즘 연구자가 아니다
보통 수학이론을 이용하여 알고리즘에 대해 연구하는 사람과 프로그래머를 혼동하곤 하는데, 일반적인 프로그래머는 거창한 알고리즘 연구자가 아니다. 여러분이 생각하는 그 알고리즘 연구는 보통 대학원의 연구실이나, 대기업 연구소 등에서 이뤄진다. 그에 반해 일반적인 프로그래머들은 사실 조립공이라고 보는 것이 정확할 것이다. 알고리즘 자체에 대한 연구는 수학자나 전산학자(컴퓨터공학자)들이 하는 것이고, 그 연구 결과를 소수의 코어파트 프로그래머들이 가져다가 부품을 개발하며, 그 부품을 대다수의 일반 프로그래머들이 사용한다.
위 문단보다 더 와닿게 비유하자면 프로그래머는 건설업에서의 인부와 같다. 살짝 안습해 보일지 몰라도 사실이다. 초창기엔 머리만 좋으면 뭘 해낼수 있었지만 현재의 몇십만줄의 코드가 들어가는 프로그램은 폰 노이만이 와도 도저희 혼자서 만들수가 없다. 개인별 능률에 분명히 차이가 있지만 어차피 똑같은거 가지고 구현하는건데 시간의 차이가 있을뿐 결과물은 비슷하다(물론 발코딩은 예외다) . 위 사실은 프로그래머가 대체 가능 하다는걸 의미한다. 프로그래머가 희소성 있고 전문적인 직업이라고 생각했으면 상상이 깨질만한 부분.
하지만 세상에 일반적 프로그래머만 있는게 아니라서 전문적 프로그래머도 있다. 컴퓨터 분야를 깊이배워서 단순히 어플리케이션만이 아닌 운영체제같은곳(로우레벨)에 손대는 사람들이 그렇다. 이들은 보통 컴퓨터공학과에서 하드웨어까지 배운다. [2] 이사람들이 대학원에서 알고리즘을 배운다면 바로 그 거창한 알고리즘 연구자가 되는거고 기업에 취직해서 활용 한다면 전문적 프로그래머가 되는것이다.
프로그래머로 먹고살고싶다면 학원에서 조금 공부하고 취업할건지 대학에서 깊이 공부할건지 잘 생각해봐야한다.
2. 최초의 프로그래머
프로그래머는 대표적인 남초 직업이다. 그런데 의외로 최초의 프로그래머로 인정받는 사람은 바로 러브레이스 백작부인 에이다 킹(1815 ~ 1852)이다. 그녀는 찰스 배비지의 해석 기관 컴퓨터 상의 구현을 알고리즘으로 설명한 최초의 사람이기도 하다.
최초의 프로그래머가 여성이라는 사실에 놀란 사람들도 있을텐데, 프로그래밍 관련 서적들을 읽다보면 간혹 저자가 여성인 경우도 있다. 이후로도 초기의 프로그래머는 여성이 많은데, 컴퓨터에서 넘어온 사람이 많았기 때문.
3. 프로그래머의 종류(스펙트럼)
'프로그래머'라는 단어 하나로 간편하게 통칭하여 부르고 있긴 하지만, 사실 프로그래머에도 여러 종류(?)가 있다. 고급 언어와 툴을 다룰 줄 아는게 전부인 프로그래머부터, 저급 언어까지 다룰 줄 아는 프로그래머까지 그 스펙트럼은 어마어마하게 넓다. 또 소수의 코어파트 프로그래머들이 있는가 하면, 다수의 양산형 프로그래머인 코더가 있다.
컴퓨터 프로그래밍 기술에 능숙한 사람들은 유명세를 타기도 하지만, 이러한 관심을 받는 대상은 보통 소프트웨어 공학자 집단으로 국한된다. 그리고 종종 저명한 프로그래머들 중에는 "해커"라는 이름으로 불리는 사람들도 있다.
3.1. 일반 프로그래머
프로그래밍 언어, 알고리즘 등에 대한 전문 지식을 쌓고, 복잡하고 논리적이고 완성도 있는 프로그램을 개발하는 프로그래머들이 존재한다. 프로그래밍은 진입 장벽이 낮은 편이라 컴퓨터공학과 외에 거의 모든 공대에서 간단한 프로그래밍과 코딩 정도는 할 줄 알 정도라, 코더는 굉장히 많지만 알고리즘을 이해할 수 있는 프로그래머는 많지 않다. SW가 국가는 물론 세계의 핵심 분야가 될 것은 자명하므로 앞으로 정보 보안, OS, 네트워크 등 여러 방면에 있어서 이들의 역할은 더 커질 것으로 보인다.
3.2. 융합형 프로그래머
자신의 전문 지식을 바탕으로, 중급 수준의 프로그래밍을 익히고 직접 코딩을 하는 프로그래머들이 존재한다. 의사가 직접 의료 프로그램을 통계화, 수치화한다든가, 국과수 직원이 치아 감별을 통한 개인 식별을 위한 프로그래밍을 한다든가 하는 경우가 이에 속한다. 이들은 전문가 수준의 고급 코딩을 하지는 못하더라도, 자신이 원하는 프로그램을 짤 만한 코딩 능력은 갖추고 있으며, 무엇보다도 자신의 전공 분야에 대한 전문성이 탁월하기에 시너지 효과가 극대화된다. 마치 의사와 변호사가 합동으로 하는 것보다 의사 자격을 가진 변호사 한 명이 의료 소송 시장을 휩쓸고 있는 것처럼, 융합형 프로그래머는 자신의 전문성과 프로그래밍을 결합하여 그 분야의 전문가만이 떠올릴 수 있는 창의적인 아이디어를 바로 시장에 내보낼 수 있게 된다.
이들에게 요구되는 능력은 프로그래밍 능력이 아니라 자기 분야의 전문성이다. 전문성과 달리 프로그래밍은 극도로 완벽하고, 정교하고, 간결한 수준으로 잘 할 필요는 없다. 혹시 다소 불필요한 부분이 코드에 덕지덕지 붙어있다거나, 코딩하는 시간이 다소 오래 걸리거나 해도 크게 문제되지는 않는다. 이들에게 최우선으로 요구되는 사항은 전문성이고, 프로그래밍 능력은 그 다음이기 때문이다. 어차피 프로그램을 잘 짜서 성공하게 된다면, 그 다음부터는 프로그램 설계가 아닌 단순 코딩 정도는 양산형 프로그래머에게 맡겨도 된다.
3.3. 코더
기술의 발전으로 왠만한 프로그래머용 툴도 입문 난이도가 내려갔다. 이 덕분에 프로그래밍의 진입 장벽은 상당히 낮다. 그리고 기업이나 컴퓨터 학원 등지에서는 기초적인 코딩만 배운 프로그래머를 배출하였다. 이러한 프로그래머를 비하하는 용어로 "코더"가 있다. 원래 코더란 프로그램 코드를 볼 수 있고, 이에 따른 전반적인 테스트할 수 있는 사람을 의미하는 용어다. 그런데 지금 코더라는 용어는, 단순히 코딩만 할줄 알 뿐, 자기 프로그램을 개발할 능력은 없는 어설픈 프로그래머를 비하하는 의미로 변질되어 쓰이고 있는 상황이다.
코더와 프로그래머의 차이는 '알고리즘을 스스로 설계할 수 있는지'의 여부에 있다. 즉 주어진 문제를 해결하는 방법을 스스로 찾아내서 코딩할 수 있으면 프로그래머고, 아니면 코더다. 조금 더 구체적으로 말하자면, 소스 코드를 복사해서 붙이는 것 밖에 할 줄 모르는 사람은 코더이고[3] 소스 코드를 읽어서 그 작동 원리를 이해하고, 나아가 자신의 프로그램의 문맥에 맞게 튜닝해서 최적화할 수 있는 능력까지 갖춘 사람은 프로그래머다. 위에서 프로그래머는 거창한 알고리즘 연구자가 아니라고 하지 않았냐고? 거창한 알고리즘 연구자가 아닌 것 뿐이지, 일반적인(소소한) 알고리즘의 연구자는 맞다. 알고리즘이라는 단어 자체가 문제를 해결하는 방법 또는 절차를 의미한다. 자동차로 치면 코어파트 프로그래머가 튜닝 부품을 생산하는 업체라고 한다면, 프로그래머는 튜닝샵 직원, 코더는 서비스센터의 수습 정비사 정도 포지션정도에 해당한다.
프로그래머에게는 코드 리딩 능력도 중요하고, 자신에게 필요한 코드가 없을 때는 스스로 그것을 창조할 수 있는 능력도 있어야 한다. 즉 어떤 함수의 입력과 출력이 정의된 명세서가 주어지면 그 명세를 만족하는 코드(실제 컴파일 가능한 코드 또는 의사 코드)를 만들어낼 수 있는 사람이 프로그래머, 의사 코드(Pseudo code)가 주어졌을 때 그걸 실제로 동작하는 코드로 구현할 수 있는 사람은 코더라고 볼 수 있다. 다만 프로그래머가 의사 코드를 만들어서 코더한테 던져주는 프로세스는 요즘에 거의 사라졌다. 프로그래밍 언어가 많이 발전해서 현대의 프로그래밍 언어는 의사 코드에 매우 가깝다. 60년대에는 단순히 천공카드에 자료를 펀치하는 코더도 제대로 월급 받으면서 일할 수 있었지만 지금은 그런 저수준 작업이 필요없기 때문에 빨리 프로그래머로 전직(?)하는 게 좋다.
오늘날 플랫폼[4] 싸움이 커지면서 각자 자신들의 플랫폼 생태계를 성장시키기 위해 어플리케이션 만드는 과정을 점점 쉽게 만들어가는 추세이다보니, 과거에는 자신이 만든 프로그램의 몇몇 파트에 다른 라이브러리의 함수를 가져다 사용하는 수준이었다면, 요즘엔 아예 프로그램의 구조와 디자인 및 대부분의 뼈대가 되는 코드를 플랫폼에서 제공하는 프레임워크가 다 만들어 놓으면, 프로그래머는 거기에 부분부분 자신의 코드를 끼워 넣어 손만 보는 수준까지 왔다[5]. 자신의 영역에 대해 진입장벽이 점점 낮아지는 이런 상황에 대해 비판하는 프로그래머들도 많지만, 프로그래밍 자체는 그저 자신의 창의력을 발휘하기 위한 도구일 뿐이고, 도구가 쉬워졌다는것은 도구 자체에 신경 써야 하는 시간과 노력을 원래 목적에 할애할 수 있게 되었다는 것이기도 하기 때문에, 오히려 환영하는 프로그래머들도 많다.[6]
물론 고급 프로그래머도 사람이기 때문에 설계 미스를 내는 경우가 있다. 대표적인 경우가 Win32 애플리케이션 API. 왠지 null값을 파라메터에 자주 넘긴다고 생각했다면 착각이 아니다. 그리고 PHP라는 언어도 함수 이름에 일관성이 없어서 레퍼런스를 항상 참고해야 한다. 뭔가 프레임워크를 사용하는 방식이 어렵게 느껴지면 첫째는 본인 실력을 의심해야 하는 게 맞지만 둘째로는 그 프레임워크의 설계가 잘못돼있을 가능성도 고려하자. 프레임워크를 바꿨더니 안 되던 일이 일사천리로 진행되는 경우도 간혹 있다. 대형 프레임워크일수록 이런 설계 결함이 발생할 확률이 높아지기 때문에 몇몇 프로그래머는 '마이크로 프레임워크' 쪽으로 전향하기도 한다.
고급 프로그래머 중에서도 전체 프레임워크 기본 틀을 설계하는 최상급 프로그래머들은 소프트웨어 아키텍트 라고도 불린다.
4. 프로그래머가 되는 방법
프로그래머가 되고 싶다면, (한국의 컴퓨터공학 커리큘럼상에서는 C나 Java부터 가르치는데 이거 생까고)[7] 미국에서 입문과정으로 가르치는 Python부터 시작하는 것을 추천한다. 미국에서 괜히 파이썬을 입문용으로 가르치는 게 아니다. 그나저나 파이썬 강의는 도처에 널렸으므로 적당한 것 하나 골라잡고, 따라하다보면 일단 코더 타이틀은 획득할 수 있다. 사실 미국에서 진짜 입문용으로 가르치는 것은 스크래치라는 언어인데, 이거는 자료가 너무 없기 때문에 추천하기 어렵다. 그리고 스크래치 언어의 설계 목적은 철저히 교육용이다. 실용적인 프로그램을 이걸로 만들겠다는 건 레고 블럭으로 진짜 사람이 들어가 살 집을 지어보겠다는 것과 마찬가지다. 80~90년생 프로그래머는 BASIC부터 시작했을 가능성이 높은데, 21세기의 Basic이라고 할 만한 것이 바로 Python이다. 베이직과 달리 파이썬은 매우 고성능이기 때문에 입문 이후에도 주력으로 사용할 수 있는 특징이 있다. 참고로 위에서 C와 Java를 생까도 된다고 했는데 그 이유를 설명하자면, C언어는 원래 태생이 기계 제어 언어, 다시 말해 OS (운영체제)를 만들기 위해 개발된 언어이기 때문에 배우려는 사람이 이미 컴퓨터 아키텍처에 대해서는 잘 알고 있다고 가정하고 들어가기 때문이다. 그리고 자바는 아무래도 타이핑해야 할 양이 너무 많아서 오타 교정하다가 힘 다 빠진다.
Python이 본인 스타일과 안 맞으면 Ruby로 시작해도 좋다. C언어로 언젠간 전향해야 하는 사람이라면 Go언어가 좋다. 두 언어가 성질이 매우 비슷하기 때문이다. 하지만 C++은 절대 시작 언어로 선택해선 안 된다! 학교에서 1학년 객체 지향 프로그래밍 과목으로 C++을 강요해서 어쩔 수 없이 배우는 경우가 많지만 C++언어는 현대에 쓰이는 수많은 프로그래밍 언어 중 코딩 난이도가 최상위권에 있다. 어셈블리어와 자웅을 겨룰 정도. 동의를 못 하겠다면 C++의 iostream 헤더 파일을 열어봐라. 코드를 암호화해놓은 것 같겠지만 그거 분명히 C++코드다. 그 다음에 Go언어 컴파일러 소스 코드를 열어보면 코딩 난이도의 차이가 확 느껴질 것이다. 세상에서 가장 복잡한 프로그램이라는 컴파일러의 Go 언어 버전하고, 그냥 단순히 데이터 입출력만을 처리하는 iostream 헤더 코드(소스 코드도 아니고 그냥 선언문)의 C++ 언어 버전의 코드 가독성 차이는 넘사벽이라는 말로도 표현을 못 할 정도로 크다.
파이썬을 어느 정도 익히고 대강 구구클래스 구구단 프로그램 정도는 스스로 만들 줄 알게 됐으면 이제 컴퓨터공학 기초를 닦기 시작한다. 바로 자료구조와 알고리즘을 공부하란 소리다. 컴퓨터공학 대학교 과정 1학년때 가르치는 그 과목 맞다. 자료구조와 알고리즘을 제대로 공부하지 못하면 평생 양산형 개발자(코더)로 남을 수밖에 없다. 그런데 사실 자료구조와 알고리즘을 마스터 하게 된다면 프로그래머의 최정점에 서게 되는 셈이므로, 마스터할때까지 공부하려고 할 것 까지는 없고, 기본적인 정렬 알고리즘이나 탐색 알고리즘, 다익스트라 알고리즘 등 대학 1학년 과정의 기초 알고리즘까지 익히고, 다음 단계로 넘어가도 된다.
다음으로 이제 자신이 어떤 분야에서 활동하고 싶은가에 따라서, 사용할 언어를 선택해서 공부하면 된다.. 웹 프로그래머라면 보통 자바스크립트를 주력으로 삼게 될 테고, 시스템 프로그래머라면 보통 C++언어를 주력으로 삼게 될 것이다. 각 분야마다 선호가 되는 언어는 각각 다르다. 해당 언어와 함께 구글검색을 연습하면 좋다. 정말 어지간한 질문은 구글에 검색하면 답이 다 나오기 때문이다. 그냥 에러메시지를 긁어다 구글 검색창에 붙여넣기만 해도 스택오버플로우 사이트에 해법 올라온 걸 검색할 수 있다.[8] 한편 네이버의 경우에는 안타깝게도 구글과 달리 반대로 어지간한 질문에도 의미없는 답변만 줄줄 달려 있는 것을 확인할 수 있을 것이다. 이제부터 영어를 열심히 공부해야 한다. 하지만 생활영어가 아니라 공학영어이므로 토익 점수하고는 별 관계가 없고, 그냥 소스코드를 읽을 수 있는 정도의 영어실력이면 충분하다. 사실 공학영어만 필요하면 따로 영어학원에 등록해서 수강할 필요까지는 없고 그냥 영어사전만 끼고 있어도 충분하다. 즉 영어때문에 걱정할 일은 아니라는 말씀!
프로그램 언어는 프로그래머의 도구일 뿐이지만, 각 언어마다 장단점이 있고[9], 시장의 수요에 따라 특정 언어를 할줄알면 몸값이 올라가는 경우[10]가 있기 때문에 다양한 언어를 다룰 줄 아는 것이 여러가지로 좋고 또 중요하다.
어느 정도 실전에 사용할 만한 코드를 짤 수 있게 되었다면, 이제부터는 슬슬 고급 기술을 연마할 차례다. 각 언어마다 디자인 패턴이라는 일종의 설계 지침서가 있는데, 이런 패턴들을 학습하고 전문용어를 익혀 고급 개발자와의 커뮤니케이션(쉽게 말해 의사소통)이 원활해지도록 노력해야 한다. 틈나는 대로 다른 언어들도 공부하는 것이 좋다. 달랑 한 두개의 언어만 붙잡고 있으면, 그리고 그 외의 언어에 대한 지식습득을 외면한다면 어느 순간 도태될 수도 있다. 현실의 외국어와 달리 프로그래밍 언어는 문법이나 용어들이 다 비슷비슷하므로 습득하는데 큰 노력이 들지 않는다. 다른 언어들까지 잘 사용할 능력을 갖출 필요까지는 없고, 그냥 간단한 프로그램 만들 정도만 익히면 충분하다. 나중에 그 언어를 주력으로 사용하게 될 때, 나머지 상세한 부분을 공부해도 늦지 않다.
디자인 패턴까지 공부했는가? 그러면 축하한다. 당신은 이미 프로그래머다. 이제 GitHub라는 프로그래머의 성지로 성지순례를 떠나자. 거기서 깨달음을 얻고 자신의 나아갈 길을 발견할 수 있을 것이다.
여기까지 왔는가? 그럼 이제부터 여러분은 스스로 나아갈 수 있을 것이다. 참고로 리눅스를 가까이하고 윈도우를 멀리하면 프로그래머로서의 삶이 좀 더 편해진다. 근데 단점으로 일상생활이 몹시 불편해지기 때문에 아니야 코딩덕후는 리눅스가 더 편하다구프로그래머가 되고자 한다면 그냥 컴퓨터 두 대를 사서 각각 윈도우와 리눅스를 깔아놓는 걸 추천한다. 버츄얼박스 같은 가상화는 추천하지 않는다. 리눅스 호스트에 윈도우를 버츄얼로 띄우면 게임 따윈 꿈도 꿀 수 없고 윈도우 호스트에 리눅스를 버츄얼로 띄우면 하드웨어 접근 제한 때문에 엄한 데서 삽질을 할 수 있다. 물론 초보 프로그래머가 하드웨어를 컨트롤할 일은 거의 없으니 윈도우 호스트에 리눅스 버츄얼 정도는 중급 프로그래머가 되기 전까지는 괜찮다. 듀얼부팅? 하지마라. 장담하건데 듀얼부팅 환경을 꾸며놓으면 얼마 안가서 리눅스는 절대 안 쓰고 윈도우만 쓰게 된다. 물론 윈도우 환경에서 사용할 수 있는 끝판왕급 개발 도구인 비주얼 스튜디오라는 게 있긴 하다. 그럼에도 불구하고 리눅스를 추천하는 이유는 리눅스쪽이 CLI환경 기준이라 답변 달리는 게 커맨드 명령 같은 간단한 거라 답변의 양에서 압도적이기 때문. 게임 프로그래머가 되고 싶은 사람도 주력 개발은 윈도우에서 할지언정 일단 리눅스 환경은 경험해보는 게 좋다. 편리한 줄 모르면 불편한 줄도 모른다.
컴퓨터 두 대 사는 게 아무래도 부담이 되면, 리눅스용 컴퓨터는 본체만 어디 재활용센터나 중고시장 같은데서 주워오고, 거기에 서버용 리눅스를 깐 뒤에 SSH(PuTTY등)로 원격 접속해서 사용하는 방법을 추천한다. 10만원 정도면 PC방에서 배출되는 중고컴 정도는 구입할 수 있다. 운 좋으면 아파트 쓰레기장에서 공짜로 주워올 수도 있다. 전기료는 하루종일 켜놓는 게 아닌 한에야 별로 차이 안 난다. 리눅스컴도 전기먹을만한 작업을 안 하고 윈도우컴도 전기먹을만한 작업을 안 하니까. 게임 하나 돌리고 있는 컴퓨터가 저거 두 대분보다 더 많은 전기를 소모한다.
아예 공짜를 원하나? 좋은 방법이 있다. 아마존 웹 서비스를 사용하는 것이다. EC2인스턴스의 t2.micro 인스턴스는 가입 후 1년간 무료로 사용할 수 있다. 1년 지나면 계정을 지우고 다른 신용카드를 붙이는 방법으로 계속 사용할 수도 있다.[11] micro인스턴스라도 어지간한 프로그램은 충분히 컴파일할 수 있다. 심지어 웹 서버에 데이터베이스 서버를 덕지덕지 붙여도 혼자 쓸 목적으로는 충분한 성능을 낸다. 돈 내고 쓰겠다고 해도 예약인스턴스를 구매하면 t2.nano급(가장 싼 인스턴스)의 1년 자유이용권(All upfront) 가격이 40달러 선이다.
본인이 덜렁이 기질이 있거나 보안의 '보'자도 모르는 생초보라면 아마존 웹 서비스는 사용해서는 안된다. 위의 각주에도 언급돼있지만 앗 하는 사이에 돈십만원 빠져나가는 건 우습다. 이건 후불요금이기 때문에 환불도 안 된다. 보안을 철저히 챙길 자신이 없다면 클라우드 컴퓨팅에는 손대지 말자.
그리고 중수 이상의 프로그래머라면 가급적 초고해상도 모니터와 좋은 키보드를 갖추는 것이 권장된다. 왜냐하면 하나의 화면에 몇 줄의 코드가 보여지는지가 생산성에 많은 영향을 미치기 때문이다. 그리고 모니터에 뚫어지게 쳐다보는 특성상 시력이 안좋아지다보니 폰트는 가급적으로 키우는데 모니터 사이즈가 받쳐줘야 하기 때문. 키보드를 쳐야 하는 일이 아주 많으니 기계식 키보드와 같은 고급품을 구입해서 쓰는 것이 좋다. 전문가에겐 전문적인 장비가 필요한 법이다. 대신 그래픽 카드나 CPU같은 건 좀 하급이어도 큰 문제가 되지 않는다. 개발할 때 본체 쪽 스펙은 좀 떨어져도 상관없다. 고급 프로그래머가 되면 빌드 머신을 따로 구성할 정도로 전문적으로 작업하게 되겠지만, 이미 거기까지 도달한 프로그래머는 자신에게 필요한 환경이 무엇인지 잘 알고 있을 것이다.
4.1. 학위(대학 졸업장 등) 필요여부
흔히 프로그래머에게는 학력이 중요하지 않다고, 심지어 대학 교육이 반드시 요구되는 분야가 아니라고들 말을 한다. 사실 결코 틀린 말은 아니다. 고가의 실험실습 도구가 필요한 다른 분야와는 다르게 프로그래머에게는 오직 달랑 컴퓨터 한 대만 있으면 충분하고, 필요한 관련 지식에 대한 정보는 인터넷의 정보 바다에 흘러 넘치기 때문이다. 게을러서, 즉 자기가 안 찾아봐서 관련 지식 및 정보를 모르는 경우는 있어도, 찾을 수가 없어서 관련 지식 및 정보를 모르는 경우는 극히 드물다고 할 수 있다. 또한 수준 높은 프로그래머를 희망하는 것이 아닌이상, 즉 양산형 프로그래머(코더) 정도가 되기를 원하는 이상 대학 외의 사교육기관, 즉 학원에서도 얼마든지 관련 공부를 할 수 있다. 심지어 마음만 먹으면 혼자서도 공부해서 될 수 있는 것이 프로그래머이다. 그러나, 학위가 필요하지 않다는 말이, 즉 대학 졸업장이나 대학교육이 반드시 필요한 것이 아니라는 말이 실력이 중요하지 않은 직업이라는 이야기는 아니다. 말인 즉슨 학력 = 실력이 아니다일 뿐이다.
사실 대학에서 배우는 내용들은 추상적인 것들이 많아서[12] 나중에 일선 필드 현장, 즉 직업전선으로 뛰어들었을 때 거기서 하게 되는 프로그래밍과 아예 직접적 관련이 없는 내용들도 많이 있고, 관련이 있는 내용이라고 하더라도 그것들을 필드에서 실전에 녹이는 것은 힘든 경우가 꽤 많다. 사실 대학에서 일반적인 기업의 일반적인 코딩실무에 필요한 능력만 추려서 가르친다면, 그 분량 및 학업에 필요한 시간은 그다지 많지가 않다. 그렇기때문에, 사실 정말 고급지식을 필요로 하는 분야[13]가 아닐 경우에는 대학이 오히려 시간낭비가 될 수도 있다.
그러나 고급 소프트웨어 엔지니어가 되기 위해서는 말이 조금 달라진다. 일단 고급 엔지니어가 되기 위해서 대학 졸업장이 반드시 필요한 것은 아니다. 여전히 졸업장보다 지식이 중요한 것은 마찬가지. 그러나 아이러니하게도 이 경우 좋은 대학이 매우 중요하다. 고급 지식을 배울 수 있는 곳이 좋은 대학 뿐이기 때문.
널리 알려진 사실이지만 한국의 컴퓨터공학/소프트웨어과는 구조적인 문제로 커리큘럼이 낙후되어 있다. 컴퓨터공학과를 진학하게 되는 이유가 이론적 배경을 위해서임을 고려하면 이는 졸업자의 경쟁력에 심각한 마이너스 요소가 된다. 말할 것도 없지만, 미국의 스탠포드나 MIT와 비교했을 때 한국 대학의 커리큘럼을 모두 성실히 따라간다고 해도 기대되는 아웃풋은 처참할 지경. [14] 그나마 세계 랭킹 50위권인 서울대학교나 KAIST에서나 미국의 제대로 된 탄탄한 커리큘럼에 그렇게 많이 꿇리지 않는 교육을 받을 수 있다. 문제는 이 지식이 없으면 고급 엔지니어가 되는데 엄청나게 큰 지장이 있다는 것이다. 이런 지식[15] 은 단순 코더로서 실무 경험을 쌓는다고 해서 배울 수 있는 것도 아니며, [16] 사이버대학 등의 접근성이 높은 대학교에서 깊이있게 배울 수도 없으며 Coursera 등에서도 이런 고급 강좌는 거의 제공해주지 않는다.
대학원 또한 마찬가지. 애초에 중요한 건 대학원을 나왔느냐가 아니라 어떤 대학원에서 어떤 수준의 교육을 받고 어떤 퀄리티의 논문을 냈느냐라는 것을 상기하자. [17] 현실적으로 낙후된 대학 환경에서 그나마 제대로 된 실력을 쌓을 수 있는 대학은 한국에 두세개 뿐이고, 이런 대학원은 들어가기가 상당히 어렵다. [18] 결국 현실적인 문제로 고급 엔지니어가 되고자 한다면 실력이 중요한 IT 분야에서도 굉장히 좋은 교육을 받아야 하기 때문에 좋은 대학을 가는 것은 거의 필수적이다. [19] 만약 자신이 외국 대기업 진출을 노리는 등 고급 엔지니어만이 할 수 있는 일을 하고 싶다면 일단 좋은 대학을 가고 보는 것[20]을 강력하게 추천한다. 인맥, 다양한 기회 등은 덤.
대기업에 입사하고자 할때는 대학 졸업장이 당연히 필요하고[21], 괜찮은 중견기업에 지원할 때도 필요하다[22]. 설사 SI이나 SM 업무를 하더라도 "갑"에서는 개발자의 학력이나 학벌을 중요시 여기기도 한다. 그리고 대학교 졸업장 없이는 실력이 뛰어나더라도 상대적으로 설계 경험을 접해보기 힘든 경향이 있다. 사실 학력과 실력은 반드시 일치하는 것도 아니고, 이 분야 특성상 학력과 실력이 무관한 경우도 매우 많지만, 이 분야 특성을 잘 모르는 일반인들로서는 사회 통념상 학력이 없으면, '저 사람은 대학도 나오지 않았는데, 당연히 실력도 없을 거야~' 라는 식으로 선입견 내지 편견을 가지기 쉽다. 그래서 그러한 편견을 가진 일반인이 발주를 하는 갑의 위치에 있다면, 실력을 보지도 않고 쉽게 무시하기 일쑤이다. 하여간 한국에서 사회생활 하려면 대학은 나와야 한다 미국도 프로그래머로 취업하려면 보통 대학을 졸업해야 하고, 구글 오라클 등의 대기업에 취업하려면 좋은 학교 출신이 아무래도 유리하다.
아랫 글(4.3.필요한 능력)을 보면 알겠지만, 그 획기적인 알고리즘을 만들어낸다는 교수들이 바로 박사들이다. 또, 알게 모르게 석사학위도 꽤 쳐준다. 구글 검색엔진에 사용된 알고리즘을 고안해낸 래리 페이지가 바로 석사다[즉, 단순히 시간/공간적 절약만 알고리즘의 개선목표가 아니다]. 더붙여, 좋은 지도교수님 밑에서 잘 트레이닝 된 석사가 건성으로 졸업한 박사보다 나을 때도 많다. 끝으로, 교수가 코딩 안하는 이유는 어느정도 급만 되면 코딩할 필요가 없는 것도 있는 한편, 박사과정 학생들이 가져다 주는 획기적인 알고리즘이 타당한지 검증하고 논문 검토하는 데도 바쁘기 때문이기도 하다. 그 와중에 애들도 가르치고, 연구도 따와야 하고, 학내 정치도 해야 되지 않는가.
결론은 대학원 안갈거면 혼자 해도 된다. 그리고, 학산데 박사급으로 머리가 돌아가는 프로그래머도 정말 간혹이긴 하지만 있긴 하다. 획기적인 알고리즘도 만들어 내고 그걸 최적화된 코드로 옮기면서, 설계도 정말 잘된 프로그램을 만드는 그야말로 슈퍼프로그래머 랄까? 예를 들어 리누즈 토발즈는 학부 졸업하기도 전에 이미 운영체제를 개발했다. 그럼에도 불구하고 석사학위를 받았다는건 덤이다.
4.2. 난 고수가 되고 싶어요
위에서 설명한 GitHub만 잘 돌아다니면서 쓸만한 정보들을 캐치하고, "stackoverflow"사이트만 잘 이용하더라도 혼자 힘으로도 고수가 될 수 있다. 그렇지만 독학 학습 과정에서 일종의 종교적 신념(?) 같은 것들이 생겨나, 중수에 머무르는 프로그래머도 상당히 많다. 예를 들어 C++ 언어가 만능 언어라는 신념 등. 만능 언어가 맞긴 맞는데 만능기판과 PCB의 차이와 같은 것이다. 만능기판이 만능이긴 하지. 그런데 왜 사람들은 PCB를 굳이 제조해서 쓸까? 한 번 잘 생각해보기 바란다. 이러한 자신만의 독단적 신념에 빠져드는 것을 방지하고 예방하기 위해서는 전 세계 개발자의 트렌드를 예의주시하고 있어야 한다. 물론, 트렌드를 지속적으로 팔로우하는 건 어렵다. 연예인들이 트렌드를 팔로우하는 어려움 만큼이나 어렵다. 라이브러리나 프레임워크를 뺀 순수 '언어'들만 해도 200여 종이 넘는다. 요즘에 안 쓰는 언어들은 제외한다고 해도 대략 50여 종의 언어가 남는데, 그 중에서 다음 프로젝트에 무슨 언어가 쓰일 지는 확정지을 수 없다.[23] '나는 게임 개발자니까 다음에도 당연히 C++이겠지?' 했다가 갑자기 파이썬 스크립트 뭉치가 툭 던져질 수도 있는 동네가 이 동네다. 당장 아이폰 앱 쪽을 봐라. '오브젝티브-C만으로도 충분하겠지?' 했는데, 어느날 갑자기 애플에서 Swift를 발표하지 않았는가...
그러므로 진정 고수가 되고 싶다면 한 언어만을 맹신하지 말고 다른 언어를 접해보자. 대표적으로 Go언어는 C언어가 할 수 있는 일은 죄다 할 수 있으면서도, 컴파일이 빠르고 코딩은 쉽다.[24] Python은 C보다 할 수 있는 일들이 적지만, 워낙 쓰기 편한 까닭에 주류 언어의 지위를 차지하고 있다. Erlang이란 언어는 원래 통신장비에 들어갈 목적으로 설계된 언어인 탓에 동시접속자가 폭주해도 굳건히 버텨낸다.[25]
한번 예를 들어보자. Java라는 한 우물만 계속해서 파게 될 경우, 처음엔 날코딩에서 시작해 IDE를 쓰게 되고, 써드파티 라이브러리를 사용하다가 스프링 프레임워크라는 것이 있다는 걸 알게 되고, 프레임워크의 유연성에 감동의 눈물을 흘리다가, 그 프레임워크를 만든 근간 기술인 디자인 패턴에 대해 공부하게 되고... 그렇게 차츰 자기도 모르게 고급 프로그래머가 되어 간다. 그렇다. 이렇게 한 우물만 파더라도 고연봉을 받을 수는 있다. 왜냐하면 아직도 자바는 프로그래밍 언어 인기순위 2이기 때문이다.[26] 하지만 그놈의 학습량이 문제다. 위에서 트렌드를 지속적으로 팔로우해야 한다고 했는데, 자바 쪽의 트렌드는 따라가려면 읽을 양이 엄청나게 많다. 그래서 다른 것에 한눈 팔 여유가 없다. 그런데 현재 자바 언어는 입지가 상당히 위험한 상태다. 구글과 오라클 간에 소송도 걸려 있고, 다른 경쟁 언어들이 더 강력하고 편리한 신기술로 무장하고 있는데다가, 언어 스펙의 발전이 오랜 기간 정체해 있었다. 코볼언어가 그랬듯 금융권이라는 보수적인 곳에서 자바를 쓰기 때문에 하루 아침에 몰락하고 그러진 않겠지만 일자리 자체가 줄어들어 취업문이 좁아지는 건 어쩔 수 없다. 그런데 최신 트렌드에 민감하게 반응하고 있었다면, 스프링 프레임워크를 접할 때 즈음엔 함수형 언어라는 게 있다는 사실을 어떻게든 주워들을 확률이 높다. "내 사랑 자바를 왜 까고 그래요?" 하고 대들면 뭔 일급 객체니, 클로저니... 하면서 사람을 열받게 하는데 당장 자리로 돌아가서 구글신에게 물어보면 뭔가 심상치 않은 분위기를 느낄 것이다. 그리고 10분 뒤, 당신은 멘붕을 경험할 것이다. "인터페이스가 불필요하다니!" 거기서 끝나지 않는다. 메서드 체이닝과 고차 함수 개념을 접하고 나면 객체를 상속하듯이 행동을 확장할 수 있는 함수형 언어의 설계 패러다임을 접하고 문화충격과 더불어 뇌 개조를 당하게 된다. 객체지향이 세상의 진리인 줄 믿었건만 또 다른 세계가 존재했던 것. 그리고 멀티스레드는 금단의 사과 같은 테크닉이라고 믿었던 자신에게 스레드가 다다익선이라고 가르치는 GPGPU세계도 잠시 스쳐지나갈 수 있다. 리턴값을 두 개 세 개 막 넘길 수 있는 Python과 Go를 보고, 숫자에 메소드를 붙이고 문자열 자체를 메소드명으로 해석해서 실행시키는 괴랄한 테크닉이 가능한 Ruby를 보고[27], 심지어 같은 자바가상머신을 사용하는데도 유연성이 훨씬 뛰어난 Scala와 Groovy를 접해보게 된다. 그런 세계여행(?)을 하고 돌아와서도 순수주의자처럼 자바 하나만으로 코딩하고 싶지는 않을 것이다. 심지어 남들이 헷갈리니까 언어는 하나로 통일하라고 말해도 싫을 것이다.
저 과정 전체에 대한 퀵 투어를 원하는가? 프로그래밍 언어/코드 예제항목에 가 보자. "Hello, World!"는 그렇다치고 그 아래쪽 것들을 구경해볼것. 열 줄짜리 구구단 출력 자바 코드가 Ruby언어에 가면 어디까지 줄어드는지 한 번 보자.
위에서 자바를 너무 심하게 깠는데, 사실 C++프로그래머가 자바 세계로 넘어와도 비슷한 문화충격을 받을 수 있다. '아니 왜 포인터가 없지? 그러고도 프로그램이 돌아가나?', 'new는 있고 delete가 없다니, 코딩 개판이네', '연산자 오버로딩이 안돼? 다중상속도 안돼? 성능도 느리다고? 머신제어도 불가능? 장난감이구만...' 하고 있다가 크게 데이는 경우도 더러 있다. 또는 웹 개발자이긴 한데 IoT 디바이스 분야라서 PHP를 아두이노와 통신시키려고 별의 별 모듈을 덕지덕지 붙이다가 그냥 C언어를 이용하여 함수 호출 한 개로 끝내버리게 되는는 신나게 빡도는 경험도 할 수 있다. 하지만 다른 분야를 안 보고 있었다면, 일하는 내내 빡쳐있겠지 인과응보다. 뭐 그러다 최정점에 서게 되면 이거고 저거고 다 비슷해 보이게 된다는 언어의 한계를 돌파해 버리기 때문에(...) 무슨 언어를 쓰든 거기서 거기처럼 느껴질 수도 있겠지만 이 경지까지 가면 스스로 컴파일러를 제작해서 사용할 정도의 초월자가 되어있을 것이라 논외.(...)
4.3. 필요한 능력

야근력
코더든 아니든 간에 일단 프로그래머라고 자부하려면, 최소한 (아주 기초적인 수준이더라도) 여러가지 프로그래밍 언어를 구사할줄 알아야 하며, 직종에 따라 다양한 툴과 엔진을 다룰 줄 알아야 한다. 한편 직접 툴을 다루진 않지만 데이터베이스, 알고리즘, 자료 구조간의 관계/구조를 설계하는 사람을 소프트웨어 설계자(아키텍트)라고 구분하여 부르기도 하는데, 아키텍트는 당연히 관련 분야 지식을 알아야 한다. 아무튼 직종에 따라 차이가 있다곤 해도, 뛰어난 프로그래머가 되기 위해 배워야 할 것은 일일이 설명하기 어려울 정도로 무척이나 많다. 그 중에는 프로그래밍 자체에 대한 흥미 및 이 분야의 트렌드를 지속적으로 팔로우하는 능력 및 꾸준한 공부습관도 포함되어 있는데, 이에 대해 부연설명하면 다음과 같다.
내가 하면 프로그래머요, 남이 하면 코더[28]라고 부르기도 할 정도로, 진입장벽이 낮아졌지만, 진입장벽이 낮다고 해서 결코 '쉬운' 직업[29]은 아니다. 툴은 점점 쉬워지고 있지만 그런 툴 자체가 워낙 많이 쏟아지고 있어서 프로그래머는 그 수많은 툴 중에 '선택'을 해야 한다. 라이브러리간 궁합도 따져봐야 되고 개발이 계속 되고 있는지, 얼마나 많은 유저가 쓰고 있는지, 그리고 검증되었는지 여부 등을 다 따져봐야 하게 된 것이다 (그리고 마지막엔 GPL때문에 리젝되겠지...). 1970년대에는 닥치고 C언어를 쓸 수 있었겠지만, 2015년 현재 그렇게 생각없이 도구를 골랐다간 망하기 일쑤다. 고민을 하는 동안에도 세계 어딘가에서는 새로운 툴이 만들어져 발표되고 있고 기존 툴이 대대적인 업그레이드를 해서 원래 후보 탈락이었는데 재검토가 불가피해지는 경우도 발생한다. 정말 안습인 건 1년동안 고생해서 프로그램 하나를 제작했는데 다른 회사에서 신기술을 도입한 더 좋은 프로그램을 일주일만에 출시해버리는 경우도 발생한다. 툴 선택이 잘못돼서 생산성이 떨어진 상태로 작업하는 게 어떤 참사를 불러오는지의 가장 극단적인 사례.
그래서 타 분야에 비해 꾸준히 관련 분야 지식을 공부해야 하는 자세가 요구된다. IT쪽 뉴스에 뭐가 뜨면 최소한 자기 분야는 죄다 챙겨봐야 하니까 말이다. 덕분에 학원출신이라도 이후 독학으로 대학출신을 능가하는것도 가능하며, 대학에서 우수하였더라도 졸업 이후에 자기 분야 지식에 대한 체크를 게을리 한다면, 양산형 프로그래머 수준으로 떨어지는것도 매우 쉽다. 특히나 IT 분야는 발전속도가 매우 빠른 분야이기때문에 공부를 그만두면 순식간에 뒤쳐질수 밖에 없다. 따라서 프로그래머라는 직업을 그만두는 때까지 공부를 게을리 해서는 안된다. 그러므로 어떻게 보면 사실 프로그래머에게 필요한 가장 중요한 적성은 뜬구름 같은 얘기이기도 하지만, 프로그래밍 그 자체에 대한 흥미라고 할 수 있다. 흥미가 있는 사람이라면 누가 시키지 않아도 직접 찾아서 새로운 기술과 관련 정보를 습득할테고, 누가 강요하지 않아도 알아서 공부할 것이기 때문이다. 그와 달리 학교에서처럼 시험같은 것으로 강요하는 사람이 없을 경우 스스로 공부를 하지 않는 케이스라면, 학교를 졸업하고 난 이후에는 공부에 소홀 할수 밖에 없을 것이고, 그렇게 되면 다른 사람들에 비해 실력이 뒤쳐질 수 밖에 없을 것이다.
대부분의 대학교 컴퓨공학과 교수들이 본인은 절대 코딩 안 하는 이유가 다른 게 아니라 이 트렌드를 못 따라가서다. 연구분야가 툴 그자체에 있는 게 아닌 한에야 교수들이 툴에 관심가져야 할 이유도 없고. 다른 분야 교수들(기계과 등)이 대학원생과 일대일 맞다이를 떠도 꿇릴 게 없는 반면 컴공과 교수들이 프로젝트 하나를 추진하려면 대학원생이 반드시 몇 명씩 필요한 이유도 이것 때문이다. 물론 코딩덕후출신 교수들도 있긴 한데 전체적인 모양새가 그렇다는 것이다. 컴공과 교수들이 무능하다는 얘기가 아니다. 이들이 이 문서 맨 위에 서술한 바로 그 거창한 알고리즘 연구가들이다. 일반 프로그래머들이 코드 실행 속도를 0.1초, 0.001초를 줄이는 데 진땀빼는 동안 이들 교수들은 그 시간을 절반, 10분의 1하는 식으로 뭉텅이로 줄여버리는 연구를 한다. 공학자라기보다는 수학자에 가깝고 그래서 실세계의 프로그래밍 언어보단 의사 코드를 더 자주 사용한다.
구체적인 예시를 들자면, 일반 프로그래머들은 루프 수행 최적화, 호출 최적화, 인트린식 적용 같은 기법들을 동원해 코드의 수행속도를 빠르게 하려고 한다. 하지만 그렇게 애써서 빠르게 만들고 있는 알고리즘 그 자체가 선택 정렬인 셈이다. 교수들은 아예 정렬 속도의 차원이 다른 퀵 정렬을 연구해서 논문에 발표한다. 해당 교수의 연구실에 있는 대학원생은 이 교수가 개발한 알고리즘(의사 코드)를 실제 수행 가능한 프로그램으로 바꾸는 코더 역할을 수행한다. 비록 이들 대학원생은 효율성이 매우 떨어지는 발적화 코드를 생성하겠지만 알고리즘 자체가 차원이 다르게 빠르기 때문에 선택 정렬보다 압도적으로 빠르게 된다. 그리고 이 알고리즘이 현장의 프로그래머들에게 알려지고, 프로그래머는 새로운 알고리즘을 자신들이 알고 있는 방법으로 최적화한다. 그런 식으로 IT산업이 발전해 나가는 것이다. 교수들이 코딩 못하는 게 무능한 게 아니란 소리다. 심지어 컴공과 교수가 컴맹일 수도 있다. 컴맹도 알고리즘 연구하는데는 별 지장이 없다. 다른 분야로 예시를 들자면 현장의 엔지니어들이 엔진의 초반 가속력을 높이려고 슈퍼차져를 달고 기어비를 조정하고 타이어를 재설계하는 고생을 하는 동안 교수들은 모터구동식 전기자동차를 연구하고 있다고 볼 수 있다.[30] 또 다른 분야로 철도 분야를 예시로 들면 고속열차를 만들려고 차륜과 레일의 점착력을 확보하고 에어로다이나믹을 적용하고 동력분산식 설계를 적용하는 등의 고생을 하는 동안 아예 바퀴를 없애버린 자기부상열차를 연구하고 있다고 볼 수 있다. 또한, 컴퓨터 분야의 발전과 변화가 엄청나게 빠르기 때문에 어제의 상식이 구시대의 유물로 변하는 것은 금방이다. 이를 계속 따라잡으려면 새로운 지식을 받아들이는 것을 게을리해서는 안 되고, 그렇지 못하면 도태될 수밖에 없기에 프로그래머라는 직업을 계속하기 위해서는 많은 노력이 필요하다.
이렇게 트렌트 파악 및 꾸준한 공부가 필요한 분야이기 때문에 한편으로 프로그래머집단은 동종업계 종사자들 사이에서 지식 공유가 활발한 분야이기도 하다. 예를 들어, 위키위키는 프로그래밍에 쓰는 패턴들을 정리하기 위해서 처음 탄생했다. 또한, 모르는 사람들이 모여서 상업적인 목적으로 만든 것보다 쓸만한 물건을 만들어 내는 오픈 소스 프로젝트는 활발한 지식 공유 없이는 유지될 수가 없다.
한편 양산형 프로그래머, 즉 코더가 아니라 제대로 된 프로그래머가 되고 싶다면 영어로 된 기술언어 정도는 읽고 쓸 수 있을 능력을 만들어둘 것을 추천한다. 컴퓨터는 미국에서 만들었고 현재 미국이 리드하고 있지 한국어로는 프로그램을 짤 수 없다!!![31] 그렇지만 본인이 영어 못한다고 좌절하지는 말자. 영어에도 분야에 따라 난이도라는 게 있다. 외교관영어가 최상급 난이도라고 가정하면, 기술자 영어는 생활영어보다도 더 아랫급인 아주(!) 쉬운 영어다. 어휘 자체가 공학영어는 생활영어보다 훨씬 적고, 3형식을 넘어가는 문장은 거의 쓰이지 않으며 에둘러 표현하는 것 따위는 절대 없다. 또한 문장에 애매모호함 따위는 없고 거의 모든 문장의 의미가 명확하다. 일반인이 들었을 때 왈도체스러운 영어를 구사하게 되니까 거기서 만족하면 곤란하지만 어쨌든 같은 기술자끼리는 말이 통한다. 정 안통하면 코드로 대화할 수도 있다. 이러한 외국어 독해 능력은 특별이 프로그래머라고 해서 해야 하는 어쩔 수 없는 일은 아니고, 다른 분야도 마찬가지다 해당 분야에 있어 가장 앞서가고 있는 국가의 언어를 습득하는 것은, 해당 분야에서 한발 앞서 나갈 수 있는 너무도 당연한 지름길 인것이다. 예를 들어 철학을 공부하려고 하는 사람은 독일어를 공부하는 것이 자신의 분야에서 앞서나가기 위한 필수코스이며, 한의학을 공부하면 한문을 공부해야 하는 것처럼, 보편적인 다른 분야와 마찬가지로 현재 컴퓨터 분야를 리드하고 있는 나라(미국)의 언어인 영어 를 공부한다면 해당 분야에서 앞서 나간는데 있어서 유리한 것은 너무나 당연한 것이다.
5. 이 속성을 가진 캐릭터
• 나루사와 카즈마 - 탐정학원Q
• 미스터 A - 비밀결사 매의발톱단 THE MOVIE- 나를 사랑한 흑우롱차
• 아이바 아사기 - 스트라이크 더 블러드
• 아카기 리츠코 - 신세기 에반게리온
• 아카사카 류노스케 - 사쿠라장의 애완 그녀
• 오오이시 이즈미 - 아이돌 마스터 신데렐라 걸즈
• 오카 타카오 - 역전재판 시리즈
• 웨일런 파크 - 아웃라스트
• 쿠나기사 토모 - 헛소리 시리즈
• 후지사키 치히로 - 단간론파 시리즈
• 나가토 유키 - 스즈미야 하루히 시리즈
6. 유사 용어
• 개발자
• 코딩덕후

1. [1] 잉여력이 넘치는 디시에서는 프로그램을 짜 도둑맞은 갤럭시탭을 되찾은 사람도 있었다.#
2. [2] 대학 말고 이렇게 깊이 가르치는 곳이 없기때문.
3. [3] 그냥 복붙하면 당연히 에러난다. 문맥에 맞게 코드를 수정할 수 있어야 한다. 그조차도 못하면 코더도 아니고 그냥 잉여다.
4. [4] 기반 프로그램. 운영체제(OS)나 카카오톡과 같이 여러가지 프로그램들이 작동하는 데 있어 기반이 되는 프로그램을 뜻한다.
5. [5] 윈도우 프로그래밍을 해 본 사람이라면 MFC가 떠오를 것이다
6. [6] 실제로 일일이 다 개발하는 데 드는 시간이 모두 절약되며, 코더 및 소프트웨어 개발자들에게 있어 시간은 곧 돈과 연결되기 때문이다.
7. [7] 다만 이건 '프로그래밍'이라는 관점에서 Python을 먼저 배우는게 좋다는 이야기이지, 컴퓨터공학을 배울때 Python으로 입문하는게 짱이다는 이야기는 아니다. 컴퓨터공학 커리큘럼에서 C를 먼저 배우는 이유는, 하드웨어 제어 등 전체적인 '컴퓨터 공학 개론'에 C가 적합하기 때문이다. 특히 유닉스 시스템 콜은 C를 모르면 학습 자체가 불가능하다. 당장 실생활에서 써먹을만한 프로그래머를 양산하려면 Java와 Python부터 가르치는게 짱이라는건 교수들도 잘 안다.
8. [8] 없으면 직접 질문해도 되지만, 그러기 위해서라도 생활영어 정도는 구사할 줄 알아야 한다.
9. [9] 각 언어들은 각자의 쓰임이 있기때문에 무턱대고 어떤 언어가 좋고 나쁘다를 따지는것은 매우 어리석은 짓이다. 만약 언어들의 절대적인 우열이 존재한다면 프로그래밍 언어는 하나로 통일됐을것이다. 자신의 목적에 따라 적합한 프로그래밍 언어를 선택하는것은 프로그래머의 중요한 능력중 하나이다.
10. [10] 대기업에서 ERP가 유행할때 ABAP 프로그래머나 아이폰 발매 초기 C프로그래머
11. [11] 하지만 종종 과금 상황을 확인해야 한다. 무료 기간이 지나거나 유료 서비스를 모르고 사용했다간 어마어마한 돈이 청구되는 불상사가 발생할 수 있다. 특히 계정이 해킹이라도 당하면 천만원 넘는 돈이 결제되는 수가 있다.
12. [12] 이는, 이를 제대로 배우기 위해서는 반드시 대학원 과정이 필요한데, 학부 과정 중에는 이를 소화할 수 없기 때문이다. 그래서 보통 이 분야가 무엇이다 정도만 배우게 된다.
13. [13] 이런 분야들은 보통 수학능력이 아닌, 수학적 지식이 많이 요구된다. 일반적인 코딩은 사칙연산/이산수학 및 간단한 논리력이 전제되는 수학능력이면 충분하지만, 저런 고급분야들은 분야에 따라 본격적인 대학수학인 해석학부터 시작하여, 확률, 대수, 수리논리, 위상, 기하 등의 지식을 전제하는 경우가 많다. 그래픽스 같이 현실과 밀접한 분야의 경우, 여기에 추가로 대학미적분 및 편미분, 삼각함수, 물리학도 추가한다. 이런분야들은 고졸로는 접근하기가 매우 힘들며, 대학에서도 대학원부터 시작하는 경우가 많다.
14. [14] 오죽하면 웬만한 스펙으론 노려보지도 못하는 N사 등의 대기업에서도 신입 학사 졸업자가 기본기가 없다는 볼멘소리가 나오겠는가?
15. [15] 선형대수학, 확률/통계론, 이산수학, 데이타구조, 알고리즘, 아키텍쳐, 프로그래밍 언어, OS, 오토마타, 시스템 프로그래밍, 네트워크, 소프트웨어 공학, 데이터베이스, 컴퓨터그래픽, 전산논리학, 컴파일러, 계산이론, 정보보호, 인공지능, 인간-컴퓨터 상호작용 등
16. [16] 단순한 코더로서 실무 열심히 한다고 이 지식을 배울 수 있을까? 대학 200번대까지는 어찌저찌 가능할지 모르지만 그 이후는 아인슈타인급 천재가 아닌 이상 불가능에 가깝다. 벽돌공 일을 30년 하면 건축 설계에 대해 모르지는 않게 되겠지만, 그렇다고 고급 건축 설계자가 될 수는 없다는 뜻. 단순한 코더가 아니라 고급 소프트웨어 엔지니어 혹은 아키텍트가 되고 싶다면 방향을 다르게 잡아야 한다.
17. [17] 이것은 학부 또한 마찬가지다. 학부를 나왔느냐가 중요한게 아니라 어떤 교육을 받고 어떤 실력을 쌓았느냐가 중요하다.
18. [18] 그나마 자대생(학부를 해당 대학에서 마친 학생)의 경우도 절반 넘게 학점에서 컷트 당한다. 자대가 아닌 경우 들어가기는 완전히 바늘구멍인데, 인서울 정도에서 이런 대학원을 가려면 과 1위를 해도 떨어지는 경우가 대다수인 상황.
19. [19] 미국의 사정 또한 마찬가지다. 아이비리그 등 최상위권 대학은 한국의 탑3 대학보다도 환경이 좋지만, 조금만 순위가 내려가더라도 수업의 질이 크게 떨어지고, 이는 결국 졸업자의 엄청난 경쟁력 저하로 이어진다. 결국 미국도 상황이 다르지 않다는 말.
20. [20] 좋은 대학을 가려면 수능 공부만 해야 한다고 생각하기 쉬운데, 그렇지도 않다. 수시 전형이 7~80%가 된 상황에서 정보올림피아드나 프로그래밍을 잘 하는 것이 오히려 확률적으로 더 유리하다.
21. [21] 물론 자기가 직접 벤처기업을 창업하는 경우에는 대학졸업장이 필요 없다. 대신 돈이 필요하다.
22. [22] 채용자 입장에서는 그 많은 지원자들의 능력을 일일이 직접적으로 다 테스트해서 체크해 볼 수는 없는 노릇이고, 결국 간접적으로 추정해야 하는데, 거기에 사용되는 자료가 학교 성적을 비롯하여, 학력/학벌 등인 것이다
23. [23] 전문분야 자체를 바꾸는 게 아니라면 대략 3종 내에서 결정되는 편이다.
24. [24] Go언어 설계자 중 한 명이 C언어를 만드신 켄 톰슨 옹이시다.
25. [25] 참고로 Go언어는 Erlang언어의 영향을 받았다.
26. [26] 2015 말부터 C언어의 점유율이 자바보다 떨어져 이제는 1위이다.
27. [27] 파이썬에서도 eval로 지원한다!
28. [28] 코더와 프로그래머를 구분하는 주장은 수도없이 많지만 명확히 정해진건 없다.

'Blog History' 카테고리의 다른 글

개 발 일 지 037  (0) 2019.12.06
개 발 일 지 036  (0) 2019.12.04
개 발 일 지 034  (1) 2019.12.04
개 발 일 지 033  (0) 2019.11.26
개 발 일 지 032  (0) 2019.11.26

!-- 참고해야할 keyword
기업에서 현재 필요한 기술.

직무내용

지원자격

우대사항

* React를 이용한
  웹 클라이언트 개발
- TypeScript 사용
- redux, redux-saga 사용

- 좋아하는 오픈소스 개발자가 있음
- 취미로 개발하는 소프트웨어
  프로젝트가 있음
- 중복되는 것(코드, 반복되는
  일처리, 할당된 메모리 등등)을
  굉장히 싫어함
- 기획자, 동료 개발자와의 원활한
  커뮤니케이션 능력

- Client-side web application 개발 경험
  1) UI library or framework 관련 경험
     (ex. Angular, React, or Vue.js)
  2) Transpiler 사용 경험
     (ex. es6 with babel, TypeScript)
  3) Webpack 등 bundler 사용 경험
- Functional programming, OOP 등의
  주요 프로그래밍 패러다임에 대한 이해
- 유닛 테스트와 CI 경험
- 오픈소스 프로젝트 참여 경험
- 개발 관련 세미나 발표 경험
- 함수나 변수 이름을 며칠에 걸쳐
  열 번쯤 바꿔본 이후에 궁극의 이름을
  찾아내본 경험

- Django와 MySQL을
  이용한 REST API
  서버 개발
- AWS 상의 애플리케이션
  배포, 관리



- Server-side web application 개발 경험
  1) REST API, GraphQL 구현 경험
  2) DevOps 경험
- Functional programming, OOP 등의
  주요 프로그래밍 패러다임에 대한 이해
- 유닛 테스트와 CI 경험
- 기획자, 동료 개발자와의 원활한
  커뮤니케이션 능력
- 오픈소스 프로젝트 참여 경험
- 개발 관련 세미나 발표 경험
- 함수나 변수 이름을 며칠에 걸쳐
  열 번쯤 바꿔본 이후에 궁극의 이름을
  찾아내본 경험

- Java와 Kotlin을 이용한
  안드로이드 앱 개발



- Kotlin 사용 경험
- Functional programming,
  Reactive Programming, OOP 등의
  주요 프로그래밍 패러다임에 대한 이해
- 유닛 테스트와 CI 경험
- 오픈소스 프로젝트 참여 경험
- 개발 관련 세미나 발표 경험
- 함수나 변수 이름을 며칠에 걸쳐
  열 번쯤 바꿔본 이후에 궁극의 이름을
  찾아내본 경험

- Django와 MySQL을
  이용한 REST API 서버
  개발
- AWS 상의 애플리케이션
  배포, 관리



- Server-side web application 개발 경험
  1) REST API, GraphQL 구현 경험
  2) DevOps 경험
- Functional programming,
  Reactive Programming, OOP 등의
  주요 프로그래밍 패러다임에 대한 이해
- 유닛 테스트와 CI 경험
- 오픈소스 프로젝트 참여 경험
- 개발 관련 세미나 발표 경험
- 함수나 변수 이름을 며칠에 걸쳐
  열 번쯤 바꿔본 이후에 궁극의 이름을
  찾아내본 경험

node.js와 MySQL을
  이용한 GraphQL 서버
  개발
- Elasticsearch를 이용한
  검색 기능 개발
- Docker를 이용한
  AWS 상의 애플리케이션
  배포, 관리
Next.js와 GraphQL를
  이용한 웹 클라이언트
  개발



- Server-side web application 개발 경험
  1) REST API, GraphQL 구현 경험
  2) DevOps 경험
- Client-side web application 개발 경험
  1) UI library or framework 관련 경험
     (ex. Angular, React, or Vue.js)
  2) Transpiler 사용 경험
     (ex. es6 with babel, TypeScript)
  3) Webpack 등 bundler 사용 경험
- Functional programming, OOP 등의
  주요 프로그래밍 패러다임에 대한 이해
- 유닛 테스트와 CI 경험
- 오픈소스 프로젝트 참여 경험
- 개발 관련 세미나 발표 경험
- 함수나 변수 이름을 며칠에 걸쳐
  열 번쯤 바꿔본 이후에 궁극의 이름을
  찾아내본 경험

Next.js와 GraphQL를
  이용한 웹 클라이언트
  개발



- Client-side web application 개발 경험
  1) UI library or framework 관련 경험
     (ex. Angular, React, or Vue.js)
  2) Transpiler 사용 경험
    (ex. es6 with babel, TypeScript)
  3) Webpack 등 bundler 사용 경험
- Functional programming, OOP 등의
  주요 프로그래밍 패러다임에 대한 이해
- 유닛 테스트와 CI 경험
- 오픈소스 프로젝트 참여 경험
- 개발 관련 세미나 발표 경험
- 함수나 변수 이름을 며칠에 걸쳐
  열 번쯤 바꿔본 이후에 궁극의 이름을
  찾아내본 경험

node.js와 MySQL을
  이용한 GraphQL 서버
  개발
- Elasticsearch를 이용한
  검색 기능 개발
- Docker를 이용한
  AWS 상의 애플리케이션
  배포, 관리



- Server-side web application 개발 경험
  1) REST API, GraphQL 구현 경험
  2) DevOps 경험
- Functional programming, OOP 등의
  주요 프로그래밍 패러다임에 대한 이해
- 유닛 테스트와 CI 경험
- 오픈소스 프로젝트 참여 경험
- 개발 관련 세미나 발표 경험
- 함수나 변수 이름을 며칠에 걸쳐
  열 번쯤 바꿔본 이후에 궁극의 이름을
  찾아내본 경험



!-- 26일자 SQLite3 도 아직...
2019-11-26 15:05:33.924725+0900 myApp[61036:2471649] [logging] RIGHT and FULL OUTER JOINs are not currently supported


!--Array copy on iOS 13+

copiedList= [[NSMutableArray alloc] initWithArray:sortedArray copyItems:YES ];

copiedList=[[[NSMutableArray alloc] initWithArray:sortedArray copyItems:YES ] retain];

하면... copyWithZone:]: unrecognized selector sent to instance 0x600001c3cff0

copiedList=[NSMutableArray arrayWithArray:sortedArray];

!-- iOS_objc 백버튼 "이전" 으로 통일

- (void)viewDidLoad
{
.
.
.

    UIBarButtonItem *left = [[UIBarButtonItem alloc] initWithTitle:@"이전" style:UIBarButtonItemStyleBordered target:self action:@selector(backTapped)];
    self.navigationItem.backBarButtonItem = left;
}

-(void) backTapped {
        [self.navigationController popViewControllerAnimated:NO];
}

!-- popviewcontller twice

using index

[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:2] animated:YES];




!-- git 몇 개나 커밋 했을까? 

git log --pretty=oneline --abbrev-commit | wc -l

git 커밋 개수

!-- Message from debugger: Terminated due to memory issue

[ServicesDaemonManager] interruptionHandler is called. -[FontServicesDaemonManager connection]_block_invoke



'Blog History' 카테고리의 다른 글

개 발 일 지 036  (0) 2019.12.04
개 발 일 지 035  (0) 2019.12.04
개 발 일 지 033  (0) 2019.11.26
개 발 일 지 032  (0) 2019.11.26
개 발 일 지 031  (0) 2019.11.26

!--

패스트 캠퍼스에서 강의 몇 개를 구입했는데, 해외 사이트에 비해 만족감이 낮다. 이유는 내가 싫어하는 마케팅을 한다.

 

할인해서 구입했더니, https://www.fastcampus.co.kr/event_online_payback/ 페이백 이벤트를 했고,

페이백 이벤트가 끝나니 https://www.fastcampus.co.kr/event_online_zeropad/?utm_source=channelio&utm_medium=banner&utm_campaign=event_online_payback&utm_content=191202

아이패드 포함 이벤트를 한다. 따져보면 빠른 사람이 더 이익인 것은 맞는데. 나 같은 경우 강의를 2개 구입했기 때문에 6만원 정도 손해다. 해외 사이트에서 얻은 내용과 다르다면 6만원이 아니라 600만원도 아깝지 않을텐데 거의 같은 내용으로 구성되어 있었다. 뭐, 이런 건 부차적인 것이다. 다른 회사 시키지 않고 자회사가 "여러분에게만 기간한정"의 늬앙스를 주는 이벤트는 많이 하는 회사 중에 흥한 곳은 단 한 곳도 못 봤다. 물론, 최초가 될 수도 있겠으나. 기다리면 계속 싸질 것이라는 것은 자명하다.

 

지금 당장의 매출이 정말 중요한가 보다. 상업 솔루션은 어쩔 수 없는 듯. 패스트 캠퍼스 온라인 강의는 마케팅 방식 빼고 모든게 마음에 든다.

 

이렇게 적어두는 것은 내가 만든 제품은 기간한정 할인 이벤트를 하지 않고 기존 구매자가 계속 해서 만족할 수 있도록 애플 마케팅을 할 것임을 다짐하려고 써 둔다.

 

이제 정말 작은 것에도 신경을 써야 겠다.

구글 지수트 서비스 목록

G Suite 상태 대시보드

이 페이지에는 다음 Google 서비스의 성능 정보가 표시됩니다. 달리 언급이 없는 경우 이 상태 정보는 G Suite를 사용하는 기업용 서비스뿐만 아니라 일반 서비스에도 적용됩니다.

언제든지 아래에 나열된 서비스의 현재 상태를 여기에서 확인할 수 있습니다. 추가 정보가 필요하거나 문제를 신고하려면 G Suite 고객센터를 방문하거나 G Suite 알려진 문제 페이지를 참조하세요.

G Suite 서비스 수준 계약  기술 지원 서비스 가이드라인이 적용되는 제품:

현재 상태

 

  Gmail

 

  Google 캘린더

 

  Google 드라이브

 

  Google 문서

 

  Google 스프레드시트

 

  Google 프레젠테이션

 

  Google 사이트 도구

 

  Google 그룹스

 

  Google 행아웃

 

  행아웃 채팅

 

  행아웃 미팅

 

  Google Vault

 

  Google+

 

  Google 설문지

 

  Google Cloud Search

 

  Google Keep

 

  Google Tasks

 

  Google Voice

 

 

G Suite 서비스 수준 계약, 클라우드 ID 서비스 수준 계약, 기술 지원 서비스 가이드라인이 적용되는 제품:

현재 상태

 

  관리 콘솔

 

 

G Suite 서비스 수준 계약이 적용되지 않는 제품:

현재 상태

 

  Google 애널리틱스

 

  App Maker

 

  Google 지도

 

  Blogger

 

  Google Sync for Mobile

 

  클래스룸

 

  Google Realtime API

 

 

 RSS 피드

따로 언급되지 않은 경우 모든 시간은 현지 시간대에 맞게 표시됩니다.

 문제 없음  서비스 문제  서비스 중단

'Blog History' 카테고리의 다른 글

개 발 일 지 035  (0) 2019.12.04
개 발 일 지 034  (1) 2019.12.04
개 발 일 지 032  (0) 2019.11.26
개 발 일 지 031  (0) 2019.11.26
개 발 일 지 030  (0) 2019.11.25

https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/tutorials/quickstart/beginner.ipynb?hl=ko

(venv) (base) j:\AI>deactivate
(base) j:\AI>.\venv\Scripts\activate

(venv) (base) j:\AI>pip install --upgrade tensorflow
Collecting tensorflow
  Downloading https://files.pythonhosted.org/packages/54/5f/e1b2d83b808f978f51b7ce109315154da3a3d4151aa59686002681f2e109/tensorflow-2.0.0-cp37-cp37m-win_amd64.whl (48.1MB)
     |███████▌                        | 11.1MB 1.3MB/s eta 0:00:29  

 

--------------------------------------------------------------------------- ModuleNotFoundError Traceback (most recent call last) <ipython-input-2-64156d691fe5> in <module> ----> 1 import tensorflow as tf ModuleNotFoundError: No module named 'tensorflow'

 


(venv) (base) j:\AI>jupyter notebook
[I 02:46:29.893 NotebookApp] The port 8888 is already in use, trying another port.
[I 02:46:29.894 NotebookApp] The port 8889 is already in use, trying another port.
[I 02:46:29.995 NotebookApp] JupyterLab extension loaded from J:\Anaconda3\lib\site-packages\jupyterlab
[I 02:46:29.996 NotebookApp] JupyterLab application directory is J:\Anaconda3\share\jupyter\lab
[I 02:46:30.041 NotebookApp] Serving notebooks from local directory: j:\AI
[I 02:46:30.041 NotebookApp] The Jupyter Notebook is running at:
[I 02:46:30.042 NotebookApp] http://localhost:8890/?token=170a7f76196b6eee0b173ea61c2cff69e4fe980b73e5a456
[I 02:46:30.044 NotebookApp]  or http://127.0.0.1:8890/?token=170a7f76196b6eee0b173ea61c2cff69e4fe980b73e5a456
[I 02:46:30.045 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 02:46:30.165 NotebookApp]

    To access the notebook, open this file in a browser:
        file:///C:/Users/joe/AppData/Roaming/jupyter/runtime/nbserver-46908-open.html
    Or copy and paste one of these URLs:
        http://localhost:8890/?token=170a7f76196b6eee0b173ea61c2cff69e4fe980b73e5a456
     or http://127.0.0.1:8890/?token=170a7f76196b6eee0b173ea61c2cff69e4fe980b73e5a456
[I 02:46:46.732 NotebookApp] Creating new notebook in
[I 02:46:47.969 NotebookApp] Kernel started: 89448ba3-29ae-43e7-a188-e19883fe88ea

 

 

--------------------------------------------------------------------------- ModuleNotFoundError Traceback (most recent call last) <ipython-input-1-64156d691fe5> in <module> ----> 1 import tensorflow as tf ModuleNotFoundError: No module named 'tensorflow'

 

 

(venv) (base) j:\AI>pip install --upgrade tensorflow
Requirement already up-to-date: tensorflow in j:\ai\venv\lib\site-packages (2.0.0)
Requirement already satisfied, skipping upgrade: gast==0.2.2 in j:\ai\venv\lib\site-packages (from tensorflow) (0.2.2)
Requirement already satisfied, skipping upgrade: wrapt>=1.11.1 in j:\anaconda3\lib\site-packages (from tensorflow) (1.11.2)
Requirement already satisfied, skipping upgrade: opt-einsum>=2.3.2 in j:\ai\venv\lib\site-packages (from tensorflow) (3.1.0)
Requirement already satisfied, skipping upgrade: keras-preprocessing>=1.0.5 in j:\ai\venv\lib\site-packages (from tensorflow) (1.1.0)
Requirement already satisfied, skipping upgrade: protobuf>=3.6.1 in j:\ai\venv\lib\site-packages (from tensorflow) (3.10.0)
Requirement already satisfied, skipping upgrade: termcolor>=1.1.0 in j:\ai\venv\lib\site-packages (from tensorflow) (1.1.0)
Requirement already satisfied, skipping upgrade: grpcio>=1.8.6 in j:\ai\venv\lib\site-packages (from tensorflow) (1.25.0)
Requirement already satisfied, skipping upgrade: absl-py>=0.7.0 in j:\ai\venv\lib\site-packages (from tensorflow) (0.8.1)
Requirement already satisfied, skipping upgrade: tensorflow-estimator<2.1.0,>=2.0.0 in j:\ai\venv\lib\site-packages (from tensorflow) (2.0.1)
Requirement already satisfied, skipping upgrade: astor>=0.6.0 in j:\ai\venv\lib\site-packages (from tensorflow) (0.8.0)
Requirement already satisfied, skipping upgrade: six>=1.10.0 in j:\anaconda3\lib\site-packages (from tensorflow) (1.13.0)
Requirement already satisfied, skipping upgrade: wheel>=0.26 in j:\ai\venv\lib\site-packages (from tensorflow) (0.33.6)
Requirement already satisfied, skipping upgrade: tensorboard<2.1.0,>=2.0.0 in j:\ai\venv\lib\site-packages (from tensorflow) (2.0.1)
Requirement already satisfied, skipping upgrade: google-pasta>=0.1.6 in j:\ai\venv\lib\site-packages (from tensorflow) (0.1.8)
Requirement already satisfied, skipping upgrade: numpy<2.0,>=1.16.0 in j:\anaconda3\lib\site-packages (from tensorflow) (1.17.3)
Requirement already satisfied, skipping upgrade: keras-applications>=1.0.8 in j:\ai\venv\lib\site-packages (from tensorflow) (1.0.8)
Requirement already satisfied, skipping upgrade: setuptools in j:\ai\venv\lib\site-packages (from protobuf>=3.6.1->tensorflow) (42.0.1)
Requirement already satisfied, skipping upgrade: google-auth-oauthlib<0.5,>=0.4.1 in j:\ai\venv\lib\site-packages (from tensorboard<2.1.0,>=2.0.0->tensorflow) (0.4.1)
Requirement already satisfied, skipping upgrade: werkzeug>=0.11.15 in j:\anaconda3\lib\site-packages (from tensorboard<2.1.0,>=2.0.0->tensorflow) (0.16.0)
Requirement already satisfied, skipping upgrade: markdown>=2.6.8 in j:\ai\venv\lib\site-packages (from tensorboard<2.1.0,>=2.0.0->tensorflow) (3.1.1)
Requirement already satisfied, skipping upgrade: google-auth<2,>=1.6.3 in j:\ai\venv\lib\site-packages (from tensorboard<2.1.0,>=2.0.0->tensorflow) (1.7.1)
Requirement already satisfied, skipping upgrade: h5py in j:\anaconda3\lib\site-packages (from keras-applications>=1.0.8->tensorflow) (2.9.0)
Requirement already satisfied, skipping upgrade: requests-oauthlib>=0.7.0 in j:\ai\venv\lib\site-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard<2.1.0,>=2.0.0->tensorflow) (1.3.0)
Requirement already satisfied, skipping upgrade: cachetools<3.2,>=2.0.0 in j:\ai\venv\lib\site-packages (from google-auth<2,>=1.6.3->tensorboard<2.1.0,>=2.0.0->tensorflow) (3.1.1)
Requirement already satisfied, skipping upgrade: pyasn1-modules>=0.2.1 in j:\ai\venv\lib\site-packages (from google-auth<2,>=1.6.3->tensorboard<2.1.0,>=2.0.0->tensorflow) (0.2.7)
Requirement already satisfied, skipping upgrade: rsa<4.1,>=3.1.4 in j:\ai\venv\lib\site-packages (from google-auth<2,>=1.6.3->tensorboard<2.1.0,>=2.0.0->tensorflow) (4.0)
Requirement already satisfied, skipping upgrade: requests>=2.0.0 in j:\anaconda3\lib\site-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard<2.1.0,>=2.0.0->tensorflow) (2.22.0)
Requirement already satisfied, skipping upgrade: oauthlib>=3.0.0 in j:\ai\venv\lib\site-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard<2.1.0,>=2.0.0->tensorflow) (3.1.0)
Requirement already satisfied, skipping upgrade: pyasn1<0.5.0,>=0.4.6 in j:\ai\venv\lib\site-packages (from pyasn1-modules>=0.2.1->google-auth<2,>=1.6.3->tensorboard<2.1.0,>=2.0.0->tensorflow) (0.4.8)
Requirement already satisfied, skipping upgrade: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in j:\anaconda3\lib\site-packages (from requests>=2.0.0->requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard<2.1.0,>=2.0.0->tensorflow) (1.24.2)
Requirement already satisfied, skipping upgrade: certifi>=2017.4.17 in j:\anaconda3\lib\site-packages (from requests>=2.0.0->requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard<2.1.0,>=2.0.0->tensorflow) (2019.9.11)
Requirement already satisfied, skipping upgrade: chardet<3.1.0,>=3.0.2 in j:\anaconda3\lib\site-packages (from requests>=2.0.0->requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard<2.1.0,>=2.0.0->tensorflow) (3.0.4)
Requirement already satisfied, skipping upgrade: idna<2.9,>=2.5 in j:\anaconda3\lib\site-packages (from requests>=2.0.0->requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard<2.1.0,>=2.0.0->tensorflow) (2.8)

(venv) (base) j:\AI>python -c "import tensorflow as tf;print(tf.reduce_sum(tf.random.normal([1000, 1000])))"
2019-11-26 02:48:42.169374: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2
tf.Tensor(2040.7914, shape=(), dtype=float32)

 

 

python3 했더니 Microsoft store 로 넘어감. 3.7 버전이 있음. 게다가 받다가 지속 오류도 해결책도 없음ㅋㅋㅋ

 

ㅋㅋㅋ 언제 제대로 통합되려나 블로그에서 다들 고생하네. anaconda도 결국 텐서랑 다른 회사라 그런가 봄.

나중에 구글이 만든거 있으면 써야 하겠지만 아나콘다가 그걸 하려는 "움직임"이니 아나콘다 포스팅을 최우선으로 생각해야함.

 

 

https://www.tensorflow.org/install/pip?hl=ko

 

Install TensorFlow with pip  |  TensorFlow

TensorFlow 2 packages are available tensorflow —Latest stable release for CPU-only tensorflow-gpu —Latest stable release with GPU support (Ubuntu and Windows) tf-nightly —Preview build (unstable). Ubuntu and Windows include GPU support. Older versions of T

www.tensorflow.org

 

https://docs.anaconda.com/anaconda/user-guide/tasks/tensorflow/

 

TensorFlow — Anaconda documentation

TensorFlow Anaconda makes it easy to install TensorFlow, enabling your data science, machine learning, and artificial intelligence workflows. This page shows how to install TensorFlow with the conda package manager included in Anaconda and Miniconda. Tenso

docs.anaconda.com

(base) PS C:\Users\joe> j:
(base) PS J:\> cd ai
(base) PS J:\ai> conda create -n tf tensorflow
Collecting package metadata (current_repodata.json): done
Solving environment: done

## Package Plan ##

  environment location: J:\Anaconda3\envs\tf

  added / updated specs:
    - tensorflow


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    _tflow_select-2.3.0        |              mkl           3 KB
    absl-py-0.8.1              |           py37_0         162 KB
    astor-0.8.0                |           py37_0          47 KB
    gast-0.2.2                 |           py37_0         155 KB
    google-pasta-0.1.8         |             py_0          43 KB
    grpcio-1.16.1              |   py37h351948d_1         850 KB
    keras-applications-1.0.8   |             py_0          33 KB
    keras-preprocessing-1.1.0  |             py_1          36 KB
    libmklml-2019.0.5          |                0        17.4 MB
    libprotobuf-3.10.1         |       h7bd577a_0         2.3 MB
    markdown-3.1.1             |           py37_0         132 KB

 

 

(base) PS J:\ai> conda activate tf-gpu                                                                                  (tf-gpu) PS J:\ai>     

 

 

 

(tf-gpu) PS J:\ai> python -c "import tensorflow as tf;print(tf.reduce_sum(tf.random.normal([1000, 1000])))"             2019-11-26 03:03:21.854070: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cudart64_100.dll
2019-11-26 03:03:24.622058: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library nvcuda.dll
2019-11-26 03:03:24.789283: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1618] Found device 0 with properties:
name: GeForce GTX 1050 major: 6 minor: 1 memoryClockRate(GHz): 1.544
pciBusID: 0000:09:00.0
2019-11-26 03:03:24.799864: I tensorflow/stream_executor/platform/default/dlopen_checker_stub.cc:25] GPU libraries are statically linked, skip dlopen check.
2019-11-26 03:03:24.808384: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1746] Adding visible gpu devices: 0
2019-11-26 03:03:24.813627: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX AVX2
2019-11-26 03:03:24.824682: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1618] Found device 0 with properties:
name: GeForce GTX 1050 major: 6 minor: 1 memoryClockRate(GHz): 1.544
pciBusID: 0000:09:00.0
2019-11-26 03:03:24.835336: I tensorflow/stream_executor/platform/default/dlopen_checker_stub.cc:25] GPU libraries are statically linked, skip dlopen check.
2019-11-26 03:03:24.845828: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1746] Adding visible gpu devices: 0
2019-11-26 03:03:25.924409: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1159] Device interconnect StreamExecutor with strength 1 edge matrix:
2019-11-26 03:03:25.931410: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1165]      0
2019-11-26 03:03:25.936123: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1178] 0:   N
2019-11-26 03:03:25.941687: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1304] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 1340 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1050, pci bus id: 0000:09:00.0, compute capability: 6.1)
tf.Tensor(-753.7468, shape=(), dtype=float32)

 

 

 

 

(tf-gpu) PS J:\ai> python                                                                                               Python 3.7.5 (default, Oct 31 2019, 15:18:51) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
2019-11-26 03:04:57.218292: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cudart64_100.dll

 

 

 

powershell 실행 후 

(base) PS C:\Users\joe> conda activate tf-gpu                                                                           (tf-gpu) PS C:\Users\joe> python                                                                                        Python 3.7.5 (default, Oct 31 2019, 15:18:51) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
2019-11-26 03:20:09.553228: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cudart64_100.dll
>>>           

 

Ctrl+Z로 들어가서 conda install jupter로 또 설치해 주면

 

- DEBUG menuinst_win32:__init__(199): Menu: name: 'Anaconda${PY_VER} ${PLATFORM}', prefix: 'J:\Anaconda3\envs\tf-gpu', env_name: 'tf-gpu', mode: 'user', used_mode: 'user'
DEBUG menuinst_win32:create(323): Shortcut cmd is J:\Anaconda3\python.exe, args are ['J:\\Anaconda3\\cwp.py', 'J:\\Anaconda3\\envs\\tf-gpu', 'J:\\Anaconda3\\envs\\tf-gpu\\python.exe', 'J:\\Anaconda3\\envs\\tf-gpu\\Scripts\\jupyter-notebook-script.py', '"%USERPROFILE%/"']
done
(tf-gpu) PS C:\Users\joe> jupyter                                                                                                            usage: jupyter [-h] [--version] [--config-dir] [--data-dir] [--runtime-dir]
               [--paths] [--json]
               [subcommand]
jupyter: error: one of the arguments --version subcommand --config-dir --data-dir --runtime-dir --paths is required
(tf-gpu) PS C:\Users\joe> jupyter-notebook.exe                                                                                               [I 03:23:32.823 NotebookApp] The port 8888 is already in use, trying another port.
[I 03:23:32.824 NotebookApp] The port 8889 is already in use, trying another port.
[I 03:23:32.825 NotebookApp] The port 8890 is already in use, trying another port.
[I 03:23:32.826 NotebookApp] The port 8891 is already in use, trying another port.
[I 03:23:32.827 NotebookApp] The port 8892 is already in use, trying another port.
[I 03:23:32.842 NotebookApp] Serving notebooks from local directory: C:\Users\joe
[I 03:23:32.842 NotebookApp] The Jupyter Notebook is running at:
[I 03:23:32.842 NotebookApp] http://localhost:8885/?token=10b1fc0f61009ba912020010a7d5e4e6bbf8b1cbe4150bda
[I 03:23:32.843 NotebookApp]  or http://127.0.0.1:8885/?token=10b1fc0f61009ba912020010a7d5e4e6bbf8b1cbe4150bda
[I 03:23:32.843 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 03:23:32.978 NotebookApp]

    To access the notebook, open this file in a browser:
        file:///C:/Users/joe/AppData/Roaming/jupyter/runtime/nbserver-48628-open.html
    Or copy and paste one of these URLs:
        http://localhost:8885/?token=10b1fc0f61009ba912020010a7d5e4e6bbf8b1cbe4150bda
     or http://127.0.0.1:8885/?token=10b1fc0f61009ba912020010a7d5e4e6bbf8b1cbe4150bda
[I 03:23:39.939 NotebookApp] Kernel started: 1d586540-b64f-4613-9299-ad68c7b7fd96
2019-11-26 03:23:41.799195: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cudart64_100.dll

 

import tensorflow as tf 에 에러가 없다. 이제 conda 패키지 매니저가 지원하는 패키지는 모두 설치할 수 있고 python 3.7.5와의 궁합도 잘 맞을 것 같다.

 

걍 다 묶어서 패키지로 만들지... 20년 동안 지켜봐도(내가 8살 때는 리눅스 안했었으니) 아직도 마음에 들지 않는 리눅스 패키지 매니저 처럼(레드헷 계열이던 데비안 계열이던) 똑같은 길을 아나콘다가 걷는 것 같다.

 

요즘엔 폴더를 예쁘게 컨스트럭팅 하지는 않으니 주피터 한번 더 까는 것도 ㄱㅊ.

 

내가 만드는 것도 아니라 소스 정리 보다는 이론을 정확하게 하는게 더 중요한 상태.

 

내 스타일과 맞지 않아서 정립된 후 쓰려고 했는데 이제 슬 들어가야 한다. AI로.

 

'Blog History' 카테고리의 다른 글

개 발 일 지 034  (1) 2019.12.04
개 발 일 지 033  (0) 2019.11.26
개 발 일 지 031  (0) 2019.11.26
개 발 일 지 030  (0) 2019.11.25
개 발 일 지 029  (0) 2019.11.24

https://www.tensorflow.org/install/pip?hl=ko




pip3 install -U pip virtualenv



.

.

.

conda install pip3 


Collecting package metadata (current_repodata.json): done

Solving environment: failed with initial frozen solve. Retrying with flexible solve.

Collecting package metadata (repodata.json): done

Solving environment: failed with initial frozen solve. Retrying with flexible solve.


PackagesNotFoundError: The following packages are not available from current channels:


  - pip3


Current channels:


  - https://repo.anaconda.com/pkgs/main/win-64

  - https://repo.anaconda.com/pkgs/main/noarch

  - https://repo.anaconda.com/pkgs/r/win-64

  - https://repo.anaconda.com/pkgs/r/noarch

  - https://repo.anaconda.com/pkgs/msys2/win-64

  - https://repo.anaconda.com/pkgs/msys2/noarch



그냥 pip로 virtualenv 설치


(base) j:\AI>virtualenv --system-site-packages -p python3 ./venv

The path python3 (from --python=python3) does not exist


(base) j:\AI>virtualenv --system-site-packages -p python ./venv





텐서플로우 설치링크 - 내가 보는 동영상 강의는 제대로 안 되어 있음. 이것도 오래됨.


https://tensorflow.blog/%EC%9C%88%EB%8F%84%EC%9A%B0%EC%A6%88%EC%97%90-%EC%95%84%EB%82%98%EC%BD%98%EB%8B%A4-%ED%85%90%EC%84%9C%ED%94%8C%EB%A1%9C%EC%9A%B0-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0/



아나콘다 설치

브라우저로 아나콘다 다운로드 페이지에 접속합니다.

C0.anaconda

파이썬 2.7과 3.7 버전의 Windows용 설치 파일이 있습니다. Windows용 텐서플로 바이너리 패키지는 현재 파이썬 3.5, 3.6, 3.7버전을 지원하므로 아나콘다의 파이썬 3.7 버전을 설치해야 합니다. 텐서플로의 바이너리는 64비트용이므로 만약 사용하는 컴퓨터가 32비트라면 텐서플로 소스를 직접 컴파일하여 설치해야 합니다. 텐서플로는 공식적으로 Windows에서 직접 소스를 컴파일하는 것을 지원하지 않습니다. 사용하는 Windows 컴퓨터가 32비트인지 64비트인지 확인하려면 여기를 참고하세요.

텐서플로 1.6버전부터 CPU 버전 바이너리는 AVX(고급 벡터 확장) 명령을 지원하도록 컴파일되어 있습니다. 만약 AVX를 지원하지 않는 CPU를 사용한다면 텐서플로 1.5 버전을 사용해야 합니다(아래 설명). 사용하고 있는 CPU가 AVX 명령을 지원하는지 확인하려면 여기를 참고하세요.

또는 인텔의 프로세서 유틸리티를 사용할 수도 있습니다. 이 프로그램을 다운받아 설치하고 실행하면 다음과 같은 화면을 볼 수 있습니다. 두 번째 탭에서 Advanced Vector Extensions에 ‘예’라고 표시되면 AVX 명령을 지원하는 CPU입니다.

캡처10

이제 AVX를 지원하는 64비트 컴퓨터가 준비되었다고 가정하고 아나콘다의 파이썬 3.7 버전 64비트 인스톨러를 다운받습니다.

C1.anaconda_download

아나콘다 인스톨러 설치는 보통의 Windows 설치 프로그램과 비슷합니다. 설치 과정을 마치면 시작버튼에 아나콘다 폴더가 추가됩니다.

install_anaconda-c5439

이 다음부터는 Anaconda Prompt에서 명령행 인터페이스를 사용해서 진행하겠습니다.

install_anaconda-4213b

콘다 및 파이썬 패키지 업데이트

Anaconda Prompt에 들어오면 conda 패키지 관리자를 사용할 수 있습니다. 먼저 conda 자체를 업데이트합니다.

>conda update -n base conda

다음엔 설치된 파이썬 패키지를 모두 최신 버전으로 업데이트합니다.

>conda update --all

텐서플로 설치

아나콘다 배포판에는 텐서플로 최신 버전이 늦게 포함되므로 파이썬 기본 패키지 관리자인 pip로 텐서플로를 설치합니다.

>pip install tensorflow

만약 AVX를 지원하지 않는 CPU를 사용하고 있다면 다음과 같이 1.5 버전을 설치합니다.

>pip install tensorflow==1.5.0

텐서플로 1.9.0 버전부터는 콘다를 사용하여 텐서플로를 설치하는 것이 권장됩니다. MKL-DNN 라이브러리에 최적화되어 있어서 CPU만을 사용하는 경우 보다 나은 성능을 기대할 수 있습니다.(콘다 패키지는 최신 텐서플로를 지원하지 않을 수 있습니다)

>conda install tensorflow

install_anaconda-1b720

설치가 완료된 후 IPython 쉘을 실행하여 tensorflow 모듈을 임포트합니다. 아무런 메세지가 뜨지 않으면 정상적으로 설치에 성공한 것입니다(텐서플로를 임포트할 때 h5py 패키지에서 경고문구가 뜰 수 있습니다. 이는 h5py 패키지의 버그로 향후 버전에서 개선될 것 같습니다. 실제 텐서플로를 사용하는데는 문제가 없으므로 무시하고 진행하면 됩니다).

>ipython
...
In [1]: import tensorflow as tf
In [2]:

install_anaconda-35971

IPython 쉘을 종료하려면 exit 명령을 입력합니다. 데이터 분석을 위해 IPython 쉘도 좋지만 이보다 코드와 실행 결과를 함께 관리할 수 있는 주피터 노트북을 사용하도록 하겠습니다. 주피터 노트북은 로컬 컴퓨터에서 실행되는 웹 서버 프로그램과 비슷합니다. 브라우저로 코드를 실행하면 IPython 커널에게 실행을 명령하고 그 결과를 브라우저로 전달해 줍니다. 주피터 노트북을 실행하려면 아나콘다 프롬프트에서 jupyter notebook 명령을 사용합니다.

>jupyter notebook

주피터 노트북이 실행되면 자동으로 기본 브라우저가 실행되어 주피터 노트북 서버에 접속합니다. 로컬 컴퓨터의 주피터 노트북 서버 주소는 http://localhost:8888/ 입니다. 주피터 노트북을 실행한 현재 폴더를 기본 홈 페이지로 설정됩니다. 이 폴더 하위에 파이썬 주피터 노트북을 만들고 실행할 수 있습니다.

install_anaconda-4b594

Documents 폴더로 들어가서 새로운 파이썬 노트북을 만들어 보겠습니다. 오른쪽 위에 있는 New 버튼을 누르면 새로운 파이썬 3 주피터 노트북을 생성할 수 있습니다.

install_anaconda-b1bc1

새로운 브라우저 탭이 열리면서 Untitled 노트북이 생성됩니다. 첫번째 코드 셀(cell)에 IPython 쉘에서 했던 것처럼 import tensorflow as tf를 입력하고 Shift+엔터 키를 입력합니다. 아무런 메세지가 나오지 않으면 텐서플로를 주피터 노트북에서 사용할 수 있도록 설치에 성공한 것입니다.

install_anaconda-2d827


'Blog History' 카테고리의 다른 글

개 발 일 지 033  (0) 2019.11.26
개 발 일 지 032  (0) 2019.11.26
개 발 일 지 030  (0) 2019.11.25
개 발 일 지 029  (0) 2019.11.24
개 발 일 지 028  (0) 2019.11.24

!-- sqlite3

  NSLog(@"DB_LOCATION %@", [[[NSFileManager defaultManager]URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask]lastObject]);

/Users/junhoha/Library/Developer/CoreSimulator/Devices/A2DE2EEB-1397-412C-9FDB-FF9BFDCE8FEB/data/Containers/Data/Application/FF679A2B-5AE9-46B9-A1F5-2F7B776F6764/Documents/


!-- Sort

https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/SortDescriptors/SortDescriptors.html#//apple_ref/doc/uid/10000174-BCICJDHA

Incompatible pointer types initializing 'NSMutableArray *' with an expression of type 'NSArray *'

'autorelease' is unavailable: not available in automatic reference counting mode

https://simyungk.tistory.com/18

Array copy
copiedList= [[NSMutableArray alloc] initWithArray:sortedArray copyItems:YES ];

copiedList=[[[NSMutableArray alloc] initWithArray:sortedArray copyItems:YES ] retain];

copiedList=[NSMutableArray arrayWithArray:sortedArray];


!-- 구글의 모든 제품 목록 

https://about.google/intl/ALL_kr/products/


!-- inner join outer join

https://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins

!-- 몽고 DB, realm 램 인수

https://www.zdnet.co.kr/view/?no=20190426105604

https://www.zdnet.co.kr/view/?no=20191031170252

써 보자

Welcome to Realm Cloud
Create your first cloud instance by clicking the "Create New Instance" button.
Follow the arrow!

We love your feedback!
Thank you for using Realm Cloud! We really appreciate to get feedback about your experience using Realm Cloud and what you would like us to improve. You can always send us an email or participate in our forums.



Create New Instance
Instance name
testdb001
Instance id
testdb001
 Looking good!
Region

https://testdb001.us1.cloud.realm.io

Your instance is ready

testdb001.us1.cloud.realm.io
Realm Cloud gives your Realm Database a syncing object server in the cloud. Although this instance link is ready to use in any project, we recommend starting with our demo apps documented below.

Build a demo project
Our ToDo demo app is the best way to try Realm Cloud. You can quickly try it out with our step-by-step instructions — just copy your app link from above, and choose an OS:

If you have any issues, questions or comments visit our Forums.

https://docs.realm.io/sync/getting-started-1/step-1-my-first-realm-app

https://github.com/realm/my-first-realm-app

sudo gem install cocoapods

pod isntall

참 편하긴 하네.

!-- 아나콘다 제품 편리하네.

https://anaconda.org/gallery
갤러리도 잼남.

 

anaconda mac install

python numpy

3.7 version

jupyter notebook server

folder 생성

new python3

hello python.ipynb

print('hello world') - run



!-- 데이터 베이스 변경
db 칼럼 추가 
데이터 모델 변경
db insert sql 부분 변경


!-- 영상강좌 유무료 사이트
1. https://www.edx.org/ : 세계 유명 대학의 Computer Science 강좌를 들을 수 있음
2. 모두의연구소(http://www.modulabs.co.kr/, 새단장중)
3. Coursera(Data Science 추천)
4. K-Mooc(유튜브 채널 있음)
5. 왼손코딩(유튜브 채널) : Python
6. 생활코딩(https://opentutorials.org/course/1)
7. 동빈나 : 알고리즘, 입사문제풀이
8. 인프런(https://www.inflearn.com/)
9. 구름EDU
10. UDACITY
11. codecademy
12. codeschool
13. KOCW(http://www.kocw.net)
14. 코딩도장(https://dojang.io/) : Python, C
15. 클래스101
16. 패스트캠퍼스
2. 알고리즘 사이트
1. https://www.hackerrank.com/
2. http://dovelet.com
3. http://www.koistudy.net/
4. www.acmicpc.com
5. https://algospot.com
6. 백준 알고리즘
7. 코딩도장(http://codingdojang.com/)
8. 매일프로그래밍(https://mailprogramming.com/)
9. Codility, LeetCode
10. https://dmoj.ca/problems/
11. goormlevel
13. topcoder
14. https://projecteuler.net
15. http://codeup.kr
16. http://codeforces.com/
17. codewars
18. https://codingcompetitions.withgoogle.com/codejam/archive
19. oj.uz
20. http://codingfun.net/
21. https://atcoder.jp/
22. 프로그래머스
23. leetcode
3. 제보사이트
1. www.dafit.me : 데이터사이언스 연습문제은행 사이트
2. Kaggle(https://www.kaggle.com/)
3.소프트웨어야 놀자(https://www.playsw.or.kr/main)
4. edwith(https://www.edwith.org/boost-course/intro)
5. 삼성전자 주니어 소프트웨어 아카데미(https://www.juniorsw.com/Academy/Story?CategoryID=6)
6. 글로벌 비영리 기관 위민 후 코드(https://www.womenwhocode.com/resources)

출처: <https://www.facebook.com/groups/1722427378043847/permalink/2559241694362407/

정리 잘하시는 페친님


'Blog History' 카테고리의 다른 글

개 발 일 지 032  (0) 2019.11.26
개 발 일 지 031  (0) 2019.11.26
개 발 일 지 029  (0) 2019.11.24
개 발 일 지 028  (0) 2019.11.24
개 발 일 지 027  (0) 2019.11.20

gelic_wl_set_encodeext

 

static const iw_handler gelic_wl_wext_handler[] =

{

IW_HANDLER(SIOCGIWNAME, gelic_wl_get_name),

IW_HANDLER(SIOCGIWRANGE, gelic_wl_get_range),

IW_HANDLER(SIOCSIWSCAN, gelic_wl_set_scan),

IW_HANDLER(SIOCGIWSCAN, gelic_wl_get_scan),

IW_HANDLER(SIOCSIWAUTH, gelic_wl_set_auth),

IW_HANDLER(SIOCGIWAUTH, gelic_wl_get_auth),

IW_HANDLER(SIOCSIWESSID, gelic_wl_set_essid),

IW_HANDLER(SIOCGIWESSID, gelic_wl_get_essid),

IW_HANDLER(SIOCSIWENCODE, gelic_wl_set_encode),

IW_HANDLER(SIOCGIWENCODE, gelic_wl_get_encode),

IW_HANDLER(SIOCSIWAP, gelic_wl_set_ap),

IW_HANDLER(SIOCGIWAP, gelic_wl_get_ap),

IW_HANDLER(SIOCSIWENCODEEXT, gelic_wl_set_encodeext),

IW_HANDLER(SIOCGIWENCODEEXT, gelic_wl_get_encodeext),

IW_HANDLER(SIOCSIWMODE, gelic_wl_set_mode),

IW_HANDLER(SIOCGIWMODE, gelic_wl_get_mode),

IW_HANDLER(SIOCGIWNICKN, gelic_wl_get_nick),

};

 

 

 

 

 

 

O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\net\wireless\wext-compat.c

    1507          [IW_IOCTL_IDX(SIOCSIWENCODEEXT)]= (iw_handler) cfg80211_wext_siwencodeext,

1 match in O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\net\wireless\wext-compat.c

O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\net\wireless\wext-core.c

     238          [IW_IOCTL_IDX(SIOCSIWENCODEEXT)] = {

     812                  if (cmd == SIOCSIWENCODEEXT) {

 

 

static int ioctl_standard_iw_point

ioctl_standard_call

compat_standard_call

 

 

 

O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\drivers\staging\rtl8723bs\os_dep\ioctl_cfg80211.c

    1783  static int rtw_cfg80211_set_key_mgt(struct security_priv *psecuritypriv, u32 key_mgt)

    2214                  ret = rtw_cfg80211_set_key_mgt(psecuritypriv, sme->crypto.akm_suites[0]);

2 matches in O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\drivers\staging\rtl8723bs\os_dep\ioctl_cfg80211.c

O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\net\wireless\wext-compat.c

    1031  static int cfg80211_set_key_mgt(struct wireless_dev *wdev, u32 key_mgt)

    1074                  return cfg80211_set_key_mgt(wdev, data->value);

2 matches in O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\net\wireless\wext-compat.c

TOTAL:    4 matches in 2 files  (36713 other files without matches are not listed)

 

 

 

O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\drivers\net\ethernet\toshiba\ps3_gelic_wireless.c

    1906          pr_debug("%s: psk=%s\n", __func__,

1 match in O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\drivers\net\ethernet\toshiba\ps3_gelic_wireless.c

TOTAL:    1 match in 1 file  (36714 other files without matches are not listed)

 

 

/* SIOC{S,G}IWENCODEEXT */

static int gelic_wl_set_encodeext(struct net_device *netdev,

  struct iw_request_info *info,

  union iwreq_data *data, char *extra)

{

struct gelic_wl_info *wl = port_wl(netdev_priv(netdev));

struct iw_point *enc = &data->encoding;

struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;

__u16 alg;

__u16 flags;

unsigned long irqflag;

int key_index;

int ret = 0;

 

 

 

 

O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\drivers\net\ethernet\toshiba\ps3_gelic_wireless.c

    1207          struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;

    1234          if (!enc->length && (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY)) {

    1297          struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;

    1305          max_key_len = enc->length - sizeof(struct iw_encode_ext);

    1323          memset(ext, 0, sizeof(struct iw_encode_ext));

7 matches in O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\drivers\net\ethernet\toshiba\ps3_gelic_wireless.c

O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\drivers\net\wireless\atmel\atmel.c

    1835          struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;

    1850          if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) {

    1895          struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;

5 matches in O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\drivers\net\wireless\atmel\atmel.c

O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\drivers\net\wireless\cisco\airo.c

    6453          struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;

    6479          if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) {

    6559          struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;

5 matches in O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\drivers\net\wireless\cisco\airo.c

O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\drivers\net\wireless\intel\ipw2x00\ipw2200.c

    6765          struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;

    6771                          if (ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY)

3 matches in O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\drivers\net\wireless\intel\ipw2x00\ipw2200.c

O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\drivers\net\wireless\intel\ipw2x00\libipw_wx.c

     522          struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;

     541          if (ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY) {

     643          if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) {

     682          struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;

     698          if (!(ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY) &&

     726                          ext->ext_flags |= IW_ENCODE_EXT_TX_SEQ_VALID;

8 matches in O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\drivers\net\wireless\intel\ipw2x00\libipw_wx.c

O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\drivers\net\wireless\intersil\hostap\hostap_ioctl.c

    3203          struct iw_encode_ext *ext = (struct iw_encode_ext *) extra;

    3315           * TODO: if ext_flags does not have IW_ENCODE_EXT_RX_SEQ_VALID, the

    3317           * TODO: if ext_flags has IW_ENCODE_EXT_TX_SEQ_VALID, next TX seq#

    3320          if ((!(ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) || ext->key_len > 0)

    3330          if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) {

    3380          struct iw_encode_ext *ext = (struct iw_encode_ext *) extra;

    3429                                  ext->ext_flags |= IW_ENCODE_EXT_TX_SEQ_VALID;

9 matches in O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\drivers\net\wireless\intersil\hostap\hostap_ioctl.c

O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\drivers\net\wireless\intersil\orinoco\wext.c

     726          struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;

     751          if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) {

     785                          if (ext->ext_flags & IW_ENCODE_EXT_RX_SEQ_VALID)

     793                                   ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY,

     820          struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;

7 matches in O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\drivers\net\wireless\intersil\orinoco\wext.c

O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\drivers\net\wireless\intersil\prism54\isl_ioctl.c

    1544          struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;

    1568          if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) {

    1653          struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;

5 matches in O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\drivers\net\wireless\intersil\prism54\isl_ioctl.c

O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\drivers\staging\ks7010\ks_wlan_net.c

    1538          struct iw_encode_ext *enc;

    1543          enc = (struct iw_encode_ext *)extra;

    1560          if (enc->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) {

    1563          } else if (enc->ext_flags & IW_ENCODE_EXT_RX_SEQ_VALID) {

    1638           * struct iw_encode_ext *enc;

    1639           * enc = (struct iw_encode_ext *)extra;

6 matches in O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\drivers\staging\ks7010\ks_wlan_net.c

O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\drivers\staging\rtl8188eu\os_dep\ioctl_linux.c

    1862          struct iw_encode_ext *pext = (struct iw_encode_ext *)extra;

    1897          if (pext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY)

    1904              (pext->ext_flags & IW_ENCODE_EXT_GROUP_KEY))

    1909          if (pext->ext_flags & IW_ENCODE_EXT_RX_SEQ_VALID)

5 matches in O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\drivers\staging\rtl8188eu\os_dep\ioctl_linux.c

O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\drivers\staging\rtl8192e\rtllib_wx.c

     529          struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;

     547          if (ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY) {

     644          if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) {

4 matches in O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\drivers\staging\rtl8192e\rtllib_wx.c

O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\drivers\staging\rtl8192e\rtl8192e\rtl_wx.c

     896                  struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;

     914                  group = ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY;

3 matches in O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\drivers\staging\rtl8192e\rtl8192e\rtl_wx.c

O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\drivers\staging\rtl8192u\r8192U_wx.c

     737                  struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;

     750                  group = ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY;

3 matches in O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\drivers\staging\rtl8192u\r8192U_wx.c

O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\drivers\staging\rtl8192u\ieee80211\ieee80211_wx.c

     512          struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;

     530          if (ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY) {

     630          if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) {

     676          struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;

     692          if (!(ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY) &&

     719                          ext->ext_flags |= IW_ENCODE_EXT_TX_SEQ_VALID;

8 matches in O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\drivers\staging\rtl8192u\ieee80211\ieee80211_wx.c

O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\drivers\staging\rtl8712\rtl871x_ioctl_linux.c

    1763          struct iw_encode_ext *pext = (struct iw_encode_ext *)extra;

    1793          if (pext->ext_flags & IW_ENCODE_EXT_GROUP_KEY)

    1795          if (pext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY)

    1798          if (pext->ext_flags & IW_ENCODE_EXT_RX_SEQ_VALID)

5 matches in O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\drivers\staging\rtl8712\rtl871x_ioctl_linux.c

O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\drivers\staging\rtl8723bs\os_dep\ioctl_linux.c

    2143          struct iw_encode_ext *pext = (struct iw_encode_ext *)extra;

    2182          if (pext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY)

    2189                  ((pext->ext_flags & IW_ENCODE_EXT_GROUP_KEY)

    2196          if (pext->ext_flags & IW_ENCODE_EXT_RX_SEQ_VALID)

5 matches in O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\drivers\staging\rtl8723bs\os_dep\ioctl_linux.c

O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\net\wireless\wext-compat.c

     632          struct iw_encode_ext *ext = (struct iw_encode_ext *) extra;

     704          if (ext->ext_flags & IW_ENCODE_EXT_RX_SEQ_VALID) {

     711                          !(ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY),

     713                          ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY,

5 matches in O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\net\wireless\wext-compat.c

O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\net\wireless\wext-core.c

     241                  .min_tokens        = sizeof(struct iw_encode_ext),

     242                  .max_tokens        = sizeof(struct iw_encode_ext) +

     248                  .min_tokens        = sizeof(struct iw_encode_ext),

     249                  .max_tokens        = sizeof(struct iw_encode_ext) +

     813                          struct iw_encode_ext *ee = (void *) extra;

5 matches in O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\net\wireless\wext-core.c

TOTAL:    98 matches in 18 files  (36697 other files without matches are not listed)

 

 

 

 

 

case WLAN_AKM_SUITE_PSK:

if (params->crypto.wpa_versions &

    NL80211_WPA_VERSION_1) {

bss_config->protocol = PROTOCOL_WPA;

bss_config->key_mgmt = KEY_MGMT_PSK;

}

if (params->crypto.wpa_versions &

    NL80211_WPA_VERSION_2) {

bss_config->protocol |= PROTOCOL_WPA2;

bss_config->key_mgmt = KEY_MGMT_PSK;

}

 

 

 

 

O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\net\wireless\wext-compat.c

    1036                          IW_AUTH_KEY_MGMT_PSK))

    1045          if (key_mgt & IW_AUTH_KEY_MGMT_PSK) {

 

 

static int cfg80211_set_key_mgt(struct wireless_dev *wdev, u32 key_mgt)

{

int nr_akm_suites = 0;

 

if (key_mgt & ~(IW_AUTH_KEY_MGMT_802_1X |

IW_AUTH_KEY_MGMT_PSK))

return -EINVAL;

 

if (key_mgt & IW_AUTH_KEY_MGMT_802_1X) {

wdev->wext.connect.crypto.akm_suites[nr_akm_suites] =

WLAN_AKM_SUITE_8021X;

nr_akm_suites++;

}

 

if (key_mgt & IW_AUTH_KEY_MGMT_PSK) {

wdev->wext.connect.crypto.akm_suites[nr_akm_suites] =

WLAN_AKM_SUITE_PSK;

nr_akm_suites++;

}

 

wdev->wext.connect.crypto.n_akm_suites = nr_akm_suites;

 

return 0;

}

 

 

 

O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\drivers\staging\rtl8723bs\core\rtw_ieee80211.c

u8 WPA_AUTH_KEY_MGMT_PSK_OVER_802_1X[] = { 0x00, 0x50, 0xf2, 2 };

 

 

 

 

O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\drivers\staging\ks7010\ks_wlan_net.c

case IW_AUTH_KEY_MGMT:        /* 3 */

switch (value) {

case IW_AUTH_KEY_MGMT_802_1X:

case IW_AUTH_KEY_MGMT_PSK:

case 0:        /* NONE or 802_1X_NO_WPA */

case 4:        /* WPA_NONE */

priv->wpa.key_mgmt_suite = value;

 

 

O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\drivers\net\wireless\rndis_wlan.c

 

static int rndis_akm_suite_to_key_mgmt(u32 akm_suite)

{

switch (akm_suite) {

default:

return RNDIS_WLAN_KEY_MGMT_NONE;

case WLAN_AKM_SUITE_8021X:

return RNDIS_WLAN_KEY_MGMT_802_1X;

case WLAN_AKM_SUITE_PSK:

return RNDIS_WLAN_KEY_MGMT_PSK;

}

}

 

 

O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\drivers\net\ethernet\toshiba\ps3_gelic_wireless.c

 

     890                  if (param->value & IW_AUTH_KEY_MGMT_PSK)

 

 

case IW_AUTH_KEY_MGMT:

if (param->value & IW_AUTH_KEY_MGMT_PSK)

break;

 

 

 

 

O:\linux-4.19.2.tar\linux-4.19.2\linux-4.19.2\drivers\staging\ks7010\ks_hostif.c

case IW_AUTH_KEY_MGMT_PSK:

buf = (priv->wpa.version == IW_AUTH_WPA_VERSION_WPA2) ?

KEY_MGMT_ID_WPA2_PSK : KEY_MGMT_ID_WPA_PSK;

 

 

 

 

 

 

 

 

Wi-Fi 비번 해킹 힘들구먼.

 

 

 

 

 

'Blog History' 카테고리의 다른 글

개 발 일 지 031  (0) 2019.11.26
개 발 일 지 030  (0) 2019.11.25
개 발 일 지 028  (0) 2019.11.24
개 발 일 지 027  (0) 2019.11.20
개 발 일 지 026  (0) 2019.11.20

 개발 능력 향상을 위해서는 잉여력을 쌓아야 한다. 잉여력 쌓는 중.

 

                      https://www.youtube.com/watch?v=L6rFjSPoUys 본인이 사회적 찐따였고 많은 실패를 했다는 것도 솔직하게 이야기 하

고, 항상 도전적 영상으로 아이들에게 많은 호응을 끌어낸 (나와 와이프는 별로 안 좋아함) 유투버인데 1억이나 기부했네. 운영비던 기부단체 비리던 뭐든 기부라는 단어 자체가 가지는 힘은 무척크다. 잡스가 그런 말을 했었지. 좋아하지 않더라도 "무시"하지는 못할 것이라고.

 

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

 

https://www.qoo10.com/gmkt.inc/Goods/Goods.aspx 대한민국이 살아남기 위해서는 병원, KT 중심으로 뭉치던지. 삼성/LG 통합하던지, 혹은 쇄국 정책만이 답이라는 생각이 든다.

 

 

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

페북에 무슨 생각을 하냐고 써 있길래 간만에 글 적으려는데, 뭘 체크해야 한다. 뉴스피드랑 내 스토리 구분 못하겠다. 찾기도 귀찮다. 세상이 너무 어렵고, 난 더 어려운 것을 누가 시켜서 만들고, 할 수 있기에 더 어려운 말을 만들어 낸다. 다들 서로 죽으라고 거리에 내모는 것을 왜 그렇게 어렵게 말하는지... 편하게 살면서 힘든 것은 다른 사람들이 다 해주고 난 나름의 논리로 그 사람들과는 다른 사람인데 멋있게 힘든 척 해보고 싶은 것인지. 지켜 보다보면 참, 재미있기도 하다. 미안한 마음은 있나보다 하는 생각도 든다. 히틀러가 이해되는 요즘 에너지를 받아 현실과 동떨어지지 않으려고 그 돋보기 초점을 극소수에게 맞추려고 노력한다. 편할 수 있지만 어머니께 죄송해서, 큰 것을 이루기 위해 절벽, 벼랑에 자신을 계속해서 몰아댄다. 트리거는 어머니께서 돌아가시거나 내가 이렇게 자신감 충만함이 하드웨어 노후로 소프트웨어(생각)가 꺽일 때일 듯 싶다. 아무것도 모른체 죽는 것도 좋겠지만 이 정도면 충분한 복선을 깐 것 같아 스스로 만족스럽다. 현실만큼 확실한 증거도 없지. 인스타에는 행복함만 기록하자며 늘 다짐한다.

 

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

 

적는 김에 하나 더 써 본다. 쓰면 좋아요도 없는데 좀 지켜보면, 그 대로 세상이 바뀌더라곸ㅋㅋ. 요새 자칭 상류 사회 사람들 좀 만나고 있는데 무슨 4~5년 간 딱, 한 번 보고는 ㅈㄴ 친한 척, 알면 무슨 대단한 척 하는 것을 본다. 최근 인스타에 얼굴 올린 사람들은 지속적으로 최소 4년 이상 만난 사람들이다. 10년 본 사람들도 이제 사진 올리기 시작했다. KBS 출연 사진도 한 번 출연했다고 올린거 아니고 4년 간 해당 분들 지속적으로 만나면서 지내며, 사진 한 번 올린 적 없었다. 잡지에 계속해서 글 기고 할 때도 예명으로 활동했지 아는 사람만 알고, 자랑한 적 없었다. 요새 내가 인스타 한다고 사진 찍지 말라고 하는 사람들 좀 보는데 자기가 못 생긴거 정말 모르고 지 멋에 사나보다 싶다. 흠... 전혀... 난 연예인 만나도 사진 찍자고 안했었다. 그 어린 나이에 많이 만날 기회가 있어도, 늘 악수를 청했다. 남을 이용할 생각 없다. 지가 잘나야지ㅡㅡ; 하긴, 그렇게 잘 이용하는 사람들 좀 보긴 했는데 난 다른 사진 찍어서 복수 해야 겠다는 생각보다. 말년에 심판 받게 해야지 하는 생각이 먼저 들더라. 유명한 저자가 간 부서는 정치판이 되었다는 소식을 들었고, 어줍잖은 강의를 솔직하게 말은 못하고 꾸미고 꾸며, 해당 기술 분야 전체를 싸구려 노동판으로 만들려는 사람도 본다. 다 죄짓는 거다. 고차원적인 죄 지으면 저돌적으로 나오는 사람이 없을거라 생각하는 것 자체가 난 더 무섭다. 미래 사회 영화 안보고 사는지 원... 넷플릭스 강추한다. 그리고 어른들이 우리를 이해 못했듯이 요즘 애들은 생각이 또 다르다. 자기 만족 시대.

'Blog History' 카테고리의 다른 글

개 발 일 지 030  (0) 2019.11.25
개 발 일 지 029  (0) 2019.11.24
개 발 일 지 027  (0) 2019.11.20
개 발 일 지 026  (0) 2019.11.20
개 발 일 지 025  (0) 2019.11.20

!-- 멘토링 하는 친구에게 한 풀이 중...

- 고위직 자녀분 멘토링 가끔씩 한다.  몇 년 되었다...(중앙 정보 까지는 아니고 국가 기관의...)

 

 

Declarations and Initializations

Floating Point Issues

Complicated Declarations

Const

Typedef

Bitwise Operators

Memory Allocation

Arrays

Functions

Structures, Unions, Enums

 

-> interface는 자체적으로 객체를 생성(new)할 수 없습니다.

-> 1은 숫자이기때문에 변수명으로 사용이 불가능합니다.

 

 

 

1. 결과값 : Foo를 인스턴스 해서 Object로 캐스팅 후 저장했다가 Foo로 다시 캐스팅하여 Foo 형식에 저장. i는 변함없이 3

Q2

A. float[] f= new float[3];이 되어야 하는데 변수와 ( ) 때문에 error.

B. new float[] 때문에 error. 생성되는 배열의 개수 명시해야함.

F. float f4[] = new float[] { 1.0f. 2.0f. 3.0f}; 에서

{ 1.0f. 2.0f. 3.0f};부분은 오타입니다.

{ 1.0f, 2.0f, 3.0f};이 정상입니다. (.이 아니라 ,입니다)

 

3.i++ > --j i > --j ; i++; 과 같은 효과

if(1>9) while(2<5)

if(2>8) while(3<5)

if(3>7) while(4<5)

if(4>6) while(5<5) do while빠져나옴. i=5, j=6;

 

Q4

3line에서 생성된 Demo objectgarbage collection자격(대상)이 되는 시점. Demod가 가르키고, takeDemo에서 d(이하 td)가 같이 가르키고 있다가 tdnull(연결 끊김)해서 다른 Demo가르킴. 3line에서 생성된 것은 계속 d가 가르키고 있어서 garbage collection일어나지 않음. 답은 E "이 코드를 수행하는 인스턴스가(전체가) 가비지 컬렉션 대상이 되었을 때"

d라는 변수는 클래스 변수인데, d변수에 대한 처리가 아무것도 없군요. 메소드에서도 d의 복사본만 넘길 뿐이죠. 메소드 안에서 demonull처리한다고 dnull이 되거나 하는것은 아니죠.

결국 이 클래스 자체의 인스턴스가 gabage collection되기 전까진 dgc처리되지 않습니다.

자바에서는 call by reference 없습니다. 오로지 call by value 있을 뿐이죠. 확실히 call by reference 없지만, 효과는 비슷하게 하기 위해서 object typeobject 주소를 넘겨줍니다. 그래서 objectproperty 바꿀 있지만, 역시 주소는 바꿀 없습니다. , 새로운 객체를 가리키게 없습니다.

takeDemo() method에서 파라미터 demo 는 새로운 지역변수입니다. 대신 주소값을 넘겨받았기 때문에 property는 바꿀 수 있지만,

 

9. demo = null;

10. demo = new Demo();

 

이 두줄처럼 한다고 새로운 object(주소를) 가리키는 아닙니다.

메소드가 끝나면 사라져 버리지요.(지역변수이기 때문에)

그러나 property 바꾸면 그것은 유지가 됩니다.

왜냐면 변수가 여전히 같은 객체를 가리키기 때문이죠.

 

void test() {

String s = " AAA";

print(s);

}

void print(String s) {

s = "awfawef";

}

 

이런다고 test() methods 값이 변하는 것은 아닙니다.

그러나,

void test() {

int[] s = new int[1];

s[0] = 1;

print(s);

}

void print(int[] s) {

s[0] = 2;

}

이렇게 하면 s[0] 값이 2 바뀝니다.

왜냐면 배열은 object이기 때문이고 property 바꾸었기 때문이죠.

void print(int[] s){

s = new int[2];

}

만약에 위처럼 했다면 배열은 바뀌지 않았을 겁니다.

 

 

Q6.

A. 메모리는 Runtime.gc()의 호출로 인해 갱신된다.(gc는 요청을 할 수 있지만 즉각 갱신되지 않고 시스템이 알아서 한다.)

B. 만약 객체들이 살아있는 쓰레드들로부터 접근이 가능하다면, 그것들은 수집 되지않는다.(정답)

C. finalize()메소드를 가진 객체는 절대로 수집이 되지않는다.

D. finalize()메소드를 가진 객체는 프로그램 수행이 끝나기 전에 항상 finalize()메소드를 호출한다.

 

7.

A. 명시하지 않았을 때 default(friendly)

B. classB의 생성자는 매개변수 없음 (정답)

C. 생성자는 this()를 포함한다. -본인생성자는 포함할 필요없음

D. 생성자는 super()를 포함 - A상속받았기 때문에 부모의 생성자 호출(정답)

 

8. 3번과 비슷

if (1>10) , 9, while (2<5)

if (2>9), 8, while(3<5)

if (3>9), 7, while(4<5)

if (4>9), 6, while(5<5) i=5, j=6

 

9.

A. Assertions(검증)class-by-class기반에서 가능 혹은 불가능하다.(?? 정답)

B. Conditional 컴파일은 클래스를 초 스피드로 테스트할때 사용한다. (???)

C. 검증은 메소드내의 인자들(argument)이 적절한가(validity)를 체크하는 appropriate.(조건에 맞는지 검증)

D. 프로그래머는 assertion(검증)실패 시 return 문장을 실행하거나 exception(예외)를 던지게 선택할 수 있다.(assertion 실패시 String 형태로만 출력)

 

10. 클래스가 같은 패키지에 있는 다른 클래스의 멤버로 접근하고자 할 때, 가장 제한적인 접근제한자는 무엇인가?

public (모두 접근) protected(같은 패키지, 다른패키지면서 상속받은클래스) default (같은 패키지 만 - O ) private (클래스 내에서만)

 

11. if를 비롯해 while과 같은 조건문에서는 true, false값만 들어갈 수 있다. x=y는 대입문으로 x1(int)값이 들어가기 때문에 실행불가.

 

12. 결과는 main에서 aMethod()를 호출하면 Excption()을 던지고서는 finally블록을 실행한다. 그리고 Exception을 캐취해서 exception출력을 하고, 마지막으로 finished를 정상출력한 후 끝낸다.

 

13. line 2(int k=4)와 같은것은 interface내의 멤버변수는 public static final이 생략되어있다. 정답은 A,B,C

 

Q14.

패키지 = 디렉토리또는 폴더의 개념

public : 모든 패키지로부터 접근가능

default(friendly) : 다른패키지에선 접근불가능

protected : 상속받은 다른패키지의 클래스에서도 접근이 가능

 

Test2.java:4: x is not public in test1.Test1; cannot be accessed from outside package

System.out.println("x = " + x);

원인 :: static int x이면 이것은 default 접근제한자(friendly라고도함) 가집니다. 접근제한자부분을 써줄때 그부분에 아무것도 안쓰면 default접근제한자로 선언된것이고 접근의 범위는 같은 패키지안에서만 가능하죠. 그런데 package test2 다른패키지이므로 접근할때 오류가뜹니다(test 24line). 오류내용인즉 접근할 없다고 하는거죠

 

Q15. classA를 상속받은 클래스에서 올바른 (메소드)정의 2가지.

*오버로딩 : 메소드 명 똑같이, 매개변수 갯수가 다르거나 데이터 형이 다르거나.. 나머지는 상관없음.

*오버라이딩 : 메소드 명 똑같이, 반환형 같이, 매개변수 똑같이, 접근제한자 똑같거나 넓어짐.

A. 오버라이딩

B. 매개변수 같으면 오버라이딩인데 접근제한자 좁아짐(protectedprivate)

C. 오버로딩(매개변수 다르고 이름은 같음)

D. 오버라이딩인데 반환형이 다름.

E. 오버라이딩인데 static이 붙어서 문제가 생김

 

Q16.

for( 초기화 ; 조건 ; 후처리 )

{

구문;

}

초기화 -> 조건 -> 구문 -> 후처리 순으로 처리가 되는데

A -> B -> D -> C -> B -> D -> C -> B 이 순으로 처리가 됩니다. 차근차근 따라가 보세요. ''

foo('A') foo('B')&&(0<2) foo('D') foo('C') foo('B')&&(1<2) foo('D') foo('C') foo('B')&&(2<2) (A B D C B D C B)

for (A; B; C) {

D;

}

위의 형태를 예로 들겠습니다. 수행순서는 다음과 같습니다.

1. 첫번째 인자인 A는 무조건 수행한다.

2. 두번째 인자인 B를 수행한다.(조건확인)

3. B가 참이면 D를 수행하고 세번째 인자인 C를 수행한다. 만일 B가 거짓이면 for 문을 빠져나온다.

4. 두번째 인자인 B를 수행한다.(조건확인)

5. B가 참이면 D를 수행하고 세번째 인자인 C를 수행한다. 만일 B가 거짓이면 for 문을 빠져나온다.

 

17. asset 조건:String에서 String“Exception in thread "main" java.lang.AssertionError:[String] at Test.main(Test.java:3)

C 답이면 String 에서 true 출력한다.

 

Q18. 배열을 생성(new float[10];)하면 자동으로 초기화 한다. float0.0으로 초기화.

 

Q19.

지역변수에서는 static 제한자를 사용할수가 없습니다.

사용할 수 있는 곳은 멤버 필드나, 메소드, 내부 클래스입니다.

 

Q20. 6번라인에 넣었을 때 에러나는 문장은...

A. 매개변수가 같으므로 오버라이딩 - 반환형이 다르다.(floatvoid)

B. 메소드 명 같고 매개변수 다름(오버로딩)

C. 매개변수 같고 반환형 같고, 접근제한자 같음(오버라이딩)

D. B와 같은 이유로 오버로딩

 

21. if( true/false ) 가능... boolboolean형으로 if(bool=false)에서 false값 가짐 2번라인 실행안함. 4번도 false여서 실행안함. 6번은 if(!bool) 이 참이어서 "c"출력

 

22. 참인것은? (혼란스러움)

A. catch(X x)는 서브클래스 Xcatch할 수 있다.

B. Error classRuntimeException이다(Error)

C. Errorthrow하는 어떤 문장이라도 try block로 싸 주어야 한다.(Error는 싸 줄 필요 없다)

D. Exceptionthrow하는 어떤 문이라도 try block로 싸 주어야 한다.(throw하는 문을 호출해도 메소드에 throws를 사용하면 try~catch를 다른 메소드에 넘길 수 있다.)

E. RuntimeExceptionthrow하는 어떤 문이라도 try block로 싸 주어야 한다.(D와 동일)

 

Q23.

A. 어서션은 부작용이 없다.

B. Assertion(검증)표현하는 values는 어떤 기본형이라도 가능하다.(assert 조건문:String 으로 제한)

C. ?

D. assertion의 결과로 AssertionErrorthrown하는감싸진 메소드로 다루어져야한다.(X)

 

24.생성자의 경우 패키지의 접근제한자와 동일해야 한다. 그렇지 않으면 클래스 생성 자체가 불가능하다고 에러가 난다.

A. Compilation fails at line 5.

 

Q25.

코드 주의: TestSuper(int i){} 생성자 명시 default 생성자 만들지 않음. TestSubTestSuper 상속(extends)

new TestSub() 시 생성자가 실행될 때 따로 명시하지 않으면 부모(TestSuper)default생성자를 호출한다. 그러나 TestSuper에는 디폴트 생성자가 없으니 에러가 난다.

 

!-- 요건 주요한 내용이라 스크랩

 

 

Control Instructions

Expressions

 

 

C Preprocessor

Pointers

 

Strings

 

Input / Output

Command Line Arguments

 

 

 

 

Variable Number of Arguments

 

Library Functions

 

 

 

출처: <http://www.indiabix.com/c-programming/questions-and-answers/>

 

 

union 뭐에 써 먹냐고요?

장길석

http://forum.falinux.com/zbxe/index.php?document_srl=557139

2011.10.07 22:30:31 (*.138.143.120)

26142

C 언어를 사용하신다면 struct는 아마도 대부분 사용하실 것이라고 생각됩니다. 그런데 의외로 사용하지 않는 것이 있는데 바로 union입니다. 흠~ 이유가 뭘까? 아마도 struct 보다는 사용하는 경우의 수가 적기 때문이 아닐까 생각합니다. 그런데 문제는 사용할 꺼리가 적다 보니 잊혀져 버리는 것 같아요. 아무리 멋진 자동차도 쳐다 보지 않고 내팽게쳐 준다면 녹이 슬고 말겠죠.

 

union이 그런 것이 아닐까 생각됩니다. 사용하면 편한데, 사용하는 경우가 적다 보니 잊혀져서 사용하지 못하는. 그러나 아예 잊혀지기 전에 잠시 둘러 보죠.

 

저 같은 겨우 union을 시리얼 통신이나 TCP/IP 통신에서 가끔 사용합니다. 혹시, 이런 경우 있지 않나요? 시리얼로 한 바이트씩 정수 값을 받아 들이는 경우 말이죠.

 

  • 상대방이 보내려는 정수 값 : 0x12345678
  • 상대방이 하나 씩 보낸 순서 : 0x12, 0x34, 0x56, 0x78

이럴 때 union을 사용하면 편한데, 대부분 버퍼로 받아서는 직접 계산을 하더군요.

 

n_size = buff[3] * 256 * 256 * 256 + buff[2] * 256 * 256 + buff[1] * 256 + buff[0]

 

또는 비트를 shift 하기도 하지만, 어찌되었든 같은 방법입니다. 그러나 union을 사용하면 매우 간단해 집니다.

#include <stdio.h>

typedef unsigned char   byte;
typedef unsigned int    u32;

typedef struct {

byte    b1, b2, b3, b4;

} size_byte_t;

typedef union {

u32         size;
    size_byte_t bytes;
} size_data_t;

int main( void){

size_data_t s_size;
   
    // 시리얼로 4개의 바이트를 buff[]로 받았다면

s_size.bytes.b1 = buff[0];
    s_size.bytes.b2 = buff[1];
    s_size.bytes.b3 = buff[2];
    s_size.bytes.b4 = buff[3];

printf( "data size =%x\n", s_size.size);

return 0;
}

struct와 union의 차이점

struct는 변수를 하나의 묶음으로 만들어 줍니다. 묶음 하나에 들어 가도 변수는 다른 변수와 같이 들어 갈뿐 자기 자리가 있습니다. 즉, 사탕 4개를 struct라는 주머니에 넣는다면, 사탕은 모두 주머니 안에 들어가도 각각의 사탕은 자기가 차지하는 공간이 있습니다. 그러나 union은 큰 놈 안에 작은 놈이 포개지듯이 들어 갑니다.

 

 

그래서 아래와 같이 선언하면 struct로 선언된 struct_byte_t의 크기는 4byte 이지만, union으로 선언된 union_byte_t는 변수가 4개라도 byte 한 개 짜리입니다. 즉, b1, b2, b3, b4 이름만 다른 변수 4개만 있을 뿐 실제 모두 같은 바이트의 주소를 가르키게 됩니다.

typedef unsigned char   byte;
typedef unsigned int    u32;

typedef struct {

byte    b1, b2, b3, b4;

} struct_byte_t;

typedef union {

byte    b1, b2, b3, b4;

} union_byte_t;

자, 그렇다면 위의 예제가 그림처럼 이해가 되시나요? ^^

 

 

typedef struct {

byte    b1, b2, b3, b4;

} size_byte_t;

typedef union {

u32         size;
    size_byte_t bytes;
} size_data_t;

 

 

 

그래서 메모리에는 아래와 같이 포개지는 꼴이 됩니다.

 

 

이런 메모리 구성으로 b1에 값을 넣으면 size 변수의 최 하위 바이트 값이 변경됩니다. size 변수의 최 상위 바이트 값을 변경하려면 b4를 이용하면 되겠지요.

 

이해를 돕기 위해 예제 하나를 더 올립니다.

 

#include <stdio.h>

typedef unsigned char   byte;
typedef unsigned int    u32;

typedef struct {

byte    b1;
    byte    b2;
    byte    b3;
    byte    b4;

} size_byte_t;

typedef union {

u32         size;
    size_byte_t bytes;
} size_data_t;

int main( void){

size_data_t s_size;

s_size.size = 0x12345678;

printf( "b1=%2x  b2=%2x  b3=%2x  b4=%2x\n", s_size.bytes.b1, s_size.bytes.b2, s_size.bytes.b3, s_size.bytes.b4);

return 0;
}

어떤 값이 출력될까요?

 

참고로 char buff[255]와 같이 크기가 정해진 버퍼와도 union을 이용하여 묶어서 사용하면 앞서 정수 값을 계산할 필요도 없어 집니다. 이 예 말고도 리틀엔디언 정수 값을 빅 엔디언으로 바꿀 때도 사용할 수 있구요. 결론으로 짧게 말씀 드린다면, 어떤 고정 크기의 변수에서 특정 부분을 수정하거나 읽어 들일 때 사용하면 편합니다.

 

출처: <http://forum.falinux.com/zbxe/index.php?document_srl=557139&mid=lecture_tip>

 

 

 

 

    void (    )(int);

 

 

 

 

 

void (*func)(int)

*signal(int signo)

 

 

 

void (*signal(int signo,void (*func)(int))) (int);

 

*T = *signal(int signo,void (*func)(int)) 치환

void (*T) (int);

반환형이 없고(void), 하나의 int 형 인수를 가지는 함수를 가리킬 수 있는 포인터 => 함수 포인터

 

*S = void (*func)(int)

 

반환형이 없고(void), 하나의 int 형 인수를 가지는 함수를 가리킬 수 있는 포인터 => 함수 포인터

 

 

*signal(int signo, *S)

 

int 함수포인터 *s를 인자로 하는 함수를 가리킬 수 잇는 포인터 => 함수 포인터

 

 

 

 

signal 함수 선언의 뜻은?

 

void (*signal(int signo,void (*func)(int)))(int);

 

예제를 void (*a)(int), a= signal(int signo, void (*handler)(int)) 두개로 나누어 봅시다.

 

그러면 a는 함수의 리턴벨류를 의미하며 <integer형을 argument로 하고 return 값이 없는 함수 포인터 a> 라 할수 있습니다.

 

근데 signal이란 놈은 <integer 하나, integer를 인자로 하고 리턴값이 없는 handler라는 이름의 함수 포인터 하나를 인자로 하는 signal이라는 이름의 함수>입니다.

 

둘을 결합하면 결국,

 

a = <integer형을 인자로 하고 return값이 없는 함수포인터를 리턴값으로 가지며 (integer 하나), (integer를 인자로 하고 리턴값이 없는 handler라는 이름의 함수포인터 하나)를 인자로 하는 signal이라는 이름의 함수 >입니다.

 

2. signal 가르키는 함수 포인터 선언은?

 

위와 같이 선언자체와 리턴 값을 둘로 나누어 봅시다.

 

void (*) (int) -> return value;

(* signal)(int, void (*) (int)); -> return value 제외한 함수 포인터

 

둘을 합하면

void (* (* signal)(int, void (*) (int)) ) (int)

같이 됩니다.

 

이것은 signal과 같은 함수를 가르킬 수 있는 함수 포인터입니다.

 

 

 

 

Let's making English culture to read English documents for upgrading your ablity of coding quickly.

 

답변
추천해요3
추천자 목록
^ - Circumflex (서컴플렉스) 
! - Exclamation Point (엑스클러메이션 포인트) 
" - Quotation Mark (쿼테이션 마크) 
# - Crosshatch (크로스해치), Sharp(샵), Pound Sign(파운드 사인) 
$ - Dollar Sign (달러사인) 
% - Percent Sign (퍼센트사인) 
@ - At Sign (앳 사인, 혹은 앳), Commercial At(커머셜 앳) 
& - Ampersand (앰퍼샌드) 
' - Apostrophe (어파스트로피) 
* - Asterisk (애스터리스크) 
- - Hyphen (하이픈), Dash (대시) 
. - Period (피리어드), Full Stop (풀스탑) 
/ - Slash (슬래시), Virgule (버귤) 
\ - Back Slash (백슬래시) 
- Won sign (원사인) 
: - Colon (콜론) 
; - Semicolon (세미콜론) 
` - Grave (그레이브) 
{ - Left Brace (레프트 브레이스) 
} - Right Brace (라이트 브레이스) 
[ - Left Bracket (레프트 브래킷) 
] - Right Bracket (라이트 브래킷) 
( - Left Parenthesis (레프트 퍼렌씨시스) 
) - Right Parenthesis (라이트 퍼렌씨시스) 
| - Vertical Bar (버티컬바) 
~ - Tilde (틸드) 
= - Equal Sign (이퀄사인) 
+ - Plus Sign (플러스사인) 
- - Minus Sign (마이너스사인) 
_ - Underscore (언더스코어), Underline (언더라인) 
< - Less Than Sign (레스댄 사인), Left Angle Bracket(레프트 앵글브래킷) 
> - Greater Than Sign (그레이터댄 사인), Right Angle Bracket (라이트 앵글브래킷)

출처: <http://tip.daum.net/question/39482504


 

https://money.cnn.com/pf/best-jobs/2013/snapshots/7.html

 

Software Developer - Best Jobs in America 2013

CNNMoney/PayScale.com's top 100 careers with big growth, great pay and satisfying work.

money.cnn.com

 

 

/* object type (public) */

typedef union {

  struct _ooc_vtbl_object  const *_CONST__ __vptr;

  struct _ooc_vtbl_object _CONST_*_CONST_  __iptr;

} t_object;

 

/* object virtual table type (private) */

struct _ooc_vtbl_object {

  struct _ooc_type_info const*_CONST_ info;

  size_t offset;

};

 

/* object class type (private) */

struct _ooc_class_object {

  struct _ooc_vtbl_object const*const __vptr;

  t_object (*const object) (void);

  void (*const _object)  (t_object *const);

};

 

/* object RTTI (private) */

struct _ooc_type_info {

  char const*const name;

  struct _ooc_class_object const*_CONST_ class;

  t_object const*_CONST_ obj;

  struct _ooc_type_info const*_CONST_ super;

  size_t _CONST_ extraSuper;

  size_t _CONST_ extraOffset[_OBJECT_MAXEXTRASUPER_];

};

'Blog History' 카테고리의 다른 글

개 발 일 지 029  (0) 2019.11.24
개 발 일 지 028  (0) 2019.11.24
개 발 일 지 026  (0) 2019.11.20
개 발 일 지 025  (0) 2019.11.20
개 발 일 지 024  (0) 2019.11.18

!-- 내가 완!전! 좋아하는 시인


喜也(희야) 이희숙 
1964년 12월 20일 
(음력 1963년 11월 22일) 
경남 합천 출생 
2002년 문예사조 등단 
글벗문학회 회원 
독도수호대 정회원 
대구 거주 
행복을 경영할 줄 아는 여자 

제16회 전국문화사진공모전 초대작가 (달서구문화원)

출처: <http://poemlove.co.kr/m/bbs/board.php?bo_table=tb02&wr_id=3849

!-- 다시는 펀딩북 출판 안하리 했던 마음이 요즘 조금 녹고 있음
아래는 관련 공지 글 초고


[비전공자를 위한 프로그래밍] 목차는 아래와 같습니다. 8월 31일까지 작업되어 진행 상황 공유용으로 출판사로는 전달했습니다. 출판사 전문가분의 의견을 듣고자 위함입니다. 현재 Chapter 6을 집필 중입니다. 마무리 후 Chapter 7까지 고려중이며, 초안 집필이 끝난 후에는 하나의 개념으로 설명 가능한 용어들을 모두 통합/통합한 이유를 적고 불필요한 내용들을 모두 더더욱 압축하는 작업을 거치려고 합니다. 안경을 압축하듯이 제 역할은 유지한 체, 내용은 압축하여 줄인 다음 가볍고 오래도록 볼 수 있는 서적이 되고자 합니다. 내용이 필요 없을 때 즈음되면 개정판을 내려고 합니다. 작업 순서는 제가 내용을 쓰고 SW업체 대표분이 내용을 이해하여 다시 씁니다. 그다음 국어국문학 작가분이 알아듣기 어려운 문장을 퇴고하고 교정합니다. 물론, 출판사 교정은 거칩니다. 교정 담당하실 분의 업무 스트레스는 많이 내려갈 거라 생각합니다.
[개발자가 알아야 할 비화]는 표지 디자인 및 내지 디자인, 문서를 보기 좋게 변환하는 작업이 진행 중입니다. - 디자인 작업이 이렇게 광범위할 줄 몰랐습니다. 견적서 받아보고 디자인 작업 비용이 비싸다고 했던 제가 너무 부끄럽더군요 - 집필 중 국내 유명 IT 교육센터 담당자 분과 내용 관련해서 이야기할 시간이 있었습니다. 너무 위험하지 않겠냐는 피드백을 주셨습니다. 걱정 안 해도 될 이유를 일일이 ,  오래도록 설명하고 나니 고개를 끄덕이십니다. 참... 진실을 말하는데 걱정 안 해도 될 세상이 어서 빨리 왔으면 하는 생각이 들었습니다. 비화는 펀딩 말고 사실 분을 위해. 5만 원에 값을 책정했고 책에 인쇄될 거라고 하니, 요즘 누가 5만 원에 책을 사냐면서 성화셨습니다. 그러나 한 권 보내 달라고 하더군요. 회사 윗분께 드린다고 ^^; 수익금은 [함께하는 사랑밭]에 기부토록 하겠습니다. 큰 기업들의 회사 시스템도 좋은 방향성을 가지게 해 주고, 대한민국 IT도 깨끗하게 만들며 어려운 한국의 아이들을 돕는 데까지... 정말 괜찮은 일을 하고 있는 것 같습니다.
[C&JAVA]는 펜딩 상태입니다. JVM 소스 분석이 들어가는데 고도의 집중 시간 없이 진행하기는 어려운 부분입니다. 게다가 담당하고 있는 업무의 가짓수가 많아진 이유입니다. 첫권은 인쇄 프로세스를 탔고, 두 번째권은 마무리 단계라 세 번째 권에 대한 온전한 집중은 9월 말이 되어서야 가능할 것 같습니다. 기획 출판에 계약서가 9월 말로 되어 있어서 9월 말에 무릎 보호대를 작용해야 할 것 같습니다.(무릎 꿇기 用) 책이 많이 늦는다면 우선 환불을 진행하고 책은 무료로 보내 드리는 방법을 고려하고 있습니다. 독자분과의 약속도 중요하지만 제 IT 커리어도 달려 있어서 앞으로 이 업(業)으로 밥 먹고 살아야 하는데, 개떡 같은 책 내면 망하니까요 ^^
애까지 있는 아빠가 업데이트에 비루한 단어를 선택해서 죄송합니다. 다만, 저의 솔직한 생각이 구어체 용어를 타고 정확한 느낌으로 전달되었으면 하는 바람입니다.
이제 결실의 계절 9월입니다. 여기 제주는 어젯밤 기온, 또 새벽 산책을 나가보니 날씨가 많이 차가워졌습니니다. 무엇보다 중요한 것은 건강이니 환절기 감기 조심하시기 바랍니다.
이상 보고를 마칩니다.
하준호 드림.

- 아 래 -
Chapter 1. 프로그래밍이 뭐야?
프로그래밍 개념 잡기
프로그래밍을 해보자 <쉘(shell) 프로그래밍>
단어장 1
Chapter 2. 프로그램을 실행시켜 보자
Visual Studio 설치 (C/C++)
Path 설정
컴파일(Compile)/링크(Link)
C/C++ 프로그래밍
컴파일 과정
단어장 2
JDK / Eclipse 설치 (JAVA)
Path 설정
컴파일(Compile)/링크(Link)
JAVA 프로그래밍
Chapter 3. 포인터
기본개념
포인터 연산자
리틀 엔디안, 빅 엔디안
다중 포인터
배열 포인터
포인터 배열
동적 할당
함수 포인터
손 코딩 & 발 코딩
책에서 표현하는 방법
벤 다이어 그램
Chapter 4. Programming paradigm
프로그래밍에서 중요한 것
코딩능력
성실성
디자인 패턴
책임감
자료구조, 알고리즘
친화력
협동심
쉘 스크립트 작성 능력
배려심
포트폴리오
Chapter 5. Algorithm, Data Structure
알아야 할 용어
알고리즘이란?
디자인 패턴과 수학?
알고리즘을 잘한다는 것은?
절차 지향, 객체지향 프로그래밍?
객체지향이란?
추상화, API란?
스스로 결정하는 DS, ALGO 실력!
DS의 종류
원시 타입(Primitive Type)
배열(Array)
스택(Stack), 큐(Queue)
연결 리스트(LinkedList)
트리(Tree)
힙(Heap)
그래프(Graph)
해시(Hash)
ALGO의 종류
Chapter 6. 프로그래밍 공부 방법
수학을 먼저 공부해야 합니다.
EntryPoint를 찾아야 합니다.
DS(Data Structure)를 알아야 합니다.
원시 타입(Primitive Type) 찾기
배열(Array) 찾기
AOGO(Algorithm)을 짜기 위한 도구를 알아야 합니다.
연산자
산술 연산자
대입 연산자
증가 (++), 감소 (--) 연산자
관계 연산자
비트 연산자
Logical Operator(논리 연산자)
비트 연산자와 논리 연산자의 차이점
shift(이동) 연산자
조건 연산자(?:)와 instanceof 연산자
연산자 우선순위

!-- 비화 출판에 도와주신 많은 분...

싫어했고 싸웠던 사람도 있지만 이제 용서하기로 했다.
그 항의 전화 때문에 또 텀블벅에 까지 항의 했던 것 때문에 텀블벅이랑도 전화 받으라
애기 늦게 데리러 가서 있게된 수많은 아픔도 이제 지워졌겠지.


강경묵 강동준 강성연 강재성 고경민 고세민 고제경 곽소영 구균모 구지운 권령희 권민수 권순호 권혜림 김강준 김경민 김광수 
김다성 김대현 김동억 김동원 김동현 김명준 김문찬 김민규 김민아 김민재 김민지 김보미 김성민 김성원 김성진 김여은 김영래 
김용식 김유준 김윤오 김정수 김종혁 김주완 김진만 김진환 김태호 김하얀 김행주 김현지 김효상 김효준 남기원 남도영 남미진 
류철원 문상수 문윤기 박다솔 박미소 박병호 박상현 박성용 박순호 박완희 박정환 박종률 박준영 박지하 박현수 박현우 박혜연 
박화미 배가현 배영성 변가람 송나해 신동현 신소영 신혜원 안석준 안소현 안진훈 양현철 엄준영 오승환 오윤재 오청균 옥윤청 
우승현 우지원 원순규 유성곤 유승희 유은지 유지아 유진웅 윤상필 윤여정 윤현정 윤현호 이강욱 이건우 이경준 이동엽 이미희 
이선아 이성주 이소정 이슬비 이승규 이승주 이승표 이애지 이예신 이용출 이우람 이원주 이윤식 이은지 이장묵 이재석 이재원 
이재현 이정우 이정임 이종혁 이준호 이지홍 이태균 이한솔 이현우 이혜연 이효원 임상혁 임은지 임은진 장미영 장성호 장용석 
전재훈 정시진 정신호 정윤수 정재영 정조은 정형석 정혜인 정희원 조영기 조용일 조우석 조우재 조윤수 조은비 조재문 조창훈 
조현철 진승기 차상원 차호 천은지 최가원 최경재 최영순 최원석 최유진 최정인 최한겸 최호윤 하승철 한예인 허용학 홍성철 
홍장미 황동환 황설희 황정아 황주은 황준우 황혜정

!-- Embedded

벗어 날 수 없는...

BLOCK DIAGRAM

 

 

XU4 is fully software compatible with XU3 !

But XU4 is more compact, more affordable and more expandable.

 

What's different from XU3.

Pros

- Gbit Ethernet

- More Stable Dual USB 3.0 host ports

- More compact PCB size

- More IO ports (I2S/I2C/GPIO)

 

Cons

- No USB OTG

- No DP

- No Audio CODEC

- No Power Monitoring Sensors

 

 

BOARD DETAIL

 

 

 

PCB DETAIL

 

 

 

 

 

 

출처: <http://www.hardkernel.com/main/products/prdt_info.php?g_code=G143452239825&tab_idx=2>

 

//        CInternetSession*    pSession = NULL;

//    CHttpConnection*    pHttpConnect = NULL;

//    CHttpFile*            pHttpFile = NULL;

//    CString                url = _T("/hash");

//

//    try{

//       

//        //// HTTP 메소드별로 사용 가능

//        pSession = new CInternetSession;

//

//                CString strServerName = L"http://211.57.201.145";

//

//                pHttpConnect = pSession->GetHttpConnection(strServerName, (INTERNET_PORT)1377, NULL, NULL);

//

//        if(pHttpConnect == NULL) throw CString(_T("http connection failed!!!"));

//

//                pHttpFile = pHttpConnect->OpenRequest(CHttpConnection::HTTP_VERB_GET, url);

//

//                //pHttpFile->AddRequestHeaders(_T("HTTP/1.1\r\nAccept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, */*\r\nAccept-Language: ko\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB6.4; CNS_UA; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; CNS_UA)\r\nAccept-Encoding: gzip, deflate\r\nProxy-Connection: Keep-Alive\r\n"));

//

//

////pHttpFile->AddRequestHeaders(_T("POST v1/voice/tts.bin HTTP/1.1\r\n"));

//////pHttpFile->AddRequestHeaders(_T("Host: openapi.naverlove.com\r\n"));

////pHttpFile->AddRequestHeaders(_T("User-Agent: curl/7.43.0\r\n"));

////pHttpFile->AddRequestHeaders(_T("Accept: */*\r\n"));

////pHttpFile->AddRequestHeaders(_T("Content-Type: application/x-www-form-urlencoded\r\n"));

//////pHttpFile->AddRequestHeaders(_T("X-Naver-Client-Id: 123456789123456789\r\n"));

//////pHttpFile->AddRequestHeaders(_T("X-Naver-Client-Secret: 12345678\r\n"));

//

////CString strHeaders = CString(_T("Content-Type: application/x-www-form-urlencoded"));

//

////pFile-&gt;AddRequestHeaders(strHeaders);

//

//

////pFile->AddRequestHeaders("Accept: image/png,*/*;q=0.5");

////

////pFile->AddRequestHeaders("Accept-Language: zh-cn,zh;q=0.5");

////

////pFile->AddRequestHeaders("Accept-Encoding: gzip,deflate");

////

////pFile->AddRequestHeaders("Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7");

////

////pFile->AddRequestHeaders("Keep-Alive: 300");

////

////pFile->AddRequestHeaders("Connection: keep-alive");

////

////pFile->AddRequestHeaders("Cookie: Key=somevalue;domain=abc.com") ;

//

////pHttpFile->SendRequest();

//

//                    CString strLine;

//

//                pHttpFile = (CHttpFile *)pSession->OpenURL(_T("http://211.57.201.145:1337/hash"));                

//                  pHttpFile->ReadString(strLine);

//    //           pHttpFile->Close();

////cout << strLine << endl;

//        MessageBox(strLine ,L"Msgbox",MB_OK);

//       

//                //pHttpFile->QueryInfoStatusCode(dwRet);

//

//        // GET 방법으로 간단하게

//       

//        //pSession = new CInternetSession;

//       

//

//

//      //try {

//      //            // INTERNET_FLAG_RELOAD prevents page output being cached; potentially inaccurate

//      //            pFile = (CHttpFile*)session.OpenURL("http://www.mywebsite.com/Gui4UnexAuth.aspx", 0,

//      //                                                INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_RELOAD);

//      //            pFile->ReadString(strLine);

//      //            pFile->Close();

//      //      } catch(CInternetException* e) {

//      //            e->Delete();

//      //      }

//

//      //  delete pFile;

//

//     

//    }

//    catch(CInternetException *m_pEx)

//    {

//     //   m_pEx->ReprotError();

//        m_pEx->Delete();

//    }

//

//    // result값 확인

//    DWORD m_dwStatusCode;

//    pHttpFile->QueryInfoStatusCode(m_dwStatusCode);

//

//        cout << m_dwStatusCode << endl;

//

//    // 객체 delete 부분

//    if(pHttpFile)

//    {

//        delete pHttpFile;

//        pHttpFile = NULL;

//    }

//    if(pHttpConnect)

//    {

//        delete pHttpConnect;

//        pHttpConnect = NULL;

//    }

//    if(pSession)

//    {

//        pSession->Close();

//        delete pSession;

//        pSession = NULL;

//    }

//

//

//

//        //MessageBox(L"Done",L"Msgbox",MB_OK);

//        cout << "done" << endl;

'Blog History' 카테고리의 다른 글

개 발 일 지 028  (0) 2019.11.24
개 발 일 지 027  (0) 2019.11.20
개 발 일 지 025  (0) 2019.11.20
개 발 일 지 024  (0) 2019.11.18
개 발 일 지 023  (0) 2019.11.18


!-- 소팅

NSSortDescriptor *sortDescriptor;

sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"keyValueYouWantToSort"

NSMutableArray *sortedArray = [mList sortedArrayUsingDescriptors:@[sortDescriptor]];
tableViewApator = sortedArray;
[yourTableView reloadData]; //  NSMutableArray *tableViewApator

!-- 어제  또 하나의 앱을 스토어에 올렸다. 애플과의 풀 원문을 공개된 것은 거의 없어서, 포스팅 해 본다.
도움 되시길... 참, 날짜를 지운 이유는 애플 대응에 대한 정보를 이렇게 제공하는 것 조차 지피지기로 생각해 보면
달갑지 않을 것 같은데 하나의 정보라도 빼는게 좋을 듯. 다른 분께 어느 정도까지만  도움되라는 의미로 
날짜는 크게 필요 없다고 생각되기 때문. 앱스토어 뿐 아니라 플레이 스토어 아마존 스토어 등 여러 군데 퍼브리싱 한
경험 + 대기업, 중소기업, 스타트업, 개인 퍼브리싱 등 경험으로 볼 때 애플이 가장 깐깐한 것 같다. 이미 올려진 앱이
있는 기업이면 심사 1일, 처음이고 홈페이지도 제대로 되어 있지 않은 경우 심사가 2달까지도 갔었던 듯.
 개발자 모두 화이팅! 


Apple의 메시지
Hi Junho,

Thank you for your reply. We appreciate your efforts to comply with the App Store Review Guidelines, and we look forward to reviewing your resubmitted app.

Best regards,

App Store Review

Hi,

Thank you for your response. I will resubmit.

Thank you.

Warmest Regards,
Junho.

Apple의 메시지

Hi,

Thank you for your response. The new build of the app should be resubmitted for use to continue the review.

Best Regards,

App Store Review

Is there anything I can help you with more? :)

warmest Regards,
Junho.

Hi Junho,

Thank you for your reply. We appreciate your efforts to comply with the App Store Review Guidelines, and we look forward to reviewing your resubmitted app.

Best regards,

App Store Review

Hi,

"ReSwift" was used for changing the screen only. Therefore We've removed ReSwift that is working correctly except the Achieve function of Xcode.

Thank you.
Best regards
Junho.

Apple의 메시지
Hi,

Thank you for your response. What are you using the “ReSwift” library for in the app?

Best Regards,

App Store Review

I appreciate your advice. We remove all if the module to prevent user interaction before/after network connecting and Removing cloud kit. The user can play whenever GameCenter is connected or not. And We support only ARM64+ because of the related library titled "ReSwift," which cannot support ARMv7. Please see the version of the 0.10 binary.

Thank you.
Best regards
Junho.

Apple의 메시지

We discovered one or more bugs in your app when reviewed on iPhone running iOS 13.1.2 on Wi-Fi.

Specifically, the app freezes at startup.

Next Steps

To resolve this issue, please run your app on a device to identify any issues, then revise and resubmit your app for review.

If we misunderstood the intended behavior of your app, please reply to this message in Resolution Center to provide information on how these features were intended to work.

For new apps, uninstall all previous versions of your app from a device, then install and follow the steps to reproduce the issue. For updates, install the new version as an update to the previous version, then follow the steps to reproduce the issue.

Resources

For information about testing your app and preparing it for review, please see Technical Note TN2431: App Testing Guide.

For a networking overview, please review About Networking.


앱스토어 메세지

I appreciate your advice. We remove the module to prevent user interaction before network connecting. First of all, the user can play whenever GameCenter is connected or not. After 6th version is ready to test, we will test it again.

Thank you.
Best regards
Junho.

Apple의 메시지

We discovered one or more bugs in your app when reviewed on iPad running iOS 12.4 on Wi-Fi.

Specifically, the app freezes after startup.

Next Steps

To resolve this issue, please run your app on a device to identify any issues, then revise and resubmit your app for review.

If we misunderstood the intended behavior of your app, please reply to this message in Resolution Center to provide information on how these features were intended to work.

For new apps, uninstall all previous versions of your app from a device, then install and follow the steps to reproduce the issue. For updates, install the new version as an update to the previous version, then follow the steps to reproduce the issue.

Resources

For information about testing your app and preparing it for review, please see Technical Note TN2431: App Testing Guide.

For a networking overview, please review About Networking.



Please see attached screenshot for details.



'Blog History' 카테고리의 다른 글

개 발 일 지 027  (0) 2019.11.20
개 발 일 지 026  (0) 2019.11.20
개 발 일 지 024  (0) 2019.11.18
개 발 일 지 023  (0) 2019.11.18
개 발 일 지 022  (0) 2019.11.17

!-- 무서웡

광고 식별자

이 앱에서 광고 식별자(IDFA)를 사용합니까?
광고 식별자(IDFA)는 각 iOS 기기의 고유한 ID로서 타깃 광고를 게재할 수 있는 유일한 방법입니다. 사용자는 자신의 iOS 기기에서 타깃 광고를 제한하도록 선택할 수 있습니다.




아니요
광고 식별자(IDFA) 사용에 대해 올바른 답변을 선택했는지 확인하십시오. 앱에 IDFA가 포함되어 있고 아니요를 선택한 경우에는 해당 바이너리가 영구적으로 거부되며 다른 바이너리를 제출해야 합니다.



!-- MAC에서 아스텔 앤 컨 파일 이동 잘 된다. 

https://www.android.com/filetransfer/
요거 깔긴 해야 함.

!-- 안드로이드 스튜디오 결국 깐다.
https://developer.android.com/studio/?gclid=EAIaIQobChMIwvCysvHy5QIVU6SWCh2-2wqPEAAYASAAEgJkcvD_BwE

소스 탐색 때문에 ㅠㅠ 개발 안할거임... 

!-- 개발자라 별 필요 없다지만 이제 어느 정도는 알아야 할 나이라...

From <http://outstanding.kr/%EC%9D%B8%ED%84%B0%EB%84%B7-%EB%B9%84%EC%A6%88%EB%8B%88%EC%8A%A4-%EB%AA%A8%EB%8D%B8%EC%9D%98-%EB%AA%A8%EB%93%A0-%EA%B2%83/


광고, 부분 유료화, 수수료, 일회성 판매, 구독 등 고민 하던 내용을 잘 정리하셨네.







유료화에 대한 고민. 이 고민에서 나온 인터페이스가 본인과 연결된다면 연봉 상승의 이유가 되겠지.

인터넷기업 창업자가 사업을 하면서
가장 많이 듣는 게 “비즈니스 모델이 무엇이냐”는
질문일 것입니다.
 
사실 수익화란 ‘먹고사니즘’을 해결하고
기업의 영속성을 보장한다는 측면에서 
중요성이 크고
 
특히 인터넷산업의 경우 
최첨단이라는 이미지가 강해
더욱 호기심을 자극하리라 보는데요.
 
인터넷 비즈니스 모델을 쉽게 분류하자면
크게 세 가지로 나눌 수 있습니다.
 
바로 유료화/부분유료화, 광고, 수수료입니다.
 
그러면 구체적으로 어떤 게 있는지
하나하나 살펴볼까요? 
 
(정리=아웃스탠딩)
 
유료화 모델
 
일반재화에 관한 거래처럼
서비스 및 용역 제공에 대해
대가를 받는 것입니다.
 
안착하기까지 굉장히 어려우나
만약 일정 고객층 및 팬덤을 형성한다면
안정적인 수익을 얻을 수 있죠.
 
*일회성
 

(사진=애플)
 
패키지형 소프트웨어가 대표적입니다.
 
한번의 결제로 라이센스를 받아
장기간, 혹은 무한정 쓰는 것이죠. 
 
쇼핑몰 자체 상품판매, 외주작업 또한 
여기에 속한다고 할 수 있습니다.
 
*정기구독
 

(사진=가비아)
 
요즘 들어서는 일회성보다는 
구독 모델이 더욱 대중화됐는데요.
 
온라인게임, 온라인뉴스, 
스트리밍 서비스, 서버 인프라 임대, 
SaaS(온라인 기반 서비스형 소프트웨어)에
월간 이용료를 부과하는 식입니다.
 
그리고 전자상거래 분야에서는
화장품, 꽃 등 큐레이션 배송상품이
섭스크리션으로 처리되기도 하죠.
 
인터넷 및 클라우드 환경의 발전과
고수익 창출에 대한 집념이
이를 구현하지 않았나 싶습니다.
 
부분유료화 모델
 
일회성이든, 정기적이든
서비스를 사용하는 데 무조건 돈을 내야 한다면
독점적 위치가 아닌 이상
이용률 확장에 어려움을 겪기 마련입니다.
 
그래서 구상된 게 부분유료화인데요.
 
기본적으로 대부분 기능을 오픈하되
핵심기능에 대해서만 유료화를 하는 것이죠.
 
흔히 핵심기능을
‘페인포인트(불편함)’로 설정합니다.
 
불편함을 해소하고 싶으면 
돈을 내라는 의미죠.
 
물론 강도에 따라 이용자의 불만은
정비례하기 마련입니다.
 
*부분유료화 – 핵심자원 및 아이템
 

(사진=엔씨소프트)
 
가장 대표적으로는
핵심자원 및 아이템에 대한
결제를 들 수 있습니다.
 
이는 게임 분야에서
광범위하게 활용되는데요.
 
핵심자원 및 아이템이 없어도
게임을 즐길 수 있지만
만약 갖고 있다면
자신의 캐릭터가 다른 이용자보다
우위에 설 수 있도록 도와주죠.
 
*부분유료화 – 콘텐츠 활용범위
 

(사진=레진엔터테인먼트)
 
이 또한 게임 분야에서 많이 쓰이고
웹툰, 동영상 등 스토리 연속성을 지닌
엔터테인먼트 분야에서도 쓰이곤 합니다.
 
어디부터 어디까지는 공짜로 볼 수 있는데
어디부터 어디까지는 돈을 내라는 것이죠.
 
*부분유료화 – 플레이시간
 

(사진=선데이토즈)
 
크게 다르지 않습니다.
 
플레이시간을 한정적으로 설정하고
추가 요청분에 대해 과금합니다.
 
‘카카오 게임하기’의 하트를 생각하면
이해하기 쉬우리라 생각합니다.
 
*기부모델 
 

(사진=아프리카TV)
 
다른 부분유료화 상품과는 다르게
모든 기능을 100% 오픈하고 
이용자로부터 자발적 기부를 받는 것입니다. 
 
어떻게 보면 그다지 합리적이지 않은
비즈니스 모델이라 할 수 있는데요. 
 
예상 외로 창작자에 대한 팬덤과 소통 니즈,
편리한 결제환경에 힘입어 꽤 각광받고 있습니다. 
 
다음 뉴스펀딩, 아프리카TV 별풍선 등이 
좋은 예시입니다. 
 
광고 모델
 
TV, 라디오처럼 인터넷도
하나의 미디어라 가정을 하고
이용자 활동공간 및 시야반경에
광고를 싣는 것입니다.
 
수익발생은 바로 이뤄지지만
가장 부익부 빈익빈이 큰 모델입니다.
 
구글과 네이버처럼
특정 시장을 장악한 업체는
떵떵거리며 돈을 벌 수 있는 반면
중소 버티컬 사이트들은
인건비조차 맞추기 어렵죠.
 
*검색광고
 

(사진=네이버)
 
가장 큰 시장을 형성하고 있고
가장 수익성이 검증된 광고상품입니다.
 
통상 검색엔진 및 오픈마켓 사이트
검색결과 최상단에 붙곤 하는데요.
 
이용자의 의도와 상품이
상당히 일치돼 효율이 높다는 점,
 
클릭당 과금이 이뤄진다는 점,
 
경매방식으로
노출순서가 결정된다는 점 등에 힘입어
나날이 시장 규모가 커지고 있습니다. 
 
*디스플레이광고
 

(사진=네이버)
 
이미지 형태로
특정 공간을 차지하고 있는,
가장 일반적인 형태의 광고상품입니다.
 
이용자 의도와 상품이
일치되지 않는다는 점에서
성장이 예상보다 더딘 동시에
가장 많은 비판을 받고 있는데요. 
 
그래서인지 검색광고와 비교해
상당히 큰 수익격차를 보이고 있습니다.
 
*이메일광고
 

(사진=아웃스탠딩)
 
아마 모든 광고상품 중에서
가장 많은 욕을 먹고 있는 상품일 것입니다.
 
말 그대로 이메일로
광고를 노출하는 것인데
사생활 영역에 침투한다는 점에서
불쾌감이 매우 크죠.
 
*리워드광고
 

(사진=캐시슬라이드)
 
지난 3~4년간 모바일시장 개화에 맞춰
무섭게 성장한 광고상품이죠.
 
이용자가 앱다운로드, 앱실행 등
특정 액션을 할 때마다 보상을 해주는데요.
 
“돈 벌기 위해 광고를 하는 것인데
돈 주고 광고를 하는 게 말이 되냐”는
비판이 존재하지만
 
“1인당 평균 모객비용보다
1인당 평균 과금비용이 높으면 된다”는
반론에 따라 여전히 활용되는 듯 합니다.
 
*피드형 광고
 

(사진=아웃스탠딩)
 
페이스북, 트위터, 카카오스토리 등
이른바 소셜네트워크서비스 중에서
뉴스피드 중간에 끼어있는 광고입니다.
 
최근 페이스북이 고도화된
데이터 분석 및 입찰시스템을 통해
효과를 크게 올림으로써
엄청나게 각광받고 있죠.
 
공시 및 업계 복수 관계자에 따르면
이미 전세계적으로 매출 10조원을 넘었으며
국내에서도 매출 1000억원을 넘었다고 하니
앞으로 향방에 참 기대됩니다.
 
*콘텐츠형 광고
 

(사진=버즈피드)
 
쉽게 말해 홍보기사라 보면 됩니다.
 
콘텐츠 수준을 크게 높이고
유저 인터페이스와 적절히 매칭시킴으로써
광고 특유의 거부감을 줄이고
소셜네트워크상 공유가 잘 이뤄지도록
설계를 하는 게 핵심입니다.
 
해외에서는 버즈피드와 같은
콘텐츠 큐레이션 업체 중심으로
빠르게 확산되고 있으며
국내에서도 여러 뉴미디어 및
광고 에이전시 업체가 시도하고 있습니다.
 
하지만 성장성에 대해서는
이견이 분분하죠.
 
*동영상광고
 

(사진=유튜브)
 
동영상 플랫폼 이용 시
TV광고와 마찬가지로
콘텐츠 틀기 직전, 혹은 콘텐츠 중간에
광고가 나오는 것입니다.
 
효과는 일단 둘째치고
스트리밍 서비스 확산에 따라
트래픽이 폭증할 것인 만큼
앞으로 전망이 좋다고 볼 수 있습니다.
 
수수료 모델
 
수요자와 공급자를 연결해주고
중간에서 수수료를 떼는 모델입니다.
 
거간꾼이라 할 수 있죠.
 
거래액을 나누는 형태라
수익성은 광고보다 좋은 반면
 
방대한 이용률,
플랫폼과 콘텐츠 간의 협업구조가
담보되지 않는다면
성과를 보기 힘들 수도 있습니다.
 
*이커머스 중개
 

(사진=지마켓)
 
네이버 지식쇼핑, 지마켓, 옥션,
티켓몬스터, 쿠팡, 배달의민족 등이
여기에 해당합니다.
 
백화점 혹은 시장처럼
외부 판매자를 플랫폼에 입점시키고
거래가 일어났을 때 8~20% 가량
수수료를 떼는 식이죠.
 
*콘텐츠 및 서비스 중개
 

(사진=구글플레이)
 
구글플레이, 애플 앱스토어,
카카오 게임하기, 카카오 페이지,
네이버 엔스토어, 우버가 대표적입니다.
 
콘텐츠 및 서비스에 대한 거래가 일어났을 때
최대 30%까지 수수료를 떼는 식이죠.
 
*광고 중개
 

(사진=카울리)
 
광고랩사, 광고대행사, 광고 네트워크 업체도
분업화된 시스템 속에서
광고비 일부를 수수료로 가져갑니다.
 
*결제 중개
 

(사진=다날)
 
결제업체 또한 보유하고 있는 솔루션을
일회성, 혹은 구독모델로 팔기보다는
거래액 일부를 수수료로 떼어갑니다.
 
돈의 흐름 중간에 있다는 점을
활용하는 게 아닐까 생각됩니다.




!-- 또 다른


From <http://yslab.kr/35>  

IT업계 수익모델 총정리
8개월 전 by 웹기획자 조영수
그 동안의 경험을 바탕으로 IT업계의 수익모델을 간단하게 정리해봤습니다.
신규사업을 기획하거나 현재 운영중인 서비스의 새로운 수익모델(BM)을 찾을 때 참고하시기 바랍니다. 




B2C

광고 
트래픽을 기반으로 광고주와 사용자를 연결하는 형태

 디스플레이 광고  노출 당 과금   네이버
 키워드 광고  클릭 당 과금   네이버 
 동영상 광고  노출 당 과금  판도라TV 
 채용 광고  위치 당 과금  잡코리아 

상품 판매 
상품 제작자 or 도소매 업자들이 자사 서비스를 통해 상품을 직접 판매하는 형태

 종합 몰  상품 판매수익  GS SHOP
 소셜커머스  상품 판매수익  쿠팡, 티몬, 위메프
 도서  도서 판매수익  YES24
 의류  의류 판매수익  멋남
 여행  여행상품 판매수익  하나투어
 교육  교육콘텐츠 판매수익  메가스터디 
 차량  렌터카 판매수익  금호렌터카 
 이미지  이미지 판매수익  아사달 

중개 수수료 (플랫폼) 
구매자와 판매자를 한 곳에서 거래할 수 있도록 지원하는 형태

 상품 중개 (오픈마켓)  판매액의 6~12%   11번가
 상품 중개 (소셜커머스)  판매액의 8~25%  티켓몬스터
 지불 중개 (PG사)  거래액의 2~4%  이니시스
 여행상품 중개  판매수수료  인터파크투어
 호텔 중개  판매액의 7~20%  호텔엔조이 
 펜션 중개   판매액의 10~18%  민박넷
 레포트 중개  판매수수료  해피캠퍼스 
 유료 앱 중개  판매액의 30%   앱스토어 

라이선스 
사용자들이 서비스를 이용한 양, 빈도, 시간 등에 따라 요금을 지불하는 형태

 음악 라이선스  월정액, MP3 다운로드   멜론
 게임 라이선스  월정액  월드오브워크래프트 
 서버임대 라이선스  월정액, 서버구매   카페24 
 웹호스팅 라이선스  월정액  카페24
 그룹웨어 라이선스  월정액  팀오피스
 회원 라이선스  유료회원   랭키닷컴
 프로그램 라이선스  구매  포토샵

사이버머니 
실제화폐는 아니지만 사이버 공간에서 사용할 수 있는 돈을 구매하는 형태

 별풍선  별풍선10개 1,000원  아프리카TV 
 도토리  도토리1개 100원  싸이월드 
 파일 다운로드  캐시10,000개 10,000원  파일노리 


B2B

광고 플랫폼 
광고주를 직접 모집하고 제휴사를 통해 광고를 배포하는 형태

 디스플레이/키워드 광고  제휴사 광고매출의 10~20%  구글 애드센스
 모바일 광고  제휴사 광고매출의 10~20%  애드몹 
 모바일 광고 (자체 서비스)  회원과 수익쉐어  애드라떼
콘텐츠 제공 
저작권이 해결 된 콘텐츠를 기업에게 제공하는 형태

 뉴스  콘텐츠 제공비  아시아경제
 방송 콘텐츠  콘텐츠 제공비  iMBC
 여행 콘텐츠  콘텐츠 제공비  하나투어
 지도 API  정해진 트래픽을 초과하면 과금   구글

정보 중개 (데이터 판매) 
서비스 이용패턴, 구매습관 등의 정보를 수집하여 이를 가공하여 판매하는 형태

 인터넷 순위  유료회원 가입비  랭키닷컴
 트렌드분석  리서치, 컨설팅 의뢰비  코리안클릭
 설문조사  설문조사비   서베이몽키

마케팅 지원 
고객의 목표 달성을 위해 마케팅을 대행하는 형태

 광고대행  광고대행비  NBP (NHN Business Platform)
 블로그 운영  블로그 운영대행비  클렉스
 이메일 광고  타겟맞춤 메일발송비  썬더메일


솔루션 판매 
시장에서 요구하는 솔루션을 기본형태로 구축하고, 고객의 니즈에 맞게 커스터마이징 하는 형태

 쇼핑몰  설치비, 호스팅비, 커스터마이징비  카페24
 소셜커머스 솔루션  설치비, 호스팅비, 커스터마이징비  원데이넷 
 로그분석  설치비, 월 사용료  에이스카운터
 대량메일 솔루션  설치비, 월 사용료  레몬메일
 문자발송 솔루션  설치비, 사용량에 따라 과금  엠포 
 실명인증 솔루션  기본료, 사용량에 따라 과금  아이디체크
 
납품 
고객의 요구에 맞춰 웹서비스를 제작하는 형태

 B2C 성격의 웹&모바일 서비스 제작  상호 계약에 의해 결정  웹에이전시 
 B2B 성격의 웹&모바일 서비스 제작   상호 계약에 의해 결정  SI 
 

아웃스탠딩 자료 (바로가기)

비즈니스 모델 대표유형 예시
유료화/부분유료화  일회성 결제  소프트웨어 라이선스, 상품 판매, SI 용역
 정기구독  온라인 게임, 온라인뉴스, 스트리밍 서비스, 호스팅 임대, 큐레이션 커머스, Saas
 핵심자원 부분유료화  온라인 게임
 콘텐츠 활용범위 부분유료화  온라인게임, 웹툰
 플레이시간 부분유료화  온라인게임, 음원
 기부모델  개인방송, 크라우드 펀딩
광고  검색광고  파워링크, 프리미엄 링크
 디스플레이 광고  네이버 메인광고, 구글 애드센스
 이메일광고  프로모션 광고
 리워드광고  캐시슬라이드, 애드라떼
 피드형 광고  페이스북, 트위터, 카카오스토리
 콘텐츠형 광고  버즈피드, 피키캐스트
 동영상광고  유튜브, 판도라TV
중개  이커머스&O2O 중개  옥션, 지마켓, 티켓몬스터, 쿠팡, 11번가, 배달의민족, 요기요
 콘텐츠 및 서비스 중개  앱스토어, 구글플레이, 우버, 그랩택시


제대로 된 표는 링크 원문에서 보길 바라고
여기선 키워드만 얻어 갔으면 한다.

보통 인터넷 글은 링크 깨지는게 너무 많아서 ㅋ 이것도 소중한 자료가 될 것을 의심치 않는다.

'Blog History' 카테고리의 다른 글

개 발 일 지 026  (0) 2019.11.20
개 발 일 지 025  (0) 2019.11.20
개 발 일 지 023  (0) 2019.11.18
개 발 일 지 022  (0) 2019.11.17
개 발 일 지 021  (0) 2019.11.15

!-- 스터디 https://developer.apple.com/tutorials/swiftui/tutorials

스냅킷 안써도 되어서 좋다. 물론, 스냅킷 좋긴 해도 라이브러리고 최신 기술은
아류들이 자꾸 개선하는 것 보다 한 곳에 통합 관리하는게 좋다.

    // MARK: UISceneSession Lifecycle

    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        // Called when a new scene session is being created.
        // Use this method to select a configuration to create the new scene with.
        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
    }

앱 델리게이트는 요렇

//  UISceneSession.h
//  UIKit
//
//  Copyright © 2019 Apple Inc. All rights reserved.
//

@available(iOS 13.0, *)
open class UISceneConfiguration : NSObject, NSCopying, NSSecureCoding {

쟨 요렇게

UIApplicationSceneManifest

UIApplicationSupportsMultipleScenes

UISceneConfigurations

UIWindowSceneSessionRoleApplication


UISceneConfigurationName
Default Configuration
UISceneDelegateClassName
$(PRODUCT_MODULE_NAME).SceneDelegate






얜 또 이렇게 씬은 또

{
        // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
        // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
        // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).

        // Get the managed object context from the shared persistent container.
        let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

        // Create the SwiftUI view and set the context as the value for the managedObjectContext environment keyPath.
        // Add `@Environment(\.managedObjectContext)` in the views that will need the context.
        let contentView = ContentView().environment(\.managedObjectContext, context)

        // Use a UIHostingController as window root view controller.
        if let windowScene = scene as? UIWindowScene {
            let window = UIWindow(windowScene: windowScene)
            window.rootViewController = UIHostingController(rootView: contentView)
            self.window = window
            window.makeKeyAndVisible()
        }
    }

이렇게 가는 것을 보며, SiwftUI 최종판은 3D 와 애니매이션이 자연스레 결합된 것이겠구나 라는 생가이 들었다.

NS 이름을 여전히 쓰는 것을 보면, 결국 Objective-C 의 잔재가 남는 다는 거고 3D 영역은 C에서 벗어나기가 상당히

어려운 분야다.


뭐, 앱 연동이 되고 3D 앱이던 게임이던 서버/클라이언트 모델이던 메신저던 webRTC 던...
임베디드 운영체제의 제약 덕에 효율적인 "나눔"이 가능했고 하드웨어가 더 발전하더라도
그 효율성은 그대로 것이 좋다.
쓸대없는 통합보다 카테고리라이즈가 잘 된 앱들이 유기적으로 연결되는 것이 사용성에 더 도움이 된다는 뜻이다.
가령 카카오톡과 가가오 스토리는 앱 자체는 나눠져 있는게 더 편하지 않은가?

내가 생각한 방향성이 틀리지는 않았을테지만 flat UI 도 좀 질려가던 차에 잘되었다는 생각이다.


import Foundation
import UIKit
import _SwiftUIKitOverlayShims


@available(iOS 13.0, *)
open class UIWindowScene : UIScene {

    
    open var screen: UIScreen { get }

    open var interfaceOrientation: UIInterfaceOrientation { get }

    open var coordinateSpace: UICoordinateSpace { get }

    open var traitCollection: UITraitCollection { get }

    
    // Restrictions which the system should use when resizing the scene. This property will be NULL on platforms which don't support scene resize, else a mutable object is returned which the client may customize.
    @available(iOS 13.0, *)
    open var sizeRestrictions: UISceneSizeRestrictions? { get }

    
    // The array of all windows associated with this UIWindowScene
    open var windows: [UIWindow] { get }
}

@available(iOS 13.0, *)
public protocol UIWindowSceneDelegate : UISceneDelegate {

    
    optional var window: UIWindow? { get set }

    
    optional func windowScene(_ windowScene: UIWindowScene, didUpdate previousCoordinateSpace: UICoordinateSpace, interfaceOrientation previousInterfaceOrientation: UIInterfaceOrientation, traitCollection previousTraitCollection: UITraitCollection)

    
    // Called when the user activates your application by selecting a shortcut on the home screen,
    // and the window scene is already connected.
    optional func windowScene(_ windowScene: UIWindowScene, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void)

    
    // Called after the user indicates they want to accept a CloudKit sharing invitation in your application
    // and the window scene is already connected.
    // You should use the CKShareMetadata object's shareURL and containerIdentifier to schedule a CKAcceptSharesOperation, then start using
    // the resulting CKShare and its associated record(s), which will appear in the CKContainer's shared database in a zone matching that of the record's owner.
    optional func windowScene(_ windowScene: UIWindowScene, userDidAcceptCloudKitShareWith cloudKitShareMetadata: CKShareMetadata)
}
extension UISceneSession.Role {

    
    @available(iOS 13.0, *)
    public static let windowApplication: UISceneSession.Role

    
    // A session role which defines an interface for a non-main external display
    @available(iOS 13.0, *)
    public static let windowExternalDisplay: UISceneSession.Role
}
extension UIWindowScene {

    
    @available(iOS 13.0, *)
    public enum DismissalAnimation : Int {

        
        case standard

        case commit

        case decline
    }
}

@available(iOS 13.0, *)
open class UIWindowSceneDestructionRequestOptions : UISceneDestructionRequestOptions {

    open var windowDismissalAnimation: UIWindowScene.DismissalAnimation
}

@available(iOS 13.0, *)
open class UISceneSizeRestrictions : NSObject {

    
    open var minimumSize: CGSize

    open var maximumSize: CGSize
}

이래나 저래나 신규 과제는 iOS 13+ 로 타게팅을 해야 겠네.



!-- 명기(名器)


- 스트라디바리우스, 과르니에리, 아마티, 스타인웨이앤선스 등 음악의 세계에서는 명기(名器)가 있고 이들만 고집하는 아티스트들이 있다.
개발자도 많은 툴들을 이용하는데 왜 멀티플랫폼만 하라고 할까?


!-- 에러 해결 keyword
[sourceString dataUsingEncoding:NSUTF8StringEncoding];




upload(multipartFormData: { (multipartFormData) in
if let i = image, let imageData = i.jpegData(compressionQuality: 0.5), let name = imageName {
multipartFormData.append(imageData,
withName: name,
fileName: "swift_file\(arc4random_uniform(100)).jpeg",
mimeType: "image/jpeg"
)


NSCameraUsageDescription
카메라를 사용합니다.
NSPhotoLibraryUsageDescription
앨범을 사용합니다.

+ NSPhotoLibraryAddUsageDescription

https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW73


!-- 사진 여러장

https://github.com/hyperoslo/Gallery



'Blog History' 카테고리의 다른 글

개 발 일 지 025  (0) 2019.11.20
개 발 일 지 024  (0) 2019.11.18
개 발 일 지 022  (0) 2019.11.17
개 발 일 지 021  (0) 2019.11.15
개 발 일 지 020  (0) 2019.11.13

결론 : 타임스탬프는 64비트로 꼭 찍자.

 

2038 문제(2038년 1월이 되면 시간이 다시 초기화 되는 문제) 때문에

 

https://ko.wikipedia.org/wiki/2038%EB%85%84_%EB%AC%B8%EC%A0%9C

& 나무위키

유닉스 시간에 32비트 정수형을 쓰는 모든 컴퓨터의 시계가 UTC 0 기준으로 2038년 1월 19일 3시 14분 7초[1](대한민국 표준시 UTC+9 기준으로 2038년 1월 19일 12시 14분 7초)가 지나는 순간 음수값이 적용돼 1901년 12월 13일 20시 45분 52초나, 자동으로 오류를 감지하고 초기값인 0, 즉 1970년 1월 1일 0시 0분 0초로 돌아가게 되는 버그를 칭한다. 영어론 Year 2038 problem, Unix Millennium bug 등으로 표기한다.

원인은 프로그래머라면 알아야만 하는 오버플로 현상 때문이다.


안드로이드 스마트폰을 가지고 있다면 이 버그를 미리 체험해볼 수 있다. 단, 안드로이드 7.1.2 이하의 기기에서 재현이 되며 안드로이드 8.0 이후부터는 버그 재현이 불가능하다. 만약 안드로이드 7.1.2 버전 이하가 탑재된 기기의 경우 구글 캘린더로 일정을 2038년 1월 19일에 추가해 주면 추가된 날짜가 1970년으로 변한다.

단, 요즘은 7.1 이하의 일부 기기에서도 정상적으로 날짜 추가가 되는걸로 보아, 안드로이드 운영체제 자체의 문제가 아닌 구글 캘린더 자체의 문제로 판단되며, 현재는 구글이 캘린더 앱 자체를 수정한 것으로 보인다. 화웨이와 샤오미의 캘린더는 일정을 2037년 12월 31일까지만 설정할 수 있으며, Samsung Experience 8.1의 캘린더와 LG의 캘린더는 2036년 12월 31일까지 설정이 가능하다.

 

64비트로 

print(UInt64.max)

 

18446744073709551615

int64는

9223372036854775807

 

int64를 365일로 단순 계산하니

 

 

그래프를 그리려고 하니.

Double이 나은 듯.

3.4028235e+38

 

print(Double(UInt64.max))

1.8446744073709552e+19

19자리 보다는 38자리가 낫겠지.

 

64비트에서는 CGFloat과 Double 은 같으니 또 좋고.

'Blog History' 카테고리의 다른 글

개 발 일 지 024  (0) 2019.11.18
개 발 일 지 023  (0) 2019.11.18
개 발 일 지 021  (0) 2019.11.15
개 발 일 지 020  (0) 2019.11.13
개 발 일 지 018  (0) 2019.11.12

!-- 넋두리

아직 주변에 많다.
전설적인 맥 프로그래머 스콧 내스터는 그의 저서에 절차적인 프로그래밍은 함수를 기반으로 하고 데이터는 그 함수 주위를 맴돈다고 했다. 객체 지향에서는 그 반대로 데이터가 중심에 있는 것으로 보고 함수가 데이터 주위를 돈다고 했다.
객체 지향을 제대로 이해하지 못하고 그 다음 단계부터 공부하는 사람들이 잘못 설명하는 이유.
Objective-C도 하지 않고 Swift 나왔으니 달라 붙어 열심히 공부하고 헛소리 하는 강사가 있는 이유.(겸손하기라도 하던가)
어셈블리, 하드웨어 동작 원리도 모르고 그 위에 도는 소프트웨어 이론만 역설하다가 망한 엔지니어가 많은 이유.
OS 의 스케쥴러와 큐를 이해하면 react 를 이해할 수 있고 프레임웍 없이 스스로 구현할 수 있는데 무조건 최신 기술이라며
내부 동작 원리 모르고 울부짖는 개발자...

!-- SWIFT UI

스냅킷 관련해서 브런치에 연제 한 적이 있는데,
private let dateFormatter: DateFormatter = {
    let dateFormatter = DateFormatter()
    dateFormatter.dateStyle = .medium
    dateFormatter.timeStyle = .medium
    return dateFormatter
}()

자동 생성된 이 코드를 보면 이제 iOS에 스냅킷이 들어 간 것 같다.


!-- SQLite3 version은 스위프트에 내장됨.

Latest Release
Version 3.30.1 (2019-10-11). Download Prior Releases
현재 최신 


!-- 한 번 더 읽고 싶은 아티클 
https://medium.com/hashed-kr/homomorphicencryption-blockchain-d783becbaabb
https://www.zdnet.co.kr/view/?no=20181119175602
https://www.zdnet.co.kr/view/?no=20181121114539
http://weekly.chosun.com/client/news/viw.asp?nNewsNumb=002501100014&ctcd=C05
http://imdarc.math.snu.ac.kr/board_apmJ27/3058
http://www.math.snu.ac.kr/~jhcheon/xe2/index.php?mid=page_HsUX68
http://www.math.snu.ac.kr/~jhcheon/xe2/index.php?mid=page_fVCc23
https://blog.naver.com/PostView.nhn?blogId=n_privacy&logNo=221460985974&parentCategoryNo=&categoryNo=45&viewDate=&isShowPopularPosts=true&from=search
https://www.noblesse.com/home/news/magazine/detail.php?no=7520
https://www.boannews.com/media/view.asp?idx=79884&kind=&sub_kind=
http://wiki.hash.kr/index.php/%EB%8F%99%ED%98%95%EC%95%94%ED%98%B8
https://blog.lgcns.com/2045

!-- error: UIStackView before iOS 9.0 [6]

레거시 코드 싫다... 코드 뿐 아니라 다른 사람에게 중요한데 나에게 실은 것도 세상에 많다.


EAP-PEAP   MSCHAPv2


UIImagePickerControllerSourceTypePhotoLibrary
UIImagePickerControllerSourceTypeCamera

!-- swiftUI도 보는 중(IB에서 스냅킷에서 더 진화해서 좋긴 한데 ... 이제 안 바뀌겠지? 게임도 만들어서 짜증인데
행여나 바뀌어도 걍 레거시 코더가 되어야겠다)

This app is not allowed to query for scheme


//
//  ContentView.swift
//
//  Created by Junho HA on 2019/11/15.
//  Copyright © 2019 hajunho.com. All rights reserved.
//

import SwiftUI

struct ContentView: View {
    
    var body: some View {
        Button(action: {
            btnClick()
        }) {
             Text("Open anotherApp")
             }
    }
}

func btnClick() {
    print("onClickBTN")
    guard let s = URL(string : "dple://") else {
        return }
    
    if UIApplication.shared.canOpenURL(s) {
        UIApplication.shared.open(s, options: [:]) { (b ) in
            print(b)
        }
    }
    
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}


LSApplicationQueriesSchemes

dple


생각보다 SwiftUI 괜찮다.

그리고 아이폰 앱에서 다른 앱 실행 코드를 넣어서 테스트 해 보니 잘 되네.


'Blog History' 카테고리의 다른 글

개 발 일 지 023  (0) 2019.11.18
개 발 일 지 022  (0) 2019.11.17
개 발 일 지 020  (0) 2019.11.13
개 발 일 지 018  (0) 2019.11.12
개 발 일 지 017  (0) 2019.11.12

root@ubuntu:~/Downloads/HEAAN-master/HEAAN/src# ls *.cpp
BootContext.cpp     Key.cpp             SchemeAlgo.cpp          StringUtils.cpp
Ciphertext.cpp      Plaintext.cpp       Scheme.cpp              TestScheme.cpp
EvaluatorUtils.cpp  Ring.cpp            SecretKey.cpp           TimeUtils.cpp
HEAAN.cpp           RingMultiplier.cpp  SerializationUtils.cpp
root@ubuntu:~/Downloads/HEAAN-master/HEAAN/src# ls *.cpp | wc -l
15

 

RingMultiplier 빈번히 호출

 

StringUtils

TestScheme

Timeutils

 

 

'Blog History' 카테고리의 다른 글

개 발 일 지 022  (0) 2019.11.17
개 발 일 지 021  (0) 2019.11.15
개 발 일 지 018  (0) 2019.11.12
개 발 일 지 017  (0) 2019.11.12
개 발 일 지 016  (0) 2019.11.11

!-- 0

제목 [Retrica] 프랑스어 CS 대응
회사명 Retrica, Inc.
회사소개 Retrica is a live-filter camera app with over 350M global downloads
(Retrica는 전세계 3억5천만이상 다운로드된 필터카메라 앱입니다.)
회사 홈페이지 http://www.retrica.co
업무 내용 - Customer Service for French. (프랑스어 유저의 CS 대응)
- QA for the language translation in French / (프랑스어 번역 검수)
업무 기간 3개월

12개월 (상황에 따라 변동 가능); 자유로운 업무시간
보수 인터뷰 후 업무시간과 맞춰서 정확한 금액 책정
지원자격 - Native in French ( 프랑스어가 모국어인 사람)
- Communicable in Korean or English (한글 혹은 영어로 소통 가능한 사람)
- Love taking Photos incl. selife (사진 혹은 셀카 찍는 것을 좋아하는 사람)
- knows and loves Retrica (Retrica 앱을 알고, 좋아하는 사람)
업무장소 삼성역
모집기간 2Q

3Q 2017
제출서류/접수방법 hello@retrica.co 으로 이력서 전송
담당자 • 담당자명 Sophie (최수빈)
• 이메일 sophie@retrica.co
• 연락처 010-8968-0855

관심있어 캡쳐

!-- 1

학생들에게 쓴 돈 계산 2019년도 정산(10월 말)

가방, 신발, 지갑,
5만원 x 6 = 30만
5만원 x 6 = 30만
2만원 x 10 = 20만
피자20, 치킨 18, 횟집 44, 80, 40, 80, 60, 2, 30, 60, 9, 11

!-- 2

한양대와 암호 프로젝트 진행...

C:\Users\하준호>cl a.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23918 for x86
Copyright (C) Microsoft Corporation. All rights reserved.

a.cpp
F:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\xlocale(341): warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc
F:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\exception(359): warning C4577: 'noexcept' used with no exception handling mode specified; termination on exception is not guaranteed. Specify /EHsc
Microsoft (R) Incremental Linker Version 14.00.23918.0
Copyright (C) Microsoft Corporation. All rights reserved.

/out:a.exe
a.obj
LINK : fatal error LNK1104: cannot open file 'libcpmt.lib'

set LIB=F:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib
set LIB=C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib\x64;%LIB%

Set LIB=C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10586.0\ucrt\x86;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib\x86;F:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10586.0\um\x86

분석하고 있는 헤더 NTL +

return 0;

 algorithm



 iostream



 iterator



 numeric



 sstream



 fstream



 cassert



 climits



 cstdlib



 cstring



 string



 cstdio



 vector



 cmath



 queue



 deque



 stack



 list



 map



 set



#define foreach(x, v) for (typeof (v).begin() x=(v).begin(); x !=(v).end(); ++x)



#define For(i, a, b) for (int i=(a); i(b); ++i)



#define D(x) cout  #x " is "  x  endl



int main(){



return 0;
i

'Blog History' 카테고리의 다른 글

개 발 일 지 021  (0) 2019.11.15
개 발 일 지 020  (0) 2019.11.13
개 발 일 지 017  (0) 2019.11.12
개 발 일 지 016  (0) 2019.11.11
개 발 일 지 014  (0) 2019.10.15

잠시 밝혀 두지만 내 블로그는 실시간으로 올리는 것이 아니다.

쌓아 둔 글을 시간 날 때 한꺼번에 올리는 식이다.

!--0 기술 면접이 있었다. 면접관 알바가 잦다.

1. 유치원생과 대학생 설명. 설명에서 가장 먼저 고려되어야할 사항은 용어의 명확화 입니다. 내가 쓰는 단어와 상대방이 쓰는 단어의 뜻, 그리고 그 단어에 대하여 서로가 이해하는 부분을 완전히 일치시키지 않으면 이해가 어렵습니다. 이것을 꿰뚫은 답안이 2건 있었습니다. 대학생은 인터넷에서 편히 찾을 수 있는 용어들로 일반적인 설명을 하면 되겠습니다.

2||3. class, object 설명. 메모리에 대한 말이 나와야 합니다. new에 대한 설명이 나오면 정답입니다. 더 나아가 static 키워드까지 나왔으면 가점 입니다.

4. 상속 : 공통적인 부분을 추상화하여 코드양을 줄이면 됩니다. 예제로 든 객체 타입과 추상화 할 때 공통점을 뽑아내는 부분들이 채점 포인트 입니다.

5. 다형성 : 객체 배열, C와 연관 설명(void 포인터), Object 클래스 중 소스에 하나라도 들어 있거나 설명이 있으면 만점 입니다.

6. 인터넷 검색 유도를 위해 만든 설문 입니다. 정답은 모든 것은 API로 설명이 됩니다. 나와 있지 않지만 Instruction Set도 정답입니다. http://www.intel.co.kr/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-2a-manual.pdf

7. 이름을 쓰는 것은 사실 가장 중요한 문항이었습니다. 배우는 단계에서는 잘못 아는 것을 바로 잡으면 더 효과적입니다.. 그러나 배우고 싶지 않은 부분은 제가 도와 드릴 것이 없어요. 그러나 이해 합니다. 왜 이해하는지 제 경험을 말씀해 드리면 학창시절 서울대학, 카이스트 석박사 하시고 영어로 프로그래밍 강의하시던 교수님께 코딩 못한다고 대놓고 말했던 적이 있습니다. 막노동 해서 번 돈으로 IT쪽 유명한 사람들 세미나 들으러 다니던 자존심 때문도 있었지만 결국은 제 인성이 문제였지요. 물론, 그 교수님은 집에도 안 가시고 코딩에 몰두하셔서 나중에는 알고리즘 코딩 분야에 독보적인 분이 되셨습니다. 사실 전, 관심없는 수업 시간에는 좋아하는 프로그래밍 서적을 펴놓고 보며 교수님의 말씀에도 이 수업에는 관심없다던 학생이었고, 두려울게 없던 시절이었습니다. 대신, IT, 임베디드 관련 수업은 타과 청강도 하고 전필도 듣곤 했습니다. 하지만 교수님 사이에 좋지 않은 인성평으로 어떤 교수님은 졸업을 안 시키시려고 전필을 F 주셨지요. 과제는 다 해서 D를 주셔도 될 법도 한데 말이죠. 어떤 교과목은 A+ 3명에 나머지 20명은 전부 F인 과목도 있었으니 이해는 갔습니다. 카이스트 교수님들이 좀 geek한 면이 있으시더라구요. 그러나 졸업을 해야 해서 사정 설명을 드리니 내가 내어주는 산업공학 알고리즘 하나를 3일내에 프로그래밍 해 오면 졸업 시켜주겠다고 해서 48시간동안 물만 먹고 열심히 짜서 겨우 졸업했더랬습니다. 퓨처스 인력중에 자기 과 교수님께도 멋지게 버틸 수 있는 인력이 있다면 저의 학창시절 생각이 나서 정말 좋긴 하겠고, 애착도 많이 갈 것 같습니다. 그러나 살아보니 실력보다 배울려는 자세가 먼저라는 것을 알 수 있었습니다. C, C++, JAVA 등 모든 언어를 하나로 연결시키는 개념을 모르면 스스로 공부하기가 많이 힘이 들고 겉핥기, 테크닉만 배우다가 끝이 날 것입니다. 테크닉이 나쁜 것은 아닙니다. 이해하기 쉽게 해킹으로 따지면 스크립트 키들이라고 보면 되겠습니다.

끝으로, 로테이션이 가능한 기술 분과장 자리를 신설하려고 합니다. 제가 먼저 가르쳐 드리고 기술 전파를 하면 됩니다. 기술 분과장은 계속 바뀔 것이고 2인으로 구성됩니다. 지원자 받습니다.

!--1 double calc = ((total - b) / total);

논리 오류가 났다. real number division error 인데
double calc = ((double)((double)total - (double)b) / (double)total);
드러운 캐스팅 이 후 잘 된다. -> 업 캐스팅 연산으로 해결

!--2 미래 먹거리로 통합 시스템의 DB 로 결국 postgresQL을 선정했다. 운영체제는 당연히 iOS,
RDBMS가 아닌, noSQL로 안 가는 이유는 너무 단순하기도 하고 내가 바로 보는 사업 자체가 NoSQL을
쓸 만큼 큰 건은 없기 때문이다. Dapp 처럼 점 조직으로 나눠야 사회가 제대로 돌아간다는 생각이라...
물론, 나중에 AI로 모든 것을 통합하게 되면 noSQL 쓸 것인데 그것도 아마 나눠서 계산하고 모델만 모으는 것이지.
DB로 통합하는 형태는 아닐거라 생각한다. 

간만에 SQL을 쓰니 구조로 해결 안하고 inner join 만 쌓인다. 

inner join file b on b.num_file=a.numf and b.segnum=a.segfile \
inner join --- c on c.c-----=b.---- and c.----=a.----- \
inner join ------ d on d.-----=a.---- and d.-----=a.------ \
inner join ------ e on e.----=a.----- and e.------=a.-------- \
inner join ---- f on f.-----=a.----- \
where a.------like '%@%%' and a.------ like '%@%%' and a.------ like '%@%%' \
and a.--------- like '%@%%' %@ %@ %@ %@ %@\
order by a.------, a.----- desc, a.-----, a.-------;"

'Blog History' 카테고리의 다른 글

개 발 일 지 020  (0) 2019.11.13
개 발 일 지 018  (0) 2019.11.12
개 발 일 지 016  (0) 2019.11.11
개 발 일 지 014  (0) 2019.10.15
개 발 일 지 013  (0) 2019.10.08

 

모든 프로젝트를 위해서는 결국 DB를 가져야 한다는 사실을 알게 되었다.

 

1.    

2.     라이선스

3.     라이선스 분류

라이선스 분류

The PostgreSQL Licence

PostgreSQL Licence PostgreSQL과 함께 배포되는 라이선스로서, BSD 또는MIT 라이선스와 유사한, 매우 자유로운 라이선스이다

·       버전 :

·       관리기관 : The PostgreSQL Global Development Group

·       라이선스 계열 : BSD

·       웹사이트 바로가기 :

 

주요 내용 한글전문 영문전문 한글/영문비교 법률용어 개발템플릿내용 보기

라이선스 주요내용

라이선스 주요내용

복제, 배포, 수정의 권한 허용

가능

배포시 라이선스 사본 첨부

명시되어있지않음

저작권 고지사항 또는 Attribution 고지사항 유지

가능

배포시 소스코드 제공의무(Reciprocity)와 범위

명시되어있지않음

조합저작물(Lager Work) 작성 및 타 라이선스 배포 허용

가능

수정 시 수정내용 고지

명시되어있지않음

명시적 특허 라이선스의 허용

명시되어있지않음

라이선시가 특허소송 제기 시 라이선스 종료

명시되어있지않음

이름, 상표, 상호에 대한 사용제한

명시되어있지않음

보증의 부인

가능

책임의 제한

가능

주요 특징 및 배포시 의무사항

·       주요 특징 및 배포시 의무사항이 존재하지 않습니다.

 

'Blog History' 카테고리의 다른 글

개 발 일 지 018  (0) 2019.11.12
개 발 일 지 017  (0) 2019.11.12
개 발 일 지 014  (0) 2019.10.15
개 발 일 지 013  (0) 2019.10.08
개 발 일 지 012  (0) 2019.10.07

G Suite Business와 Enterprise 차이

 

 

Google 서비스 추가

G Suite Enterprise

 

G Suite Enterprise는 G Suite Business에서 사용할 수 있는 모든 기능 및 다음과 같은 프리미엄 관리 제어 기능도 제공됩니다.

  • 향상된 드라이브 보안을 제공합니다. 다른 보호 레이어를 추가하여 허용되지 않은 사람들에게 민감한 정보가 공개되는 것을 방지할 수 있습니다. 자세히 알아보기
  • 신용카드 또는 주민등록번호와 같은 민감한 콘텐츠가 이메일 트래픽에 포함되었는지 검사할 수 있습니다. 이러한 콘텐츠가 감지되면 정책 기반의 작업이 수행되도록 설정할 수 있습니다. 자세히 알아보기
  • 이미지에 텍스트가 포함되었는지 검사할 수 있습니다. 스캔한 이미지에서 기밀 데이터 손실을 식별하여 완화할 수 있습니다. 자세히 알아보기
  • 고급 및 맞춤 검색어를 사용하여 BigQuery의 Gmail 로그를 분석할 수 있습니다. 자세히 알아보기
  • 사용자가 계정에 로그인할 때 보안 키를 요구하도록 설정할 수 있습니다. 자세히 알아보기
  • S/MIME 암호화를 사용하여 이메일 보안을 강화할 수 있습니다. 자세히 알아보기
  • 의심스러운 이벤트가 감지되면 트리거되는 맞춤 규칙 설정으로 휴대기기 관리 작업을 자동화합니다. 자세히 알아보기
  • 업무 인사이트를 제공합니다. 조직의 의사결정권자가 G Suite 채택, 생산성, 팀 간 공동작업에 대한 데이터 기반 통계에 액세스할 수 있습니다. 자세히 알아보기

'Blog History' 카테고리의 다른 글

개 발 일 지 017  (0) 2019.11.12
개 발 일 지 016  (0) 2019.11.11
개 발 일 지 013  (0) 2019.10.08
개 발 일 지 012  (0) 2019.10.07
개 발 일 지 011  (0) 2019.09.29

+ Recent posts