Release notes of 5.4.7 (59780.1220)

General features

-Support for Apple Silicon processors

-Enhanced cloud contact integration for chat/call features

Meeting/webinar features

-Enhanced nonverbal feedback and reactions

-Raise hand for host and co-host

-Poll reports available during live session

Meeting features

-Improved grouping of security options when scheduling

Phone features

-Support for text messaging (SMS and MMS)

-Enhancements for call queues with call monitoring

-Call end chime

-Launch an external app or a URL for incoming calls

Resolved Issues

-Minor bug fixes

-Security enhancements

 

Release notes of 5.4.6 (59301.1211)

Resolved Issues

-Minor bug fixes

 

Release notes of 5.4.6 (59296.1207)

Changes to existing features

-Change to default behavior of desktop notifications for upcoming meetings

General features

-Partially encrypted meeting warning

-Additional MSI/GPO option

Meeting features

-Enhanced co-host privileges over Breakout Rooms

-Move participants to main session from breakout room

Phone features

-Enhanced notification for unknown emergency address

Resolved Issues

-Minor fixes related to macOS Big Sur update

-Minor bug fixes

 

Release notes of 5.4.4 (58903.1122)

-Fix virtual background High CPU issue in Big Sur

 

Release notes of 5.4.3 (58887.1115)

Changes to existing features

-Non-video meeting interface will appear the same as a video meeting with video off

Meeting/webinar features

-Share multiple programs at once

Meeting features

-Enhanced in-meeting user abuse reporting

-Suspend participant activity

Chat features

-Pin chat messages

Phone features

-Enhancements to History and Voicemail tabs

Resolved Issues

-Security enhancements

-Minor bug fixes

 

Release notes of 5.4.2 (58740.1105)

Resolved Issues

-Minor bug fixes

 

Release notes of 5.4.1 (58698.1027)

Resolved Issues

-Minor bug fixes

 

Release notes of 5.4.0 (58631.1025)

General features

-Sync sub-folders in cloud contacts

-Enhanced login for Zoom for Government users

Meeting/webinar features

-Scheduling with custom Join Before Host time limit

Meeting features

-End-to-end (E2E) encryption for meetings

-Additional share options with Proximity Share to Zoom Rooms

-Change ringtone for meeting invites and phone calls

-Improved pre-assigned Breakout Rooms behavior

Chat features

-Search starred messages

-File size restrictions

Phone features

-Bootstrap mode for nomadic emergency services

-Call notifications for busy call queue members

-Opt out of specific call queues

Resolved Issues

-Security enhancements

-Minor bug fixes

 

Release notes of 5.3.2 (53291.1011)

기술 이전 완료하여 주소 지웠습니다.

프로젝트 엉뚱하게 완료.

---------------------------------

var requestip = require('request-ip');

function _(request, response) 에 

 

console.log(requestip.getClientIp(request));

175.223.39.36

175.223.39.36
175.223.39.36
175.223.39.36
175.223.39.36
175.223.39.36
175.223.39.36
175.223.39.36
175.223.39.36
175.223.39.36

 

하면 찍히고

 

https://stackoverflow.com/questions/54654946/how-to-write-console-log-to-a-file-instead

 

How to write console.log to a file instead

Now I show the information using: console.log (kraken.id, markets) However, I want to write all the information that goes to the console to a file instead. How can that be done by completing the ...

stackoverflow.com

https://mungmungdog.tistory.com/34

 

node.js winston 적용하기(node.js logger)

node.js winston 적용하기 요새 node.js 로의 개발을 하게 되면서 테스트 및 디버깅, 통계 등의 사용을 위해 로그를 남겨야할 필요성을 느껴 추가하게 되었습니다. 기존의 console.log() 를 사용해도 내용��

mungmungdog.tistory.com

 

 

const fs = require('fs');

const path = require('path');

const url = require('url');

var httpServer = require('http');

var requestip = require('request-ip');

const winston = require('winston');

require('winston-daily-rotate-file');

require('date-utils');

 

const logger = winston.createLogger({

    level: 'debug',

    transports: [

        new winston.transports.DailyRotateFile({

            filename : 'log/system.log',

            zippedArchive: true,

            format: winston.format.printf(

                info => `${new Date().toFormat('YYYY-MM-DD HH24:MI:SS')} [${info.level.toUpperCase()}] - ${info.message}`)

        }),

        new winston.transports.Console({

            format: winston.format.printf(

                info => `${new Date().toFormat('YYYY-MM-DD HH24:MI:SS')} [${info.level.toUpperCase()}] - ${info.message}`)

        })

    ]

});

 

module.exports = logger;

 

const ioServer = require('socket.io');

 

.

.

.

//console.log(requestip.getClientIp(request));

    logger.debug(requestip.getClientIp(request));

 

요렇게 처리하면 된다.

 





 

중급편을 진작에 발간했어야 하는데 python, node, tensorflow 에 너무 빠져 있다가 정신차려 보니 어느새 3개 회사 이사가 되었고, 법인 카드가 4개가 되어 인스타에 인증을 했더랬다. 하나만 잘하는 것도 힘든데 소소하게 여러 개가 되다보니 정신은 분산되었고, 당연히 지금은 다 정리하는 중이다. 나는 제품을 만드는 사람이고, 주변에는 무언가 만들고 싶은 사람들이 많았기에 여러 일을 할 수 밖에 없었다. 본업은 앵벌이고 앵벌이 하는 pool 에 프리랜서가 많아서 다행히 편하게 다른 일들을 할 수 있었다.

 

