[하스스톤의 폭발 이펙트 인데... ARM 노트북은 IT Field에서 세상을 깨버리는 그런 혁신이었다.]

 

gcc --version                                                                     

Apple clang version 15.0.0 (clang-1500.3.9.4)

Target: arm64-apple-darwin23.4.0

Thread model: posix

InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

 

뭐, 말은 되지만. 프로세스 자체가 워낙 지원 안되는게 많으니 S/W 엔지니어 관점에서는 보드를 만든 회사가 추천하는 컴파일러는 쓰는게...

'프로그래머 > ARM, GCC, Linux Kernel, What I love' 카테고리의 다른 글

ARM Firmware 003  (0) 2019.02.09
ARM Firmware 002  (0) 2019.02.09
ARM Firmware 001  (0) 2019.02.09
우분투에서 ARM 용 커널 빌드  (0) 2019.01.26
ARM GCC 우분투에 설치~  (0) 2019.01.11


/// A type that can be converted to and from an associated raw value.

///

/// With a `RawRepresentable` type, you can switch back and forth between a

/// custom type and an associated `RawValue` type without losing the value of

/// the original `RawRepresentable` type. Using the raw value of a conforming

/// type streamlines interoperation with Objective-C and legacy APIs and

/// simplifies conformance to other protocols, such as `Equatable`,

/// `Comparable`, and `Hashable`.

///

/// The `RawRepresentable` protocol is seen mainly in two categories of types:

/// enumerations with raw value types and option sets.

///

/// Enumerations with Raw Values

/// ============================

///

/// For any enumeration with a string, integer, or floating-point raw type, the

/// Swift compiler automatically adds `RawRepresentable` conformance. When

/// defining your own custom enumeration, you give it a raw type by specifying

/// the raw type as the first item in the enumeration's type inheritance list.

/// You can also use literals to specify values for one or more cases.

///

/// For example, the `Counter` enumeration defined here has an `Int` raw value

/// type and gives the first case a raw value of `1`:

///

///     enum Counter: Int {

///         case one = 1, two, three, four, five

///     }

///

/// You can create a `Counter` instance from an integer value between 1 and 5

/// by using the `init?(rawValue:)` initializer declared in the

/// `RawRepresentable` protocol. This initializer is failable because although

/// every case of the `Counter` type has a corresponding `Int` value, there

/// are many `Int` values that *don't* correspond to a case of `Counter`.

///

///     for i in 3...6 {

///         print(Counter(rawValue: i))

///     }

///     // Prints "Optional(Counter.three)"

///     // Prints "Optional(Counter.four)"

///     // Prints "Optional(Counter.five)"

///     // Prints "nil"

///

/// Option Sets

/// ===========

///

/// Option sets all conform to `RawRepresentable` by inheritance using the

/// `OptionSet` protocol. Whether using an option set or creating your own,

/// you use the raw value of an option set instance to store the instance's

/// bitfield. The raw value must therefore be of a type that conforms to the

/// `FixedWidthInteger` protocol, such as `UInt8` or `Int`. For example, the

/// `Direction` type defines an option set for the four directions you can

/// move in a game.

///

///     struct Directions: OptionSet {

///         let rawValue: UInt8

///

///         static let up    = Directions(rawValue: 1 << 0)

///         static let down  = Directions(rawValue: 1 << 1)

///         static let left  = Directions(rawValue: 1 << 2)

///         static let right = Directions(rawValue: 1 << 3)

///     }

///

/// Unlike enumerations, option sets provide a nonfailable `init(rawValue:)`

/// initializer to convert from a raw value, because option sets don't have an

/// enumerated list of all possible cases. Option set values have

/// a one-to-one correspondence with their associated raw values.

///

/// In the case of the `Directions` option set, an instance can contain zero,

/// one, or more of the four defined directions. This example declares a

/// constant with three currently allowed moves. The raw value of the

/// `allowedMoves` instance is the result of the bitwise OR of its three

/// members' raw values:

///

///     let allowedMoves: Directions = [.up, .down, .left]

///     print(allowedMoves.rawValue)

///     // Prints "7"

///

/// Option sets use bitwise operations on their associated raw values to

/// implement their mathematical set operations. For example, the `contains()`

/// method on `allowedMoves` performs a bitwise AND operation to check whether

/// the option set contains an element.

///

///     print(allowedMoves.contains(.right))

///     // Prints "false"

///     print(allowedMoves.rawValue & Directions.right.rawValue)

///     // Prints "0"

public protocol RawRepresentable {


    /// The raw type that can be used to represent all values of the conforming

    /// type.

    ///

    /// Every distinct value of the conforming type has a corresponding unique

    /// value of the `RawValue` type, but there may be values of the `RawValue`

    /// type that don't have a corresponding value of the conforming type.

    associatedtype RawValue


    /// Creates a new instance with the specified raw value.

    ///

    /// If there is no value of the type that corresponds with the specified raw

    /// value, this initializer returns `nil`. For example:

    ///

    ///     enum PaperSize: String {

    ///         case A4, A5, Letter, Legal

    ///     }

    ///

    ///     print(PaperSize(rawValue: "Legal"))

    ///     // Prints "Optional("PaperSize.Legal")"

    ///

    ///     print(PaperSize(rawValue: "Tabloid"))

    ///     // Prints "nil"

    ///

    /// - Parameter rawValue: The raw value to use for the new instance.

    public init?(rawValue: Self.RawValue)


    /// The corresponding value of the raw type.

    ///

    /// A new instance initialized with `rawValue` will be equivalent to this

    /// instance. For example:

    ///

    ///     enum PaperSize: String {

    ///         case A4, A5, Letter, Legal

    ///     }

    ///

    ///     let selectedSize = PaperSize.Letter

    ///     print(selectedSize.rawValue)

    ///     // Prints "Letter"

    ///

    ///     print(selectedSize == PaperSize(rawValue: selectedSize.rawValue)!)

    ///     // Prints "true"

    public var rawValue: Self.RawValue { get }

}


extension RawRepresentable where Self.RawValue == Bool {


    /// Encodes this value into the given encoder, when the type's `RawValue`

    /// is `Bool`.

    ///

    /// This function throws an error if any values are invalid for the given

    /// encoder's format.

    ///

    /// - Parameter encoder: The encoder to write data to.

    public func encode(to encoder: Encoderthrows

}


extension RawRepresentable where Self.RawValue == Bool {


    /// Creates a new instance by decoding from the given decoder, when the

    /// type's `RawValue` is `Bool`.

    ///

    /// This initializer throws an error if reading from the decoder fails, or

    /// if the data read is corrupted or otherwise invalid.

    ///

    /// - Parameter decoder: The decoder to read data from.

    public convenience init(from decoder: Decoderthrows

}


extension RawRepresentable where Self.RawValue == String {


    /// Encodes this value into the given encoder, when the type's `RawValue`

    /// is `String`.

    ///

    /// This function throws an error if any values are invalid for the given

    /// encoder's format.

    ///

    /// - Parameter encoder: The encoder to write data to.

    public func encode(to encoder: Encoderthrows

}


extension RawRepresentable where Self.RawValue == String {


    /// Creates a new instance by decoding from the given decoder, when the

    /// type's `RawValue` is `String`.

    ///

    /// This initializer throws an error if reading from the decoder fails, or

    /// if the data read is corrupted or otherwise invalid.

    ///

    /// - Parameter decoder: The decoder to read data from.

    public convenience init(from decoder: Decoderthrows

}


extension RawRepresentable where Self.RawValue == Double {


    /// Encodes this value into the given encoder, when the type's `RawValue`

    /// is `Double`.

    ///

    /// This function throws an error if any values are invalid for the given

    /// encoder's format.

    ///

    /// - Parameter encoder: The encoder to write data to.

    public func encode(to encoder: Encoderthrows

}


extension RawRepresentable where Self.RawValue == Double {


    /// Creates a new instance by decoding from the given decoder, when the

    /// type's `RawValue` is `Double`.

    ///

    /// This initializer throws an error if reading from the decoder fails, or

    /// if the data read is corrupted or otherwise invalid.

    ///

    /// - Parameter decoder: The decoder to read data from.

    public convenience init(from decoder: Decoderthrows

}


extension RawRepresentable where Self.RawValue == Float {


    /// Encodes this value into the given encoder, when the type's `RawValue`

    /// is `Float`.

    ///

    /// This function throws an error if any values are invalid for the given

    /// encoder's format.

    ///

    /// - Parameter encoder: The encoder to write data to.

    public func encode(to encoder: Encoderthrows

}


extension RawRepresentable where Self.RawValue == Float {


    /// Creates a new instance by decoding from the given decoder, when the

    /// type's `RawValue` is `Float`.

    ///

    /// This initializer throws an error if reading from the decoder fails, or

    /// if the data read is corrupted or otherwise invalid.

    ///

    /// - Parameter decoder: The decoder to read data from.

    public convenience init(from decoder: Decoderthrows

}


extension RawRepresentable where Self.RawValue == Int {


    /// Encodes this value into the given encoder, when the type's `RawValue`

    /// is `Int`.

    ///

    /// This function throws an error if any values are invalid for the given

    /// encoder's format.

    ///

    /// - Parameter encoder: The encoder to write data to.

    public func encode(to encoder: Encoderthrows

}


extension RawRepresentable where Self.RawValue == Int {


    /// Creates a new instance by decoding from the given decoder, when the

    /// type's `RawValue` is `Int`.

    ///

    /// This initializer throws an error if reading from the decoder fails, or

    /// if the data read is corrupted or otherwise invalid.

    ///

    /// - Parameter decoder: The decoder to read data from.

    public convenience init(from decoder: Decoderthrows

}


extension RawRepresentable where Self.RawValue == Int8 {


    /// Encodes this value into the given encoder, when the type's `RawValue`

    /// is `Int8`.

    ///

    /// This function throws an error if any values are invalid for the given

    /// encoder's format.

    ///

    /// - Parameter encoder: The encoder to write data to.

    public func encode(to encoder: Encoderthrows

}


extension RawRepresentable where Self.RawValue == Int8 {


    /// Creates a new instance by decoding from the given decoder, when the

    /// type's `RawValue` is `Int8`.

    ///

    /// This initializer throws an error if reading from the decoder fails, or

    /// if the data read is corrupted or otherwise invalid.

    ///

    /// - Parameter decoder: The decoder to read data from.

    public convenience init(from decoder: Decoderthrows

}


extension RawRepresentable where Self.RawValue == Int16 {


    /// Encodes this value into the given encoder, when the type's `RawValue`

    /// is `Int16`.

    ///

    /// This function throws an error if any values are invalid for the given

    /// encoder's format.

    ///

    /// - Parameter encoder: The encoder to write data to.

    public func encode(to encoder: Encoderthrows

}


extension RawRepresentable where Self.RawValue == Int16 {


    /// Creates a new instance by decoding from the given decoder, when the

    /// type's `RawValue` is `Int16`.

    ///

    /// This initializer throws an error if reading from the decoder fails, or

    /// if the data read is corrupted or otherwise invalid.

    ///

    /// - Parameter decoder: The decoder to read data from.

    public convenience init(from decoder: Decoderthrows

}


extension RawRepresentable where Self.RawValue == Int32 {


