맥주 마시러 갔어요.


밀러당! 역시 네비는 허츠.

입구

요약 하면 우리 맥주 만들어. 많이 오래됬썰. 겁나 많이 만들어.




공장입니다. 완전 자동

맥주 천국

밀러가 이렇게 많은 브랜드로 나오는지 몰랐네요

발효 건물 꼭데기에 뚜겅. 발효를 4~5층 짜리 건물 통째로 합니다. 6층이었나? 암튼, 똥냄새 나요 ㅠ

이건 뭔지 기억이 안나네요. 다녀오신 분이 댓글 좀 ㅠㅠ


같은 폴더에 있던 사진 투척 휙~

주변에서 사진 찍어도 된다고 했어요. 한국과는 사뭇 다른 문화.





다들 다 차고 투어 왔는데. 맥주 시음을 시켜 줍니다. 파는 맥주란 다른 점 이라면 뭔가 풍부한 느낌이랄까. 종류별로 주는데 무슨 종류인지도 모르고 그냥 계속 들이키다가 다들 히히 헤헤, 친해지고 술이 거하게 되어서 좀 쉬다가 운전 했습니다.





'!Z. 해외 여행기' 카테고리의 다른 글

푸켓 - 1  (4) 2019.01.20
괌 구아아아암 맥주  (0) 2019.01.18
홍콩  (6) 2019.01.14
사이판  (0) 2019.01.14
일본  (4) 2019.01.14

https://developer.apple.com/library/archive/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/Displays/Displays.htm





Device

Native Resolution (Pixels)

UIKit Size (Points)

Native Scale factor

UIKit Scale factor

iPhone X

1125 x 2436

375 x 812

3.0

3.0

iPhone 8 Plus

1080 x 1920

414 x 736

2.608

3.0

iPhone 8

750 x 1334

375 x 667

2.0

2.0

iPhone 7 Plus

1080 x 1920

414 x 736

2.608

3.0

iPhone 6s Plus

1080 x 1920

375 x 667

2.608

3.0

iPhone 6 Plus

1080 x 1920

375 x 667

2.608

3.0

iPhone 7

750 x 1334

375 x 667

2.0

2.0

iPhone 6s

750 x 1334

375 x 667

2.0

2.0

iPhone 6

750 x 1334

375 x 667

2.0

2.0

iPhone SE

640 x 1136

320 x 568

2.0

2.0

iPad Pro 12.9-inch (2nd generation)

2048 x 2732

1024 x 1366

2.0

2.0

iPad Pro 10.5-inch

2224 x 1668

1112 x 834

2.0

2.0

iPad Pro (12.9-inch)

2048 x 2732

1024 x 1366

2.0

2.0

iPad Pro (9.7-inch)

1536 x 2048

768 x 1024

2.0

2.0

iPad Air 2

1536 x 2048

768 x 1024

2.0

2.0

iPad Mini 4

1536 x 2048

768 x 1024

2.0

2.0


  private func testcode() {

        

        struct menuTree : Codable {

            var title : String

            var item : String

        }

        

        let menu1json = [menuTree(title:"1번메뉴", item:"1번아이템"),

                         menuTree(title:"2번메뉴", item:"1번아이템"),

                         menuTree(title:"2번메뉴", item:"2번아이템")]

        

        var jsonString:String = ""

        

        do {

            let jsonData = try JSONEncoder().encode(menu1json)

            jsonString = String(data: jsonData, encoding: .utf8)!

            print(jsonString)

        } catch {

            print("Error in jsonData converting.")

        }

        

        if Path("~/menu1").isDirectory {

            print("~/menu1 is already there")

        } else {

            do {

                try Path("~/menu1").createDirectory()

                print("~/menu1 directory has been created")

            } catch {

                print("cannot create ~/menu1 directory")

            }

        }

        

        if Path("~/menu1/menu1.txt").exists {

            print("file is already exist.")

        } else {

            try? Path("~/menu1/menu1.txt").createFile()

        }

        

        let menu1txt = TextFile(path: "~/menu1/menu1.txt")

        try? jsonString |> menu1txt

    }

    

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

kakao T crash  (2) 2019.01.18
ibk onebank crash  (0) 2019.01.18
하스스톤 크러시 로그  (0) 2019.01.18
오늘자 트러블 슈팅  (0) 2019.01.08
Snapkit Error type - 1  (0) 2019.01.02



상위 패널(상위 클래스)에서 골격을 만들고

  var dataLayer : CALayer = CALayer(layer: 0)


    func drawAdata(_ index : Int) {

    }


 override func drawAdata(_ index : Int) {


골격구현


    override func drawAdata(_ index : Int) {

        if GS.s.logLevel.contains(.graphPanel) { debugPrint("index \(index)") }

        

        dataLayer.removeFromSuperlayer()

        dataLayer = jhType1graphLayer<T>(self, 0, maxY, index)

        dataLayer.frame = CGRect(x: GS.s.jhLMarginX, y: GS.s.jhLMarginY, width: self.bounds.width - GS.s.jhLMarginX, height: self.bounds.height - GS.s.jhLMarginY)

        dataLayer.zPosition=1

        self.layer.addSublayer(dataLayer)

        dataLayer.setNeedsDisplay()

        jhDataCenter.attachObserver(observer: self)

    }


데이터 센터는 그래프 드로잉에 필요한 데이터를 저장하는 공간이다. 해당 공간에 옵저버 패턴으로 구현된 브로드 캐스팅 시스템이 있다. - redraw를 위해.


원리는 간단하다. 본래 그렸던 레이어를 지우면서 계속해서 새로 그리는 것이다. 포토샵 할 때 레이어를 여러장 얹는 것과 같다. hightlight 되는 그래프나 점 같은 것을 그 위에 덮는 것.

        GV.s.plzWait(view)

        DispatchQueue.main.asyncAfter(deadline: .now() + 1, execute: {

            GV.s.indicator.stopAnimating()

            self.pullToRefresh(refreshControl: refreshControl, true)

        })



    let indicator: UIActivityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorView.Style.gray)

    

    func plzWait(_ view : UIView) {

        indicator.frame = CGRect(x: 0.0, y: 0.0, width: 40.0, height: 40.0)

        indicator.center = view.center

        view.addSubview(indicator)

        indicator.bringSubview(toFront: view)

        UIApplication.shared.isNetworkActivityIndicatorVisible = true

        indicator.startAnimating()

    }

'!A. Basics' 카테고리의 다른 글

전역 바이너리 세마포어, 전역 queue 설정  (0) 2019.01.19
아이폰별 화면 해상도  (0) 2019.01.18
iOS 디버깅 방법  (0) 2019.01.16
UISegmentedControl  (0) 2019.01.16
dictionary 에 쉽게 자료 append 하기  (0) 2019.01.16

OpenSSL : https://www.openssl.org/source/license.html

MBProgressHUD : https://github.com/jdg/MBProgressHUD/blob/master/LICENSE

ListViewAnimations : https://github.com/nhaarman/ListViewAnimations

ViewPagerIndicator : https://github.com/JakeWharton/ViewPagerIndicator

NineOldAndroids : http://nineoldandroids.com/

Hashids : http://hashids.org/

Bouncy Castle : http://www.bouncycastle.org/license.html

BottomNavigation : https://github.com/Ashok-Varma/BottomNavigation

Retrofit : http://square.github.io/retrofit

OkHttp : http://square.github.io/okhttp

ReactiveX/RxAndroid : https://github.com/ReactiveX/RxAndroid

RxBinding : https://github.com/JakeWharton/RxBinding

LeakCanary : https://github.com/square/leakcanary

Slick : http://kenwheeler.github.io/slick

Mobile Detect : http://mobiledetect.net

SQLBrite : https://github.com/square/sqlbrite

DeepLinkDispatch : https://github.com/airbnb/DeepLinkDispatch#deeplinkdispatch

ZXing : https://github.com/zxing/zxing

Prefser : https://github.com/pwittchen/prefser

AdapterDelegates : https://github.com/sockeqwe/AdapterDelegates

Material-ish Progress : https://github.com/pnikosis/materialish-progress

airbnb/lottie-android : https://github.com/airbnb/lottie-android

ReactiveX/RxKotlin : https://github.com/ReactiveX/RxKotlin

tbruyelle/RxPermissions : https://github.com/tbruyelle/RxPermissions

Realm : https://github.com/realm/realm-java

lottie : https://github.com/toss/lottie

RxDownloader : https://github.com/esafirm/RxDownloader

RecyclerViewSnap : https://github.com/rubensousa/RecyclerViewSnap

MathParser.org-mXparser : https://github.com/mariuszgromada/MathParser.org-mXparser

MPAndroidChart : https://github.com/PhilJay/MPAndroidChart

picasso : http://square.github.io/picasso/

sudo chattr +i /

 

chattr 명령에는 immutable(i) 속성 외에도 다양한 옵션이 있습니다. 주요 옵션은 다음과 같습니다:

a - 파일에 append-only 속성을 설정하여 데이터를 추가할 수만 있습니다.

A - 파일에 대한 atime(access time) 기록을 방지합니다.

D - 파일이 바뀌면 gid가 0(root)으로 지정됩니다.

d - 디렉터리에 dump 유틸리티가 작동하지 않도록 설정합니다.

S - 파일에 대한 삭제 작업이 동기화되어 즉시 물리적으로 삭제됩니다.

s - 파일의 크기를 0으로 만들 수 없게 합니다.

u - 파일에 undeletable 속성을 설정하여 삭제가 불가능해집니다.

그 외에도 j, t, T, c, l, x, X, Z 등의 옵션이 있습니다.

 

 

아이러니 하게도 / 자체의 lsattr 은 방법이 없다. 마운트 된 디스크 자체를 하면 되려나 싶어 다음에 시도는 해 봐야 겠다.

 

========================= 화사 첨족 ===================

 





그리고 8퍼센트와 연결 오류로 여러번 연락하여 찾은 내 돈. 오류가 있을 것 같아서 우선 10만원만 넣어봤었다

왜 3달이나 걸려서 다시 찾았냐면 예치금에서 8%로 투자했는데 8%에도 투자 금액이 없고, 예치금에도 돈이 없어서였다.

고객센터에 제대로 처리해줬는데, 다른 포스팅도 막 따지고 그럴 것 같지만 난 사실 이런거 되게 귀찮아 한다 ㅠㅠ 믓튼, 금융권 같이 폐쇄적인 곳에서 얼마나 좌충우돌하며 서비스를 만들었을까?

 



토스에서 새로운 공인 인증서로 계좌 연결이 안되는 것과 연결 안되는 IBK에서 등록해 둔 지문이 갑자기 인식 안되어 불편을 겼은... 모두 지금 겪고 있는 상황이다.

 

에혀 완벽한 서비스가 어딨으리 30년 된 매실주나 마시자.

 

 
시골엔 참 귀한게 많다. 제대로 된 홍어회를 먹고 싶으면 전라도 가정집을 직접 방문해야 하듯이

=======

사람을 구할 때에도 진짜를 보려면 직접 만나야 한다.

참고로 이런 글을 남겨두는 이유는 후진 양성할 때 너무나도 큰 마천루들만 보고 있으면 자존감이 낮아지니 세상에 완벽한 서비스는 없다(일단은)는 말을 하고 싶어서이다.

https://www.donga.com/news/Culture/article/all/20090606/8741008/1

 

[인문사회]손등 보이는 ‘V사인’ 영국에선 욕

◇ 손짓, 그 상식을 뒤엎는 이야기/이노미 지음/348쪽·1만4000원·바이북스한국어 어학원에 다니는 한 네팔 남

