게임을 구현함에 따라 조금씩 프로그램이 길어졌습니다. 제 4장에서는 기능의 일부를 별개의 메소드로 분할하는 방법으로 프로그램을 읽기 쉽게 할 수 있었습니다. 여기서는 프로그램을 읽기 쉽고 관리하기 쉽게 하기 위해 클래스를 만들어 봅니다.
Dice 클래스를 만들어 보자.
이 장에서는 주사위를 의미하는 클래스를 만들어봅니다. "클래스를 만든다"라고 하면 불안해 할지도 모릅니다만, 어렵지 않으니 도전해봅시다.
우선 클래스에 대해서 복습해 봅시다. 클래스라는 것은 "데이터를 조작하는 명령을 준비해놓은 도구함"과 같은 것으로 필드, 컨스트럭터, 프로퍼티, 메소드, 이벤트라는 멤버를 가지고 있습니다. 클래스를 만들 때에는 어떠한 멤버를 만들것인가를 설계할 필요가 있습니다. 이번에는 다음과 같은 멤버를 가진 클래스를 작성합니다.
(중략)
필드라는 것은 클래스 속의 데이터를 말합니다. 이번은 _number라는 int형 변수를 선언합니다. 클래스 속에서만 액세스 가능하고 클래스 밖에서는 액세스 할 수 없습니다. 변수명에 언더스코어(_)를 붙이고 있는 것은 이 후에 선얼할 프로퍼티명과 중복되지 않도록 하기 위함입니다.
컨스트럭터라는 것은 gcnew()로 클래스를 인스턴스화 할 때 움직이는 메소드입니다. 다시말해 초기화 전용의 메소드입니다. 이번에는 Dice()라는 초기화와 Dice(int형 인수)라는 초기화 2개를 작성합니다. 전자의 방법으로 초기화하면 최초의 주사위 값은 1이 되고, 후자의 방법으로 초기화한 경우 인수의 값이 주사위 값으로 설정됩니다.
프로퍼티는 클래스의 데이터를 의미합니다만, 실제로는 필드의 값을 넣고빼는 역할을 하고 있습니다. 필드에 값을 설정하는 set용 Number프로퍼티와 필드의 값을 취득하는 get용 Number 프로퍼티를 만듭니다.
메소드는 클래스로의 명령으로 이번에는 주사위의 값을 랜덤으로 변화시키는 Shake()라는 명령을 작성합니다.
이벤트는 클래스에서 발생한 변경등의 통지를 하는 장치입니다. 이번에는 구현하지 않습니다.
또 마지막으로 주의할 것이 1개의 클래스를 만들기 위해서는 2개의 파일이 필요하다는 것입니다. 1개는 헤더 파일이고, 하나는 소스 파일입니다.
클래스를 사용해 보자 ------------------- 제 1장에서는 오브젝트 지향의 메리트는 "클래스 속의 프로그램을 몰라도 사용방법만 이해하면 그 기능을 이용할 수 있다"고 설명했습니다. 그 예로 "쉐프에게 재료를 넘기고 조리의 방법을 지시하는 것으로 요리를 만들 수 있다"고 설명했습니다. 여기서 다시 쉐프의 예로 클래스를 이용하는 순서에 대해서 설명합니다.
용어-- 클래스의 멤버 클래스는 프로퍼티와 메소드만이 아니라 필드, 컨스트럭터, 이벤트등의 조합으로도 구성됩니다. 그리고, 이것들 모두를 모아 클래스 멤버라 부릅니다. 또 필드와 컨스트럭터에 대해서는 5장에서 설명합니다.
클래스를 사용하는데에는 다음 3개의 포인트가 중요합니다. 1) 인스턴스화 2)프로퍼티의 설정과 참조 3)메소드의 실행
우선 클래스를 사용하려면 인스턴스라는 실체를 생성할 필요가 있습니다. 이것을 인스턴스화라 합니다. 클래스는 어디까지나 설계도이므로 인스턴스화에 의해 사용할 수 있게 됩니다. 쉐프라는 직함으로는 요리를 만들 수 없으며 쉐프를 고용하는(인스턴스화) 것으로 요리를 만들 수 있게 됩니다. 또, 클래스의 특징은 인스턴스마다 데이터를 가지고 있다는 것입니다. 클래스가 가진 데이터를 프로퍼티라 부릅니다. 쉐프 클래스를 2명 인스턴스화 하면 2종류의 다른 재료를 프로퍼티로 설정할 수 있습니다. 마지막으로 데이터를 조작하는 클래스의 명령인 메소드를 실행합니다. 쉐프의 예를 들자면 고기를 가진 쉐프에 "구워주세요"라고 명령하고, 채소를 가진 쉐프에게 "스프를 만들어주세요"라고 명령합니다. 이렇게 클래스를 이용하려면 "쉐프를 채용해(인스턴스화) 개별의 재료를 건네고(프로퍼티), 지시를 내리는(메소드)" 순서로 실행합니다. 그러면 실제 게임에서 클래스를 인스턴스화 해보겠습니다.
(중략)
코드 해설
여기서 난수를 발생할 수 있는 Random클래스를 사용합니다. 난수란 말 그대로 제멋대로 수를 내는 것입니다.
1] Random^ randomDice;
Random 클래스를 randomDice란 이름의 변수로 선언합니다. 이렇게 클래스의 변수를 선언할 때, 다음의 구문을 사용합니다.
클래스명^ 변수명;
int형등의 기본형 변수와 다르게 클래스 명 뒤에 "^"이라는 매니지코드의 클래스 인스턴스 영역을 나타내는 기호를 습니다. 이기호는 캐럿 또는 햇기호라 불립니다. 이렇게 인스턴스를 격납하는 변수를 선언할 때 이 기호를 사용합니다.
2] randomDice = gcnew Random();
클래스를 사용하려면 인스턴스화라는 초기화가 필요합니다. gcnew라는 키워드를 사용해 인스턴스화 하는 클래스의 이름을 지정합니다. 클래스에 따라서는 이름 뒤에 인수를 지정할 수 있습니다. 여기서는 Random 클래스를 지정하고 있기 때문에 Random 클래스라는 설게도에 근거해 randomDice가 인스턴스화됩니다.
변수명 = gcnew 클래스명();
3] int diceNumber; diceNumber = randomDice->Next(1,7);
주사위의 눈을 격납하기위해 int형 diceNumber란 변수를 선언하고 Random 클래스의 Next메소드를 부르고 있습니다. 이 Next메소드에는 1과 1이라는 인수를 부여합니다. 그 결과 1이상 7미만(1~6)의 난수가 발생되어 diceNumber에 격납됩니다. 여기서는 메소드로부터 게산된 결과를 얻고있다는 걸 주목해 주세요. 이것을 메소드의 반환값이라고 합니다. 여기서는 Next메소드가 1~6의 숫자를 반환값으로 생성합니다.
4] Debug.... (중략)
힌트 (중략) 치형과 참조형 ------------ .NET Framework의 매니지코드에서는 변수의 형에 치형과 참조형의 2종류가 있습니다. int, bool, float와 같은 기본형과 헬프를 볼 대에 "구조체: value class"라 정의 되어있는 형은 치형입니다. 이것 이외의 클래스 (Random과 String등)의 "클래스:ref class"라 정의 되어있는 형은 참조형입니다. 또, 치형과 참조형에스는 몇개의 다른 점이 있습니다. 치형은 그 변수의 값을 직접 격납하는 것에 반해, 참조형은 실체로의 참조를 격납합니다. 치형은 초기화에 초기값이 설정됩니다만, 참조형은 초기화시에 Null이 설정됩니다. 또, 대입할 때 치형은 그대로 값이 대입됩니다만, 참조형은 값이 아니 참조 정보(어드레스)가 대입됩니다. 참조형의 변수를 사용할 경우에는 이런 것을 이해해둘 필요가 있습니다.
macro list -- List all the macros defined using the `macro define' command
macro undef -- Remove the definition of the C/C++ preprocessor macro with the given name
maintenance agent -- Translate an expression into remote agent bytecode
maintenance check-symtabs -- Check consistency of psymtabs and symtabs
maintenance cplus -- C++ maintenance commands
maintenance demangle -- Demangle a C++/ObjC mangled name
maintenance deprecate -- Deprecate a command
maintenance dump-me -- Get fatal error; make debugger dump its core
maintenance dump-packets -- Print the packet log buffer
maintenance i386-prologue-parser -- Run the i386 prologue analyzer on a function
maintenance info -- Commands for showing internal info about the program being debugged
maintenance internal-error -- Give GDB an internal error
maintenance internal-warning -- Give GDB an internal warning
maintenance interval -- Set the report of low-level interval timers
maintenance list-kexts -- List kexts loaded by the kernel (when kernel debugging)
maintenance packet -- Send an arbitrary packet to a remote target
maintenance print -- Maintenance command for printing GDB internal state
maintenance report-interval -- Report the summary values for all the low-level interval timers
maintenance set -- Set GDB internal variables used by the GDB maintainer
maintenance sharedlibrary -- Commands for internal sharedlibrary manipulation
maintenance show -- Show GDB internal variables used by the GDB maintainer
maintenance show-debug-regs -- Set whether to show variables that mirror the x86 debug registers
maintenance space -- Set the display of space usage
maintenance time -- Set the display of time usage
maintenance translate-address -- Translate a section name and address to a symbol
maintenance undeprecate -- Undeprecate a command
compare-sections -- Compare section data on target to the exec file
complete -- List the completions for the rest of the line as a command
create-checkpoint -- Create a checkpoint
load-plugin -- Usage: load-plugin <plugin>
monitor -- Send a command to the remote monitor (remote targets only)
now -- Go to latest original execution line
redo -- Forward to next checkpoint
remote -- Send a command to the remote monitor
rollback -- Roll back to a checkpoint
stop -- There is no `stop' command
undo -- Back to last checkpoint
update -- Re-read current state information from inferior
overlay auto -- Enable automatic overlay debugging
overlay list-overlays -- List mappings of overlay sections
overlay load-target -- Read the overlay mapping state from the target
overlay manual -- Enable overlay debugging
overlay map-overlay -- Assert that an overlay section is mapped
overlay off -- Disable overlay debugging
overlay unmap-overlay -- Assert that an overlay section is unmapped
advance -- Continue the program up to the given location (same form as args for break command)
attach -- Attach to a process or file outside of GDB
continue -- Continue program being debugged
detach -- Detach a process or file previously attached
disconnect -- Disconnect from a target
finish -- Execute until selected stack frame returns
handle -- Specify how to handle a signal
interrupt -- Interrupt the execution of the debugged program
jump -- Continue program being debugged at specified line or address
kdp-detach -- Reset a (possibly disconnected) remote Mac OS X kernel
kdp-kernelversion -- Print the version of a remote Mac OS X kernel
kdp-reattach -- Re-attach to a (possibly connected) remote Mac OS X kernel
kdp-reboot -- Reboot a connected remote Mac OS X kernel
kill -- Kill execution of program being debugged
next -- Step program
nexti -- Step one instruction
run -- Start debugged program
sharedlibrary -- Commands for shared library manipulation
signal -- Continue program giving it signal specified by the argument
start -- Run the debugged program until the beginning of the main procedure
step -- Step program until it reaches a different source line
stepi -- Step one instruction exactly
sym-dump -- Print the contents of the specified SYM-format symbol file
target -- Connect to a target machine or process
thread -- Use this command to switch between threads
until -- Execute until the program reaches a source line greater than the current
set annotate -- Set annotation_level
set architecture -- Set architecture of target
set args -- Set argument list to give program being debugged when it is started
set auto-raise-load-levels -- Set if GDB should raise the symbol loading level on all frames found in backtraces
set auto-solib-add -- Set autoloading of shared library symbols
set backtrace -- Set backtrace specific variables
set breakpoint -- Breakpoint specific settings
set call-po-at-unsafe-times -- Set whether to override the check for potentially unsafe situations before calling print-object
set can-use-hw-watchpoints -- Set debugger's willingness to use watchpoint hardware
set case-sensitive -- Set case sensitivity in name search
set charset -- Set the host and target character sets
set check -- Set the status of the type/range checker
set checkpointing -- Set automatic creation of checkpoints
set coerce-float-to-double -- Set coercion of floats to doubles when calling functions
set complaints -- Set max number of complaints about incorrect symbols
set confirm -- Set whether to confirm potentially dangerous operations
set cp-abi -- Set the ABI used for inspecting C++ objects
set darwin_kernel-debug-level -- Set level of verbosity for Darwin Kernel debugging information
set dcache-linesize-power -- Set the power for the cache line size
set debug -- Generic command for setting gdb debugging flags
set debug-file-directory -- Set the directory where separate debug symbols are searched for
set debugvarobj -- Set varobj debugging
set demangle-style -- Set the current C++ demangling style
set disable-aslr -- Set if GDB should disable shared library address randomization
set disable-inferior-function-calls -- Set disabling of gdb from running calls in the debugee's context
set disassembly-flavor -- Set the disassembly flavor
set disassembly-name-length -- Set the maximum length of characters to print in the symbol name in disassembly output
set download-write-size -- Set the write size used when downloading a program
set editing -- Set editing of command lines as they are typed
set endian -- Set endianness of target
set environment -- Set environment variable value to give the program
set exception-catch-type-regexp -- Set exception regexp
set exception-throw-type-regexp -- Set throw regexp
set exec-argv0 -- Set the value of argv[0] to be passed to the target executable
set exec-done-display -- Set notification of completion for asynchronous execution commands
set exec-pathname -- Set the pathname to be used to start the target executable
set extension-language -- Set mapping between filename extension and source language
set follow-fork-mode -- Set debugger response to a program call of fork or vfork
set forking-checkpoints -- Set forking to create checkpoints
set function-end-absolute -- Set if N_FUN end-of-function symbols use absolute addresses on non-GCC files
set gnutarget -- (Set the current BFD target
set height -- Set number of lines gdb thinks are in a page
set history -- Generic command for setting command history parameters
set host-charset -- Set the host character set
set inferior-auto-start-cfm -- Set if GDB should enable debugging of CFM shared libraries
set inferior-auto-start-dyld -- Set if GDB should enable debugging of dyld shared libraries
set inferior-bind-exception-port -- Set if GDB should bind the task exception port
set inferior-ptrace -- Set if GDB should attach to the subprocess using ptrace ()
set inferior-ptrace-on-attach -- Set if GDB should attach to the subprocess using ptrace ()
set inferior-tty -- Set terminal for future runs of program being debugged
set inform-optimized -- Set gdb informing you when you are debugging optimized code
set inlined-stepping -- Set the ability to maneuver through inlined function calls as if they were normal calls
set input-radix -- Set default input radix for entering numbers
set interpreter -- Set the interpreter for gdb
set kdp-debug-level -- Set level of verbosity for KDP debugging information
set kdp-default-host-type -- Set CPU type to be used for hosts providing incorrect information (powerpc/ia32)
set kdp-default-port -- Set default UDP port on which to attempt to contact KDP
set kdp-exception-sequence-number -- Set current sequence number for KDP exception transactions
set kdp-retries -- Set number of UDP retries for (non-exception) KDP transactions
set kdp-sequence-number -- Set current sequence number for KDP transactions
set kdp-timeout -- Set UDP timeout in milliseconds for (non-exception) KDP transactions
set kext-symbol-file-path -- Set the directory where kextutil-generated sym files are searched for
set language -- Set the current source language
set let-po-run-all-threads -- Set whether po should run all threads if it can't safely run only the current thread
set listsize -- Set number of source lines gdb will list by default
set locate-dsym -- Set locate dSYM files using the DebugSymbols framework
set logging -- Set logging options
set lookup-objc-class -- Set whether we should attempt to lookup Obj-C classes when we resolve symbols
set mach-o-process-exports -- Set if GDB should process indirect function stub symbols from object files
set max-checkpoints -- Set the maximum number of checkpoints allowed (-1 == unlimited)
set max-user-call-depth -- Set the max call depth for user-defined commands
set mi-show-protections -- Set whether to show "public"
set mi-timings-enabled -- Set whether timing information is displayed for mi commands
set minimal-signal-handling -- Set whether we run with a minimal signal handling set
set mmap-string-tables -- Set if GDB should use mmap() to read STABS info
set mmap-symbol-files -- Set if GDB should use mmap() to read from external symbol files
set objc-class-method-limit -- Set the maximum number of class methods we scan before deciding we are looking at an uninitialized object
set objc-exceptions-interrupt-hand-call-fns -- Set whether hitting an ObjC exception throw interrupts a function called by hand from the debugger
set objc-non-blocking-mode -- Set whether all inferior function calls should use the objc non-blocking mode
set objc-version -- Set the current Objc runtime version
set opaque-type-resolution -- Set resolution of opaque struct/class/union types (if set before loading symbols)
set os -- Set operating system
set osabi -- Set OS ABI of target
set output-radix -- Set default output radix for printing of values
set overload-resolution -- Set overload resolution in evaluating C++ functions
set pagination -- Set state of pagination
set pathname-substitutions -- Set string substitutions to be used when searching for source files
set print -- Generic command for setting how things print
set prompt -- Set gdb's prompt
set radix -- Set default input and output number radices
set read-type-psyms -- Set if we should create partial symbols for types
set remote -- Remote protocol specific variables
set remoteaddresssize -- Set the maximum size of the address (in bits) in a memory packet
set remotebaud -- Set baud rate for remote serial I/O
set remotebreak -- Set whether to send break if interrupted
set remotecache -- Set cache use for remote targets
set remotedevice -- Set device for remote serial I/O
set remotelogbase -- Set numerical base for remote session logging
set remotelogfile -- Set filename for remote session recording
set remotetimeout -- Set timeout limit to wait for target to respond
set remotewritesize -- Set the maximum number of bytes per memory write packet (deprecated)
set restore -- Set restore specific command settings
set scheduler-locking -- Set mode for locking scheduler during execution
set serial -- Set default serial/parallel port configuration
set sharedlibrary -- Generic command for setting shlib settings
set shlib-path-substitutions -- Set path substitutions to be used when loading shared libraries
set show_breakpoint_hit_counts -- Set if GDB should show breakpoint hit counts
set solib-absolute-prefix -- Set prefix for loading absolute shared library symbol files
set solib-search-path -- Set the search path for loading non-absolute shared library symbol files
set start-with-shell -- Set if GDB should use shell to invoke inferior (performs argument expansion in shell)
set step-mode -- Set mode of the step operation
set stop-on-solib-events -- Set stopping for shared library events
set struct-convention -- Set the convention for returning small structs
set subsystem-checkpointing -- Set checkpointing of subsystems
set symbol-reloading -- Set dynamic symbol table reloading multiple times in one run
set target-charset -- Set the target character set
set target-function-call-timeout -- Set a timeout for gdb issued function calls in the target program
set trust-readonly-sections -- Set mode for reading from readonly sections
set unwindonsignal -- Set unwinding of stack if a signal is received while in a call dummy
set use-array-stride -- Set if GDB should honor the 'stride' parameter of array types
set use-eh-frame-info -- Set if GDB should use the EH frame/DWARF CFI information to backtrace
set variable -- Evaluate expression EXP and assign result to variable VAR
set varobj-print-object -- Set varobj to construct children using the most specific class type
set varobj-runs-all-threads -- Set to run all threads when evaluating varobjs
set verbose -- Set verbosity
set watchdog -- Set watchdog timer
set width -- Set number of characters gdb thinks are in a line
set write -- Set writing into executable and core files
sharedlibrary add-symbol-file -- Add a symbol file
sharedlibrary apply-load-rules -- Apply the current load-rules to the existing shared library state
sharedlibrary cache-symfile -- Generate persistent caches of symbol files for a specified executable
sharedlibrary cache-symfiles -- Generate persistent caches of symbol files for the current executable state
sharedlibrary remove-symbol-file -- Remove a symbol file
sharedlibrary section-info -- Get the section info for a library (given by the index from "info sharedlibrary")
sharedlibrary set-load-state -- Set the load level of a library (given by the index from "info sharedlibrary")
sharedlibrary update -- Process all pending DYLD events
show annotate -- Show annotation_level
show architecture -- Show architecture of target
show args -- Show argument list to give program being debugged when it is started
show auto-raise-load-levels -- Show if GDB should raise the symbol loading level on all frames found in backtraces
show auto-solib-add -- Show autoloading of shared library symbols
show backtrace -- Show backtrace specific variables
show breakpoint -- Breakpoint specific settings
show call-po-at-unsafe-times -- Show whether to override the check for potentially unsafe situations before calling print-object
show can-use-hw-watchpoints -- Show debugger's willingness to use watchpoint hardware
show case-sensitive -- Show case sensitivity in name search
show charset -- Show the host and target character sets
show check -- Show the status of the type/range checker
show checkpointing -- Show automatic creation of checkpoints
show coerce-float-to-double -- Show coercion of floats to doubles when calling functions
show commands -- Show the history of commands you typed
show complaints -- Show max number of complaints about incorrect symbols
show confirm -- Show whether to confirm potentially dangerous operations
show convenience -- Debugger convenience ("$foo") variables
show copying -- Conditions for redistributing copies of GDB
show cp-abi -- Show the ABI used for inspecting C++ objects
show darwin_kernel-debug-level -- Show level of verbosity for Darwin Kernel debugging information
show dcache-linesize-power -- Show the power for the cache line size
show debug -- Generic command for showing gdb debugging flags
show debug-file-directory -- Show the directory where separate debug symbols are searched for
show debugvarobj -- Show varobj debugging
show demangle-style -- Show the current C++ demangling style
show directories -- Current search path for finding source files
show disable-aslr -- Show if GDB should disable shared library address randomization
show disable-inferior-function-calls -- Show disabling of gdb from running calls in the debugee's context
show disassembly-flavor -- Show the disassembly flavor
show disassembly-name-length -- Show the maximum length of characters to print in the symbol name in disassembly output
show download-write-size -- Show the write size used when downloading a program
show editing -- Show editing of command lines as they are typed
show endian -- Show endianness of target
show environment -- The environment to give the program
show exception-catch-type-regexp -- Show exception regexp
show exception-throw-type-regexp -- Show throw regexp
show exec-argv0 -- X
show exec-done-display -- Show notification of completion for asynchronous execution commands
show exec-pathname -- Show the pathname to be used to start the target executable
show extension-language -- Show mapping between filename extension and source language
show follow-fork-mode -- Show debugger response to a program call of fork or vfork
show forking-checkpoints -- Show forking to create checkpoints
show function-end-absolute -- Show if N_FUN end-of-function symbols use absolute addresses on non-GCC files
show gnutarget -- Show the current BFD target
show height -- Show number of lines gdb thinks are in a page
show history -- Generic command for showing command history parameters
show host-charset -- Show the host character set
show inferior-auto-start-cfm -- Show if GDB should enable debugging of CFM shared libraries
show inferior-auto-start-dyld -- Show if GDB should enable debugging of dyld shared libraries
show inferior-bind-exception-port -- Show if GDB should bind the task exception port
show inferior-ptrace -- Show if GDB should attach to the subprocess using ptrace ()
show inferior-ptrace-on-attach -- Show if GDB should attach to the subprocess using ptrace ()
show inferior-tty -- Show terminal for future runs of program being debugged
show inform-optimized -- Show gdb informing you when you are debugging optimized code
show inlined-stepping -- Show the ability to maneuver through inlined function calls as if they were normal calls
show input-radix -- Show default input radix for entering numbers
show interpreter -- Show the interpreter for gdb
show kdp-debug-level -- Show level of verbosity for KDP debugging information
show kdp-default-host-type -- Show CPU type to be used for hosts providing incorrect information (powerpc/ia32)
show kdp-default-port -- Show default UDP port on which to attempt to contact KDP
show kdp-exception-sequence-number -- Show current sequence number for KDP exception transactions
show kdp-retries -- Show number of UDP retries for (non-exception) KDP transactions
show kdp-sequence-number -- Show current sequence number for KDP transactions
show kdp-timeout -- Show UDP timeout in milliseconds for (non-exception) KDP transactions
show kext-symbol-file-path -- Show the directory where kextutil-generated sym files are searched for
show language -- Show the current source language
show let-po-run-all-threads -- Show whether po should run all threads if it can't safely run only the current thread
show listsize -- Show number of source lines gdb will list by default
show locate-dsym -- Show locate dSYM files using the DebugSymbols framework
show logging -- Show logging options
show lookup-objc-class -- Show whether we should attempt to lookup Obj-C classes when we resolve symbols
show mach-o-process-exports -- Show if GDB should process indirect function stub symbols from object files
show max-checkpoints -- Show the maximum number of checkpoints allowed (-1 == unlimited)
show max-user-call-depth -- Show the max call depth for user-defined commands
show mi-show-protections -- Show whether to show "public"
show mi-timings-enabled -- Show whether timing information is displayed for mi commands
show minimal-signal-handling -- Show whether we run with a minimal signal handling set
show mmap-string-tables -- Show if GDB should use mmap() to read STABS info
show mmap-symbol-files -- Show if GDB should use mmap() to read from external symbol files
show objc-class-method-limit -- Show the maximum number of class methods we scan before deciding we are looking at an uninitialized object
show objc-exceptions-interrupt-hand-call-fns -- Show whether hitting an ObjC exception throw interrupts a function called by hand from the debugger
show objc-non-blocking-mode -- Show whether all inferior function calls should use the objc non-blocking mode
show objc-version -- Show the current Objc runtime version
show opaque-type-resolution -- Show resolution of opaque struct/class/union types (if set before loading symbols)
show os -- Show operating system
show osabi -- Show OS ABI of target
show output-radix -- Show default output radix for printing of values
show overload-resolution -- Show overload resolution in evaluating C++ functions
show pagination -- Show state of pagination
show pathname-substitutions -- Show string substitutions to be used when searching for source files
show paths -- Current search path for finding object files
show print -- Generic command for showing print settings
show prompt -- Show gdb's prompt
show radix -- Show the default input and output number radices
show read-type-psyms -- Show if we should create partial symbols for types
show remote -- Remote protocol specific variables
show remoteaddresssize -- Show the maximum size of the address (in bits) in a memory packet
show remotebaud -- Show baud rate for remote serial I/O
show remotebreak -- Show whether to send break if interrupted
show remotecache -- Show cache use for remote targets
show remotedevice -- Show device for remote serial I/O
show remotelogbase -- Show numerical base for remote session logging
show remotelogfile -- Show filename for remote session recording
show remotetimeout -- Show timeout limit to wait for target to respond
show remotewritesize -- Show the maximum number of bytes per memory write packet (deprecated)
show restore -- Show current restore specific command settings
show scheduler-locking -- Show mode for locking scheduler during execution
show serial -- Show default serial/parallel port configuration
show sharedlibrary -- Generic command for showing shlib settings
show shlib-path-substitutions -- Show path substitutions to be used when loading shared libraries
show show_breakpoint_hit_counts -- Set if GDB should show breakpoint hit counts
show solib-absolute-prefix -- Show prefix for loading absolute shared library symbol files
show solib-search-path -- Show the search path for loading non-absolute shared library symbol files
show start-with-shell -- Show if GDB should use shell to invoke inferior (performs argument expansion in shell)
show step-mode -- Show mode of the step operation
show stop-on-solib-events -- Show stopping for shared library events
show struct-convention -- Show the convention for returning small structs
show subsystem-checkpointing -- Show checkpointing of subsystems
show symbol-reloading -- Show dynamic symbol table reloading multiple times in one run
show target-charset -- Show the target character set
show target-function-call-timeout -- Show the timeout for gdb issued function calls in the target program
show trust-readonly-sections -- Show mode for reading from readonly sections
show unwindonsignal -- Show unwinding of stack if a signal is received while in a call dummy
show use-array-stride -- Show if GDB should honor the 'stride' parameter of array types
show use-eh-frame-info -- Show if GDB should use the EH frame/DWARF CFI information to backtrace
show user -- Show definitions of user defined commands
show values -- Elements of value history around item number IDX (or last ten)
show varobj-print-object -- Abc
show varobj-runs-all-threads -- Set to run all threads when evaluating varobjs
show verbose -- Show verbosity
show version -- Show what version of GDB this is
show warranty -- Various kinds of warranty you do not have
show watchdog -- Show watchdog timer
show width -- Show number of characters gdb thinks are in a line
show write -- Show writing into executable and core files
backtrace -- Print backtrace of all stack frames
bt -- Print backtrace of all stack frames
down -- Select and print stack frame called by this one
frame -- Select and print a stack frame
return -- Make selected stack frame return to its caller
select-frame -- Select a stack frame without printing anything
up -- Select and print stack frame that called this one
info -- Generic command for showing things about the program being debugged
macro -- Prefix for commands dealing with C preprocessor macros
show -- Generic command for showing things about the debugger
apropos -- Search for commands matching a REGEXP
define -- Define a new command name
document -- Document a user-defined command
dont-repeat -- Don't repeat this command
down-silently -- Same as the `down' command
echo -- Print a constant string
help -- Print list of commands
if -- Execute nested commands once IF the conditional expression is non zero
interpreter-exec -- Execute a command in an interpreter
make -- Run the ``make'' program using the rest of the line as arguments
open -- Open the named source file in an application determined by LaunchServices
overlay -- Commands for debugging overlays
quit -- Exit gdb
shell -- Execute the rest of the line as a shell command
source -- Read commands from a file named FILE
up-silently -- Same as the `up' command
while -- Execute nested commands WHILE the conditional expression is non zero
target async -- Use a remote computer via a serial line
target child -- Unix child process (started by the "run" command)
target core-macho -- Use a core file as a target
target darwin-kernel -- Debug a running Darwin kernel; use 'attach' to begin
target exec -- Use an executable file as a target
target extended-async -- Use a remote computer via a serial line
target extended-remote -- Use a remote computer via a serial line
target macos-child -- Mac OS X child process (started by the "run" command)
target macos-exec -- Mac OS X executable
target remote -- Use a remote computer via a serial line
target remote-kdp -- Remotely debug a Mac OS X system using KDP
target remote-macosx -- Connect to a remote macosx device with shared library support using remote target
target remote-mobile -- Connect to a remote mobile device
tfind end -- Synonym for 'none'
tfind line -- Select a trace frame by source line
tfind none -- De-select any trace frame and resume 'live' debugging
tfind outside -- Select a trace frame whose PC is outside the given range
tfind pc -- Select a trace frame by PC
tfind range -- Select a trace frame whose PC is in the given range
tfind start -- Select the first trace frame in the trace buffer
tfind tracepoint -- Select a trace frame by tracepoint number
thread apply -- Apply a command to a list of threads
thread dont-suspend-while-stepping -- Usage: on|off <THREAD ID>|-port <EXPR>Toggle whether to not suspend this thread while single stepping the target on or off
thread resume -- Decrement the suspend count of a thread
thread suspend -- Increment the suspend count of a thread
actions -- Specify the actions to be taken at a tracepoint
collect -- Specify one or more data items to be collected at a tracepoint
end -- Ends a list of commands or actions
passcount -- Set the passcount for a tracepoint
save-tracepoints -- Save current tracepoint definitions as a script
tdump -- Print everything collected at the current tracepoint
tfind -- Select a trace frame;
trace -- Set a tracepoint at a specified line or function or address
tstart -- Start trace data collection
tstatus -- Display the status of the current trace data collection
tstop -- Stop trace data collection
while-stepping -- Specify single-stepping behavior at a tracepoint
unset environment -- Cancel environment variable VAR for the program
Usage: mdutil -pEsa -i (on|off) volume ... Utility to manage Spotlight indexes. -pPublish metadata. -i (on|off)Turn indexing on or off. -EErase and rebuild index. -sPrint indexing status. -aApply command to all volumes. -vDisplay verbose information. NOTE: Run as owner for network homes, otherwise run as root.
검색해보면
sudo mduitl -E /
로 하라고 나오는데, 살짝 맛간 경우는 상관없지만 아예 꺼져있는 경우는 안 먹는다.
그때는 다음과 같이 써준다.
sudo mdutil -i on / 이렇게 하면 /(시스템 루트)의 인덱싱을 on한다. 위와 합치면
방송사가 쏘아 보낸 전파를 잘 수신해서 깨끗하게 보여주던 TV의 시대에서 시청자가 능동적으로 컨트롤 할 수 있는 TV의 시대로 바뀌고 있다. 기존 가전 업체들 중심에서 인터넷 업체를 중심으로 중심축이 옮겨가는 것을 놓고 줄다리기를 하는 모습이나 서로의 장점을 살려 상생하기 위한 전 세계적 연합군의 형성을 보며 어떻게 새롭게 열린 시장이 개편될지 흥미롭기도 하다. 그에 발맞춰 동영상 파일을 잘 재생해주는 것이 최우선 과제였던 동영상 플레이어 시대 역시 가고, 사용자의 다양한 요구에 능동적으로 대응하는 스마트 TV 플레이어 시대가 왔다.
사람들은 편한 것을 원한다
과거에 비디오를 보려면 미리 준비해야 할 게 별로 없었다. VHS냐 β냐를 고르는 정도? 그나마 VHS 연합군이 승리한 덕분에 거의 세계적으로 표준은 VHS로 잡혔다. 그냥 빌리거나 사서 보면 됐다. LD와 VHD가 경쟁하던(그나마 VHD는 바로 사라졌다) 비디오디스크 시장도 있었지만, 국내엔 그다지 영향력을 행사하지 못했던 시장이었다. 또, 컴퓨터로 동영상을 볼 수 있는 시도도 있었으나, 당시 MS Video for Windows나 Apple의 QuickTime은 그저 재생되는데 의의를 두는 정도였다. 고작 128*96~320*240 픽셀 정도의 해상도 파일을 돌리는 정도로 사람들은 즐거워했다.
아날로그에서 디지털까지, 각종 비디오 데크, 비디오 디스크 플레이어들. 이젠 돌려볼 일이 거의 없다.
90년대 초 중반 그랬던 것이 불과 20년 사이 엄청난 변화가 있었다. 아날로그 기록 미디어에서 디지털 미디어로, 방송도 아날로그에서 디지털로. SD급 영상에서 HD 영상의 시대로. VHS, β, LD 등으로 대표되던 아날로그 미디어 시대에서 DVD로 통일되고, 그것이 블루레이와 HD-DVD의 싸움을 거쳐 블루레이로 통일된다.
커버 아트 콜렉션도 하나의 즐거움이었던 LaserDisc.
새로운 변수도 생겼다. 방송, 기록 미디어의 발전과 함께 이 데이터를 다루는 기술도 고도로 발전해 큰 데이터를 압축하는 방법을 개인도 쉽게 사용할 수 있게 되었고, 그 정도의 데이터라면 눈 깜작할 사이 전송시킬 수 있는 인프라가 갖춰진 것이다.
누구나 집에서 간단하게 DVD, BluRay 디스크를 만들 수 있게 되었다. 소장중인 테이프의 화질 열화를 대비해 개인 제작한 DVD.
사람들은 편한 것을 원한다. 한 장의 용량이 큰 이미지는 JPEG등의 압축 방법을 이용해서 될 수 있는 대로 원본의 느낌을 해치지 않으면서 작게 만들어 휴대, 전송이 편하도록 했다. 정지 화상 다음에는 소리(음성/음악 등) 정보의 압축이 발전했고, 그다음에는 동영상이 그렇게 됐다. 물론 한 기관에서 한 게 아니라 동시에 여러 기관, 여러 연구자가 동시 다발적으로 발전시켰지만, 실질적으로 소비자들이 접한 순서는 정지 화상→소리정보→동영상의 순이다. 그래서 정지 화상, 소리 정보의 발전을 살펴보면 동영상의 발전 방향이 보인다.
MP3, MP3P로 대표되는 디지털 음원과 그 플레이어가 음원 시장에서 큰 자리를 차지하는 것처럼, 동영상과 동영상 플레이어도 분명히 그쪽을 따라가게 될 것이다. 휴대형 음악 재생 기기가 발전하고 그 음원 시장이 발전할 수 있었던 것은 그것이 편해서였고, 사람들이 그것을 추구했기 때문이다. 비디오라고 다를 이유가 없다. 비디오 한 편을 보려고 비디오 대여점을 찾거나, 방송할 때까지 기다리는 건 불편하다. 개선책으로 IP-TV가 있긴 하지만, 그것도 서비스 회사에서 준비된 컨텐츠를 벗어날 수 없다. 잠깐 TV를 떠나 컴퓨터 쪽을 살펴보면 웹하드 서비스 업체의 제휴 컨텐츠나 포탈에서 합법적인 동영상 데이터를 얻을 방법이 존재한다.
그렇게 가능은 하지만 이리저리 흩어진 것을 TV 앞으로 모아줄 무언가가 필요한 시점이다. 이런 소비자의 요구와 새로운 스마트 TV가 선보이는 시기, 그 모두를 만족하게 하기 위한 노력의 산물을 오늘 만나게 되었다.
제품사양
외관
개인적으로 깔끔한 제품을 좋아한다. 의미 없이 꾸며진 선들, 이리저리 시선을 분산시키는 디스플레이, LED들은 오히려 감점 요소라고 생각한다.
그래서인지, tbob.tv는 매우 맘에 들었다.
처음 tbob.tv와 만난 느낌은 직선과 곡선을 절제해 사용해,깔끔하면서도 고광택 재질의 특징을 잘 살렸다는 것이었다. 개인적으로 TV가 반짝이는 건 그리 취향은 아니지만 최근 TV의 고광택 재질과도 잘 어울린다.
가격 절감 차원이었을진 모르지만, 전원을 넣었을 때 들어오는 파란색 LED가 외부로 드러나는 신호의 전부다. 어차피 모든 대화는 TV 화면을 통해서 하니 쓸모도 없는 장식을 붙여봐야 오히려 아름다움을 해친다. 불을 끄고 화면에 집중할 때 주변의 밝은 빛은 오히려 방해 요소다. 그런 이유로 많은 AV 기기들이 전면부 디스플레이 라이트 디밍 기능을 지원하지 않는가.
윗면에는 커다란 배기구가 4개 보인다. 배기구를 잡고 tbob.tv라고 쓰여있는 뚜껑을 들어 올리면 하드디스크 장착 공간이 나온다. 이곳에 2.5인치 SATA II방식의 하드디스크를 장착해주면 주 저장장치로 사용할 수 있다.
물론, 주 저장장치로 내장 하드디스크를 쓰지 않아도 된다. 왼편에 붙어 있는 2개의 USB 단자에 외장 하드디스크를 장착하면 그것을 주 저장장치로 인식한다.전류량은 USB단자당 500mA로 표시되어 있었다.전기를 많이 잡아먹어서인지 1개의 단자만 연결하면 일부 PC에서 동작이 불안정했던 구형 외장 하드디스크도USB 단자 1개 연결로 잘 동작했다. 일반적인 외장하드를 돌리기에는 충분한 전류가 나오는 것으로 보인다. 만약 전류량이 부족하다면 2개를 연결해서 해결할 수 있을 것이다.
하드뿐 아니라, USB 메모리카드, 메모리 카드 리더기도 잘 동작했다. 플라모델 키트를 고쳐서 SD카드 리더기로 쓰고 있는데, 꽤 어울렸다.
뒷면에는 왼쪽에서부터 순서대로 STEREO RCA잭, 컴포지트 비디오 RCA잭,HDMI단자, 광출력 단자, 이더넷 단자, 전원 입력 단자가 있다.
SMP8655에는 컴포넌트나 S-VIDEO출력도 준비되어 있으나, 제품에는 단가 문제인지 HDMI와 컴포지트 비디오 출력만 지원하는 것은 아쉬운 점이었다. 통합 단자 등을 마련해서 확장할 수 있도록 했으면 좀 더 다양한 TV나 모니터에서 사용할 수 있었을 텐데 하는 아쉬움이 드는 점이었다. 하지만, HDMI-DVI 변환 케이블도 있고, 요즘 TV라면 HDMI 단자는 기본으로 달려나오니 일반적인 상황에서는 별다른 문제가 될 것으로 보이진 않는다.
tbob.tv에는 전원 스위치조차 없으므로, tbob.tv를 제어하기 위해서는 리모콘이 필수다. 스마트TV 플레이어 답게 리모콘은 다양한 기능을 제공한다.
아무래도 터치 인터페이스를 염두에 두고 개발된 플랫폼이다보니 커서를 움직이는 데는 마우스가 편하다. 그래서 왼쪽 위에는 마우스 포인트 조작용 버튼이 있다. 이것을 이용해서 상하좌우 자유롭게 커서를 움직일 수 있으나 버튼 조작의 한계로 그다지 편하진 않은 느낌이다. (실제 마우스를 USB 단자에 연결해서 쓸 수도 있다.) 오른쪽 위에는 방향키가 있는데, 거의 모든 조작은 이쪽을 통해서 할 수 있으므로 빠른 제어가 가능하다.
그리고 검색 등을 위해 아래쪽에는 쿼티 키보드가 달려있다.
안드로이드?
최근 IT뉴스를 보면 가장 빈번히 등장하는 단어 중의 하나가 “안드로이드”일 것이다. 안드로이드는 휴대전화나 휴대기기를 움직이게 하고 사용자가 편하게 쓰도록 여러 프로그램을 모아놓은 통합 환경이라고 생각하면 편하다. 아무래도 대표적으로 스마트폰에서 쓰이고 있으므로 스마트폰용 OS로 발전한 것은 사실이다. 경쟁이 치열하고 아직도 발전형인 환경이다 보니 계속 판 올림을 해오고 있다. 재밌게도 완성된 버전별로 알파벳 첫 문자를 딴 후식 이름을 붙여두고 있는데, 주로 쓰이는 것은 2.1 이클레어(eclair:초콜렛 케이크)와 2.2프로요(froyo:냉동 요구르트)다. 이후 진저브레드(Gingerbread:생강쿠키)가 소개될 예정이다.
안드로이드를 채용했다는 것은, 단순히 동영상만 재생할 수 있는 기계가 아니라 좀 더 똑똑한 녀석이 된다는 의미다. 이미 만들어 업체에서 제공하는 유용한 앱을 이용할 수도 있고, 개발자가 직접 tbob.tv를 제어할 앱을 만들어 올릴 수도 있다. 기본으로 제공하는 앱에서 부족한 건 자기가 스스로 만들어 추가할 수도 있다는 얘기다.
또 다중작업도 지원한다. 제작자에게는 골치 아픈 일일지 모르지만, 그런 것을 알 바 없는 최종 소비자에게는 아주 유용한 기능이다. 동영상을 보는 동안 노는 자원을 이용해서 다운로드 받는 것도 가능하다. 여러 가지 앱을 번갈아가며 사용하는 것도 가능하다.
개략적인 소개는 이것으로 끝내고 실제로 tbob.tv를 사용해 보자.
tbob.tv 스위치 온!
위에서도 언급했듯 tbob.tv 본체에는 전원을 켤 수 있는 스위치가 없다. 리모콘의 전원 스위치를 눌러 tbob.tv를 켰다. 검은 화면이 나타날 뿐, 아무런 반응이 없었다. 약 15초 후, 안드로이드 로고가 나타났다.
전원을 넣고 처음 15초 동안 아무런 반응이 없는 것은 조금 불안한 감이 있었다. 심플한 외관에 파란 동작 등. 하지만 볼만 들어오고 다른 표시가 없으니 이게 제대로 동작하는지, 뽑기가 잘못된 것인지, 고장 난 것은 아닌지 만감이 교차했다. 이 시간을 줄일 수 있다면 줄이거나 다른 표시가 나올 수 있도록 하는 게 좋을 것으로 보이나, 하드웨어적인 특성이라 쉽게 고쳐질 수 있을는지 걱정이다. 테스트용 샘플 제품과 달리 양산품은 초기 전원을 넣으면, 파란 동작 등이 점멸하는 것으로 동작 중임을 알리도록 바뀌었다고 한다.
잠시 뒤 메인 화면이 나타났다.
동영상 재생 기능
홈에서 비디오-모든 파일을 선택하거나 파일을 선택해서 주 저장장치나 USB 장치에 연결된 외장 하드디스크의 데이터를 선택하면 바로 재생해 볼 수 있다.
물론, 네트워크 공유를 이용해서도 재생할 수 있다. 간단하게 Windows에서 폴더를 공유하고 앱스-네트워크 폴더를 선택한 다음, 자신의 컴퓨터를 찾아 공유한 폴더를 등록하면 이후로는 쉽게 홈의 비디오 쪽에서 공유한 폴더를 찾을 수 있다.
이제 동영상을 재생해보자. 샘플로 가진 애니메이션 파일을 돌려보기로 했다. 사용한 것은 바케모노가타리(化物語). 블루레이 타이틀로 가지고 있으나 블루레이 플레이어로 보기 번거로워서 추출해 재압축한 파일이다.
별다른 문제 없이 잘 재생되었다.
아니, 동영상 재생을 목적으로 산 제품에서 재생이 안 된다면 그것은 말도 안 되는 문제일 테니 재생이 잘 되는 것은 당연하였다. 빨리 넘기기, 뒤로 넘기기 기능은 가속 기능이 있어 익숙해지는데 조금 시간이 걸렸다.
동영상을 묶을 때 1개의 영상 트랙과 2개의 음성트랙을 넣었는데, 메뉴-플레이어 설정-오디오 설정-오디오 트랙 번호를 통해 모두 재생해 볼 수 있었다.
다음은 자막 테스트. 메뉴-플레이어 설정-자막 설정을 통해서 표시 여부, 크기 및 위치, 투명도 설정을 할 수 있었다. 작게는 점부터 한 자가 화면 전체를 차지하도록 크게도 할 수 있었고, 위치도 상하 마음대로 조절할 수 있었다.
다음은 순서대로 자막 비 표시 - 자막 표시 - 작게 만든 예 - 크게 만든 예 - 자막 투명이다. 크기와 위치는 방향키를 이용해서 자유롭게 조정 가능하다.
이번에는 같은 파일을 위에서 설명한 것처럼 공유 폴더 상에서 재생해 보았다. 역시 문제없이 재생되었다. 이번에는 블루레이 디스크를 재생시켜보기로 맘먹었다.블루레이 디스크를 그대로 tbob.tv에 물릴 순 없으므로 Windows의 블루레이 디스크 드라이브를 이용하기로 한다. Windows에서 블루레이 디스크 드라이버를 공유(g드라이브)시키고, 이것을 tbob.tv에 등록하였다.
블루레이 디스크나 이미지를 바로 재생할 수 있으면 좋겠지만 불가능했으므로, 디스크 내 STREAM 폴더의 m2ts파일을 불러 보기로 했다.
화면은 보이나 탁탁 끊어지며 재생되었다. 파일의 비트레이트는 약 34M로 Windows머신은 기가비트 랜, 공유기도 기가비트 랜을 지원하는 모델이며 tbob.tv역시 10/100지원 제품이었으로 이론상 아무 문제 없이 재생되어야 했으나, 파일 전송속도가 나오질 않는 것으로 보인다. 압축한 파일은 네트워크상에서 문제없이 재생되었으므로, 네트워크를 이용해서 재생할 때에는 파일 관리가 필요할 것으로 보인다. NFS를 이용한 공유는 훨씬 속도가 빠르다고 하는데, 일단 이 정도로 테스트를 마치기로 했다. (조만간 테스트 후 추가하겠다) 물론 같은 m2ts파일을 하드디스크에 복사하고 재생하면 문제없이 재생한다.
이번에는 HDTV 저장 파일을 재생해보기로 했다. tp파일도 문제없이 재생되었다.
마지막으로 여러 샘플 파일로 테스트를 해 보았는데, 이제는 안 쓰이나 과거에 사용되던 저해상도 저효율 압축 포맷들은 지원이 안 되는 경우가 제법 있었다. 표준을 지키지 않았던 문제도 있고, SMP8655의 스펙 상 지원하지 않는 부분이므로 아쉽지만 어쩔 수 없었다. 그러나 최신 .H264파일이나 HDTV녹화 파일, 블루레이 파일은 제대로 재생시켜주고 있었다.
그 외에 아직은 개발 버전이라서 그런지, 일반적으로 많이 애용되는 동영상 포맷 외의 m2ts, tp파일은 앞으로 넘기기, 뒤로 넘기기가 불가능하였다. 정식 버전에서는 이와 함께 넘기기 기능도 개선되리라 생각한다.
tbob.tv로 컨텐츠의 바다를!
tbob.tv의 앱 중에는 피디팝 앱이 있다. 국내 유명 웹하드인 피디팝과의 제휴로, 번거롭게 컴퓨터를 켜고 파일을 다운 받아 옮기거나, 공유를 위해 켜놓거나 할 필요없이 피디팝의 수많은 컨텐츠를 자유롭게 검색, 다운로드 할 수 있다.
홈-앱스-앱 다운로드에서 피디팝 앱을 다운로드 받으면 사용할 수 있다. 만약 앱 목록에 나오지 않는다면, 설정-응용프로그램-업데이트서버:대한민국으로 세팅되어 있는지 확인해야 한다.
다운로드가 끝났으면 실행시키고, 로그인한다. 새로운 계정은 현재 tbob.tv에서 지원하지 않으므로 일단 홈-인터넷이나, 컴 등에서 가입한다. 신규가입 시 제품과 함께 제공한 20GB 무료 다운로드 상품권을 이용하여 별다른 준비 없이 바로 피디팝을 이용할 수 있다.
카테고리는 크게 영화, 방송, 애니, 성인으로 되어 있으며 각각 세부 분류로 파일을 선택할 수 있다. 또 맨 위의 검색창을 이용하면 빠르게 파일을 찾을 수도 있다.
성인 컨텐츠의 경우 메뉴를 눌러 나오는 성인컨텐츠 설정 창에서 암호를 설정하여 미성년자의 이용을 막을 수도 있다.
필요한 파일을 찾기 위해 검색창에 “트레일”이라고 검색어를 넣었다. 동경 게임쇼에서 공개한 파이널판타지 트레일러가 있어 내용을 살펴보고, 다운로드를 받았다.
다 다운로드 받은 파일은 주 저장 디스크에 저장된다. 여러 개의 파일을 다운로드 걸어놨더라도 보고 싶은 파일의 다운로드가 끝났다면 중간에 피디팝 앱을 종료하고 동영상을 재생할 수 있다. 물론, 나머지 파일들은 백그라운드로 다운로드 받게 된다.
아직 베타버전이라 정리가 되어 있지 않으나, 정식 버전에서는 [제휴 컨텐츠]등의 전문 검색을 통해 유용한 최신 자료를 빠르고 손쉽게 합리적인 가격으로 다운로드 받아 볼 수 있다고 한다. 더욱 쉽게 굿 다운로더가 되어 보자.
전 세계 모든 동영상을 살펴본다
누구나 잘 알고 있기에 설명하기조차 민망한 전 세계 최대, 최다의 동영상 공유 사이트 YouTube. tbob.tv는YouTube 앱을 통해 쉽게 YouTube를 즐길 수 있다. 추천 메뉴 외에도 검색을 통해 원하는 동영상을 쉽게 찾을 수 있다.
앱스-앱 다운로드에서YouTube 앱을 다운로드 받는다.
다운로드가 끝나면 실행시켜 보자. 방향키를 좌우로 움직이면 여러 추천 메뉴들이 나타난다. 마음대로 골라 보면 된다.
이제 오른쪽 방향키를 눌러 설정화면으로 가자. 검색기간이나 지역 등의 자신에게 필요한 설정을 마치면 더욱 사용자의 의도에 맞는 결과물을 보기 쉽다.
필요한 동영상이 있다면, 검색 기능을 이용한다.
HD, 1080를 검색어로 함께 넣으면 HD동영상이 나오는 비율이 높아진다.
검색으로 얻은 결과물은 RSS등록을 하면 언제나 비디오-피드를 통해서 25개까지 정리된 것을 볼 수 있다.
피드에서 갱신주기, 일정기간 후 삭제여부 등을 설정할 수 있다.
테스트로 피드에서 파일을 선택하고 다운로드를 눌러 봤다. 일부 파일은 제한이 걸려있어 다운로드가 불가능했지만, 아래와 같이 다운로드가 가능한 파일도 있었다.
1986년경 국내에도 바다의 소녀 엘피란 제목으로 방송되었던 푸른 바다의 엘피(青い海のエルフィ). 그 주제곡 Mermaid in blue. 무척 맘에 드는 노래인지라 YouTube를 링크해놓고 자주 듣곤 했는데, 더 쉽게 들을 수 있게 되었다.
전세계 멀티미디어 지식의 보고
비디오-인터넷 비디오를 통해 팟캐스트를 볼 수도 있다. 간단하게 설명하자면, 인터넷상에 다양한 주제로 공개한 비디오 파일을 특정 카테고리로 정리하고 쉽게 구독해볼 수 있도록 해놓은 것이다. tbob.tv을 대한민국 서버로 세팅하면 인터넷 비디오에 한국 팟캐스트가 추가된다.
예술, 비즈니스, 교육, 음악, 뉴스와 정치, 지역과 종교, 자동차, 스포츠와 오락, 트레이닝, TV와 필름이라는 분류로 가벼운 소재에서 무거운 소재까지, 다양한 동영상이 존재한다.
YouTube때도 다뤘지만, 맘에 드는 것은 일일이 메뉴를 찾아볼 필요 없이 RSS구독을 하면 된다. 개인적으로는 한국 팟캐스트 외의VIDEO PODCAST-GAMES AND HOBBIES-Automotive의 Car Tech(HD)도 맘에 들기 때문에 구독 채널로 등록해 놓았다. 이렇게 자신만의 취향에 맞춰 정리해두면 언제나 최신 정보를 쉽게 구독할 수 있어서 편하다.
다양한 멀티미디어 기능
OS로 안드로이드를 사용하고 있기 때문에, 동영상 플레이어로서의 기능 외에도 다양한 멀티미디어 기기로 사용할 수 있다. 웹 브라우저는 기본이며 갤러리 앱을 이용하여 TV를 액자로 쓸 수도 있다.
슬라이드쇼 등의 기능도 지원하니 그동안 찍은 사진들을 정리해서 큰 화면으로 볼 수 있어 좋았다.
간단한 앱은 기본 제공하나 보다 많은 기능을 원할 땐 TV앱스토어에서 여러 가지 앱을 다운로드 받을 수 있다.
간단히 몇가지 살펴보기로 하자. 구글 지도 앱을 다운 받아 약속 장소의 지도를 살펴볼 수도 있다. 검색창에 주소나 유명한 지명을 입력하면 바로 찾아주며, 주변의 상권, 교통 안내도 볼 수 있다.
또, Web Music으로 원하는 곡을 들을 수도 있다. 인터넷에 떠도는 각종 음악 파일을 검색해주는 앱이다. 추억의 TV외화 주제곡이나 영화명을 쳐봤더니 바로 바로 검색되어 나왔다. 좋아하는 곡은 ♥로 등록해두면, 따로 검색하지 않고 바로 들을 수 있어서 편하다.
imdb 앱을 이용하면 최신 영화정보도 알 수 있고 sudoku앱을 다운 받으면 시간 보내기 좋은 게임을 즐길 수도 있다. 아직은 개발 중이라 이스타미디어에서 제공하는 앱 위주로 구성되어 있으나, 기기에 맞춘 사용자 앱을 등록할 수 있게 할 예정이라고 들었다.
아직은 설익은, 그러나 무한한 가능성을 지닌 스마트 TV 플레이어
간단하게 동영상 재생, 웹하드 연동, 인터넷 동영상 재생 위주로 tbob.tv의 기본기를 체크해 보았다. 파일을 재생하고 보여주는 데는 일단 합격점을 줄 수 있었다. 많은 기기가 추가 기능은 “펌웨어에 공간이 남으면 서비스로 넣어주는” 데 그치는 것에 반해 안드로이드를 이용 본격적인 기능 확장을 노린 점도 후한 점수를 줄 수 있다. 실제 그것으로 웹하드와의 연동, 유튜브와의 연동도 쉽게 이뤄졌고 그 외의 앱으로 TV를 보다 스마트하게 바꿔놓았다.
과거 리눅스를 커스터마이즈해 사용했던 동영상 플레이어를 사용자들이 스스로 뜯어 고쳐서 다양한 기능을 추가하여 사용하는 것을 본 적이 있다. 하지만, 이번 제품은 안드로이드를 사용 사용자가 스스로 발전시켜나갈 가능성을 남겨두었다. 또 현재는 2.1 이클레어가 탑재되어 있으나, 조만간 2.2 프로요로 업데이트 되면 더욱 안정화되고 최적화된 성능을 선보일 것이다.
물론, 장점만 있는 것은 아니다. 아직은 개발단계인지라 UX를 반영한 UI의 일관성, 편의성에 대한 개선 필요성이 눈에 띈다. 이번 리뷰를 하면서 사용에 불편했던 점, 일관적, 직관적으로 개선할 필요가 있는 부분에 대해서는 따로 리스트를 만들어 정리 중이며 이것을 제작사에 전달하기로 했다. 제작사 측에서는 적극적으로 반영하기로 약속했다.
단지 수동적으로 날아오는 컨텐츠를 소비하던 TV에서 사용자 주도로 컨텐츠를 마음대로 조리하고 나눌 수 있는 스마트 TV의 시대. 많은 메이커가 스마트TV를 주장하며 신제품을 쏟아내고 있지만, 집에 적어도 한 대씩은 가진 모든 TV를 스마트 TV로 바꿔줄 수 있는 범용 결전 인형 병기 범용성을 지닌 장치인 tbob.tv는 스마트TV시대에 큰 역할을 할 것으로 기대한다.
장점
동영상 공유 사이트, 웹 하드 등과의 연계로 풍부한 컨텐츠로의 접근성이 좋다. STM8655를 사용, 고화질 동영상 재생 가능하다. 안드로이드를 채용하여 다기능, 앞으로의 발전성이 기대된다. 홈시어터 PC를 대체할 미디어 센터로 부족함이 없다.
단점
리모콘 조작이 불편하다. 안드로이드 버전(2.1)과 기기 스펙의 제한으로 모든 앱을 쓸 수 있진 않다. (2.2는 업데이트 예정) 아직은 완성도 면에서 넓이는 넓으나 깊이가 부족하다.
* 개발 중의 제품으로 리뷰를 작성하였으므로, 정식 출시 후에는 변경 점이 있을 수 있습니다.
KURZWEIL PC-3시리즈를 위한 2.0 대응 큐베이스 패치 파일입니다. 테스트는 안 했습니다만, ㅡㅅ-);;;;; 문제 없이 동작할 것으로 예상됩니다 ㅡㅅ-);;;;;;;;;;;; http://asteris.pe.kr/blog/962 <- 여기가 패치 파일을 관리하는 페이지 이므로 종종 찾아주시길, 불시 업데이트가 이뤄질 수도 있습니다.
파일 다운 받기(Download / ダウンロード) : kurzweil_PC3X_v2000.zip 대응 OS 버전(PC3x OS Ver. / 対応OSバージョン) : 2.00 스크립트 버전(Script Ver. / スクリプト・バージョン) : 2.00.1
애플 스토어에서 구입한다면야 언제나 신품이 오겠지만, 한 푼이라도 아끼고자 옥션등의 쇼핑몰에서 구입하면 미리 받아둔 제품을 발송해준다. 뭐, 하드웨어야 계속 신제품이 들어오므로 큰 문제가 없지만 애플캐어의 경우 한참 지난 재고가 오는 경우가 있다.
만약 구형 애플캐어 (안의 등록 코드가 모두 숫자로 된 것)를 받았다면 등록시 구매 증명을 요구하는 경우가 있다.
이때 다음의 자료를 준비하자.
1. 영수증 : 아래와 같은 오픈 마켓 영수증은 구매 증명이 안 된다. 애플에서 원하는 건 "공식지정 판매처"의 영수증이다. 옥션이나 쥐마켓 같은 곳은 "공식 판매처"가 아니므로 그 안에서 실제로 판 업체에게 "등록용 영수증"을 발급해달라고 한다.
다음과 같은 오픈마켓의 영수증은 인정되질 않는다.
즉 아래와 같은 영수증이 필요하다. 여기에는 구매일, 공식 판매처명, 구매 품목, 총 구매가격이 모두 나와있다.
2. 애플 캐어 시리얼 넘버 : 박스 밑을 살펴보면 바코드와 함께 등록코드 말고 시리얼 넘버가 있다. 이것을 스캔 받거나 디카로 찍어 준비해둔다.
3. 이 둘을 등록 시 첨부한다. 외국에서 대처하기 때문에 영수증의 정보를 잘못 파악해 만약 옥션등으로 앞쪽에 나와있다고 거절하는 경우가 있는데 이때는 그냥 무조건 애플 코리아 고객 지원센터에 전화를 한다. 거절 시 온 메일에 보면 Case ID : 라고 되어있는 숫자가 있는데, 이걸 불러주면 알아서 검색하고 답을 찾아준다. 만약 추가로 팩스를 보냈는데도 엉뚱한 답이 온다면 다시 전화를 걸어 영수증을 그쪽(애플 코리아)으로 보내줄테니 대신 처리해달라고 요청한다. 그러면 그쪽에서 처리해줄 것이다.
애플 코리아가 국내에서 모든 고객지원을 담당한다면 발생하지 않는 일이겠지만, 외국에서 관리하고 한국에선 서포트 정도 하는 모양으로 뭔가 원활한 소통이 안 될 경우가 있다. 그래서인지 그런 면에 대해서는 미안해하고, 매우 친절하게 대응해준다. 사실 그런 불편함이 없는 게 최고겠지만 일단 문제가 발생했다면 애플 코리아의 지원을 최대한 요청해 이용하도록 한다.