    /// Encodes this value into the given encoder, when the type's `RawValue`

    /// is `Int32`.

    ///

    /// This function throws an error if any values are invalid for the given

    /// encoder's format.

    ///

    /// - Parameter encoder: The encoder to write data to.

    public func encode(to encoder: Encoderthrows

}


extension RawRepresentable where Self.RawValue == Int32 {


    /// Creates a new instance by decoding from the given decoder, when the

    /// type's `RawValue` is `Int32`.

    ///

    /// This initializer throws an error if reading from the decoder fails, or

    /// if the data read is corrupted or otherwise invalid.

    ///

    /// - Parameter decoder: The decoder to read data from.

    public convenience init(from decoder: Decoderthrows

}


extension RawRepresentable where Self.RawValue == Int64 {


    /// Encodes this value into the given encoder, when the type's `RawValue`

    /// is `Int64`.

    ///

    /// This function throws an error if any values are invalid for the given

    /// encoder's format.

    ///

    /// - Parameter encoder: The encoder to write data to.

    public func encode(to encoder: Encoderthrows

}


extension RawRepresentable where Self.RawValue == Int64 {


    /// Creates a new instance by decoding from the given decoder, when the

    /// type's `RawValue` is `Int64`.

    ///

    /// This initializer throws an error if reading from the decoder fails, or

    /// if the data read is corrupted or otherwise invalid.

    ///

    /// - Parameter decoder: The decoder to read data from.

    public convenience init(from decoder: Decoderthrows

}


extension RawRepresentable where Self.RawValue == UInt {


    /// Encodes this value into the given encoder, when the type's `RawValue`

    /// is `UInt`.

    ///

    /// This function throws an error if any values are invalid for the given

    /// encoder's format.

    ///

    /// - Parameter encoder: The encoder to write data to.

    public func encode(to encoder: Encoderthrows

}


extension RawRepresentable where Self.RawValue == UInt {


    /// Creates a new instance by decoding from the given decoder, when the

    /// type's `RawValue` is `UInt`.

    ///

    /// This initializer throws an error if reading from the decoder fails, or

    /// if the data read is corrupted or otherwise invalid.

    ///

    /// - Parameter decoder: The decoder to read data from.

    public convenience init(from decoder: Decoderthrows

}


extension RawRepresentable where Self.RawValue == UInt8 {


    /// Encodes this value into the given encoder, when the type's `RawValue`

    /// is `UInt8`.

    ///

    /// This function throws an error if any values are invalid for the given

    /// encoder's format.

    ///

    /// - Parameter encoder: The encoder to write data to.

    public func encode(to encoder: Encoderthrows

}


extension RawRepresentable where Self.RawValue == UInt8 {


    /// Creates a new instance by decoding from the given decoder, when the

    /// type's `RawValue` is `UInt8`.

    ///

    /// This initializer throws an error if reading from the decoder fails, or

    /// if the data read is corrupted or otherwise invalid.

    ///

    /// - Parameter decoder: The decoder to read data from.

    public convenience init(from decoder: Decoderthrows

}


extension RawRepresentable where Self.RawValue == UInt16 {


    /// Encodes this value into the given encoder, when the type's `RawValue`

    /// is `UInt16`.

    ///

    /// This function throws an error if any values are invalid for the given

    /// encoder's format.

    ///

    /// - Parameter encoder: The encoder to write data to.

    public func encode(to encoder: Encoderthrows

}


extension RawRepresentable where Self.RawValue == UInt16 {


    /// Creates a new instance by decoding from the given decoder, when the

    /// type's `RawValue` is `UInt16`.

    ///

    /// This initializer throws an error if reading from the decoder fails, or

    /// if the data read is corrupted or otherwise invalid.

    ///

    /// - Parameter decoder: The decoder to read data from.

    public convenience init(from decoder: Decoderthrows

}


extension RawRepresentable where Self.RawValue == UInt32 {


    /// Encodes this value into the given encoder, when the type's `RawValue`

    /// is `UInt32`.

    ///

    /// This function throws an error if any values are invalid for the given

    /// encoder's format.

    ///

    /// - Parameter encoder: The encoder to write data to.

    public func encode(to encoder: Encoderthrows

}


extension RawRepresentable where Self.RawValue == UInt32 {


    /// Creates a new instance by decoding from the given decoder, when the

    /// type's `RawValue` is `UInt32`.

    ///

    /// This initializer throws an error if reading from the decoder fails, or

    /// if the data read is corrupted or otherwise invalid.

    ///

    /// - Parameter decoder: The decoder to read data from.

    public convenience init(from decoder: Decoderthrows

}


extension RawRepresentable where Self.RawValue == UInt64 {


    /// Encodes this value into the given encoder, when the type's `RawValue`

    /// is `UInt64`.

    ///

    /// This function throws an error if any values are invalid for the given

    /// encoder's format.

    ///

    /// - Parameter encoder: The encoder to write data to.

    public func encode(to encoder: Encoderthrows

}


extension RawRepresentable where Self.RawValue == UInt64 {


    /// Creates a new instance by decoding from the given decoder, when the

    /// type's `RawValue` is `UInt64`.

    ///

    /// This initializer throws an error if reading from the decoder fails, or

    /// if the data read is corrupted or otherwise invalid.

    ///

    /// - Parameter decoder: The decoder to read data from.

    public convenience init(from decoder: Decoderthrows

}


/// Returns a Boolean value indicating whether the two arguments are equal.

///

/// - Parameters:

///   - lhs: A raw-representable instance.

///   - rhs: A second raw-representable instance.

public func == <T>(lhs: T, rhs: T) -> Bool where T : RawRepresentableT.RawValue : Equatable


/// Returns a Boolean value indicating whether the two arguments are not equal.

///

/// - Parameters:

///   - lhs: A raw-representable instance.

///   - rhs: A second raw-representable instance.

public func != <T>(lhs: T, rhs: T) -> Bool where T : RawRepresentableT.RawValue : Equatable


/// Returns a Boolean value indicating whether the two arguments are not equal.

///

/// - Parameters:

///   - lhs: A raw-representable instance.

///   - rhs: A second raw-representable instance.

public func != <T>(lhs: T, rhs: T) -> Bool where T : EquatableT : RawRepresentableT.RawValue : Equatable


/// A type that provides a collection of all of its values.

///

/// Types that conform to the `CaseIterable` protocol are typically

/// enumerations without associated values. When using a `CaseIterable` type,

/// you can access a collection of all of the type's cases by using the type's

/// `allCases` property.

///

/// For example, the `CompassDirection` enumeration declared in this example

/// conforms to `CaseIterable`. You access the number of cases and the cases

/// themselves through `CompassDirection.allCases`.

///

///     enum CompassDirection: CaseIterable {

///         case north, south, east, west

///     }

///

///     print("There are \(CompassDirection.allCases.count) directions.")

///     // Prints "There are 4 directions."

///     let caseList = CompassDirection.allCases

///                                    .map({ "\($0)" })

///                                    .joined(separator: ", ")

///     // caseList == "north, south, east, west"

///

/// Conforming to the CaseIterable Protocol

/// =======================================

///

/// The compiler can automatically provide an implementation of the

/// `CaseIterable` requirements for any enumeration without associated values

/// or `@available` attributes on its cases. The synthesized `allCases`

/// collection provides the cases in order of their declaration.

///

/// You can take advantage of this compiler support when defining your own

/// custom enumeration by declaring conformance to `CaseIterable` in the

/// enumeration's original declaration. The `CompassDirection` example above

/// demonstrates this automatic implementation.

public protocol CaseIterable {


    /// A type that can represent a collection of all values of this type.

    associatedtype AllCases : Collection where Self.AllCases.Element == Self


    /// A collection of all values of this type.

    public static var allCases: Self.AllCases { get }

}


/// A type that can be initialized using the nil literal, `nil`.

///

/// `nil` has a specific meaning in Swift---the absence of a value. Only the

/// `Optional` type conforms to `ExpressibleByNilLiteral`.

/// `ExpressibleByNilLiteral` conformance for types that use `nil` for other

/// purposes is discouraged.

public protocol ExpressibleByNilLiteral {


    /// Creates an instance initialized with `nil`.

    public init(nilLiteral: ())

}


/// A type that can be initialized with an integer literal.

///

/// The standard library integer and floating-point types, such as `Int` and

/// `Double`, conform to the `ExpressibleByIntegerLiteral` protocol. You can

/// initialize a variable or constant of any of these types by assigning an

/// integer literal.

///

///     // Type inferred as 'Int'

///     let cookieCount = 12

///

///     // An array of 'Int'

///     let chipsPerCookie = [21, 22, 25, 23, 24, 19]

///

///     // A floating-point value initialized using an integer literal

///     let redPercentage: Double = 1

///     // redPercentage == 1.0

///

/// Conforming to ExpressibleByIntegerLiteral

/// =========================================

///

/// To add `ExpressibleByIntegerLiteral` conformance to your custom type,

/// implement the required initializer.

public protocol ExpressibleByIntegerLiteral {


    /// A type that represents an integer literal.

    ///

    /// The standard library integer and floating-point types are all valid types

    /// for `IntegerLiteralType`.

    associatedtype IntegerLiteralType : _ExpressibleByBuiltinIntegerLiteral


    /// Creates an instance initialized to the specified integer value.

    ///

    /// Do not call this initializer directly. Instead, initialize a variable or

    /// constant using an integer literal. For example:

    ///

    ///     let x = 23

    ///

    /// In this example, the assignment to the `x` constant calls this integer

    /// literal initializer behind the scenes.

    ///

    /// - Parameter value: The value to create.

    public init(integerLiteral value: Self.IntegerLiteralType)

}


extension ExpressibleByIntegerLiteral {


    public convenience init(integerLiteral value: Self)

}


/// A type that can be initialized with a floating-point literal.

///

/// The standard library floating-point types---`Float`, `Double`, and

/// `Float80` where available---all conform to the `ExpressibleByFloatLiteral`

/// protocol. You can initialize a variable or constant of any of these types

/// by assigning a floating-point literal.

///

///     // Type inferred as 'Double'

///     let threshold = 6.0

///

///     // An array of 'Double'

///     let measurements = [2.2, 4.1, 3.65, 4.2, 9.1]

///

/// Conforming to ExpressibleByFloatLiteral

/// =======================================

///

/// To add `ExpressibleByFloatLiteral` conformance to your custom type,

/// implement the required initializer.

public protocol ExpressibleByFloatLiteral {


    /// A type that represents a floating-point literal.

    ///

    /// Valid types for `FloatLiteralType` are `Float`, `Double`, and `Float80`

    /// where available.

    associatedtype FloatLiteralType : _ExpressibleByBuiltinFloatLiteral


    /// Creates an instance initialized to the specified floating-point value.

    ///

    /// Do not call this initializer directly. Instead, initialize a variable or

    /// constant using a floating-point literal. For example:

    ///

    ///     let x = 21.5

    ///

    /// In this example, the assignment to the `x` constant calls this

    /// floating-point literal initializer behind the scenes.

    ///

    /// - Parameter value: The value to create.

