• 437 2020.06.07
  • 436 2020.06.07
  • 435 2020.06.07
  • 434 2020.06.07
  • 433 2020.06.07
  • 432 2020.06.07
  • 431 2020.06.06
  • 430 2020.06.06
  • 429 2020.06.06
  • 428 2020.06.06
  • 427 2020.06.06
  • 426 2020.06.06
  • 425 2020.06.06
  • 424 2020.06.06
  • 423 2020.06.05
  • 422 2020.06.05
  • 421 2020.06.04
  • 420 2020.06.04
  • 419 2020.06.04
  • 418 2020.06.04
  • 417 2020.06.04
  • 416 2020.06.04
  • 415 2020.06.04
  • 414 2020.06.04
  • 413 2020.06.03
  • 412 2020.06.03
  • 411 2020.06.03
  • 410 2020.06.03
  • 409 2020.06.03
  • 408 2020.06.02


얼마 전 후임 2명과 함께 오버워치를 하러 갔었다.

10판 중 6판을 이기고 1판 비기고 3판 졌다.

피지컬(게임 능력)이 좋으면 항상 승리하겠지만, 팀웍이 더 중요하다.

얼마 전 그랜드 마스터가 브론즈에서 아무리 캐리를 해도

승률은 반반이라고 했듯이

개개인의 능력보다는 팀웍이 중요하다.

오버워치 하는 사람이면 2-2-2 조합을 맞춘다는 말을 잘 알것이다.

팀웍이 중요하다는 것을 알 것이다.

그러나 어느 순간에 모르는 사람들과 해도 크게 성적이 올라간다거나

떨어지지 않는 구간에 머물게 된다.

그 때 이기고 싶으면 긍정적인 사람을 만나야 한다.

~형, ~형 이라 부르며 긍정적인 에너지를 전파하는 리더나 나오면

조합은 맞춰지고 빡겜(열심히 게임)을 하게 된다.

뭐, 그렇다고 개인과 팀의 조화.

 

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

const 붙여주면 된다.

캐스팅 해야할 것은 캐스팅 해주면 된다.

Swift 하면서 느낀점은 C와 같다는 것이다.

우선 연산자는 거의 같다.

&&도, 당연히 C는 시스템 단이니 비트 연산자와 논리연산자를 확실히 구분해서

써야 한다.

타입 캐스팅은

(char)something이었다면

String(something)

함수 만들 때는 func를 붙인다. c언어는 안 붙여도 되지.

func something() {}

void 처럼 반환형을 확실히 명시하는 편이 더 좋긴하다.

컬리 브라켓도 모두 같고. 컬리 브라켓 안의 변수 스코프도 모두 동일하다.

캐스팅도 함수로 취급해서 좋고, 함수 쓰는 것도 ()에 파라미터 적는 것과 같다.

Int(arc4random_uniform(12))


배열도 var a = [" ", " ", ...] 로 만드니 [] 친숙.

 

let은 const 랑 같은 뜻. 

 

var로 자료형 구분이 없는 것 같지만 결국엔 명시적으로 해 주는게 더 낫다는 생각이 든다.

 

타입 캐스팅이 완전 자동으로 되지 않는 이상 명시적으로 적지 않는 자료형은 별 의미 없다는 생각이다.

 



사실 새로운 언어를 할 때마다 이전 언어가 잊혀진다.

한국에 오래산 미국 사람이 영어를 까먹는 것도 봤는데 마찬가지지 않을까.

어느 순간에는 언어의 아름다움에 깊이 빠져야 하는데 그러질 못할까봐 문제다.

위인들 중에는 많겠지만, 영어와 한국어 둘 다 잘하는 사람 중에 시를 좋아하는 사람은 못 만나봤다.

언어를 아름답게 쓰는 사람도.

한국어만 잘하는 사람들이 언어를 아름답게 쓰는 경우는 있었는데 정말 수준있게 보였다.

클라스가 다르다는 말은 그런 사람을 만났을 때 쓰는 것인 것 같다.

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

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

439  (0) 2020.06.07
438  (0) 2020.06.07
436  (0) 2020.06.07
435  (0) 2020.06.07
434  (0) 2020.06.07

US 404 Error

Request Status Visitors Hits
GET HTTP/1.1 404 2 3
GET /ccvv HTTP/1.1 404 1 1
GET /download/ ~ 404 5 5
GET /favicon.ico HTTP/1.1 404 20 31
GET /manager/html HTTP/1.1 404 1 2
GET /robots.txt HTTP/1.0 & 1.1 404 40 91
GET /wls-wsat/CoordinatorPortType HTTP/1.1 404 1 1
GET /wordpress\xea\xb0\x80 HTTP/1.1 404 1 1
GET /wordpress\xec\x9d\x98 HTTP/1.1 404 1 1
GET /wp/ HTTP/1.1 404 1 1
GET /wp/eng/ ~ 404 53 197
GET /wp/kr/ ~ 404 71 615
HEAD /inc/02.jpg HTTP/1.1 404 1 1
HEAD /myadmin/scripts/setup.php HTTP/1.0 404 1 3
HEAD /phpMyAdmin/scripts/setup.php HTTP/1.0 404 2 4
HEAD /wp/p=5603&amp HTTP/1.0 404 1 1
POST /wp/xmlrpc.php HTTP/1.1 404 1 4
POST /xmlrpc.php HTTP/1.1 404 1 4

호스팅 받던 서버를 회사에 구축하고 회선을 따서 사용하고 있다.

여러 상황을 점검하고 있는데 우선 404 에러 났을 때 로그가 필요해서 후임에게 부탁했고,
정운씨가 깔끔하게 로그를 잘 뽑아주었다.

워드프레스 옮기면서 구멍난 페이지도 본 페이지로 가게 잘 해두었다.

본 페이지는 frameset이라 무한 루프 돌지만 않으면 잘 되니...

<script type="text/javascript">

  var adfly_id = 4986892;

  var adfly_advert = 'int';

  var frequency_cap = 5;

  var frequency_delay = 5;

  var init_delay = 5;

</script>

<script type="text/javascript">

  var adfly_id = 4986892;

  var adfly_advert = 'int';

  var frequency_cap = 5;

  var frequency_delay = 5;

  var init_delay = 5;

</script>

<script languagu="javascript">

 document.location.href="http://morpheus3d.co.kr/";

 

</script>

웹 페이지 로딩속도는 VPN으로 확인을 해도 

호스팅 받는 것보다 확실히 빠르다.


 

일주일이 지나 그냥 웹으로 업로드 하기로 결정했다.

구글 백업&싱크는 여전히 드랍박스에 비해 제대로 동작하지 않는다.

파일 개수가 일정 개수를 넘으면 오류가 나는 것 같다. 일전에 지난 1년간이라고 말했는데 정확히 말하면 구글은 2년동안 에러 수정을 못하고 있다고 봐야 겠다.

그에 반해 웹 업로드는 더욱 빨라졌다. 웹 기업인데 괜스레 윈도우 앱에 기대를 걸진 말아야지 하고, 드랍박스는 데탑앱으로 싱크하고 구글에는 크롬으로 올리니 작업이 팍팍 진행된다.

시간이 없는 사람이라면 내가 그동안 많은 삽질을 했으니

드랍박스에서 구글 드라이브로 마이그레이션 하기

로 검색하는 분이라면 드랍박스로 싱크 우선 건다. 그리고 크롬으로 연 구글 드라이브에 드래그&드랍으로 넣는다. 이후 지우면 드랍박스에서도 날아가기 때문에 매우 간편하다.

난 둘 다 싱크해서 폴더만 옮기면 자동 싱크가 될거라 생각했다. 일전에 테스트 했을 때 구글드라이브는 3테라 넘어갈 때 문제가 발생했었는데 지금은 500기가 넘어가도 문제가 발생한다.

대신 웹 업로딩은 매우 빠르므로(현 시점에서는) 마이그레이션은 위와 같은 방법으로 해야 시간 낭비가 적을 것 같다.

런쳐 스크린은 정말 순식간에 사라진다.

AppDelegate의 didFinishLaunchingWithOptions 에

[NSThread sleepForTimeInterval:4];

를 추가해서 런쳐 스크린을 질질 끌 수도 있겠지만,

 

iOS8~11까지 기다려도 여전히... 천천히 나올 때도 있고, 빨리 나올 때도 있고, 이미지가 클 때는 아예 안 나올 때도 있다. 버전업이 되면 괜찮아 질 줄 알았지만 iOS8~11이 될 때까지 애플이 생각하는 런쳐 스크린이 그렇다면 그냥 커스텀으로 구현하는게 맞겠다.


스토리 보드로 구현을 해도 되겠지만 이미 스토리 보드는 짜여져 있고 건들고 싶지 않은 때

메인에 붙일 서브 뷰를 추가하는 것이 가장 깔끔하다.

 

코드로 구현해야 할 때는 이렇게...

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

http://www.apple.com/DTDs/PropertyList-1.0.dtd">

<plist version="1.0">

<string>LaunchScreen</string>

</plist>


우선 info.list에서 기존의 런쳐 스크린을 지운다.
.xib, .mm, .h 만든다.

 


------

#ifndef LaunchView_h

#define LaunchView_h

#import <UIKit/UIKit.h>

@interface LaunchView : UIView
{
}

- (void)viewLoad;

@end

#endif

 

#import "LaunchView.h"

@implementation LaunchView

- (id)init
{
self = [super init];
if (self)
{
NSArray *nibObject = [[NSBundle mainBundle] loadNibNamed:@"LaunchView" owner:self options:nil];

self = [nibObject objectAtIndex:0];
[self viewLoad];
}
return self;
}
- (void)viewLoad
{
}
@end


.xib 에 CustomClass에 연결시켜 준다.
메인 스토리보드가 참조하는 헤더에 뷰를 추가한다.
#import "LaunchView.h"

@property (weak, nonatomic) LaunchView *viewLaunch;


