우버인사이드에서 기억 나는 부분.. 


아마도 이 책의 거의 뒷부분이었을 것이다.


많은 사람이 우버에 놀라움을 나타내지만, 이 회사를 진정으로 좋아하는 사람은 그렇게 많지 않다"는 한 줄 요약은 제멋대로인 우버 창업자 칼라닉과도 그대로 겹친다. 

칼라닉은 저자와의 인터뷰에서 '비열하다'는 세평에 대해 "나는 비열한 사람이 아닙니다. 적어도 나 스스로는 확실히 믿어요"


이 책을 읽고 난 뒤.. 많이 씁쓸했다.. 




'After reading book' 카테고리의 다른 글

'우버인사이드'를 읽고  (0) 2019.10.13
[펌] 넥슨, 플레이의 좋은 내용  (0) 2019.10.08
"쿠팡" - 우리가 혁신하는 이유  (0) 2019.10.05
구글을 움직이는 10가지 황금율  (0) 2019.08.17
파워풀  (0) 2019.07.25
'플랫폼 제국의 미래'를 보고  (0) 2019.06.24
Posted by 김용환 '김용환'

댓글을 달아 주세요




동료가 알려준 좋은 라이브러리인 pretty table 짱


운영 툴에 사용하기 엄청 좋다. 

https://pypi.org/project/PTable/



Pipfile 파일


[packages]
PTable = "==0.9.2"


파이썬 소스

from prettytable import 
x = PrettyTable()
x.field_names = ["City name", "Area", "Population", "Annual Rainfall"]
x.add_row(["Adelaide",1295, 1158259, 600.5])
x.add_row(["Brisbane",5905, 1857594, 1146.4])
print(x)

결과





Posted by 김용환 '김용환'

댓글을 달아 주세요


로그를 다루다 보면 java timstamp( 또는 unix timestamp)로 데이터를 검증해야 할 때가 있다.


하도 많아서 하나를 만들었다.


https://gist.githubusercontent.com/knight76/bbdb187fd0b6784fe810e1200f4ec2be/raw/8e82dd57e651352caf1d91e16b7dd618e6db56d1/ts2dt.go


package main

import (
    "fmt"
    "time"
    "strconv"
    "os"
)

func main() {
  fmt.Println(len(os.Args))
  if len(os.Args) == 1 {
    fmt.Println("----- usage")
    fmt.Println("ts2dt 0")
    fmt.Println("ts2dt 1570790541")
    return
  }

  if len(os.Args) > 2 {
    panic("error: only one timestmap")
  }

  ts := os.Args[1]

  i, err := strconv.ParseInt(ts, 10, 64)
  if err != nil {
    panic(err)
  }
  tm := time.Unix(i, 0)
  fmt.Println(tm)
}

// go build ts2dt.gio
// ./ts2dt 1570790541


'golang' 카테고리의 다른 글

ts2dt 타임스탬프를 날짜로 변경해주기  (0) 2019.10.11
go 언어의 gc 소개 자료.  (0) 2018.07.19
[golang] 고루틴(go routine) 예제  (0) 2017.09.08
[golang] 매개 변수 받기  (0) 2017.09.08
[golang] 에러(error) 예제  (0) 2017.09.07
[golang] defer 예제  (0) 2017.09.07
Posted by 김용환 '김용환'

댓글을 달아 주세요


청와대 정책실장 김상조가 인터뷰한 것 중에 좋은 내용이 있어서 발췌한다.



https://news.v.daum.net/v/20191008063302499?f=m


◇ 정관용> 어쨌든 그런데 지금 지난 20년 동안을 보면 공정경제, 즉 재벌의 기득권 구조가 다른 신생 기업들의 성장을 상당히 가로막아온 측면이 강하다. 이건 분명히 인정할 수밖에 없는 거 아닙니까? 지난 20년 동안. 앞으로는 그게 없어질까요?