www.donga.com

처럼 내가 쓴 글의 의미가 잘못 전달되는 것은 어쩔 수 없어서 무조건 팩트만 쓰려고 한다.

 

*2024 updated

그나저나 SMS 전송 시스템 트윌로 참 좋다.

requirements.txt

 

Automat

bcrypt==3.2.0

config==0.5.0.post0

configparser==5.0.1

cryptography==3.2.1

Flask

Flask-JWT-Extended==4.3.1

Flask-SQLAlchemy==2.5.1

flask_cors

mccabe==0.6.1

mysql

mysql-connector-python

mysqlclient==2.1.0

pyignite

pyjsparser==2.7.1

PyJWT==2.3.0

PyMySQL==0.10.1

Werkzeug==2.0.2

Requests

Pillow

pytest

firebase-admin

firebase_admin

twilio   <- 얘임.

 

 

[이 문서는 계속 업데이트 됩니다.]

native 장치, 외부 라이브러리, 오픈소스, 쓰레드 작업 등등 은 userDefaut 가 좋다. 512KB 를 넘지 않는 선에서 써야 한다.

그건 10만자 라고 생각하면 기억하기 쉽고, 각각의 디바이스 이고 개별 저장소임을 감안할 때 앱에서 느낌은 거의 무한한 공간으로 느껴진다. 

  1. ASCII 문자 (영문 알파벳, 숫자, 기본 구두점): 1 바이트
  2. 대부분의 유럽 언어, 중동 언어, 아프리카 언어의 문자: 2 바이트
  3. 한글, 한자, 일본어 등 아시아 언어의 문자: 3 바이트
  4. 이모지 및 특수 기호: 4 바이트

512KB는 512 * 1024 = 524,288 바이트입니다.

만약 모든 문자가 ASCII라면, 최대 524,288 문자를 저장할 수 있습니다. 524,288 바이트 / 1 바이트 = 524,288 문자

그러나 모든 문자가 한글이라면, 최대 174,762 문자를 저장할 수 있습니다. 524,288 바이트 / 3 바이트 ≈ 174,762 문자 (소수점 이하 버림)

실제 상황에서는 다양한 문자가 혼합되어 사용되므로, 저장할 수 있는 정확한 문자 수는 문자의 구성에 따라 달라집니다. 대략적으로는 다음과 같이 추정할 수 있습니다:

  • 주로 ASCII 문자를 사용하는 경우: 약 500,000자
  • 주로 유럽어, 중동어, 아프리카어 문자를 사용하는 경우: 약 250,000자
  • 주로 한글, 한자, 일본어 등을 사용하는 경우: 약 170,000자
  • 이모지와 특수 기호를 많이 사용하는 경우: 약 130,000자

따라서 512KB는 상당히 많은 양의 텍스트 데이터를 저장할 수 있지만, 데이터의 성격에 따라 실제로 저장할 수 있는 문자 수는 크게 달라질 수 있습니다.

대림산업 이제는 바뀐 DL E&C 에서 담당했던 before Service 앱에서 13만건 이상 한 방에 싱크해야 하는 상황에서의 오프라인 싱크 앱 경험으로 sqlite 는 뻑난다. 파일 생성 역시나 안정적이지 못했다. UserDefault야 이미 13만 건 * 데이터 필드 개수 * 각 필드별 문자수 계산 하면 한계를 아득히 넘어 버리는 수치이기에 쓸 수 있지도 않았다. sql 에 저장하면 읽는데도 어마어마한 시간이 걸렸었다. 해결 방법은 시간적 공간적 분할 외엔 없었다. 시간은 CPU, 공간은 메모리... 결국... 내가 썼던 책 그대로의 내용이다.(세속적으로 말하면 기본기는 알려주나 경험적 지식은 스스로 터득하라는 것) 왜냐면, 시간이 지나서 안 사실이지만. 타이틀만 중요시하며 딱히 중요하지도 않은 지식을 공유하며 그것이 아닌 그 누군가에게도 고마워하지 않는 세상이라는 것을 알아버렸지 때문일까. 혹은, 그렇게 된 세상, 문화를 바로 잡기 위해서 필드의 지식은 필드에 그대로 남겨두고 싶어서일까. 그래도 공부 하고자 하는 이들을 위한 발자취는 남겨둔다. 덜 고생하시라고.

 

UserDefaults는 iOS 앱에서 간단한 데이터를 저장하고 검색하는 데 사용되는 편리한 메커니즘입니다. 그러나 모든 상황에 적합한 것은 아닙니다. UserDefaults를 사용하여 데이터를 저장하고 전송하는 것의 장단점과 제한 사항은 다음과 같습니다.

장점:

  1. 간편성: UserDefaults는 key-value 쌍을 사용하여 데이터를 저장하고 검색하는 간단한 방법을 제공합니다.
  2. 빠른 액세스: UserDefaults에 저장된 데이터는 빠르게 액세스할 수 있습니다.
  3. 영구 저장: UserDefaults에 저장된 데이터는 앱이 종료되거나 기기가 재부팅되어도 유지됩니다.

단점:

  1. 제한된 데이터 유형: UserDefaults는 주로 기본 데이터 유형(String, Int, Bool 등)과 일부 컬렉션 유형(Array, Dictionary)만 지원합니다. 사용자 정의 객체를 저장하려면 Codable 프로토콜을 준수해야 합니다.
  2. 제한된 저장 공간: UserDefaults는 대량의 데이터를 저장하기에 적합하지 않습니다. Apple은 UserDefaults에 저장되는 데이터를 약 512KB로 제한할 것을 권장합니다.
  3. 보안 고려 사항: UserDefaults에 저장된 데이터는 암호화되지 않으므로 중요한 정보를 저장하는 데 적합하지 않습니다.

제한 사항 (Limits):

  1. 데이터 크기: Apple은 UserDefaults에 저장되는 데이터를 약 512KB로 제한할 것을 권장합니다. 이 제한을 초과하면 앱의 성능에 영향을 줄 수 있습니다.
  2. 데이터 유형: UserDefaults는 주로 기본 데이터 유형과 일부 컬렉션 유형만 지원합니다. 사용자 정의 객체를 저장하려면 추가 작업이 필요합니다.

외부 라이브러리 및 API와의 상호 작용:

  • 외부 라이브러리나 API에서 받은 데이터를 UserDefaults에 직접 저장하는 것은 일반적으로 권장되지 않습니다. 대신, 데이터를 적절한 데이터 모델로 변환한 후 필요한 경우 UserDefaults에 저장하는 것이 좋습니다.
  • 이미지나 비디오와 같은 큰 데이터는 UserDefaults 대신 파일 시스템이나 Core Data와 같은 다른 저장 메커니즘을 사용하는 것이 좋습니다.

요약하면, UserDefaults는 간단한 데이터를 저장하고 전송하는 데 유용하지만, 대량의 데이터나 복잡한 객체를 다룰 때는 한계가 있습니다. 데이터의 유형과 크기에 따라 적절한 저장 메커니즘을 선택하는 것이 중요합니다.

 

@State private var udfirstArg = UserDefaults.standard.string(forKey: "CameraViewfirstArg")

var udfirstArg = UserDefaults.standard.string(forKey: "CameraViewfirstArg")

UserDefaults.standard.set(self.firstArg, forKey: "CameraViewfirstArg")

//            let savingLocation = "gs://" + (self.udfirstArg ?? "") + "/" + "230830.jpeg"

 

 

func makeUIViewController(context: Context) -> HjHCameraViewController {

        print("func makeUIViewController(context: Context) -> HjHCameraViewController {")

        UserDefaults.standard.set(self.firstArg, forKey: "CameraViewfirstArg")

        UserDefaults.standard.set(self.secondArg, forKey: "CameraViewSecondArg")

        UserDefaults.standard.set(self.thirdArg, forKey: "CameraViewThirdArg")

        

        let vc = HjHCameraViewController()

        vc.modalPresentationStyle = .fullScreen

        return vc

    }

 

 

 

 

//

//  HjhCameraView.swift

//  App

//

//  Created by Junho HA on 2023-04-30.

//

 

import SwiftUI

 

 

struct HjhCameraView: UIViewControllerRepresentable {

    

    let firstArg : String

    let secondArg : String //let secondarg = $item.businessNumber

    let thirdArg : String //처방월_년

    

    typealias UIViewControllerType = HjHCameraViewController

    

    func makeUIViewController(context: Context) -> HjHCameraViewController {

        print("func makeUIViewController(context: Context) -> HjHCameraViewController {")

        UserDefaults.standard.set(self.firstArg, forKey: "CameraViewfirstArg")

        UserDefaults.standard.set(self.secondArg, forKey: "CameraViewSecondArg")

        UserDefaults.standard.set(self.thirdArg, forKey: "CameraViewThirdArg")

        

        let vc = HjHCameraViewController()

        vc.modalPresentationStyle = .fullScreen

        return vc

    }

    

    func updateUIViewController(_ uiViewController: HjHCameraViewController, context: Context) {

        // Updates the state of the specified view controller with new information from SwiftUI.

        

    }

    

}

 

 

 

            Section {

                Toggle(isOn: $continuousTakePicture) {

                    Text("연속 촬영")

                }

                Button(action: {

                    print("EDIEDI")

                    let dateFormatter = DateFormatter()

                    dateFormatter.dateFormat = "MM_yyyy" // "MMMM yyyy" will give you the full month name and the year

                    

                    if let window = UIApplication.shared.windows.first {

                        let subject = "\($item.summary.wrappedValue)_\($item.owner_id.wrappedValue)"

                        let body = "_\($item.owner_id.wrappedValue)_거래처명:\($item.summary.wrappedValue)"

                        //                        let thirdarg = dateFormatter.string(from: date)

                        let thirdarg : String = String(month) + "_" + String(year)

                        print("hjhdate : \(dateFormatter.string(from: date))")

                        //                        let secondarg = dateFormatter.string(from: date)

                        let secondarg:String = $item.businessNumber.wrappedValue

                        window.rootViewController = UIHostingController(rootView: HjhCameraView(firstArg: $item.summary.wrappedValue, secondArg: secondarg, thirdArg: thirdarg))

                        window.makeKeyAndVisible()

                    }

                }, label: {

                    HStack {

                        Spacer() // 버튼 내부에서 텍스트를 중앙에 위치시키기 위해 사용

                        Image(systemName: "camera")

                            .imageScale(.large)

                            .foregroundColor(.white) // 아이콘 색상 조정

                        Text("EDI 촬영")

                            .fontWeight(.bold)

                            .foregroundColor(.white) // 텍스트 색상 조정

                        Spacer() // 버튼 내부에서 텍스트를 중앙에 위치시키기 위해 사용

                    }

                    .padding() // 버튼 내부 여백 추가

                    .background(LinearGradient(gradient: Gradient(colors: [Color.blue, Color.purple]), startPoint: .leading, endPoint: .trailing)) // 그라디언트 배경 적용

                    .cornerRadius(10) // 모서리 둥글게

                    .shadow(radius: 5) // 그림자 효과 추가

                })

                .frame(maxWidth: .infinity) // 최대 너비 설정

                

                // "SODN으로 자동 전송" 토글 상태에 따라 조건부 렌더링

                if settingActivated {

                    Button(action: {

                        checkCameraAccess()

                        self.isShowingImagePicker = true

                        //                        self.uploadState = .idle

                        DispatchQueue.main.asyncAfter(deadline: .now() + 1) {

                            self.uploadState = .idle

                            // 업로드 성공 후 필요한 UI 초기화 로직을 여기에 추가

                            // 예: 선택된 이미지를 초기화한다거나, 성공 메시지를 표시하는 등

                        }

                        

                    }) {

                        Text("갤러리에서 사진 선택")

                            .frame(maxWidth: .infinity)

                            .padding()

                            .background(LinearGradient(gradient: Gradient(colors: [Color.purple.opacity(0.8), Color.blue.opacity(0.8)]), startPoint: .leading, endPoint: .trailing))

                            .foregroundColor(.white)

                            .cornerRadius(10)

                            .shadow(radius: 5)

                    }

                    .padding(.horizontal)

                    .fullScreenCover(isPresented: $isShowingImagePicker, onDismiss: loadImage) {

                        // ImagePicker 뷰 표시

                        HjhImagePicker(selectedImage: $selectedUIImage)

                    }

                    

                }

            }

            

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