그 동안 기술은 너무도 빠르게 발전했고, 나도 4학년이 된 이 후 벌써 중반이 흘러 버렸다. 세계 최초, 최고, 국내 최초, 최고 등의 타이틀이 어떤 것인지 경험할 수 있었지만 아직 목마름이 있다.

 

산업은 코로나 이전과 이후로 나뉜다고 하는데 비대면 서비스는 완전 기본중에 기본인 것 같고. 리눅스, 윈도우, 안드로이드, iOS 및 관련 컴파일러 + 랭귀지 등 종합 선물세트인 분야라 하기로 했었고 어느 정도 성과가 있었다.

 

아마도 중급편은 이런 내용을 토대로 쓸 것 같고 예전 카테고리(게시판)은 거의 이용치 않기에 프로젝트 게시판으로 바꾸었다.

 

모든 내용을 공개하지는 못하지만 내가 고민하는 부분이 어떤 것인지 궁금한 사람에게 조금이나마 도움이 되었으면 한다.

 

 

클래스와 객체

객체란?

클래스가 메모리가 올라간 상태를 말한다.


클래스란?

public class TheNewBook {}에서 class 말한다.


객체란?

TheNewBook a = new TheNewBook();처럼 new 붙은 것을 말한다.


클래스란?

객체가 new 되어 메모리에 올라가기 상태를 말한다.


자바에서 메모리에 올리는 예약 어는 가지가 있다.


static

new


이다. C++에서는 new, C에서는 malloc, calloc 기타 이를 응용한 라이브러리 함수들이겠다. 참고로 라이브러리도 API 일종이다. 위에서 말했던 int a = 1704; 예약어들이 없더라도 메모리에 공간을 확보하고 해당 값을 넣는 작업이 하부에서 진행된다. 객체지향이라는 것도 결국 메모리에 어떤 값을 만들고 그것을 이용해서 설계하는 방식의 일종일 뿐이다. 메모리에 값을 만들고 그것을 실행하면 모두 객체지향이라고 있다. 물론, 절차 지향이라고도 있다. 문제는 프로그래밍에 대한 새로운 시각으로 용어들을 없애버리고 싶다는 것이다. 장이 넘어가면 아마 절차 지향 객체지향이라는 단어를 쓰지 않아도 것이라 생각한다.


필자가 아는 프로그래밍 언어들은 CPU 메모리로 장난치데 도움을 주는 것들이다. 물론, C 자바의 메모리 모델은 다르다. 그것만 설명해도 많은 페이지를 할애해야겠으나 지금 책에서의 목표는 아니다.


클래스는 자체로 없다. C++에서 어떤 class struct 변경해도 전혀 문제가 없다. class struct 차이는 행동이 안에 들어 있느냐 없느냐 이기 때문에 적절한 변환만 준다면 동일한 것으로 수도 있게 된다. 하드디스크에 있는 프로그램이 실행이 되면 프로세스라 부르는데 뭔가를 실행하려면 메모리에 올려야 한다. 클래스는 하드디스크에 있는 프로그램이라고 보면 된다. 그러나 안에 static이나 new, malloc 메모리에 올려주는 예약 어가 있거나 생략되어 작동을 하는지에 주목할 필요가 있다는 것이다. 전공자는 앞의 용어들은 "그냥 이렇게 쓰는 갑다"라고 이해하고 다음과 같이 말아주면 좋겠다.

메모리() 컴퓨터 들었던 단어이고 내가 아는 바로 메모리다. 업그레이드에 필요하다고 들었다. CPU 컴퓨터에서 가장 중요한 부분이라고 들었는데 뭔가를 실행시켜 주는 것이다. 그리고 책은 내가 아는 CPU 메모리로 모든 프로그래밍 언어의 개념이 통한다고 말하고 있다.


두꺼운 책을 마지막까지 읽고 나면 결국 이야기를 하려고 기나긴 길을 돌아왔음을 알게 것이다.


필자는 IT 세상을 바꿀 있다고 아직 믿고 있다. 이런 망상도 본다. 만약, 이더리얼이나 비트코인( 가상화폐의 종류이다) 쓰는 사람들끼리만 마을을 만들고, 진짜 일을 하는 사람들(농축산업 종사자, 가공자, 음식점, 교사, 의사, 군인 ) 모아 두고 화폐를 통용시키게 하면 국가 조차 필요 없게 된다. 모든 사람들을 하나의 공동체에 포함하지만 상위 10% 재산을 가진 사람들은 제외한다면, 상위 10% 사람들은 안에서 자기 똥을 치워줄 사람, 밥을 해줄 사람들을 찾아야만 것이다. IT 어느 정도 있었던 사람이라면 망상이지만 만들 수는 있다고 생각할 것이다. 중간중간에 필자가 소송을 당할만한 내용도 들어가겠지만 Dirty Play 모르고는 돈에 근접할 수도 없을 것이다. 정작 중요한 것은 돈에 얼마나 근접하고, 많이 버느냐가 중요한 것은 아니다. 돈을 정말 하나의 수단으로 있는 능력자가 되느냐 마느냐는 사실, 당신의 마인드와 책을 충분히 소화해서 멋진 것을 만들어 내는 데에 달려 있다.