- (void)viewDidLoad {

되었을 때 init 해준다.

LaunchView *viewLaunch = [[LaunchView alloc] init];

_viewLaunch = viewLaunch;

_viewLaunch.frame = _viewBanner.frame = _viewConsul.frame =
CGRectMake(0, 0, _viewFullScreen.frame.size.width, _viewFullScreen.frame.size.height);

크기 지정하고 메인에 뷰에 붙여준다.

[_viewFullScreen addSubview:_viewLaunch];

 

 

 

타임 스케쥴러에 붙여줘서 일정 시간이 지나면 뷰를 떼버리면 된다.


[_viewLaunch removeFromSuperview];

떼버리기 싫으면 뷰를 히든으로 바꾸면 된다. 아래는 관련 코드.

 


typedef enum { 

TIMER_LAUNCH=0,

 

...


- (void) timerScheduled:(NSTimer*)theTimer

{

if (eTimerState == TIMER_LAUNCH) {
_viewLaunch.hidden = NO;

CFTimeInterval cTime = CFAbsoluteTimeGetCurrent();
if (cTime - sTime > 4.5f) {
_viewLaunch.hidden = YES;
eTimerState = TIMER_INIT;
}
} else if ...


- (void)resetSelectButton 
{
_viewLaunch.hidden = YES;
- (void) timerScheduled:(NSTimer*)theTimer;

timer = [NSTimer scheduledTimerWithTimeInterval:TIME_INTERVAL target:self selector:@selector(timerScheduled:) userInfo:nil repeats:YES];

 

 

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

438  (0) 2020.06.07
437  (0) 2020.06.07
435  (0) 2020.06.07
434  (0) 2020.06.07
433  (0) 2020.06.07



https 방식과 ssh 방식이 이해가 안되서 
고생하는 학생이 있어서...

https는 ID/PASSWORD 방식으로 구글에 로긴하는 방식과 같다.
ssh는 본인 컴에서 키 만들고 나온 pub 키(텍스트)를 아이디 묻는 사이트에 미리 등록해두는 방식.

https 방식은 세션 인증 방식이라서 ID/PASSWD를 입력해 주면 된다. 그러나 알다 시피 implementation을 잘못해서(정확히 말하면 개발자들이 git만 디버깅을 많이 해서) repository 싱킹할 때  버그가 많고 bitbucket/github의 경우 상당히 자주 꼬인다. 그래서 결국 git 명령어를 배우게 되는데

git clone git@github.com:ID/*.git_file

git pull
git add -A
git commit //comment at the top of vim and :wq  or use -m " " option
git push

 

가 우리가 자주 쓰는 명령어.


ssh-keygen 은 키를 생성시켜주는 명령어
$ ssh-keygen -t rsa -b 2048 -C "myKey"

 

고 이 키는

 

~/.ssh 폴더 내에 있어야 한다. 맥이나 리눅스는 바로 먹고 윈도우도 git bash가 있으니

어차피 같은 bash shell 이다.



ssh 기본 키를 만들면(MAC이던, LINUX던 Windows던)

public key가 텍스트 형태로 있는데 그 녀석만 github 에 deploy 해줘야 한다.

SourceTree에서는 putty/Plink 방식이 아닌 OpenSSH로 설정하는게 마음이 편하다.

 ppk키가 아닌 새롭게 생성한 키로(ssh -i 옵션과 같다) 계정 설정을 해 두면 ID/PASS 방식에서
나던 소소한 에러들이 해결된다.

다음과 같은 에러가 날 때는


sourceTree terminal을 열고


ssh-keygen


vim ~/.ssh/id_rsa.pub 을 열어 

빗벗켓 계정 setting 에 ssh keys 메뉴에 추가해 줘야 한다.

여러개의 키를 사용할 때는

 

~/.ssh/config 를 손봐야 한다.

config 파일은 소스트리에서 자동 생성 해주는데 https://git-scm.com/ 꺼랑 호환이 안되는 것 같다.

수동으로 고쳐줘야 한다.

Host github.com
HostName github.com

으로 해줘야 한다.  소스트리는 HostName 에 탭이 들어가는데 탭 없애서 모두 같은 라인에 있도록 해주어야 한다. Host의 경우도 내가 새로 생성한 키 이름으로 되어 있는데 github.com 으로 해줘야 해당 키를 제대로 찾더라.(그 전에는 키를 못 찾겠다는 오류없이 기본키로 자동 설정되어서 오류 내용을 알기가 애매했었음)

IdentityFile 과 User  까지 설정해주면 끝.(인터넷에 자료가 많으니 더 이상 자세한 설명은 생략한다)
중요한 것은 config에 4개 필드만 있으면 된다는 것.


- 다음 -

Key is invalid. It must begin with 'ssh-ed25519', 'ssh-rsa', 'ssh-dss', 'ecdsa-sha2-nistp256', 'ecdsa-sha2-nistp384', or 'ecdsa-sha2-nistp521'. Check that you're copying the public half of the key




git@bitbucket.org: Permission denied (publickey).


fatal: Could not read from remote repository.






Please make sure you have the correct access rights


and the repository exists.


git@bitbucket.org: Permission denied (publickey).


fatal: Could not read from remote repository.






Please make sure you have the correct access rights


and the repository exists.


git@bitbucket.org: Permission denied (publickey).


fatal: Could not read from remote repository.






Please make sure you have the correct access rights


and the repository exists.


git@bitbucket.org: Permission denied (publickey).


fatal: Could not read from remote repository.






Please make sure you have the correct access rights


and the repository exists.


git@bitbucket.org: Permission denied (publickey).


fatal: Could not read from remote repository.






Please make sure you have the correct access rights


and the repository exists.


git@bitbucket.org: Permission denied (publickey).


fatal: Could not read from remote repository.






Please make sure you have the correct access rights


and the repository exists.


git@bitbucket.org: Permission denied (publickey).


fatal: Could not read from remote repository.






Please make sure you have the correct access rights


and the repository exists.


git@bitbucket.org: Permission denied (publickey).


fatal: Could not read from remote repository.






Please make sure you have the correct access rights


and the repository exists.


git@bitbucket.org: Permission denied (publickey).


fatal: Could not read from remote repository.






Please make sure you have the correct access rights


and the repository exists.


git@bitbucket.org: Permission denied (publickey).


fatal: Could not read from remote repository.






Please make sure you have the correct access rights


and the repository exists.


git@bitbucket.org: Permission denied (publickey).


fatal: Could not read from remote repository.






Please make sure you have the correct access rights


and the repository exists.


git@bitbucket.org: Permission denied (publickey).


fatal: Could not read from remote repository.






Please make sure you have the correct access rights




and the repository exists.



후임 2명과 일하는 메신저는 슬랙으로 바꿨다. 얼마전 이야기 했지만 ㅡㅡ;

채널, 트렐로, 깃헙 연동은 당연한 거지만.

카톡은 기본적으로 2대씩 쓰는 컴퓨터에 계속해서 로긴/로그아웃을 해야 하는데

슬랙은 이미 로긴이 다 되어 있으니 너무 편하다.

넘흐 조아 ^^

SLACK is the best business tool for us.

회사 잘되면 메신저는 슬랙으로 통일하자고 해야지.

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

437  (0) 2020.06.07
436  (0) 2020.06.07
434  (0) 2020.06.07
433  (0) 2020.06.07
432  (0) 2020.06.07

에일리언웨어 17 R4    Alienware 17 R4

 

 




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

436  (0) 2020.06.07
435  (0) 2020.06.07
433  (0) 2020.06.07
432  (0) 2020.06.07
431  (0) 2020.06.06

https://www.canfieldsci.com/imaging-systems/

캔필드...

유럽에서 얘네들 부스 방문했는데

우리가 얘네들 제품 보고 있으니 거기 엔지니어가 이미 카피 했다고 하던...

모르페우스 명찰 그대로 달고 있었거든... 보여줘도 되냐고 하니 이미 카피해서... 라고 했던

ㅡㅡ; 작은 소리로 말하던가.

암튼, 직관적 UI 휴대성 등을 보면 배울점이 많은 회사긴 하다.

그러나 내가 의사라도 국내 병원이라면 모르페우스 장비를 쓰는게 좋을 듯.

같은 기능에 가격이 가장 큰 요인이고,

최근 업뎃을 비교해 보면 말이다.

A/S도 편하고...

기업 경쟁은 치열하겠지만, face에 집중하는 것이 나중에 큰 차이를 나타나게 될 것 같다.

 

http://www.3dmd.com/3dmd-systems/dynamic-surface-motion-capture-4d/

 

모션 캡쳐도 하는데... 여기도 참 다양한 시도를 하는 것 같다.

 

face만 집중할 때 퀄리티는 더 올라갈텐데...

    MDS (Morpheus3D Dental Solution) 3dMDface
Info Manufacture Morpheus 3dMD
Country S, Korea US:Atlanta
UK:London
Price.....  
Minimum Requirement  CPU Intel Core i5  
HDD 500GB or higher  
Memory 4GB  
Resolution 1280*1024 at 26-bit or higher  
OS Windows7 64bit or higher  
Function Compatibility CT  
Wrapping 3D Photo 3D Photo
Aesthetic operation Supported Supported
Pros & Cons Offer Hardware & Software Hardware & Software
special feature 3D Cephalometry Diagnosis 3D Cephalometry Diagnosis
Surgery simulation by importing CT dicom set data Dynamic Surface Motion Capture(4D)
Accurate real 3D soft tissue   
 Pros  Genioplasy, Rhinoplasy, other facial aesthetic operation available. Sleep Disorder (OSA) Simulation
Can be applied in Bimaxillary cases Automate segmentation of the anatomic components – i.e. mandible, teeth, airway, etc.
Provides both scanner and software  
Easy to maneuver the scanner   
Cons Only compatible with CT Only compatible with CT

마이그레이션 사유는 이미 밝혔지만 돈도 돈. 그러나 매년 십만원이 넘는 가격이 문제가 아니라(구글드라이브도 그만큼 나간다) 용량 제한 때문이었다. 개인 자료가 4테라를 넘는 시점부터 이용할 수가 없었다.

이제 드랍박스도 3테라 이상 지원이 가능하다. iOS Adhoc 인스톨 때문에 개인 계정 이름을 회사 계정으로 바꾸어서 사용했었다. 회사에서 지원을 잘 해주면 좋겠지만 선행 개발 하시는 분들은 잘 알 것이다. 쉽지 않다는 것을(대기업이나 중소기업이나...)

믓튼, 이번 마이그레이션을 하면서 구글 백업&싱크 프로그램은 여전히 문제가 많다는 것과 드랍박스의 싱크 프로그램 중 윈도우용은 여전히 강력하다는 것을 알게 되었다. 3~4일이면 끝날 줄 알았는데 다시 한번 구글 프로그램은 제대로 동작하지 않는다는 것을 확인하면서 2주가 걸린 것 같다.

데스크탑 프로그램과는 별개로 크롬으로 올리는 것은 정말 잘 동작하였다. 그러나 워낙 많이 올려서 일부러 그랬는지는 모르겠지만 마지막 몇백기가가 잘 올라가지 않아서(폴더가 많아서 3일 기다려봤다) 폴더 하나씩 올리니 잘 올라갔다. 그 전에는 더 많은 폴더 구조도 바로 업로드 되었기에 서버 쿼터에 걸렸나 싶었다.

믓튼, 그렇게 드랍박스를 떠나게 되었다. 구글에게는 조금 미안해서 안쓴다는 와이프도 추가하고 아는 사람도 한명 추가했다(그 친구가 잘 쓸런지는 모르지만 @hajunho.com이라 ...) 월 3만원에 이정도 서비스 쓰는 거면 괜찮겠다. 싶었다. 나도 양심이 있는지라... 보다는 개발자로서 이 정도 돈은 지불해야 겠다는 생각이다.

구글 포토를 쓰는데 지난 사진을 모두 구글 포토에 올려놓으니 얼굴 인식해서 가족 앨범과 아이의 성장 모습 앨범까지 만들어 준다. 페이스북이 단순히 지난 추억을 한번씩 보여주는 것과는 차원이 다른 서비스다. 아마 내 평생에 구글에서 다른 서비스로 옮길 일은 없어 보인다.

구글 백업&싱크도 가장 처음 받을 때는 전혀 문제가 없다(물론, 컴퓨터 전원을 계속 켜둔 상태로...) 나중에 10테라 하드 사서 구글 포토나 드라이브 내용 모두 다운받아 두면, 구글 클라우드가 번개 맞아도 내가 스스로 자료 복구는 할 수 있을 것 같다. 아마 바빠서 번개 맞았으니 자료 날아갔고 보상하겠다는 공지를 못 볼 가능성도 있기에... 그리고 보통 회사가 힘든 상황이면 그런 공지 없이 슬쩍 넘어가는게 이 바닥 비지니스란 것을 알고난 뒤에, 나 스스로 도와야지.

도메인도 구글 도메인으로 이전하고 있고, SNS에 youtube에 구글 드라이브에...

점점 구글 서비스 비중이 높아지고 있다.

여러 서비스를 미리 써보며, 그리고 오래 써보니... 이제는 그냥 구글이라는 이름이라면 조금 뒤쳐지는 서비스라도 구글 이름하에 쓰게 될 것 같다.

드디어 구글 서비스 빠돌이가 되는 것인가... 그래도 기대했었던 크롬북이나... 아라 프로젝트가 실패하는 것을 보면서(크롬북 스피커는 참 좋았는데) 모든 서비스를 구글 것으로만 이용하지는 않는다. 그리고 애플처럼 하드웨어 프레임웍을 장악한 것도 아니라 구글 서비스만 쓸 것이라는 100% 라는 확신은 없다. 99.9999%라는 것이지.

한 유저로서 계속 잘해나가기만을 바랄 뿐이다.

스샷은 드랍박스를 평가판 취소하는 방법. 의식의 흐름대로 클릭하다보면 절대 취소 못한다.

구석에 숨겨진 하이퍼 링크를 클릭하면서 취소해야 한다.

내 자료 계속 보관해 준 것은 고맙지만, 이런 식의 UI는 정말 증오한다.

구글처럼 정면돌파 했으면 좋으련만 ㅠㅠ 그래도 3년간 정말 잘 썼다. 1년 정도 자료 묵혀두어서 고마웠고, 평가판 덕분에 무료로 마이그레이션이 가능했다.



 

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

435  (0) 2020.06.07
434  (0) 2020.06.07
432  (0) 2020.06.07
431  (0) 2020.06.06
430  (0) 2020.06.06


//            var texture = textureCache[bloc.spriteName]

        

//            if texture == nil {

//                texture = SKTexture(imageNamed: bloc.spriteName, size: CGSize(width: 10, height: 10))

//                texture =  SKTextureWithSize(imageNamed:bloc.spriteName, width: 200, height: 100)

                

//                textureCache[bloc.spriteName] = texture

//            }

//            let atomicSprite = SKSpriteNode(texture: texture)

 

 

 

지들 맘대로 계약 이행 안하겠다고 등기 통보 보냄. 뭔 전화로 양해를 구하는 것도 아니고 현대 산업 개발이 견공자제분인지 엔젤 E&C가 견공자제분인지지 차차 알아봐야함.

 

주말에 전화해서 또 통보

 

031-204-1449 그냥 고객 불만 처리 전화 번호

 

이래저래 문의하는데 신입 사원 뽑아서 이딴 일 시킨 것 같아서 책임자 전화 번호 받음

 

이리나 대리 책임자 확인함 010-3927-4560 주말에 내용증명 써서 문자함.

 

오늘 전화함 전화 안 받음 5통 함

 

본사 전화번호 031-205-6494 본사 전화함

 

이리나 대리가 책임자 임을 다시 확인함

 

다른 말 안하고 연락 달라는 메모 남김.

 

영통 현대 아이파크

 



 

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

434  (0) 2020.06.07
433  (0) 2020.06.07
431  (0) 2020.06.06
430  (0) 2020.06.06
429  (0) 2020.06.06

블록 디자인은 다음과 같다.

class DesignOfBlocStorage <T> {

    

    var storage: Array <T?>

    

    init() {

        storage = Array<T?>(repeating: nil, count: GS.s.hjhMaxBlocksVertical * GS.s.hjhMaxBlocksHorizontal)

    }

    

    subscript(currentPositon: Int) -> T? {

        get {

            return storage[currentPositon]

        }

        

        set(newValue) {

            storage[currentPositon] = newValue

        }

    }

    

    subscript(currentXposition: Int, currentYposition: Int) -> T? {

        get {

            return storage[(currentYposition * GS.s.hjhMaxBlocksHorizontal) + currentXposition]

        }

        

        set(newValue) {

            storage[(currentYposition * GS.s.hjhMaxBlocksHorizontal) + currentXposition] = newValue

            if GS.s.logLevel == .fixing {

                debugPrint("saving Point to BlocStorage", (currentYposition * GS.s.hjhMaxBlocksHorizontal) + currentXposition, GS.s.hjhBlocStorage?[((currentYposition * GS.s.hjhMaxBlocksHorizontal) + currentXposition)]?.mYposition) }

        }

    }

    

    func clean() {

        self.storage.removeAll()

        self.storage = Array<T?>(repeating: nil, count: GS.s.hjhMaxBlocksVertical * GS.s.hjhMaxBlocksHorizontal)

    }

}

딱히 특별할 것은 없는...

싱글톤 많이 안써야 하는데ㅡㅡ; 

쩝... 혼자 만들면 굳이 클래스를 나눌 필요성도 사실 못 느낀다.

디자인 패턴 강의를 많이 하니까 어쩔 수 없지만 ㅠㅠ

--> 만들어 봐야 진짜 아는 거거든... 강의 한다고 아는게 아니라.

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

433  (0) 2020.06.07
432  (0) 2020.06.07
430  (0) 2020.06.06
429  (0) 2020.06.06
428  (0) 2020.06.06

    //TODO: making row to be 10times bigger.

    func spritePositionCalculator4move(column: Int, row: Int) -> CGPoint {

        let x = LayerPosition.x + (CGFloat(column) * GS.s.blocSize / 2 ) + 25

        let y = -(CGFloat(row) * 10) - 120

//        debugPrint("hjhXYCalculator : row(\(row)), y = ", y)

        return CGPoint(x: x, y: y)

    }

요구 사항이 바뀌면 사실 바뀌는게 엄청 많은데... 

보통 믿는 관계에서는 요구 사항이 바뀔 것을 미리 예측하지 못한다.

믿음이 깨지는 경우는 산출물을 보고 욕심이 생기는 경우이다.

뚝심있는 기획자가 있으면 정말 다행인데, 보통 기획자라고 불리는 직책도 시키는 대로 문서를

만드는 경우가 고작인 경우가 많다.

정말 고객의 입장에서 만들어 지고 교체되어야 할 사항이라면 개발자의 야근은 오히려 즐거울 것이다.

 

예를 들어 블럭을 없애는 것이 아니라 한 칸 내리는 구현도 그렇다.

/            let hjhAction002 = SKAction.scale(to: 0, duration: 0.5)

            

            atomicSprite!.run(SKAction.sequence(

                [

//                    SKAction.group([hjhAction002]),

                    SKAction.moveTo(y: (GS.s.gameScene?.spriteYpositionCalculator_(row: vY+1))!

                    , duration: 0.5)]

            ))

자 이 코드로 한 칸은 내려졌다. 없애는거 주석처리하며 액션 그룹에서 빼버리고 옮긴다.

spritePositionCalculator_ 를 써도 되지만 불필요한 연산이 들어가니

    func spritePositionCalculator_(column: Int, row: Int) -> CGPoint {

        let x = LayerPosition.x + (CGFloat(column) * GS.s.blocSize / 2 ) + 25

        let y = -(CGFloat(row) * GS.s.blocSize / 2) - GS.s.blocBottomLocationConstant

        if(GS.s.logLevel == .location) { debugPrint("hjhXYCalculator : row(\(row)), y = ", x,  y) }

        return CGPoint(x: x, y: y)

    }

를 떼서

    func spriteYpositionCalculator_(row: Int) -> CGFloat {

        return -(CGFloat(row) * GS.s.blocSize / 2) - GS.s.blocBottomLocationConstant

    }

게 만들었다.

이걸로 끝인가?

블럭이 들어가는 자료 구조도 바꾸어야 한다. 코드가 바뀌면 side effect, 개발자들 끼리는 "사이드"라고 불리는 것 때문에

또 테스트 들어가고 모듈이 크면 기존에 잘 되던 기능도 모두 테스트 해야 한다.

그렇다.... 누군가 말했다.

구글 이미지 검색하니 누가 벌써 이미지랑 엮어서 만들어 놓았네.

ㅋㅋㅋㅋㅋ

 

가령 나 같은 경우 어느 정도 이야기가 된 다음 결론은 아이들을 위한 게임이라고 해서 정말 즐겁게 개발하고

수 없이 바뀌는 요구사항도 모두 수용 했는데 나중에 초반에 이야기 되었던 회의 내용은 다 사라져 버리고,

결국 제일 처음 아이디어로 다시 돌아 갈 때 정말 일하기 싫어서 몇 달을 놀았다.

 

기업에서 월급 받으며 가장 오래 논 기억은 8개월인데 그 때 오버워치 처음 시작해서 회사에서 한 것으로 금장까지 달았다.

1080이라서 라서 좋았다. 뭐, 물론 커널 패치나 임베디드, 엔진쪽도 다루는 광범위한 스킬로 눈 가리고 아웅할 수 있는 경우가

많았기 때문에.

 

최근에 대기업 와서 일하면서도 아주 뛰어난 시니어 엔지니어 분이 몇 달 동안 로그만 고치면서 놀고 있다는 말을 술자리에서

해 주셨다. 내 이야기를 한 것도 아닌데 내가 참 마음에 들었는지 진심을 이야기 해 주셔서 ... 고마웠다. 물론, 그 분은 한번 일하면 야근, 특근은 별 생각 안하고 완벽한 산출물을 내시는 오랜 프리랜서 실력자 시라 이렇게 적어도 괜찮다.

 

내가 하고 싶은 말은...

개발자가 논다는 기준은 다 다르겠으나, 논다고 해서 일을 안하는 것은 아니다.

그러나 정말 영혼까지 불탈 수 있는 프로젝트로 세팅하느냐 마느냐는 진심어린 커뮤니케이션에 달렸다고 보면 되겠다.

회사에 엉덩이 붙이고 있는 거야 개발자 기본 스킬이다. 어렵지 않다.

문제는 그게 중요한게 아니니까 

http://www.ttimes.co.kr/view.html?no=2018101010257793545&fbclid=IwAR13eBRZ-i5AeeyOkmXKdJuM_TjiPk_QSkWAjJazfoLCRDOO7rJANDojqQ0

 

700명 몽땅 원격근무해도 잘 되는 회사

700명이 일하는데도 사무실 하나 없고 그럼에도 어도비에 대적할 만큼 성장한 소프트웨어회사 인비전. 대체 어떻게 가능했던 것일까?  

www.ttimes.co.kr

이런 회사가 나오는 것이다.

원격 근무 잠깐 도입해 보고 실패하는 스타트업 많이 봤는데

실패의 이유는 딴 것 없고,

그냥 구라다.

그렇게 할 마음도 없으면서 시도하는 척.

회의 하면서 다른 사람 말 들어 주는 척.

하고 결국 지 꼴리는 대로 한다.

뭐, 대부분 남자들이 그래서 아~주 정확한 표현을 적었다.

꼴리는 대로 하고 싶으면 회의 하지 말고, 그냥 혼자 기획하고 개발하고 테스트하고 퍼블리싱하면 된다.

 

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

432  (0) 2020.06.07
431  (0) 2020.06.06
429  (0) 2020.06.06
428  (0) 2020.06.06
427  (0) 2020.06.06

gameScene을 다른 곳에서 쓰는 방법?

    //    fileprivate func tigRules_stresslessMode(_ vUpperBloc: AtomicBloc, _ vX: Int, _ vY: Int, _ effectX: CGFloat, _ effectY: CGFloat) {

    //        //        Shape.random(startingColumn: GS.s.hjhPreviewXposition, startingRow: GS.s.hjhPreviewYposition)

    //        let blocYposition : Int = vUpperBloc.mYposition

    //        var tigRulesY : Int = vUpperBloc.mYposition

    //

    //        while checkingDrawOrWin(typeUpper: vUpperBloc.mBlocType, typelower: GS.s.hjhBlocStorage?[vX, tigRulesY + 1]?.mBlocType ?? hjhBlocType.Rock) {

    //            debugPrint("tigRules2", vUpperBloc.mYposition)

    //

    //            tigRulesY += 1

    //            if tigRulesY >= GS.s.hjhMaxBlocksVertical - 1 {

    //                //                GS.s.hjhBlocStorage?[vX, GS.s.hjhMaxBlocksVertical - 1] = vUpperBloc

    //                tigRulesY -= 1

    //                break

    //            } else {

    //                //                GS.s.hjhBlocStorage?[vX, tigRulesY] = vUpperBloc.copy(column: vUpperBloc.mXposition, row: vUpperBloc.mYposition, type: vUpperBloc.mBlocType)

    //            }

    //        }

    //

    //

    //        GS.s.hjhBlocStorage?[vX, tigRulesY]?.deletingMeFromStorage()

    //        let moveAction = SKAction.move(to: GS.s.gameScene?.spritePositionCalculator_(column: vX, row: tigRulesY) ?? CGPoint(x: 0,y: 0), duration: TimeInterval(0.2))

    //        moveAction.timingMode = .easeOut

    //        vUpperBloc.mSprite?.run(SKAction.sequence([SKAction.group([moveAction]), SKAction.removeFromParent()]))

    //

    //        for i in blocYposition..<tigRulesY {

    //            totalScore += 10

    //

    //            GS.s.hjhBlocStorage?[vX, i]?.mSprite?.alpha = 1000

    //            let hjhAction002 = SKAction.scale(to: 0, duration: 0.5)

    //            GS.s.hjhBlocStorage?[vX, i]?.mSprite?.run(

    //                SKAction.sequence(

    //                    [SKAction.group([hjhAction002]),

    //                     SKAction.removeFromParent()]

    //                )

    //            )

    //

    //            GS.s.hjhBlocStorage?[vX, i]?.deletingMeFromStorage()

    //

    //            let effect = eff_baamTwoBlocks(x: effectX, y: effectY)

    //            GS.s.gameScene?.addChild(effect)

    //        }

    //

    //    }

간단하다. 싱글톤으로 쓰면 된다.

 

싱글톤 기법이 참 여러군데서 쓰이는데 C++ 전문 개발자 말고는 왠만하면 안 썼으면 한다.

프로그램 커지고 나면 메모리 단 까지 디버깅 할 수 있는 엔지니어야 괜찮은데

어설프게 쓰고 나서 코드 리뷰 들어가면, 결국 이직해야 하는 상황이 올 수도 있다.

뭐, 중간에 커뮤니케이션 잘 되는 실력 있는 개발자라면 같이 잘 해결하면 될 듯.

내가 추구하는 개발 문화까지 매 번 적으려니 노파심 쩐다. ㅋㅋㅋ 뭐 어쩔 수 있나...

다 통일해야 하는데.

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

431  (0) 2020.06.06
430  (0) 2020.06.06
428  (0) 2020.06.06
427  (0) 2020.06.06
426  (0) 2020.06.06

둘 다 깨지는 블럭에서 아래쪽 블럭만 깨지는 것으로 변경

핵심코드

GS.s.hjhBlocStorage?[vX, vY + 1]?.mSprite!.removeFromParent()

            GS.s.hjhBlocStorage?[vX, vY + 1]?.deletingMeFromStorage()

            

            atomicSprite!.alpha = 1000

            

            let hjhAction002 = SKAction.scale(to: 0, duration: 0.5)

            

            atomicSprite!.run(SKAction.sequence(

                [SKAction.group([hjhAction002]),

                 SKAction.removeFromParent()])

            )

이 코드가 아래 블럭을 말함.

            GS.s.hjhBlocStorage?[vX, vY + 1]?.mSprite!.removeFromParent()

            GS.s.hjhBlocStorage?[vX, vY + 1]?.deletingMeFromStorage()

이 코드는 현재 블럭을 말함

        let atomicSprite = GS.s.hjhBlocStorage?[vX, vY]?.mSprite!

현재 블럭 지우는 아래 액션을 지우지 말고 -->  한 칸 떨어 뜨리는 액션으로 바꾸면 됨.

            atomicSprite!.run(SKAction.sequence(

                [SKAction.group([hjhAction002]),

                 SKAction.removeFromParent()])

            )

358 : onlyTheRule

moveto 는 3가지가 있는데 프로토타입은

//TODO: calculation by iPhone Resolution

    func spritePositionCalculator_(column: Int, row: Int) -> CGPoint {

        let x = LayerPosition.x + (CGFloat(column) * GS.s.blocSize / 2 ) + 25

        let y = -(CGFloat(row) * GS.s.blocSize / 2) - GS.s.blocBottomLocationConstant

        if(GS.s.logLevel == .location) { debugPrint("hjhXYCalculator : row(\(row)), y = ", x,  y) }

        return CGPoint(x: x, y: y)

    }

이렇다.

뭐, 결국 dp 싸움 ㅡㅡ;

게임은 그냥 나오지 않아...

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

430  (0) 2020.06.06
429  (0) 2020.06.06
427  (0) 2020.06.06
426  (0) 2020.06.06
425  (0) 2020.06.06

let randomRadius = CGFloat(UInt(arc4random_uniform(400) + 100))

                                let goLeft = arc4random_uniform(100) % 2 == 0

                                var point = GS.s.gameScene?.spritePositionCalculator_(column: (GS.s.hjhBlocStorage?[vX, vY]!.mXposition)!, row: (GS.s.hjhBlocStorage?[vX, vY]!.mYposition)!)

                                point = CGPoint(x: point!.x + (goLeft ? -randomRadius : randomRadius), y: point!.y)

            

                                let randomDuration = TimeInterval(arc4random_uniform(2)) + 0.5

                                // #5

                                var startAngle = CGFloat(Double.pi)

                                var endAngle = startAngle * 2

                                if goLeft {

                                    endAngle = startAngle

                                    startAngle = 0

                                }

                                let archPath = UIBezierPath(arcCenter: point!, radius: randomRadius, startAngle: startAngle, endAngle: endAngle, clockwise: goLeft)

                                let archAction = SKAction.follow(archPath.cgPath, asOffset: false, orientToPath: true, duration: randomDuration)

                                archAction.timingMode = .easeIn

어 물론, 프로젝트에서 지운 코드들이다. 주석 빼고 다시 올리기 그러네. 평소 하던대로 그대로 올려야겠다.

//                    let atomicSprite2 = GS.s.hjhBlocStorage?[vX, vY + 1]?.mSprite!

//                let fadeInAction = SKAction.fadeAlpha(to: 0, duration: 0.2)

            //                fadeInAction.timingMode = .easeIn

            

            //                let hjhAction001 = SKAction.moveBy(x: 0, y: 0, duration: 1)

    //                        [SKAction.group([fadeInAction]),

 

//                    GS.s.hjhBlocStorage?[vX, yae]?.mSprite!.removeFromParent()

//                    GS.s.hjhBlocStorage?[vX, yae]?.deletingMeFromStorage()

            //                run(SKAction.wait(forDuration: 0.4), completion: completion)

            

            //                    debugPrint("animateCollapsingLines : ", block.mXposition, block.mYposition, block.mSprite!.anchorPoint.x, block.mSprite!.anchorPoint.y)

            // #6

            //                    sprite!.zPosition = 1000

            //

            //                    sprite!.removeFromParent()

            

            //                    GS.s.hjhBlocStorage?[vX, vY + 1]?.mSprite?.removeFromParent()

            //                    GS.s.hjhBlocStorage?[vX, vY + 1]?.deletingMeFromStorage()

            //

            //TODO: WHY                    Toast.show(message: (GS.s.hjhBlocStorage?[vX, vY]?.mXposition.description)! + " " + (GS.s.hjhBlocStorage?[vX, vY]?.mYposition.description)!)

            //TODO: WHY                    Toast.showBlack(message: GS.s.hjhBlocStorage?[vX, vY]?.mXposition.description ?? "NOTHING")

            //                    GS.s.hjhBlocStorage?[vX, vY + 1]?.mSprite?.removeFromParent()

            //                                        prevBloc!.deletingMeFromStorage()

 

//        var nothingIsNorth : hjhDirectionType = directionUpper

        //        var nothingIsNorth2 : hjhDirectionType = directionLower

        //

        //        if nothingIsNorth == .Nothing { nothingIsNorth = .North }

        //        if nothingIsNorth2 == .Nothing { nothingIsNorth2 = .North }

        

        //        if typeUpper == hjhBlocType.Golden {

        //            return true

        //        }

        //

        //        if nothingIsNorth != nothingIsNorth2 {

        //            return false

        //        }

    사실 뭐 대단한 코드

그런거 없다.

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

429  (0) 2020.06.06
428  (0) 2020.06.06
426  (0) 2020.06.06
425  (0) 2020.06.06
424  (0) 2020.06.06

참 웃긴게...

아이디어를 상관에게 말하면... 얼마 시간이 안 지나서 다들 그 아이디어로 수근대고.

 

IT 분야 정수를 말해주면 개발자도 아니면서 모두 그것으로 귀결시켜서 말하려고 하는 것이 들린다.

가령 어떤 플랫폼이던 다 메모리를 쓰니까... 메모리에는... 

이런 말을 하려면 적어도 메모리 종류가 뭐가 있으며, 컴파일러 메모리 관리 기법 그리고 그게 물리적 메모리에

정말 어떻게 들어가는지 볼 수 있을 정도는 되어야 한다. trace32나 dstream 장비는 없더라도 메모리 덤프 정도는 분석 가능하고,

어셈블리 코드 어느 정도는 알아야지.

 

참 웃긴 것은 ... 그렇게

아이디어만 카피해서 말하고 살아도.

그렇게 개발 몰라도 어차피 개발은 다른 곳에서 한다고 생각하는 사람들이 결국 잘려 나가는 것을 보게 된다는 것이다.

 

왜냐면 정말 시대가 변하고 있다. 

가령 어느 골목 대장은 그 골목에서 주먹 잘쓰고 그 골목대장에게 붙어 먹던 사람들이 살 수 있었다.

그들 그룹이 뭔가 하는게 보이면 그들도 또, 그들에게 돈을 주는 사람들도 고개를 끄덕이는 이해도가 있었는데.

 

AI 의 도입으로 이제 그룹이 하던 일을 한 사람이 할 수 있게도 된 것이다. 뭐 정확히는 컴퓨터와 함께하는 1인 그룹이겠지.

내가 보통 술 몇 잔 얻어 먹고, 만드는 홈페이지들도 기업에 의뢰하면 500만원에 월 15~30만원씩 서버 비용을 주는 일이다.

대학생 때부터 호스팅 사업도 하고 지인들 홈피를 만들어 주다보니 요즘에도 간간히 했는데 최근에는 안해주기로 했다.

뭐, 많이 늙기도 했고... 딱히 신박한 기술도 없기에 내가 더 배울 것도 없고 결정적인 것은 내가 술을 거의 못 먹게 되었다.

2일 연속으로 먹으면 4일이 아프다.

 

참... 아직 재미있는 수법은 많다.

PL, PM을 하면서 아이디어 훔치기, 엿들은 기술 겉핥기 이해하고 경영진에게 비비며 개발팀을 계속 바꿔타는...

사실, 이건 작은 기업에서는 아예 불가능한 스킬인데 큰 기업에서는 어느 정도 통한다.

문제는 그렇게 줄을 타다가 요샌 그 줄 전체가 내려 앉기도 하는 것이 문제. 그리고 고도의 정치적 수법이 동원된 것으로

보일수도 있고 기술하면서 그런 미세한 힘겨루기의 히스토리를 몰라서 낄 수 없다고 생각하기도 하는 것 같다.

 

ㅡㅡ; 

 

가장 윗 쪽 입장에서 보면. 돈이 많은 것도 아니고 딱히 이름이 있는 것도 아니면 잘 만드느냐 못 만드느냐 딱 그 차이이다.

그런데 PL/PM 만 보고 개발팀이 누군지도 안 본다. PL/PM은 개발팀 쥐어짜고 나가면 다른 개발팀 갈아타면서 승승장구 했었다.

그러면서 같이 술을 마셔보면 하나같이 모두 은퇴 후 걱정한다. 아니 하는 것처럼 이야기 한다. 실제 걱정을 하기도 하지만 

한 번 기술을 놓은 상태에서 다시 돌아가기란 사실 불가능에 가깝기 때문에 여전히 자신의 방법들이 잘 먹히리라는 생각을

한다.

왜냐면 기술인 중에서도 구글 검색의 힘을 믿고 그렇게 빌어 붙은 개발자도 수도 없이 많았기 때문이다.

AI 시대가 오고난 뒤엔 고학력 시대에 대화가 통하지 않으면 프로젝트를 기획조차 할 수 없는데 그냥 겉핥기로 말할 수 조차

없는 시대가 되었다. 그리고 윗 사람들이 안 똑똑해서 관리로 빠진 것이 아니다, 이런 저열한 수법도 이제 점점 통하지

않을 것이라는 것을 그들이 더 잘 알고 있다.

 그래서 공부를 하는 케이스도 있고, 아예 포기하고 그냥 될대로 되라며 본인 스타일을 고집하는 경우도 있다.

 

가장 중요한 포인트의 1인의 힘이다.

큰 기업의 임원도 가장 똑똑한 몇명만 있어도 모든 것을 바꿀 수 있다는 것을 알기 시작했다.

 

IT 분야는 그렇다. 정말 그렇게 되고 있고.

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

428  (0) 2020.06.06
427  (0) 2020.06.06
425  (0) 2020.06.06
424  (0) 2020.06.06
423  (0) 2020.06.05

 https://downloads.wordpress.org/plugin/superb-helper.1.0.2.zip

새로 만든 웹 사이트는 whois.com 에서 google domain 으로 옮기고 서버도 bluehost 를 사용하였다.

bluehost 는 워드프레스를 지원한다. 이래저래 살펴 보았을 때 딱히 마음에 드는 부분은 없었지만,

구글 도메인에서 추천하는 것을 보니 둘이 파트너라는 것을 쉽게 알 수 있었다.

사실 일전에도 bluehost 사용하다가 한 달 무료만 쓰고 whois로 넘어간 적이 있었다.

whois 나 나누미넷 서버 호스팅을 쓰고 도메인 연결 서비스만 google domains 를 썼었다.

세월이 많이 흘렀기에 한번 더 믿어 보자고 생각하고 bluehost를 쓰는데 생각보다 속도도 빨라지고

ssl 적용도 잘되고 워드프레스 궁합, 그 안 플러그인들이나 업데이트도 잘 되었다. 

2달 정도 테스팅 해 보고 포스팅 하는 것이다.

이 정도면 새로운 서비스는 이것으로 해도 되겠다는 판단이 들었다.

회사 홈페이지 용도인데 트래픽 많아서 다운되는 시점의 경우에는 DNS 서버를 따로 구성한 것은 아니니

그냥 다운되었다는 연락 받아서 카피 웹 사이트로 바꾸어 주는 정도의 플랜만 있다.

홈페이지 다운 되었다고 유저가 떠나는 서비스는 아니고 단순히 회사가 뭘 한다는 정도만 보여주려는 의도이기에 말이다.

물론, 서비스 백앤드는 AWS를 쓴다. 애저, 구글 클라우드도 오래 써봤지만 결국 AWS 가 갑인 듯 보인다.

비용 생각하면 서버 호스팅이긴 한데, 유저가 폭발적으로 늘어날 것을 고려하지 않은 경우가 되겠다.

서버 호스팅은 윈도우 호스팅으로 6년 넘었는데 리눅스는 오래전부터 쓰긴 했어도 이렇게까지 오랜동안 중단없이

서비스 해 본적은 없어서 윈도우 서버를 다시 보게 되는 계기가 되었다. 물론, 비용은 너무 비싸긴 해도.

=-=-=-=-=-=-=-=-=-=-=-=-===-=-=-=-=-=-=-=-=--=-----=-=-=-=----==-=-=-==-===-==-=-=-=--=-

오후 8:09 (null) 표시할 수 없는 메시지입니다.
오후 8:09 시간의 흐름이.., 채팅방 관리자가 메시지를 가렸습니다.
오후 8:10 시간의 흐름이.., 채팅방 관리자가 메시지를 가렸습니다.
오후 8:11 NEWS 안녕하세요 불안안하셔도 됩니다. 거래량이 적어서 잠시 유의 지정이 된것 같습니다. 
오후 8:11 oranges 빠른 답변 감사합니다

오후 8:12 NEWS 곧 더 좋은 소식 전해드리겠습니다~
오후 8:13 oranges 제가 관찰하기론, 팀에선 거래량 증가를 위해서 다른 걸 안하시는 걸로 알고 있는데..
오후 8:13 oranges 거래량이 적어서 유의 지정이 되었다면 해결책이 있으려나요??
오후 8:13 oranges 쉽지 않아 보이는데...ㅠㅠ
오후 8:14 oranges 쟁글에 공시는 퍼블리시 팀에서 올리신 건가요????
오후 8:17 NEWS 여러 방법이 있겠지만, 자전거래는 안할 계획입니다. 거래소 거래량 이전에, 언론 생태계에 퍼블리시 도입과 거래소 상장을 준비중입니다. 쉽지는 않지만, 가능합니다.
오후 8:18 NEWS 아닙니다
오후 8:19 oranges 어떤식으로 가능할까요? 
우리 투자자들의 협조가 필요한 부분인가요?
오후 8:19 oranges 쉽지 않는데 가능하다....좀막연하네요..
오후 8:20 NEWS 넘 감사합니다. 믿고 기다려주시면 됩니다. 곧 좋은 소식 전해드릴 계획입니다.
오후 8:23 oranges 믿고 기다리고 싶은데... 좀 암담해보인다랄까요...?
곧이라면 언제쯤일까요?
오후 8:25 시간의 흐름이.., 쉽게는 안될듯 싶은데요~~
오후 8:26 시간의 흐름이.., 믿고 피봤던 코인들이 너무 많아서....
퍼블팀은 안그러시기를 빌어요
오후 8:26 NEWS 예상대로라면 6월달안으로 입니다. 
오후 8:27 oranges 상장 말씀이신가요?
오후 8:27 oranges 아님 다른 좋은 소식일까요?
오후 8:27 NEWS 상장과 여러 일들을 동시 준비중입니다
오후 8:28 oranges 제가 작년 말에도 곧 소식들을 수 있다고 들었어서요....ㅠㅠ
오후 8:28 10원 홀더들이 할수 있는 일이 있다면 말씀해 주세요.
오후 8:28 oranges 이번엔... 정말이겠죠??
오후 8:30 NEWS 코로나때문에 여러모로 많이 늦어지긴 했지만, 저희 팀이 지금까지 꼼꼼하게 준비했었고, 확정이 되는대로, 알려 드릴 계획 입니다.
오후 8:34 oranges 이번엔 꼭 그 계획이 지켜지길 희망해봅니다
오후 8:34 NEWS 지금까지 퍼블리시의 행보를 보시면 아시겠지만, 비록 비록 느린감이 있지만, 탄탄하고 합법적으로 준비중이고, 결국 가격으로 반영이 될겁니다.
오후 9:30 oranges 관리자님 .. 갠톡 가능할까요?
오후 9:30 oranges 

뉴스 토큰 대화방에 들어가게 되었는데 뉴스 회사를 운영하는 지인이 영업한다고 찾아 왔다고 해서 보게 되었었다.

물론, 듣보잡이라 거절했다고 ....

이래저래 오래도록 알아보니 규모는 있는 것 같은데...

취지는 나쁘지 않은 것 같은데... 무료로 코인을 나눠준 경우도 있고... 내가 텀블벅에서 만들고자 했었던 것과 비슷하다.

작년 6월로  1년 전 이네 ㅋㅋㅋㅋ

다들 이렇게 돈 놀이 하는 것 같아서 그냥 내가 프로젝트 만들고 코인을 쏴 주려고 했었던 프로젝트였다.

당근 Dapp은 만든 상태였고 오픈소스가 워낙 잘 되어 있으니. ㅋ

저 대화방 캡쳐는 몇 분 전 것인데 국가가 아직도 가상화폐 한다는 사람들을 부여잡고 있고.

그 사람들도 아직 뭔가를 하고 있다는 것이 놀랍기만 하다.

내 주변에서는 아직도 비트코인 이야기 하는 사람들이 있는데...

내가 삼성에서 첫 채굴을 시작한지 10년이 넘은 것 같다. 비트 코인 뜨고 주변에서 참 많이 연락이 왔었는데...

이런 가상화폐가 화폐 기능을 하려면 정말 많은 사람들이 공감을 해야 가능하다.

그것을 한국조폐공사가 보장해 주는 것은 경기 지역 화폐다. 즉, 화폐 시스템과 같이 가면서 채권이나 주식 등의 다른 체계들과

연합하여 화폐를 최대한 안정화 하려는 것이다.

경기지역화폐를 계속 굴리면서 국가가 쓸 만큼의 시스템이 되면 사실 브렉시트 처럼 선언하고 "원"이나 "달러"가 아닌

화폐 단위를 새롭게 런칭해서 우리끼리 돌려도 된다.

그런데 그 끝은?

우리나라가 자급자족 할 수 있는 것은 거의 쌀 뿐으로 보인다. 기름, 광물도 없기 때문에 그 화폐 단위가 세계 단위로 통용되지 않는다.

그 나라가 마약을 겁나 많이 하는 나라면 비트 코인도 힘을 쓰겠지만 그게 아닌 다음에야...

 

비트 코인 막는 것은 쉽다. 우리 인터넷 망을 쓰기 땜문에 KT 는 막을 수 있다. 그래서 은행권 전산 시스템은 망을 따로 쓴다.

어떻게 막냐고? 비트코인지갑과 거래소를 만들어서 패킷 받아 들이고 AI 패턴 분석 돌리고 공통 패킷 탐색으로 귀결 시키면 된다.

뭐, 굳이 막을 필요가 없다고 생각할 수 도 있겠으나 자녀들에게 휴대폰을 사 주는 부모 입장에서 저딴 건 안했으면 좋겠다는 생각이 있으신 분들께는 좋은 마케팅 수단이 되겠지.

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

427  (0) 2020.06.06
426  (0) 2020.06.06
424  (0) 2020.06.06
423  (0) 2020.06.05
422  (0) 2020.06.05

몇 개의 웹 사이트를 혼자 관리하기 시작하면서 한 개는 wix, 다른 두 개는 wordpress로 관리하기 시작했다.

DB를 제외하고는 ftp로 통 백업을 하긴 하지만 오래 전 상용 서비스의 워드 프레스 홈페이지를 phpadmin 으로

꼬인 DB 푼다고 고생한 뒤로는 통 백업 주기는 어쩌다 한 번 으로 줄긴 했다.

어차피 어느 정도 규모가 있다면 서버와 서비스를 나누어야 하는 것이 필수고 word press로는 한계가 있기 때문이다.

 

엔진 X나 node.js 등의 서버로 세세한 모든 부분까지 컨트롤 할거면 모르겠으나

작은 규모에서 워드 프레스는 정말 좋은 대안이다.

2점대였나 3점 때 였나? 그 때는 워드 프레스 써도 와~ 했었는데 지금은 5.4가 나와도 워드 프레스를 무시하곤 한다.

왜? 버전은 더 올라갔는데 말이다 ㅋ.

워드 프레스에 welGL 넣으면 와~ 하긴 하던데 워드프레스가 워낙 저명하다 보니,

워드 프레스를 썼다고 하면 마치 무슨 엄청 쉬운 것처럼 생각해서

워드 프레스 마크는 지우는 것이 필수가 되긴 했다.

HTML 개발자 무시하고, UI/UX 구현하는 프로그래머 깔보며 그들보다 낮은 연봉을 받는 사람들에게

입 아프게 설명하기도 싫으니 말이다.

 

WordPress 5.4.1

Building more with blocks, faster and easier.

What’s NewCreditsFreedomsPrivacy

Maintenance and Security Releases

Version 5.4.1 addressed some security issues and fixed 11 bugs. For more information, see the release notes.


Say hello to more and better.

More ways to make your pages come alive. With easier ways to get it all done and looking better than ever—and boosts in speed you can feel.


Welcome to WordPress 5.4.1.

Every major release adds more to the block editor.

More ways to make posts and pages come alive with your best images. More ways to bring your visitors in, and keep them engaged, with the richness of embedded media from the web’s top services.

More ways to make your vision real, and put blocks in the perfect place—even if a particular kind of block is new to you. More efficient processes.

And more speed everywhere, so as you build sections or galleries, or just type in a line of prose, you can feel how much faster your work flows.


 

Two new blocks. And better blocks overall.

  • Two brand-new blocks: Social Icons and Buttons make adding interactive features fast and easy.
  • New ways with color: Gradients in the Buttons and Cover block, toolbar access to color options in Rich Text blocks, and for the first time, color options in the Group and Columns blocks.
  • Guess a whole lot less! Version 5.4 streamlines the whole process for placing and replacing multimedia in every block. Now it works the same way in almost every block!
  • And if you’ve ever thought your image in the Media+Text block should link to something else—perhaps a picture of a brochure should download that brochure as a document? Well, now it can.

Cleaner UI, clearer navigation—and easier tabbing!

  • Clearer block navigation with block breadcrumbs. And easier selection once you get there.
  • For when you need to navigate with the keyboard, better tabbing and focus. Plus, you can tab over to the sidebar of nearly any block.
  • Speed! 14% faster loading of the editor, 51% faster time-to-type!
  • Tips are gone. In their place, a Welcome Guide window you can bring up when you need it—and only when you need it—again and again.
  • Know at a glance whether you’re in a block’s Edit or Navigation mode. Or, if you have restricted vision, your screen reader will tell you which mode you’re in.

Of course, if you want to work with the very latest tools and features, install the Gutenberg plugin. You’ll get to be the first to use new and exciting features in the block editor, before anyone else has seen them!

 

 

Your fundamental right: privacy

5.4 helps with a variety of privacy issues around the world. So when users and stakeholders ask about regulatory compliance, or how your team handles user data, the answers should be a lot easier to get right.

Take a look:

  • Now personal data exports include users session information and users location data from the community events widget. Plus, a table of contents!
  • See progress as you process export and erasure requests through the privacy tools.
  • Plus, little enhancements throughout give the privacy tools a little cleaner look. Your eyes will thank you!

Just for developers


 


Add custom fields to menu items—natively

Two new actions let you add custom fields to menu items—without a plugin and without writing custom walkers.

On the Menus admin screen, wp_nav_menu_item_custom_fields fires just before the move buttons of a nav menu item in the menu editor.

In the Customizer, wp_nav_menu_item_custom_fields_customize_template fires at the end of the menu-items form-fields template.

Check your code and see where these new actions can replace your custom code, and if you’re concerned about duplication, add a check for the WordPress version.

Blocks! Simpler styling, new APIs and embeds

  • Radically simpler block styling. Negative margins and default padding are gone! Now you can style blocks the way you need them. And, a refactor got rid of four redundant wrapper divs.
  • If you build plugins, now you can register collections of your blocks by namespace across categories—a great way to get more brand visibility.
  • Let users do more with two new APIs: block variations and gradients.
  • In embeds, now the block editor supports TikTok—and CollegeHumor is gone.

There’s lots more for developers to love in WordPress 5.4. To discover more and learn how to make these changes shine on your sites, themes, plugins and more, check the WordPress 5.4 Field Guide.

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

426  (0) 2020.06.06
425  (0) 2020.06.06
423  (0) 2020.06.05
422  (0) 2020.06.05
421  (0) 2020.06.04

한 때는 중고나라 이용하다 이제는 않는다.

그냥 그런 사람들이랑 엮이기 싫기 때문이다.

물론, 워낙 다양하고 규모가 크기 때문에 평가를 하는 것은 아니다.

다만, 만난 사람들 대부분이 물건에 대한 하자를 숨기고 말 안해서 얼마 뒤 밝혀지거나,

맥북 같은 경우 오래오래 사용해 놓고서는 전원선을 뽑지 않았으니, 낮은 배터리 사이클 가지고만 말하는 것이 싫어서이다.

아이폰의 경우 만나면 일단 깍아 달라고 하는 것도 스트레스라서

이용 안 한지 7년 정도 되는 것 같다.

중간에 무료 나눔 할 때는 좋은 사람 만났다. 다만 말만 좋았지 뭐 도와 준다거나 하는 것도 그냥 인사치레...

물건 받으러 자전거 타고 오는 것도 어찌보면 좋은 모습일 수도 있지만 그냥 이 동네 사람들 만나면 뭔가 예상되는 무엇인가가 있다.

그리고 늘 예상하려고 하는 것도 있고,

정말 큰 차이인데도 작게 보는 것. 작게 보면서 뭔가 크게 보는 것 처럼 착각을 하는 것 등.

 

그냥 물건 주고 받는 것인데 사람 볼 필요 없는데 나랑은 안 맞는다. 

그에 반해 와이프는 잘 이용한다. 내 판단은 아이들 물건 위주다 보니 그런 부류의 사람을 만나서 좋은 경험이라 보여질 뿐이라고 생각한다.

MBTI 온라인으로 봤는데 역시나 조커네... 친구들도 조커라고 하고...

 

어찌보면 조커도 사람들에게 너무 큰 기대를 해서 그럴 수도 있다.

 

그냥 내가 매력적인 사람들 하고만 친해도 될 것 같다.

 

우선, 돈 때문에 사람 관계 져 버리는 사람들은 제외다. 하버드 연구팀에서의 행복 조건에 대한 오랜 연구 결과가 사람이라고 한

것도 내 주장을 뒷받침 해 준다. 물론, 내 주장이 아니라 혼자 살 수 없는 인류가 시작하고 가장 기본적인 것이었지.

 

남을 먹을 밥그릇 까지 뺏어서 졸부차 포르쉐 사는 개타트업 졸부는 무조건 제외.

https://www.16personalities.com/ko/%EB%AC%B4%EB%A3%8C-%EC%84%B1%EA%B2%A9-%EC%9C%A0%ED%98%95-%EA%B2%80%EC%82%AC

 

무료 성격유형검사 | 16Personalities

혹 질문이 마음에 들지 않더라도 정직하게 답변하십시오.

www.16personalities.com

 

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

425  (0) 2020.06.06
424  (0) 2020.06.06
422  (0) 2020.06.05
421  (0) 2020.06.04
420  (0) 2020.06.04

원격 서버에서 (405) 메서드를 사용할 수 없음 오류를 반환했습니다. 라는 에러가 뜬다.

엥? 사진 주소가 어떻게 되지 하고 클릭해 보니 

https://www.instagram.com/p/%ED%95%B4%EC%8B%9C%EA%B0%92해시값

으로 나온다. 그리고 로긴 세션이 필요하다는 것을 알았다. 언제부터 로긴해야 사진을 볼 수 있었지?

 

기업명

()네오앤사람

기업형태

일반,중소기업

대표자

김동섭

설립일자

2017.01.16

사업자번호

646-87-*****

상장일자

 

법인번호

180111-*******

산업명

(F41229)기타 토목시설물 건설업

주소

부산 사하구 윤공단로**번길 **

 

 

let point = (3, 2)

 

switch point {

// Bind x and y to the elements of point.

    case (3, let y):

        print("The point is at  \(y)).")

    case (let x, 2):

        print("The point is at \(x).")

    default:

        print("defult")

}

 

 

 

error: protocol methods must not have bodies

 

protocol somebodyDelegate : class {

    func hardwork()

}

 

 

 

   func hardwork() {

        print("hello world")

        print("teaching basics")

        print("provide a lot of food")

        print("et cetra...")

    }

 

 

class theOtherone : somebodyDelegate {

    hardwork()

}

 

 

Redundant conformance of 'theOtherone' to protocol 'somebodyDelegate'

 

 

 

 

Expected declaration

 

 

 

 

 

import UIKit

 

class dummy {

    var A : Int = 3

}

 

class ViewController: UIViewController {

    

    override func viewDidLoad() {

        super.viewDidLoad()

        // Do any additional setup after loading the view, typically from a nib.

        var a = dummy()

        

        

        

        switch a.A {

            

        case var b :

            

            print("a.A = \(a.A)")

            

            print("b = \(b)")

            

            b = 2

            

            print("a.A = \(a.A)")

            

            print("b = \(b)")

            

        default:

            

            print("defult")

            

        }

        

        

        

        print("a.A = \(a.A)")

    }

    

    

}

 

 

 

class ViewController: UIViewController {

    

    override func viewDidLoad() {

 

    }

}

 

 

 

 

Use of unresolved identifier 'hardwork'

 

 

 

import UIKit

 

protocol somebodyDelegate : class {

    func hardwork()

}

 

class ViewController: UIViewController {

    

    override func viewDidLoad() {

        let s = someOne()

        s.hardwork()

        

        someOne().hardwork()

        

        

    }

}

 

 

class someOne : somebodyDelegate {

    func hardwork() {

        print("hello world")

        print("teaching basics")

        print("provide a lot of food")

        print("et cetra...")

    }

}

 

 

 

 

 

 

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

424  (0) 2020.06.06
423  (0) 2020.06.05
421  (0) 2020.06.04
420  (0) 2020.06.04
419  (0) 2020.06.04

블로그 게시물은 계속 늘어나는데 5월 1일 부터 수익이 확 줄었다.

유툽 때와 마찬가지고 돈 안 주려고 갖은 수를 쓰는 구나. 구글 검색 통해 유입되는 것도 바뀌었으면 한다.

글로벌 통일은 개뿔.

그냥 국내는 국내 서비스가 먹었으면 한다.

대한민국 사람은 똑똑하니까.

레거시 코드를 지속적으로 업데이트 하는 것은 늘 있는 일이다.

17로 올릴까 하다가 그냥 한 단계만 올렸다.

 

최강의 그래픽 카드는 타이탄 2개 연결한거네.

간만에 sqliteflow가 업데이트 되었다.

아이폰에서 sql 쓴다면 추천하는 툴.

스팸이 너무 많아져서 이제야 본 이벤트

스팸 메일 보내는 인간들...

에혀

그리 살아라.

 

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

423  (0) 2020.06.05
422  (0) 2020.06.05
420  (0) 2020.06.04
419  (0) 2020.06.04
418  (0) 2020.06.04

3줄 요약 AI 사용기

 

오호!

 

많으면?

안됨...

한국어 자연어 처리는 아직 매력적인 솔루션이 없네.

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

422  (0) 2020.06.05
421  (0) 2020.06.04
419  (0) 2020.06.04
418  (0) 2020.06.04
417  (0) 2020.06.04

이 홈페이지 크롤링 하는데 2일 걸렸네. HTTrack 으로.

instagram은 안된다.

 

링크는 10만개가 한계였다.

인스타는 getleft로도 안된다.

cyotek webcopy 로 변경

오호... UI가 꽤 마음에 든다.

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

421  (0) 2020.06.04
420  (0) 2020.06.04
418  (0) 2020.06.04
417  (0) 2020.06.04
416  (0) 2020.06.04

https://tv.kakao.com/channel/3304209/cliplink/409615016

https://tv.kakao.com/channel/3304209/cliplink/409615093

 

미지아 IMI 홈 시큐리티 카메라의 주간 모드와 야간 모드 비교 영상이다. 영상에는 샤오미 카메라라고 달았다. 

왜 지금 1월 영상을 올리냐면... 이제야 메모리 카드를 뽑았기 때문이다. 

64기가 메모리 꽂아 두고 있었는데 어느 순간부터 계속 오류가 났다. ㅡㅡ; 그냥 예상했다. 작은 임베디드 보드에 64기가 지원을 달아

놓았다고 해도 파일 시스템이 다 찰 때까지 테스트를 제대로 해 보고 팔았으리는 없고, 판 후에 펌웨어 업그레이드를 한다고 해도 해당

모듈은 민감하다. 파티션이나 파일 시스템 관리는 그렇지 뭐. 

게다가 몇 번 자동 업데이트 후에 통화가 제대로 안되거나 영상 뜨는 시간이 길어진 점 등을 보면 개발팀에 에이스가 그만 둔 것 같다.

뭐, 암튼 잘 쓰고는 있다.

당연히 보안 문제 있겠지만 회사 이름이 있으니 쉽게 뚫지 못하게 만들테고,

뚫려서 가져간다고 해도 중국에서 가져갈테고 중국은 크고 우리 문화보다는 나으니까.

 

 

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

420  (0) 2020.06.04
419  (0) 2020.06.04
417  (0) 2020.06.04
416  (0) 2020.06.04
415  (0) 2020.06.04

https://tv.kakao.com/channel/3304209/cliplink/409610854

 

뻘짓을 해 보았다.

그리고 앞으로는 카카오에 동영상을 올리기로 하였다. 

뭐, 국내 플랫폼 이용해야지.

 

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

419  (0) 2020.06.04
418  (0) 2020.06.04
416  (0) 2020.06.04
415  (0) 2020.06.04
414  (0) 2020.06.04

천재들이 선택하는 것

1. 그레고리페렐만

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

 

선택은?

 

효도

 

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

 

 

https://www.youtube.com/watch?v=-0V1hZvIWgk

 

 

2. 김웅용

 

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

 

선택은?

 

공사

 

http://www.cbinews.co.kr/news/articleView.html?idxno=73415

 

충북개발공사 김웅용 부장 '세계 3대 천재' 화제 - 충북인뉴스

과거 한국 최고의 천재로 주목받았던 충북개발공사 김웅용 기획홍보부장이 세계 3대 천재로 소개됐습니다. 루마니아 외신들은 세계에서 가장 아이큐가 높은 인물을 소개하면서 아이큐 210의 김�

www.cbinews.co.kr

충북개발공사 김웅용 부장 '세계 3대 천재' 화제 - 충북인뉴스

과거 한국 최고의 천재로 주목받았던 충북개발공사 김웅용 기획홍보부장이 세계 3대 천재로 소개됐습니다. 루마니아 외신들은 세계에서 가장 아이큐가 높은 인물을 소개하면서 아이큐 210의 김�

www.cbinews.co.kr

 

 

지금은 교수님 되셨지만 ^^

이래서 다들 공사, 공사 하는 것?

 

 

 

천재가 옳은 선택을 했다고 생각되면,

공사가거나 효도 합시다.

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

418  (0) 2020.06.04
417  (0) 2020.06.04
415  (0) 2020.06.04
414  (0) 2020.06.04
413  (0) 2020.06.03

애플에서 온 편지 일부

 

내 이야기로 보험을 좀 들어야 할 것 같다. 난 10년 이상 된 관계가 아니면 그 사람에 대해 전혀 이야기하지 않는다. 물론, 10년 넘어도 다른 카테고리의 사람에게는 이야기를 하지 않아서 발생되는 에피소드도 있긴 하다.

 

이 메일을 공개하고 현실에 대해 조금이나마 공유하고픈 이유는 너무도 가려진 진실이 많아서 내가 가르치지 않은 상태에서 학생들과 면담했던 때의 안쓰러움 때문이다.

 

우선 마케팅 측면에서 제목을 달았으니 내가 받은 편지를 공개한다. 2달 넘은 편지의 일부다.

 


 

Hi Eddie,

 

Good to hear from you! I hope you and your family are doing fine and not impacted by the CORVID19 virus.

.

.

.

I'm doing fine, still working and working from home. Every high tech company, I know, ask employees to work from home. It has been this way for three weeks now. We are adjusting well. I just hope the economy is not getting too big a hit and recover quickly. Most important of all, is everyone stays safe and healthy.

 

I'm approaching retirement age and plan to retire soon. I look forward to it.

 

Thanks for the greetings, and please say hi to your family for me.

.

.

.


마케팅 측면이라고 말한 이유는 오래도록 편지를 주고받을 수 있는 이유는 같이 술을 마시고 같이 일을 하고 같이 놀러 가는 등 깊이 있는 커뮤니케이션을 했었기 때문이다. 물론, 애플뿐 아니라 마소, 페북 친구도 있다. 이미 12년 전부터 미국 들락거리며 스피킹도 된 상태고 술을 좋아해서 친구가 많다. 물론, 적도 많다. 내가 정작 말하고자 하는 것은 미국, 캐나다, 호주, 독일, 뉴질랜드 등 해외에 관한 이야기다. 트렌디하게 항목마다 3줄 이하로 요약하려고 애써 보겠다.

 

1. 의료보험

 의료보험이 없으면 병원비가 너무 비싸서 어쩔 수 없이 일한다. 한국 사람들은 나이 많은 개발자도 있다고 아름답게 생각한다. 이 분 외에 다른 나이 지긋한 분께도 여쭈었는데 의료보험 비용이 비싸기 때문에 일한다고 했다. 다. 물론, 그 단 하나의 이유는 아니다. 워낙 뛰어난 분들이기에. 다만, 진솔한 이야기를 해 준 것이고 그것을 공유할 뿐.

 

2. 유리천장

 본인 커리어 패스에서 다른 커리어 패스로 바꾸면, 한국처럼 연봉을 유지해주지 않는다. 그런데도 커리어를 유지하는 것이 좋다고 한다. 해외에서는 유리 천장이 없을 것 같지만 시민권까지 획득한 이민 1세대 시니어들의 이야기를 들어보면 유리 천장을 분명히 느끼고 있다고 말했다. 물론, 1에서 말한 분 외 다른 사람이다. 미국 유명 통신사의 매니저 였는데 매우 뛰어난 방글라데시 출신이었다. 이 이야기를 들은지는 10년이 넘었기에 지금은 유리 천장이 사라졌을까? 오히려 트럼프 덕에 똑같으리라 생각된다.

 

3. 학벌

 이미 1세대를 넘은 2세대도 학벌을 따진다. 한창 일 때 친하던 친구라서 같이 본대디, 후터스에서 술 마시며 많은 이야기를 나누었다. 시카고대 출신인데 자부심이 있으면서 한편으로는 아이비 리그에 대한 벽을 이야기 해 주었었다. 한국만 학벌 따지는 것 아니다. 한국은 다들 알다시피 학벌 사회. 중소기업연구원에 계셨던 내 직장 상사는 해외에서 학위를 사 가지고 온다는 말도 해 주셨다. 박사를 해도 자국에서 하는 박사는 2배 어렵게 딸 수 있다고 하고 학위 따서 다시 본국으로 돌아갈 박사는 2배 쉬운데 학비는 2배 비싸다고 했다. 레알 현실. 트럼프 가 유학생 어쩌구 하는 말이 그냥 나온 말이 아닌 것이다.

 

4. 사족

 마소 직원인 직원은 윈도우를 x% 싼 가격에 사 주었다. 구글 직원은 구글 본사에 있는 기념품 마트에서 기념품을 사 주었다(오픈되어 있지만 구글러만 이용할 수 있었다.) 이 메일을 써 준 애플 직원은 7~8년 전 3대까지는 애플 제품 할인 된다고 해서 구매할 제품이 있다면 말하라고 했었다. 난 삼성전자에서 싸게 파는 물품을 샀었는데 슬레이트 PC, DVD 플레이어, 청소기, TV, 에어컨 등... 그 중 고장 안 난 것은 에어컨 밖에 없다. 가전은 LG.

 

그냥 현실 이야기를 좀 해보고 싶었다.

 

아직 대한민국 꼰대들이 학벌 학벌 외치고 있다.

학생수가 줄고 지방에는 대학교가 문을 닫다 보니 수도권으로 또 모이니

서울, 연고대, 카이스트 아닌 학생들이 또 학벌을 외친다.

 

회사 입사할 때는 좋은데... 졸업한지 5년이 지나도 학벌 외치고 있으면 그냥 그 동안 운이 좋았거나 꼼수로 살아 온 것이다.

 

천재는 거의 없다. 한 분야에 미친 인간들만 있을 뿐이다.

 

"거의"를 붙이는 이유는 정말 천재가 있긴 하더라.

수십 년 전 읽은 책의 페이지에 있는 단어들을 기억하는 "기억의 산"이라고 불리는 사람들이나, 김웅용씨, 푸앙카레 추측을 풀고 모든 상을 거부한 그레고리 페렐만, 혹은 스티브 워즈니악 같이 사회적 잣대를 무시하고 그것으로 평가할 수 없이 자신의 길을 가는 사람들이겠지.

 


음... 글 쓰다 보니 아이디어가 떠올라, 다음 글은 천재들의 선택으로 오늘 바로 써야 겠다. 

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

417  (0) 2020.06.04
416  (0) 2020.06.04
414  (0) 2020.06.04
413  (0) 2020.06.03
412  (0) 2020.06.03

IT 독립투사, 알자.

 

IT 분야에 의사, 열사는 없다. 국가 보훈처 자료에 따르면,

 

□ 의사(義士)

  ○ 개념 : 성패에 관계없이 목숨을 걸고 무력으로써 적에 대한 거사를 결행한 사람

  ○ 대표적 인물

    - 안중근 의사 : 1909년 이토오 히로부미 저격

    - 이봉창 의사 : 1932년 일본천황 투탄

    - 윤봉길 의사 : 1932년 홍구공원 투탄

 

□ 열사(烈士)

  ○ 개념 : 직접적인 행동 대신 강력한 항의의 뜻을 자결로써 자신의 굳은 의지를 내보인 사람

  ○ 대표적 인물

    - 민영환 열사 : 1905년 을사조약 체결반대 자결

    - 이  준 열사 : 1907년 헤이그 밀사로 독립의지 표명 자결

    - 황  현 열사 : 1910년 경술국치 항거 자결

 


이 분야에 30년 넘게, 어좁이 주장에 따라 월급 받는 기준으로 20년 넘게, 한 달도 안 빠지고 연속으로 월급 받는 기준으로는 10년 넘게 있었던 경험으로 말해보면, 

 

대한민국 IT 분야에 이 정도의 인물은 단 한 명도 없다.

 

IT 하다가 관리자나 경영자로 올라가면 코더 무시하다가 슈퍼 코더에게 까일 줄이나 알지,

http://www.agrinet.co.kr/news/articleView.html?idxno=92307

[2000~2009년]“WTO 반대” 이경해 열사 자결에 전 세계 충격 - 한국농어민신문

2000년대는 농산물 수입개방이 급물살을 탄 시기로 요약된다. 또 다른 새천년의 시작을 알리며 온 국민의 기대 속에 시작됐지만 물밀 듯 밀려드는...

www.agrinet.co.kr

 

이런 책임을 지려는 사람 또한 없다. 코더가 야근하다 죽어도 책임자들의 입장 표명은커녕 그냥 묻혀 버린다.

 

그렇다 그냥 IT 바닥은 그저 그런 사람들의 모임이다.

 

물론, 나 포함해서.

 


의학 분야는 다르다.

https://bikloud.tistory.com/289

아주대학교 병원 외상외과 이국종 교수 어머니의 말씀

이국종 교수의 어머니께서 하신 말씀 "돌아서 가기보단 차라리 부딪혀 산산조각나는 게 낫다. 남자는 죽을 때까지 길바닥에서 일하다 파편처럼 흩어져야 한다." "네 주제에 다른 사람의 인생에 �

bikloud.tistory.com

 

 

우리나라 의학과 복지 수준은 세계 최고라는 것에 다들 공감할 것이다.

그래서인지 코로나 터지고 미국, 유럽에서 성공하지 못하고 자리도 제대로 잡지 못한 IT 비 코더가 대거 한국으로 유입되어서 또 한 번의 귀찮음이 예상되기에 글을 남겨둔다.


의사, 열사는 없지만 투사는 있다.

https://www.oss.kr/news/show/330f642b-e8fc-42b7-a72f-11b03838d305

리눅스로 '학교 컴퓨터실' 바꾸는 선생님들 - 공개SW 포털

2013년 03월 04일 (월) ⓒ 지디넷코리아, 임민철 기자 imc@zdnet.co.kr고등학교 선생님이 오픈소스 전도사가 돼 상용소프트웨어(SW)로 가득찬 학교 컴퓨터실을 바꾼...

www.oss.kr

 

이런 사람들이다.

 

안타까운 사실은 독립투사들이 열심히 전면에서 푼 돈으로 싸워봤자. 요즘 세대 이완용들은 항상 이긴다.

http://www.dt.co.kr/contents.html?article_no=2011092702019957744001

대학들 SW 사용료 4년새 두배 늘어

국내 대학들이 업무용 소프트웨어 사용비로 개발업체에 지불하는 금액이 4년새 두배..

www.dt.co.kr

 

윈도 라이선스 비용 매년 2배씩 올린 경우도 있다.

 

이것은 뉴스로 본 내용이고, 내가 이 글에 매년 10배씩 올렸다고 적어도 상관없다. 어차피 제대로 공개 안 할 테니 말이다.

 

이제 의사, 열사도 필요할 때가 된 것일까? 특히, 의사(義士)


 

한국은 여전히 식민지. 

 

독립투사 목록은 계속 업데이트하겠다.

0. FSF(Free Software Foundation) 멤버.

1. 저 위에 소개해드린 교사분들.

2. 하모니카 OS 관련자 IT인들.

3. 우분투 한국 커뮤니티 IT 인들.

 

https://hamonikr.org/

리눅스 커뮤니티 하모니카(HamoniKR)

hamonikr.org

 

 

윈도, 혹은 맥 밖에 모르시는 분은 브라우저에서 아래 링크를 한 번 클릭해 보시기 바란다.

 

https://www.ubuntu-kr.org/tour/ko-kr/index.html#

우분투 온라인 투어

www.ubuntu-kr.org

 


모르면 당한다.

모르면 IT 독립투사를 못 알아본다.

알자.

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

416  (0) 2020.06.04
415  (0) 2020.06.04
413  (0) 2020.06.03
412  (0) 2020.06.03
411  (0) 2020.06.03

www.gamtoon.com/new/tf/ctn99/view.gam?num=1&pageno=15&startpage=11

 

겜툰-카툰으로 보는 재미있는 게임이야기

 

www.gamtoon.com

다시 봐도 너무 재미있다. "개발자만화"

 

PHAssetCollection from the Photos framework instead

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.5.sdk/System/Library/Frameworks/Photos.framework/Headers/PHImageManager.h:18:2: "Photos requires C++11 or later"

 

compiler default

 

C++ lan -> C99 -> C++ 11

 

Showing All Messages

Undefined symbol: _OBJC_CLASS_$_PHAssetCollection

 

 

Showing All Messages

Undefined symbol: _OBJC_CLASS_$_PHFetchOptions

 

Undefined symbol: _OBJC_CLASS_$_PHAssetCollectionChangeRequest

 

Undefined symbol: _OBJC_CLASS_$_PHAssetChangeRequest

 

Undefined symbol: _OBJC_CLASS_$_PHPhotoLibrary

 

 

 

vmware tensorflow gpu


tigRules1, 2, 3, 4, 5, 6 모두 삭
룰 축소로 
fileprivate func onlyTheRule(_ bloc: AtomicBloc, _ vX: Int, _ vY: Int, _ effectX: CGFloat, _ effectY: CGFloat) 
로 변경

2개 블럭 동시 폭파를 1개 폭파로 변경

1개 폭파시 아래 쪽으로 이동 구현

아래쪽 이동시 다시 winning rule 체크

바닥이 나올 때 까지 반복

양 옆도 같이 체크 

양 옆이 깨지면 다시 블럭 내려와서 또 체크

어느 상황을 우선 순위에 둘 것인가? 

우선 폭파되면서 내려가는 쪽 우선 계산

그 이후 전수 체크 양 옆만 계산

터진 블럭 아래로 내리기

내려온 블럭 세로만 검사

이 후 전수 검사

loop

 

 

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

415  (0) 2020.06.04
414  (0) 2020.06.04
412  (0) 2020.06.03
411  (0) 2020.06.03
410  (0) 2020.06.03

save picture to album in CORDOVA


CDVCamera.m 에서

writeImageDataToSavedPhotosAlbum:self.data

2020-06-03 07:57:36.221393+0900[3602:1883425] Apache Cordova native platform version 5.0.1 is starting.
2020-06-03 07:57:36.221469+0900[3602:1883425] Multi-tasking -> Device: YES, App: YES
2020-06-03 07:57:36.231134+0900[3602:1883425] *** Assertion failure in -[CDVConfigParser parser:parseErrorOccurred:], /Users/soralee/Documents/GitHub/DaelimOCR/CordovaLib/Classes/Public/CDVConfigParser.m:78

NSData *imgdata = [[NSData alloc]initWithBase64EncodedString:base64Image options:NSDataBase64DecodingIgnoreUnknownCharacters];

                                                  ALAssetsLibrary *library = [ALAssetsLibrary new];

                                                        [library writeImageDataToSavedPhotosAlbum:imgdata metadata:nil completionBlock:nil];

                                  }

                }

NSURL *bundleURL = [[NSBundle mainBundle] URLForResource:@"CDVCamera" withExtension:@"bundle"];

    NSBundle *bundle = [NSBundle bundleWithURL:bundleURL];

    NSString *imagePath = [bundle pathForResource:@"cameraguide" ofType:@"png"];

    UIImage *uandImage = [UIImage imageWithContentsOfFile:imagePath];

//    UIImage *uandImage =  [UIImage imageNamed:@"cameraguide.png"];

주석 처리된 것은 deply 된 프로젝트에서 쓰고 그 위의 코드들은 bundle directory를 만든 경우 쓴다.

 

 

 

1. Camera.js takePicture2 호출하는 getPicture2 삽입

 

cameraExport.getPicture2 = function (successCallback, errorCallback, options) {

        argscheck.checkArgs('fFO', 'Camera.getPicture', arguments);

        options = options || {};

        var getValue = argscheck.getValue;

 

        var quality = getValue(options.quality, 50);

        var destinationType = getValue(options.destinationType, Camera.DestinationType.FILE_URI);

        var sourceType = getValue(options.sourceType, Camera.PictureSourceType.CAMERA);

        var targetWidth = getValue(options.targetWidth, -1);

        var targetHeight = getValue(options.targetHeight, -1);

        var encodingType = getValue(options.encodingType, Camera.EncodingType.JPEG);

        var mediaType = getValue(options.mediaType, Camera.MediaType.PICTURE);

        var allowEdit = !!options.allowEdit;

        var correctOrientation = !!options.correctOrientation;

        var saveToPhotoAlbum = !!options.saveToPhotoAlbum;

        var popoverOptions = getValue(options.popoverOptions, null);

        var cameraDirection = getValue(options.cameraDirection, Camera.Direction.BACK);

 

        var args = [quality, destinationType, sourceType, targetWidth, targetHeight, encodingType,

            mediaType, allowEdit, correctOrientation, saveToPhotoAlbum, popoverOptions, cameraDirection];

 

        exec(successCallback, errorCallback, 'Camera', 'takePicture2', args);

        // XXX: commented out

        // return new CameraPopoverHandle();

    };

 

2. selvyOcrPlugin.js

navigator.camera.getPicture2(

        // 성공 콜백 함수

카메라 호출 함수 getPicture2 변경

 

3. CDVCamera.h/.m 수정하여 가이드 삽입



이 정도 작업들을 하였다. 급변하는 요구 사항에 빠른 대응은 2, 3, 4 로 이어지는 의미 없는 네이밍. 네이밍에 개발 시간 50% 이상을 쓴다. ㅡㅡ; 물론, 나 혼자 아키텍팅하고 개발하는 프로젝트는 네이밍에 더 신경을 써야지

 

const express = require('express')

const siofu = require("socketio-file-upload")

const app = express()

const path = require('path')

const http = require('http').Server(app)

const io = require('socket.io')(http)

const parseTorrent = require('parse-torrent')

const torrentStream = require('torrent-stream')

const zipFolder = require('zip-folder')

const numeral = require('numeral')

const uniqId = function () {

  return Math.round(new Date().getTime() + (Math.random() * 100))

}

const rmdir = require('rimraf')

const fs = require('fs')

const bytes = function(num) {

  return numeral(num).format('0.0b');

}

const simples = function(num) {

  return numeral(num).format('0');

}

 

 

app.use("/static", express.static('public'))

 

app.set('view engine', 'pug')

 

app.get('/', (request, response) =>{

  rmdir('public/files/', function(error){});

  response.render('layouts/app', { title: 'TorrentSpeak'})

})

 

io.on('connection', function(socket){

  let uploader = new siofu()

  uploader.dir = "upload/"

  uploader.listen(socket)

  // Do something when a file is saved:

  uploader.on("saved", function(event){

      torrentFile = event.file.pathName

      var msg = parseTorrent(fs.readFileSync(torrentFile))

      parseTorrent.remote(msg, function (err) {

 

        if (err) {

          io.emit('error dl')

        }

        else{

          io.emit('add torrent')

          let id = uniqId()

          let engine = torrentStream(msg,{

              'connections': 100,

              'path': './public/files/'+id

          })

          engine.on('ready', function() {

              engine.files.forEach(function(file) {

                  file.select()

              })

          })

          engine.on('download', function(){

            downloadLength = engine.swarm.downloaded

            totalLength = engine.files.reduce(function (prevLength, currFile) {return prevLength + currFile.length}, 0);

            var draw = simples(downloadLength* 100 / totalLength)

            var progress = bytes(downloadLength)+'/'+bytes(totalLength)

            io.emit('edit dl', progress, draw)

          })

          engine.on('idle', function(){

            zipFolder('./public/files/'+id, './public/files/'+id+'.zip', function(err) {

                if(err) {

                } else {

                    io.emit('end dl', './static/files/'+id+'.zip')

                }

            })

            engine.destroy()

          })

        }

      })

      fs.unlink(torrentFile)

  });

  // Error handler:

  uploader.on("error", function(event){

      io.emit('error dl')

      console.log("Error from uploader", event);

  });

  socket.on('add magnet', function(msg){

 

    parseTorrent.remote(msg, function (err) {

 

      if (err) {

        io.emit('error dl')

      }

      else{

        io.emit('add magnet', msg)

        let id = uniqId()

        let engine = torrentStream(msg,{

            'connections': 100,

            'path': './public/files/'+id

        })

        engine.on('ready', function() {

            engine.files.forEach(function(file) {

                file.select()

            })

        })

        engine.on('download', function(){

          downloadLength = engine.swarm.downloaded

          totalLength = engine.files.reduce(function (prevLength, currFile) {return prevLength + currFile.length}, 0);

          var draw = simples(downloadLength* 100 / totalLength)

          var progress = bytes(downloadLength)+'/'+bytes(totalLength)

          io.emit('edit dl', progress, draw)

        })

        engine.on('idle', function(){

          zipFolder('./public/files/'+id, './public/files/'+id+'.zip', function(err) {

              if(err) {

              } else {

                  io.emit('end dl', './static/files/'+id+'.zip')

              }

          })

          engine.destroy()

        })

      }

 

    })

 

 

  })

 

  socket.on('disconnect', function(){

  })

})

 

http.listen(5555, function(){})

비트토렌트 스트리밍 모듈이 node.js 에 있었네.

 

새로운 세상.

 

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

414  (0) 2020.06.04
413  (0) 2020.06.03
411  (0) 2020.06.03
410  (0) 2020.06.03
409  (0) 2020.06.03

https://namu.wiki/w/%EB%9E%98%EB%A6%AC%20%ED%8E%98%EC%9D%B4%EC%A7%80

 

래리 페이지 - 나무위키

이 저작물은 CC BY-NC-SA 2.0 KR에 따라 이용할 수 있습니다. (단, 라이선스가 명시된 일부 문서 및 삽화 제외) 기여하신 문서의 저작권은 각 기여자에게 있으며, 각 기여자는 기여하신 부분의 저작권�

namu.wiki

비엔지니어가 엔지니어를 관리하면 된다는 생각으로 매니저를 전부 해고하려 시도하는

역시 래리 페이지다.

시점 그의 역할은 자잘한 경영에서 물러나 구글이라는 거대한 회사의 비전을 제시하는 파이오니어에 가깝다.

미래에는 인류의 삶을 바꿀 있는 중대한 기술 개발을 지원하기 위함이다. 회사 차원에서 내리기 힘든 투자는 개인적으로라도 한다고.

ㅋㅋㅋㅋ

http://news.bbc.co.uk/2/hi/business/3666241.stm

 

BBC NEWS | Business | Profile: The Google founders

By Will Smale BBC News Online business reporter Larry and Sergey - the boys next door made very good. The founders of the Google internet search engine - Larry Page and Sergey Brin - are the type of young men most parents would dream of their daughters bri

news.bbc.co.uk

래리 페이지 트위터는 없다.

피차이는 있음.

https://twitter.com/sundarpichai

 

Sundar Pichai(@sundarpichai) 님 | 트위터

@sundarpichai 님 언뮤트하기 @sundarpichai 님 뮤트하기 팔로우 @sundarpichai 님 팔로우하기 팔로잉 @sundarpichai 님 팔로우 중 언팔로우 @sundarpichai 님 언팔로우하기 차단됨 @sundarpichai 님이 차단됨 차단 해제

twitter.com

리사수도 래리 팔로우 한다.

https://twitter.com/LisaSu

 

Lisa Su(@LisaSu) 님 | 트위터

@LisaSu 님 언뮤트하기 @LisaSu 님 뮤트하기 팔로우 @LisaSu 님 팔로우하기 팔로잉 @LisaSu 님 팔로우 중 언팔로우 @LisaSu 님 언팔로우하기 차단됨 @LisaSu 님이 차단됨 차단 해제 @LisaSu님 차단 해제 대기 중

twitter.com

5만 과 284만의 큰 차이는 있지만

https://www.youtube.com/watch?v=Im6xQyglYuU&feature=youtu.be

이런 굴욕의 영상도 있지만,

 

엔지니어들은 잡스보다 워즈를 사랑하듯이

We love Dr. Lisa su!

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

413  (0) 2020.06.03
412  (0) 2020.06.03
410  (0) 2020.06.03
409  (0) 2020.06.03
408  (0) 2020.06.02

http://weeklybiz.chosun.com/site/data/html_dir/2013/06/28/2013062801819.html

 

1000억 들여 했는데… 국내 컨설팅 잔혹사

국내 기업인들 사이에서도 컨설팅을 받을 필요가 있나, 없나를 놓고 의견이 분분하다. 컨설팅 무용론자들이 흔히 드는 사례 중 하나가 LG전자이다...

weeklybiz.chosun.com

컨설팅의 허와 실이다. 매년 300억씩 스타트업 투자하면 경영과 필요없이 괜찮은 신기술이 하나씩 나올 것 같다.

국민은행도 김정태 행장 시절 매킨지를 즐겨 썼다. 국민은행은 1999년부터 4년간 매킨지에 500억원가량을 지급한 것으로 알려져 있다. 그러다 강정원 행장으로 바뀌면서 규모가 급감했고, 어윤대 회장 때부터는 일절 쓰지 않았다. 어 회장은 "수백억씩 들어가는데 비용 대비 별로 도움 안 된다. 조직에 대해 제일 잘 아는 것은 직원"이라고 말하곤 했다.

이 글을 보다. 또 검색을 해 보니,

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

 

[삶과 추억] 김정태 초대 통합 국민은행장 별세

김정태(사진) 전 국민은행장이 2일 오전 급환으로 별세했다. 67세. 국민은행 등에 따르면 김 전 행장은 지난주 갑자기 의식을 잃어 경기도 고양시의 한 병원으로 옮겨졌지만 끝내 의식을 회복하

news.joins.com

 

돌아가셨네...

 

컨설팅 업체가 관여해 잘된 경우도 있다. 매킨지가 두산그룹을 구조조정한 것은 성공 사례로 꼽힌다. 1990년대 중반 매킨지는 두산그룹이 비핵심 자산을 매각, 계열사 통폐합 등 구조조정에 나서야 한다는 보고서를 제출했고 두산은 그것을 그대로 따랐다. 두산음료와 OB맥주를 매각하고, 현재의 중공업 중심 산업구조를 짰다. 올리버와이만이 관여한 2005년 신한은행과 조흥은행 합병 프로젝트도 비교적 잘 처리됐다는 평가를 받았다.

-0-

이상하네 오비 맥주는 국내 어디가도 볼 수 있어서 무조건 흑자 일텐데

https://www.hankyung.com/finance/article/2019072959631

 

[단독] '몸값 9兆' 오비맥주 5년 만에 다시 매물로

[단독] '몸값 9兆' 오비맥주 5년 만에 다시 매물로, 유통사·PEF 등에 인수 타진 거래 성사 땐 국내 최대 M&A

www.hankyung.com

찾아 보니 흑자 맞는데 가진 회사가 빚이 많아서 판단다.

 

참, 웃긴 세상이다. 오비에서 일하는 직원들은 대부분 한국 사람일테고 열심히 일해서 흑자를 내는데,

해외에서 그런 기업 가지고 돈 놀이 하고 있으니.

 

믓튼, 컨설팅 그룹을 정리 해고의 도구로 쓰는 것은 나쁘지 않은 전략인 것 같다. 개인이 하기는 힘들다.

황창규 사장 정도 포스가 아니면 그러기 힘들지.

 

그리고 흑자 기업이 돈놀이에 이용되는 것은 

노조가 필요한 이유다. 노조가 열심히 노력해야 한다. 임직원 본인들이 일해서 번 금액은 본인들이 가져가도록 노력 해야지.

그래야 경제가 돌지. 

 

참, 호가든은 캔이다. 위키피디아 발췌

벨기에산 수입 맥주인 호가든을 오비맥주가 광주공장에서 직접 생산해서 판매하면서 붙은 별명.[11] 오비맥주가 국내에서 생산하면서 맛은 떨어졌는데 수입 맥주 가격을 받는다는 비판이 있었다.[12] 수입맥주에 유리한 과세체계와 수입맥주 선호 현상때문에 호가든 캔의 경우 국내 생산을 줄이고 수입 물량을 늘이는 중이다.[13] 호가든 병맥주는 국내 생산을 유지하고 있고 호가든 생맥주는 국내에서 생산한 바 없으며 수입해서 유통한다.

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

412  (0) 2020.06.03
411  (0) 2020.06.03
409  (0) 2020.06.03
408  (0) 2020.06.02
407  (0) 2020.06.02

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

411  (0) 2020.06.03
410  (0) 2020.06.03
408  (0) 2020.06.02
407  (0) 2020.06.02
406  (1) 2020.06.02

 

캐논 무한잉크 프린터

 

좋다 막 뽑느닼ㅋㅋㅋ

 

 

 

후임이 준 선물

 

 

 

 

그 중 두 캔은 작고 나머진 크다.

 

사진은 작은 것.

 

큰 캔은 와이프가 있어야 딸 수 있다.

 

늙으니 맥주도 많이 못 마시겠다.

 

NSLog(@"screen size %f %f ", self.pickerController.view.bounds.size.width,  self.pickerController.view.bounds.size.height);

    //414.000000 896.000000 iPhone XR

    //375.000000 812.000000 iPhone X

 

http://news.naver.com/robots.txt

User-agent: Yeti Allow: /main/imagemontage Disallow: / User-agent: * Disallow: /

네이버는 뉴스 생산도 안하면서 왜 막아뒀는지?

뭐 알지.

처음 뉴스 회사들이 하는 말이었으니.

네이버 검색에서 검색만 제공해서 뉴스 회사들의 서버 다운시키기 놀이 하다가 결국 다 먹었지.

따지고 보면 그런 서버 능력 없었던 미디어 회사도 문제지만 토렌토로 퍼뜨리면 광고 수익이 없으니, 

광고 수익 얻고 그 돈으로 회선 비용을 대니 네이버가 이 바닥에서 성공할 수 있었지.

KT와 네이버의 승리. 그런데 직접 생산하지 않고 유통만 하는 곳이 더 커졌을 때 생산자들은 제로섬 게임에 들어간다.

뉴스 중 특종이란 것은 어디서 발굴될지 모르니 사실, 뉴스 랭킹을 만들어야 한다. 그게 SNS.

그러나 SNS의 자료는 news가 아닐 수도 있어 국가에서 관리를 해줘야 한다. 그래서 KBS나 연합뉴스에 국고가 쓰인다.

뉴스 토큰도 처음에는 좋은 의도였겠지. 정말 뉴스 연합체가 있고, 구글을 선택할지 카카오를 선택할지 네이버를 선택할지 저울질 하면

뉴스 연합체 자체가 어마어마한 힘을 가지게 된다.

내 생각엔 KT 가 가져가는게 맞다. 정말 중요한 뉴스인 경우 서버 능력과 함께 대역폭이 중요하다.

그 전 까지 누가 뉴스를 좀 정리해 주면 토렌토로 퍼뜨리고 싶다. 물론, 불특정 다수가 해야 한다. 핵 터지면 네이버 서버가 터질지

카카오 서버가 터질지 뉴스를 정리해 주는 누군가가 터질지 모르니까. 불특정 다수로 넘어갔을 때 또, 신뢰 문제와 보안 문제로 귀결된다.

해결책은 블록체인.

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

410  (0) 2020.06.03
409  (0) 2020.06.03
407  (0) 2020.06.02
406  (1) 2020.06.02
405  (0) 2020.06.02

+ Recent posts