    public init(floatLiteral value: Self.FloatLiteralType)

}


/// A type that can be initialized with the Boolean literals `true` and

/// `false`.

///

/// Only three types provided by Swift---`Bool`, `DarwinBoolean`, and

/// `ObjCBool`---are treated as Boolean values. Expanding this set to include

/// types that represent more than simple Boolean values is discouraged.

///

/// To add `ExpressibleByBooleanLiteral` conformance to your custom type,

/// implement the `init(booleanLiteral:)` initializer that creates an instance

/// of your type with the given Boolean value.

public protocol ExpressibleByBooleanLiteral {


    /// A type that represents a Boolean literal, such as `Bool`.

    associatedtype BooleanLiteralType : _ExpressibleByBuiltinBooleanLiteral


    /// Creates an instance initialized to the given Boolean value.

    ///

    /// Do not call this initializer directly. Instead, initialize a variable or

    /// constant using one of the Boolean literals `true` and `false`. For

    /// example:

    ///

    ///     let twasBrillig = true

    ///

    /// In this example, the assignment to the `twasBrillig` constant calls this

    /// Boolean literal initializer behind the scenes.

    ///

    /// - Parameter value: The value of the new instance.

    public init(booleanLiteral value: Self.BooleanLiteralType)

}


/// A type that can be initialized with a string literal containing a single

/// Unicode scalar value.

///

/// The `String`, `StaticString`, `Character`, and `Unicode.Scalar` types all

/// conform to the `ExpressibleByUnicodeScalarLiteral` protocol. You can

/// initialize a variable of any of these types using a string literal that

/// holds a single Unicode scalar.

///

///     let ñ: Unicode.Scalar = "ñ"

///     print(ñ)

///     // Prints "ñ"

///

/// Conforming to ExpressibleByUnicodeScalarLiteral

/// ===============================================

///

/// To add `ExpressibleByUnicodeScalarLiteral` conformance to your custom type,

/// implement the required initializer.

public protocol ExpressibleByUnicodeScalarLiteral {


    /// A type that represents a Unicode scalar literal.

    ///

    /// Valid types for `UnicodeScalarLiteralType` are `Unicode.Scalar`,

    /// `Character`, `String`, and `StaticString`.

    associatedtype UnicodeScalarLiteralType : _ExpressibleByBuiltinUnicodeScalarLiteral


    /// Creates an instance initialized to the given value.

    ///

    /// - Parameter value: The value of the new instance.

    public init(unicodeScalarLiteral value: Self.UnicodeScalarLiteralType)

}


/// A type that can be initialized with a string literal containing a single

/// extended grapheme cluster.

///

/// An *extended grapheme cluster* is a group of one or more Unicode scalar

/// values that approximates a single user-perceived character.  Many

/// individual characters, such as "é", "김", and "🇮🇳", can be made up of

/// multiple Unicode scalar values. These code points are combined by

/// Unicode's boundary algorithms into extended grapheme clusters.

///

/// The `String`, `StaticString`, and `Character` types conform to the

/// `ExpressibleByExtendedGraphemeClusterLiteral` protocol. You can initialize

/// a variable or constant of any of these types using a string literal that

/// holds a single character.

///

///     let snowflake: Character = "❄︎"

///     print(snowflake)

///     // Prints "❄︎"

///

/// Conforming to ExpressibleByExtendedGraphemeClusterLiteral

/// =========================================================

///

/// To add `ExpressibleByExtendedGraphemeClusterLiteral` conformance to your

/// custom type, implement the required initializer.

public protocol ExpressibleByExtendedGraphemeClusterLiteral : ExpressibleByUnicodeScalarLiteral {


    /// A type that represents an extended grapheme cluster literal.

    ///

    /// Valid types for `ExtendedGraphemeClusterLiteralType` are `Character`,

    /// `String`, and `StaticString`.

    associatedtype ExtendedGraphemeClusterLiteralType : _ExpressibleByBuiltinExtendedGraphemeClusterLiteral


    /// Creates an instance initialized to the given value.

    ///

    /// - Parameter value: The value of the new instance.

    public init(extendedGraphemeClusterLiteral value: Self.ExtendedGraphemeClusterLiteralType)

}


extension ExpressibleByExtendedGraphemeClusterLiteral where Self.ExtendedGraphemeClusterLiteralType == Self.UnicodeScalarLiteralType {


    public convenience init(unicodeScalarLiteral value: Self.ExtendedGraphemeClusterLiteralType)

}


/// A type that can be initialized with a string literal.

///

/// The `String` and `StaticString` types conform to the

/// `ExpressibleByStringLiteral` protocol. You can initialize a variable or

/// constant of either of these types using a string literal of any length.

///

///     let picnicGuest = "Deserving porcupine"

///

/// Conforming to ExpressibleByStringLiteral

/// ========================================

///

/// To add `ExpressibleByStringLiteral` conformance to your custom type,

/// implement the required initializer.

public protocol ExpressibleByStringLiteral : ExpressibleByExtendedGraphemeClusterLiteral {


    /// A type that represents a string literal.

    ///

    /// Valid types for `StringLiteralType` are `String` and `StaticString`.

    associatedtype StringLiteralType : _ExpressibleByBuiltinStringLiteral


    /// Creates an instance initialized to the given string value.

    ///

    /// - Parameter value: The value of the new instance.

    public init(stringLiteral value: Self.StringLiteralType)

}


extension ExpressibleByStringLiteral where Self.ExtendedGraphemeClusterLiteralType == Self.StringLiteralType {


    public convenience init(extendedGraphemeClusterLiteral value: Self.StringLiteralType)

}


/// A type that can be initialized using an array literal.

///

/// An array literal is a simple way of expressing a list of values. Simply

/// surround a comma-separated list of values, instances, or literals with

/// square brackets to create an array literal. You can use an array literal

/// anywhere an instance of an `ExpressibleByArrayLiteral` type is expected: as

/// a value assigned to a variable or constant, as a parameter to a method or

/// initializer, or even as the subject of a nonmutating operation like

/// `map(_:)` or `filter(_:)`.

///

/// Arrays, sets, and option sets all conform to `ExpressibleByArrayLiteral`, 

/// and your own custom types can as well. Here's an example of creating a set 

/// and an array using array literals:

///

///     let employeesSet: Set<String> = ["Amir", "Jihye", "Dave", "Alessia", "Dave"]

///     print(employeesSet)

///     // Prints "["Amir", "Dave", "Jihye", "Alessia"]"

///

///     let employeesArray: [String] = ["Amir", "Jihye", "Dave", "Alessia", "Dave"]

///     print(employeesArray)

///     // Prints "["Amir", "Jihye", "Dave", "Alessia", "Dave"]"

///

/// The `Set` and `Array` types each handle array literals in their own way to

/// create new instances. In this case, the newly created set drops the

/// duplicate value ("Dave") and doesn't maintain the order of the array

/// literal's elements. The new array, on the other hand, matches the order

/// and number of elements provided.

///

/// - Note: An array literal is not the same as an `Array` instance. You can't

///   initialize a type that conforms to `ExpressibleByArrayLiteral` simply by

///   assigning an existing array.

///

///       let anotherSet: Set = employeesArray

///       // error: cannot convert value of type '[String]' to specified type 'Set'

///

/// Type Inference of Array Literals

/// ================================

///

/// Whenever possible, Swift's compiler infers the full intended type of your

/// array literal. Because `Array` is the default type for an array literal,

/// without writing any other code, you can declare an array with a particular

/// element type by providing one or more values.

///

/// In this example, the compiler infers the full type of each array literal.

///

///     let integers = [1, 2, 3]

///     // 'integers' has type '[Int]'

///

///     let strings = ["a", "b", "c"]

///     // 'strings' has type '[String]'

///

/// An empty array literal alone doesn't provide enough information for the

/// compiler to infer the intended type of the `Array` instance. When using an

/// empty array literal, specify the type of the variable or constant.

///

///     var emptyArray: [Bool] = []

///     // 'emptyArray' has type '[Bool]'

///

/// Because many functions and initializers fully specify the types of their

/// parameters, you can often use an array literal with or without elements as

/// a parameter. For example, the `sum(_:)` function shown here takes an `Int`

/// array as a parameter:

///

///     func sum(values: [Int]) -> Int {

///         return values.reduce(0, +)

///     }

///

///     let sumOfFour = sum([5, 10, 15, 20])

///     // 'sumOfFour' == 50

///

///     let sumOfNone = sum([])

///     // 'sumOfNone' == 0

///

/// When you call a function that does not fully specify its parameters' types,

/// use the type-cast operator (`as`) to specify the type of an array literal.

/// For example, the `log(name:value:)` function shown here has an

/// unconstrained generic `value` parameter.

///

///     func log<T>(name name: String, value: T) {

///         print("\(name): \(value)")

///     }

///

///     log(name: "Four integers", value: [5, 10, 15, 20])

///     // Prints "Four integers: [5, 10, 15, 20]"

///

///     log(name: "Zero integers", value: [] as [Int])

///     // Prints "Zero integers: []"

///

/// Conforming to ExpressibleByArrayLiteral

/// =======================================

///

/// Add the capability to be initialized with an array literal to your own

/// custom types by declaring an `init(arrayLiteral:)` initializer. The

/// following example shows the array literal initializer for a hypothetical

/// `OrderedSet` type, which has setlike semantics but maintains the order of

/// its elements.

///

///     struct OrderedSet<Element: Hashable>: Collection, SetAlgebra {

///         // implementation details

///     }

///

///     extension OrderedSet: ExpressibleByArrayLiteral {

///         init(arrayLiteral: Element...) {

///             self.init()

///             for element in arrayLiteral {

///                 self.append(element)

///             }

///         }

///     }

public protocol ExpressibleByArrayLiteral {


    /// The type of the elements of an array literal.

    associatedtype ArrayLiteralElement


    /// Creates an instance initialized with the given elements.

    public init(arrayLiteral elements: Self.ArrayLiteralElement...)

}


/// A type that can be initialized using a dictionary literal.

///

/// A dictionary literal is a simple way of writing a list of key-value pairs.

/// You write each key-value pair with a colon (`:`) separating the key and

/// the value. The dictionary literal is made up of one or more key-value

/// pairs, separated by commas and surrounded with square brackets.

///

/// To declare a dictionary, assign a dictionary literal to a variable or

/// constant:

///

///     let countryCodes = ["BR": "Brazil", "GH": "Ghana",

///                         "JP": "Japan", "US": "United States"]

///     // 'countryCodes' has type [String: String]

///

///     print(countryCodes["BR"]!)

///     // Prints "Brazil"

///

/// When the context provides enough type information, you can use a special

/// form of the dictionary literal, square brackets surrounding a single

/// colon, to initialize an empty dictionary.

///

///     var frequencies: [String: Int] = [:]

///     print(frequencies.count)

///     // Prints "0"

///

/// - Note: A dictionary literal is *not* the same as an instance of

///   `Dictionary` or the similarly named `DictionaryLiteral` type. You can't

///   initialize a type that conforms to `ExpressibleByDictionaryLiteral` simply

///   by assigning an instance of one of these types.

///

/// Conforming to the ExpressibleByDictionaryLiteral Protocol

/// =========================================================

///

/// To add the capability to be initialized with a dictionary literal to your

/// own custom types, declare an `init(dictionaryLiteral:)` initializer. The

/// following example shows the dictionary literal initializer for a

/// hypothetical `CountedSet` type, which uses setlike semantics while keeping

/// track of the count for duplicate elements:

///

///     struct CountedSet<Element: Hashable>: Collection, SetAlgebra {

///         // implementation details

///

///         /// Updates the count stored in the set for the given element,

///         /// adding the element if necessary.

///         ///

///         /// - Parameter n: The new count for `element`. `n` must be greater

///         ///   than or equal to zero.

///         /// - Parameter element: The element to set the new count on.

///         mutating func updateCount(_ n: Int, for element: Element)

///     }

///

///     extension CountedSet: ExpressibleByDictionaryLiteral {

///         init(dictionaryLiteral elements: (Element, Int)...) {

///             self.init()

///             for (element, count) in elements {

///                 self.updateCount(count, for: element)

///             }

///         }

///     }

public protocol ExpressibleByDictionaryLiteral {


