Upgrade to Pro — share decks privately, control downloads, hide ads and more …

JSON をそこそこ見やすくする CUI ツールを Objective-C で作ったときの話

JSON をそこそこ見やすくする CUI ツールを Objective-C で作ったときの話

第50回 Cocoa勉強会関西 - iOS/Macアプリ開発勉強会
発表資料

griffin-stewie

June 01, 2013
Tweet

More Decks by griffin-stewie

Other Decks in Technology

Transcript

  1. JSON Λͦͦ͜͜ݟ΍͘͢͢Δ
    CUI πʔϧΛ࡞ͬͨͱ͖ͷ࿩
    @griffin_stewie
    13೥6݄1೔౔༵೔

    View Slide

  2. ࣗݾ঺հ
    •େࡕͰ iOS ΞϓϦ։ൃͷ࢓ࣄΛ͍ͯ͠
    ·͢
    •Cocoa ྺ͸ 5 ೥ఔ౓
    •SafariGestures ͱ͔ SafariTabMemento ͱ
    ͔ Safari ͷ SIMBL ϓϥάΠϯΛ
    @canberland ͱҰॹʹ࡞ͬͯ·ͨ͠ɻ
    13೥6݄1೔౔༵೔

    View Slide

  3. ຊ୊
    13೥6݄1೔౔༵೔

    View Slide

  4. CUI ͱ͸
    13೥6݄1೔౔༵೔

    View Slide

  5. •Character
    •User
    •Interface
    13೥6݄1೔౔༵೔

    View Slide

  6. ࠇ͍ը໘ʹढจ
    13೥6݄1೔౔༵೔

    View Slide

  7. ී௨͸ LL ܥݴޠͰαΫοͱ࡞
    Δײ͡
    13೥6݄1೔౔༵೔

    View Slide

  8. Ͱ΋ɺ
    13೥6݄1೔౔༵೔

    View Slide

  9. •Ruby Ҏ֎͞Θͬͨ͜ͱͳ͍
    •֎෦ϥΠϒϥϦΛಉࠝͯ͠഑෍Ͱ͖
    Δͷʁ
    •ௐ΂ΔͷΊΜͲ͍͘͞
    •͋͊ ΊΜͲ͍͘͞
    13೥6݄1೔౔༵೔

    View Slide

  10. Ͱɺࣗ෼ʹͱͬͯͷ CUI
    13೥6݄1೔౔༵೔

    View Slide

  11. •Cocoa Ͱ
    •U·͍͜ͱ΍Ε͹
    •I͍Μ͡ΌͶʁ
    13೥6݄1೔౔༵೔

    View Slide

  12. ͯͳΘ͚Ͱ Objective-C Ͱ࡞ͬ
    ͨͱ͖ͷ࿩
    13೥6݄1೔౔༵೔

    View Slide

  13. ಈػ
    13೥6݄1೔౔༵೔

    View Slide

  14. JSON ͕ݟʹ͔͔ͬͨ͘Β
    13೥6݄1೔౔༵೔

    View Slide

  15. 13೥6݄1೔౔༵೔

    View Slide

  16. python -m json.tool
    13೥6݄1೔౔༵೔

    View Slide

  17. 13೥6݄1೔౔༵೔

    View Slide

  18. ೔ຊޠ͕ಡΊͳ͍
    13೥6݄1೔౔༵೔

    View Slide

  19. ࡞ͬͨͷ͕
    13೥6݄1೔౔༵೔

    View Slide

  20. jsonpp
    http://griffin-stewie.github.io/jsonpp/
    13೥6݄1೔౔༵೔

    View Slide

  21. 13೥6݄1೔౔༵೔

    View Slide

  22. ೔ຊޠ͕ಡΊͨ
    13೥6݄1೔౔༵೔

    View Slide

  23. •ϩʔΧϧͷ JSON ϑΝΠϧΛಡΈࠐΜ
    ͩΓ
    •http Ͱͱ͖ͬͯͨΓ
    •Key Λιʔτͨ͠Γ
    •ιʔτ͢Δͱ͖ʹ਺ࣈͱͯ͠ѻͬͨΓ
    •ϑΝΠϧʹอଘͨ͠Γ
    13೥6݄1೔౔༵೔

    View Slide

  24. ΍ͬͨ͜ͱ
    13೥6݄1೔౔༵೔

    View Slide

  25. ίϚϯυϥΠϯҾ਺ͷॲཧͬͯ
    Ͳ͏΍Μͷʁ
    13೥6݄1೔౔༵೔

    View Slide

  26. •DDCli ͍ͬͯ͏ϥΠϒϥϦΛ࢖ͬͨ
    •appledoc ʹ΋࢖ΘΕ͍ͯΔ
    13೥6݄1೔౔༵೔

    View Slide

  27. •DDCli ͷσϦήʔτϝιουΛ2࣮ͭ૷͢Δ
    •1ͭ͸ Φϓγϣϯͷఆٛ༻
    • ड͚෇͚͍ͨίϚϯυϥΠϯΦϓγϣϯΛߏ଄ମͷ
    ഑ྻͱͯ͠ఆٛ
    •΋͏1ͭ͸ CUI ΞϓϦͱͯ͠ͷΤϯτϦϙΠϯτ
    • ίϚϯυϥΠϯΦϓγϣϯ͸σϦήʔτΦϒδΣΫ
    τʹ KVC ܦ༝ͰηοτࡁΈ
    • ͦͷ΄͔ͷҾ਺͕౉͞ΕΔ
    13೥6݄1೔౔༵೔

    View Slide

  28. 1. main.m ͷมߋ
    int main(int argc, const char * argv[])
    {
    int result = 0;
    @autoreleasepool {
    result = DDCliAppRunWithClass(
    [CSJSONPrettyPrint class]);
    }
    return result;
    }
    13೥6݄1೔౔༵೔

    View Slide

  29. 2. Delegate ͷ࣮૷
    •- (void)application:(DDCliApplication *)app
    willParseOptions:(DDGetoptLongParser
    *)optionParser
    •- (void)application:(DDCliApplication *)app
    runWithArguments:(NSArray *)arguments
    13೥6݄1೔౔༵೔

    View Slide

  30. •- (void)application:(DDCliApplication *)app
    willParseOptions:(DDGetoptLongParser *)optionParser
    •application:(DDCliApplication *)app
    runWithArguments:(NSArray *)arguments ͷલʹݺ
    ͹ΕΔ
    •DDGetoptOption ߏ଄ମΛ࡞੒͠ɺσϦήʔτϝ
    ιουͰ౉͞Εͨ DDGetoptLongParser Πϯελ
    ϯεʹ addOptionsFromTable: Ͱ౉͢
    13೥6݄1೔౔༵೔

    View Slide

  31. DDGetoptOption
    - (void)application:(DDCliApplication *)app
    willParseOptions:(DDGetoptLongParser *)optionsParser;
    {
    DDGetoptOption optionTable[] =
    {
    // Long Short Argument options
    {@"version", 'v', DDGetoptNoArgument},
    {@"help", 'h', DDGetoptNoArgument},
    {@"output", 'o', DDGetoptRequiredArgument},
    {@"filter-key", 'k', DDGetoptRequiredArgument},
    {nil, 0, 0},
    };
    [optionsParser addOptionsFromTable: optionTable];
    }
    13೥6݄1೔౔༵೔

    View Slide

  32. DDGetoptOption
    •Long Φϓγϣϯͷ໊শ (--version ౳ͷ "--" Λআ͍
    ͨจࣈྻ)
    •short Φϓγϣϯͷ໊শ
    •Φϓγϣϯ͕Ҿ਺ΛͱΔ͔ͱΒͳ͍͔ͷࢦఆ
    13೥6݄1೔౔༵೔

    View Slide

  33. •- (void)application:(DDCliApplication *)app
    runWithArguments:(NSArray *)arguments
    •arguments ʹ͸ઃఆͨ͠ΦϓγϣϯҎ֎ͷίϚ
    ϯυϥΠϯҾ਺͕ೖ͍ͬͯΔ
    13೥6݄1೔౔༵೔

    View Slide

  34. ΦϓγϣϯҾ਺΁ͷରԠ
    •main ؔ਺Ͱࢦఆͨ͠Ϋϥεʹରͯ͠ KVC Λ࢖ͬ
    ͯ஋ΛಥͬࠐΜͰ͘ΕΔ
    • ϓϩύςΟ໊͸ Long Φϓγϣϯͱಉ໊͡শ
    • ܕ͸ NSString
    13೥6݄1೔౔༵೔

    View Slide

  35. JSON ͷ Pretty-Print
    ͸Ͳ͏ͨ͠ͷʁ
    13೥6݄1೔౔༵೔

    View Slide

  36. SBJSON ʹؙ౤͛
    13೥6݄1೔౔༵೔

    View Slide

  37. Debug ΊΜͲͦ͏
    13೥6݄1೔౔༵೔

    View Slide

  38. ໘౗
    13೥6݄1೔౔༵೔

    View Slide

  39. •Ͱ΋ɺXcode ʹ͸ Run ͨ͠ͱ͖ʹ೚ҙ
    ͷҾ਺Λ౉ͤΔ࢓૊Έ͕͋ΔΑ
    •ෳ਺ఆٛͰ͖ͯνΣοΫϘοΫεͰ
    On/Off Մ
    •GUI ΞϓϦͱେͯ͠มΘΒͳ͍खؒ
    13೥6݄1೔౔༵೔

    View Slide

  40. Xcode ศར
    13೥6݄1೔౔༵೔

    View Slide

  41. manpage ΋࡞ͬͨΑ
    13೥6݄1೔౔༵೔

    View Slide

  42. manpage ͷه๏ҙຯෆ໌
    13೥6݄1೔౔༵೔

    View Slide

  43. Կ͜Εʁ จࣈԽ͚ʁ
    13೥6݄1೔౔༵೔

    View Slide

  44. ͜Μͳͷه๏ͳΜ͔ษڧ
    ͯ͠ΒΜͶ͐
    13೥6݄1೔౔༵೔

    View Slide

  45. Pandoc Ͱੜ੒ͨ͠
    13೥6݄1೔౔༵೔

    View Slide

  46. Pandoc ͬͯʁ
    •Pandoc a universal document converter
    • ଟ༷ͳςΩετϑΥʔϚοτΛผͷϑΥʔϚοτʹม׵
    • ରԠϑΥʔϚοτྫ
    • markdown
    • reStructuredText
    • textile
    • MediaWiki
    • ODT
    • docx
    • ͦͷଞ͍Ζ͍Ζ
    13೥6݄1೔౔༵೔

    View Slide

  47. markdown Ͱॻ͍ͯม׵ͨ͠
    13೥6݄1೔౔༵೔

    View Slide

  48. Πϯετʔϥʔ΋༻ҙͨ͠
    13೥6݄1೔౔༵೔

    View Slide

  49. ࠓͷ Xcode ʹ͸
    PackageManager ͕ಉࠝ͞Εͯ
    ͳ͍
    13೥6݄1೔౔༵೔

    View Slide

  50. Developer Center ಺ͷ
    Auxiliary Tools for Xcode
    ͷதʹ͋ͬͨ
    13೥6݄1೔౔༵೔

    View Slide

  51. ࢖͍ํ͸؆୯
    13೥6݄1೔౔༵೔

    View Slide

  52. άάΕʂ
    13೥6݄1೔౔༵೔

    View Slide

  53. ͱ͍͏͜ͱͰ jsonpp Ͱ͖ͨΑ
    13೥6݄1೔౔༵೔

    View Slide

  54. Ͱ΋Ͷ
    13೥6݄1೔౔༵೔

    View Slide

  55. jq
    jq is a lightweight and flexible
    command-line JSON processor.
    13೥6݄1೔౔༵೔

    View Slide

  56. jq
    •http://stedolan.github.io/jq/
    •C Ͱॻ͔Εͨ JSON Λݟ΍ͯ͘͘͢͠ΕΔࢠ
    •௒ڧྗ
    •XPath తʹ໨తͷσʔλ͚ͩநग़ͨ͠Γ
    •map ͱ͔ select ͱ͔ؔ਺తͳϑΟϧλϦϯά΋
    ग़དྷΔ
    13೥6݄1೔౔༵೔

    View Slide

  57. ͜Μͳͷ͕
    13೥6݄1೔౔༵೔

    View Slide

  58. ৭͕͍ͭͨΓ
    13೥6݄1೔౔༵೔

    View Slide

  59. ཉ͍͠΋ͷ͚ͩϑΟϧλͨ͠Γ
    13೥6݄1೔౔༵೔

    View Slide

  60. jq Ϛδ
    Φψψϝ
    13೥6݄1೔౔༵೔

    View Slide

  61. ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠
    13೥6݄1೔౔༵೔

    View Slide