----



컴퓨터 언어는 우리가 일상적으로 쓰는 언어와 같다. 컴퓨터와 소통하기 위한 언어이다. 수백 개의 언어를 아는 것은 커리어에 도움이 되겠다. 그러나 생활 영어를 구사하는 실력보다는 TED에서 발표 원어민들 대상으로 세미나를 있다면 분명 높은 LEVEL 위치한다고 말할 있다. 


프로그래머가 되기 위해서는 앞서 말했 코드를 열심히 쳐야 한다. 2~3일이면 번째 마일스톤에는 도달했을 테니 초급 프로그래머가 추가로 공부할 Keyword 다음과 같다.


절차 지향 프로그래밍

객체지향 프로그래밍


전자는 컴퓨터의 탄생과 함께 개념이고, 후자는 명확한 날짜는 모르지만 중학생 (23 ) Borland 사의 Trubo C++ 3.0 구입했던 기억이 있으니 최소 20년은 넘은 개념이다. 그러나 많은 전공 학생들이 아직도 제대로 모르는 부분이 있어서 명확하게 적어 보려고 한다. 시간 코드 설명이면 전공자 모두가 고개를 끄덕였으니 말이 빠른 편임을 고려했을 . 3~4시간의 직접 강의라면 정도, 스스로 공부할 지도를 얻을 있는 셈이다. 세부적인 내용까지 들어가더라도 10시간을 넘지 않았다.


객체지향 프로그래밍은 다음의 개념을 알면 된다.


추상화

전달

객체지향 5 개념


추상화는 다음과 같이 나눠진다.


모델링 설계 방법

코드를 줄이는 방법


전달은 다음과 같이 나눠진다.


메모리를 통해 전달하는 방법

API 통해 전달하는 방법


객체지향 5 개념은 다음과 같이 나눠진다.

class, object, 다형성, 상속, 캡슐화


절차 지향과 객체지향 이야기

C 절차 지향이고 C++ 객체지향 언어라고 한다.


틀렸다.  아니라 "~ 절차 지향 언어다. 객체지향 언어다."라고 말하는 자체가 틀린 내용이다. 객체지향은 대상을 추상화하는 방식이 절차 지향과 달라서 프로그래밍을 설계를 바라보는 생각의 흐름이 달라지는 것을 말한다. 객체지향, 절차 지향 언어를 말하는 것은 무의미하다고, 이미 십수 전부터 학원 강사 활동하며, 많은 설파를 했지만 전달되지 않는 이유는 모르겠다. C++ 창시자(비얀 스트라 스트럽) C 번역되는 번역기를 먼저 만들었다. 만약, 객체지향 절차 지향을 나눈다고 하면 객체 지향 프로그래밍이 절차 지향 프로그래밍 언어로 번역되는 프로그램을 창시자가 먼저 만든 것이다. 논리적으로 태생을 달리하려는 세력 때문에 C C++ C/C++처럼 묶어버리고 , 가짜 객체지향 언어라고 하는 사람들도 보인다. 2016 명확히 이야기하면 C C++ 분명히 다른 언어이다.


그러나 모든 언어는 같다고 말하고 싶다. 밥을 달라고 하던 I'm hungry라고 하던 おなかすいた라고 하던 언어를 이용해서 밥만 먹으면 된다. 영문법 책을 보면 한국어와 영어가 같이 있는데 JAVA & C, PYTHON & JAVA 등과 같은 책은 없는 것일까?


그것은 그것들을 설명할 있는 언어를 사람들이 모르기 때문에 그렇다고 보인다. 필자 역시 배우는 단계에서 다른 언어로 이해하고자 선임자들이 방법이 잘못되었다고 말해서 안개 속을 오래도록 걸었었다. 프로젝트를 진행하면서 선임자들보다 잘한다는 것을 깨닫기 시작했을 확실하게 말할 자신이 생겼다. 이것은 무언가에 비유해서 설명할 것들이 아니다.



1065  git clone --depth=1 https://github.com/linagora/hublin.git && cd hublin

 1095  base=https://github.com/docker/machine/releases/download/v0.16.0 && curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine && sudo mv /tmp/docker-machine /usr/local/bin/docker-machine && chmod +x /usr/local/bin/docker-machine

 1098  base=https://github.com/docker/machine/releases/download/v0.16.0 &&   curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine &&   sudo mv /tmp/docker-machine /usr/local/bin/docker-machine &&   chmod +x /usr/local/bin/docker-machine

 

1821  git config --global user.email "mynameis@hajunho.com"

 1822  git config --global user.name "joe"

 

1761  ssh-keygen

 1762  ls

 1763  cat id_rsa.pub

 

 


프로그래머는 연구직군 입니다. 야근, 특근을 한다고 해도 창조의 '재미' 없으면 안됩니다. 성장이 끝난 회사에서는 정치가