◆ 김상조> 그러니까 이제 그 공정경제를 통해서 우리 사회의 혁신 즉 역동성을 어떻게 다시 키울 건가라고 하는 그 방법론의 문제라고 생각을 합니다. 그래서 그날 제가 말씀드렸던 것도 우리가 생각하는 경제민주화, 재벌개혁, 공정경제의 상이 혹시나 30년 전에 만들어진 것이 아니냐 즉 한국 경제가 고도 성장하고 우리 기업들이 돈을 많이 벌 때 그 환경 속에서 생각했던 경제민주화의 방법론을 완전히 상황이 180도 달라진 지금에도 고집하고 있는 것이 아니냐라는 차원에서 제 생각을 말씀드리는 거였고요. 그러한 의미에서 우리가 필요한 국민의 생명, 안전과 관련된 그런 어떤 규제는 강화해야 되겠지만 또 한편으로는 시대에 뒤떨어진 또는 특히 4차 산업혁명시대에 맞지 않는 과거의 어떤 규제는 혁신하는 노력을 이걸 공정경제의 후퇴라고 이해하면 안 된다라고 말씀드린 거고 제가 지금 정책실장으로서 하고 있는 가장 중요한 일이 바로 이 혁신과 공정이라는 두 가지의 목표를 어떻게 조화할 것인가라고 하는 문제인데요. 제가 저가 아까 처음 시작할 때 이 경제정책보다도 사회정책 쪽이 더 어렵다고 하지 않았습니까. 바로 이 부문과 관련해서 우리 사회의 사회적 가치가 충돌하고 기득권이 충돌하는 부분이 너무나 많습니다. 그래서 이 부분에 관해서 제 결심은 딱 이거 하나입니다. 뭐가 정답인지는 솔직히 모릅니다. 그렇다고 해서 결정을 미루면 정부 부처가 움직이지 못하고 시장의 기업들은 혁신하지 못합니다. 그런 의미에서 늦지 않게 결정을 내려야 된다라고 하는 게 제가 정책실장으로 있는 동안 하고자 하는 가장 중요한 과제이자 원칙이라고 할 수가 있습니다.

◇ 정관용> 흔히 규제완화 그러면 재벌들 살기 좋은 세상들 만들어주는 거 아니냐는 오해가 있는데 김상조 실장은 그게 아니라는 거죠? 규제완화다 필요할 때는 해야 한다는 거잖아요. 그런데 그 규제완화의 혜택이 재벌이 아닌 신생 도전기업들에게 돌아갈 수 있는 그런 걸 만드는 게 중요한 거 아닌가요?

◆ 김상조> 맞습니다.

Posted by 김용환 '김용환'

댓글을 달아 주세요


좋은 내용이 있어서 발췌한다.



<리더는 욕먹는 예언자다>


상장은 기업의 실적과 권한을 자연스럽게 분배해 준다.

상장과 성장과 보상과 분배의 황금 비율은 기업 경영의 영원한 숙제다. 

넥슨은 이 지점에서 심한 상장통을 앓았다.

수평적 조직이라는 넥슨의 장점이 이때만큼은 약점으로 작용했다.


위젯 인수는 내부 개발자들한테 충격이었지만 분명 김정주의 탁월한 경영적 선택이었다.

위젯 인수는 양면적이었다. 넥슨의 위젯 인수로 한국 게임 업계는 지각 변동을 겪게 된다. 

정상원을 비롯한 개발자들이 대거 이탈하면서 넥슨 경쟁사들의 개발력이 강화된다.


역설적으로 경영 실험의 실패는 넥슨에 전문 경영인 체제가 뿌리내리는 바탕이 된다. 


대주주 김정주가 자기 역할을 재정의한 덕분에 넥슨에는 전문 경영인 중심의 경영 문화가 일찍부터 자리잡게 된다.


...


<혁신의 딜레마>


성공의 역설은 성공한 기업이라면 결코 피해갈 수 없는 함정이다.

성공의 역설은 기업의 관료화와 짝을 이룬다.

변화를 두려워하게 된 조직은 과거의 성공을 이상화하고 자신의 과거를 답습하는 자기 복제를 시작한다.


성공의 역설을 극복하는 유일한 방법은 세대교체 뿐이다.


나갔던 인재는 스스로 더 성장해서 들어와야 한다. 그 때 회사는 기꺼이 더 비싼 몸값을 지불해준다. 


