Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Let's reading OSS's source

123 views

Published on

公立はこだて未来大学 公式サークルTech-FUN 秋のLT大会での内容です。

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Let's reading OSS's source

  1. 1. Let’s reading OSS’s source Open Source Software
  2. 2. 真面目な話は できません。
  3. 3. 自己紹介 今 利仁 / Toshihito Kon @Tkon_sec なぜか”てまー”と呼ばれている Linuxクソザコマン
  4. 4. どんなひと
  5. 5. どんなひと - ブロック崩し課題で音ゲー作る
  6. 6. どんなひと - ブロック崩し課題で音ゲー作る - バブみの宣教師みたいな扱いを受けるようになる
  7. 7. どんなひと - ブロック崩し課題で音ゲー作る - バブみの宣教師みたいな扱いを受けるようになる - バイトの面接で”バブみ”について説明させられる
  8. 8. どんなひと - ブロック崩し課題で音ゲー作る - バブみの宣教師みたいな扱いを受けるようになる - バイトの面接で”バブみ”について説明させられる - 講義をサボってLinuxConJapanへ行く
  9. 9. どんなひと - ブロック崩し課題で音ゲー作る - バブみの宣教師みたいな扱いを受けるようになる - バイトの面接で”バブみ”について説明させられる - 講義をサボってLinuxConJapanへ行く - LPI-Japanの人と仲良くなってRPiセミナー開く - 半額提供のためにRPi電子工作
  10. 10. どんなひと - ブロック崩し課題で音ゲー作る - バブみの宣教師みたいな扱いを受けるようになる - バイトの面接で”バブみ”について説明させられる - 講義をサボってLinuxConJapanへ行く - LPI-Japanの人と仲良くなってRPiセミナー開く - 半額提供のためにRPi電子工作 - 最近コンピューターアーキテクチャの勉強を始めた
  11. 11. どんなひと - ブロック崩し課題で音ゲー作る - バブみの宣教師みたいな扱いを受けるようになる - バイトの面接で”バブみ”について説明させられる - 講義をサボってLinuxConJapanへ行く - LPI-Japanの人と仲良くなってRPiセミナー開く - 半額提供のためにRPi電子工作 - 最近コンピューターアーキテクチャの勉強を始めた - 和服好き
  12. 12. どんなひと
  13. 13. どんなひと 普通の人です。
  14. 14. What OSS
  15. 15. What OSS OSS : Open Source Software ソースコードが無償で公開され、誰でも 改良・再配布が許可されているソフトウェア
  16. 16. What OSS OSS : Open Source Software タダで使える
  17. 17. せっかくソースも公開 されてるなら読んでみよう
  18. 18. kernel.org
  19. 19. kernel.org Linux kernel Download
  20. 20. ← kernel directory
  21. 21. 大量のC言語ソースファイル
  22. 22. main関数が見つからない
  23. 23. main関数が見つからない → 初心者にとっての死
  24. 24. main関数が見つからない → 初心者にとっての死
  25. 25. main関数が見つからない → 初心者にとっての死 ちゃんとみつけました。 kernelディレクトリじゃなかったよ!
  26. 26. 600万行のLinuxKernelは流石に手強い
  27. 27. 600万行のLinuxKernelは流石に手強い 手すらつけれてないとか言うな
  28. 28. もっと小さいものはないのか
  29. 29. もっと小さいものはないのか → あります。 当たり前だよなぁ
  30. 30. 本題
  31. 31. のソースを読んでみよう。
  32. 32. feh (ふぇふ?) 軽量なイメージビューア。 各形式の画像の表示やデスクトップ背景の 設定までこなす高機能さも兼ね備える。
  33. 33. シンプルでとても使い勝手が良い
  34. 34. https://feh.finalrewind.org
  35. 35. https://feh.finalrewind.org ← source download
  36. 36. ← src directory
  37. 37. ← main.c
  38. 38. int main(int argc, char **argv) { atexit(feh_clean_exit); setup_signal_handlers(); init_parse_options(argc, argv); init_imlib_fonts(); if (opt.display) { init_x_and_imlib(); init_keyevents(); init_buttonbindings(); } feh_event_init(); if (opt.index) init_index_mode(); else if (opt.collage) init_collage_mode(); else if (opt.multiwindow) init_multiwindow_mode(); else if (opt.list || opt.customlist) init_list_mode(); else if (opt.loadables) init_loadables_mode(); else if (opt.unloadables) init_unloadables_mode(); else if (opt.thumbs) init_thumbnail_mode(); else if (opt.bgmode) { feh_wm_set_bg_filelist(opt.bgmode); exit(0); } else { /* Slideshow mode is the default. Because it's spiffy */ opt.slideshow = 1; init_slideshow_mode(); } /* main event loop */ while (feh_main_iteration(1)); return(0); } src/main.c
  39. 39. int main(int argc, char **argv) { atexit(feh_clean_exit); setup_signal_handlers(); init_parse_options(argc, argv); init_imlib_fonts(); if (opt.display) { init_x_and_imlib(); init_keyevents(); init_buttonbindings(); } feh_event_init(); if (opt.index) init_index_mode(); else if (opt.collage) init_collage_mode(); else if (opt.multiwindow) init_multiwindow_mode(); else if (opt.list || opt.customlist) init_list_mode(); else if (opt.loadables) init_loadables_mode(); else if (opt.unloadables) init_unloadables_mode(); else if (opt.thumbs) init_thumbnail_mode(); else if (opt.bgmode) { feh_wm_set_bg_filelist(opt.bgmode); exit(0); } else { /* Slideshow mode is the default. Because it's spiffy */ opt.slideshow = 1; init_slideshow_mode(); } /* main event loop */ while (feh_main_iteration(1)); return(0); } main関数 短い!! src/main.c
  40. 40. int main(int argc, char **argv) { atexit(feh_clean_exit); setup_signal_handlers(); init_parse_options(argc, argv); init_imlib_fonts(); if (opt.display) { init_x_and_imlib(); init_keyevents(); init_buttonbindings(); } feh_event_init(); if (opt.index) init_index_mode(); else if (opt.collage) init_collage_mode(); else if (opt.multiwindow) init_multiwindow_mode(); else if (opt.list || opt.customlist) init_list_mode(); else if (opt.loadables) init_loadables_mode(); else if (opt.unloadables) init_unloadables_mode(); else if (opt.thumbs) init_thumbnail_mode(); else if (opt.bgmode) { feh_wm_set_bg_filelist(opt.bgmode); exit(0); } else { /* Slideshow mode is the default. Because it's spiffy */ opt.slideshow = 1; init_slideshow_mode(); } /* main event loop */ while (feh_main_iteration(1)); return(0); } main関数 短い!! src/main.c コメント少ないけど 関数の意味がわかる! 某講義の2~3行に1コメントとか 頭おかしいでしょ
  41. 41. int main(int argc, char **argv) { atexit(feh_clean_exit); setup_signal_handlers(); init_parse_options(argc, argv); init_imlib_fonts(); if (opt.display) { init_x_and_imlib(); init_keyevents(); init_buttonbindings(); } feh_event_init(); if (opt.index) init_index_mode(); else if (opt.collage) init_collage_mode(); else if (opt.multiwindow) init_multiwindow_mode(); else if (opt.list || opt.customlist) init_list_mode(); else if (opt.loadables) init_loadables_mode(); else if (opt.unloadables) init_unloadables_mode(); else if (opt.thumbs) init_thumbnail_mode(); else if (opt.bgmode) { feh_wm_set_bg_filelist(opt.bgmode); exit(0); } else { /* Slideshow mode is the default. Because it's spiffy */ opt.slideshow = 1; init_slideshow_mode(); } /* main event loop */ while (feh_main_iteration(1)); return(0); } 3部構成初期化 モード設定 メインループ src/main.c
  42. 42. int main(int argc, char **argv) { atexit(feh_clean_exit); setup_signal_handlers(); init_parse_options(argc, argv); init_imlib_fonts(); if (opt.display) { init_x_and_imlib(); init_keyevents(); init_buttonbindings(); } feh_event_init(); if (opt.index) init_index_mode(); else if (opt.collage) init_collage_mode(); else if (opt.multiwindow) init_multiwindow_mode(); else if (opt.list || opt.customlist) init_list_mode(); else if (opt.loadables) init_loadables_mode(); else if (opt.unloadables) init_unloadables_mode(); else if (opt.thumbs) init_thumbnail_mode(); else if (opt.bgmode) { feh_wm_set_bg_filelist(opt.bgmode); exit(0); } else { /* Slideshow mode is the default. Because it's spiffy */ opt.slideshow = 1; init_slideshow_mode(); } /* main event loop */ while (feh_main_iteration(1)); return(0); } src/main.c if (opt.display) { init_x_and_imlib(); init_keyevents(); init_buttonbindings(); } たぶんこれがウィンドウの 初期設定だろう
  43. 43. init_x_and_imlib()が書いてありそうなファイルを探す
  44. 44. init_x_and_imlib()が書いてありそうなファイルを探す imlib.c それっぽいぞ
  45. 45. void init_x_and_imlib(void) { disp = XOpenDisplay(NULL); if (!disp) eprintf("Can't open X display. It *is* running, yeah?"); vis = DefaultVisual(disp, DefaultScreen(disp)); depth = DefaultDepth(disp, DefaultScreen(disp)); cm = DefaultColormap(disp, DefaultScreen(disp)); root = RootWindow(disp, DefaultScreen(disp)); scr = ScreenOfDisplay(disp, DefaultScreen(disp)); xid_context = XUniqueContext(); #ifdef HAVE_LIBXINERAMA init_xinerama(); #endif /* HAVE_LIBXINERAMA */ imlib_context_set_display(disp); imlib_context_set_visual(vis); imlib_context_set_colormap(cm); imlib_context_set_color_modifier(NULL); imlib_context_set_progress_function(NULL); imlib_context_set_operation(IMLIB_OP_COPY); wmDeleteWindow = XInternAtom(disp, "WM_DELETE_WINDOW", False); /* Initialise random numbers */ srand(getpid() * time(NULL) % ((unsigned int) -1)); return; } src/imlib.c
  46. 46. void init_x_and_imlib(void) { disp = XOpenDisplay(NULL); if (!disp) eprintf("Can't open X display. It *is* running, yeah?"); vis = DefaultVisual(disp, DefaultScreen(disp)); depth = DefaultDepth(disp, DefaultScreen(disp)); cm = DefaultColormap(disp, DefaultScreen(disp)); root = RootWindow(disp, DefaultScreen(disp)); scr = ScreenOfDisplay(disp, DefaultScreen(disp)); xid_context = XUniqueContext(); #ifdef HAVE_LIBXINERAMA init_xinerama(); #endif /* HAVE_LIBXINERAMA */ imlib_context_set_display(disp); imlib_context_set_visual(vis); imlib_context_set_colormap(cm); imlib_context_set_color_modifier(NULL); imlib_context_set_progress_function(NULL); imlib_context_set_operation(IMLIB_OP_COPY); wmDeleteWindow = XInternAtom(disp, "WM_DELETE_WINDOW", False); /* Initialise random numbers */ srand(getpid() * time(NULL) % ((unsigned int) -1)); return; } src/imlib.c X周りのセットアップ imlibの セットアップ
  47. 47. X(X window system)は知ってるけど imlibってなんぞ?
  48. 48. Imlib2 … 画像処理ライブラリ。 ファイルの読み込み、出力、 X windowへの描画等の基本的な 機能が揃っている。
  49. 49. ほへぇ (知見を得たときの感嘆詞)
  50. 50. int main(int argc, char **argv) { atexit(feh_clean_exit); setup_signal_handlers(); init_parse_options(argc, argv); init_imlib_fonts(); if (opt.display) { init_x_and_imlib(); init_keyevents(); init_buttonbindings(); } feh_event_init(); if (opt.index) init_index_mode(); else if (opt.collage) init_collage_mode(); else if (opt.multiwindow) init_multiwindow_mode(); else if (opt.list || opt.customlist) init_list_mode(); else if (opt.loadables) init_loadables_mode(); else if (opt.unloadables) init_unloadables_mode(); else if (opt.thumbs) init_thumbnail_mode(); else if (opt.bgmode) { feh_wm_set_bg_filelist(opt.bgmode); exit(0); } else { /* Slideshow mode is the default. Because it's spiffy */ opt.slideshow = 1; init_slideshow_mode(); } /* main event loop */ while (feh_main_iteration(1)); return(0); } 初期化 モード設定 メインループ src/main.c
  51. 51. int main(int argc, char **argv) { atexit(feh_clean_exit); setup_signal_handlers(); init_parse_options(argc, argv); init_imlib_fonts(); if (opt.display) { init_x_and_imlib(); init_keyevents(); init_buttonbindings(); } feh_event_init(); if (opt.index) init_index_mode(); else if (opt.collage) init_collage_mode(); else if (opt.multiwindow) init_multiwindow_mode(); else if (opt.list || opt.customlist) init_list_mode(); else if (opt.loadables) init_loadables_mode(); else if (opt.unloadables) init_unloadables_mode(); else if (opt.thumbs) init_thumbnail_mode(); else if (opt.bgmode) { feh_wm_set_bg_filelist(opt.bgmode); exit(0); } else { /* Slideshow mode is the default. Because it's spiffy */ opt.slideshow = 1; init_slideshow_mode(); } /* main event loop */ while (feh_main_iteration(1)); return(0); } src/main.c if (opt.index) init_index_mode(); else if (opt.collage) init_collage_mode(); else if (opt.multiwindow) init_multiwindow_mode(); else if (opt.list || opt.customlist) init_list_mode(); ... “opt”大活躍
  52. 52. int main(int argc, char **argv) { atexit(feh_clean_exit); setup_signal_handlers(); init_parse_options(argc, argv); init_imlib_fonts(); if (opt.display) { init_x_and_imlib(); init_keyevents(); init_buttonbindings(); } feh_event_init(); if (opt.index) init_index_mode(); else if (opt.collage) init_collage_mode(); else if (opt.multiwindow) init_multiwindow_mode(); else if (opt.list || opt.customlist) init_list_mode(); else if (opt.loadables) init_loadables_mode(); else if (opt.unloadables) init_unloadables_mode(); else if (opt.thumbs) init_thumbnail_mode(); else if (opt.bgmode) { feh_wm_set_bg_filelist(opt.bgmode); exit(0); } else { /* Slideshow mode is the default. Because it's spiffy */ opt.slideshow = 1; init_slideshow_mode(); } /* main event loop */ while (feh_main_iteration(1)); return(0); } src/main.c init_parse_options(argc, argv); 引数を元にoptをセット
  53. 53. src/option.h extern fehoptions opt; fehoptions型
  54. 54. src/structs.h typedef struct __fehoptions fehoptions; fehoptions型 → 実態はstruct __fehoptions 構造体
  55. 55. struct __fehoptions { unsigned char multiwindow; unsigned char montage; unsigned char collage; unsigned char index; unsigned char thumbs; unsigned char slideshow; unsigned char recursive; unsigned char output; unsigned char verbose; unsigned char display; unsigned char bg; unsigned char alpha; unsigned char alpha_level; unsigned char aspect; unsigned char stretch; unsigned char keep_http; unsigned char borderless; unsigned char randomize; unsigned char jump_on_resort; unsigned char full_screen; unsigned char draw_filename; #ifdef HAVE_LIBEXIF unsigned char draw_exif; #endif unsigned char list; unsigned char quiet; unsigned char preload; unsigned char loadables; unsigned char unloadables; unsigned char reverse; unsigned char no_menus; unsigned char scale_down; unsigned char bgmode; unsigned char xinerama; unsigned char screen_clip; unsigned char hide_pointer; unsigned char draw_actions; unsigned char draw_info; unsigned char cache_thumbnails; unsigned char cycle_once; unsigned char hold_actions[10]; unsigned char text_bg; unsigned char image_bg; unsigned char no_fehbg; unsigned char keep_zoom_vp; unsigned char insecure_ssl; char *output_file; char *output_dir; char *bg_file; char *font; char *title_font; char *title; char *thumb_title; char *actions[10]; char *action_titles[10]; char *fontpath; char *filelistfile; char *menu_font; char *customlist; char *menu_bg; char *caption_path; char *start_list_at; char *info_cmd; char *index_info; int force_aliasing; int thumb_w; int thumb_h; int limit_w; int limit_h; unsigned int thumb_redraw; double reload; int sort; int debug; int geom_flags; int geom_x; int geom_y; unsigned int geom_w; unsigned int geom_h; int default_zoom; int zoom_mode; unsigned char adjust_reload; int xinerama_index; /* signed in case someone wants to invert scrolling real quick */ int scroll_step; unsigned int min_width, min_height, max_width, max_height; unsigned char mode; unsigned char paused; double slideshow_delay; signed short magick_timeout; Imlib_Font menu_fn; }; src/optioins.h struct __fehoption
  56. 56. struct __fehoptions { unsigned char multiwindow; unsigned char montage; unsigned char collage; unsigned char index; unsigned char thumbs; unsigned char slideshow; unsigned char recursive; unsigned char output; unsigned char verbose; unsigned char display; unsigned char bg; unsigned char alpha; unsigned char alpha_level; unsigned char aspect; unsigned char stretch; unsigned char keep_http; unsigned char borderless; unsigned char randomize; unsigned char jump_on_resort; unsigned char full_screen; unsigned char draw_filename; #ifdef HAVE_LIBEXIF unsigned char draw_exif; #endif unsigned char list; unsigned char quiet; unsigned char preload; unsigned char loadables; unsigned char unloadables; unsigned char reverse; unsigned char no_menus; unsigned char scale_down; unsigned char bgmode; unsigned char xinerama; unsigned char screen_clip; unsigned char hide_pointer; unsigned char draw_actions; unsigned char draw_info; unsigned char cache_thumbnails; unsigned char cycle_once; unsigned char hold_actions[10]; unsigned char text_bg; unsigned char image_bg; unsigned char no_fehbg; unsigned char keep_zoom_vp; unsigned char insecure_ssl; char *output_file; char *output_dir; char *bg_file; char *font; char *title_font; char *title; char *thumb_title; char *actions[10]; char *action_titles[10]; char *fontpath; char *filelistfile; char *menu_font; char *customlist; char *menu_bg; char *caption_path; char *start_list_at; char *info_cmd; char *index_info; int force_aliasing; int thumb_w; int thumb_h; int limit_w; int limit_h; unsigned int thumb_redraw; double reload; int sort; int debug; int geom_flags; int geom_x; int geom_y; unsigned int geom_w; unsigned int geom_h; int default_zoom; int zoom_mode; unsigned char adjust_reload; int xinerama_index; /* signed in case someone wants to invert scrolling real quick */ int scroll_step; unsigned int min_width, min_height, max_width, max_height; unsigned char mode; unsigned char paused; double slideshow_delay; signed short magick_timeout; Imlib_Font menu_fn; }; src/optioins.h struct __fehoption main関数より長い オプションの 設定項目の列挙
  57. 57. src/optioins.c void init_parse_options(int argc char **argv) void init_parse_options(int argc, char **argv) { /* TODO: sort these to match declaration of __fehoptions */ /* For setting the command hint on X windows */ cmdargc = argc; cmdargv = argv; /* Set default options */ memset(&opt, 0, sizeof(fehoptions)); opt.display = 1; opt.aspect = 1; opt.slideshow_delay = 0.0; opt.magick_timeout = -1; opt.thumb_w = 60; opt.thumb_h = 60; opt.thumb_redraw = 10; opt.scroll_step = 20; opt.menu_font = estrdup(DEFAULT_MENU_FONT); opt.font = NULL; opt.menu_bg = estrdup(PREFIX "/share/feh/images/menubg_default.png"); opt.max_height = opt.max_width = UINT_MAX; opt.start_list_at = NULL; opt.jump_on_resort = 1; opt.screen_clip = 1; #ifdef HAVE_LIBXINERAMA /* if we're using xinerama, then enable it by default */ opt.xinerama = 1; opt.xinerama_index = -1; #endif /* HAVE_LIBXINERAMA */ feh_getopt_theme(argc, argv); D(("About to check for theme configurationn")); feh_check_theme_options(argv); D(("About to parse commandline optionsn")); /* Parse the cmdline args */ feh_parse_option_array(argc, argv, 1); /* If we have a filelist to read, do it now */ if (opt.filelistfile) { /* joining two reverse-sorted lists in this manner works nicely for us here, as files specified on the commandline end up at the *end* of the combined filelist, in the specified order. */ D(("About to load filelist from filen")); filelist = gib_list_cat(filelist, feh_read_filelist(opt.filelistfile)); } D(("Options parsedn")); filelist_len = gib_list_length(filelist); if (!filelist_len) show_mini_usage(); check_options(); feh_prepare_filelist(); return; }
  58. 58. src/optioins.c void init_parse_options(int argc char **argv) optにデフォルト値セット コマンドライン引数を feh_getopt_theme(argc, argv); でパースしてopt設定 void init_parse_options(int argc, char **argv) { /* TODO: sort these to match declaration of __fehoptions */ /* For setting the command hint on X windows */ cmdargc = argc; cmdargv = argv; /* Set default options */ memset(&opt, 0, sizeof(fehoptions)); opt.display = 1; opt.aspect = 1; opt.slideshow_delay = 0.0; opt.magick_timeout = -1; opt.thumb_w = 60; opt.thumb_h = 60; opt.thumb_redraw = 10; opt.scroll_step = 20; opt.menu_font = estrdup(DEFAULT_MENU_FONT); opt.font = NULL; opt.menu_bg = estrdup(PREFIX "/share/feh/images/menubg_default.png"); opt.max_height = opt.max_width = UINT_MAX; opt.start_list_at = NULL; opt.jump_on_resort = 1; opt.screen_clip = 1; #ifdef HAVE_LIBXINERAMA /* if we're using xinerama, then enable it by default */ opt.xinerama = 1; opt.xinerama_index = -1; #endif /* HAVE_LIBXINERAMA */ feh_getopt_theme(argc, argv); D(("About to check for theme configurationn")); feh_check_theme_options(argv); D(("About to parse commandline optionsn")); /* Parse the cmdline args */ feh_parse_option_array(argc, argv, 1); /* If we have a filelist to read, do it now */ if (opt.filelistfile) { /* joining two reverse-sorted lists in this manner works nicely for us here, as files specified on the commandline end up at the *end* of the combined filelist, in the specified order. */ D(("About to load filelist from filen")); filelist = gib_list_cat(filelist, feh_read_filelist(opt.filelistfile)); } D(("Options parsedn")); filelist_len = gib_list_length(filelist); if (!filelist_len) show_mini_usage(); check_options(); feh_prepare_filelist(); return; }
  59. 59. int main(int argc, char **argv) { atexit(feh_clean_exit); setup_signal_handlers(); init_parse_options(argc, argv); init_imlib_fonts(); if (opt.display) { init_x_and_imlib(); init_keyevents(); init_buttonbindings(); } feh_event_init(); if (opt.index) init_index_mode(); else if (opt.collage) init_collage_mode(); else if (opt.multiwindow) init_multiwindow_mode(); else if (opt.list || opt.customlist) init_list_mode(); else if (opt.loadables) init_loadables_mode(); else if (opt.unloadables) init_unloadables_mode(); else if (opt.thumbs) init_thumbnail_mode(); else if (opt.bgmode) { feh_wm_set_bg_filelist(opt.bgmode); exit(0); } else { /* Slideshow mode is the default. Because it's spiffy */ opt.slideshow = 1; init_slideshow_mode(); } /* main event loop */ while (feh_main_iteration(1)); return(0); } optの値を見て モード設定するだけ。 src/main.c
  60. 60. int main(int argc, char **argv) { atexit(feh_clean_exit); setup_signal_handlers(); init_parse_options(argc, argv); init_imlib_fonts(); if (opt.display) { init_x_and_imlib(); init_keyevents(); init_buttonbindings(); } feh_event_init(); if (opt.index) init_index_mode(); else if (opt.collage) init_collage_mode(); else if (opt.multiwindow) init_multiwindow_mode(); else if (opt.list || opt.customlist) init_list_mode(); else if (opt.loadables) init_loadables_mode(); else if (opt.unloadables) init_unloadables_mode(); else if (opt.thumbs) init_thumbnail_mode(); else if (opt.bgmode) { feh_wm_set_bg_filelist(opt.bgmode); exit(0); } else { /* Slideshow mode is the default. Because it's spiffy */ opt.slideshow = 1; init_slideshow_mode(); } /* main event loop */ while (feh_main_iteration(1)); return(0); } メインループ src/main.c
  61. 61. 眠いのでここまで。
  62. 62. 今後の可能性 Imlib2を使ってなにか組んでみる? せっかくimlib.cにまとめてあるので これを利用してみる? それともfeh自体を改造して オレオレアプリにする?
  63. 63. 理想(背景透明化)
  64. 64. まとめ OSSのソースコードは(一部を除き)難しくない。 中身がどうなってるのかわからないものほど 読むのが楽しい。
  65. 65. サノバウィッチ / ゆずソフト
  66. 66. 真面目な宣伝 札幌で “NoCTF(Not only CTF)”を開催します。 日程:12/11(予定) 概要:セキュリティ分野で有名なCTF(Captuer The Flag)を、 もっと幅広い分野でゆるくやろう、という試み。 早い話がITクイズ大会。 詳細は追ってTwitter等で告知します。
  67. 67. おしまい

×