스토리보드 이동 방법  (0) 2019.02.14
제주도 항공 촬영  (0) 2019.01.19
C의 struct와 Swift 의 struct  (0) 2019.01.19
Practical Swift  (0) 2019.01.14
iOS UI 기초 - Swift UI  (2) 2019.01.03

가끔 예상치 못한 세금을 낼 때가 있다.​

세금 고지서 받기 전에는 알지 못했던 세금. AWS 에서 우분투 서버를 돌리면서도 그렇다. 잘 되던 모듈이 갑자기 인코딩 문제를 뱉었다.

AI백엔드가 fastAPI 보니 이래저래 해봤는데,Encoding 때문에 파이썬 버전도 여럿 바꾸고, 로케일도 여럿 바꿔보고 관련 패키지들도 재설치 해봤다.

export LANG=ko_KR.UTF-8

sudo locale-gen ko_KR.UTF-8

sudo update-locale LANG=ko_KR.UTF-8

sudo reboot

sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.9 1

sudo update-alternatives --install /usr/bin/pip pip /usr/bin/pip3.9 1

 

sudo update-alternatives --config python

sudo update-alternatives --config pip

 

pip3 list | awk 'NR>2 {print $1}' | while read pkg; do python3.9 -m pip install "$pkg"; done

 

​그런데 결국 해결 못했다. 로컬에서는 또 잘되는데 서버로 deploy 하면 안되는 것이다. 더 재미있는 것 클론 서버에서는 잘된다. 설정도 모두 같다. 갑자기 한글을 이스케이프 문자로 바꾸는 이유는 모르겠지만 이스케이프 문자를 인식해서 다시 한글로 바꿔주는 로직을 넣을 수 밖에 없었다. 서버 이미지가 있지만 원인도 모른체 빽도를 하면 결국 또 나중에 문제가 될 것 같아서이다.

국세랑 카카오랑 연동이 잘되는 걸 보니 이제 카카오 내부는 공기업이다.



QR 코드 찍는다고 앱을 3번이나 껐다 켰다. 고지서 QR 코드 비트가 높아서 인식이 안되나 싶어 고지서 젤 앞 주소 나온거에 대어보니 바로 인식하더라. 세번 껐다켜니까 세번째에는 순식간에 인식하던데 뭔가 오류가 있었던 것 같다.
카카오 뱅크로 조금씩 주거래를 옮기는 중인데... 앞으로 금융은 카뱅만 쓸 것 같다. 토스 쓰다가 푸시 광고가 많아 옮기게 되었는데 10% 아꼈다. 현재 돈 가치를 에프기븐 으로 넘겨 따져보면 아닐수도 있겠지만 ㅋ


 

 

자동차세 낸 김에 밀푀유 나베 냠냠.

 









 
깻잎이 맛의 포인트

 

운영계획 - 2


하루 최대 방문자 : 359
주간 방문자 변화 : 674 -> 1007

구글 애널리틱스 기준으로는 Direct, Organic Search, Referral, Social 통한 사용자 획득 경로가 있고 Direct 드디어 80% 밑으로 내려왔습니다. 78%네요. 티스토리의 방문자 수는 9~350 명으로 편차가 매우 심하고 주요 원인은 포럼에 글을 쓰고 댓글을 다느냐에 있었습니다. , direct 100% 포럼이라고 있겠네요. 현재는 전체 방문자 수가 적기 때문에 direct 의지할 밖에 없는 상황입니다. 글의 수를 늘여 단어수를 늘여야 하고 Organic Search 늘이는 밖에 없지요.
다음 일주일 운영 계획은 우선, 만든 블로그 취지에 크게 벗어나지 않도록 개발 관련 내용을 올리는데 집중을 해야겠습니다. 티스토리 설정에서 번호로 되어 있는 URL(주소) 제목으로 바꾸었습니다. 구글 애널리틱스에서 방문한 글도 보여주는데 번호로 되어 있으니 제가 다시 번호를 쳐서 어떤 글이 인기 있었는지 확인을 해야 하기 때문입니다.


운영계획  - 1


티스토리에 구글 애널리틱스를 달았습니다. analytics 달아보시면 

친절한 설명이 나옵니다.
메뉴 [획득] 유입 경로 인데요. Direct 80% 나오네요.
알려지지도 않은 블로그를 80% 들어온다는 것은
포럼 밖에는 없는 같습니다. -> 꾸준히 댓글 달고, 글을 써야 겠네요! (아직 광고는 없지만... ^^;;)
Orgarnic Search 13.6%
올랐네요. 3~4%더니 ... 글이 많아지면서 조금씩 검색이 되는 같습니다. 방문자 1300 정도 인데요. 다음 메인에 글이 한번 노출 되었을 하나가 하루 12만씩 찍었던 것을 기억해보면 다작보다는 하나 제대로 쓰는게 좋다는 생각입니다. 당시는 차를 들고 제주도 가는 방법을 포스팅 했었는데,
며칠 비슷한 글이 올라오면서 조회수가 1000 100대로 금방 떨어지더군요. IT 글은 새로 써도 비슷한 글이 있기 힘들지만 검색해 보는 사람 자체가 적기 때문에
조회수가 별로 안됩니다. 대신 다른 글도 함께 보는 경우가 많아서 이탈률은 줄어듭니다. -> 사람들이 관심가지는 분야를 보고 완전히 새로운 글을 써서 포털 메인에 뜨도록 노력해야겠네요. 지금 생각하는 분야는 life( 먹고 노는거 찍기), 여행, 언어 교육쪽 입니다. 블로그 성격은 버려지겠으나 직접 유입은 대부부분 작은 포털들이 시장을 먹죠(클리앙이나 인벤 따위의 , 나쁜 아님, 사전식)
지금 당장은 아이디어도 없으니 꾸준히 이전 블로그 글을 옮기고 포스팅을 해야겠습니다. 먹거리 올리는 거야 재미있으니 하는거고, 여행의 경우는
조금 신경써서 테마별로 적어야 겠네요.

안드로이드  프레임웍 만들 때는 JTAG 장비를 두개씩 썼었지만, (듀얼코어라) 앱 하면서 TRACE32 쓸 일은 많지 않았다. 그만큼 자바가 잘되어 있었고, stack trace + 바로가기 이동까지 있었다. statck overflow 로 바로 열어 주는 스크립트 까지 쓰면 클릭하면 바로 검색도 되었다.


iOS는 그게 안된다.


그러나 다음과 같이 브레이크 포인트를 걸어주면 안드로이드 만큼은 아니지만 디버깅을 할 수 있다.

그리고 어셈에 익숙한 사용자라면 비공개 상용 라이브러리를 써야하는 복잡한 환경에서는 Xcode가 더 나을 수도 있다.

핑퐁치기 딱 좋다.




class exampleUISegmentedControl : UISegmentedControl {

    

    let bottomBar = UIView()

    

    override init(frame: CGRect) {

        super.init(frame: frame)

        self.backgroundColor = .clear

        self.tintColor = .clear

        self.insertSegment(withTitle: "page1", at: 0, animated: true)

        self.insertSegment(withTitle: "page2", at: 1, animated: true)

        self.selectedSegmentIndex = 0

        self.translatesAutoresizingMaskIntoConstraints = false

        

        self.setTitleTextAttributes([

            NSAttributedStringKey.font : UIFont.init(name: "NanumSquareOTFEB", size: 14)!,

            NSAttributedStringKey.foregroundColor : UIColor(red: 128, green: 128, blue: 128)

            ], for: .normal)

        self.setTitleTextAttributes([

            NSAttributedStringKey.font : UIFont.init(name: "NanumSquareOTFEB", size: 14)!,

            NSAttributedStringKey.foregroundColor : UIColor(red: 62, green: 62, blue: 62)

            ], for: .selected)

        

        bottomBar.translatesAutoresizingMaskIntoConstraints = false

        bottomBar.backgroundColor = UIColor(red: 62, green: 62, blue: 62)

        self.addSubview(bottomBar)

        

        let bottmBarWidth = UIScreen.main.bounds.width / CGFloat(self.numberOfSegments)

        

        bottomBar.snp.makeConstraints { (make) in

            make.top.equalTo(self.snp.bottom)

            make.height.equalTo(3)

            make.width.equalTo(bottmBarWidth)

            make.left.equalTo(self.snp.left)

        }

        

        self.addTarget(self, action: #selector(valueChanged), for: .valueChanged)

    }

    

    @objc func valueChanged() {

        UIView.animate(withDuration: 0.1) {

            self.bottomBar.frame.origin.x = (self.frame.width / CGFloat(self.numberOfSegments)) * CGFloat(self.selectedSegmentIndex)

        }

    }

    

    required init?(coder aDecoder: NSCoder) {

        fatalError("exampleUISegmentedControl")

    }

    

    @objc func segmentedControlValueChanged(_ sender: UISegmentedControl) { //for example

        UIView.animate(withDuration: 0.3) {

            self.bottomBar.frame.origin.x = (self.frame.width / CGFloat(self.numberOfSegments)) * CGFloat(self.selectedSegmentIndex)

        }

    }

}


https://stackoverflow.com/users/7496073/john-montgomery 의 코드를 이용하면 쉽다.

extension Dictionary {

    static func += (lhs: inout [Key:Value], rhs: [Key:Value]) {

        lhs.merge(rhs){$1}

    }

    static func + (lhs: [Key:Value], rhs: [Key:Value]) -> [Key:Value] {

        return lhs.merging(rhs){$1}

    }

}




 _ = json["data"]["summary"].arrayValue.map({

                    VD.s.vdTrendStat?.arrCgmCount += [$0["section"].stringValue : $0["count"].intValue]

                })




.

.

.

        GS.s.tp1?.labelUpperValue.text = String(describing: ((VD.s.vdTrendStat?.arrCgmCount.filter { $0.key == "high" })?.first?.value ?? 0))

'!A. Basics' 카테고리의 다른 글

iOS 디버깅 방법  (0) 2019.01.16
UISegmentedControl  (0) 2019.01.16
String, 소수점 두 자리 처리  (0) 2019.01.16
label 에서 ... 없애기  (2) 2019.01.15
한방에 알 수 있는 델리게이트 패턴  (0) 2019.01.15

cmd + shift + 0 눌러 String 검색하면 워낙 자세히 나와 있어 포스팅할 필요성은 없지만 행여나 키워드에 걸릴까 올린다.


보통은 직접대입한다.

GS.s.tp1?.labelBloodSugar.text = String(describing: VD.s.vdTrendStat?.cgmAvg ?? 0)

.

+ 연산자로 합칠 수 있다.

let combinedTextAvgStdev : String = String(describing : VD.s.vdTrendStat?.cgmAvg ?? 0) + "±" + String(describing : VD.s.vdTrendStat?.cgmStdev ?? 0)