개발자와 프로그래머, 코더, 아키텍트는 사실 동일한 말입니다. 외국계 자격증에서 나누는 방식을 따르자면 아키텍트 > 디벨로퍼 > 개발자 순일 것입니다. 그런데 여기엔 슈퍼 코더란 신조어도 고려해야 하고, 코더의 네임 밸류가 아키텍트 보다 우위로 평가될 때도 있습니다. 소프트웨어는 프로그램과 문서를 합친 것을 말합니다. 프로그램과 함께 훌륭한 문서까지 만드는 사람을 소프트웨어 엔지니어라고 부릅니다. 소프트웨어 엔지니어가 기술적으로 배울 점이 있다고 인정한 사람을 아키텍트라고 하면 되겠습니다.  아키텍트 역시 개발 경력이 없으면 엉뚱한 설계를 하기에, 요즘에는 정확한 정의와 목적 없는 용어들이 난무하는 경우도 적지 않습니다. 프로그램을 만드는 사람은 프로그래머입니다. 개발을 하니 개발자라 불러도 무관합니다. 개발을 코드를 짜니 코더라고 해도 되고, 코더가 프로그래밍 언어을 짜면서 새로운 모듈을 구상하고 설계도 하니 코더를 아키텍트로 불러도 됩니다. 하나를 가리키기 위해 많은 단어가 필요하다는 것은 비효율적인 일입니다. 이런 다양하고 복잡한 관계를 가진 용어들을 책에서는 프로그래머로 통일하려고 합니다.

분야에서 일하며 프로그래머를 꿈꾸는 많은 학생들을 만났습니다. 친구는 소위 말해 스펙을 쌓아 놓은 친구였습니다. 인서울 대학교에 4.3대의 학점, 950 대의 토익 점수를 보유했고 IT 관련 자격증 2개를 준비했습니다. 제가 팀장으로 있던 회사의 계약직 직원이었는데 이전 직원이 망쳐 놓은 코드들을 새롭게 다시 있을 정도로 실력이 있었습니다. 서울대 대학원 지인을 소개시켜주고 진학의 마음을 다지도록 했습니다. 아니라 기술연구 소장님, 대표님께도 공부의 의지를 표방하고 준비하여 대학원에 가는 듯했습니다. 그러던 부모님께서 편찮으시다는 소식이 전해졌고, 가사를 돕기 위해 그는 일을 그만두고 진학도 포기한 부모님께서 운영하시던 가게 일을 도왔습니다. 제가 그를 위해 있는 것은 아무것도 없었습니다. 비슷한 처지의 학생들이 많습니다. 지식을가르치기 하기에는 학생들의 삶이 지나치게 고됩니다.[e][f]

1년의 경험이 있으면 분야에 대해 시간 정도 이야기 분량이 나옵니다. 10시간의 멘토링으로, 대학생 멘티들은 자신의 길을 스스로 찾을 있었습니다. 10시간의 멘토링을 하나의 책으로 담고 싶었습니다. 지식을 전달하는 이상의, 학생들로 하여금배웠다!’ 느낌이 드는 경험을 책으로 하게 하고 싶었습니다. 그러나 글을 쓰는 지금도경험을 책으로 전달하는 에는 대단한 의구심을 가지고 있습니다. 책의 이야기인 장자의 윤편을 보면 있을 것입니다. 하지만 저와 만나지 못하고 안개 속을 걷던 학생이 책을 읽고 정보를 얻을 있다면 그의 인생에 조금이나마 도움이 수도 있다는 생각에 펜을 잡았습니다. 또한 급한 성격 탓에 제대로 전달 못한 말들을 다시 써줄 훌륭한 공저자와 함께 진행을 있어 오히려 책으로 전달이 될지도 모른다는 희망을 가지고 있습니다. 좋고 나쁨의 피드백을 모두 대학생을 대상으로 했기에 대상 독자로도 대학생을 고려했습니다. 그러나 대한민국 땅에서 프로그래머를 하고자 하는 사람이라면 책이 분명 도움이 것이라 확신합니다. 끝으로 책이 나오기까지 도움 주신 출판사 관계자 공저자, 그리고 나의 가족. 특히 아내에게 고마움을 전합니다.



프로그래머는 연구직군 입니다. 야근, 특근을 한다고 해도 창조의 '재미' 없으면 안됩니다. 성장이 끝난 회사에서는 정치가

개발자와 프로그래머, 코더, 아키텍트는 사실 동일한 말입니다. 외국계 자격증에서 나누는 방식을 따르자면 아키텍트 > 디벨로퍼 > 개발자 순일 것입니다. 그런데 여기엔 슈퍼 코더란 신조어도 고려해야 하고, 코더의 네임 밸류가 아키텍트 보다 우위로 평가될 때도 있습니다. 소프트웨어는 프로그램과 문서를 합친 것을 말합니다. 프로그램과 함께 훌륭한 문서까지 만드는 사람을 소프트웨어 엔지니어라고 부릅니다. 소프트웨어 엔지니어가 기술적으로 배울 점이 있다고 인정한 사람을 아키텍트라고 하면 되겠습니다.  아키텍트 역시 개발 경력이 없으면 엉뚱한 설계를 하기에, 요즘에는 정확한 정의와 목적 없는 용어들이 난무하는 경우도 적지 않습니다. 프로그램을 만드는 사람은 프로그래머입니다. 개발을 하니 개발자라 불러도 무관합니다. 개발을 코드를 짜니 코더라고 해도 되고, 코더가 프로그래밍 언어을 짜면서 새로운 모듈을 구상하고 설계도 하니 코더를 아키텍트로 불러도 됩니다. 하나를 가리키기 위해 많은 단어가 필요하다는 것은 비효율적인 일입니다. 이런 다양하고 복잡한 관계를 가진 용어들을 책에서는 프로그래머로 통일하려고 합니다.