    /// The key type of a dictionary literal.

    associatedtype Key


    /// The value type of a dictionary literal.

    associatedtype Value


    /// Creates an instance initialized with the given key-value pairs.

    public init(dictionaryLiteral elements: (Self.KeySelf.Value)...)

}


/// A type that can be initialized by string interpolation with a string

/// literal that includes expressions.

///

/// Use string interpolation to include one or more expressions in a string

/// literal, wrapped in a set of parentheses and prefixed by a backslash. For

/// example:

///

///     let price = 2

///     let number = 3

///     let message = "One cookie: $\(price), \(number) cookies: $\(price * number)."

///     print(message)

///     // Prints "One cookie: $2, 3 cookies: $6."

///

/// Conforming to the ExpressibleByStringInterpolation Protocol

/// ===========================================================

///

/// The `ExpressibleByStringInterpolation` protocol is deprecated. Do not add

/// new conformances to the protocol.

@available(*, deprecated, message: "it will be replaced or redesigned in Swift 4.0.  Instead of conforming to 'ExpressibleByStringInterpolation', consider adding an 'init(_:String)'")

public typealias ExpressibleByStringInterpolation


@available(*, deprecated, renamed: "ExpressibleByNilLiteral")

public typealias NilLiteralConvertible = ExpressibleByNilLiteral


@available(*, deprecated, renamed: "ExpressibleByIntegerLiteral")

public typealias IntegerLiteralConvertible = ExpressibleByIntegerLiteral


@available(*, deprecated, renamed: "ExpressibleByFloatLiteral")

public typealias FloatLiteralConvertible = ExpressibleByFloatLiteral


@available(*, deprecated, renamed: "ExpressibleByBooleanLiteral")

public typealias BooleanLiteralConvertible = ExpressibleByBooleanLiteral


@available(*, deprecated, renamed: "ExpressibleByUnicodeScalarLiteral")

public typealias UnicodeScalarLiteralConvertible = ExpressibleByUnicodeScalarLiteral


@available(*, deprecated, renamed: "ExpressibleByExtendedGraphemeClusterLiteral")

public typealias ExtendedGraphemeClusterLiteralConvertible = ExpressibleByExtendedGraphemeClusterLiteral


@available(*, deprecated, renamed: "ExpressibleByStringLiteral")

public typealias StringLiteralConvertible = ExpressibleByStringLiteral


@available(*, deprecated, renamed: "ExpressibleByArrayLiteral")

public typealias ArrayLiteralConvertible = ExpressibleByArrayLiteral


@available(*, deprecated, renamed: "ExpressibleByDictionaryLiteral")

public typealias DictionaryLiteralConvertible = ExpressibleByDictionaryLiteral


@available(*, deprecated, message: "it will be replaced or redesigned in Swift 4.0.  Instead of conforming to 'StringInterpolationConvertible', consider adding an 'init(_:String)'")

public typealias StringInterpolationConvertible


'Objective-C, SQLite3' 카테고리의 다른 글

스타벅스 텀블러 한정판  (0) 2019.02.04
mac locate  (0) 2019.02.03
gcc -static -> Visual studio  (0) 2019.02.02
자료형에 대해서  (0) 2019.02.02
mac bluetooth service on and off  (0) 2019.02.02




'Objective-C, SQLite3' 카테고리의 다른 글

mac locate  (0) 2019.02.03
스위프트 소스 중에 가장 중요한 소스 from swift.org  (0) 2019.02.02
자료형에 대해서  (0) 2019.02.02
mac bluetooth service on and off  (0) 2019.02.02
working on graph  (0) 2019.02.02


개발하다보면, 수많은 자료형을 접하고 만들게 된다.


상용 프로그램을 만들 때


단, 하나의 솔루션으로 풀 수 있는 것은 없다.


그렇다고 매우 어려운 것은 아니다.


보통 하나의 프로토콜은


복합적인 자료형의 집합인 하나의 클래스로 해결된다.


사람이 많아지고 히스토리 관리가 안되면 해당 클래스는 비대하고 비효율적이지만


하드웨어가 워낙 빨라 큰 문제가 되지 않는다.


그러나 사용자 수가 늘어나고 보이지 않는 비용이 늘어날 수록 비효율적이 되므로


늘 리팩토링을 하고 최적화를 항상 고민해야 한다.



그리고 아토믹한 자료형을 항상 살펴봐야 한다.


해당 솔루션에 인덱스가 필요한지, 동기화를 계속 해야할지, 정렬이 중요한지, 등


동기화 때문에 만들어진 솔루션을 사용할 일은 많이 없다.


그래서 어떻게 만들어져 있는지 구현 방법을 알아야 하고 그 모든 것의 기본은


malloc을 이해하는 것과 linked list를 구현 하는데서 출발한다.








자바에서 파라미터 넘길 때 스택도 좋다.


오버로딩도 되지만... 파라미터 바꾸면, 연계된 너무 많은 것들이 바뀌어서 ^^;;


Stack<double> s = new Stack<double>();

s.Push(10.5);

s.Push(3.54);

s.Push(4.22);


double val = s.Pop();


C++, C# 등... 여러가지 하니 헷갈린다.


Queue


Queue<int> q = new Queue<int>();

q.Enqueue(120);

q.Enqueue(130);

q.Enqueue(150);


int next = q.Dequeue();

next = q.Dequeue();


Array


int sum = 0;

int[] numbs = new int[10];


Random rand = new Random();

for( int i=0; i < nums.Length; i++)

{

nums[i] = rand.Next() % 100;

}


for (int i=0; i<nums.Length; i++)

{

sum += nums[i];

}

Console.WriteLine(sum);



LinkedList




LinkedList<string> list = new LinkedList<string>();

list.AddLast(“Apple”);

list.AddLast(“Banana”);

list.AddLast(“Lemon”);


LinkedListNode<string> node = list.Find(“Banana”);

LinkedListNode<string> newNode = new LinkedListNode<string>(“Grape”);


list.AddAfter(node, newNode);


list.ToList().forEach(p=> Console.WriteLine(p));


foreach(var m in list)

{

Console.WriteLine(m);

}


Dynamic Array


ArrayList


ArrayList myList = new ArrayList();

myList.Add(90);

myList.Add(88);

myList.Add(75);


int val = (int) myList[1];


List<T> Class


List<int> myList = new List<int>();

myList.Add(90);

myList.Add(88);

myList.Add(75);

int val = myList[1];



SortedList<TKey, TValue> Class


SortedList<int, string> list = new SortedList<int, string>();

list.Add(1001, “Tim”);

list.Add(1020, “Ted”);

list.Add(1010, “Kim”);


string name = list[1001];


foreach(KeyValuePair<int, string> kv in list)

{

Console.WriteLine(“{0}:{1}”, kv.Key, kv.Value);

}




이제 진짜 iOS만 해야지.




'Objective-C, SQLite3' 카테고리의 다른 글

스위프트 소스 중에 가장 중요한 소스 from swift.org  (0) 2019.02.02
gcc -static -> Visual studio  (0) 2019.02.02
mac bluetooth service on and off  (0) 2019.02.02
working on graph  (0) 2019.02.02
JAVA C/C++ Objective-C Swift  (0) 2019.02.02


Bluetooth


sudo launchctl stop com.apple.blued

sudo launchctl start com.apple.blued



[이전] 배달의 민족 개선했으면 하는 사안...


주문하고 한시간 뒤에 보니 주문 취소가 되어 있었다.


취소 시각이 나오지 않아 전화해서 물어보니 3분 쯤 뒤였다.


앱이 켜져 있어서 그랬던 걸까?


알람도 오지 않았다.


주문 취소는 해당 업체에서 1시간 30분 이상 걸릴 것 같은 경우 취소를 한다고 한다.


취소 시각을 해당 업체에 물어봤을 때 취소했을 경우


아예 내역이 나오지 않는다고 했다.


아이와 함께 먹을 것을 기다리던 차라 짜증나서 수수료 때문에 일부러 취소했냐고


물어보니 예전에는 비쌌는데 요즘엔 카드 결제 수수료 정도라서 그렇지 않다고 답했다.


그만큼 내가 짜증나서 꼬치꼬치 캐물었다.




카드 결제 수수료 사실 작지 않다.


배달의 민족으로 유명해진 집은 이제 주문을 거르는 것 같네.


똑같은 시각에 똑같이 카드 결제를 해 버린 경우 그냥 주문을 받던데 말이다.


그럼 결론은 뭐냐?


그냥... 지금처럼 잘 해 달라고.


사람들이 평점을 즐겨 본다. 그래서 좋은 곳은 더 잘되게 해 준거니...


easy talk 이제 끝...


주문 취소가 잦은 업체의 경우 횟수를 알 수 있게 해주면 좋겠다.

혹은, 제대로된 알림을 주면 좋겠다(이건 아이폰 특성상 힘들것 같으니 전화 걸기로...)


'Objective-C, SQLite3' 카테고리의 다른 글

gcc -static -> Visual studio  (0) 2019.02.02
자료형에 대해서  (0) 2019.02.02
working on graph  (0) 2019.02.02
JAVA C/C++ Objective-C Swift  (0) 2019.02.02
기억나는 고마운 분s  (0) 2019.01.30



import UIKit


class jhType4graph_willBeDeleted<T> : jhPanel<T> {

    

    var panelID: Int = 0

    

    var pointCloud = Array<CGPoint>()

    

    override func drawDatas() {

//        //        worldEllipse(context: mContext, 100, 100, 100, 100, 2, UIColor.blue.cgColor)

//        

//        var fx, fy : CGFloat

//        

//        var x : Int = 0

//        for y in (jhDataCenter.mDatas[panelID]?.d)! {

//            //ref:drawLine(CGFloat(x)*axisDistance + mMargin, mMargin, CGFloat(x) * axisDistance + mMargin, 10000-mMargin)

//            x += 1

//            fx = CGFloat(x)*xDistance

//            fy = CGFloat(y.y)*mVerticalRatioToDraw_view + mMargin

//            //            drawEllipse(fx, fy, 2, 2, thickness: 2, UIColor.blue.cgColor)

//

//            pointCloud.append(CGPoint.init(x: getX(fx+mMargin)!, y: getY(fy)!))

//            

//            drawmyRect(fx, fy, 2, 2, thickness: 2, UIColor.blue.cgColor)

//            

//        }

    }

    

    fileprivate func roundRect(x: CGFloat, y: CGFloat, width: CGFloat, height: CGFloat)