지금까지 넥슨을 성장시킨 인재들 가운데 상당수가 한 때는 넥슨을 매몰차게 떠났던 사람들이라는 건 우연이 아니다.


김정주의 최대 장기가 이것이다. 김정주는 퍼즐을 맞추듯 인재와 기술과 자본을 조합한다. 


퍼즐은 세월에 깍이고 넥슨이라는 퍼즐판의 구조가 또 바뀌기 때문이다. 사람은 변하고 판은 바뀐다.






'After reading book' 카테고리의 다른 글

'우버인사이드'를 읽고  (0) 2019.10.13
[펌] 넥슨, 플레이의 좋은 내용  (0) 2019.10.08
"쿠팡" - 우리가 혁신하는 이유  (0) 2019.10.05
구글을 움직이는 10가지 황금율  (0) 2019.08.17
파워풀  (0) 2019.07.25
'플랫폼 제국의 미래'를 보고  (0) 2019.06.24
Posted by 김용환 '김용환'

댓글을 달아 주세요


맨날 까먹는 JPA의 Repository 조회 메소드 규칙은 다음과 같다. 



https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods


Table 3. Supported keywords inside method names
KeywordSampleJPQL snippet

And

findByLastnameAndFirstname

… where x.lastname = ?1 and x.firstname = ?2

Or

findByLastnameOrFirstname

… where x.lastname = ?1 or x.firstname = ?2

IsEquals

findByFirstname,findByFirstnameIs,findByFirstnameEquals

… where x.firstname = ?1

Between

findByStartDateBetween

… where x.startDate between ?1 and ?2

LessThan

findByAgeLessThan

… where x.age < ?1

LessThanEqual

findByAgeLessThanEqual

… where x.age <= ?1

GreaterThan

findByAgeGreaterThan

… where x.age > ?1

GreaterThanEqual

findByAgeGreaterThanEqual

… where x.age >= ?1

After

findByStartDateAfter

… where x.startDate > ?1

Before

findByStartDateBefore

… where x.startDate < ?1

IsNullNull

findByAge(Is)Null

… where x.age is null

IsNotNullNotNull

findByAge(Is)NotNull

… where x.age not null

Like

findByFirstnameLike

… where x.firstname like ?1

NotLike

findByFirstnameNotLike

… where x.firstname not like ?1

StartingWith

findByFirstnameStartingWith

… where x.firstname like ?1 (parameter bound with appended %)

EndingWith

findByFirstnameEndingWith

… where x.firstname like ?1 (parameter bound with prepended %)

Containing

findByFirstnameContaining

… where x.firstname like ?1 (parameter bound wrapped in %)

OrderBy

findByAgeOrderByLastnameDesc

… where x.age = ?1 order by x.lastname desc

Not

findByLastnameNot

… where x.lastname <> ?1

In

findByAgeIn(Collection<Age> ages)

… where x.age in ?1

NotIn

findByAgeNotIn(Collection<Age> ages)

… where x.age not in ?1

True

findByActiveTrue()

… where x.active = true

False

findByActiveFalse()

… where x.active = false

IgnoreCase

findByFirstnameIgnoreCase

… where UPPER(x.firstame) = UPPER(?1)


Posted by 김용환 '김용환'

댓글을 달아 주세요


jackson 2.9 버전부터  com.fasterxml.jackson.databind.util.ISO8601DateFormat 클래스는 deprecated되었다.


아래와 같은 코드는 더 이상 사용하지 않고.


 ObjectMapper mapper = new ObjectMapper();

objectMapper.setDateFormat(new ISO8601DateFormat());


StDateFormat이나, Joda 를 사용하는 것이 좋은 것 같다. 


 ObjectMapper mapper = new ObjectMapper();

 mapper.setDateFormat(new StdDateFormat());




개인적으로  Joda로 변경하니 괜찮았다.

Posted by 김용환 '김용환'

댓글을 달아 주세요


보통 소켓을 다루는 간단한 자바 애플리케이션 예시의 경우, socket을 close하지 않아도 자연스럽게 정리된다.


공식 RabbitMQ 자바 Client을 사용할 때 

publish 코드에서 사용하는 connection을 종료하지 않으면 계속 hang된다.