분야에서 일하며 프로그래머를 꿈꾸는 많은 학생들을 만났습니다. 친구는 소위 말해 스펙을 쌓아 놓은 친구였습니다. 인서울 대학교에 4.3대의 학점, 950 대의 토익 점수를 보유했고 IT 관련 자격증 2개를 준비했습니다. 제가 팀장으로 있던 회사의 계약직 직원이었는데 이전 직원이 망쳐 놓은 코드들을 새롭게 다시 있을 정도로 실력이 있었습니다. 서울대 대학원 지인을 소개시켜주고 진학의 마음을 다지도록 했습니다. 아니라 기술연구 소장님, 대표님께도 공부의 의지를 표방하고 준비하여 대학원에 가는 듯했습니다. 그러던 부모님께서 편찮으시다는 소식이 전해졌고, 가사를 돕기 위해 그는 일을 그만두고 진학도 포기한 부모님께서 운영하시던 가게 일을 도왔습니다. 제가 그를 위해 있는 것은 아무것도 없었습니다. 비슷한 처지의 학생들이 많습니다. 지식을가르치기 하기에는 학생들의 삶이 지나치게 고됩니다.[e][f]

1년의 경험이 있으면 분야에 대해 시간 정도 이야기 분량이 나옵니다. 10시간의 멘토링으로, 대학생 멘티들은 자신의 길을 스스로 찾을 있었습니다. 10시간의 멘토링을 하나의 책으로 담고 싶었습니다. 지식을 전달하는 이상의, 학생들로 하여금배웠다!’ 느낌이 드는 경험을 책으로 하게 하고 싶었습니다. 그러나 글을 쓰는 지금도경험을 책으로 전달하는 에는 대단한 의구심을 가지고 있습니다. 책의 이야기인 장자의 윤편을 보면 있을 것입니다. 하지만 저와 만나지 못하고 안개 속을 걷던 학생이 책을 읽고 정보를 얻을 있다면 그의 인생에 조금이나마 도움이 수도 있다는 생각에 펜을 잡았습니다. 또한 급한 성격 탓에 제대로 전달 못한 말들을 다시 써줄 훌륭한 공저자와 함께 진행을 있어 오히려 책으로 전달이 될지도 모른다는 희망을 가지고 있습니다. 좋고 나쁨의 피드백을 모두 대학생을 대상으로 했기에 대상 독자로도 대학생을 고려했습니다. 그러나 대한민국 땅에서 프로그래머를 하고자 하는 사람이라면 책이 분명 도움이 것이라 확신합니다. 끝으로 책이 나오기까지 도움 주신 출판사 관계자 공저자, 그리고 나의 가족. 특히 아내에게 고마움을 전합니다.


우선 JAVA C 같다고 보자. 그러면 C++, C# 같은 언어가 된다. JAVA에는 포인터가 없다고 한다. 그래서 포인터 예외는 자바 8에서 레퍼런스 예외로 명칭을 바꾸려나 보다. JAVA에는 포인터가 있다. Object Void 포인터이며, 인스턴스 변수라고 불리는 것이 포인터다. 멤버 변수는 일반 변수나 struct 대응되며, 자바에서 메소드라고 하는 것은 C function 같다. 리누스 토발즈는 자신이 객체지향 프로그래밍을 하고 있다고 말했는지 모르겠지만 이미 리눅스 커널은 C 만들어진 객체 지향 소스이다. wrapping 되는 class 들은 wrapping 하며 쓰이는 함수 포인터와 같다. 앞서 말했던 new malloc, calloc이다. 메모리 확보 추가 키워드는 static이다.


최근 일주일 동안 C 배웠지만 JAVA 모르는 학생들과 기술 면담을 하면서 라이브 코딩으로 가르쳐 주는 내용들이며 분량은 1시간 30분짜리다. - 아마 글로 옮기면 얼마나 길어질지 모르겠다. - "중도 탈락"이라는 말을 쓰는 학업 성적은 우수했던 학생들이 다시 공부를 있게끔 해준 기술적 내용 강의 학생들은 바로 알고리즘 공부나 디자인 패턴, 그리고 수학의 정석을 다시 편다. 기본 앱들을 만들 있고 공모전에서 수상했던 친구들이다. 대부분 맥을 쓰는데 맥과 리눅스도 같다고 설파한다.(모든 프레임웍 같다고 설파하는데 조금 자중해야 - 초반부 학생들이 자신감을 가지기 위해 하는 것이지만 철학부터 다른 프레임웍을 같다고 하는 것은 어폐가 있음. 이에, 전면 수정 예정)


UNIX LINUX 같지 않지만 같다고 말하는 이유는 수많은 파일 시스템을 지원하고 완전히 다른 메커니즘으로 구현되었지만 정책은 같기에 그렇다. 간단히 말하면 배시 셸을 쓴다. 맥도 배시 셸을 쓴다. 이제 윈도도 배시 셸을 것이다.



사족 - 사족은 언젠가는 지워진다10 만에 지워질 때도 있다. 구독자를 위한 얼리어 답터 글들이다.