    {

        let rectBgColor:     UIColor = UIColor.yellow

        let rectBorderColor: UIColor = UIColor.yellow

        let rectBorderWidth: CGFloat = 2

        let rectCornerRadius:CGFloat = 5

        

        let ctx: CGContext = UIGraphicsGetCurrentContext()!

        ctx.saveGState()

        

        ctx.setLineWidth(rectBorderWidth)

        ctx.setStrokeColor(rectBorderColor.cgColor)

        

        let rect = CGRect(x: x, y: y, width: width, height: height)

        let clipPath: CGPath = UIBezierPath(roundedRect: rect, cornerRadius: rectCornerRadius).cgPath

        let linePath: CGPath = UIBezierPath(roundedRect: rect, cornerRadius: rectCornerRadius).cgPath

        

        ctx.addPath(clipPath)

        ctx.setFillColor(rectBgColor.cgColor)

        ctx.closePath()

        ctx.fillPath()

        

        ctx.addPath(linePath)

        ctx.strokePath()

        

        ctx.restoreGState()

    }

    

    

    fileprivate func drawmyRect(_ x: CGFloat, _ y: CGFloat, _ width: CGFloat, _ height: CGFloat, thickness: CGFloat, _ color: CGColor) {

        jhDraw.worldEllipse(context: mContext, getX(x+mMargin)!, getY(y)!, width, height, thickness, UIColor.red.cgColor)

//        if GS.shared.current_myGraphType == .general {

//            for x in pointCloud {

//                mContext?.setFillColor(jhDraw.jhColor(r: 184, g: 70, b: 201, a: 0.1))

//                mContext?.setStrokeColor(jhDraw.jhColor(r: 184, g: 70, b: 201, a: 0.1))

//                mContext?.setLineWidth(1)

//

//                let rectangle = CGRect(x: x.x-5, y: x.y-20, width: 10, height: 40) //TODO: 좌표 계산 부분  곳으로 몰기.

//                mContext?.addRect(rectangle)

//                mContext?.drawPath(using: .fillStroke)

//            }

//        } else if GS.shared.current_myGraphType == .first {

            for x in pointCloud {

                roundRect(x: x.x-5, y: x.y-20, width: 10, height: 40)

            }

//        }

    }

}


'Objective-C, SQLite3' 카테고리의 다른 글

자료형에 대해서  (0) 2019.02.02
mac bluetooth service on and off  (0) 2019.02.02
JAVA C/C++ Objective-C Swift  (0) 2019.02.02
기억나는 고마운 분s  (0) 2019.01.30
토막 고민, 커리어에 대한  (0) 2019.01.30



  • java

MyClass c;

c = new MyClass();

c.member = 1;

c.method();


  • Objective-C

MyClass *c;

c = [[MyClass alloc] init];

c.member = 1;

[c method];


  • C

void myFunction(int);


void myFunction(int a) {

printf(“ HelloWorld \n”);

}


  • Objective-C

@interface MyClass: NSObject


-(void) myFunction: (int) a;


@end


@implementation MyClass

-(void) myFunction: (int) a

{

NSLog(@“HelloWorld \n”);

}

@end


  • Java

class XXX {

int a;

int b;

public static void main(String args[]) {}

}

  • Obj-C

@implementation XXX

{

int a;

int b;

}

@end

int main(int argh, char *argv[]) { return 0; }


  • Java

public int getNumer() { return number; }


  • Obj-C

-(int) getNumber { return number; }



'Objective-C, SQLite3' 카테고리의 다른 글

mac bluetooth service on and off  (0) 2019.02.02
working on graph  (0) 2019.02.02
기억나는 고마운 분s  (0) 2019.01.30
토막 고민, 커리어에 대한  (0) 2019.01.30
게임 회사가 망해도 돈 버는 사람은 많다.  (0) 2019.01.30



딸을 키우는 기쁨은 참 크다.

스타트업에서는 타당성만을 따진다. 흑백 논리 오류를 제외하고 예를 들어 보겠다.


넌 ㅂㅅ 아니면 바보야

넌 ㅂㅅ 이 아니야

그러면 바보야.


이것은 완벽히 타당한 연역 논리이다.


그러나 ㅂㅅ 아니면 바보라는 잘못된 전제를 가지고 있다.


넌(사람 대상) 남자 아니면 여자야


는 완벽히 참인 전제이므로 이 문구를 넣어서 바꾸면,


넌(사람 대상) 남자 아니면 여자야

넌 여자가 아니야
넌 남자야

완벽한 연역이 된다. 이 때 우리는 타당하다고 하지 않고, 건전(sound) 하다고 표현한다.

스타트업에서 일할 때 타당성에만 집중해서 말하고 그것이 마치 제대로 생각한 것인 양 말하면서,
대기업에 있었던 나보다 많은 경험을 했다는 것을 강조했었다.

나는 평생을 경험 주의자로 살 수 밖에 없었던 가정 환경 때문에 그럴 수 밖에 없었는데,
스타트업에서 이런 좋지 않은 경험 때문에 
주요 정보는 숨긴 이상한 전제를 제시하고 
타당성만을 강조하며
말하는 사람에 대한 경멸이 생겼다.

OLPP는 관계에 의해 object의 본질이 바뀌기도 하는데
돈 때문에 변하는 사람도 나타낼 수 있다는 점에서 완벽하다.



'!!OLPP' 카테고리의 다른 글

관계를 변화 시키다.  (0) 2019.04.15
몰입의 즐거움  (0) 2019.03.21
모든 것을 좌우하는 관점, OLPP  (0) 2019.01.21
추리와 추론의 차이  (0) 2019.01.14
사르뜨르가 했던 말과 내 생각  (0) 2019.01.07

어제 포스팅한 참치집 새로 생겨서 아직 카카오 네비에 안 뜬다. 기흥 육지로간참치


그리고 아래 맥주집에는 망고랑 동그란 튀김이 너무 맛있었다.


그리고 경기도에서 카카오 대리보다 더 큰 업체 전번

카카오 대리 쿠폰 받아서 쓰려다가 술이 취하니 전번이 더 쉽더라는...