val connection = connectionFactory.newConnection
val channel = connection.createChannel
channel.exchangeDeclare(exchange, builtinExchangeType, false)
messages.foreach { message =>
channel.basicPublish(exchange, "", MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes("UTF-8"))
}


jstack을 통해  비동기 쓰레드 폴링을 확인할 수 있다.

"Process Proxy: RabbitPublisher" #473 prio=6 os_prio=31 tid=0x00007f854bd53000 nid=0x1572b runnable [0x000070000cde6000]

   java.lang.Thread.State: RUNNABLE

at sun.nio.ch.KQueue.keventPoll(Native Method)

at sun.nio.ch.KQueuePort$EventHandlerTask.poll(KQueuePort.java:196)

at sun.nio.ch.KQueuePort$EventHandlerTask.run(KQueuePort.java:276)

at sun.nio.ch.AsynchronousChannelGroupImpl$1.run(AsynchronousChannelGroupImpl.java:112)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)

at java.lang.Thread.run(Thread.java:748)



항상 자원을 close를 처리할 필요가 있다.

val connection = connectionFactory.newConnection
val channel = connection.createChannel
channel.exchangeDeclare(exchange, builtinExchangeType, false)
messages.foreach { message =>
channel.basicPublish(exchange, "", MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes("UTF-8"))
}
channel.close()
connection.close()


Posted by 김용환 '김용환'

댓글을 달아 주세요

카카오에 다니면서 가장 좋았던 점은  수평적인  문화를 경험했다는 점이다.


아무도 시키지 않았지만 회사의  리스크를 해결할 때  개발 경쟁력을 높일 때 기분이 좋았다.


여전히 말단 직장인인데도 승진 못했다고 어려워하지 않은 이유가  바로 수평적인  문화에 있다고 할 수 있다.




"쿠팡" - 우리가 혁신하는 이유 책을 읽고 Aggresive 수평문화를 가진 문화를 엿볼 수 있어서 좋았다. 말로만 듣던 힘들다는 점이 이거였군.... ㅎㅎㅎ



좋은  내용을 발췌한다.



Wow - 고객의 신뢰를 최우선한다.

Focus - 결과를 낼 수 있는 일을 찾아서 깊이 있게 판다.

Fail Fast - 우리는 실패를 두려워하지 않고,실패로부터 배운다.

Be Open - 군중심리에 휩쓸리지 않고 자신의 목소리를 낸다.

Believe - 나와 내 동료들과 회사의 미래를 믿는다.


PO는 쿠팡의 핵심 직군으로, 개별 파트의 소사장 개념으로, 미니 CEO라고 불린다.

성과를 평가하지 않지만 대화와 설득으로 일을 수행한다.

 



쿠팡은 커머스 전략을 위해 세 가지에 집중한다


-셀렉션 (selection)- 파는 물건의 종류

-프라이스 (price)

-컨비니언스 (convenience)



이를 통해 얻는 효과들은 아래와 같다.


- 사입을 통한 가격 경쟁력 향상

- 직접배송을 통한 서비스 품질 제어

- 직접배송을 통한 배송 서비스 질 향상

- 기술력(간편결제, 애플리케이션 등)을 통한 서비스 편의성 향상



기술력(개발자)가 혁신이다.

'After reading book' 카테고리의 다른 글

'우버인사이드'를 읽고  (0) 2019.10.13
[펌] 넥슨, 플레이의 좋은 내용  (0) 2019.10.08
"쿠팡" - 우리가 혁신하는 이유  (0) 2019.10.05
구글을 움직이는 10가지 황금율  (0) 2019.08.17
파워풀  (0) 2019.07.25
'플랫폼 제국의 미래'를 보고  (0) 2019.06.24
Posted by 김용환 '김용환'

댓글을 달아 주세요


http://www.google.com/////// 이란 문자열에서 뒤의 /를 모두 빼려면 어떻게 할까?


파이썬에서는 아주 간단히 해결할 수 있다.


"http://www.google.com/get/order/".strip("/")

->http://www.google.com/get/order


"http://www.google.com/get/order////".strip("/")

->http://www.google.com/get/order


Posted by 김용환 '김용환'

댓글을 달아 주세요