우선, 책은 그냥 나오는 것이 아니다. 이야기한 적이 있지만 나도 쓰는데 기여를 경험이 있었다. 소스 검증하다 보면 새로운 것이 나와서 또다시 검증해야 했고, 프로그래밍 언어가 대규모 업데이트가 되면 업데이트를 해야 했다. 어떤 내용은 쓰려면 회사에서 중요한 내용들이라 적기도 그렇다. 매거진에도 그런 분이 계시지만 학생들의 포트폴리오를 만들어 주려고 자신이 했던 부분들을 공개하지 않고 감추는 스토리도 있다. 우수한 실력으로 책을 썼지만 보다 진솔한 이야기들을 주려고 기존의 강한 이미지를 던지는 분들도 계신다. 그러나 안타까운 것은 그런 정보를 얻고 정보를 부재시키는 신입 개발자가 억대 연봉을 받고 기업에 들어갔다는 이야기이다.(국내 이야기다) 배가 아픈 아니라. 똑똑한 머리로 선배들이 닦아놓은 길들을 교묘하게 이용하는 행위들이 싫다. 그래서 귀를 쫑긋 세우고 있는 애독자들을 위해서 업계 험담들을 올리고 지우고 했는 했었다.


2~3 멘토링을 받았던 친구들은 모두 리눅스 마스터 자격증을 땄다. 레드헷 자격증 같이 외국 자격증을 따도 되겠지만 덤프의 위력이 너무도 크고, 외국 자격증들은 바우처도 비싸고 유효기간이 짜증 나고, 그냥 배시 셸만 학습하면 된다는 생각에서였다. 그리고 학생들이 공부를 나가면서 실무적인 마일스톤을 가질 있으니 얼마나 좋은가?(실제로 회사에서 인턴으로 학생들을 보면 확실히 차이가 났다) 자격증을 친구들과 아닌 친구들 모두 내가 팀장인 회사에서 인턴을 시켰는데 실력 차이가 확실했다. 자격증은 그저 이거 이거 알아요 말할 있는 것을 그냥 기본은 아요로 대신 말해주는 같다.  개발에서는 자격증은 아무 소용도 없게 느껴진다. 그래도 사람을 뽑는 입장에서 오라클 자격증이 있는 친구는 SQL 기본 문법은 알겠구나 하는 정도로 생각한다. 기술사가 아닌데, 기술사 진로를 물어보는 학생에게는 경험을 이야기해 준다. 이음 멘토링 멘토 네트워크에서 만난 나의 멘토 한분은 기술사도 따고 감리사도 따고 박사도 따고 교수님도 하시고 기업 CTO 였다. 놀라운 것은 박사가 있는데 디자인 박사 학위를 밟고 계셨다. 앞으로는 디자인이 중요하다고 생각해서 하고 계셨다고 했다. 단기간 멘토링 때문에 이야기를 종종 하지만 이렇게 배움의 열정 앞에서는 돈도 사실 무의미하다.


학위나 일했던 경력이나 자격증이 증명하는 것은 이런 형식이라고 보인다. 작은 자격증이라 할지라도 무시하는 더러운 개발 문화 그런 풍조를 없애고 싶다. 자기 능력에서 열심히 공부해서 땄는데 한마디 꺼내는 문화. 강사 시절이 있었기에 나도 여려 땄지만 워드 자격증도 나는 당당하게 말한다. 물론, 워드 자격증 없이 잘하는 사람이 있다는 것을 알고 있다. 단순히 워드를 조금은 봤고, 이러이러하 기능들을 봤어요 하는 말을 줄여서 자격증이 있다고 하는 것이다괜히 내가 어쭙잖게 통합해서 정리했던 것으로 공부한 친구들이 이상한 문화를 만들까 노파심에 미리 적고 준비를 본다.겸손부터 적었지만 나도 인성을 바꾸기가 쉽지 않았다. 그게 쉬운가...  년도 이야기이긴 하지만, 대학교 나와도 아무 쓸모없다는 기조가 있었다. 그러나 시간이 지나면 분명 다르다는 것을 우리는 있다. 슈퍼 코더들이 학교에서 시간을 낭비할 필요는 없겠지만 내가 하는 멘토링의 최종 목적은 학교가 그런 요람이 되도록 모든 지식들을 학교로 돌려주는 있었다. 정작 자신은 학교를 무시하고 그것들의 존재에 대해서 많은 부정들을 했었지만 말이다. 앞서 말했듯이 시간 개념을 놓고 봐야 한다.


애플리케이션만 만드는 프로그래머는 의아해하겠지만 점점 칩단(LOW LEVEL) 내려가면서 프로그래밍을 하다 보면 for (int i = 0; i < 7; i++) dosomething();  보다.

dosomething();

dosomething();

dosomething();

dosomething();

dosomething();

dosomething();

dosomething();

빠를 때가 온다는 것이다. 결국 컴파일러 최적화 옵션만 맹신하지 말고 하부 구현까지도 의심해봐야 하는 레벨도 있다. 내려가면 해당 분야 박사님과 아무리 디버깅을 해도 원인을 찾지 못해서 결국, CPU fetch cycle 때문에 리셋이 난다는 식의 보고서를 적도 있었다. 내가 정도면 전기기사나 전기공사 기사 자격증을 공부하고 설계를 공부하는 것은 기본. HOMEBREW CPU 만든 사람과 같이 CPU 하나는 만들어 봐야 원인을 찾을 있을 같다. 물론, 그렇게 보내는 시간 동안 세상은 어떻게 변해 있을지 모르기에 실천으로 옮기지는 않을 것이다.