 꿍스뿡이의 드림빌더님의 서식적용

모바일로 보다가 좋은 소스 발견

티스토리에  일기를 쓸 때 조금 신경 써서 포스팅을 해야 겠다 하고 워드로 써서 붙이면 잘 되기에 워드로 하려고 하다 인터넷에서 좋은 서식을 발견 했습니다.


어느 카테고리에 넣어야 할까?

모바일은 불편하다고 해도 데스크탑으로 할 때는 나름 잘 맞고 제가 잘 포스팅 하지 않는 카테고리에 넣어야 제가 계속 서식을 뽑아서 쓸 수 있기 때문에 멋진 프로그램 소개로 넣기로 했습니다.


장/단점

html 켜고 거기 서식을 넣는 것 보다 워드에서 작성해서 복/붙 하는게 더 편리하기는 한데 이거 만드신 분은 모바일 환경도 고려를 한 것 같아서 앞으로 Diary에 이 서식을 쓰기로 했습니다.


색감이 좋아요.

마무리 색감이 너무 좋습니다. 안내문구도... 아름다움이 느껴집니다. 꿍스뿡이님 티스토리 가서 광고 눌러주는 센스!


관련글



 

꿍스뿡이님 ㄱㅅㄱㅅ


'will be deleted.' 카테고리의 다른 글

크롬_필수_플러그인  (0) 2020.09.24
Everyday  (0) 2019.03.13
Google Analytics  (0) 2019.01.28
google search console  (0) 2019.01.25
움짤을 만들어 보았다.  (0) 2019.01.12




이 형은 좋은게 만나면 술 값 나지 말란 말부터 한드​

잡스 전기도 있고, iWoz 원서가 집에 있는데 잡스/워니니악 영화도 다 보고 유투브 영상도 볼 만큼 관심이 많다.


나무위키가 가장 정리를 잘 해놓았다. 정말 이젠 위키피데아 보다 나아졌다고 해야 겠다.


그러나 주변에는 나무위키 모르는 사람 많으니 남겨둔다. 나중에 잡스 신봉자에 의해 변형될 수도 있어서 히스토리 일일이 찾는 것도 귀찮아서 남겨두는 이유도 +


참고로 빅뱅이론 출연분은 https://www.youtube.com/watch?v=-K1uj9VmCzo



파일:external/www.nndb.com/SteveWozniak.jpg

파일:attachment/스티브 워즈니악/WWDC2013_woz.jpg
WWDC 2013을 참관 중인 스티브 워즈니악[1]

파일:external/contents.dt.co.kr/2012060402012122734001.jpg
2012년 5월 31일 제주도에서 개최한 제주포럼에 참석한 후 우근민 제주특별자치도지사가 돌하르방을 선물하는 장면. 자세히 보면 돌하르방과 참 닮았다.

1. 개요2. 생애3. 근황4. 성격과 일화5스티브 잡스와의 관계6. 한국 대중 사이에서의 인지도7. 매체에서

1. 개요[편집]

Stephen Gary Woz Wozniak[2]
공식 사이트

20세기 컴퓨터 시대를 연 인물 중 한 명

애플의 공동 창업자. 1950년 8월 11일 생. 20세기 본격적인 PC(Personal Computer)의 시작을 연 사람. 한글 영문표기로는 워즈니악이라고 표기하지만, 줄여서 '워즈'라고 부른다.

사실상 애플 시리즈를 혼자서 만든 괴수. 애플 컴퓨터를 개발하면서 특허도 몇 개 따 놨는데, 그중 특히 주목할 만한 것은 "US Patent No. 4,136,359 - "Microcomputer for use with video display"로, 컴퓨터를 사용한 CRT상에서의 컬러 그래픽 컨트롤 방법에 대한 것이다. 컴퓨터에 영상 디스플레이 달린 거 자체는 60년대 대형 컴퓨터들부터 있었다. <키보드와 모니터>는 생각보다 무척 이른 시기부터 정립된 형태인데, 뭐니뭐니해도 펀치카드로 입력하고 프린터로 출력받는 건 여러 가지로 많이많이 암울한지라... 애플II와 같은 해 발매된 TRS-80이나 코모도어 PET 같은 물건도 모니터를 통해 영상을 출력한다. 워즈니악의 특허는 기존의 영상 출력 제어 방식을 개선하고, 무엇보다도 컬러 표현을 가능하게 했다는 것이 돋보이는 부분이다. 이 컬러 그래픽은 애플II가 당대에 가장 앞서 나갔던 부분. 코모도어 PET 같은 경우, 수십 개의 범용 논리회로를 짜맞춰서 시스템을 구성해야 했던 애플 같은 영세 벤처와 달리 전용 그래픽 제어칩을 사용해 512x512라는 당시치고 굉장한 고해상도 그래픽을 실현했지만 색상은 흑백으로만 나타낼 수 있었다. 워즈니악이 이 발명으로 2000년에 미국 발명가 명예의 전당(National Inventors Hall of Fame)에도 오른 것을 생각하면 이 특허의 선진성을 알 수 있다. 

사실 잡스는 단순 경영자에 가깝고 초기 애플의 기술력은 워즈니악이 전부인 수준이다. 아니, 혼자 다 했다고 봐야한다.

당대 유명한 해커이기도 했다. 1970~1980년대 해커들 중에는 아직도 "더 워즈"(The Woz)[3]의 명성을 기억하는 이들이 많다. 특히 "블루박스"라 불리는 장치를 개발해 공짜 장거리전화를 거는 해킹으로 유명했지만 그 외에도 무용담이 많다.

2. 생애[편집]

록히드 사에서 미사일을 개발하던 아버지 아래에서 자랐는데, 아버지의 작업물에 대한 내용은 어떠한 것도 들을 수 없었지만 아버지의 영향을 어느 정도 받아 어려서부터 공학에 뛰어난 재능을 보였으며[4], 대학 중퇴한 스티브 잡스나 빌 게이츠와 마찬가지로 대학교를 중퇴했는데 바로한 건 아니고 1968년도 콜로라도 대학교에 입학한 뒤 학비문제로 가까운 데안자 대학교로 1969년에 편입했고 여기서도 1970년에 캘리포니아 대학교 버클리에 편입한 뒤 1975년에 중퇴하고 휴렛패커드(이하 HP)에 입사했다. 주로 했던 작업은 계산기 분야. 후에 1986년에 캘리포니아 대학에서 BS학위를 얻었다.

이 시기 가장 큰 전환점은 고등학교 후배이자 친구에게 장난치기를 좋아하고 전자회로에 관심이 많은 비상한 고등학교 후배를 소개받게 된 것이다. 잡스가 워즈니악의 고등학교의 친구라고 자주 언론에 나와서 한국인들은 이들이 동갑이라 생각하는데 실제로 잡스는 워즈니악보다 5살 어리다 (서양 문화로는 학교 선배건 후배건 구분없이 모두 친구). 스티브 잡스를 소개해준 이 친구는 Bill Fernandez로 훗날 애플 컴퓨터 최초의 직원이 된다. 잡스와 워즈니악의 무용담은 아래에서 확인할 것.

고등학교 때부터 전자회로와 계산기에 관심이 많던 워즈니악은 컴퓨터 동호회에서 활동을 시작하게 되고, 잡스 역시 이 동호회에서 활동했다. 1977년 워즈니악은 구형 텔레비전에 연결된 조잡한 회로를 동호회 친구들에게 보여주게 된다. 오랜만에 이 동호회에 나타난 스티브 잡스는 이 물건이 장사가 될거라 생각하고 워즈니악에게 같이 회사를 차리자고 설득하기 시작했다. 워즈니악에게는 이미 HP라는 걸출한 직장이 있었고 여건만 된다면 HP에 PC 부서를 두는 것이 어떻냐고 상사에게 제안하는 중이었기에 선뜻 긍정을 못했지만, 잡스는 자신이 알고있는 모든 인맥을 총동원해서 매일같이 워즈니악과 그의 친구들에게 " HP는 워즈니악 같은 인재를 알아보는 안목이 없으니 차라리 워즈니악이 HP를 그만두고 새 회사를 차려 사업은 사업가에게, 개발은 개발자에게 맡기는 게 낫다"라고 설득했다. HP에서 워즈니악의 개인용 컴퓨터 사업 제안을 여러 차례 거절하자, 결국 HP를 그만두고 잡스와 동업하여 애플 컴퓨터를 설립하게 된다. 참고로 사업비도 워즈가 냈다.(...) 미친 동생

애플 컴퓨터를 세운 이후 부품 조달, 마케팅과 조립 등은 잡스에게 맡기고 거의 개발에만 전념한 듯하다. 대표적으로 애플 II의 설계를 맡았다.

1981년 워즈니악은 자신이 몰던 비행기가 추락하면서 기억상실증에 걸리는 큰 부상을 입은 치료차 휴직을 하게 되었다. [5] 휴직을 한 겸사겸사 학교를 복학하여 졸업을 하고, 1983년 회사에 복귀했다. 애플에 복귀해보니 회사는 매킨토시 사업부와 애플 사업부 둘로 쪼개져서 서로 경쟁하는 살벌한 환경이 되어있었고, 자신이 원했던[6] 모습의 회사가 아니라는 사실에 충격받은 워즈니악은 모든 주식을 매각해버리고 회사에 사표를 내게 된다. [7] 실질적으로는 그만둔 거지만 지금까지도 애플에 직원 목록에는 그의 이름이 있다. 본인말로도 자신은 새로운 일을 찾았을 뿐 애플을 공식적으로 그만둔적은 없다고 말했을 정도. 다만 애플 직원이라고 말하기도 애매한 것이, 1주일에 적은 돈을 받는다고 한다. [8]

3. 근황[편집]

현재는 스토리지 회사인 Fusion-io라는 회사의 수석 연구원 겸 애플 자문 역으로 꽤 성공한 삶을 살고있긴 하지만, 빌 게이츠의 파트너인 폴 앨런이 억만장자가 되어 잘 살고있는 걸 볼 때 대조적인 모습이다. 물론 워즈도 백만장자 정도는 된다. 이 양반도 시가 100억이 넘는 집에 산다. 

2006년 자서전을 냈는데, 제목이 "iWoz". 여담으로 iWoz라는 이름은 영어권에서 보면 나는 워즈다, 라는 의미와, iWoz를 iWas(발음대로)로 읽어서, '나는 예전에 ~' 라는 의미가 있다. 중의적인 표현. iMac 등 애플의 i 시리즈에서 따온 제목으로 보인다.

국내에도 "스티브 워즈니악"이라는 제목으로 출판되었다. 어린 시절부터 애플 사에서 나올 때까지의 일들을 주로 다루고 있다. 관심 있는 사람들이라면 매우 재미있게 읽을 수 있다. 또한 워즈니악에 관련된 오해들을 풀고 다음 세대에게 "포기하지 말고 계속 도전해라"라는 조언을 해주고자 책을 썼다고 서문에 밝혔다. 그런데 그 오해들이라는 게 학교를 졸업하지 못했다거나[9], 애플I을 함께 만들었다거나[10] 등. 현재는 절판되어 번역판의 새 책을 구하기가 힘들다.

2009년 2월에는 자신이 타고다니는 도요타 프리우스의 전자식 스로틀 조절 프로그램과 브레이크에 문제가 있다고 제기를 해서, 프리우스의 리콜을 이끌어 냈다.

지금은 실리콘 밸리라 불리는 캘리포니아 산호세에 살고 계신다. 워낙 동네에 공돌이, 특히 코딩머신 컴퓨터 분야 공돌이가 많이 살기 때문에 다들 우연히 워즈니악과 마주치면 "오오 워즈다 오오" 한다고 한다. 또 그렇게 알아봐주는 사람들을 친절하게 맞아주는 훈훈한 사람이다.(또 블로그에 글을 남기거나 메일을 보내면 그걸 꼬박꼬박 답변해준다고.)

메일로 "애플에 다시 입사할 수 있다면 할 것이냐고" 질문을 던졌다. 답장은 5분 안에 왔다. 내용은 간단했다 "다신 다니고 싶지 않아"라는 답장이였다. 그 답변시간과 간단함이 여러 가지를 말하는 듯하다...

또, 굉장한 전자기기 덕후라서 새로 나오는 휴대폰 종류는 애플이고 안드로이드고 기타 등등이고 편식하지 않고(……) 다 구매해서 가지고 논다. 그리고 트위터로 나 이거 새로 삼ㅋ라고 염장질도 자주 하신다

워즈가 여행할 때 가지고 다니는 전자제품들은 이 링크를 가보면 알 수 있다. http://gizmodo.com/5926598/the-amazing-contents-of-steve-wozniaks-travel-backpack

파일:external/tctechcrunch2011.files.wordpress.com/woz_and_us_2.jpg

갤럭시 넥서스를 미국 내 출시되기 전에 소유하기도 했다. 구글 직원들하고 찍은 사진. 우리중에 스파이가 있나봐 관련 기사(영문) 아예 저 옆의 직원 하나는 사과를 베어먹고 있다(...)

애플 삼성 특허 분쟁에 대해 캘리포니아 법원에서 평결한 10억 달러가 잘못된 판결이고, 결국엔 기각 될 것이라 봤다. 덤으로, 클리앙에서 애플을 깠는데, 도리어 찬양을 받는...이 인터뷰에서 모든 특허 기술을 서로 교환하고, 모두 사용할 수 있는 세상을 희망한다고...

2015년 10월 개봉한 <스티브 잡스>에 대한 감상 인터뷰가 나왔다. 원작인 전기를 한번도 읽어보지 않은 것과 대조적으로 영화를 세번이나 봤을 정도로 굉장히 좋아했다고 한다.

아이폰6 발표 직후 한 인터뷰에서, 아이폰6가 더 커진 스크린을 탑재하면서 자신이 가진 안드로이드 기기를 전부 처분했다고 밝혔다.

여담으로 2016년 대선에서는 버니 샌더스를 지지하고 있다.

2016년 3월에 레딧과 IAMA[11]를 진행했다. 번역1/2 번역2/2

4. 성격과 일화[편집]

처음부터 큰 부자가 되는 것에는 별 관심이 없었다고 한다. 여전히 백만장자긴 하지만 잡스가 애플 복귀 후 아이맥과 아이팟이 히트를 쳐서 억만장자가 된 것에 비하면 소박한 수준이다. 리처드 스톨만만큼은 아니지만 상당히 이상주의적이고 히피적인 마인드를 가진 사람.

애플에 있었을 당시 워즈 플랜이라고 직원들에게 자신의 주식을 공짜로 나눠주기까지 했다. 잡스는 이걸 좋지 않게 보았다고 한다. 워즈니악이 속고 있다는 말도 했다고... 아니나다를까 정작 주식을 받은 직원들에게 워즈니악은 호구 취급을 당했다. 심지어 주식을 받은 직원 중 한 명은 빈민이 그려진 불우이웃 돕기 포스터 밑에 '워즈니악의 미래 모습'이라며 낙서를 해놓기까지 했다고 한다. 이런 거 보면 이유없는 선의는 베푸는 의미가 없는 것 같아

US 페스티벌 음악회를 연다든가 하는 자선 활동을 했고 지금도 지역사회에 교육 관련으로 많은 지원을 하고 있다. 또한 클라우드 나인(Cloud 9)이라는 회사를 만들어서 만능 리모콘을 만든다든가 하는 식으로 여러가지를 하면서 사업성보다는 새로운 기술 개발에 집중했다.[12]

개인적으로도 재밌는 면이 많은데, 프리메이슨 회원이다.[13]. 근데 정작 종교나 신비학에는 별로 관심이 없다고 한다. 기본적으로 무종교이기도 하고. 심지어 애플I의 가격을 666.66달러로 하고서도 특별한 의미가 있어서가 아니고 그냥 숫자 하나만 쓴 것이 멋지게 보일 것 같아서라고... 그러다 소비자의 편지를 받고 666을 연상시킬 것이라는 것을 알았다고 한다. 당시 오멘이 한창 개봉할 때라 문제가 될 뻔 했다고. 근데 주위 사람도 아무도 눈치를 못 챘다고 한다.[14] 

테트리스가 취미이며, 광팬이라고 하다. 닌텐도 파워라는 잡지에 자기의 신기록을 냈는데, 잡지에서 더 이상 자기 점수를 안 내주자, Evets Kainzow이란 이름으로 내기도 했다고...[15]

덤으로 이 아저씨, 장난을 무지하게 좋아한다. 한번은 학교 사물함에 움직이면 째각소리가 더 빨라지는 시계 장치를 넣어놔서, 학교 전체가 난리 난 적이 있었다. 잡스는 그런 워즈니악이 장난의 레전드 오브 레전드로 보고 재능이 뛰어난 것을 간파했다고 한다.

또한 대학시절인 1971년 AT&T사의 장거리 통화 네트워킹을 해킹해 장거리 전화를 무료로 사용할 수 있는 장치 "블루 박스"를 제조했고, 심지어는 그걸 가지고 로마 교황한테 공짜 장난전화를 거는 용자짓을 하기도 했다.[16] 

교황에게 전화할 때 자신을 헨리 키신저로 소개했다고... 성대모사를 했다고 하는데 걸렸으니까 이런 에피소드가 있겠지... 사실 교황과 직접 통화는 못했다고 한다. 하지만 더 웃긴 건 당시 전화를 받은 주교가 여기 새벽이니 한 시간 뒤에 통화하셈이라 말해서 워즈니악이 한 시간 뒤에 다시 전화를 걸자, 전화를 받은 주교가 너님 키신저 아니지? 내가 좀전에 키신저랑 통화를 했는데 뭔 소리여라 응수한 것(...) 미국 최고 외교관과 바로 통화가 가능한 바티칸의 위엄

그런가 하면 학교 기숙사 TV 시청실에서 방해전파를 쏴서 시청을 방해하기도 했다. 학생들이 TV 안테나를 이상한 곳으로 옮기면 전파를 껐다고...[17] 뭐 다들 알고 있지요? 착한 어린이는 따라하면 안 돼요.

또 전화를 걸면 유머를 말해주는 일종의 ARS 서비스인 다이얼조크를 서비스 하기도 했는데, 그때 다이얼조크에다 폴란드인 유머를 신나게 하다가, 지역 폴란드인 협회에서 "우리 까지마셈!"이라고 한 적이 있었다. 그리고 나중에 그 협회에서 "우리 까지마셈!"라고 말한 사람에게 최고의 폴란드계 미국인 상을 주었다고(...).[18]

유명한 말로 "창밖으로 내던지지 못하는 컴퓨터는 믿지 말라(Never trust a computer you can't throw out a window어?)."라는 말이 있다. 문명 4에서 컴퓨터를 발명하면 이 대사가 나온다. 라이프 해커에서 한 인터뷰에 따르면 컴퓨터 사이즈에 대해서 비슷한 말을 했지만 정확히 이 말을 했는지는 잘 기억 안 난다고.

애플 워치를 굉장히 높게 평가한다. 2017년 4월 CNET과의 인터뷰에서 밝히기를 매우 유용한한 웨어러블이라고. 인터뷰에서 차고 있었던 모델과 스트랩은 스페이스 블랙 워치에 스페이스 블랙 밀라니즈 루프였다.

결혼을 네번이나 했으며 자식은 다섯 명이다. 지금 부인은 자넷 힐.

5. 스티브 잡스와의 관계[편집]

운명적인 장난 파트너하지만 거듭되는 통수

워즈니악도 잡스도 장난 치는 것을 굉장히 좋아하고 둘다 기계에 관심이 많았기 때문에 둘은 나이를 떠나 마음이 잘 맞는 절친 관계였다. 한편으로는, 서로 가지지 못한 재능을 가지고 있었는데, 내성적이고 효율적이고 기술에 재능을 가진 워즈니악과, 제멋대로이고 예술적인 감각을 갖췄고 인맥을 총동원해서 일을 추진하는 능력이 있는 잡스는 서로를 보완하는 관계였다.

그러나 잡스는 모든 것을 통제하고 자기 위주로 가야하는 성격이었기 때문에 관계가 언제나 완벽한 것은 아니었다. [19] 이를 가장 잘 보여주는 예가, 잡스가 아타리에서 일하던 시절의 일이다. 잡스는 아타리에서 게임기 설계를 단순화한 일을 맡아서 보수로 5,000달러를 받은 적이 있었는데[20] 경영인 자격으로 보수를 받은 잡스는, 실제로 작업을 혼자서 다 한 워즈니악에게 겨우 700달러 받았다면서 워즈니악과 똑같이 나누기로한 약속대로 반인 350달러만 떼어줬다. 윌터 아이작슨의 스티브 잡스 전기에 이와 관련된 인터뷰가 있는데 아이작슨이 잡스에게 이에 대해 묻자 "왜 그런 말이 도는지 모르겠어요. 전 분명 돈을 제대로 주었습니다." 라는 말을 했다. 제대로 주긴 했는데 속인 금액에서 제대로 줬다는게 함정 이에 워즈니악과 아타리 사장이던 놀런 부슈널은 "우리는 분명 5,000달러를 지급했고, 워즈니악은 350달러만 받은 것이 맞다"며 확인사살했다. 기억 소거? 이에 워즈니악은 자서전에서 칩 50개 미만이면 700달러, 40개 미만이면 1000달러로 계약이 되어있는 줄 알았다고 한다.

이런 성격적 차이는, 애플을 떠난 이후에 워즈니악이 잡스를 "그냥 아는 사람"이라고 할 만큼 두사람을 멀어지게 만들었다. 나중에 잡스가 화해를 시도했고 표면적으로는화해한 듯 보이지만 워즈니악의 이후 기고글이나 인터뷰 등을 볼 때 잡스를 그다지 신뢰하지 않은 듯 하다. 특히 2010년 4월 26일에 뜬 기사를 보면 확실히 화해를 한 적 없음이 분명하다. 심지어 잡스가 워즈니악에게 자서전 축사를 부탁했는데 "싫어"라면서 거절한 일도 있고...

그래도 어떻게 해서 잡스가 죽기 직전에는 화해에 이른 듯하다. 잡스가 사망 직전 워즈니악에게 전화를 해서 애플로 돌아올 것을 요청하였다고 한다. [21] 잡스 사후에 워즈니악은 홈페이지에 잡스를 추모하는 사진을 올리기도 했고, 인터뷰에서 잡스를 추억하며 눈물을 훔치는, 가슴 찡한 모습을 보이기도 했다.

이와는 별개로 스티브 잡스가 공개적으로 숟가락 얹기를 하는 것은 엄격하게 반박하는 편이다. 일례로 위에 나온 "블루 박스" 에피소드는 잡스가 이 장치와 장치에 관련된 일화를 자신이 한 것으로 포장해서 인지도를 높였다.[22] 또한 애플 I 개발에 자신이 메모리 교체를 포함한, 다양한 제안을 해서 성공했다고 자찬하는 잡스에게 "잡스는 한 것이 없다"라고 비판했다...는 이야기도 있는데 이것은 사실이 아니다.

분명히 워즈니악은 잡스의 공로를 인정하고 있다. 잡스가 워즈니악만이 아름다운 보드를 만들 수 있었다고 하는 것처럼, 워즈니악 또한 부품을 구하는 일이나, 자본, 케이스 디자이너를 구하는 일, 올인원 패키지라는 발상, 무엇보다 퍼스널 컴퓨터를 파는 사업체를 구상한 일에 대해서 잡스의 공로를 분명히 인정하는 발언을 많이 해왔다.

워즈니악과 잡스의 관계가 틀어진 이유는 잡스가 숟가락 얹기를 시전했다고 생각해서가 아니라, 잡스가 애플을 떠난 워즈니악에게 너무 신경질적인 태도를 보였기 때문이다. 새 제품 보다는 기존 수익을 중시하는 이사회와 충돌이 잦았던 잡스는 애플의 통제권에 대한 집착이 강해졌으며, 워즈니악에게 애플 주식을 팔지 말것을 충고하기도 했다. 그런데 워즈니악이 애플 주식을 다른 직원들에게 나누어주는 것을 보고 신경질적으로 반응하였다. 잡스는 통제권을 쉽게 포기하는 워즈니악을 이해하기 힘들었던 것이다.

사이가 틀어진 가장 큰 이유 중 하나는 워즈니악이 애플을 떠나고 만능 리모콘을 만드는 작업 사업체를 구상하여 그 디자인을 프로그 디자인에 의뢰했는데, 프로그 디자인은 애플에게만 디자인을 독점 제공하도록 계약되어 있었기 때문이다. 이 사실을 안 스티브 잡스는 노발대발해서 워즈니악과 프로그 디자인에 법정 싸움까지 걸려했다. 스티브 잡스는 프로그 디자인과 애플이 함께 구축한 애플 브랜드 특유의 디자인이 다른 상품에 유출되고 적용되는 것을 경계한 것이라 민감하게 반응한 것이며 여기까지는 정당한 권리 주장이라 할 수 있는데, 문제는 필요이상으로 신경질적으로 반응하고 워즈니악을 너무 험하게 다룬것.

권리 주장만 하고 끝나면 될 것을, 애플 공동 창업자이자 친구인 워즈니악의 새 사업체를 망하게 하려는 듯 노골적으로 법정싸움을 걸고, 심지어 프로그 디자인에게 워즈니악을 위해 준비한 리모콘 디자인의 설계도를 요구하기도 하였다. 스티브 잡스는 여러 인터뷰에서 '정당한 권리주장'이라고 했지만, 아무리 객관적으로 봐도 사적인 감정이 많이 들어간 복수극. 이렇게 워즈니악에게 큰 마음의 상처를 준 잡스는, 애플을 떠나 NEXT를 운영하는 동안, 열 받은 워즈니악의 인터뷰로 큰 엿을 먹으며 앙갚음 당하게 된다.

이외에 워즈니악과 잡스의 관계나 틀어졌던 것은, 컴퓨터 시스템에 대한 사상 차이도 한몫한다. 워즈니악은 오픈 시스템의 추종자였으며 전설적인 해커다. 워즈니악은 전문가나 하비스트, 컴퓨터를 잘 다루는 사람들이 바닥부터 컴퓨터의 모든 것을 자유롭고 신나게 통제할 수 있으며 많은 포트를 제공해야 한다고 생각했으나, 스티브 잡스는 우아하게 사람의 인지를 방영하도록 의도된 가이드라인을 벗어난 프로그램을 용납하지 않는 통제광이었다.

잡스는 컴퓨터는 사람의 생각의 흐름을 따라야 하며 적절한 추상화 단계가 있으며, 엔드투엔드를 통해 우아하고 명확한 가이드라인과 미리 만들어진 창의적인 도구위에서 일반인들도 쉽게 컴퓨터를 쓸 수 있어야 한다고 생각했기 때문이다(POSIX가 잘 정의된 OS 위에 개발되는 프로그램들은 명확한 가이드라인과 권한, 잘 정의된 API를 따라 만들므로 안정성이 높다는 것을 생각하면 된다).

잡스의 통제광적인 모습은 워즈니악과 애플2를 만들때도 발현되어 애플2의 포트를 모뎀과 프린터 용도로 두개만 만들어야 한다는 주장을 펼치기로 하였다.

결론적으로 애플2가 출시될 당시의 컴퓨터는 전문가와 하비스트들의 영역이였으며, 애플2의 소비자들은 해커 정신아래 많은 선택권과 포트를 원하는 사람들이었으므로 애플2의 포트를 두개로 제약하고 통제하려는 잡스의 요구를 무시하고 포트를 확장 가능하게 만든 워즈니악의 선택은 탁월한 선택이었다. 하지만 현시대에 기계가 동작하는 방식을 추상성으로 적절히 가려 사람의 직관을 따르도록 컴퓨터를 만들며, 모바일 API를 활용하여 주어진 도구 위에 응용프로그램을 만드는 것을 "자유롭지 못하다"라고 비난하는 것은 말이 안되는 것 처럼, 사상의 차이이지 워즈니악이나 잡스 중 한명이 틀렸다는 의미는 아니다.

경쟁사 마이크로소프트의 창업자 빌 게이츠와 폴 앨런처럼 다른 사람과 공동으로 회사를 설립했다는 점은 비슷하나, 빌 게이츠와 폴 앨런은 둘 다 공학도 + 사업가적인 사람인 반면, 잡스와 워즈의 관계는 철저히 사업가적인 잡스와 철저히 공학도적인 워즈의 관계로 다소 다르다.

6. 한국 대중 사이에서의 인지도[편집]

워즈니악 자신은 2011년 3월에 대한민국을 방문했던 적이 있다. 물론 알아보는 사람은 극소수(...).공돌이라면 알아봤을 텐데... 지못미

잡스가 아이팟에서 아이폰으로 한국 대중 사이에서 이름을 알리고 온갖 성공신화로 치장되면서 특히 중장년층 사이에서는 성공한 기업가로써 인지도가 높지만, 워즈니악에 대한 인지도는 거의 전무한 수준.

2011년 11월 5일 방영된 무한도전 수학능력 특집에서 이 사람의 이름(풀네임도 아니다!)이 무한도전 vs 서울대 학생부 퀴즈 문제로 나왔는데, 대학생부가 유독 이 문제만은 굉장히 버벅거리면서 맞추었다...그의 한국 내 인지도를 다시금 깨닫게 해주었다...1등만 기억하는 더러운 세상

파일:gNWzikl.jpg
한국에서는 실직자로 잘 알려져 있다빅뱅 이론 자막제작자의 오역이다. 사실 저 말의 'jobs'를 직업으로 번역해도 워즈니악 없는 직업(...)이 되고, 잡스라고 해도 워즈니악 없는 잡스라고 해야 한다. 네이버와 구글에 "직장없는"까지 치면 바로 연관검색어가 완성될 정도로 짤방화되었다.

짤방을 보면서 머릿속에 '?'가 떠올랐다면 정상입니다

7. 매체에서[편집]


빅뱅 이론 시즌 4 에피소드 2에 출연했다. 등장해서 대놓고는 아니지만 슬쩍 스티브 잡스를 깠다. 무슨 짓을 해도 안 나올 것 같던 쉘든을 스스로 나오게 하는 위엄을 선보였다.

교향시편 에우레카7의 등장인물 '워즈'의 모델이 되었다. 퓨처라마에선 3010년에 워즈니악 너드 아카데미(Wozniak Nerd Academy) 운영 중에 있다.

파일:external/3.bp.blogspot.com/dvd18.jpg
파일:external/www.openlettersmonthly.com/jobs2.jpg
파일:external/img1.lostpic.net/0dc7dbf7f0bd2772013ea19987f68e08.jpg
스티브 잡스의 전기 영화에는 반드시, 비중있는 조연으로 출연한다. 1999년작 <실리콘 밸리의 해적들>, 2013년작 <잡스>, 2015년 10월 개봉한 <스티브 잡스> 모두에 등장. 극중 묘사는 고증에 맞춰서 수염 덥수룩한 털보에, 체구는 조금 비만형이고, 컴퓨터 자체에 심취한 공돌이 타입. 잡스의 외모를 돋보이게 만드는 효과를 담당

[1] 신형 맥 프로가 소개된 직후[2] 와즈니악, 줄여서 '와즈'라고 발음한다. Wozniak 영어 발음Wozniak 영어 발음 2[3] "The Wiz"라는 1978년작 뮤지컬 영화 제목을 비튼 것. 여기서 "Wiz"는 바로 오즈의 마법사를 가리킨다. 즉 워즈니악의 별명은 "마법사"였던 셈.[4] 11살 때부터 친구들과 전자 장치를 제작하기 시작했으며, 6학년 때 아마추어 무선 자격증을 아버지와 함께 취득했다.[5] 이때 시에라 엔터테인먼트에서 만든 미스테리 하우스라는 게임을 하면서 많은 위안을 얻었다고 한다. '내가 만든 애플 II로 이런 훌륭한 게임을 만들어줘서 감사하다'라고 윌리엄스 부부에게 편지를 보냈을 정도.[6] 워즈니악 본인은 개발에만 전념하고 싶었지 사내 정치나 경영에 전혀 신경쓰고 싶지 않았다.[7] 당시에도 워즈니악과 애플의 결별은 새로 떠오르는 매킨토시 사업과 애플 II 사업부의 상대적인 홀대 때문이었다고 여겨졌지만, 실제로 워즈니악은 복귀 이후엔 매킨토시 개발에 참여했다. 그러나 애플 II 사업부에서 일하는 개발자들을 위해 잡스에게 직접 말을 해본적이 있었고, 당연히 이는 무시되었다고 한다. 이는 애플에서 자신이 할 수 있는 것이 아무것도 없다는 무력감으로 이어졌다.[8] 근데 본인 말과는 다르게 매년 $120,000 정도 받는 것으로 추정된다! 이런 거짓말쟁이! 더 많이 받는 사람이 많나보지 실리콘 밸리에서 임직원이 연봉 $12만이면 엄청 낮은거다. 이정도는 대학원 졸업하고 경력 2년 쌓으면 받는 월급이다.[9] 그만둔 건 잡스다. 워즈니악은 애플 창업 후에 오래걸리긴 했어도 결국 졸업까지 다 해냈다.[10] 하드웨어와 소프트웨어 모두 워즈니악 혼자 만들었다.[11] 레딧의 무엇이든 물어보세요 코너[12] 여기서 잡스와 악연이 또 있는데, 워즈니악은 만능 리모콘 디자인을 애플 제품의 디자인을 담당하던 프로그 디자인사에 맡길려고 했는데, 잡스가 그걸 알고는 프로그 디자인 회사 사장에게 Anything you do for Woz, belongs to me!라는 협박을 가해서 워즈니악과 관련된 업무를 받지 못하게 했다. 물론 언론은 잡스의 옹졸함을 신나게 까댔다.[13] 전 마누라의 비위를 맞춰줄려고 가입했다고 자서전에 적어놨다.[14] 하기사 요즘에야 광범위한 인터넷 문화가 정착되어 여러 밈들이나 각종 정보들이 널리 알려지게 된 것이지 당시의 미국 시대상을 생각해보면 워즈 뿐만 아니라 주변사람 모두가 악마의 숫자 666이라는 낭설을 모른 것도 당연하다.[15] 잘 읽어보자. 그의 이름 철자를 뒤집은 것이다.[16] 참고로 이 공짜전화에 대한 일화는http://www.hankyung.com/news/app/newsview.php?type=2&aid=2011110480071&nid=910&sid=0116 역시 해킹은 짱[17] 이 일화는 잡스가 키노트에서 한 번 소개한 적이 있다. 키노트 도중 키노트를 진행 중인 컴퓨터가 먹통이 돼 화면이 안 넘어가는 대참사가 발생하자 문제를 고칠 동안 이 일화를 다소 코믹하게 소개한 것. 빌 게이츠도 윈도우 95 시연회 때 블루스크린이 뜨자 아무렇지도 않게 농담으로 위기를 넘긴 적이 있었다. 영원히 고통받는 TmaxOS[18] 참고로 워즈니악도 폴란드계이다(...). 워즈니악은 폴란드계 성 중에 10번째로 흔한 성 보즈니아크(Wozniak)의 변형.[19] 워즈의 아버지가 몇차례 아들에게 잡스의 배신에 대한 우려를 표했다고 한다. 워즈니악의 회고에 따르면, 잡스가 남을 무시하는 성격은 누구한테나 그런거고 그래도 잡스는 절대 자신에게 소리를 지르거나 화를 내진 않았다고 한다. 반대로 자신은 불만이 있어도 말을 못하는 성격이었다고.[20] 세계 최초의 벽돌깨기 게임 Breakout을 개발하기 위해서는 게임기 설계상 칩이 130~170개가 들어가야 작동할 수 있었는데 아타리는 이를 70~100개로 만들길 원했다. 이때 우리의 굇수 워즈니악은 낮에는 HP에서 일을 하면서 밤에는 개발에 몰두하여 4일간 밤을 지새워서 44개로 완성.. 아타리의 경영진은 성과에 감명받아 잡스에게 예정보다 아주 많은 보수를 준것. 그러나 워즈니악의 디자인이 워낙 압축됐고 복잡해서 아타리의 제조 설비에 적용이 어려워 아타리측에서 생산에 적합하게 수정해야 했고 결과적으로 100개 가량의 칩이 필요했다.[21] 그러나 애플엔 자신과 같은 사람이 필요하지 않다고 거절했다.[22] 참고로 이 장치도 워즈니악 혼자서 개발하였고, 잡스는 학생들에게 장사 수완만 보였다고 한다.


개발자로서 잡스를 좋아하지는 않는다. 그러나 아름다움을 볼 줄 아는 눈과 최고의 인재만을 알아보는 눈을 가졌다는 것은 인정한다. 그리고 경험에서 올바른 이론을 뽑아 낼 줄도 안다. 잡스의 말대로 싫어하지만 무시할 수 없다. 아마 잡스 이 후에는 애플이 휘청거릴 정도의 위대한 도전을 할 일을 절대 없을 것이다. Jonathan Ive Chief Design Officer and Steve jobs and wozniak https://www.theguardian.com/technology/2014/jul/08/steve-wozniakr-steve-jobs-apple from. Apple. Jonathan Ive is Apple’s Chief Design Officer, reporting to CEO Tim Cook. Jony is responsible for all design at Apple, including the look and feel of Apple hardware, user interface, packaging, major architectural projects such as Apple Park and Apple’s retail stores, as well as new ideas and future initiatives. Since 1996, Jony has led Apple’s design team, which is widely regarded as one of the world’s best. He holds over 5,000 patents and has been recognized with numerous design awards, including the Design Museum London’s first Designer of the Year in 2003, the Design and Art Direction (D&AD) President’s Award in 2005 and the Cooper-Hewitt National Design Museum’s Product Design Award in 2007. In 2012, D&AD named Jony and his team the Best Design Studio of the past 50 years. Their work is featured in the permanent collections of museums around the world, including the Museum of Modern Art in New York and the Pompidou in Paris. Jony earned a Bachelor of Arts degree at Newcastle Polytechnic. As an undergraduate, he twice won the Royal Society of Arts’ prestigious Student Design Award, and years later the RSA awarded him the title of Royal Designer for Industry. He also holds honorary doctorates from the Royal College of Art, the Rhode Island School of Design and Northumbria University. A native of London, Sir Jonathan Ive was made a Knight Commander of the British Empire in 2013 “for services to design and enterprise.”

+ Recent posts