        GS.s.tp1?.labelBloodSugar.text = combinedTextAvgStdev

.

소수점 두자리 처리는 일단 원하는 소수점 수만큼 곱한 다음 round로 필요없는 소수점 잘라내고 다시 소수점으로 내린다.

        let numberOfPlaces = 2.0

        let multiplier = pow(10.0, numberOfPlaces)

        var num = Double(VD.s.vdTrendStat?.cgmAvg ?? 0)

        var rounded = round(num * multiplier) / multiplier

        var combinedTextAvgStdev : String =  String(describing : rounded) + "±" + String(describing : VD.s.vdTrendStat?.cgmStdev ?? 0)

        GS.s.tp1?.labelBloodSugar.text = combinedTextAvgStdev

.

쓸 때는


GS.s.tp1?.labelUpperValue.text = String(describing: ((VD.s.vdTrendStat?.arrCgmCount.filter { $0.key == "high" })?.first?.value ?? 0)


이제 역사 속으로 사라지게 되었다. 

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

코딩 테스트 매 주 쳐서 원조격인데 나중에는 개삽질 하는 엔지니어로 삼성전자에 대부분 배치되어 개삽질 해서 일주일에 지식을 열심히 발굴해서 학연, 지연, 혈연에 끼였거나 혹은 거기 들어가고 싶은 무늬만 개발자 애들에게 그 지식을 바친다. 그렇게 배터리 다되면 버려지거나 배터리 다 되기 전에 나와서 창업하거나 했던 것 같다. 난 삼성전자 들어가고 싶지도 않았고, 창업은 대학생 때 이미 했었다. 단지 소프트웨어 잘하는 애들 있다고 해서 갔다가 단지 7명이서 만들어낸 무선 사업부에서 한 사람이 만 명을 먹여 살린다는 말의 의미와 수 많은 정치를 보았다. 뭐, 그래도 나라 팔아먹은 이완용이랑 동시대에 안 살아서 다행이다. 그리고 회사 일 안하고 수 년 동안 알고리즘 풀이만 공부하던 애들이 결국에는 더 잘되더라. 해서 팩트를 말해주니 이제 친구들도 다들 정치 잘해서 회사 전체가 망하고 있다. 회사 망해도 늬들만 잘 살면 됨. ^^ 어차피 회사가 늬들 수준은 안되니까. 디자인은 본래 조금 일하다가 유학 가는게 기본이고 마케팅은 말할 것도 없곸ㅋㅋ. 진성 개발자들아 빨리 깨어나~ 회사 일은 20%, 나머지 80%는 자기 개발 하삼. 어차피 그렇게 하는 인간들이 다 임원으로 오고 이미 침몰하는 배는 살릴 수 없다. 소프트웨어는 워즈니악, 하드웨어는 리사수가 오지 않는 이상 이미 굳어진 정치를 어떻게 이기리오? - 마치 전쟁 중인데 핵이 없으면 휴전 시킬 수 없는 것과 같다.

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

최근에도 키오스크 만들어 달라는 부탁이 있어 정보 공유 해 본다. 뭐, 어느 그룹이나 먹고 살려고 고민하는 기회주의자들이 많긴 한데,... 일을 안하는 것도 아니긴 하니까 잘 이용하고. 대학교 학생의 경우 이제 새로운 것으로 상품 만들지도 못하면서 신기술만 가져다가 안개속 거닐게 하지 말고 좀 더 실용적인 학교로 거듭나지 않으면 간판으로 유지하던 시대는 이미 갔으니 잘 가져가서 쓰라는 의미로 적어 둔다. 별 거 아니지만 아는 것과 모르는 것은 천지 차이.


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



-----------

삼성 소프트웨어멤버십은 재능과 열정 있는 국내 최고의 대학생 개발자들을 조기 발굴하여 개발역량과 잠재능력을 마음껏 발휘 할 수 있는 공간을 마련하기 위해 설립되었습니다. IT 연구개발 활동에 필요한 물품과 최적의 환경을 제공하는 삼성전자 인재양성 프로그램입니다.

운영현황 삼성소프트웨어멤버십은 서울(강남/신촌), 수원, 대전, 대구, 부산, 광주 총 7개 지역에서 운영되고
있습니다.
각 지역에서는 미래의 소프트웨어 산업을 이끌어 나갈 대학(원)생들이 창의적인 분위기 속에서
소프트웨어 연구개발에 매진하고 있습니다
지원사항
[회원활동]
- 창의과제 (연구비용 지원)
S/W멤버십 회원이 과제 기획의 주체가 되어 획기적이고 독창적인 Idea 구현 및 S/W 개발 능력
향상을 위한 S/W멤버십 내부 과제
- 삼성과제 (연구비용 지원)
삼성전자 사업부에서 의뢰가 들어오는 산학과제로 의뢰 부서와 S/W멤버십 회원이 협업하여
개발이 이루어지는 과제
- 교육
S/W개발자로서 갖추어야 할 기본적인 개발 능력을 향상시키고 활용하는 과정
- SIG 활동
특정 분야에 대해 관심 있는 S/W 멤버십 회원이 모여 관심 분야에 대한 공부 및 지식 공유
활동을 하는 모임
[연구개발 활동 지원]
- R&D 프로젝트 수행
삼성전자 사업부 연계 과제 및 팀 단위 자율 과제 수행
- 기술교육 기회 제공
외부 유명 강사 초청 및 멤버십 우수 회원 진행 교육 제공
- 다양한 SIG 활동
관심 분야에 대한 그룹 스터디 및 세미나를 자율적으로 수행
[프로그램]
- 공개 기술 세미나
멤버십 내 우수회원이 기술 주제를 정하여 이공계 관련 학과 학생을 대상으로 세미나 개최
- 우수 작품 전시회
전국 7개 재역에서 1년간 진행했던 창의과제 중 우수과제들을 한자리에 모아 전시회 개최
- 오프닝데이
회원만 출입할 수 있는 공간인 멤버십을 개방하여 시설 투어 및 우수과제 전시,
동아리 간담회 등을 진행
- 지역 워크숍
각 지역 멤버십에서 하계, 동계 연중 2회 실시하는 화합 행사
- OB 초청 학술 포럼
삼성전자에서 근무하고 있는 현업 멤버십 선배를 초청하여 사업부 소개와 최신 기술 동향을
파악할 수 있는 교육의 장 마련
- 융복합 과제
삼성전자 디자인멤버십 회원과의 협업을 통한 융복합 과제 기회 부여
(삼성전자 홍보관 'Samsung d'light' 전시)
[연구개발 환경 지원]
- 24시간 연구 개발 가능한 1인 1좌석 개인 공간 제공 (PC, 네트워크 지원)
- 프로젝트 수행 시 개발지원금 및 인센티브 지급
- 하드웨어 실험실 운영 및 개발 장비/부품 지원
- 연구개발 관련 참고 서적 지원
[편의시설 지원]
- 다양한 편의시설을 갖추어 쾌적하고 편리한 생활환경 제공
(수면실, 탕비실, 샤워실 , 체력 단련실, 세미나실, 도서실 등)
선발시기
- 정기선발 : 매년 2회 상하반기 선발
- 상시선발 : 사전공고 후 서류접수
선발대상
- IT(S/W, H/W) 분야 연구개발에 재능과 열정 있는 국내 정규 4년제 대학(원)생
(학부 1~4학년 / 석사과정)
- 학교 졸업 전 최소 1년 이상 회원활동 필수 (졸업과 동시 수료)
- 국내외 대회 및 공모전 수상자 우대
- 학년제한 없음, 전공학과 불문, 휴학생 지원 가능
선발전형
[서류전형]
본인이 보유하고 있는 Software관련 기술/이력 작성 및
공모전 수상작, 학교 텀 프로젝트 등 본인이 직접(공동) 개발한 작품에 대한 소개
[기술전형]
.보유기술 면접 (Portfolio 및 Software 응용 개발능력 면접)
서류전형 합격 후, 본인 이력 및 개발한 작품을 통한 보유기술 면접 진행
.코딩 풀이 면접 (Software 언어 문제 풀이 면접)
Software 언어를 활용한 코딩/알고리즘 풀이 및 인터뷰 진행
[코딩전형]
문제해결능력 검증(알고리즘 풀이)
지원방법 서류접수 기간에 삼성 소프트웨어멤버십 홈페이지 (www.secmem.org) 에 접속하여
지원서 양식에 맞게 작성 후 지원
프로세스 지원서 작성 > 서류전형 > 기술면접(보유기술,코딩풀이) > 코딩전형 > 멤버십 선발 > 멤버십 활동 > 멤버십 수료 및 입사



사랑을 인정하고 아기를 만들 준비가 되어야


그게 사랑이거든


처음 태어난 딸아이를 처음 안는 순간

그렇게 작고 연약할 수가 없어

작은 심장 박동은

세상에서 그보다 사랑스러운 없지

딸을 제대로 키우고 곁에서

넘어질 잡아 주길 바라게

아무것에도 다치지 않게


팔이 부러지거나

악몽을 꾸거나

상처받지 않게

변호사가 팀원인 경우는 나도 한번 밖에 겪지는 못했다.(삼성 본사에 있을 때 팀내에 변호사 2명, 협업하는 팀 내 125명)


약관 만들 때 대부분 외부 의뢰를 한다. 중견 기업 이상이 아닌 이상 IT 쪽 개발팀 내 변호사를 두지 못한다.


추가 정보로 IT 개발 팀은 어떻게 꾸릴까 궁금할런지도 모르겠다. 그래서 자료를 남긴다. 각 항목마다 각각 하나의 팀이다. 각각 다른 회사로 보면 되겠다. 어느 회사던 같은 팀을 꾸릴 수는 없다. 시장상황, 지원자금, 기업전략, 개개인의 능력 등 변수가 너무도 많다. 주변에 팀을 꾸리는 사람의 머릿속에 뭔가 도움이 되라고 기록해 둔다. 


- 개발 8, 국내영업 4, 해외영업 8, 업무지원 1

- 기획 6 , 서버개발 4, 클라이언트개발 6, 배경아트 4, 캐릭터 아트 7

- HW개발 4, SW개발 2, 서버개발 1, QA1, 출하지원1

- 개발10 , 기획6,  아트9

기획3, 아트11, 프로그램팀6

- 개발5, UI5, 웹퍼브리싱2

- 디자인4, 퍼플리싱

마케팅3, 모바일사업3, 사업지원

- 국내4, 해외1 5, 해외2 4, 

- 웹개발4, 웹플랫폼2, QA 1

- 보안7, 시스템운영5, 인트라운영4, 경영지원팀5

- 기획2, 서버2, 클라이언트3, 품질4, 프론트4

- 개발10, 고객지원4, 기획6, 품질7, 개발10




오래전 일기


꿀위키는 블라인드 메신저나 잡플래닛의 직원 이야기가 있게 해 준 장본인이다. 오리지널스에서 라스트 무버를 찬양하는 문화, 혹은 그들을 대변하는 문화로 바꾸었으나 꿀위키는 정말 신선한 충격이었다. 그 뒤로 텀블벅에 다시 나타났는데 사실, 이미 경쟁은 너무 많이 생겼고, 시기는 너무 늦어버렸다. 게다가 사람들이 한번 외압에 의해(추측이지만 외압 아니면 사실 내릴 이유가 없었다) 내려진 것에 다시 관심을 가지기란 쉽지 않다. 안철수가 강을 건너오고 다리를 불태워 버렸다고 했는데 다시 건너가는 것을 보며 돌아선 것도 비슷한 이유. 안철수 대통령 출마 권유를 위해 열심히 활동했었던 나도 부끄러웠었지.


꿀위키랑 비슷한 사람(도전적이고 진취적인 사람)이 만든 또 다른 프로젝트가 있는데 그것은 가솔린, 경유를 수입해 오는 프로젝트였다. 아마 그것도 외압에 의해 무산되었을거라 생각한다. 산유국은 아니나 정유국에서 기름값 장난 치는 것도 지겹다. 기름값에 큰 영향을 받고 1조 적자니 5조 흑자니 하고 있는데 일단은 가격이 주유소마다 너무 다르고 뭔가 속 시원하게 공개되는 자료도 없다. 왜 꼭 우리나라 정유사만 이용해야 하는지도 모르겠다. 정유사 직원 연봉은 같은 연차 금융업 보다 많고, 근속은 공무원 수준에 업무 강도는 한수원 뺨 치지 않을까? 전체는 모르지만 몇몇 지인의 말로는. 물론, 그런 사람 키워서 외제차 타고 외국 제품 쓰게 해주는 것도 좋지만, 경쟁 구조 아래 서민들이 더 저렴하게 주유할 수 있는게 더 애국인 것 같다. 


쓰다보니 길어졌는데 자세한 자료는 필요없고, 해외 정유사 하나만 shell 정도? 만 들여오자. 어떻게 경쟁하나 보게.


꿀위키를 블로그 역사에 남기려다 글이 길어졌다.


믓튼, 이 글을 빌어 꿀위키를 기획하고 만들었던 사람에게 찬사를 보낸다. 블라인드나 잡플레닛처럼 계속해서 좋은 서비스가 나왔으면 한다. 객관적 사생활을 제외하고 이 세상 모든 것은 공개되지 않으면 90%는 비리라고 보면 되겠다.


꿀위키



# 꿀위키 ?

꿀위키는 2012 12월에 만들어진 IT 개발자들의 위키 입니다. 오픈 이후 '게임회사 뒷담화' 라는 주제로 이슈가 되었습니다그렇게 시간이 흘러 꿀위키는 '회사 뒷담화 위키' 자리를 잡게 되었습니다.


이런 모습을 가졌던 위키 입니다. 지금은 폐쇄된 상태라 보여드릴게 없네요 ㅜㅜ

  1. 한겨례뒷담화' 웹사이트 '꿀위키' 아십니까
  2. 뉴스토마토 - 아온 '꿀위키'..실제 내용 확인 해보니
  3. 뉴스1 - 다시 돌아온 '꿀위키'…게임회사들 떨고 있나?

꿀위키 서비스 기간 중의 기사들 입니다.

그러나, 너무나 많은 관심과 과격한 이용으로 명예훼손 부터 다양한 법적 문제들이 하루하루 발생 하였습니다. 매일매일 많은 회사들로부터 ' 고소!' 연락을 받아왔었지요

관리도 어려웠습니다. 하루에 백건에서 많게는  건의 작성이 이루어지다 보니 제가 하나하나 내용을 정리 하거나 수정 하기도 어려웠습니다

 

# 2015 5 꿀위키의 폐쇄

회사 뒷담화로 폭주중인 꿀위키를 식히기 위해서  차례 서비스 중단이 있었습니다그리고 2015 5 공식적으로 폐쇄를 하게 되었습니다.

꿀위키 운영비용과 이런저런 문제들을 혼자서 감당 하기에는 어려움이 있었습니다. 그리고 굳이 꿀위키를 서비스 해야 이유도 딱히 없었습니다.

그렇게 꿀위키를 닫고서 1년이 흘렀습니다.  그간 저를 만나는 사람들은 하나같이 "꿀위키는 닫았나요? " " 꿀위키 언제 오픈 하나요 ? " " 꿀위키가 필요해요 "  라고 이야기를 했습니다.

 

# 꿀위키 2세대,  "꿀위키의 진화"

꿀위키 폐쇄 1 동안 꿀위키의 필요성에 확신이 들었습니다. 하지만 같은 모습으로 똑같이 오픈하는 것은 의미가 없습니다 진화되고 강력한 꿀위키가 되어야 합니다.


진화 1 - 변호사 선임

꿀위키의 가장 문제는 '명예훼손' 입니다. 제가 법을 모릅니다이전 꿀위키는 편집내역에 작성자 IP 공개하여 작성자에게 모든 책임을 떠넘기는 방법으로 운영을 했었습니다. 꿀위키 2세대는 다음과 같이 진행 합니다.

1. 작성자 정보의 비공개
-
수색영장이 있는 경우에만 제공합니다.

2.
명예훼손 문서의 사전 차단
-
명예훼손이 만한 내용을 검토, 수정하여 이용자를 보호 합니다.

3.
문서 삭제요청의 거부
문서 전체의 삭제는 없습니다문제가 부분만 선별하여 수정 합니다.

대부분의 회사들이 변호사를 통하여 어려운 용어로 겁을 줍니다. 그래서 꿀위키도 변호사로 대응하며, 문제가 되는 부분만을 선별하여 처리 합니다정확하게 법적 근거에 의하여 합법 뒷담화 꿀위키로 운영합니다.

" 명예훼손 관련 소송에 경험이 풍부한 파트너 변호사와 협의가 완료 되었습니다 "


진화 2 - 인터넷 신문사 꿀위키

위키의 글과 언론의 뉴스는 다릅니다. 저도 자세히는 모르겠으나 명예훼손이나 그외 법적인 문제에서 훨씬 자유롭다고 합니다. (변호사님 말씀)

또한 일부 신문사에서 함께 해보자는 연락도 있었습니다하지만 언론사도 기업을 고객으로 하는 영리단체 이며, 꿀위키가 변질 있기에 진행하지 않았습니다.

" 그래서 직접 꿀위키가 언론사가 되기로 했습니다 "

위키 시스템은 변화가 없으며, 위키의 내용들을 사용하여 꿀위키 뉴스로 편집  보도 됩니다

" 꿀위키가 신문사가 된다고 해서 영향력이 있을까요 ? "

당연히 처음에는 듣보잡 언론일 뿐입니다저의 뚝심과 이용자 분들의 관심으로 영향력 있는 언론을 만들 있을 입니다.


진화 3 - 편집 인력의 구축

인터넷 신문사 설립을 위해선 취재,편집 인력 5명의 상시고용 인원이 필수 조건 입니다. 그리고 이들은 뉴스 생산과 꿀위키 편집에 도움을 주실 분들 입니다꿀위키의 모든 편집 내역을 확인하여 깔끔하게 정리하고, 문제가 법한 내용은 변호사와 조율하여 합법한 내용으로 변경하며 꿀위키를 아름답게 이끌어 주실 것입니다.
꿀위키 2세대는 매일 또는 격일 간격으로 하루 2~3시간 동안 모든 이용자의 편집을 제한하고 내부 편집자들이 일괄적으로 정리,조정하는 시스템을 가질 계획 입니다.

외형적으로 변화는 없습니다. 기존의 위키 시스템을 그대로 사용 합니다. 다만 페이지와 약간의 카테고리 작업을 통해서 뉴스(신문사 부분) 위키 부분으로 나누어지게 됩니다.

 

# 꿀위키 2세대 오픈일정

꿀위키 2세대의 오픈 목표일은 2016 8 마지막 입니다.
현재도 위키 시스템에 대한 작업이 계속 진행되고 있으며, 변호사와의 스케쥴 조율 입니다.  
펀딩 상품은 8 31 까지 받아보실 있도록 진행 됩니다.

 

펀딩 상품 안내

오직 이번 펀딩에서만 얻을 있는 ! 가격을 매길 없는 ! 상품입니다. 비싼것은 드리지 못해 죄송합니다

꿀위키 컵세트는 당신의 허세로움을 절정에 오르게 합니다

  1. 꿀위키 식당컵 A


  1. 꿀위키 식당컵 B


  1. 꿀위키 육수컵 A


  1. 꿀위키 육수컵 B


  1. 꿀위키 스텐 맥주컵


  1. 배너광고 2주권
    • 꿀위키 사이트의 좌측에 배너 광고를 걸어드립니다. 기간 2
  2. 배너광고 5주권
    • 꿀위키 사이트의 좌측에 배너 광고를 걸어드립니다. 기간 5
  3. 배너광고 8주권
    • 꿀위키 사이트의 좌측에 배너 광고를 걸어드립니다. 기간 8

꿀위키는 오픈 이후에는 구글 광고와 내부 서비스 광고 배너만 진행 합니다특정 업체의 고정 배너 광고권은 이번 펀딩에서만 얻으실 있습니다. 구체적인 사이즈와 위치는 사이트 오픈 후에 개별적으로 알려드립니다. 광고는 PNG, JPG, GIF 고정 이미지만 가능합니다.

광고는 불법,성인,폭력성만 없다면 무엇이든지 가능합니다.

  • 20,000 - 꿀위키 식당컵 A
  • 50,000 - 꿀위키 식당컵 A + B
  • 100,000 - 꿀위키 식당컵 A + B & 꿀위키 육수컵 A
  • 200,000 - 꿀위키 식당컵 A + B & 꿀위키 육수컵 A + B
  • 200,000 - 꿀위키 스텐 맥주컵
  • 400,000 -  꿀위키 식당컵 A + B & 꿀위키 육수컵 A + B & 꿀위키 맥주컵
  • 1,000,000 - 꿀위키 풀세트 (5) & 배너광고 2
  • 2,000,000 - 꿀위키 풀세트 (5) & 배너광고 5
  • 3,000,000 - 꿀위키 풀세트 (5) & 배너광고 8

꿀위키 컵세트는 스텐레스에 레이저 인쇄 되어 100 이상 영구적인 사용이 가능합니다.

지금 커다란 원기옥이 필요합니다.

그러면 재미난 세상이 입니다.

 

Q. 펀딩이 실패하면 어떻게 되나요?

꿀위키 2세대 프로젝트 펀딩이 실패하면 오픈이 불가능 합니다. 돈이 없거든요. 훗날 제가 돈을 많이 벌면 오픈 하겠습니다그러기 위해 그냥 지금의 일을 열심히 하겠습니다.

Q. 펀딩 금액이 큽니다 ?

펀딩 목표 금액은 꿀위키 2세대 시스템을  3개월간 유지할 있는 금액 입니다. 변호사 비용과 5명의 편집인력 비용으로 서버나 기타 개발비용은 모두 제외하고 최소한의 꿀위키 인건비만을 책정 하였습니다.  

펀딩에 성공하여도 3개월 이상을 버틸 있을지 저도 모르겠습니다. 하지만 일단 시도는 해보려 합니다.

Q. 꿀위키의 수익 모델은 무엇인가요 ?

꿀위키의 수익모델은 구글광고와 기부금 외에는 없습니다. 펀딩에 성공하여 오픈 후에도 꿀위키는 항시 기부금을 받아야 합니다이용자 분들의 작은 기부금이 모여서 꿀위키가 유지 것입니다.  염치없지만 작게라도 계속 도와 주셔야 합니다. ㅜㅜ

기업들의 배너광고 유치도 해서는 안됩니다. 기업과의 관계에 따른 불필요한 의혹이 생길 있으므로 광고는 오직 구글광고와 자체 서비스 홍보를 위한 배너만 진행 합니다.

Q. 현재 비슷한 앱과 사이트가 있습니다. 꿀위키는 이들과 무엇이 다른가요

꿀위키는 회사의 상세하고 외부에서 접하기 어려운 정보들을 공유 합니다또는 잘못된 부분들을 밝혀 기업이 발전하고, 근로자가 힘을 있는 공간 이고자 합니다.

단순히 회사에 평점을 주어 순위를 내는 것은 아무런 의미가 없습니다. 또는 비공개로 사내 사람들만 모여서 이야기 하는 수다방도 아닙니다

Q. 꿀위키는 누가 서비스하는 것인가요?

꿀위키는 게임 개발자 커뮤니티 '게임코디' 게임서버 교육학원 '프로카데미'  운영중인 ()게임코디 에서 서비스 합니다.  

Q. 꿀위키는 영리 사이트가 되는 것인가요

꿀위키 자체를 영리 목적으로 하지는 않지만 비영리 사이트를 표방하지는 않습니다. 꿀위키의 서비스 주체가 ()게임코디 이므로 비영리 사이트라고 이야기 하는 것은 앞뒤가 맞지 않습니다.

위에도 말씀 드렸듯이 꿀위키는 기부금과 구글광고 외에는 수익모델이 없습니다.
이용자들에게 비용을 요구하는 유료 서비스는 절대 없으며, 기업들에게 돈을 받는 서비스도 절대 없습니다꿀위키로 돈을 벌기보단 게임코디의 다른 서비스 (커뮤니티, 교육사업, 게임개발) 에서 얻은 수익을 꿀위키가 까먹는 입장이 것입니다.

마지막으로 살짝 말씀 드리자면, 이전 꿀위키 서비스 중에도 꿀위키를 인수하려는 접촉들이 있었습니다만 모두 거절 하였습니다꿀위키가 팔려나가면 변질 것이 뻔합니다사정이 악화되어 팔려나갈 바에는 폭파 시키겠습니다.

그 뒤로 일기가 바뀌며 책이 되었다. 이 때부터 책 쓰기 연습 시작



공부의 깊이

2016. 모든 것에는 시간 개념이 들어간다. 1704년에 우리는 존재하지 않았던 것과 같다. 다른 예로 누군가를 뜨겁게 사랑했고, 만약 지금 사랑하지 않는다면, 결과만 보고 "사랑한 없다" 맞는 표현이 아니라. "특정 시간에는 세상 누구보다 사랑했다" 맞는 표현이다. 그래서 서두에 2016년임을 분명히 밝히고 시작한다.


그레고리 페렐만

현존하는 수학자 어떤 저명한 수학자라 할지라도 후대에 그레고리 페렐만의 이름보다는 위대하지 못할 것이라고 생각한다. 프로그래머가 공부하다 보면 결국 전기의 법칙, 수학에 귀결된다. 그러나 수학을 잘한다고 해서 그레고리 페렐만처럼 수는 없다. 결국 공부의 깊이를 정해야 때가 온다.


Borland사의 Together

년도 이야기이다. 볼랜드社의 투게더를 이용할 기회가 있었다사실 필자의 모든 경험과 지식은 대부분 아버지와 모교의 옥교수님 덕분에 만들어진 것이다. UML 그리면 바로 코드로 뽑아주는 툴이었다. 혁명이라고 생각했는데 주변에서는 여전히 클래스 다이어그램, 시퀀스 다이어 그램을 그리고 있고 Eclipse 쓰는 친구들은 OMONDO 뭔지도 모른다. 최근에는 UML 뭔지도 모르는 신입 사원들을 만나기도 한다. 그래서 당당하게 말할 있다. 그냥 몰라도 된다.


그림은 그림일 . 만들어야 하고 어떻게 소통해야 할지 아는 것이 중요하다.


디자인 패턴

디자인 패턴은 대부분 공부하게 것인데, 안드로이드 앱을 만들어서 여러 수상 경력이 있는 친구들도 디자인 패턴이 뭔지 모른다. 그런데 이미 그들은 쓰고 있다. 기본 내장 패턴만 해도 MVC, 싱글톤, 팩토리, 빌더, 옵서버 ... 안드로이드에서 구현하는 방식 자체가 패턴을 이용해서 구현하는 방식이다. 앞서 말했듯이 자전거를 타면서 자전거 명칭을 모르는 것과 같다. 몰라도 된다.


알고리즘

필자도 코딩 실력만 믿고 우리나라 최고의 대학을 나와 영어로 강의하시는 교수님께 막말을 적이 있다. 물론, 그분은 기초가 뛰어나셔서 단기간에 알고리즘 코딩의 대가가 되셨지만 그때도 결국 "야근" 답인 것을 알았다. 필자 역시 졸업이 안될 위기를 코딩과 전혀 상관없는 과목인데, 구글링으로 코드가 없는 알고리즘을 3 밤낮으로 구현하고 사정사정해서 겨우 졸업했다F -> D 필자가 만난 분들 중에는 암호학이나 알고리즘 관련 과목 전공만으로 박사학위를 받으신 분도 계셨지만 수년간 PM으로만 일하셨다. 지식을 일이 아예 없었다. 직장 대표님의 경우 내가 지금껏 만난 중에 가장 기술력이 뛰어나고 개발도 잘하셨었는데 게다가 과학고, 서울대에 해외 석사 극악의 알고리즘의 경우 구현된 라이브러리를 API처럼 당겨서 쓴다고 하셨다. 물론, 그분의 실력으로 분석 못하시진 않겠지만 수억 버는 프로그램 전체를 혼자 개발하시고 50 바라보시는 나이에도 라꾸라꾸에서 쪽잠을 주무시며 개발을 하는데 이상 어떻게 시간을 것인가?


결국, 디자인 패턴과 알고리즘을 논하기 전에 무엇을 만들 것인가 생각해야 한다. 만들고 싶은 난이도가 미국이라면 비행기라는 방법을 이용해야 하고 가까운 곳이라면 자동차란 방법을 이용해야 한다. , 목적지 설정이 중요하다는 것이다. 공부를 하다가 너무 재미있어서 빠져버리면 학교로 돌아간다. 필자의 멘티들은 대부분 학교로 돌려보냈다. 가족 부양의 이유로 번이나 등록하지 못했던 대학원 입학 고지서가 안타까운 마음에 더더욱 그런 방향으로 이끄는 것인지도 모르겠다. - 전면 수정해야 . -


그러나 책에서는 툴과 디자인 패턴과 알고리즘 이야기를 것이다.

이유는 이렇다. 그레고리 페렐만을 수천 합쳐놓은 천재가 나타났다고 하자. 그럼 그냥 main 문에 코딩으로 프로그램을 짜면 된다. 라이브러리도, 개발 방법론도, TDD, 애자일, 구조 설계 방법, UML, 기타 등등 IT 용어가 들어가는 대부분 필요가 없다. 그냥 혼자 설계하고 하드웨어 설계해서 모든 펌웨어, 운영체제, 프레임웍, 그리고 위에 우리가 사용할 유틸리티와 프로그램 모두 번에 짜고 칩에 넣어버리면 된다.


그러나 그런 천재가 없다. 그래서 분업하기로 했다. 소프트웨어 공학이 나왔고, 효율적인 프로그래밍과 개발 방법론, 테스트 케이스나 툴들이 나왔다. 상대방에서 설명하기 위해 그림들을 그리기 시작했고 블록 다이어 그램, UML, 시퀀스 다이어그램, 클래스 다이어그램 등을 그리기 시작했다. CVS, SVN, GIT 등도 협업하면서 사람들이 계속 실수하니까 그런 연유로 만들어졌다.


프레임웍도 각자 짜다 보니 사업해서 벌고 싶어 지고, 누구는 오픈소스로 자유를 원해서 다른 노선을 타는 ... 수많은 OS 생겨났고 어차피 천재가 없는 판국에 경쟁이 붙으면 좋은 제품이 나올 거라는 사회적 기대감이 서로 자기 것이 최고라고 말하기 시작했다.


라이브러리로 만들기 껄끄러운 코드 패턴은 디자인 패턴이라고 부르고 서로 맞춰서 쓰며 소통하기로 했고, 만들고 보니 제대로 동작 하는 것들이 많아서 수학과 코드의 경계인 알고리즘을 발전시켰다. 소프트 공학들은 만들어졌다가 이슈화 되었다가 사라지고 하는데. facebook이나 youtube처럼 경쟁력 있는 제품이 목표의 root 아니면 아래 노드들은 번에 사라지기도 한다.



책에서 다루는 것은 프로그래머들끼리 소통의 방법이다. 그런데 입사한 친구들 중에 소트 바로 짜보라고 했을 단박에 짜는 엔지니어가 누가 있으랴필자가 알려준 방법대로 매일 코드를 치다 보면 물론, 쉽다. 그러나 그것이 중요한 것은 아니다. 소통의 이유로 배워야 한다. 배워야 하는지 알고 시작하면 좋다.


복면가왕에 나오는 사람들 가수들이 모두 오페라 가수는 아니다. 듣기도 괜찮을 정도면 나올 있다. 프로그래머도 그런 존재라고 생각한다. 알고리즘의 대가라고 해도 그레고리 페렐만과 이야기할 있는 교집합은 얼마 것이며, 디자인 패턴의 대가라고 해도 안드로이드 같이 성공한 제품을 만들지 않았다면 대중의 공감을 얻기 힘들 것이다.


필자가 지난 5년간 멘토링 해서 얻은 가장 소중한 결실은 민간 IT 트렌드를 지속적으로 센싱 하며 특정 개발을 위해 신입이 매력적으로 보일만한 공부의 방향을 정해줄 있는 안목을 얻은데 있다. 물론, 안목에도 시간의 개념이 들어간다. 한두어 달만 IT 뉴스를 보지 않아도 감각을 잃을 거라 생각한다.


지금 있을 쓰려고 하는 것이다. 자연(전기) API 호출해서 만든 CPU 하드웨어의 API 위에 만들어진 OS, OS API 써서 만들어지는 프레임웍도 프레임웍의 API 호출해서 만들어지는 애플리케이션들.


어떤 분야가 있는지, 기술이 있는지 집중할 필요는 없다. 어떤 곳의 엔지니어들이 가장 겸손하고 소통이 잘되며, 모르는 것을 모른다고 하면 친절하게 가르쳐 있는지 보면 것이다. 필자의 안목으로 단편적으로 말하자면 고수층이 가장 투텁고, 같은 것을 짜도 가장 소스가 달라지는 C++ 가장 그렇고, 그다음은 JAVA이다. 새로운 언어라 초고수가 없는 SWIFT 같을 것이다. C 다루는 사람들은 대부분 하드웨어 종속적이고 사람 목숨이 왔다 갔다 하는 프로젝트들도 더러 있어서 와신상담을 해서 고수 반열에 들지 않으면 소통이 어렵다.


필자 이야기를 잠깐 하자면, 철학 부분에서 자신 있는 필체로 쓰는 것은 겸손해야 하는 논리를 뽑아내기 위함이었다. 필자도 유독 선배에게 만은 소리를 들었다. :) 그리고 선배 자신도 모르는 것을 간단히 모른다고 말하고 아는 것은 안다고 말했고 그렇게 알아야 한다고 가르쳐 줬었다. 프로그래머 자존심에 뱅뱅 돌려서 말하거나 과시하거나 이미 했던 결과물을 말하는 것을 싫어했다. 선배의 머릿속에서 중요한 것은 항상 만들까였다. 책을 쓰라고 수없이 권유를 했지만 자신은 만드는 것이 좋다며 ㅄ이라고 불러줬던 선배가 사실 가장 겸손하고 소통을 잘하는 사람이라는 것은 뒤늦게 알게 되었다.

- 만에 수십억을 버신 선배가 가르쳐준 개발자 소통의 정수라 수정해서 들어가야 내용


새로운 것을 창조하기에 개발자라 불리는 프로그래머의 철학은 이것이 전부라고 생각한다. 솔직히 말하면 코드 몰라도 된다그래도 포인터 정도까지는 알자.



1. 이미 형성된 시장에서는 기존 사용자를 포용하는 서비스만이 성공한다. - 경기도 교육청 마소 제품 퇴출기사, 중국 40% 이상이 리눅스 배포판 '기린'으로 나간다는 최근 기사, 오래전 우주정거장 OS 리눅스로 되었고 세계 슈퍼컴퓨터 TOP 500 494대가 리눅스 라도 일반 사용자는 기존 운영체제 쓰는 것에 익숙하다는 생각이 있었습니다. 7년전 같이 일할 기회가 있었던... 마소에서 아마존으로 옮긴 엔지니어가 닷넷은 죽었으니 마소 진영을 떠나야 한다고 했었지요. 수긍했지만 상당한 시간이 걸릴것이라 생각했습니다. 여전히 서버 시장이나 데탑 시장을 보면 마소가 건재합니다. 구글이 크롬북 내고 실패, 페북이 , 검색서비스 내면서 실패하는 것들을 봐도 좋게 만드는 보다 기존 사용자를 흡수하면서 나가는 PLAY만이 성공한다는 선입견이 있었습니다. C++ 창시자가 C 번역하는 툴을 먼저 만들어서 성공했듯이요. 최근 우분투를 보면 맥이나 윈도 유저가 전혀 불편함이 없습니다. 물론, 한글 빼구요.

2. 한글... 그리고 서비스에 집중하기 : NSA에서 SELinux 만드는 엔지니어와 일할 기회가 있었는데... 한글디폴트 우분투를 쓰다가 빡쳐서(현장감UP) 다시 영문 디폴트 우분투로 완전히 새로 세팅을 적이 있습니다.(폰트에 계속 문제가 생기더군요) 오래도록 리눅스를 봐왔지만 리눅스 배포판들을 보면 자유로운 경쟁이라기 보다는 사실 밥그릇 싸움으로 보입니다. 윈도우, 맥은 한글을 완벽 지원하는데 아직도 리눅스는 한글 하나 제대로 되지 않을까 하는 거죠. 수많은 한국 리눅서들이 있는데도 말이죠. 저도 반성합니다. 그리고  플랫폼에 관대해 지려면 집에 맥북프로, 서피스 프로, 리눅스 서버는 가지고 있어야 합니다. 그래야 마소, 애플, 오픈소스 진영 욕을 안하고 어떤 서비스가 좋은지에 집중을 하게 됩니다.  

3. 레드햇보다는 우분투 : 기억에 레드햇은 항상 비쌌습니다. 와우 리눅스, 레드헷 7.3 뒤엔 페도라 유저 였습니다.(그래서 아직도 rpm 좋고 sudo 쓰는 것을 싫어합니다. su - ) RHEL이나 자격증 비용, 서버 A/S 비용등을 보면 M$ 보다 더한 애들 같았어요(지금도 비싸지요) 오픈소스 진영에 있던 분이 마소 MVP 되어 주셨던 10년전 세미나의 대목이 기억 납니다. "너무 재미있지만... 청춘이 멍들었어요". 그도 그럴것이 M$ 욕하는 사람이라서 MS 제품 크레킹 버전 쓰는 것은 이해가 갔는데 다른 소프트웨어도 모두 크랙 버전을 쓰는지는 이해할 없었거든요. 중학생 때에도 10달을 모아 Borland Turbo C++ 3.0 당시 18만원 주고 샀었는데... K-dos 씨앗 같은 (소프트웨어 제공되는) 당연히 주고 사야 된다고 생각했었거든요. 자유가 공짜에 있다고 생각되는지는 사실 지금도 이해가 안되는 부분입니다. 초반에는 CD 주다가 지금은 다운로드 받으려면 기부 UI 거쳐야만하는 우분투도 무조건 공짜를 고집하는 개발자들의 산실이겠지요. 저도 반성합니다. 기부는 FSF 꾸준히 하고 배포판은 우분투를 쓴다는...(사실 GNU 그래요)

4. 서버는 리눅스 : 최근 512기가바이트 메모리의 단일 서버에 윈도우 서버 2012 깔았는데 메모리 인식이 안되더라구요.... 리눅스는 되는데. 그래도 맥처럼 획일화된 시스템의 OS 아니니 마소의 한계라고 생각이 되진 않지만 리눅스는 ... 인식되는거니 ㅠㅠ. 관리는 윈도우 서버가 편하긴 합니다만. 더군다나 오픈소스 진영의 툴들은 윈도우용이 항상 문제가 많았습니다.(PHP, Mysql, Node.js ...)

5. VMWARE 위력 : 사실 서버 돌릴 때도 VMWARE 깔아서 돌립니다. 서버 이전이 쉽기 때문입니다. 우분투도 사실 14.04 쓰다가 결국 VMWARE 넣어버렸습니다(그놈의 한글 때문에...) VMWARE 덕에 이곳을 찾을 자격이 것이죠.

6. 모든 OS 멈춘다. 왠만한 리눅스 배포판은 깔아 같습니다. 완벽하게 도는 배포판은 없었어요. 맥도 그래요. 멈춤 현상 많습니다. 윈도우도 말할 없고. 제가 실력이 있으면 uC/OS 기반의 운영체제를 하나 만들겠지만. 노태상 씨께(지금은 뭐하시는지 궁금하네요) 학창시절 세미나를 들으며 패키징할 커널 컴파일만 8000 하셨다는 이야기를 듣기 전에 방학중 패키지 하나 만들어 보려고 100 가량 커널 컴파일 해보고 전문가라고 생각했던 자신이 너무 초라해 보였습니다. 뒤에 개발자 길을 걸으며... "... 커널은 정말 쉬운게 아닌거구나"했죠. 한중일 SW포럼에서 운좋게 수상하여 리눅스 커널 TCP/IP 메인테이너와 수상할 기회가 있었는데. 지금 가정을 이룬 은행빚 개발자로 돌이켜보면 대학교 교수시니까 그럴수 있지 않았나 생각이 듭니다. FSF 모임은 대부분 하버드 대학교에서 열리고 오픈소스 진영을 보면 소수의 천재들( 집안에 돈이 많은) 만드는 같아요. 우분투 지원해주는 캐노니컬도 그렇고... 천재들도 커널이 너무 방대하니 나누어서 만드는 것이죠. 어줍잖은 지식으로 살펴보면 토발즈도 학창시절 교수꺼 배낀걸로 아네요.

7. 우분투가 통일할거라는 확신이 들었습니다. - 믓튼... 한동안 먹고 사느라 리눅스를 많이는 못했었는데요.(안드로이드랑 윈도우, 계열만 ㅠㅠ) 최근 여러 정세를 보면 우분투가 15 내로 OS 통일할 같아요. 우선 기업 철학이 인류애인 것과 학교와 업계간의 연계. 구글의 멋진 PLAY 등이죠.

8. 위험요소는? 있지요. 매직립이나 홀로렌즈를 보면 모바일 때문에 죽었던 3D 다시 바닥의 돈의 흐름을 만들 같다는 것입니다. 그래서 최근 3D 다시 공부하게 되었지요. DirectX OpenGL보다 빠릅니다. 무적의 GCC 인텔칩 위에서는 인텔 컴파일러보다 대부분 느린 것과 비슷한 것이지요.(그런데 카테고리는 빠르다는...) 맥의 메탈 역시 빠르게 하려고 하겠지요. 그러나 무조건 빠르다고 성공하지는 않습니다.( 부분은 내용이 많아 언젠가 다시 말해야 겠네요.) 사용자가 많아야 하는데 결국 3D 부분이 걸림돌이 되겠네요

9. 우분투는 1~8 별로 중요하지 않습니다. 다만 다른 배포판은 철학이 다르다고 생각합니다. 인류애를 상징하는 우분투라는 이름이 정말 중요하다고 생각합니다. 자유와 오픈소스도 이름안에 한정해서 이루어졌으면 합니다. 사실... 이렇게 나누면 GTK 페이지 번역하신 분이나 한글화 해주시는 많은 분들이 짜증나실지도 모르겠지만. 마소와 맥을 보내버리려면 우분투를 앞세우고 정부와 구글을 이용하는 전략을 구사해야 하지 않을까요.


    lazy var lblSensorBS : UILabel = {

        let ret: UILabel = UILabel()

        ret.font = UIFont.init(name: "NanumSquareOTFL", size: 17)

        ret.text = "평균센서혈당(CGM)"

        ret.lineBreakMode = .byClipping

        ret.textAlignment = .center

        ret.textColor =  colorLiteral(red: 0.6000000238, green: 0.6000000238, blue: 0.6000000238, alpha: 1)

        return ret

    }()


델리게이트 패턴은 쓸 놈에게 함수(메소드) 구현을 대신 시키는 것이다.

import UIKit


protocol buildStringDelegate {

    func buildS() -> String

}


class ViewController: UIViewController, buildStringDelegate {

    

    func buildS() -> String {

        return "passing via delegate"

    }


    override func viewDidLoad() {

        let so = someOne()

        so.d = self

        so.hardwork(param: "passing via parameter")

    }

}


class someOne {

    

    var d : buildStringDelegate?

    

    func hardwork(param: String) {

        print(param)

        print("teaching basics")

        print(d!.buildS())

    }

}

충분히 오래 쓴 것 같아 이제 비교를 할 수 있을 것 같다.


레티나 맥북은 맥북 프로인데 키보드를 가는 수고로움이 있었고 전체적 만족도는 상판에 불 들어오는 구버전 맥북 에어가 더 좋다.(최근 맥북에어가 업글 되면서 구버전이 되었지)


맥북 에어 살 때 뉴 맥북이 이미 나와 있었지만 말도 많고 탈이 많았던 구형 맥북 에어를 산 이유는 키보드 문제가 매우 컸었다.


키보드 문제가 지속적으로 제기 되었고 아니나 다를까 새로 산 맥북 프로도 키보드를 교체하게 되었다. 


해상도의 경우 아무래도 레티나가 나은데, 내가 난시가 있고 워낙 글을 빨리 보다보니 글 차이가 없을 줄 알았다.


그러나 핵심적인 것은 6시간 이상 보고 있을 때 나타난다. 구형 맥북에서 작업을 하고 6시간이 지나면 눈이 뻑뻑해서 잘 안 움직여지는 느낌이 들 정도다.


난 스탠드 쓴지는 오래 되어서 확실히 말할 수 있다. 이걸로는 우리 딸 코딩 교육 못 시킨다고 ㅠㅠ 


맥북에어, 맥북, 맥북 프로, 갖가지 패드들...(아이패드 미니, 아이패드 프로, 삼성 시리즈+)도 있으나 이젠 기준 자체가 IPS냐 아니냐로 구분된다.


아이가 눈이 나빠지고 나서 더욱 내 기준은 해상도만 보게 되는 것 같다.


글을 쓰는 지금도 구형 맥북으로 글을 쓴다. 그러나 난 이 노트북을 10년 이상 쓰게 될 것 같다. 맥북 에어 임에도 불구하고 i7에 512로 맞춰서.


엔지니어 입장에서는 말도 많고 탈도 많았지만 그래도 혁신의 아이콘인 스티브 잡스의 유작이라. 그런 것도 있다.


움푹 패인 키보드 에어리어의 곡선마다 상판 애플 로고에 불을 넣기가 쉽진 않았을텐데 그것에 대한 이유에 대한 생각마다


내구성은 낮지만 포스터치가 아닌 정말로 눌러지는 이 버튼의 누르는 느낌마다 그리고 이 정도 크기로 한 것에는 이유가 있는데 그 이유에 내구성과 누르는 압력이 균일하지 못한 것 뿐만은 아니고 사용자도 충분히 생각했을거라는 그런 잡스의 이미지를 떠올리며 오래도록 쓸 것이다. 사실, 유투브 볼 때는 문자 볼 때만큼 IPS가 의미가 있지 않은 이유도 있다ㅋㅋ


그나저나 맥북에어로 한번 오고 나니 앞으로 구입하는 제품도 에어로 가고 싶은 마음이 든다. 그래도 최상급 맥북 프로는 항상 가지고 싶지 ^^



신경 쓸 곳이 많아, 다음과 같이 기록이 남겨둔다. 

쿠팡 이름 : 베르사체 19V69 이탈리아 밀라노 벨라 이불세트


쿠팡에 있는 글을 지우라는 목적으로 전화 옴. 대표라고 함. 쿠팡 골드 박스에 올려진 히스토리를 들었을 때 확실히 대표님이 맞다고 생각.

방사능에 대한 지식에 대해서 의구심 및 시험기기에 대한 신뢰도 확보 안된 상태에서 아니면 말고 하는 식으로 글을 올렸다고 말함. (내가 빡친 부분)

그리고 방사능 측정기기를 안사고 측정 안해보고 나한테 연락했음(더 빡친 부분) 댓글에 남겨둔 티스토리에 접속만 하고 약간만 훑어 봤어도 이 정도 수준으로 간보진 않았을거라 생각.


측정 사진까지 올렸고, 전화 받기 전부터 이미 블로그에는 괜찮다고 올렸으나 찝찝해서 반품한다고 했고.

일본으로 수출하는 국내 세슘 측정기 살 때부터 방사능에 관심을 가지고 이번 라돈 측정기도 더 싼 제품이 있지만 적당한 것을 골랐다고 함.


중간은 통화가 길어져서 ... 결론만 요약하면 통화 녹음 안할테니 사과 하시라고 했는데 응대 방법에 대해서는 사과한다고 함. 아래와 같은 문자(몇개 생략)를 보냈고 답신도 받음.


쿠팡 글은 안 지워져서 사진 삭제하고 내용 없앤 후 남겨두었습니다. 아마 반품되면 자동 지워질 것 같네요. 인터넷 글은 최종 이상없다고 올렸으나 문제 없음 발견시 재구매까지 해서 올리겠습니다. 인기없는 블로그라 판매에 문제 있을 것 같지는 않구요. 유투브에서 삼성 리스트로 찾으시면 제가 제보한 영상이 몇 개 있습니다. ....(요약) 진실을 탐구합니다. 전화 주신 늬앙스가 개인이라 아니면 말고라고 하셨는데 정말 그런 것 아니구요. 미처 캣치하지 못한 부분이 있으시다면 이번 기회에 상품 설명에 넣으시면 전화 위복이 될거라 생각합니다. 쿠팡도 주력 메뉴에 상품을 넣었던터라 비싼 장비는 오히려 쿠팡측에 도움을 요청하는 것도 좋아보입니다. 제 메셎는 쿠팡측에 전달을 하셔도 되겠습니다. 하준호 드림


해당 업체와 라돈 측정기 회사랑도 통화했다고 하는데. 내가 이 기록을 남기는 중요한 이유는.


그냥 수입이 되는게 아니라 식약처 검사를 통과했다고 했음. 그런데 라돈에 대한 항목은 없다고 함. 자기 아이도 이 이불을 덮히고 있는데 만약 테스트 해야 했다면 당연히 했을 것이라고 함.


처음 전화 왔을 때 찍어 누르려는 대표 특유의 대화법으로 심히 불쾌했으나 작은 기업이 할 수 있는 모든 것을 하고 쿨하게 인정할 것은 인정하는 것으로 보아 회사는 많이 커도 괜찮음. 이미 세탁을 했었던 제품이고 내가 전문가는 아니니 회사 인력으로 충분히 테스트를 한 후라면 재구매 의사가 있으니 제가 돌려 보낸 제품을 다시 보내줬으면 한다고 하고 반품을 했는데. 


연락 끝나고 얼마 지나지 않아 택배 기사 수거와 카드 취소 문자가 함께 날아옴.


믓튼, 위의 문자대로 재구매 의사가 있고 재구매하면 다시 포스팅 할거임... 그 정도로 질이 좋음. (가성비가 아니라 절대적 질) 혼수로 받은 이불만큼.


그리고 어제 밤에 내가 반대 입장이라면 어떨까라고 한번 고민해 봄. 아무리 생각해도 나도 방사능 측정기로 한번 측정해보고 보냈을 것 같고. 측정기가 싼 제품이라고 뭐라고 하진 않았을 것 같음. 그리고 측정 단위로 뭐라고 하진 않았을 것 같다. 그게 특정 측정 단위에서 문제가 있느냐 없느냐. 장기던 단기던 내가 올린 사진에 순간값은 작아도 해도 평균 자체가 높았는데 말이다. 어릴적부터 아버지 무역한다고 서울/부산을 어린 나이에도 왔다갔다 할 정도로 해당 업계나 사람 성향을 모르는 것도 아니지만. 준비가 덜 된 상태에서 전화한 것은 확실하다. 그만큼 이번 쿠팡에서 얻어지는 수익이 많아서 기분이 매우 업되어 있었을테고 안하무인으로 보였겠지. 나도 비슷한 기분을 느꼈으니.


믓튼 전화번호 교환도 했고 카톡에 서로 프사도 뜨고. 내 블로그도 오픈된 상태니 내가 댓글을 지운만큼 어떤 조취를 취하는지 보면 되겠다. 쿠팡 소개서는 바뀐 것 같은데 라돈 관련된 글이 아니라 다른 시험 성적서로 인증 받았고 분쟁은 해당 법을 따른다고 되어 있네. 이 시험 성적서가 말한 것처럼 식약처 꺼인지도 비교 해봐야 하겠는데 FiTi는 재단이네. 재단이면 라돈 관련해서 책임 질 것 같지도 않은데 ... 


우선, 오늘 점심먹고 식약처에 전화해서 식약처에 전화걸면 제품이나 기업명으로 검사 인증 조회가 되는지, 해당 제품을 검사 받았는지부터 물어봐야겠다.


TestMode 를 Info.plist에 생성하고 Boolean 형으로 지정한다.


    var isTestmode_network : Bool

    var isTestmode_RESTAPI : Bool

전역 싱글톤 클래스의 init에 넣어 초기화 해서 쓰면 됨

static let s = GS()


   private init() {

        var nsDictionary: NSDictionary?

        let path = Bundle.main.path(forResource: "Info", ofType: "plist")

        nsDictionary = NSDictionary(contentsOfFile: path ?? "")

        let value: AnyObject = nsDictionary?.object(forKey: "TestMode") as AnyObject

        isTestmode_network = value as! Bool

        isTestmode_RESTAPI = value as! Bool


항상 GlobalSettings 라 명명했는데 GS가 나름 좋은 일을 많이 했더라. 애국 기업이라 이제 줄여서 씀(귀찮아서 그런것도 사실 좀 있음)

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {

        if (gestureRecognizer is UIPanGestureRecognizer || gestureRecognizer is UIRotationGestureRecognizer) {

            return true

        } else {

            return false

        }

    }





: UIScrollView, UIGestureRecognizerDelegate

let pan = UIPanGestureRecognizer(target: self, action: #selector(handlePanGesture))

        self.addGestureRecognizer(pan)


 guard gestureRecognizer.view != nil else {return}

        

        let currentPoint = gestureRecognizer.location(in: gestureRecognizer.view!)



if gestureRecognizer.state == UIGestureRecognizerState.began {

            startingPoint = currentPoint


   }

        

        if gestureRecognizer.state == UIGestureRecognizerState.ended {

            endedPoint = currentPoint


     if endedPoint.y < startingPoint.y {

                isUPscrolling = true

            } else { isUPscrolling = false }

            Scrolling()

        }



    fileprivate func Scrolling() {

        

        let distance = CGPoint(x: 0, y: fabs(endedPoint.y - startingPoint.y)).y

        

        if isUPscrolling {

            if distance > 30 {

                self.setContentOffset(CGPoint(x:0, y:444), animated: true

            } else {

                self.setContentOffset(CGPoint(x: 0, y: self.contentOffset.y + distance), animated: true)

            }

        } else {

            if (self.contentOffset.y - distance) < 0 {

                self.setContentOffset(CGPoint(x: 0, y: 0), animated: true)

            } else {

                self.setContentOffset(CGPoint(x: 0, y: self.contentOffset.y - distance), animated: true)

            }

        }

    }


                let screenX : CGFloat = (jhDatas[woman]!.d[man]).scrx * GS.s.zoomLevel

                let screenXe : CGFloat = (jhDatas[woman]!.d[man]).scrxe * GS.s.zoomLevel

여기에 if 문을 둘러버리면 let을 var 면경해야 하고... 귀찮아 진다.


이럴 때 삼항 연산자를 immutable만 아니면 더 좋으련만.                


                let screenX : CGFloat = (jhDatas[woman]!.d[man]).scrx * (GS.s.selectedTab == 0 ? GS.s.zoomLevel1 : GS.s.zoomLevel2)


(GS.s.selectedTab == 0 ? GS.s.zoomLevel1 : GS.s.zoomLevel2) = zoomScale



'!A. Basics' 카테고리의 다른 글

여러 스크롤 뷰가 겹쳐 있을 때 제스쳐 뒤로 넘기기  (0) 2019.01.14
스와이프로 스크롤 이동  (0) 2019.01.14
탭바 컨트롤러 인덱스 알아내기  (0) 2019.01.14
collections removeall()  (0) 2019.01.14
테마적용?  (0) 2019.01.12



    func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {

        GS.s.selectedTab = tabBarController.selectedIndex

        switch GS.s.selectedTab {

        case 0:


'!A. Basics' 카테고리의 다른 글

스와이프로 스크롤 이동  (0) 2019.01.14
삼항 연산자는 언제쓸까?  (1) 2019.01.14
collections removeall()  (0) 2019.01.14
테마적용?  (0) 2019.01.12
changing detail view in MDview  (0) 2019.01.12


arrays, dictionaries, sets 같은 컬렉션은  removeall 할 때 다 지워진다. 정말루... 지우고 새로 생성해 줘야 한다.




                    jhDataCenter.nonNetworkData.removeAll()

하고 데이터 넣지맛!

                                _ = json["data"]["glucose"]["cgm"].arrayValue.map({



.

.

.


jhDataCenter.mDatas.removeAll(keepingCapacity: true)

얘도 마찬가지... 걍 지우고 다시 만들어 주는 clean 함수를 만드는게 낫다.



    public static func clean() {

        

        jhDataCenter.mDatas.removeAll()

        

        jhDataCenter.mDatas = [0:hjh(d: Array<sss>()),    //CGM

            1:hjh(d: Array<sssss>()),  //bolus

            2:hjh(d: Array<sssss>()),  //Basal

            3:hjh(d: Array<sss>())     //BG

        ]

    }



'!A. Basics' 카테고리의 다른 글

삼항 연산자는 언제쓸까?  (1) 2019.01.14
탭바 컨트롤러 인덱스 알아내기  (0) 2019.01.14
테마적용?  (0) 2019.01.12
changing detail view in MDview  (0) 2019.01.12
헥사 코드로 컬러 설정하기  (0) 2019.01.12

+ Recent posts