설계의 시작은 모든 가능성을 의심하는 것이고, 디버깅의 시작은 자신이 만든 부분만 의심하면 된다. 너무 넓은 범위를 잡으면 된다. 우선, 자전거로 안전한 동네 바퀴만 돌면 된다는 것이다. 당장에는 외국인과 대화할 언어를 배우지는 못했지만 집에서 서투르게 외국어를 말해보면 된다. 외국어를 어떻게 말할지 고민하지 말고 당장 코드 타이핑부터 시작하라.


- 툴은 C Visual studio 2015, JAVA oracle JDK8 + Eclipse mar2, Beyond compare

( 10년은 협업을 책임질 툴이라 선택, beyond compare 돈이 들어가기에 차선책 툴을 찾는게 좋아 보이긴 )





프로그래머랑 대화할 우선 헬로우 월드는 찍어 봤다고 하자. 연봉 5000 넘는 자바 개발자가 세미나를 하는데 public static void main (String args[]) (*자바에서 기초중에 기초) 못쳐서 인터넷 검색을 하는 것을 보았다.


gcc -E  --> Preprocessor, but don't compile

gcc -S  --> Compile but don't assemble

gcc -c  --> asseble but don't link

gcc with no switch will link your object files and generate the executable



https://www.gitbook.com/book/tra38/essential-copying-and-pasting-from-stack-overflow/details

https://www.youtube.com/watch?v=Cs1rn3KHgTA

창시자의 책을 보시면 헬로우 월드 예제가 틀렸다는 것부터 아실 겁니다. 대소문자 구분에 ! 아닌 같아요.

Nothing and Everything 입니다. 아무것도 아닌 같지만 전부일수도 있습니다.


여기까지 굳이 말할 필요 없지만 제가 말하고 싶은 것은


천재라면 혼자 칩만들고 굳이 모듈 나눌 필요도 없이 원코딩으로 하드웨어 제어 코드, 운영체제, 프레임웍, 사용자들이 어플까지 만들면 되고 서버 역시 필요한 모듈들을 코딩할 필요도 없이 기계어로 짜서 넣어버리면 되겠지요. 그게 안되기 때문에 모듈을 나누는 것이구요. 디자인패턴 역시 자주 쓰는 코드들을 정의해 두고 서로 소통하기 위해 정도는 알고 서로 이야기 하자고 만든 것으로 생각됩니다. 겸손하게 소통하고 치킨게임이 되어 가고 있지만, 모두를 이끌어 주는 것이 필요하다고 생각됩니다. 그리고 개발자 하청은 더러운 경영자, 발주자들의 목록을 만들어서 우리들이 사람들과는 아무리 돈을 줘도 일을 안하거나, 일을 해도 대충 일해주고 소스를 경쟁업체에 넘겨준다던가 하는 방법으로 가면 좋을 같습니다. 물론, 좋은 분들은 돈을 적게 주시더라도 되었을 분명 이익을 쉐어링 것이기 때문에 목록 공유하고 성심 성의껏 일하구요. IT 협동 조합이 최근 만들어져서 많은 기대를 하고 있지만 그런 목록 만들기는 온갖 이해 관계가 얽혀서 쉬운 일은 아닐겁니다. 그러나 필요하지요.

그리고 물타기는 아닙니다. 역시 Ctrl+C, V에다가 어차피 Ctrl+C,V라고 말하며 어느 정도 지식은 있는 영약한 학생들이 유명 학교 빽그라운드만 믿고 나이가 13 차이나는데 살살 긁으며 빡돌게 하는 후임들이 많아서 어떤 요지인지는 100% 알고 있습니다. 옥시 사태처럼 진짜 중요한 정보 하나 정도는 알려줘야 하나 말아야 하는 기로에 고민을 합니다. 그럴 기준점이 되는 것은 제품 사용자들은 가족이 수도 있기에 사용자에게 무엇을 것인가가 기준점이 됩니다. 정치를 못하는 것도 아니라서 불이익을 주거나 잘라버리는 것은 사실 어렵지 않습니다만, 어린 노무 ㅅㄲ들을 상대로 이런 고민을 해야 하는 제가 너무 우스울 때가 있지요.

그리고 댓글이 많이 달리는 주제를 이끌어 주신데 감사드립니다.

http://www.yes24.com/24/Goods/42800973?Acode=101


실무 프로그래밍 초급편에 문제 풀이를 해 달라는 요청이 있었기에 씁니다.


1. 다음은 실행 가능한 코드입니까? 

#include <stdio.h>

int main()

{

             printf("Hello   World\n");

             extern   int s;

             printf("%d\n",   s);

             return   0;

}

int s = 88;


실행 가능합니다. 많은 프로그래머가 전역 변수는 함수 밖에서 선언해야 한다는 규칙으로 알고 있고, 인터넷에도 관련해서 잘못된 포스팅이 수십 건은 되는 것 같아서 책에 싣게 되었습니다. 물론, 이 소스 하나로 절차지향 프로그래밍에 대한 개념 설명시 이용하기도 합니다. C는 사실 객체 지향 언어입니다.


2. 다음은 포인터 입니까? 배열 입니까? 

int (*s)[8];


포인터입니다. 8의 크기를 갖는 배열의 주소를 지칭하는 포인터입니다. 실무 프로그래밍을 위해 *, &를 알고 관련 개념 이해를 위해 만든 문제입니다. 

int sora[8] = {0, 1, 2, 3, 4, 5, 6, 7};

int(*s)[8];

s = &sora;

printf("%d", (*s)[2]);

하면 두번째 값이 출력됩니다.



3. 다음 두 코드의 차이점은 무엇입니까? 

int *s();

void (*s)();


전자는 포인터 함수, 후자는 함수 포인터입니다. 전자는 int* s(); 로 int형 포인터를 반환하는 함수의 선언입니다. main() 함수 뒤쪽에 함수 선언 후 printf("%d", *s()); 로 쓸 수 있습니다. s() 로 함수를 실행하면, 주소 값이 넘어 오는데 해당 주소값에 있는 실제값을 * 연산자를 이용해서 보여줄 수 있습니다.

int* s()

{

int soul = 4;

return &soul;

함수 포인터는 반환 값이 같고 인자 선언이 같은 void myFunc() { } 와 같은 함수를 ss = myFunc; 로 지정할 수 있는 포인터입니다. 함수의 주소를 가리키는 포인터입니다.



4. 결괏값은 무엇입니까? 

#include <stdio.h>

int main()

{

             float   s = 3.141592;

             float   *o;

             o   = &s;

             printf("%f\n",   *o);

             printf("%f",   o[0]);

             return   0;

}

같은 값이 나옵니다. 값을 표현하는 연산자인 *와 []의 동일성을 말하기 위한 문제입니다.


5. 결과값은 무엇 입니까? 

#include<stdio.h>

int main()

{

             int   s = 8;

             const   int *o;

             o   = &s;

             *o   = 88;

             printf("%d",   s);

             return   0;

}


실행되지 않습니다. const 는 해당 메모리 주소가 가리키는 곳을 read-only 영역으로 하라는 뜻입니다. read-only 이기에 *o로 8이라는 값을 가져올 수는 있으나 해당 주소에 쓸 수는 없습니다. const 예약어가 없다면 값이 바뀝니다.


6. 결과값은 무엇 입니까? 

#include <stdio.h>

int main() {

             int   s = 3;

             int   o = 4;

             printf("%d",   s^o);

             return   0;

}

OR 연산(011+100)에 의해 7(111)이 됩니다.


7. 결과값은 무엇 입니까? 

#include <stdio.h>

#include <stdlib.h>

int main()

{

             int   *p = (int*)malloc(88 * sizeof(int));

             printf("%d   ", sizeof(p));                           

             return   0;

}


4혹은 8입니다. 포인터 변수의 크기이므로 주소 크기 입니다. 32bit로 컴파일하면 4, 64bit 인 경우 8이 됩니다.


8. 다음에서 typedef 제외, 코드를 재 작성 하십시요. 

typedef struct _Customer {

             char   name[8];

             int   id;

} Customer;

#include <stdio.h>

#include <string.h>

int main() {

             Customer   s, o;

             strcpy_s(s.name,   "Soul");

             s.id   = 8888;

             strcpy_s(o.name,   "Sora");

             o.id   = 3333;

             printf("name   : %s %s\n", s.name, o.name);     

             printf("id   : %d %d", s.id, o.id);

             return   0;

}

typedef를 제외하면, Customer s, o가 아닌 struct _Customer s, o로 쓰면 됩니다. 보통 typedef struct { 로 바로 씁니다. struct 선언 문법을 헷갈리게 하려고 한 의도입니다. struct 를 잘쓰면 class 부럽지 않습니다. 물론, 메소드(멤버함수, 함수)는 함께 담을 수 없지만 말이죠.


9. 결과값은 무엇 입니까? 

#include<stdio.h>

void main()

{            

             int   i = 0;

             printf("%d   ", i++);

             main();

}

 네, 0이 나오는 무한 루프 입니다. 실무 프로그래밍 초급편에서 main 함수를 호출하는 함수 포인터를 만들고, 무한 루프를 탈출할 수 있는 방법을 연구해 보았습니다.


10. 결과값은 무엇 입니까? 

#include<stdio.h>

union {

             char   s[3];

             int   o;     

} _union;

struct {

             char   r[3];

             int   a;

} _struct;

int main() {        

             printf("%d   %d\n", sizeof _union.s, sizeof _struct.r);

             printf("%d   %d\n", sizeof _union.o, sizeof _struct.a);

             printf("%d   %d", sizeof _union, sizeof _struct);

}


3 3

4 4

4 8

입니다. struct는 메모리를 공유하지 않고 내부에 묶여진 자료형에 대해서 각각 공간을 할당합니다. union의 경우 가장 큰 타입의 메모리의 크기를 가진다고 알려져 있습니다. 메모리를 공유하는 것은 맞지만 가장 큰 메모리를 점유하는 것은 아닙니다. 가장 큰 자료형의 "배수"가 들어갈 공간을 확보합니다. 가령,

union {

char   s[11];

int   o;

} _union;

의 경우, s배열 크기 char*11을 담을 11이여야 할 것 같지만 12가 나옵니다. o가 double일 경우 16이 나옵니다. char s[11]이 가장 크지만 해당 크기만큼만 메모리를 할당하지 않습니다. double형의 2배만큼 할당합니다(. comm   _union,16,16).  struct도 마찬가지 결과입니다. 이론과 실무는 많이 다릅니다.


+ Recent posts