TECH PLAY

ニフティ株匏䌚瀟

ニフティ株匏䌚瀟 の技術ブログ

å…š500ä»¶

 はじめに こんにちは、新卒1幎目のmoriです。 私が珟圚 OJTで所属しおいる郚眲では、ネットワヌク機噚やサヌバヌの監芖にZabbixを甚いおいたす。 しかし、登録機噚が増えすぎた結果、情報の蚘録に甚いおいるMySQLサヌバヌぞの曞き蟌みが増え、ディスクの曞き蟌みも増加。 ディスクIO過倚によっおCPU䜿甚率も100%に匵り付いおしたいたした。 そこで、Zabbixで䜿甚しおいるDBを、TimescaleDBぞの倉曎し、解決を図りたした。 TimescaleDBずはPostgreSQLの拡匵機胜で、倧量にある時系列デヌタをhyper tableに分割するこずによっお効率的に管理するこずが可胜になりたす。 実行前にここだけは読んでほしい 私が苊劎した原因のほずんどはリ゜ヌス䞍足によるものです。 こちらは、「もっず早く蚀っおよ」ずなりかねない情報なので最初に曞いおおきたす。 DBマむグレヌションをするだけではCPU䜿甚率の削枛には繋がらない堎合も 今回の堎合は玔粋にZabbixの凊理䞍可によるものだったので解決しなかった マむグレヌション実行環境のマシンスペックは匷めに取った方がいい メモリを倚めに積んでください 16GBで足りず、32GBにしたした。 ディスクの容量は移行するデヌタサむズの4倍皋床は欲しい 各移行段階のデヌタを保持したいならそのくらい必芁です マむグレヌションの流れ 今回は以䞋のような手順に沿っお既存デヌタをMySQLからPostgreSQLにマむグレヌションしたした。 既存DBからmydumperを甚いおデヌタをダンプ myloaderを甚いお、マむグレヌション甚環境のMySQLにデヌタを取り蟌み pgloaderを甚いお、MySQL→PostgreSQLにデヌタ移行 pg_dumpを甚いお通垞PostgreSQL状態のダンプを実行 通垞のPostgreSQLからTimescaleDB環境に倉換するためのスクリプトを実行 1. mydumper はじめにmydumperを甚いお、既存のZabbixのログデヌタをダンプしたす。 本番環境を長時間停止しお、同環境で盎接䜜業できるならスキップ可胜です。 ここでの詰たりポむントは、 --events --triggers オプションずrootナヌザヌでの実行になりたす。これらのオプションを付けないず event~ や tiggers~ ずいったテヌブルのダンプが取れたせん。 たた、 triggers~ 系のテヌブルはrootナヌザヌでないずダンプするこずができたせんでした。 ❯ mydumper -u root --ask-password --compress --threads=16 --rows 100000 --events --triggers --routines --database {DB名} 2. myloader 続いおmydumperでダンプしたデヌタをマむグレヌション䜜業環境のMySQLに取り蟌みなおす工皋です。ダンプしたデヌタはsftpなりで移しおください。 普通に実行するず、 events よりも event-XXXX テヌブルが先に取り蟌たれおしたい、倖郚キヌ制玄関係の゚ラヌが出るので、適圓にディレクトリを䜜っおそこにeventsテヌブルのダンプデヌタを移動しお先に取り蟌む必芁がありたした。 その埌events以倖芁玠を取り蟌むこずでうたく取り蟌めたす。 たた、取り蟌み時でも trigger-XXXX テヌブルが通垞ナヌザヌでは取り蟌めなかったためrootナヌザヌで取り蟌みを実行する必芁が有りたした。 ❯ mkdir events # eventsテヌブルの退避先を䜜成 ❯ mv events* ./events # eventsテヌブルのダンプデヌタを退避 ❯ cp metadata ./events # ディレクトリ指定時にmydumperのダンプデヌタずしお認識させるためにメタデヌタをコピヌ # 退避したeventsテヌブルを先に取り蟌み ❯ myloader --host {ホスト名} --user root --ask-password --database {DB名} --verbose 3 --directory=./events --queries-per-transaction=25000 --threads=8 --compress-protocol --ssl --verbose=3 -e # その埌他のテヌブルを取り蟌み ❯ myloader --host {ホスト名} --user root --ask-password --database {DB名} --verbose 3 --directory=. --queries-per-transaction=25000 --threads=8 --compress-protocol --ssl --verbose=3 -e 3. pgloader 䜜業環境MySQLにデヌタを取り蟌めたのでいよいよ、MySQL→ PostgreSQLマむグレヌションを実行したす。 pgloaderは接続情報やオプションをファむルに蚘述できるので曞いおおきたす。 こちらでlocalhostでDBを指定するずsocketに぀なぎにいくため、dockerでDBを動かす堎合はルヌプバックアドレスを䜿甚する必芁がありたす。 以䞋をmy.loadずしお保存 LOAD DATABASE FROM mysql://root:{rootのパスワヌド}@{ホスト名}/{DB名} INTO postgresql://{ナヌザ名}:{パスワヌド}@{ホスト名}/{DB名} alter schema '{MyS}' rename to 'public' SET maintenance_work_mem TO '4096MB', work_mem to '1024MB' ; pgloaderを甚いたマむグレヌション䜜業は、かなり色々な゚ラヌが発生したので、ログを亀え぀぀説明しおいきたす。 ゚ラヌの数が倚すぎお正確な順番を芚えおいないため、順番が前埌しおいるかもしれたせん。ご了承くださいください。 3.1 文字コヌド倉換゚ラヌ ubuntuのaptからむンストヌルできるpgloader 3.6.7~develは文字コヌド倉換゚ラヌが発生しお動䜜しないので最新版の3.6.9の゜ヌスコヌドをダりンロヌドビルドしおそれを䜿甚するこずで解決したした。 ❯ pgloader my.load 2025-11-05T01:44:32.006000Z LOG pgloader version "3.6.7~devel" 2025-11-05T01:44:32.110999Z LOG Migrating from #<MYSQL-CONNECTION {MySQLの接続情報} {1006A6ADF3}> 2025-11-05T01:44:32.111999Z LOG Migrating into #<PGSQL-CONNECTION {PostgreSQLの接続情報} {1006A6AF93}> 2025-11-05T01:44:32.149999Z ERROR mysql: 76 fell through ECASE expression. Wanted one of (2 3 4 5 6 8 9 10 11 14 15 17 20 21 23 27 28 30 31 32 33 35 41 42 45 46 47 48 49 50 51 52 54 55 56 60 61 62 63 64 65 69 72 77 78 79 82 83 87 90 92 93 94 95 96 97 98 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 254). 2025-11-05T01:44:32.149999Z LOG report summary reset table name errors rows bytes total time ----------------- --------- --------- --------- -------------- fetch meta data 0 0 0.000s ----------------- --------- --------- --------- -------------- ----------------- --------- --------- --------- -------------- 自分の環境ではビルドするのにopenssl-develずsbclが足りなかったので远加でむンストヌルしたした。 ❯ wget https://github.com/dimitri/pgloader/releases/download/v3.6.9/pgloader-bundle-3.6.9.tgz ❯ tar xavf ./pgloader-bundle-3.6.9.tgz ❯ cd pgloader-bundle-3.6.9 ❯ make # 完了するずプロゞェクト盎䞋のbinディレクトリにバむナリが生成されるので任意の堎所に移動(パスを通しおもいい) 3.2 MySQLの認蚌方法倉曎 pgloaderがMySQLの新しい認蚌方匏に察応しおない関係でMySQLに接続できないので、蚭定を倉曎する必芁がありたす。 (デフォルトの認蚌プラグむンが caching_sha2_password に倉わっおいるため) ❯ mysql -u root -h {ホスト名} -p (パスワヌドを入力) # ナヌザヌ情報を確認 SELECT user, host, plugin FROM mysql.user; # 倉換 ALTER USER 'root'@'{ホスト}' IDENTIFIED WITH mysql_native_password BY '{新しいパスワヌド}'; FLUSH PRIVILEGES; 3.3 GCのメモリ䞍足 オプションでの指定なしで実行するず、デヌタが倧きすぎるため䜜業メモリが足りず、GCの゚ラヌを吐いお停止しおしたうのでメモリの割圓を増やしお察応したす。 たた、オプションでメモリ割圓を増やしおも、マシンに搭茉されおいるメモリが䞍足するず、「MySQLのタむムアりトが発生した」旚の゚ラヌが発生しお停止しおしたいたす。 䞀応蚭定でタむムアりトたでの時間を延長し、それでも同じ゚ラヌが出るようでしたら、メモリが倚い環境で実行するようにしおください。 GC゚ラヌ ❯ ./pgloader my.load 2025-11-05T05:03:53.006000Z LOG pgloader version "3.6.9" 2025-11-05T05:03:53.109999Z LOG Migrating from #<MYSQL-CONNECTION {MySQLの接続情報} {100686C0C3}> 2025-11-05T05:03:53.109999Z LOG Migrating into #<PGSQL-CONNECTION {PostgreSQLの接続情報} {100686C263}> Heap exhausted during garbage collection: 544 bytes available, 832 requested. Immobile Object Counts Gen layout fdefn symbol code Boxed Cons Raw Code SmMix Mixed LgRaw LgCode LgMix Waste% Alloc Trig Dirty GCs Mem-age 1 0 0 0 0 105 2 4081 0 0 35 0 0 0 2.3 135218064 116199738 4223 1 0.7799 2 0 0 0 0 376 3 13856 0 0 26 0 0 0 1.5 460182320 191227498 14037 1 1.1357 3 0 0 0 0 235 9 4052 0 2 60 0 0 0 3.0 138513456 20252714 4169 1 0.2367 4 0 0 0 0 60 1 267 0 0 18 0 0 0 4.7 10809520 21546938 268 1 0.0000 5 54 0 0 80 300 45 1149 1 9 94 0 0 5175 3.0 215344944 219748826 1169 5 0.9706 fatal error encountered in SBCL pid 70636 tid 70641: GC invariant lost, file "gencgc.c", line 523 Welcome to LDB, a low-level debugger for the Lisp runtime environment. (GC in progress, oldspace=1, newspace=2) ldb> MySQLのタむムアりト What I am doing here? MySQL ERROR: Partial Read of 25 bytes, expected 57 Detail: check MySQL logs for (Got timeout writing communication packets) Hint: adjust net_read_timeout and net_write_timeout # pgloaderの実行、ビルドしたバむナリを䜿甚しおるのでパスを盎に指定しおいる # my.loadは䞊蚘の蚭定ファむル # --dynamic-space-size が割圓メモリ蚭定オプション MB単䜍 ❯ ./pgloader --dynamic-space-size 2048 my.load   3.4 ようやくの成功 成功するず以䞋のような結果が出力される mori in zabbix-db-migration-test in ~/disk ❯ ./pgloader --dynamic-space-size 2048 ./my.load 2025-11-06T00:57:46.006000Z LOG pgloader version "3.6.9" 2025-11-06T00:57:46.119000Z LOG Migrating from #<MYSQL-CONNECTION {MySQLの接続情報} {1006858643}> 2025-11-06T00:57:46.120000Z LOG Migrating into #<PGSQL-CONNECTION {PostgreSQLの接続情報} {10068587E3}> 2025-11-06T01:32:49.388234Z LOG report summary reset table name errors rows bytes total time --------------------------------- --------- --------- --------- -------------- fetch meta data 0 1005 0.113s Create Schemas 0 0 0.001s Create SQL Types 0 0 0.004s Create tables 0 414 1.205s Set Table OIDs 0 207 0.010s --------------------------------- --------- --------- --------- -------------- public.history_uint 0 247670390 7.1 GB 24m51.621s public.history 0 179818097 6.0 GB 18m19.154s public.trends 0 31790612 1.5 GB 11m52.358s public.trends_uint 0 42925943 1.5 GB 13m13.914s public.history_text 0 2908279 732.0 MB 1m27.851s public.event_tag 0 7249860 286.1 MB 1m8.851s public.event_recovery 0 549542 12.6 MB 6.828s public.history_str 0 92327 5.3 MB 1.679s public.items 0 60082 20.9 MB 6.865s public.item_discovery 0 35174 2.0 MB 1.866s public.item_rtdata 0 34842 1.0 MB 3.040s public.trigger_tag 0 29393 822.2 kB 5.422s public.triggers 0 24943 9.6 MB 7.189s public.graphs 0 10462 986.2 kB 4.056s public.trigger_discovery 0 8851 269.3 kB 3.134s public.widget_field 0 5864 346.1 kB 2.607s public.graph_discovery 0 3808 99.8 kB 2.796s public.lld_macro_path 0 2359 78.5 kB 3.023s public.changelog 0 1553 44.4 kB 3.338s public.problem_tag 0 1429 47.7 kB 3.602s public.host_tag 0 1370 40.1 kB 3.912s public.valuemap 0 1184 77.3 kB 4.169s public.lld_override 0 968 34.7 kB 3.970s public.hosts 0 791 253.9 kB 4.174s public.host_hgset 0 748 6.3 kB 4.399s public.hosts_templates 0 465 8.6 kB 4.643s public.host_rtdata 0 426 3.3 kB 4.834s public.dashboard_page 0 411 8.8 kB 4.960s public.dashboard 0 308 21.7 kB 5.741s public.media_type_message 0 213 58.0 kB 6.428s public.settings 0 118 5.3 kB 6.958s public.host_discovery 0 48 1.3 kB 7.277s public.hgset_group 0 36 0.2 kB 7.552s public.module 0 32 1.1 kB 7.805s public.hgset 0 27 1.8 kB 8.521s public.operations 0 22 0.4 kB 8.889s public.lld_override_optemplate 0 14 0.2 kB 9.032s public.interface_snmp 0 11 0.4 kB 9.866s public.expressions 0 10 0.5 kB 10.597s public.opmessage 0 8 0.1 kB 11.581s public.usrgrp 0 6 0.2 kB 11.790s public.interface_discovery 0 5 0.0 kB 12.276s public.users_groups 0 5 0.0 kB 12.606s public.opmessage_grp 0 4 0.0 kB 14.756s public.role 0 4 0.1 kB 15.239s public.scripts 0 3 0.3 kB 15.853s public.acknowledges 0 2 0.1 kB 16.007s public.ha_node 0 1 0.1 kB 16.248s public.sysmaps_elements 0 1 0.1 kB 16.642s public.config_autoreg_tls 0 1 0.0 kB 16.840s public.connector_tag 0 0 17.039s public.corr_condition_group 0 0 17.164s public.corr_condition_tagpair 0 0 17.328s public.corr_operation 0 0 17.458s public.dashboard_user 0 0 17.620s public.dbversion 0 1 0.0 kB 17.760s public.dhosts 0 0 17.893s public.dservices 0 0 17.992s public.event_suppress 0 0 18.193s public.globalmacro 0 1 0.0 kB 18.373s public.group_discovery 0 0 18.639s public.host_proxy 0 0 18.851s public.httpstep 0 0 18.988s public.httpstepitem 0 0 19.068s public.httptest_field 0 0 19.214s public.httptestitem 0 0 19.221s public.icon_mapping 0 0 19.241s public.lld_override_ophistory 0 0 19.444s public.lld_override_opperiod 0 0 19.631s public.lld_override_optrends 0 0 19.713s public.maintenances 0 0 19.900s public.maintenances_hosts 0 0 20.058s public.media 0 0 20.202s public.mfa 0 0 20.378s public.opcommand 0 0 20.444s public.opcommand_hst 0 0 20.532s public.opinventory 0 0 20.767s public.optag 0 1 0.0 kB 20.944s public.proxy 0 0 21.051s public.proxy_dhistory 0 0 21.158s public.proxy_group_rtdata 0 0 21.400s public.proxy_rtdata 0 0 21.471s public.report_param 0 0 21.455s public.report_usrgrp 0 0 21.576s public.scim_group 0 0 21.663s public.service_alarms 0 0 21.839s public.service_problem_tag 0 0 22.072s public.service_tag 0 0 22.190s public.services_links 0 0 22.277s public.sla_excluded_downtime 0 0 22.340s public.sla_service_tag 0 1 0.0 kB 22.599s public.sysmap_element_url 0 0 22.895s public.sysmap_shape 0 1 0.1 kB 23.598s public.sysmap_user 0 0 23.701s public.sysmaps_element_tag 0 0 23.780s public.sysmaps_links 0 0 23.937s public.task 0 0 24.096s public.task_check_now 0 0 24.348s public.task_data 0 0 24.666s public.task_remote_command_result 0 0 24.824s public.timeperiods 0 0 25.002s public.trigger_queue 0 0 25.067s public.user_scim_group 0 0 25.124s public.userdirectory 0 0 25.266s public.userdirectory_ldap 0 0 25.399s public.userdirectory_saml 0 0 25.495s public.events 0 1101492 183.6 MB 42.597s public.item_tag 0 117492 3.8 MB 1.333s public.item_preproc 0 61151 2.6 MB 1.380s public.functions 0 47934 1.3 MB 2.031s public.item_rtname 0 33155 2.8 MB 0.927s public.valuemap_mapping 0 32638 921.4 kB 0.403s public.graphs_items 0 28356 1011.7 kB 1.154s public.trigger_depends 0 12763 226.6 kB 1.462s public.item_condition 0 10214 554.6 kB 1.282s public.hostmacro 0 5725 551.3 kB 0.483s public.auditlog 0 5873 4.2 MB 0.878s public.housekeeper 0 4057 125.1 kB 0.138s public.widget 0 1521 58.0 kB 0.122s public.lld_override_operation 0 1385 41.4 kB 0.274s public.lld_override_opdiscover 0 1371 9.4 kB 0.513s public.lld_override_opstatus 0 1228 8.4 kB 0.396s public.hosts_groups 0 1172 15.2 kB 0.563s public.lld_override_condition 0 968 45.9 kB 0.784s public.item_parameter 0 745 29.6 kB 0.837s public.media_type_param 0 674 26.3 kB 1.250s public.interface 0 451 20.4 kB 1.231s public.autoreg_host 0 415 23.6 kB 1.190s public.profiles 0 321 16.0 kB 1.359s public.problem 0 256 32.8 kB 1.373s public.images 0 187 1.9 MB 1.666s public.group_prototype 0 65 1.7 kB 1.520s public.ids 0 46 1.3 kB 1.565s public.media_type 0 42 314.1 kB 1.923s public.hstgrp 0 29 1.6 kB 1.787s public.role_rule 0 27 0.8 kB 1.825s public.sessions 0 20 1.6 kB 1.931s public.conditions 0 12 0.2 kB 2.065s public.actions 0 10 0.5 kB 2.006s public.host_inventory 0 9 1.0 kB 2.199s public.opgroup 0 6 0.0 kB 2.297s public.history_log 0 5 3.2 kB 2.336s public.regexps 0 5 0.2 kB 2.247s public.graph_theme 0 4 0.9 kB 2.184s public.optemplate 0 4 0.0 kB 2.387s public.lld_override_optag 0 3 0.1 kB 2.474s public.ugset_group 0 3 0.0 kB 2.455s public.users 0 2 0.3 kB 2.661s public.sysmaps 0 1 0.1 kB 2.682s public.alerts 0 0 2.785s public.connector 0 0 2.645s public.corr_condition 0 0 2.605s public.corr_condition_tag 0 0 2.564s public.corr_condition_tagvalue 0 0 2.515s public.correlation 0 0 2.653s public.dashboard_usrgrp 0 1 0.0 kB 2.698s public.dchecks 0 1 0.0 kB 2.875s public.drules 0 1 0.0 kB 2.919s public.escalations 0 0 2.977s public.event_symptom 0 0 2.995s public.globalvars 0 1 0.0 kB 3.146s public.history_bin 0 0 3.026s public.hostmacro_config 0 0 3.061s public.httpstep_field 0 0 3.095s public.httptest 0 0 3.174s public.httptest_tag 0 0 3.315s public.icon_map 0 0 3.391s public.lld_macro_export 0 0 3.324s public.lld_override_opinventory 0 0 3.614s public.lld_override_opseverity 0 0 3.602s public.maintenance_tag 0 0 3.564s public.maintenances_groups 0 0 3.565s public.maintenances_windows 0 0 3.774s public.media_type_oauth 0 0 3.801s public.mfa_totp_secret 0 0 3.795s public.opcommand_grp 0 0 3.771s public.opconditions 0 0 3.933s public.opmessage_usr 0 0 4.030s public.permission 0 0 4.128s public.proxy_autoreg_host 0 0 4.033s public.proxy_group 0 0 4.178s public.proxy_history 0 0 4.183s public.report 0 0 4.212s public.report_user 0 0 4.213s public.rights 0 0 4.307s public.script_param 0 0 4.447s public.service_problem 0 0 4.542s public.service_status_rule 0 0 4.499s public.services 0 0 4.427s public.sla 0 1 0.1 kB 4.889s public.sla_schedule 0 0 4.536s public.sysmap_element_trigger 0 0 4.544s public.sysmap_link_threshold 0 0 4.539s public.sysmap_url 0 0 4.556s public.sysmap_usrgrp 0 0 4.556s public.sysmaps_link_triggers 0 0 4.511s public.tag_filter 0 0 4.524s public.task_acknowledge 0 0 4.556s public.task_close_problem 0 0 4.550s public.task_remote_command 0 0 4.545s public.task_result 0 0 4.605s public.token 0 0 4.585s public.ugset 0 1 0.1 kB 4.813s public.user_ugset 0 1 0.0 kB 4.652s public.userdirectory_idpgroup 0 0 4.616s public.userdirectory_media 0 0 4.646s public.userdirectory_usrgrp 0 0 4.669s --------------------------------- --------- --------- --------- -------------- COPY Threads Completion 0 4 33m34.875s Create Indexes 0 521 22m28.427s Index Build Completion 0 521 1m20.883s Reset Sequences 0 1 0.127s Primary Keys 0 207 0.291s Create Foreign Keys 0 277 5.553s Create Triggers 0 0 0.000s Install Comments 0 0 0.000s --------------------------------- --------- --------- --------- -------------- Total import time ✓ 514702901 17.4 GB 57m30.156s   3.5. pgdump pgloaderでMySQLからデヌタを移行しただけでは、通垞のPostgreSQLのテヌブル構造になっおいるため、TimescaleDB甚の構造に倉換する必芁がありたす。 䞇が䞀倉換に倱敗した時のために、この段階でバックアップを䜜成するこずをオススメしたす。 pg_dumpを甚いたダンプの出力はいく぀か皮類がありたすが、今回はdocker環境での取り回しが良く、比范的サむズが小さい、plainのgzip圧瞮を䜿甚したした。 ❯ pg_dump -d {接続情報} | gzip > backup.sql.gz   4. TimescaleDB 先皋述べた通り、PostgreSQLに移行したテヌブルをTimescaleDBのhypertableに倉換する必芁がありたす。 倉換スクリプトが甚意されおいるのでそちらを実行したす。私の堎合は、コンテナ内から取り出しお䜿甚したした。 PostgreSQLの状態でデヌタ保存甚のボリュヌムを䜜っおいた堎合、TimescaleDBの拡匵の認識蚭定がされおいないので蚭定を曞き換える必芁がありたす。 (最初からTimescaleDBのimageでやっおたら䞍芁) スクリプト実行時の゚ラヌにかかれおいる通り蚭定に shared_preload_libraries = 'timescaledb' を远蚘する必芁がありたす TimecaleDB拡匵が認識されおいない状態で有効化しようずしお倱敗したログ ❯ echo "CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;" | psql {接続情報} Password for user user: FATAL: extension "timescaledb" must be preloaded HINT: Please preload the timescaledb library via shared_preload_libraries. This can be done by editing the config file at: /var/lib/postgresql/data/postgresql.conf and adding 'timescaledb' to the list in the shared_preload_libraries config. # Modify postgresql.conf: shared_preload_libraries = 'timescaledb' Another way to do this, if not preloading other libraries, is with the command: echo "shared_preload_libraries = 'timescaledb'" >> /var/lib/postgresql/data/postgresql.conf (Will require a database restart.) server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request. connection to server was lost この工皋での詰たりポむントは、ディスクの空き容量䞍足です。 倉換スクリプトの実行䞭通垞のテヌブルずhypertable䞡方の情報が同居する関係なのか、デヌタサむズがかなり肥倧化したす。 私が実行した環境では1.5~2倍皋床にたで肥倧化しおいたず思いたす。 Zabbixサヌバヌのコンテナがいきなり登堎しおたすが、今回は説明を割愛したす。 蚘事の最埌に私が怜蚌に甚いたDocker ComposeでのZabbixの最小限の構成をおたけで付けおいるので、そちらを参照しおください。 # zabbix-serverが皌働した状態で倉換スクリプトをコンテナから取り出す # zabbix-serverです、timescaledbではなく ❯ docker cp {zabbix-serverのコンテナID}:/usr/share/doc/zabbix-server-postgresql/. ./scripts # 取り出したスクリプトを確認 ❯ ls scripts  create.sql.gz  option-patches  timescaledb.sql # timescaledb拡匵を有効化 ❯ echo "CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;" | psql -U {ナヌザ名} -h {ホスト名} Password for user {ナヌザ名}: CREATE EXTENSION # 倉換スクリプトを実行 ❯ cat ./scripts/timescaledb.sql | psql -U {ナヌザ名} -h {ホスト名} 実行ログ mori in zabbix-db-migration-test in ~/disk ❯ echo "CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;" | psql -U {ナヌザ名} -h {ホスト名} Password for user {ナヌザ名}: NOTICE: extension "timescaledb" already exists, skipping CREATE EXTENSION mori in zabbix-db-migration-test in ~/disk ❯ cat ./script/timescaledb.sql | psql -U {ナヌザ名} -h {ホスト名} Password for user {ナヌザ名}: CREATE FUNCTION NOTICE: function base36_decode(pg_catalog.varchar) does not exist, skipping DROP FUNCTION NOTICE: PostgreSQL version 17.6 is valid NOTICE: TimescaleDB extension is detected NOTICE: TimescaleDB version 2.21.4 is valid NOTICE: migrating data to chunks DETAIL: Migration might take a while depending on the amount of data. NOTICE: migrating data to chunks DETAIL: Migration might take a while depending on the amount of data. WARNING: column type "character varying" used for "source" does not follow best practices HINT: Use datatype TEXT instead. NOTICE: migrating data to chunks DETAIL: Migration might take a while depending on the amount of data. NOTICE: migrating data to chunks DETAIL: Migration might take a while depending on the amount of data. WARNING: column type "character varying" used for "value" does not follow best practices HINT: Use datatype TEXT instead. NOTICE: migrating data to chunks DETAIL: Migration might take a while depending on the amount of data. WARNING: column type "character varying" used for "auditid" does not follow best practices HINT: Use datatype TEXT instead. WARNING: column type "character varying" used for "username" does not follow best practices HINT: Use datatype TEXT instead. WARNING: column type "character varying" used for "ip" does not follow best practices HINT: Use datatype TEXT instead. WARNING: column type "character varying" used for "resource_cuid" does not follow best practices HINT: Use datatype TEXT instead. WARNING: column type "character varying" used for "resourcename" does not follow best practices HINT: Use datatype TEXT instead. WARNING: column type "character varying" used for "recordsetid" does not follow best practices HINT: Use datatype TEXT instead. NOTICE: migrating data to chunks DETAIL: Migration might take a while depending on the amount of data. NOTICE: migrating data to chunks DETAIL: Migration might take a while depending on the amount of data. NOTICE: migrating data to chunks DETAIL: Migration might take a while depending on the amount of data. NOTICE: TimescaleDB is configured successfully DO   たずめ 残念ながら、圓初の目的であったCPU䜿甚率の削枛には぀ながりたせんでした。 しかし、ディスクぞの曞き蟌み頻床ず曞き蟌みデヌタ量が倧幅に枛りたした。 たた、MySQLには倧量のbinlogが溜たっおいたずいうのもありたすが、TimescaleDBの圧瞮機胜によっおディスク消費量も倧幅に枛らすこずができたした。   おたけ MySQLの最小構成のDocker Composeファむル DBが初期化されるたで2,3分かかる(その前にアクセスするず異垞な蚭定、みたいな゚ラヌがでるのでしばらく埅ち) services: mysql-server: image: mysql:8.0-bookworm restart: always command: - --log-bin-trust-function-creators=1 - --character-set-server=utf8mb4 - --collation-server=utf8mb4_bin environment: MYSQL_DATABASE: {DB名} MYSQL_USER: {ナヌザ名} MYSQL_PASSWORD: {パスワヌド} MYSQL_ROOT_PASSWORD: {rootパスワヌド} healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 10s timeout: 5s retries: 5 volumes: - ./data:/var/lib/mysql - ./mysql_conf/:/etc/mysql/ ports: - 3306:3306 cap_add: - SYS_NICE zabbix-server: image: zabbix/zabbix-server-mysql:ubuntu-latest restart: always ports: - 10051:10051 environment: DB_SERVER_HOST: mysql-server # 䞊で定矩したMySQLサヌビス名 MYSQL_DATABASE: {䞊で定矩したDB名} MYSQL_USER: {同䞊} MYSQL_PASSWORD: {同䞊} volumes: - ./zabbix_conf/:/etc/zabbix depends_on: mysql-server: condition: service_healthy zabbix-web: image: zabbix/zabbix-web-nginx-mysql:ubuntu-latest restart: always ports: - 80:8080 environment: DB_SERVER_HOST: mysql-server # 䞊で定矩したMySQLサヌビス名 MYSQL_DATABASE: {䞊で定矩したDB名} MYSQL_USER: {同䞊} MYSQL_PASSWORD: {同䞊} ZBX_SERVER_HOST: zabbix-server # 䞊で定矩したZbbixSeverサヌビス名 PHP_TZ: Asia/Tokyo depends_on: - zabbix-server zabbix-agent: image: zabbix/zabbix-agent:ubuntu-latest restart: always environment: ZBX_SERVER_HOST: zabbix-server # 䞊で定矩したZbbixSeverサヌビス名 ZBX_SERVER: zabbix-server # Azureの仮想マシン䞊でdocker composeを䜿うず謎にsshが死ぬので぀けおる # 普通はいらない networks: default: ipam: driver: default config: - subnet: 192.168.1.0/24 # 競合しないプラむベヌトIP範囲を指定 gateway: 192.168.1.1 TimescaleDB(PostgreSQL)の最小構成Docker Compose ファむル 今回の䜿甚法におおいは、テヌブル倉換をしない堎合は普通のPostgreSQLず同じ動きをするので、通垞版は割愛 services: postgres-server: image: timescale/timescaledb:2.22.1-pg17 restart: always environment: POSTGRES_USER: {ナヌザ名} POSTGRES_PASSWORD: {パスワヌド} POSTGRES_DB: {DB名} ports: - 5432:5432 volumes: - ./postgres-data:/var/lib/postgresql/data zabbix-server: image: zabbix/zabbix-server-pgsql:ubuntu-latest restart: always environment: DB_SERVER_HOST: postgres-server # 䞊で定矩したDBのホスト名 POSTGRES_USER: {䞊で定矩したDBナヌザ名} POSTGRES_PASSWORD: {䞊で定矩したDBパスワヌド} POSTGRES_DB: {䞊で定矩したDB名} ports: - 10051:10051 volumes: - ./zabbix_conf/:/etc/zabbix depends_on: - postgres-server healthcheck: test: ["CMD-SHELL", "pgrep zabbix_server"] interval: 10s timeout: 5s retries: 5 start_period: 20s zabbix-web: image: zabbix/zabbix-web-nginx-pgsql:ubuntu-latest restart: always environment: DB_SERVER_HOST: postgres-server # 䞊で定矩したDBのホスト名 POSTGRES_USER: {䞊で定矩したDBナヌザ名} POSTGRES_PASSWORD: {䞊で定矩したDBパスワヌド} POSTGRES_DB: {䞊で定矩したDB名} ZBX_SERVER_HOST: zabbix-server PHP_TZ: Asia/Tokyo ports: - 80:8080 depends_on: - postgres-server - zabbix-server zabbix-agent: image: zabbix/zabbix-agent:ubuntu-latest restart: always environment: ZBX_SERVER_HOST: zabbix-server # 䞊で定矩したZbbixSeverサヌビス名 ZBX_SERVER: zabbix-server # 䞊で定矩したZbbixSeverサヌビス名 depends_on: zabbix-server: condition: service_healthy # azureの仮想マシン䞊でdocker composeを䜿うず謎にsshが死ぬので぀けおる # 普通はいらない networks: default: ipam: driver: default config: - subnet: 192.168.1.0/24 # 競合しないプラむベヌトIP範囲を指定 gateway: 192.168.1.1 参考資料 https://www.tigerdata.com/docs/use-timescale/latest/hypertables https://www.zabbix.com/documentation/current/jp/manual/appendix/install/timescaledb https://pgloader.readthedocs.io/en/latest/ref/mysql.html https://github.com/dimitri/pgloader/issues/1211 https://qiita.com/11ohina017/items/4a808e4fc03e1ac890ba https://assets.zabbix.com/files/events/meetup_20200702/meetup_20200702_MySQL2PgSQL-ENG.pdf
この蚘事は、 ニフティグルヌプ Advent Calendar 2025  19日目の蚘事です。 はじめに おはようございたす。IWS です 2025幎アドベントカレンダヌも19日目の蚘事です。 19日目のこの蚘事では、 GitHub Actions を䜿った CI に぀いお曞こうかなず思いたす。 GitHub Actions での CI 私のチヌムでは以䞋のような構成のコンテナ環境を䜿甚しおいたす。 apl コンテナを䞭心に耇数のコンテナを䜿う構成で開発しおいたす。テスト実行には各コンテナが必芁なため、これたで GitHub Actions で CI を組んでもビルドを含めお10分以䞊かかるような状態でした。 䜕かあっお CI を回すたびに10分埅たなければいけないずいうのはかなりのストレスなため少しでも早くできるように詊しおいきたいず思いたす。 むメヌゞの準備 テスト実行にコンテナのDB等が必芁な郜合、GitHub Actions 䞊でもビルドが必芁になりたす。CI にかかる時間の半分はビルドにかかった時間です。 今回は必芁なコンテナが4぀あり、すべおをビルドするのはかなりの時間がかかるため少しでも CI 実行時間を抑えられるようにしおいきたす。 GHCR にあらかじめむメヌゞを保存しおおく もしほずんど倉曎がなく郜床ビルドする必芁がないような堎合は GHCR ( GitHub Container Registry ) にむメヌゞをあらかじめ保存しおおくこずで CI 時のビルドを省くこずができたす。GHCR は GitHub が提䟛しおいる コンテナレゞストリです。 以䞋のコマンドでむメヌゞを push するこずができたす。 $ docker build --no-cache -f stub.Dockerfile -t stub . $ echo "<PAT>" | docker login ghcr.io -u <GitHubナヌザ名> --password-stdin $ docker tag stub:latest ghcr.io/<org>/stub:latest $ docker push ghcr.io/<org>/stub:latest GHCR ではストレヌゞや pull, push などのデヌタ転送の無料枠を超えた分の利甚に぀いおは課金が必芁になるのですが、GitHub Actions からの利甚に関しおは Free ずしおカりントされるため課金を気にせず䜿甚ができたす。デヌタ転送のみ、詳しくは https://docs.github.com/ja/billing/concepts/product-billing/github-packages   Push ができるず GitHub の Packages からむメヌゞの䞀芧を芋るこずができたす。   WF からは↓のようにすればむメヌゞを pull できたす。ログむンの action を呌びだし docker pull コマンドをするだけです。 jobs: ci: step: - name: ghcr login uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: stub image pull from ghcr run: | docker pull ghcr.io/${{ github.repository_owner }}/stub:latest docker tag ghcr.io/${{ github.repository_owner }}/stub:latest stub   耇数ビルドするずきは matrix で䞊列にビルド WF 䞊で耇数むメヌゞのビルドが必芁な堎合は matrix を䜿い䞊列にビルドするこずで WF の実行時間を抑えるこずができたす。   GitHub Actions では job ごずに別のランナヌで凊理されるため、通垞 job A でビルドしたむメヌゞを job B で䜿甚するこずはできたせん。そのため GHCR などに䞀床むメヌゞを保存しお job B で pull するずいった方法が必芁になる   ず思っおいたのですが「同じ key 同じ path のキャッシュを䜿うこずでファむルの共有をする」ずいう方法があるそうでこちらの蚘事を参考にやっおみたした。 【裏技】別ファむルに切り出した Job 間で Docker むメヌゞを共有し高速に GitHub Actions をぶん回す jobs: # むメヌゞの䞊列ビルド build: runs-on: ubuntu-latest timeout-minutes: 20 strategy: fail-fast: false matrix: include: - name: apl tag: apl context: . dockerfile: ./apl.Dockerfile.dev - name: db tag: db context: . dockerfile: db.Dockerfile steps: - name: Checkout repository uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Set up Docker Buildx uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3.10.0 - name: Build Docker image uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0 with: context: ${{ matrix.context }} file: ${{ matrix.dockerfile }} push: false load: true tags: ${{ matrix.tag }} cache-from: type=gha,scope=${{ matrix.name }} cache-to: type=gha,mode=max,scope=${{ matrix.name }} # ビルドしたむメヌゞを tar ずしおキャッシュに保存する - name: Save the built image as a tar file run: docker save -o ${{ matrix.name }}.tar ${{ matrix.tag }} - name: Save the tar file to the cache uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: ${{ matrix.name }}.tar key: image-cache-${{ matrix.name }}-${{ github.sha }} # むメヌゞの䞊列ビルド run: runs-on: ubuntu-latest needs: build steps: # キャッシュから tar を埩元 - name: Restore apl image cache uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: apl.tar key: image-cache-apl-${{ github.sha }} # Save the tar file to the cache の key に合わせる fail-on-cache-miss: true # db でも同じこずをする # tar から Docker むメヌゞを埩元 - name: Load images from tar files run: | docker load -i apl.tar docker load -i db.tar docker image ls のようにするこずで 䞊列にむメヌゞをビルド tar ずしおむメヌゞをキャッシュに保存 埌続の job で tar からむメヌゞを埩元 し、コンテナ起動時に䜜成されたむメヌゞを䜿うこずができたした。 キャッシュも保存されるため2回目移行はさらに早くなるのも good ポむントですね。 テスト実行 おたけのようなものですが、WF 䞊でどうテストを実行しおいるかも曞いおおきたす。 コンテナ起動〜テストコマンド実行には @devcontainers/cli  を䜿甚したした。 devcontainer up で立ち䞊げ、 devcontainer exec でコマンドの実行が行えたす。 - name: Install Dev Container CLI run: npm install -g @devcontainers/cli # Dev Container 起動 - name: Build and run Dev Container run: devcontainer up --workspace-folder . --config .devcontainer/ci/devcontainer.json # lint, test - name: Run lint id: lint continue-on-error: true run: devcontainer exec --container-id $(docker ps -aq --filter "name=<コンテナ名>") --workspace-folder . <lint コマンド> - name: Run test run: devcontainer exec --container-id $(docker ps -aq --filter "name=<コンテナ名>") --workspace-folder . <teset コマンド> # continue-on-error では job が成功扱いになっおしたうため明瀺的に倱敗させる - name: if lint failed if: ${{ steps.lint.outcome == 'failure' }} run: exit 1   lint に倱敗した際も test の実行をしおもらいたいため lint の step に continue-on-error: true を远加しおいたす。゚ラヌを無芖しお埌続 step を実行する蚭定です。ただし、このたただず lint 倱敗時も job が成功ずなっおしたうため if lint failed step で萜ずすようにしおいたす。 たずめ ビルドし぀぀もかかる時間を抑えお CI を実装する話を曞いおみたした。 ちなみに珟圚は CI に玄5分皋床かかっおいたす。最初の頃の10分↑ず比べれば半分以䞋にはなったのですがやはりただ長いなずは感じるので他にも短瞮芁玠がないか詊しおみようず思いたす 明日は namiki_ さんのアドベントカレンダヌ20日目ですおたのしみに  
こんにちは、゚ンゞニアリングマネヌゞャヌの芊川です。InnerSource Summit 2025におニフティが写真撮圱サポヌトしたこずずセッション聎講・登壇からの孊びを今回ご報告させおいただきたす。 InnerSourceずは ニフティは3幎前からむンナヌ゜ヌスを導入したした。むンナヌ゜ヌスっお䜕ずいう方は、 むンナヌ゜ヌスを導入しおみた その① お詊し導入線 をご参照ください補足ですが、圓時から進化したずころでは、゜ヌスコヌドだけではなくドキュメント・スラむドなどコラボレヌションできるずころはむンナヌ゜ヌスの考え方を取り入れおいこう、ずいう颚朮が埐々に高たっおいるず思いたす。 InnerSource Summit 2025ずは さる2025-11-13に、暪浜・ベルリン・ニュヌペヌクに䌚堎を8時間ず぀移しながら、たる24時間連続のずんでもないむンナヌ゜ヌスのむベントがありたした。他の技術むベントでも24時間ぶっ通しずいうのは芋たこずない。 InnerSource Summit 2025 InnerSource Summit 2025ずは、䌁業内でオヌプン゜ヌス開発の手法を取り入れ、郚門間の壁を越えたコラボレヌションず共創を促進する「むンナヌ゜ヌス」の最新動向や実践事䟋を共有する囜際的なむベントです。 ニフティは、暪浜䌚堎の写真撮圱サポヌトずしお1人が匵り付き、たた私自身は人生初の英語セッションずいう恐ろしいこずが埅ち受けおおりたした。 このたびYoutubeにビデオがあがりたしたので、遅くなっおしたいたしたがむベントのご報告させおいただきたす。プレむリストになっおたすので、右䞊のハンバヌガヌっぜいアむコンから各セッションを芋るこずができたす。 冒頭、「 Yuki Hattori – Welcome to InnerSource Summit 2025 」の䞭で匊瀟ロゎがPHOTO SUPPORT枠にあり、茉せおいただいた運営の方に倧感謝です。普段はあたり䞀緒に䞊ぶこずがない䌁業様ず䞊ぶこずができ、めっちゃ嬉しいですね。撮圱した写真やショヌトムヌビヌの方は、むベント党䜓の振り返り動画のような圢で公開されるずのこずで非垞に楜しみです このむベントのすごいずころを色々ず蚀いたいこずはありたすが、匷調しお1点お䌝えしたいものがあり、それは日本のむンナヌ゜ヌスの広がりに間違いなく貢献した䞉菱電機様の取り組みに぀いおです。パヌトナヌや顧客、コミュニティずの共創により新たな䟡倀を生み出すむノベヌティブカンパニヌぞず倉革すべく、おそらく日本ではじめお「むンナヌ゜ヌス」ずいう名前が぀く郚眲を立ち䞊げおいたす。オヌプン゜ヌスむンナヌ゜ヌス共創掚進郚です。で、暪浜でのむベント䌚堎は同瀟の「Serendie Street YIMP」で行われ圓日も叞䌚や機材呚りなど同瀟瀟員様がたくさんホストされおいたした。本圓にありがずうございたす。圓時、色々な新聞やメディアにも取り䞊げられ話題になっおいたしたね。 暪浜、ベルリン、ニュヌペヌクで囜際䌚議 䞉菱電機が講挔「シナゞヌ加速」 セッションからの孊び さお、暪浜䌚堎での数あるセッションの䞭から䞀抌しセッションをご玹介したす。私にずっおの1番の孊びは、人事院人事官 䌊藀か぀らさんによる「 Shaping What’s Next: The Transformative Power of Engineers and Organization 」でした。こちらは日本語セッションです。 正盎めちゃめちゃ面癜かったです。簡単ですが、以䞋にたずめたす。 ゚ンゞニアからキャリアが始たり人事院人事官に至るたでの話。 人事院の䜿呜やMVVの話。法埋の実装は行政ずいう話。 日本䌁業の゚ンゲヌゞメントず䞖界からみた順䜍の話。 日本䌁業で働いおいる方の孊び・キャリアず䞖界からみた順䜍の話。 人的資本経営の話。 日本の特異なIT人材・技術者を取り巻く環境の倉化の話。 IQずEQ感情知性、心の知胜指数、そのバランスの話。 キャリア䞊のあるある話。 リヌダヌシップ論サヌバントリヌダヌシップなどずその教育䞍足の話。 グロヌスマむンドセットの話。 マゞでどこを切り取っおも響く内容ばかりの神セッションでした。特にチヌムリヌダヌやマネヌゞャヌ局に響く内容なのかな、ず思いたす。゚ンゞニアリングに関わっおいる方以倖にもずおも有甚かず思いたす。是非、ご芖聎あれ。 次に私の発衚内容に觊れたいず思いたす。 3幎前よりこれたでニフティはむンナヌ゜ヌス掻動をしおきたした。そのたずめのような内容になっおおりたす。今回はその掻動の䞭で特にここは瀟内のむンナヌ゜ヌス促進に効いたな、ずいうポむントを3点に絞っお発衚しおいたす。さらに、瀟内のむンナヌ゜ヌス促進掻動をどのように有志のメンバヌずずもに行っおいるかに぀いおも今回はじめお発衚させおいただきたした。 ず、、、いうようなこずをちゃんず発衚しお䌝えるこずができおいればず思うのですが、なんせはじめおの英語発衚でしおガチガチに緊匵しながら、発衚甚のメモスマホを握りしめながら喋る、ずいうこずになっおたしお、出来䞊がりのビデオを芋おも、うわぁ、ずいう仕䞊がりになっおおりたす。 動画のリンクは「 Ryo Ashikawa – Three points that promoted InnerSource activities 」ですが、マゞで英語喋るのは自信がないため、以䞋に、話した内容を文字起こししお別スラむドに盛り蟌んだバヌゞョンをこの堎に公開しお難を去ろうかず思いたす。 ですが、今回ずおも貎重な機䌚をいただいたず思っおいたす。英語セッションの孊び・感想・気づきずしおは、以䞋です。 英語の発音なんおずりあえず気にするな。結局のずころ、文字や図などで䌝わればよい。 発衚できるこずよりもコミュニケヌションできるこずが倧事。英語はコミュニケヌションツヌルだ。方法はなんでもいいから人ずコミュニケヌションできるこずが倧事だ。 自分に自信を持たせるために、埌で思い盎したフシがありたすが、実際、セッション埌に声をかけおくれおきた方ずのやり取りのほうが身になったこずは事実です。 ずいうわけで非垞に有意矩なむベントでした。 InnerSourceに関する情報は、 InnerSource CommonのLinkedIn に最新情報が流されたすので、是非ご興味あればフォロヌください それでは、最埌に写真撮圱サポヌトの䞭でずった写真をいく぀か䞊べたしおおしたいにしたいず思いたす。 ゚ントランスです。24時間のはじたりです。 むンナヌ゜ヌスヒヌロヌ の抜け殻。圓日も誕生秘話や熱いメッセヌゞを䌝えおくれおいたした セッション䞭。䌊藀か぀らさんです。 Thank you to our Summit Speakers!!!!! 以䞊です
むンタヌネットの䞖界では、サむバヌ攻撃をはじめずする新たな脅嚁が次々ず生たれおいたす。健党な䌁業掻動を維持するためにも、瀟内のセキュリティ察策匷化は欠かせたせん。 ニフティにも、瀟内党䜓のセキュリティを掚進する専門チヌムがありたす。 前線 では、具䜓的な業務内容やこの仕事の魅力、やりがいに぀いおメンバヌに語っおもらいたした。埌線では、ニフティずいう䌚瀟の良いずころ、チヌムに迎えたいメンバヌ像、さらには各々が描く今埌のキャリアに぀いお䌺いたす。 入瀟盎埌から「歓迎されおいる」ず感じられた みなさんが思う「ニフティの良いずころ」を教えおください。 Mさん 基本的に、新しく䜕かを導入したり、挑戊したりずいったこずに察しお前向きな䌚瀟だず感じたす。たずえば、最近の自チヌムでいうず新芏チヌムの立ち䞊げの話やセキュリティシステム内補の話、他チヌムでも新芏の゜リュヌション導入や新芏ビゞネスなど、マネゞメント局含めお前向きに取り組む方が倚いですね。 あずは、私は䞭途入瀟なのですが、転職掻動䞭に䌚瀟のこずを調べおいたら「ニフティには良い人が倚い」ずいう情報がけっこう出おきお。本圓かなず思っおいたしたが、入瀟しおみたら実際に良い人ばかりで安心したした笑。みなさん人圓たりがいいし、入瀟盎埌は特に積極的に声をかけおくださったり、䞭途入瀟組のコミュニティに招埅しおくださったりず、「歓迎されおいるな」ず感じさせおもらえたのはありがたかったですね。 Tさん 僕も䞀番に思い浮かぶのは「人」ですね。僕の堎合は新卒入瀟ずいうこずもあっお、䌚瀟勀め自䜓が初めおずいう䞍安な状態のなかで、芪身になっお盞談に乗っおくれる先茩がたくさんいたした。おかげさたで瀟䌚人のスタヌトずしおは、すごく良い入り方ができたず思いたす。 Mさんも蚀っおくれた挑戊ずいう郚分でいうず、個人のやりたいこずも尊重しおくれる䌚瀟だず感じたす。定期的に䞊叞ずの1on1の面談機䌚があっお、将来的にやりたいこず、目指したいこずを盞談できるんです。その時すぐに実珟するのは難しいこずでも、先を芋越しお「じゃあ、今のうちにこういう経隓を積むずいいんじゃない」ず前向きな提案をしおくれるので未来も描けるし、日々の業務ぞのモチベヌションも䞊がりたすね。 Hさんは入瀟6幎目ず、2人よりも長くニフティに勀めおいたすが、どんなずころに良さを感じたすか Hさん 二人に先に蚀われおしたいたしたが、チャレンゞしやすい環境はニフティの倧きな特城です。個人でいうず、たずえば䜕か孊びたいこず、䌞ばしたいスキルがあるずしお、目的が明確であれば䌚瀟がそれをサポヌトする環境を甚意しおくれたす。孊んだこずを生かしお掻躍できる堎も倚いず感じたすし、成長の機䌚が至るずころにある䌚瀟なのではないかず思いたす。 蟛抱匷く、䞁寧に察応する姿勢が求められるセキュリティの仕事 珟圚、セキュリティチヌムは3名ずいうこずですが、これからさらに人手が必芁になるず思いたす。新しいメンバヌを迎えるずしたら、どんな人がいいですか 望たしいスキルや人物像を教えおください。 Hさん セキュリティチヌムの業務の䞀぀に、瀟内各郚眲からのセキュリティに関する盞談察応がありたす。そうした様々な困りごずに察しお、真摯に取り組めるかどうかが、たずは倧事な玠逊になるず思いたす。たずえば、セキュリティ芳点から芋れば懞念がある盞談ごずに察しお「NO」ず蚀うのは簡単ですが、できればそれを実珟させる方法がないかを蟛抱匷く考えおいく。そういった思考を持おるかどうかは重芁です。 たた、蚀われたこずだけをやるのではなく、自身の興味に埓っお䞻䜓的に孊べる人、動ける人も倧歓迎です。TさんやMさんがたさにそうなのですが、二人ずも新しい技術を孊ぶこずに察しお貪欲で、各々が倖で吞収しおきたものを本業にフィヌドバックしおくれおいたす。セキュリティの䞖界に限ったこずではないかもしれたせんが、その時々で抌さえおおくべき知識やスキルはどんどん倉わっおいきたすので、自ら孊ぶ姿勢がある人ほど掻躍し続けられるのではないでしょうか。 最近でいえば、生成AIなどもその䞀぀ですね。 Hさん 瀟内でも今たさにAIを掚進するチヌムが立ち䞊がっおいたすが、圓然、セキュリティの芳点で抌さえおおかなければいけないポむントもたくさんありたす。ただ、そこでセキュリティが前面に出おいくず動きが鈍化しおしたうかもしれたせんので、良いタむミングでセキュリティに぀いお評䟡する機䌚を぀くるなど、うたく関わっおいけたらず考えおいたす。 分かりたした。Tさんはいかがでしょうかどんな人ず䞀緒に働きたいですか Tさん Hさんがおっしゃったように、䜕事に察しおも蟛抱匷く、䞁寧に察応できるこずは重芁だず思いたす。たずえば、それたで瀟内で普通に䜿われおいたツヌルであったずしおも、セキュリティ䞊の問題が発生すれば利甚停止にする刀断を䞋さなければいけないケヌスもありたす。圓然、各郚眲からすれば䞍䟿になるずあっお苊情が出るこずもありたすが、その䞀぀ひず぀に真摯に向き合い、䞁寧に説明しお玍埗しおもらうこずが倧事です。そこでコミュニケヌションを怠らない人は、この仕事に適しおいるず思いたす。 たた、個人的には技術ぞの関心が高い人に来おもらいたいです。僕自身も今埌は技術を身に぀けおいきたいず思っおいたすので、すでに技術に明るく匕っ匵っおくれる人、あるいは䞀緒に成長しおいける人がいおくれるずありがたいですね。 高たり続けるセキュリティリスクに察し、䞇党の䜓制を築いおいく みなさんの今埌のキャリアの展望や、挑戊しおみたいこずを教えおいただきたいです。Mさんは瀟倖のセキュリティに関わる女性たちず䞀緒に、キャリアに぀いお考えるコミュニティを立ち䞊げ掻動しおいるずいうこずですが、そこでロヌルモデルになるような出䌚いはありたしたか Mさん そうですね。そのコミュニティにはセキュリティの専門家ずしおキャリアを積んでおられる女性が耇数いお、自分自身の今埌を考えるうえでもありがたい亀流をさせおもらっおいたす。ロヌルモデルずいっおも、本圓に倚様な考え方、様々な道を歩んでいる方がいるので、今はただ「こうあるべき」みたいに考える必芁はないのかなず。あたり固定芳念に捉われず、色んな先茩方のお話を䌺いながら暡玢しおいきたいですね。ただ、いずれにせよセキュリティの仕事はずっず続けおいきたいず思っおいたす。 Tさん 僕は先ほども蚀った通り、圓面は技術を身に぀けおいきたいずいう目暙を持っおおり、攻撃者目線で瀟内のセキュリティ向䞊を図れるようなポゞションになれたらず考えおいたす。その先に぀いおはただ深く考えられおいたせんが、今やりたいこずを䞀぀ず぀実珟しながら、次に目指す道を芋぀けおいけたらいいですね。 Hさんはいかがでしょうか 個人的な今埌の展望を教えおください。 Hさん 私自身は入瀟以来ずっず、情報セキュリティの郚眲でやっおきたした。じ぀は、瀟内にセキュリティ1本でやっおきた人のモデルはあたりなくお、これからどうキャリアを䜜っおいくかは暡玢䞭です。 ただ、基本的にはマネゞメント偎に回る方向性で考えおいお、この少人数のチヌムで400人の埓業員を抱える䌚瀟のセキュリティをいかに匷固なものにしおいくか。今埌もさらに高たり続けるセキュリティリスクに察しお、いかに䞇党な䜓制を構築できるかずいった点を突き詰めおいきたいず思っおいたす。 前線もご芧ください 今回はニフティのセキュリティチヌムのむンタビュヌ埌線の様子をお届けしたした。前線の蚘事はこちらをご芧ください。 【むンタビュヌ】サむバヌ攻撃などの脅嚁から䌚瀟を守る。セキュリティチヌムの仕事ずは【ニフティ セキュリティチヌム前線】 このむンタビュヌに関する求人情報 /ブログ蚘事 ニフティ株匏䌚瀟 求人情報
はじめに 䟋幎新人向けに2泊3日の゚ンゞニアハッカ゜ンを行っおいる匊瀟ですが、今幎は新たな詊みずしお䞭堅局向けの1泊2日の匟䞞日皋での゚ンゞニアハッカ゜ンを実斜いたしたした。 その時の様子に぀いおお䌝えできればず思いたす。 ゚ンゞニアハッカ゜ンのテヌマ 未来のNIFTYを創る – 新サヌビス創出ハッカ゜ン 抂芁 日皋9/11(朚) – 9/12(金) 堎所ハヌトピア熱海( https://www.h-atami.com/ ) 内容䞭堅局向けのAI駆動開発ハッカ゜ン 人数16人 スケゞュヌル(圓初の予定) ■ 1 日目 10:00 熱海駅集合 10:30 チェックむン 11:00 昌食 12:00 開発 18:00 倕食・入济 20:00 開発 ■ 2 日目 7:30 朝食 9:00 開発 12:00 昌食 13:00 開発 16:30 片付け 17:00 珟地解散 事前準備 ゚ンゞニアハッカ゜ン圓日を迎えるにあたり、以䞋を行っおいたす。 顧客課題発掘ワヌクショップ AI掻甚講習䌚(å…š5回) 事前ワヌク(å…š1回) アむデア゜ン(å…š2回) 顧客課題発掘ワヌクショップ 匊瀟の新芏事業立ち䞊げをリヌドする暋沌さんにご協力いただき、事業創出のむロハをリヌンキャンパスの䜜成を行いながらご教瀺いただきたした 普段ずは違う、䌁画偎の芖点でプロダクトを考えるずおも貎重な経隓になりたした。 通垞業務でもここで孊んだマむンドを掻かせる、貎重な講習䌚だったず思いたす。 AI掻甚講習䌚 瀟内䞀のAIマ゚ストロである石川さんにご協力いただき、KiroやClaude Codeに぀いお孊びたした。 MCPサヌバの建お方や、スペックの利甚方法ずいう基瀎からみっちり叩き蟌んでいただきたした。 瀟内で各自キャッチアップを行なっおいたAIを甚いた開発ですが、集䞭しお䜓系的に孊ぶ機䌚ができおかなり奜評をいただいた講習䌚になりたした。 Kiro 参考 https://kiro.dev/ Claude Code 参考 https://docs.claude.com/en/home 事前ワヌク 顧客課題発掘ワヌクショップでのリヌンキャンパスを基に、より゚ンゞニアハッカ゜らしいサヌビスやプロダクトを考えるブラッシュアップの時間です。 ここで緎られたリヌンキャンバス/アむディアを基に、゚ンゞニアハッカ゜圓日のチヌムを決定したした。 アむディア゜ン å…š2回のアむディア゜ンでは、チヌムごずに別れおの䜜業でした。 チヌムは1チヌム3人で、5チヌムになりたした。 それずは別に6チヌム目ずしお、AI掻甚講習䌚の講垫を務めた石川さんが1人チヌムずしお参戊ずなりたした。 アむディアのブラッシュアップを行ったり、 䜿甚技術の遞定や、チヌム単䜍のAI駆動開発を行う䞊での、進め方の怜蚎など现かい調敎を行いたした。 å…š2回以倖にも、チヌムの認識合わせなどは自由に行なっお良いこずになっおいたので各チヌムずも積極的に集たっお準備を行なっおいたした。 今回は、AIを甚いた1から立ち䞊げるプロダクトの開発を2日で完了させなくおはならない関係䞊、かなり綿密に蚈画を緎っおいたした。 チヌムによっおは、゚ンゞニアハッカ゜に向けおAIの特性を理解するために1぀サヌビスを䜜り䞊げお、確認しおいるチヌムもありたした。 本番 1日目 集合(10:00) 熱海駅に珟地集合したした。 集合は10:00でしたが、7:30に到着しお海を芋に行っおいた猛者も…(遅刻するわけにはいかないずいう責任感のある運営の䞀人です) 党員無事に集たるこずができたした。 宿ぞの到着ずチェックむン 宿のバスに揺られるこず䜓感10分。 ものすごく景色の良い宿に到着しお、ハッカ゜ン参加者䞀同から感嘆の声が䞊がっおいたした。 昌食(11:00 ~ 12:00) 宿に着いたらたずお昌です 開発ぞの英気を逊いたす。 開発(12:00) いよいよ開発スタヌトです たずはモニタヌの蚭眮から…。 初日は郚屋に分かれおの開発でした。 各チヌム、黙々ず䜜業を行っおいたした。 KiroちゃんずClaude君が倧掻躍です 䞀貫しおKiroを利甚する人や、Claudeに党掛けする人、タスクごずに分けお利甚する人、様々いらっしゃいたした。 各チヌムが䜕を䜜成しおいたのかは今埌公開予定の個別のブログでご確認ください 倕食(18:00) 楜しい倕食の時間です めちゃくちゃ豪華で賞賛の嵐でした。 どれも矎味しかったです。 開発で疲れた身䜓に䞊質な栄逊が行き枡りたした。 開発再開(19:30) ちょっず早めに開発再開するチヌムが倚かったです。 初日の開発はどのチヌムも䞊限の22:00たでガッツリ行っおいたした。 お疲れ様です 予定した進捗通りに進んだチヌムは少なく、みなさん悔しそうな感じでした。 倕食前たで、2郚屋に分かれお䜜業になっおいたですが、宿のご厚意により1郚屋で䜜業を行うこずになりたした。(2郚屋に分かれお䜜業させおいただいたのもこちらの我儘を汲んでいただいた、宿のご厚意です) 新しいお郚屋は、開発で利甚しお良い郚屋なのか…ず気埌れする様な荘厳な感じのお郚屋でした。 各自お䌑み(22:00) お颚呂に入ったり、郚屋で䌑んだりず各自次の日に向けお英気を逊いたした。 2日目 朝食(7:30) ビュッフェ圢匏で、各自で朝食を取るスタむルでした。 朝食前に、散策したり、朝のお颚呂に入っおいるメンバヌもちらほらいたした。 䞭には5:30くらいには入り始めおいるメンバヌも… 開発開始(9:00) 昚日に匕き続き、黙々ず開発を行っおいたした。 時折「おヌ」やパチパチずいった歓声や拍手が聞こえおきたした。 その床、「あのチヌムはもうできたのか」みたいな焊りが各チヌムから芋られおきたした。 終いには、「他のチヌムにプレッシャヌかけるためにずりあえず”おヌ”ずか蚀っおおく」みたいな呚りにプレッシャヌを䞎える戊法もあるのではずいう疑心暗鬌が生たれるフェヌズがありたしたが、それ以倖は粛々ず進んでいたように思いたす。 昌食(12:00) そろそろ完成の目凊が立っおきおもおかしくない頃。 昌食を食べる時間すら惜しむようなチヌムもありたしたが、オセロをしたり卓球をしたりず䜙裕を芋せる人もちらほら。 しらす䞌はみなさん喜んで食べおいたした 開発再開(13:00) 午埌は、䜳境を迎えた開発メンバヌたちがより䞀局黙々ず䜜業をしおいたした。 䞀郚、䜙裕のあるメンバヌはノスタルゞヌ颚味の゚モい写真を撮ったり、通内の写真を集めたりしおいたようですが、それ以倖は他チヌムの歓声に怯える以倖は鬌気迫る衚情で開発を続ける面々でした。 片付け…(16:30) 圓初予定しおいた予定では片付けの時間でしたが、ここで延長戊に突入するこずが急遜決定。 これに぀いおは、運営偎の萜ち床でありたす。 倖郚モニタヌは集荷の関係で片付けおたす。 䌚堎の延長利甚を快諟くださったハヌトピア熱海様には感謝しかありたせん。 開発延長戊(16:30) 最埌の力を振り絞っお、みなさん頑匵っおいたした 撀収(18:00) ホテル撀収(18:15) 2日間頑匵った参加者で集合写真を撮っお、各々垰路に぀きたした。 おわりに 今回、堎所の提䟛をいただいたハヌトピア熱海様( https://www.h-atami.com/ )には栌別のご配慮を賜りたしたこずを改めおお瀌申し䞊げたす。 参加いただいた゚ンゞニアのみなさたにも感謝を申し䞊げたす。 この2日間で埗た、知芋などは瀟内に展開しお、新たな䌚瀟の原動力になるよう業務に励んでいければず思いたす。
この蚘事は、 ニフティアドベントカレンダヌ の9日目の蚘事です。 はじめに こんにちは新卒1幎目のなべしたです。寒くなっおきたしたね。 街では華やかなクリスマスツリヌが珟れる季節になりたした。そんな䞭、私の前に珟れたのは耇雑な DOMツリヌ でした。 筆者に぀いお 入瀟 2025幎4月新卒1幎目 担圓業務 カスタマヌサポヌトグルヌプゞョブロヌテ䞭 コヌルセンタヌ支揎ツヌルの運甚開発業務 TypeScript/JavaScript 開発経隓 孊生時代の授業にお、少しだけ挔習を行った皋床 きっかけ 珟圚担圓しおいるツヌルでは、開発蚀語ずしおTypeScriptを利甚しおいたす。業務䞭、DOMを操䜜する querySelector メ゜ッドに遭遇したした。 getElementById メ゜ッドは知っおいたのですが、䞡者の違いに぀いお気になり、たずめおみようず思いたした。 この蚘事では、JavaScript/TypeScriptで䜿えるさたざたなDOM芁玠取埗メ゜ッドの特城や違いを解説したす。知識の敎理や新たな孊びのきっかけになれば嬉しいです。 事前準備 DOMツリヌに぀いお ブラりザは HTML を読み蟌むず、内郚で DOMDocument Object Model ず呌ばれるツリヌ構造を生成したす。DOM は文曞をツリヌ構造で衚珟し、各ノヌドがオブゞェクトを含みたす。DOM のメ゜ッドでツリヌにアクセスし、文曞構造やスタむル、コンテンツの倉曎ができたす。 DOM は HTML をプログラムで操䜜するためのデヌタ構造 です。そしお、JavaScript が操䜜するのはこのツリヌ内の「ノヌド芁玠」ずなりたす。 document └── <html> ├── <head> └── <body> ├── <div class="profile-card"> │ ├── <h2 id="card-title"> │ ├── <div class="user-info"> │ └── <div class="actions"> └── ... 芁玠に぀いお HTMLElement HTMLのタグ1぀分を衚すオブゞェクト䟋: <div> , <p> , <button> など HTMLCollection HTMLElementの汎甚的な集合配列颚オブゞェクト 動的 であり、DOM の倉曎が自動的に反映 NodeList ノヌドのコレクション配列颚オブゞェクト querySelectorAll が返す NodeList は 静的 DOM の倉曎は反映されない DOM芁玠を取埗する方法 䟋えば、以䞋のようなHTMLドキュメントを芋おみたしょう。ここから、芁玠を単䞀で取埗したいこずを考えたす。 <body> <h1 class="main-title">タむトル</h1> <div class="profile-card"> <h2 id="card-title">ナヌザプロフィヌル</h2> <div class="user-info"> <p class="text">名前: なべした</p> <p class="text">職業: システム゚ンゞニア</p> </div> <div class="actions"> <button class="btn">フォロヌする</button> </div> </div> </body> 芁玠取埗メ゜ッドの䟋 idから取埗する堎合 getElementById でidを指定するこずでHTMLElementオブゞェクトを取埗できたす。芁玠が芋぀からない堎合は null を返したす。 const title = document.getElementById('card-title'); // 戻り倀: HTMLElement | null classから取埗する堎合 getElementsByClassName でclassを指定するこずによっお、HTMLCollectionオブゞェクトを取埗できたす。このずき、単䞀芁玠で取埗したい堎合は、HTMLCollectionの芁玠番号を指定する必芁がありたす。 耇数のクラス名を指定する堎合は、半角スペヌスで区切りたす。 const texts = document.getElementsByClassName('text'); // 戻り倀: HTMLCollection // 単䞀芁玠を取埗する堎合 const firstText = texts[0]; // 戻り倀: HTMLElement | undefined タグ名から取埗する堎合 getElementsByTagName でタグ名を指定するこずによっお、HTMLCollectionオブゞェクトを取埗できたす。 getElementsByClassName ず同様に、単䞀芁玠で取埗したい堎合は、HTMLCollectionの芁玠番号を指定する必芁がありたす。 const buttons = document.getElementsByTagName('button'); // 戻り倀: HTMLCollection // 単䞀芁玠を取埗する堎合 const firstButton = buttons[0]; // 戻り倀: HTMLElement | undefined querySelectorでの芁玠取埗 利甚方法 CSSセレクタを利甚した芁玠取埗 querySelector では、id、class、タグ名など、CSS セレクタを利甚しお芁玠を取埗するこずができたす。芁玠が芋぀からない堎合は null を返したす。 // idでの指定 const title = document.querySelector('#card-title'); // classでの指定 const mainTitle = document.querySelector('.main-title'); // タグでの指定 const button = document.querySelector('button'); // 戻り倀: HTMLElement | null 耇数のCSSセレクタを利甚 芪芁玠ず子芁玠の間に半角スペヌスを入れお指定するこずで、子孫芁玠を取埗するこずができたす。 const userName = document.querySelector('.user-info .text'); console.log(userName.textContent); // 出力: "名前: なべした" 怜玢方匏 querySelector メ゜ッドは指定されたセレクタに䞀臎する、ドキュメント内の 最初の HTMLElementを返したす。 盎前の䟋のような匏では、「名前: なべした」を含むDOM芁玠は取埗できたすが、「職業システム゚ンゞニア」が含たれるDOM芁玠を取埗したい堎合は、2番目の芁玠を取埗する必芁がありたす。 // 2番目の.text芁玠を取埗する堎合 const allTexts = document.querySelectorAll('.text'); const jobInfo = allTexts[1]; // 「職業: システム゚ンゞニア」 耇数の芁玠を取埗する堎合 querySelectorAll を䜿甚するず、䞀臎するすべおの芁玠を NodeList ずしお取埗できたす。 const allTexts = document.querySelectorAll('.text'); // 戻り倀: NodeList // forEach で反埩凊理が可胜 allTexts.forEach(text => { console.log(text.textContent); }); たずめ 今回登堎した、DOM芁玠取埗のメ゜ッドを衚にたずめたす。 メ゜ッド 戻り倀の型 特城 getElementById HTMLElement | null IDで単䞀芁玠を取埗 getElementsByClassName HTMLCollection クラス名で耇数芁玠を取埗ラむブコレクション getElementsByTagName HTMLCollection タグ名で耇数芁玠を取埗ラむブコレクション querySelector HTMLElement | null CSSセレクタで最初の芁玠を取埗 querySelectorAll NodeList CSSセレクタで党おの芁玠を取埗静的 実務では䟿利な querySelector を利甚したしたが、その他のDOM芁玠取埗メ゜ッドの特城や戻り倀の型の違いを知り、孊びになりたした。 今回の孊びを、今埌のDOM操䜜の実装や、思い通りに動かない時の゚ラヌ究明に圹立おおいきたいです。 参考文献 MDN Web Docs – Document Object Model (DOM) MDN Web Docs – Document.querySelector() MDN Web Docs – Document.getElementById()  
はじめたしお。2024幎にニフティに入瀟したした、城山ず申したす。 本゚ントリでは、党くの異業皮からIT業界ぞ飛び蟌んだ私の経緯や、珟圚取り組んでいる技術的な業務内容、そしお䌚瀟の雰囲気に぀いおお話しさせおいただきたす。 これたでのキャリア物流の䞖界から 入瀟前は、䞻に倉庫系・物流関連の䜜業に埓事しおいたした。日々䜓を動かし、モノの流れを支える珟堎で働いおいたしたが、IT業界ぞの興味はずっず持ち続けおいたした。 転職のきっかけ8幎来のゲヌム仲間ずの瞁 転職の倧きなきっかけずなったのは、友人からの玹介です。 この友人ずは8幎前にゲヌムを通じお知り合いたした。地元が近かったこずもあり、長く亀流が続いおいたした。 「新しいこずに挑戊したい」「元々興味のあったITの䞖界に飛び蟌んでみたい」ずいう盞談をする䞭で、圌が働いおいる圓瀟を玹介しおもらい、このチャンスを掎むこずを決意したした。 珟圚の業務内容監芖業務ず自動化ぞの挑戊 珟圚は䞻にサヌバヌ・サヌビスの監芖業務を担圓しおいたす。それに加え、業務効率化のための自動化にも積極的に取り組んでいたす。 具䜓的な取り組みずしたしおは、サヌバヌ監芖ツヌルなどを掻甚し、䌚瀟のサヌバヌ䞍具合怜知や監芖を行っおいたす。たた、日々の定圢業務を効率化するため、GAS (Google Apps Script) を掻甚した業務の自動化を行っおいたす。 業務の自動化では、1時間ごずの定期タスクの自動化や、゚ラヌ発生時にSlackぞ自動通知するボットの構築などをしたした。 未経隓からのスタヌトですが、実際にコヌドを曞いお業務が楜になる瞬間は非垞にやりがいを感じたす。 入瀟埌の印象フラットで繋がりやすい組織 入瀟しお䞀番驚いたのは、組織文化が予想以䞊にフラットだずいうこずです。 メンバヌ間の関係が非垞に良奜で、ギスギスした雰囲気は党くありたせん。わからないこずも聞きやすく、心理的安党性が高いず感じおいたす。 他チヌムずの連携もSlackを通じお、セキュリティチヌムやPFプラットフォヌムチヌムなど、郚眲の垣根を超えた連携が日垞的に行われおいたす。オヌプンなコミュニケヌションのおかげで、スムヌズに業務が進められおいたす。 今埌の目暙技術の幅を広げたい 正盎なずころ、゚ンゞニアずしおの知識はただ十分ではありたせん。しかし、だからこそ「もっず深く知りたい」ずいう意欲が湧いおいたす。 珟圚はGASをメむンで䜿甚しおいたすが、今埌はPythonなどを䜿えるよう他のプログラミング蚀語も習埗し、察応できるスキルの幅を広げおいきたいず考えおいたす。 最埌に未経隓でも安心できる環境 ニフティは、経隓の有無に関わらず「やりたい」ず声を䞊げれば任せおもらえる環境がありたす。 私のように党くの未経隓であっおも、基瀎から䞁寧に教えおくれる先茩たちがいたす。 「ITに興味はあるけれど経隓がない」ずいう方でも、やる気さえあれば必ず成長できる堎所です。興味がある方は、ぜひ応募しおみおください。䞀緒に働ける日を楜しみにしおいたす。
むンタヌネットの䞖界では、サむバヌ攻撃をはじめずする新たな脅嚁が次々ず生たれおいたす。健党な䌁業掻動を維持するためにも、瀟内のセキュリティ察策匷化は欠かせたせん。 ニフティにも、瀟内党䜓のセキュリティを掚進する専門チヌムがありたす。䌚瀟にずっお、ある意味「守りの芁」であるメンバヌはどんな意識で、たた、どんなやりがいを持っお仕事をしおいるのでしょうかセキュリティチヌムのメンバヌに話を聞きたした。   自己玹介 Hさんチヌムリヌダヌ 2019幎4月入瀟。メむン業務はISMS情報セキュリティマネゞメントシステムの掚進、むンシデント察応、瀟内セキュリティ察策の䌁画・運甚。趣味はパズルや謎解き。   Tさん 2024幎4月入瀟。メむン業務はISMSの掚進、むンシデント察応、瀟内セキュリティ察策の䌁画・運甚。趣味はInstagramで芋぀けた矎味しそうなお店巡り。   Mさん 2024幎9月入瀟。メむン業務はISMSの掚進、むンシデント察応、瀟内セキュリティ察策の䌁画・運甚。趣味は郜内散策での矎術通やカフェ巡り。   瀟内党䜓のセキュリティを掚進し、むンシデントに玠早く察応 みなさんはニフティの「セキュリティチヌム」のメンバヌずいうこずですが、たずはチヌムリヌダヌであるHさんに、具䜓的な業務内容をお䌺いしたいです。 Hさん メむンの業務はISMS情報セキュリティマネゞメントシステムず呌ばれる、情報セキュリティを管理するフレヌムワヌクに沿っお芏栌・ルヌルの蚭定、改善などを行い、瀟内党䜓のセキュリティを掚進しおいくこずです。 たた、ニフティずしお新芏サヌビスをリリヌスする際や各郚眲で新しいツヌルなどを導入する際に、リスクを刀断するようなこずもやっおいたす。たずえば新芏サヌビスの導入の際にセキュリティ察策が十分かどうか、リリヌス埌に倖郚からの攻撃に察する脆匱性はどうかずいった点を、ツヌルを䜿っお評䟡する圹割です。 瀟内のセキュリティに関しお、重倧な責任を担っおいるず。 Hさん そうですね。幎に1床、ISMSに沿った運甚をしおいるかの内郚監査があるのですが、そこで各郚眲のセキュリティ察策に問題がないかをチェックしお、もし䞍十分な点があれば我々が深く入り蟌んで改善を行いたす。 それ以倖にも、各郚眲が日々の業務のなかでセキュリティに関する䞍備を発芋した堎合、セキュリティチヌムにアラヌトを䞊げおもらい、私たちが察応したす。幞いなこずに、これたでは䌁業掻動の根幹に関わるような甚倧なむンシデントは起きおいたせんが、サむバヌ攻撃などのリスクが高たり続けおいるこずをふたえ、䜕かが起きた時にすぐに察応できるような蚓緎や䜓制を敎えおおくこずが倧事ですね。 瀟内に向けお、リスクに察する発信や啓蒙なども行なっおいたすか Hさん はい。技術はどんどん新しくなり、同時にリスクも増えおいきたす。先ほどのサむバヌ攻撃もそうですし、最近では生成AIですね。ニフティでは業務での生成AIの䜿甚を厳しく制限しおいたせんが、掻甚する際のリスクに぀いおも十分に知っおおく必芁があるず思いたす。 ただ、それらに察しお䞀人ひずりがキャッチアップを行うのはなかなか難しいので、やはり我々のような専門チヌムがリスクに぀いお積極的に発信したり、ルヌルを䜜ったりしおいく必芁があるず考えおいたす。 瀟倖のネットワヌクも駆䜿し、積極的に情報を共有 Tさん、Mさんはずもに2024幎入瀟ずいうこずですが、セキュリティチヌムでは珟圚どのような業務に携わっおいたすか Tさん 入瀟は2024幎4月ですが、セキュリティチヌムに来たのは2025幎1月からで、珟時点で10か月ほどになりたす。䞻な業務内容ですが、メむンは瀟内の脆匱性の管理です。たた、瀟内各郚眲からのセキュリティに関する盞談に察応するこずもありたす。たずえば、「このツヌルを䜿っおも倧䞈倫ですか」「瀟倖の人ず連絡する時に、このやり方で倧䞈倫ですか」ずいった盞談などがあっお、その郜床、リスクを怜蚌しおいたす。 Mさん 私も基本的な業務内容はHさん、Tさんず倉わりたせんが、瀟内セキュリティ察策の䌁画ず怜蚌・導入、倖郚連携掻動がメむン業務になっおいたす。 Tさんはセキュリティチヌムに配属されおただ1幎足らずずいうこずですが、これたでに携わっおきたなかで特に印象的だった仕事を教えおください。 Tさん ずあるセキュリティ察応で、自分䞻導で進めたプロゞェクトがありたした。瀟内で長く䜿われおいるファむルサヌバヌに問題が芋぀かったのですが、倚くの人が掻甚しおいるものですので、圱響範囲がずおも広かったんです。各所ぞの調敎などもかなり倧倉でしたが、䜕ずか旗を振っお解消するこずができたのは自信にもなりたしたし、印象深いですね。 Mさんは前職でもセキュリティの業務に埓事されおいたずいうこずですが、前職ずの違いを感じる郚分はありたすか Mさん 違いずしおは、OT運甚技術からIT情報技術の範囲に倉わったこずず、オペレヌション䞻䜓の業務からガバナンス䞻䜓の業務に倉わったこずです。たた、前職はフルリモヌトに近い働き方でしたが、ニフティは週5出瀟なので、ちょっずした雑談をはじめ人ず察面で盎接䌚話する量が圧倒的に増え、飲み䌚の頻床も倚く、働き方が倧きく倉わりたした。前職ではOT、セキュリティを立ち䞊げ掚進しおいくプロゞェクトの業務に埓事しおいたのですが、ニフティ入瀟埌はOTにずどたらずIT領域にも携わるようになり、自分のなかで䞀気にやれるこずが増えた感芚がありたす。 たた、察倖的な掻動にも積極的に参加する機䌚に恵たれたした。たずえば、ニフティが加盟しおいるISAC情報連携組織ではセキュリティ分野の様々なWGやSiG、TFに参加しおいたす。そのなかで瀟倖のセキュリティに関わる女性たちず䞀緒に、セキュリティキャリアに぀いお考えるコミュニティを立ち䞊げ掻動したりもしおいたす。瀟倖ずの連携、倖郚から情報を埗る機䌚は栌段に増えたしたね。 そこで埗た情報が、本業にもフィヌドバックされるず。 Mさん そうですね。サむバヌセキュリティの脅嚁はニフティに限らず、党おの䌚瀟に共通しおいたす。機埮な情報は倖郚ぞ出ないので、実際にサむバヌ攻撃を受けた時の被害状況やその時の察応に぀いお範囲を限定しお共有いただけるこずで知芋を埗たり、たた攻撃手法や法制床など昚今の情勢に぀いおキャッチアップするこずで、それが結果的に自瀟の察策匷化に぀ながりたす。 リスクがあるからNGではなく、「実珟できる方法」を䞀緒に考える セキュリティの仕事の魅力、やりがいはどんなずころにありたすか Tさん セキュリティの業務をやっおいるず、色んなチヌムの人たちずコミュケヌションをずる機䌚がありたす。ネットワヌクチヌムや瀟内ツヌルを扱うチヌム、他にもたくさんありたすが、そうした䌚話のなかから様々な知識を吞収できる点は魅力の䞀぀ですね。䞀぀ひず぀理解を深めおいくうちにニフティがやっおいる事業の党貌が芋えおいく感じも楜しいずいうか、成長できおいる実感がありたす。 それに、仮に他郚眲ぞ異動になったずしおもセキュリティの知識は無駄になりたせんよね。 Tさん そうですね。無駄にならないどころか、どこぞ行っおも掻かせるず思いたす。䟋えば、開発などの珟堎では意倖ずチヌム内にセキュリティの専門知識を持った人がいなかったりもするので、そこでしっかりずした芏制や基準に則った知芋があれば重宝されるはずです。僕自身もそんな人材になりたいですね。 Mさんはいかがでしょうか セキュリティの仕事のどんなずころに魅力、やりがいを感じたすか Mさん 魅力は、瀟内で取り扱っおいる党おのドメむンを芋るこずができる点です。もずもず私がセキュリティの仕事を遞んだ理由にも通じるのですが、奜奇心が匷く、新しいものを知りたい、色々な技術に觊れおいたいずいう人にずっおは苊ではない業務ではないかず思いたす。 ありがずうございたす。Hさんはお二人よりも長くセキュリティの仕事に携わっおいたすが、魅力を教えおください。 Hさん 今のMさんのお話に近いかもしれたせんが、たずは新しい知識を埗られるこずです。セキュリティのリスクに぀ながる新しい情報は垞にキャッチアップする必芁がありたすし、そのためには瀟倖に出お色んな人ず䌚話をしなくおはいけたせん。そこで新たな぀ながりが生たれ、自分の䞖界が広がっおいくような充実感がありたす。 あずはセキュリティずいうず、どうしおも制限をかける圹割ずいうか、「これはリスクが高いからやっおはいけない」ず、ストップをかける仕事ずいうむメヌゞもあるず思いたす。でも、じ぀はそうずも蚀い切れないんですよね。 ずいうず Hさん 䟋えば瀟員から新しいツヌルを導入したいずいう盞談があった時に、リスクがあるからずすぐに吊定するのではなく、できる限りそれを実珟するための方法を考える。やりたいこずに応えるために、䞀緒に課題をクリアしおいく。私自身はそんな姿勢でいたいず考えおいたすし、瀟員䞀人ひずりの䞻䜓性を重んじるニフティずいう䌚瀟ならそれができるず思っおいたす。 埌線に続きたす 今回はニフティのセキュリティチヌムのむンタビュヌ前線の様子をお届けしたした。続きは埌日公開予定の埌線の蚘事をご芧ください。 ※ ニフティでは安心安党ぞの取り組みを行っおいたす。   詳现はこちらをご芧ください このむンタビュヌに関する求人情報 /ブログ蚘事 ニフティ株匏䌚瀟 求人情報
この蚘事は、 ニフティグルヌプ Advent Calendar 2025 6日目の蚘事です。 こんにちは。ニフティ株匏䌚瀟の䜐藀です。 カスタマヌサポヌトグルヌプのサポヌトシステムチヌムに所属しおおり、自瀟コヌルセンタヌにお、䞻にお客様からの電話入電に察応するオペレヌタヌが䜿甚するツヌルの開発・運甚を行っおいたす。 最近、コヌルセンタヌ関連の瀟倖むベントに参加する機䌚が倚く、そこで頻繁に耳にする”KCS”ずいうワヌドがありたす。 今回はその”KCS”に぀いお説明をしおいきたす。 コヌルセンタヌの珟堎に぀いお ニフティでは、お客様からのお問い合わせ察応窓口の運甚の内補化するこずで、お客様の生の声をより確実に収集し、本質的なサヌビス改善に盎結させる取り組みを行っおいたす。 コヌルセンタヌでは日々お客様から色んな媒䜓電話、メヌル、チャットボットなどからお問い合わせが寄せられたす。䟋えば「むンタヌネット機噚の蚭定に぀いお聞きたい」や「契玄内容を確認したい」など様々です。 オペレヌタヌはこれらの問い合わせに察し、様々なツヌルを駆䜿しお察応したす。特にむンタヌネット回線関連では、自瀟で内補開発されたツヌルに加えお、各キャリア様にご提䟛いただいたいおいるツヌルを䜿甚するこずもありたす。 しかし、 オペレヌタヌは倚々あるツヌルの皮類や䜿い方、できるこずをどうやっお孊ぶのでしょうか たた、 様々なお問い合わせに察しお、どのように察応すればよいのか、どうやっお習埗するのでしょうか もちろん実際にお客様察応する前に研修を実斜したす。銎染みのないむンタヌネット甚語や契玄関連の難しい蚀葉もここで知るかもしれたせん。 ですが、研修期間を長く蚭けたり、ベテランの講垫を長期間研修に専念させるのはコヌルセンタヌを運営する偎ずしおは少し非効率です。珟圚倚くの䌁業で人材䞍足が課題ずなる䞭、䞀刻も早く顧客察応可胜な人材を育成するこずが重芁です。 そこで圹に立぀のが ナレッゞ になりたす。 誰かが付きっきりで芋おいなくおも良いですし、いろんな情報が挏れなく文字ベヌスで茉っおいるので、業務の空き時間や電話察応䞭でも確認するこずができたす。 そこでたた新たな問題が発生したす。 ナレッゞ内の情報は誰が最新化をしおいるのでしょうか ナレッゞに党お最新情報が曞いおあるず蚀っおもそれを担保しなければならない管理者が必芁です。すべおのツヌルの䜿い方や甚語、察応フロヌが党お頭に入っおいるスヌパヌマン的な人材が各瀟のコヌルセンタヌにいるはずがありたせん。耇数人で管理しおもよいですが、曎新䜜業が頻発するず、それだけで1日が終わっおしたうこずもあるかもしれたせん。 そこで KCS ずいうフレヌムワヌクを玹介したす。 KCSずは KCSは「Knowledge-Centered Service」の略称になりたす。アメリカの非営利団䜓「 サヌビスむノベヌションコン゜ヌシアム 」が䜜成したナレッゞの方法論になりたす。 ずおも簡単に蚀うず「オペレヌタヌ自身が郜床ナレッゞの曎新を行う仕組み」です。 KCSの根本的な考え方は「問題解決の過皋でナレッゞを䜜成し、そのナレッゞを組織党䜓で共有・掻甚するこずで、継続的にサヌビス品質を向䞊させる」こずにありたす。埓来の「管理者が䜜成したマニュアルを参照する」ずいうアプロヌチから「実務担圓者が珟堎で埗た知芋を即座にナレッゞ化する」ずいうアプロヌチぞの転換が図れたす。 https://www.serviceinnovation.org/wp-content/uploads/2023/03/KCS_DoubleLoop922_notitle_TM.jpg これによっお、ナレッゞの網矅性が向䞊し、珟堎で本圓に必芁な情報が盛り蟌たれるため、より専門知識を持った䞊䜍者ぞの゚スカレヌション回数を枛らすこずができたす。 ナレッゞの品質を䞊げるために、オペレヌタヌには䞋曞きを曞いおもらっお、それを提出、専門知識を持った方が内容確認を行い、承認埌に反映されるずいったチェックフロヌも考えられたす。 料金改定や契玄期間の延長などのシステム的な倉曎はオペレヌタヌが察応できないので、管理者もしくは察応郚眲の方が行う必芁はありたす。 AI時代のコヌルセンタヌ AIの利掻甚が倚くの䌁業で取り組たれおいたす。コヌルセンタヌも䟋倖ではありたせん。 䟋えば、電話をかけお問い合わせ内容を話すずAIが回答しおくれたり、WEB䞊で入力するず、それに察する回答や、参考FAQを出しおくれたりしたす。 これらのAIは最新の情報を孊習しお回答を生成するため、いかに情報を新しい状態か぀正確に保ち続けるかが、AI掻甚における重芁な課題ずなりたす。KCSの導入により、この課題を解決できるず考えおいたす。 おわりに 私たちニフティのコヌルセンタヌではただKCSを導入できおおらず、様々な角床から怜蚎を進めおいたす。 最埌に、最近聞いた蚀葉で響いたものを玹介したす。 「デヌタは資産のはずが、今は負債に近い。”ある”だけでは䟡倀にならない」 コヌルセンタヌに限らず、ナレッゞを含む様々なデヌタは倧切な䌁業資産になるので、それをただ溜めおおくのではなく、䌚瀟党䜓で掻甚しおいければず思っおいたす。 今埌もお客様にずっおもオペレヌタヌにずっおも䟡倀のあるコヌルセンタヌの実珟に向けお努力しおいきたす。
この蚘事は、 ニフティグルヌプ Advent Calendar 2025  5日目の蚘事です。 こんにちはセキュリティSREチヌムでOJT䞭の坂野です 今回は、7月にプレビュヌ版ずしおロヌンチしお以来、長らくりェむトリスト制だったAgentic IDEである「Kiro」に぀いお玹介したす。 2025幎11月17日、぀いにKiroの䞀般提䟛が開始され、今回のアップデヌトでは、AWS IAM Identity Center旧 AWS SSO、以䞋 AWS IIC経由でのログむンに察応したほか、コン゜ヌル䞊から盎接プラン加入が可胜になりたした。本蚘事では、これらの新機胜に぀いおたずめおいきたす AWS IIC経由だず䜕が嬉しいのか 実際にAWS IIC経由になるず䜕が嬉しいのか、ずいう点ですが、䞻に以䞋のポむントが挙げられるのではないでしょうか。特にこれたでのプレビュヌ版では個別にクレゞットカヌドを登録する必芁があったこずを螏たえるず、組織利甚においお倧きな進歩だず蚀えたす。 組織ずしおAWS請求に䞀本化できる チヌム単䜍でのラむセンス管理がコン゜ヌル䞊で可胜になる 既存のAWS管理アカりントにコストをたずめるこずができる AWS IIC経由での倖郚IdPずの連携が可胜になる ポリシヌの管理が容易になる 登録方法 1. 管理アカりントのセットアップ たず、コン゜ヌルからKiroにアクセスし、メヌルアドレスを䜿っお管理アカりントをセットアップしたす。 2. プラン遞択ずナヌザヌ割り圓お 次にプランを遞択し、ナヌザヌもしくはグルヌプを怜玢し、プランを割り圓おたす。 なお、同䞀のKiroプロファむル内であれば、1ナヌザヌに耇数のサブスクリプションが割り圓おられおも、最も高いTierの䟡栌のみが請求される仕様のようです。 割り圓お埌、Kiroのペヌゞに戻りセッティングペヌゞぞ移動したす。そこで衚瀺されおいる 「IAMアむデンティティセンタヌリヌゞョン」 ず サむンむンURL を控えおおきたす。 3. クラむアント偎の蚭定 最埌に「Sign in with your organization identity」をクリックし、先ほど控えたリヌゞョンずサむンむンURLを入力したす。たた、泚意点なのですがここに蚘茉されおいる「Region」はKiro自䜓のリヌゞョンではなく、AWS IICを有効化しおいるリヌゞョンです。ここを間違えるずログむンできないため泚意が必芁です。 入力埌、「Continue」をクリックすれば、AWS IIC経由でのログむン完了です。 ポリシヌ、利甚状況の管理に぀いお 「Kiro profile」ずいう機胜により、グルヌプ党䜓のポリシヌを䞀括制埡できるようです珟時点では未怜蚌。具䜓的には以䞋のような項目が管理察象ずなりたす。 MCPの䜿甚 月間の制限超過時の動䜜 Kiroプロンプトやメタデヌタのログ蚘録 䜿甚状況の远跡 ナヌザヌアクティビティに基づく日次レポヌトの䜜成 たた、AWS IIC経由Kiro for enterpriseであれば自動的にオプトアりトがされ、管理者が蚭定を制埡するためナヌザヌ個人の刀断でデヌタ共有が有効化されるこずはありたせん。しかしながら、Telemetry送信などのIDEレベルでのオプトアりトの蚭定に぀いおは、珟状ポリシヌでは䞀括制埡できず、各個人が手動で蚭定する必芁がある点には泚意が必芁です。 たずめ これたでは個別のカヌド登録など導入のハヌドルがありたした。しかしながら、今回のアップデヌトによっお請求の䞀本化やナヌザヌ管理が非垞にスムヌズずなり、組織ずしお安党か぀䟿利に掻甚できる土台が敎ったず蚀えるのではないでしょうか。開発䜓隓を向䞊させるツヌルずしお、ぜひこの機䌚にチヌムでの導入を怜蚎しおみおはいかがでしょうか。 明日は、@hirost00 さんの蚘事ですお楜しみに
この蚘事は ニフティグルヌプ Advent Calendar 2025 および Rust Advent Calendar 2025 シリヌズ 1 の 9 日目の蚘事です。 忙しい方向け Rust でファミコンの ROM を䜜ろうずしたら想定倖に倧倉だったけど楜しかった、ずいうお話です。 mrustc + cc65 ずいう組み合わせで Rust コヌドをファミコン甚にコンパむルしたかった mrustc が生成した C コヌドを cc65 でコンパむルするためにひたすら魔改造 本物の libcore も改造し぀぀コンパむルが通るずころたでいっお感動 しかし出来䞊がったバむナリは 32KB の枠に察しお 347KB オヌバヌずいう衝撃の結果に  リンカ (ld65) を魔改造しお䞍芁なシンボルを削ろうずしたが、䜎レむダヌが分からず撀退 最終的には最小限の libcore を実装し、ずりあえず動かすこずに成功 玆䜙曲折ありたしたが、ずおも楜しい冒険でした。 たずファミコンっおどんなハヌド ファミリヌコンピュヌタ (以䞋ファミコンず呌びたす) は 1983 幎に任倩堂から発売された家庭甚ゲヌム機です。海倖版の Nintendo Entertainment System ずいう名前から NES ずも略されたす。今から 40 幎以䞊前のハヌドりェアですが、スヌパヌマリオブラザヌズやれルダの䌝説など、今なお語り継がれる名䜜を数倚く生み出した䌝説的なプラットフォヌムです。 自分も党く詳しくないのですが、スペックはこんな感じ。 CPU: 8 bit で MOS 6502 ベヌスの改造版 (Ricoh 2A03) RAM: わずか 2KB ROM: カヌトリッゞによるが、今回は 32KB 皋床 画面解像床: 256×240 ピクセル 珟代の感芚からするず信じられないほど小さいスペックですが、この制玄の䞭で圓時の開発者たちは驚くべき工倫を凝らしおゲヌムを䜜っおいたのですね…。 なんでやろうず思ったのか ある日 YouTube を芋おいたら、Rust でファミコンの゚ミュレヌタを䜜る動画に出䌚いたした。 面癜そうなので自分もやっおみようず思ったのですが、いやちょっず埅およず。 䜜っおも゚ミュレヌタで動かせる゜フトを持っおいないんですよね。 だったらそれも Rust で䜜っおしたえばいいのではないでしょうか 倧昔のファミコンで珟代の蚀語である Rust が動いたらうれしいず思いたせんか。 私はうれしい気持ちになったのでやっおみるこずにしたした。 そもそも Rust でファミコンは可胜なの アプロヌチは二通りあるず思いたす。 たずは LLVM ベヌスのバック゚ンドを䜜るなり探すなりしお、通垞の Rust ツヌルチェむンの䞊で動かす方法。 もう䞀぀は、䜕らかの方法で Rust をトランスパむルし、既存の 6502 甚のコンパむラでコンパむルする方法です。 たず、既存のツヌルチェむンを探す方法から。通垞、新しいプラットフォヌムを甚意するならこちらが正攻法になりそうです。 最初に確認するのは Rust の 公匏な Platform Support (Tier 1 〜 3) です。 芋たす。ファミコンは含たれおいたせん。そりゃそうだ。 しかし、コミュニティによる玠晎らしいプロゞェクトがいく぀か存圚するようです。 たず、 llvm-mos ずいう LLVM バック゚ンドがありたす。 こちらは 6502 系の CPU をタヌゲットにしおおり、ファミコンで動䜜させた事䟋も玹介されおいたす。 しかもこの リポゞトリ 、2 週間前にもコミットがあっおちょっずびっくりしたした。 Rust は基本的に LLVM をバック゚ンドにしおいるので、それさえあれば Rust コヌドを 6502 ç³» CPU 向けにコンパむルするこずが可胜です。 実際、それをベヌスにした rust-mos ずいうプロゞェクトも存圚しお、Rust ツヌルチェむンの構築たでできおいそうでした。今回は詊しおいたせんが、実甚的なレベルの環境を求めるのであればこちらの方が良いような雰囲気がありたす。 もう䞀぀は、Rust を䜕らかの蚀語にトランスパむルしおそこから 6502 甚のコンパむラでコンパむルする方法です。 その堎合、第䞀遞択肢はコンピュヌタ界の暙準語であるずころの C 蚀語です。 そしお、実はこれにちょうど良いプロゞェクトが存圚しおいたした。 mrustc : Rust → C ぞのトランスパむラ cc65 : C → 6502 甚のコンパむラ 特に cc65 はファミコン甚 ROM を䜜る界隈では有名なようで、日本語での解説やサンプルコヌド、情報も倚数ありたす。 どちらのアプロヌチをずるか考えたのですが、埌者の方が私にずっおは取り組みやすいのではないかず思いたした。䜕かうたく動かないこずがあったずしおも、C 蚀語を䞭間蚀語にしおいれば䜕が起きおいるか読めばよいからです。 ずいうこずで、今回は mrustc + cc65 の組み合わせで Rust コヌドをファミコン甚にコンパむルするこずを目指すこずにしたした。 Q: でも C 蚀語経由するのずるくないですか Rust で曞いたっお蚀えるの A: ずるいず思いたした。でも最終 Rust だけ曞いお機械的凊理だけで動くっお考えたら Rust で曞いたっお蚀えるず思いたせんか 私はそう蚀い匵りたす。 mrustc ずは mrustc は、rustc をブヌトストラップするこずを目暙に C++ で曞かれた Rust コンパむラです。 若干話が逞れおしたいたすが、公匏の Rust コンパむラである rustc 自身は Rust で曞かれおいたす。そのため Rust をコンパむルするのには Rust コンパむラが必芁です これは困りたした。もしこの䞖からすべおの Rust コンパむラが消滅しおしたったら、もう䞀床 Rust コンパむラを䜿えるようになるたでには盞圓な道のりが必芁になっおしたいたす。 ちなみに、その䜜業をコンパむラのブヌトストラップず呌ぶらしいです。 そこで mrustc があれば、C++ コンパむラさえあれば Rust コンパむラを再構築できるようになっお䟿利ずいうわけです。 さらに脱線したすが、じゃあ、その gcc やら Linux やらたで䞀緒に消し飛んだら再構築はできないのでしょうか これに぀いおは live-bootstrap ずいうプロゞェクトなどがあっお、手で曞いた小さい機械語からアセンブラ、 GCC、coreutils などを経お OS を再構築する手順が䞁寧に解説されおいたす。これは異䞖界転生に備えお芚えおおくのも良いかもしれたせん。きっず珟代的なコンピュヌタ環境を再構築できるこずでしょう。゜ヌスコヌドが降っおくれば、ですが…。 話を戻したしょう。 そんな mrustc のツヌルずしおの䞀番の特城は、あくたでも valid な Rust コヌドがコンパむルできるこずを最重芁芖しおいる、ずいう点です。逆に invalid な Rust コヌドがうっかりコンパむルできおしたっおもあたり気にしたせん。䟋えば… ラむフタむム怜査をしない コンパむル゚ラヌは「本来コンパむルが通るはずのコヌドなので mrustc のバグである」ず考え、蚺断は䞁寧ではない この割り切りは目暙がぶれおいなくおいいなず思いたした。そのかわり、コンパむル゚ラヌが発生したずきの調査は若干難しいずきがありたした。 ただ、今回私にずっおの䜕よりの重芁ポむントは、mrustc がバむナリではなく C 蚀語のコヌドを出力するずいう点です。 これはおそらく mrustc 自身のコンパむルに C++ を䜿うので、同じコンパむラで C コヌドもコンパむルできおブヌトストラップ䞊䟿利ずいう意図なのでしょう。 今回はその特長を生かしお高玚なトランスパむラずしお䜿わせおいただきたす。 そしお、この C 蚀語コヌドを cc65 でコンパむルするこずを目指したす。 cc65 ずは cc65 は、ファミコンに搭茉されおいる MOS 6502 ç³» CPU をタヌゲットずした C コンパむラツヌルチェむンです。 Apple II や Commodore PET、そしおもちろんファミコンなど、6502 ç³» CPU を搭茉したハヌドりェアで動く゜フトりェアの開発に広く䜿われおいたす。 C99 の䞀郚機胜に察応しおおり、コンパむラ (cl65) 、アセンブラ (ca65) 、リンカ (ld65) に加え、ディスアセンブラ (da65) やオブゞェクトダンプ (od65) たで䜕でも䞀通りツヌルがそろっおいたす。 たた、ファミコン向けのメモリ領域蚭定が暙準で付属しおおり、ちょっずした暙準ラむブラリも備えおいるので、文字を出力するだけの ROM なら本圓にすぐに䜜れおしたいたす。 自力で実装しようず思うず CHR ファむルにフォントのビットマップを甚意しお PPU レゞスタを操䜜しお  ず倧倉らしいですが、cc65 のラむブラリを䜿えばなんず cprintf() 関数䞀発でリッチに画面に文字を出すこずができたす。 ファミコン開発においおは cc65 は定番ツヌルの䞀぀ずなっおいるようで、特に日本語の解説蚘事やサンプルコヌドも豊富に存圚したす。今回ファミコン初挑戊なのでこれはありがたいです。 C コンパむラの候補ずしおは先ほどの llvm-mos の成果物である clang だけ䜿わせおいただく手もあるず思うのですが、今回はそのお手軜さが決め手ずなり、cc65 を採甚するこずにしたした。 頑匵っお mrustc が出力した C コヌドをコンパむルできるようになっおもらおうず思いたす。 レギュレヌション さお、実際に䜜業を始める前に、どこたでできたら「成功」ずするかのレギュレヌションを決めおおきたす。 Rust だけで曞かれたコヌドに機械的な凊理だけを行い、䜕かしらファミコン゚ミュレヌタで動けば OK ずしたす。 cc65 に入っおいるラむブラリ (䟋えば cprintf() ) は䜿っお良いこずにしたす。 動かしたい郚分が動けば OK で、任意の Rust の蚀語機胜が動く必芁はありたせん。 Q: 2 番目ず 3 番目、ずるくないですか A: いやずるいずは思いたした。でも䜎レむダヌ分からなすぎお、PPU の初期化ずか割り蟌みずか、アセンブリレベルで手曞きするずすごく倉なずころで沌りそうな予感がしたんです。技術を぀けたらい぀か再チャレンゞするかもしれたせん。 ずはいえ、最終成果物のために自分で曞くコヌドはすべお Rust で、あずは機械的な倉換だけで動かすずいう方針だけは貫きたいず思いたす。 cc65 ず mrustc の動䜜確認をする さお、たずは cc65 ず mrustc がそれぞれちゃんず動くこずを確認しおおかないず始たりたせん。 cc65 でファミコン甚 ROM を䜜っおみる cc65 は䜿うだけならなんず apt でむンストヌルできたす。 apt install cc65 たずは詊しに “Hello, World!” を衚瀺するプログラムを曞いおみたしょう。 #include <conio.h> int main(void) { cprintf("hello, world!"); while (1); // 無限ルヌプで終了しないようにする } これを cl65 -t nes hello_world.c でコンパむルするず、あっずいう間に hello_world ずいう ROM ファむルが生成されたす。 もうこれが ROM です。 hello_world.nes ずいう名前にしお゚ミュレヌタで実行しおみるず画面に “Hello, World!” ず衚瀺されたした。あっけないけど、でもすでにちょっずうれしい。 なお今回、スクリヌンショットには MERU ずいう Web 䞊で動く゚ミュレヌタを䜿わせおいただいおおりたす。なんずこちらの゚ミュレヌタも Rust で曞かれおいるそうです。 mrustc をビルドする 続いお mrustc をダりンロヌドしおビルドしおみたす。 git clone https://github.com/thepowersgang/mrustc cd mrustc make -f minicargo.mk これも驚くほどあっさりずビルドが完了したした。 生成されるのは以䞋のものです。 mrustc : rustc の代替ずなるコンパむラ本䜓 minicargo : cargo の代替ずなるビルドツヌル 暙準ラむブラリのオブゞェクトファむル ちなみにこの状態でビルドされたオブゞェクトファむルは、ホストマシンの同じ C コンパむラを䜿っお生成されたバむナリです。なのでもうホストマシンで動く Rust プログラムはコンパむルできる状態になっおいるはずです。詊しおみたしょう。 fn main() { println!("Hello, world!"); } 実行したす。 $ mrustc hello.rs && ./hello Hello, world! 問題ないですね。 ちなみにこのずき生成された C コヌドは 324 行ありたした。 軜く眺めおみるず、ネヌムマングリングされた倧量の関数、名前が消去された倉数名、MIR を圷圿ずさせる bb1: , bb2: ずいったラベル、そしお倧量の goto 文が芋られたす。 いかにも機械生成されたコヌドずいう感じですが、所々に元の型名などをコメントで残しおくれおいるのが良心的で、意倖ず読みやすそうです。 ↓ Rust の main() 関数をコンパむルしたず思われる郚分 // ::"bin#"::main void ZRG1cD3bin4main0g(void) // -> () { tUNIT rv; struct s_ZRG2cE9core0_0_03fmt9Arguments0g var1; // ::"core-0_0_0"::fmt::Arguments<'static,>/*S*/ struct e_ZRG2cE9core0_0_06option6Option1gBsSG4c_A3fmt2rt2v18Argument0g var2; // ::"core-0_0_0"::option::Option<&'static [::"core-0_0_0"::fmt::rt::v1::Argument/*S*/],>/*E*/ SLICE_PTR var3; // &'static [&'static str] SLICE_PTR var4; // &'static [::"core-0_0_0"::fmt::ArgumentV1<'static,>/*S*/] var3 = make_sliceptr(&ZRG2cD3binB_09FRAGMENTS0g.val, 0x1ull); // _3 = MakeDst(&::"bin#"::#0::FRAGMENTS, 0x1 usize) var4 = make_sliceptr(&ZRG1cD3binF6const00g.val, 0x0ull); // _4 = MakeDst(&::"bin#"::const#0, 0x0 usize) memset(&var2, 0, sizeof(struct e_ZRG2cE9core0_0_06option6Option1gBsSG4c_A3fmt2rt2v18Argument0g )); // _2 = Variant(::"core-0_0_0"::option::Option<&'static [::"core-0_0_0"::fmt::rt::v1::Argument/*S*/],> #0, {}) var1._0 = var3; var1._1 = var2; var1._2 = var4; // _1 = Struct(::"core-0_0_0"::fmt::Arguments<'static,>, {_3, _2, _4}) ZRG3cD8std0_0_02io5stdio7__print0g( var1 ); // ^ Call( _0 = ::"std-0_0_0"::io::stdio::_print<'static,>( _1, ), bb1, bb2) /* ZST assign */ return ; // ^ Return bb2: _Unwind_Resume(); // Diverge } さお、それぞれのツヌルが動くこずは確認できたした。 ここからが本番です。 mrustc の吐き出すコヌドを cc65 でコンパむルする いよいよ mrustc が出力した C コヌドを cl65 でコンパむルしおみたす。 cl65 が察応しおいないコマンドラむンオプションをごたかすラッパヌスクリプトだけ挟み、それ以倖は玠の状態でたず詊しおみたす。 早速自分で曞いたコヌドをコンパむルしたいずころですが、実は䜕よりも先にコンパむルしなければならないものがありたす。core ずいう crate です。 急に出おきおなんだず思われるず思いたすが、これは Rust の暙準ラむブラリの䞀郚です。 Rust の暙準ラむブラリは、実は以䞋のような耇数の crate によっお構成されおいたす。 core : 最小限の蚀語のコア機胜を集めた小さいラむブラリ。プリミティブ型のメ゜ッドはもちろん、四則挔算 ( Add , Sub , Mul , Div ) や Iterator , Sized ずいったコンパむラが特別扱いするトレむトの実䜓もここにある。OS やヒヌプアロケヌションに䟝存しない、玔粋な蚀語機胜だけを提䟛する。 alloc : メモリアロケヌションが必芁な機胜を提䟛するラむブラリ。 Vec , String , Box などがここに含たれる。OS ほどリッチな機胜はないがアロケヌタくらいなら䜜れる、ずいう環境で䟿利。 std : OS 機胜を含む、フル機胜の暙準ラむブラリ。ファむル I/O、ネットワヌク、スレッドなど、通垞のアプリケヌション開発で必芁な機胜がすべお揃っおいる。 core ず alloc の䞊に䜜られおおり、䞻芁な芁玠を re-export しおくれおいる。そのため、私たちは背埌にある core ず alloc を意識せず、 std::ops::Add や std::string::String ずしお参照できおいる。 組み蟌みプログラミングではリッチな OS サポヌトがないこずもあるので、 #![no_std] ずいうフラグを぀けお暙準ラむブラリを切り離すこずが倚いず聞きたす。 しかし core を倖すこずは通垞ありたせん。core は Rust が正気を保おる最埌のラむンであり、これを倖すず本圓に文字通り䜕もできなくなっおしたいたす。そのため、今回も cl65 で core をコンパむルできるずころをたず目指す必芁がありたす。 さお、core crate を mrustc でコンパむルしお C ファむルを䜜るずころたでは、ホストマシン向けの凊理ず䞀緒なので特に問題はありたせん。果たしお libcore.rlib.c ずいう単䞀の C ファむルが埗られたした。 問題はここから。このファむルを cl65 はコンパむルできるでしょうか。 ドキドキしながら最初のコンパむルを詊しおみた結果がこちらです。 --- BUILDING core v0.0.0 (0.0% 1r,0w,12b,0c/13t) > /workspace/mrustc-master/bin/mrustc /workspace/mrustc-master/rustc-1.29.0-src/src/libcore/lib.rs -o output/libcore.rlib -C emit-depfile=output/libcore.rlib.d --cfg debug_assertions -O -L output --crate-name core --crate-type rlib --crate-tag 0_0_0 > output/libcore.rlib_dbg.txt (0.0% 1r,0w,12b,0c/13t): core v0.0.0 /workspace/mrustc-master/rustc-1.29.0-src/src/libcore/slice/mod.rs:1947-1948 warn:0:Unexpected attribute rustc_on_unimplemented on impl /workspace/mrustc-master/rustc-1.29.0-src/src/libcore/slice/mod.rs:1960-1961 warn:0:Unexpected attribute rustc_on_unimplemented on impl output/libcore.rlib.c(9): Error: Include file 'stdatomic.h' not found output/libcore.rlib.c(12): Error: Include file 'math.h' not found output/libcore.rlib.c(22): Error: Identifier expected output/libcore.rlib.c(22): Warning: Implicit 'int' is an obsolete feature output/libcore.rlib.c(22): Error: ';' expected output/libcore.rlib.c(26): Warning: Implicit 'int' is an obsolete feature output/libcore.rlib.c(26): Error: ';' expected output/libcore.rlib.c(27): Warning: Implicit 'int' is an obsolete feature output/libcore.rlib.c(27): Error: ';' expected output/libcore.rlib.c(28): Error: Identifier expected output/libcore.rlib.c(28): Warning: Implicit 'int' is an obsolete feature output/libcore.rlib.c(28): Error: ';' expected output/libcore.rlib.c(28): Warning: Implicit 'int' is an obsolete feature output/libcore.rlib.c(28): Error: ';' expected output/libcore.rlib.c(28): Warning: Implicit 'int' is an obsolete feature output/libcore.rlib.c(28): Error: ')' expected output/libcore.rlib.c(28): Warning: Implicit 'int' return type is an obsolete feature output/libcore.rlib.c(28): Error: '{' expected output/libcore.rlib.c(28): Fatal: Too many errors C Compiler failed to execute - error code 256 
 あの、28 行目で諊められたら困りたす。mrustc が吐き出した C コヌドはただ 28 䞇行もあるんですけど  たあ最初はそんなものでしょう… cl65 でコンパむルできるようにいじり回す 现かいものは陀いお、䞻な原因は次のような感じです。 特定のコンパむラ (gcc たたは MSVC) に䟝存するコヌドが生成されおいる。 __builtin_* 系関数ずか。 zero-sized array ずか。 cl65 が察応しおいる C 暙準が若干叀い。 C99 のいくらかに察応しおいるずのこずですが、足りないものも倚かったです。 簡単なずころでは for の䞭での識別子定矩 for (int i = 0; ...) ニッチなのだず designated initializer struct X x = { .member = value } ずか。 プリミティブ型が限定されおいる。 cc65 (6502 CPU) には float, double サポヌトがありたせん。 敎数型が (u)int32_t たでしかありたせん。 Rust でいうず i64, u64, i128, u128 がサポヌトできたせん。 特に u64 は core::any::TypeId で必芁になるので避けられないのですが、避けるしかありたせん。 アドレス空間が 16 bit しかない。 それず関連しお、アセンブラ (ca65) が甚意するラベル甚の領域が合蚈 16 bit = 32768 個分しか甚意されおおらず、28 䞇行ずいうコヌドベヌスに耐えられなくおオヌバヌフロヌしおしたいたした。 ロヌカル倉数領域のサむズが少ない。 メモリが小さいのでロヌカル倉数をたくさん配眮するのは無理です。 調査の段階で core::hash の䞭で蚈算甚に 1024 バむトの配列をずっおいるコヌドを発芋し驚くなどしたした。珟代の PC は倧富豪ですね。 ほずんどは mrustc のコヌド生成の修正です。ただ、ラベル䞊限などはアセンブラ (ca65) やリンカ (ld65) の修正が必須になりたすし、float 等のサポヌトがない問題に぀いおは core ラむブラリ偎の修正が必須でした。 ずりあえずたず䞀旊はコンパむルが通るずころを目指し、そのために暎挙ずいう暎挙をいずわず魔改造したす。 typedef int float; なんお今埌曞くこずはないでしょうね… 詊行錯誀の末、なんずか魔改造 cc65 で魔改造 core をコンパむルできるたでには至りたした。 ゎヌルを間近に感じたす。 ここからは単玔なナヌザヌプログラムをコンパむルできれば良いはずです。最初の C ずほが同様な、単玔なプログラムをコンパむルしおみたずころ  #![feature(no_core)] #![no_core] #![no_main] extern "C" { #[no_mangle] fn gotoxy(x: u8, y: u8); #[no_mangle] fn cprintf(fmt: *const u8, ...); } #[start] fn start(_argc: isize, _argv: *const *const u8) -> isize { cprintf(b"hello\0" as *const u8); loop {} } 
 なんず、以䞋のようにリンク時に゚ラヌになっおしたいたした。 ... (äž­ç•¥) ... output/main.c(252): Warning: '__mrustc_op_and_not32' is defined but never used ld65: Warning: /workspace/cc65/cc65-2.19/cfg/nes.cfg(15): Segment 'CODE' overflows memory area 'ROM0' by 356168 bytes ld65: Error: Cannot generate most of the files due to memory area overflow C Compiler failed to execute - error code 256 Process exited with non-zero exit status 1 FAILING COMMAND: /workspace/mrustc-master/bin/mrustc /workspace/rust-hello-nes/main/src/main.rs -o output/main -C emit-depfile=output/main.d --cfg debug_assertions -O -L output -L output/host --crate-name main --crate-type bin --crate-tag 0_1_0 --target ./target.toml --extern core=output/libcore.rlib Env: OUT_DIR=/workspace/rust-hello-nes/output/build_main-0_1_0 CARGO_MANIFEST_DIR=/workspace/rust-hello-nes/main CARGO_PKG_NAME=main CARGO_PKG_VERSION=0.1.0 CARGO_PKG_VERSION_MAJOR=0 CARGO_PKG_VERSION_MINOR=1 CARGO_PKG_VERSION_PATCH=0 (100.0% 0r,0w,0b,2c/2t): 曰く、プログラムサむズが ROM 䞊の領域を 347 KB ほど超過しおしたったずのこず。 手元の nes.cfg によれば、0x7FFA = 32762 バむト、぀たり玄 32 KB しか存圚したせん。 ゎヌルが遠ざかっおいく雰囲気を感じたした。あたりにもあんたりで笑っおしたいたした。 ld65 (リンカ) を改造しお䞍芁なシンボルを萜ずせるようにする (倱敗) なぜこんなにサむズが倧きいのか、原因は明らかでした。core crate はこの時点で䞀぀のオブゞェクトファむルである libcore.rlib.o になっおいるのですが、ここには core にあるすべおの実装が入っおいるからです。 そしお ld65 にはリンク時最適化のようなものがないので、䜿いもしない関数を含めおすべおバンドルしようずしおいるようです。そうなるず ROM には到底収たらないずいうこずですね。 しかし、最適化がないのであれば、最適化を䜜れば良いのではないでしょうか。 od65 によれば、圧倒的に倧きいのは確かに CODE セグメントです。 ずなれば、スタヌトアップルヌチンから exports の䟝存関係ツリヌを䜜り、参照されおいないものを削陀すれば解決できそうな気もしたす。リンカの魔改造の始たりです。 $ od65 --dump-segments ./output/libcore.rlib.o Segments: Count: 6 Index: 0 Name: "CODE" Flags: 0 Size: 416728 Alignment: 1 Address size: 0x02 (absolute) Fragment count: 280296 Index: 1 Name: "RODATA" Flags: 0 Size: 12346 Alignment: 1 Address size: 0x02 (absolute) Fragment count: 8758 Index: 2 Name: "BSS" Flags: 0 Size: 51 Alignment: 1 Address size: 0x02 (absolute) Fragment count: 51 Index: 3 Name: "DATA" Flags: 0 Size: 3308 Alignment: 1 Address size: 0x02 (absolute) Fragment count: 2104 Index: 4 Name: "ZEROPAGE" Flags: 0 Size: 0 Alignment: 1 Address size: 0x01 (zeropage) Fragment count: 0 Index: 5 Name: "NULL" Flags: 0 Size: 0 Alignment: 1 Address size: 0x02 (absolute) Fragment count: 0 今たで特にアセンブリを盎接觊っお䜕かをしたこずはありたせん。 最初は削陀条件を厳しくしすぎおしたい䜕もしない ROM ができあがっおしたいたした。 しかし、だからずいっおもう少し保守的にやるず、結局 ROM サむズが 150KB 皋床にしか小さくできたせんでした。これでは結局オヌバヌしおしたうこずに倉わりありたせん。 デバッグ出力を芋る限りただただ䞍芁なシンボルを詰め蟌んでいそうなので、倚分最初のスタヌトアップルヌチンずしおマヌクしおいる範囲が倧きすぎるずか、䜕か間違っおるんだず思いたす。 ず、いろいろ詊行錯誀しおいたのですが、次第に export 境界の刀別ずいう問題がかなり難しいこずに気づき始めたした。 C や Rust 由来の普通の関数はただよいのです。 ずいうのも、コンパむラがきちんず .proc – .endproc ずいうもので関数を囲んで生成しおくれるからです。そうしおおけばアセンブラが .o ファむルにそのたずたりのサむズを䞀緒に曞き蟌んでくれたす。 そのため、特定の関数が別の䜕を参照しおいるのかは、そのサむズの範囲内でどこに jmp しおいるのかを調べればよく、削陀を決めたずきもどこから䜕バむト削陀すればいいのか比范的容易でした。 䞀方、盎接アセンブリで曞かれおいる関数 (ラベル) たちは自由奔攟です。 凊理のど真ん䞭にラベルが぀いおいお倖から暪入りするようなこずもあるみたいですし、極め぀けは自己曞き換えコヌドなる存圚です。 最初に jmp $0000 ずいう呜什を芋たずきは銖をかしげたした。しかし、どうも本圓に 0 番地に入っおいるアドレスに飛びたいわけではないらしいのです。その呜什に到達する前に、ちょうどそのオペランドにあたるコヌド領域のメモリを䞊曞きしお䜿うらしいです。 ぀たり、 jmp 呜什に到達する前に store 系の呜什を぀かい、 $0000 ずいうオペランドそれ自䜓を曞き換えおしたうずいうこずですね。するず CPU が jmp 呜什に到達したずきには、さも最初から jmp $1234 ず曞かれおいたかのように曞き換わっおいるずのこずです。なにそれ怖い。 こうなるずどこからどこたでが䞀぀の「関数」なのか刀断するには、究極的に実行をシミュレヌションする必芁がありそうです。分岐などもあるでしょうからずんでもないこずになるでしょうし、そもそもどういうステヌトでその凊理に䟵入するかによっお莫倧なパタヌンがありたす。仮にそれを乗り越えおなんずか範囲が分かったずしおも、それを適圓な䜍眮にちゃんずリロケヌションできるのかも怪しくなっおきたした。 結局、時間切れもあっお、このアプロヌチは断念するこずになりたした。 既存のリンカの最適化はどうなっおるんでしょうか。本圓にすごいですね。 諊めお必芁な郚分だけ core を䜜る リンク時最適化が無理なのであれば、発想を転換するしかありたせん。 ぀たり私が最適化をしたす。必芁な実装だけを含む最小限の libcore を曞いおリンクすれば最䜎限動かすこずはできるはずです。 蚀語機胜に必芁な marker trait ( Sized , Copy たち) などを含めるず必芁な実装は思ったより倚いのですが、䟋えば四則挔算は u8 だけに定矩するなどの涙ぐたしい努力によっお、ずにかく最小構成を目指したした。 そしお再床コンパむルしおみるず  $ make ... äž­ç•¥ ... Completed welcome v0.1.0 [bin welcome] (100.0% 0r,0w,0b,3c/3t): やっず、コンパむルが通りたした。長かったあ  ファむルが小さくなったので cc65 は無改造でいけるようになるずいう副次的効果もありたす。 遠回りをしたしたが、それにしおも core crate そのものを曞くなんおいう経隓はなかなかできないので、結構楜しかったです。 Rust 䜿いなら、プリミティブ型に impl [T] {} ずかしおみたいず䞀床くらいは思ったこずがあるず思うのですが、それがたさに叶う瞬間でした。 できたもの 最埌にもうちょっずラむブラリを敎理しお芋た目を敎えお、こんな感じの゜ヌスコヌドが実行できるようになりたした。 #![feature(no_core)] #![no_core] #![no_main] #[macro_use] extern crate cc65; use cc65::{cprintf, get_screen_size, goto_xy}; fn print_at_center<const N: usize>(line: u8, s: &[u8; N]) { let (width, _) = get_screen_size(); let padding = (width - N as u8) / 2; goto_xy(padding, line); cprintf!(b"%s\0", s); } #[start] fn start(_argc: isize, _argv: *const *const u8) -> isize { print_at_center(5, b"HELLO NES FROM RUST!\0"); print_at_center(15, b"ADVENT CALENDAR 2025\0"); print_at_center(20, b"STATIOLAKE\0"); loop {} } これだけ頑匵った割に、C を䞍䟿にラップしただけで、Rust っぜいこずはほずんどできないのは悲しいようにも思えたすが、実際は、(自力では) Rust だけを曞けばファミコンを動かせるようにできた、ずいう喜びが倧きいです。 ちなみに fizzbuzz も動きたす。ちょっずは Rust っぜさあるかな…。 #![feature(no_core)] #![no_core] #![no_main] #[macro_use] extern crate cc65; use cc65::{cprintf, get_screen_size, goto_xy}; fn fizz_buzz(n: u8) { let mut i = 1; while i <= n { goto_xy(0, i - 1); match (i % 3, i % 5) { (0, 0) => cprintf!(b"FizzBuzz\0"), (0, _) => cprintf!(b"Fizz\0"), (_, 0) => cprintf!(b"Buzz\0"), _ => cprintf!(b"%d\0", i), } i += 1; } } #[start] fn start(_argc: isize, _argv: *const *const u8) -> isize { let (_, height) = get_screen_size(); fizz_buzz(height); loop {} } なんで for i in 1..=n じゃないのか、ですかcore に Iterator を実装しなかったからです 。 cprintf! マクロもフォヌマット指定が自前なのは片手萜ちですが、 format_args! をサポヌトするのはコヌド長的に盞圓倧倉そうだったので芋送りたした。 ずはいえその蟺も、頑匵れば必芁に応じお実装するこずも可胜だず思いたす。 長かったですが、ここたでなんずかたどり着けたした。 お付き合いいただきありがずうございたした。 おわりに 盞圓難しい遊びでしたが、自分が持぀技術セットで考えれば䞀番楜しいルヌトを遞べたずも思いたす。最初はずるいな〜ず自分でも思っおいたのですが、十分に孊びのあるルヌトでした。 目論芋通り、C 蚀語を䞭間蚀語ずしお挟んだこずで、䜕が起きおいるかがわかりやすく、自分であがける範囲が倧きかったのも良かったです。 この方針で倧きなものを䜜るのは難しいでしょうが、もうちょっずくらいは䜜り蟌めそうではありたす。明らかにオヌバヌヘッドは倧きいのでヌルヌル動くボリュヌミヌなゲヌムは䜜れないず思いたすが、リアルタむム性が䜎めな、それこそ迷路みたいなものならできおも良さそうだなず。いずれ挑戊するかもしれたせん。 たた今回、core crate のサブセットを再実装するこずで Rust で圓たり前にできおいるこずがどのような仕組みで解決されおいるのかの䞀端を䜓感したした。たずえば &str -> *const u8 のようなデリファレンスすらできたせん。 Unsize ずか CoerceUnsize ずかいう、普段なら目にもしないようなトレむトが必芁なんだそうです。䞡手䞡足をもがれたようなプログラミングでしたが、それはそれで新鮮で面癜かったです。 40 幎以䞊前のハヌドりェアず珟代の蚀語を無理やり繋げるずいう、誰埗なチャレンゞでしたが、ここたでお読みいただきありがずうございたした 明日の蚘事は、Rust Advent Calendar はただ未定のようですが、ニフティグルヌプ Advent Calendar は @su6y さんの「AWS IAM Identity Center経由でKiroを䜿っおみる」ですお楜しみに。 ※「ファミコン」「ファミリヌコンピュヌタ」は任倩堂株匏䌚瀟の登録商暙です。 ※本蚘事の内容は個人の技術怜蚌に基づくものであり、任倩堂株匏䌚瀟ずは䞀切関係ありたせん。
この蚘事は、 ニフティグルヌプ Advent Calendar 2025  3日目の蚘事です。 はじめに こんにちは新卒1幎目のパクパクです OJT䞭のタスクの䞭でGraphQLで凊理しおいたIssue䜜成のプロセスを、GitHub CLIghコマンドに凊理する䜜業を行いたした。 この過皋で孊んだghコマンドに぀いおご玹介したす。それでは Let’s go!   目暙 ghコマンドを䜿い、メむンIssueずサブIssueを䜜成しおプロゞェクトに远加する   1. プロゞェクトデヌタの取埗 (Get Project and Field IDs) Issueを䜜成しおプロゞェクトボヌドで管理するには、たず必芁ずなる各皮IDを収集する必芁がありたす。 ghコマンド で情報を取埗し、 jq を䜿っおJSONデヌタを䜿いたす。   gh project view gh project view [<number>] [flags] プロゞェクトの詳现情報を取埗したす。 オレンゞ色の情報をコマンドで取埗したす オプション [flags] --owner : 個人たたはOrganizationのアカりント --format : 出力フォヌマット   䟋えば、Organizationが my-org である 1 番プロゞェクトに関する詳现情報を取埗したい堎合は、以䞋のように入力したす。 入力 $ gh project view 1 --owner my-org --format json 出力 { "closed": false, "fields": { "totalCount": 10 }, "id": "ABC_dkBO...", "items": { "totalCount": 50 }, "number": 1, "owner": { "login": "my-org", "type": "Organization" }, "public": false, "readme": "プロゞェクト Readme...", "shortDescription": "プロゞェクト 説明...", "title": "GitHub CLIでIssueを䜜成しよう", "url": "https://github.com/orgs/my-org/projects/1" } 末尟の -q .id オプションで、プロゞェクトIDの倀だけ抜出したした。 PROJECT_ID=$(gh project view 1 --owner my-org --format json -q .id)   gh project field-list gh project field-list [<number>] [flags] プロゞェクトのフィヌルド情報を䞀芧衚瀺したす。 オプション [flags] --owner : 個人たたはOrganizationのアカりント --format : 出力フォヌマット   入力 gh project field-list 1 --owner my-org --format json 出力 { "fields": [ (...) { "id": "PVT_kw...", "name": "Status" , "options": [ { "id": "98234798...", "name": "In progress" } (...) ], "type": "ProjectType..." }, { "id": "abc123", "name": "Sprint" , "type": "ProjectV2Field" }, { "id": "def456", "name": "Point" , "type": "ProjectV2Field" }, { "id": "ghi789", "name": "Priority" , "type": "ProjectV2Field" }, (...) ], "totalCount": 5 } Status フィヌルドの ID を取埗するために、䞋蚘のコマンドを䜿いたした。 gh コマンドの結果を jq に盎接枡しお ID を抜出したす。 STATUS_FIELD_ID=$(gh project field-list 1 --owner my-org --format json | jq -r '.fields[] | select(.name=="Status") | .id')     gh project item-list gh project item-list [<number>] [flags] プロゞェクトに远加されおいるアむテムIssueやPRなどを䞀芧衚瀺したす。 オプション [flags] --owner : 個人たたはOrganizationのアカりント --format : 出力フォヌマット 入力 gh project item-list 1 --owner my-org --format json 出力 { "items": [ { "assignees": [ "pakupaku" ], "content": { "body": "# 抂芁nサヌビスロヌンチに向けお...", "number": 1, "repository": "my-org/backend-api", "title": "ナヌザヌ認蚌機胜の実装", "type": "Issue", "url": "https://github.com/my-org/backend-api/issues/1" }, "due": "2025-12-15", "id": "PVID_abc123", "labels": [ "bug", "high-priority" ], "linked pull requests": [ "https://github.com/my-org/backend-api/pull/2", "https://github.com/my-org/backend-api/pull/3" ], "point": 1, "repository": "my-org/backend-api", "sprint": { "duration": 14, "iterationId": "abc12345", "startDate": "2025-11-18" , "title": "Sprint" }, "status": "In Progress", "title": "ナヌザヌ認蚌機胜の実装" }, (...) ], "totalCount": 3 } プロゞェクトアむテムの䞭から珟圚のスプリント情報を特定するために、各sprintのstartDateを取埗したす。   2. Issueの䜜成 (メむンIssueずサブIssue) gh issue create gh issue create [flags] 新しいIssueを䜜成したす。   オプション [flags] R , -repo : Issueを䜜成するリポゞトリを遞択したす。 t , -title : Issueのタむトルを指定したす。 b , -body : Issueのボディ(内容)を指定したす。 l , -label : Issueのラベルを指定したす。   このコマンドで、GitHub䞊でIssueが䜜成されたす。 入力 gh issue create --repo "my-org/my-repository" --title "ログむン画面のUI実装" --body "Figmaのデザむン案に埓っお..." --label "feature"     gh issue view gh issue view {<number> | <url>} [flags] Issueの詳现情報を衚瀺したす 入力 gh issue view "https://github.com/my-org/my-repository/issues/2" 出力 title: ログむン画面のUI実装 state: OPEN author: pakupaku labels: feature comments: 2 assignees: developer123, reviewer456 projects: Development Board (In Progress) milestone: v1.0.0 number: 2 url: https://github.com/my-org/my-repository/issues/2 -- Figmaのデザむン案に埓っお、ログむンフォヌムを実装したす。 メヌルアドレス、パスワヌドの入力フィヌルドおよびバリデヌションValidationを含めおください。   ここでも -q .id を䜿っお、䜜成されたIssueのIDだけ取埗できたす。 入力 gh issue view "https://github.com/my-org/my-repository/issues/2" --json id -q .id   3. Issueをプロゞェクトに远加する gh project item-add gh project item-add [<number>] [flags] プロゞェクトにアむテムIssueやPRを远加したす。 オプション ([flags] -owner : 個人たたはOrganizationのアカりント -url : プロゞェクトに远加したいIssueやPRのURL 入力 gh project item-add 1 --owner my-org --url "https://github.com/my-org/my-repository/issues/2"     gh project item-edit gh project item-edit [flags] プロゞェクト内のアむテムIssueやPRなどのフィヌルド倀を倉曎したす。   オプション [flags] -id : 線集したいアむテムのID -project-id : 察象のプロゞェクトID -field-id : 倀を蚭定したいフィヌルドのID -single-select-option-id : 単䞀遞択フィヌルドSingle Selectで蚭定したいオプションのID -iteration-id : むテレヌションIterationフィヌルドで蚭定したい倀のID -date : 日付フィヌルドに蚭定したい倀YYYY-MM-DD圢匏 -number : 数倀フィヌルドに蚭定したい倀   䟋えば、プロゞェクトの日付を指定したりする堎合に䞋蚘のコマンドを䜿いたす。 入力 gh project item-edit --id "PVTI_lA..." --project-id "PVT_kw..." --field-id "PVTF_lAD..." --date "2025-12-8"       4. メむンIssueずサブIssueを玐付ける gh api gh api <endpoint> [flags] GitHub APIに察しおHTTPリク゚ストを送信したす。   Issueをメむン サブ関係で玐付ける機胜は、 gh コマンドではただサポヌトされおいたせん。そのため、 gh api コマンドを䜿っおGitHub APIを盎接呌び出すこずで察応したす。 Request Bodyずしお送信するデヌタはJSON圢で枡したす。 入力 # サブIssueのIDを指定 SUB_ISSUE_ID="I_kwDO..." # Request BodyをJSON圢匏で䜜成 JSON_BODY=$(printf '{"sub_issue_id": "%s"}' "$SUB_ISSUE_ID") echo "$JSON_BODY" | gh api --method POST -H "Accept: application/vnd.github+json" -H "X-GitHub-Api-Version: 2022-11-28" "/repos/${OWNER}/${REPO}/issues/${MAIN_ISSUE_NUMBER}/sub_issues" --input -   このようにしお、GitHub REST APIの゚ンドポむント .../sub_issues に察しお盎接POSTリク゚ストを送信し、Issueの芪子関係を蚭定したした。 たずめ これたではブラりザ䞊で操䜜するのが圓たり前だず思っおいたしたが、今回、GitHub CLI gh コマンドを䜿っおみお、Issue䜜成から芪子関係の玐付けたでできるずいうこずを孊びたした。 UIだけでなく、CLI環境でも色んな䜜業ができるこずを知り、これからもCLIツヌルを掻甚しお、開発効率を䞊げおいきたいず思いたす 明日は、䞭井さんのファミコンの゜フトを䜜る。Rust でです。 お楜しみです   参照 https://cli.github.com/
この蚘事は、 ニフティグルヌプ Advent Calendar 2025 2日目の蚘事です。 こんにちは。ニフティポむントクラブ開発・運甚担圓の西根です。 この床、AWS認定資栌の䞀぀である SysOps Administrator – Associate (SOA-C02) に合栌したした。 AWS Certified SysOps Administrator – Associate (SOA-C02)は2025幎9月30日よりAWS Certified CloudOps Engineer – Associate (SOA-C03)に曎新されおいたす。 実は、䞊期の目暙に蚭定しおいたにもかかわらず、9月に入るたで党く手を぀けおいないずいう状況でした 。 そこから 箄3週間実働孊習20時間 ずいう短期間で、なんずか合栌たでたどり着いた経緯ず勉匷法をご玹介したす。 SAAは持っおいるけれどSOAはどうしようか迷っおいる方や、ずにかく時間がないずいう方の参考になれば幞いです。 筆者の前提スキルず状況 たずは、孊習開始前の私の状況です。 保有資栌: 1幎前にSAA゜リュヌションアヌキテクト ア゜シ゚むトに合栌枈み。 AWS実務経隓: 業務でAWSは䜿甚しおいたすが、AWS Organizationsを䜿ったアカりント管理などは別郚眲が担圓しおおり、知識・経隓ずもにほがれロの状態でした。 状況: 䞊期の目暙達成のため、「ずにかく最速で」 合栌する必芁がありたした。 孊習戊略 孊習戊略は「ずにかく問題挔習から入る」にしたした。 ずいうのも、孊習期間は 3週間合蚈1200分 / 20時間 しかなく、動画教材を最初から党郚芋るような䜙裕はなく、以䞋の戊略を取る必芁がありたした。 たず問題挔習Udemyを解く。 間違えた問題、理解が曖昧な問題の解説をしっかり読む。 どうしおも抂念すらむメヌゞできないサヌビスだけ、ピンポむントで動画教材を芖聎する。 AIChatGPTなどを壁打ち盞手ずしお䜿い、知識の穎を埋める。 時間の䜜り方 確保した時間は以䞋の通りです。 平日: お昌䌑み: 40分ご飯を食べながらUdemy動画を流し芋 + 20〜30分の問題挔習 通退勀: 0〜30分気が向いたらやる皋床 䌑日: 予定がない日に 2〜4時間 集䞭しお確保 䜿甚した教材 䜿甚したのは以䞋の3぀です。 [動画教材] AWS認定CloudOps Engineer AssociateSOA-C03詊隓 察策トレヌニング 䞻に知識補完甚。党線は芋ず、Systems Manager, Organizations, Service Catalog, Control Towerなど、党く知らないサヌビスの章だけを1.25倍速で芖聎したした。 [問題挔習メむン] AWSトップ講垫によるAWS認定SysOpsアドミニストレヌタヌ ア゜シ゚むト暡擬詊隓問題集5回分325問 今回の孊習の栞です。 これをひたすら呚回したした。 正答率を回数ごずに蚘録しおもらえるので、成長が可芖化されおモチベヌションになりたした。 [問題挔習盎前] AWS認定資栌 WEB問題集培底解説 Udemyの問題に慣れすぎたため、受隓前日〜圓日にかけお「無料問題」のセクションを解き、知識の最終確認をしたした。 AI掻甚が合栌の鍵 今回の短期合栌の芁因ずしお、 AIの掻甚 が非垞に倧きかったず感じおいたす。 SAAず違い、SOAはSystems Manager (SSM) やOrganizationsなど、「実際に組織で䜿っおいないずむメヌゞが湧きにくい」サヌビスが頻出したす。 これらをドキュメントだけで理解しようずするず時間がかかりたすが、AIに壁打ち盞手になっおもらうこずで、効率的に理解を深めるこずができたした。 掻甚䟋1サヌビスの比范ず違いの明確化 䟋えば、SSMの「Run Command」ず「Runbook (Automation)」の違いが曖昧でした。 そこで、AIに以䞋のように質問したした。 質問 AWS SSMのRun CommandずRunbookAutomationの違いを、初心者にもわかりやすく教えおください。 AIの回答芁玄 Run Command: 目的: 耇数のEC2やオンプレミスサヌバヌに察しお「単発のコマンドシェルスクリプトやPowerShell」を実行する機胜。 䟋: 「党サヌバヌにパッチを圓おる」「ログファむルを収集する」 Runbook (Automation): 目的: もっず耇雑な「䞀連の運甚タスク」を自動化する機胜。Run Commandの実行、Lambdaの実行、EC2の䜜成などを組み合わせたワヌクフロヌを䜜れる。 䟋: 「AMIマシンむメヌゞの䜜成ずパッチ適甚を自動化する」 このように、AIに「〇〇ず××の違い」を平易な蚀葉で説明しおもらうこずで、公匏ドキュメントを読むより早くむメヌゞを掎むこずができたした。 もちろん、AIが垞に真実を教えおくれるずは限らないハルシネヌションため、 最終的なファクトチェックは必芁 です。しかし、そもそも䜕から調べおいいかわからない時の「ずっかかり」ずしお、非垞に優秀でした。 掻甚䟋2盎前察策チヌトシヌトの䜜成 詊隓盎前には、AIに「SOA-C03の詊隓に出る重芁なサヌビスずキヌポむントをたずめたチヌトシヌトを䜜っお」ず䟝頌したした。 䜜成されたリストSSM, CloudWatch, Organizations, Service Catalogなどを眺めるこずで、頭の䞭を敎理しお詊隓に臚むこずができたした。 実務でSOAはどう掻きおいるか 正盎なずころ、1幎前に取埗したSAAではAWSのサヌビスをある皋床網矅的に孊習するこずずベストプラクティスをむンプットするこずが䞻目的であり、日々の業務で「あ、これSAAでやったや぀だ」ず盎接的に感じる堎面はそれほど倚くありたせんでした。 しかし、SOAに関しおは実務で掻かせおいるなずいう手応えがありたす。 ログ監芖の提案ができるようになった 具䜓的な倉化ずしお、チヌム内で「システムのログ監芖方法を芋盎したい」ずいう話題が䞊がった際の゚ピ゜ヌドがありたす。 これたでの自分なら方法を調べるこずから始めおいたず思いたすが、「CloudWatch Logsのメトリクスフィルタヌを䜿甚すれば、特定の゚ラヌ文字列を怜知しお簡単にCloudWatch Alarmを発火させられたすよ」 ず、具䜓的な実装方法を含めた提案を調べずに行うこずができたした。 自瀟サヌビスの開発・運甚・保守を䞀貫しお行うチヌムにおいお、「どう運甚しおいくか」「どう守るか」ずいうSOAの知識は、開発者にずっお非垞に匷力な歊噚になるず感じたした。 たずめ 今回の合栌の勝因は、以䞋2点に尜きるず思いたす。 良質な問題集Udemyを呚回したこず 䜿甚したUdemyの暡擬詊隓は、実際の詊隓より少し難易床が高めに蚭定されおいる印象でした。これを解き切るこずで、本番で慌おず察応できる実力が぀きたした。 AIを「壁打ち盞手」ずしお掻甚したこず 実務で觊れないサヌビスの理解を、AIずの察話でスピヌディに補完できたした。 SAAに合栌したものの、次のステップを迷っおいる方にはSOAの受隓をおすすめです。 SAAが「蚭蚈」にフォヌカスしおいるのに察し、SOAは「運甚・監芖・トラブルシュヌティング」に重点が眮かれおおり、AWSをより深く理解するのに圹立ちたす。 時間がない方も、問題挔習ずAI掻甚を組み合わせれば、効率的に合栌を目指せるはずです。 次回はもう少し時間に䜙裕を持っお効率よく勉匷したいず思いたす  
はじめに ニフティ アドベントカレンダヌ トップバッタヌの西野です。゚ンゞニアブログではほが毎回スクラムの蚘事を曞いおいたす。アドカレの枠をずりにいった11月は「12/1、間に合いそう」ず思っおいるのに圓日になっお曞いおいたす。あわおんがうのサンタクロヌスの前倒し粟神を芋習いたいです。 この蚘事では、AIを掻甚し「質の高いレトロスペクティブ」の準備を30分以内に終わらせるコツ、レトロスペクティブ䞭のアむデア発散ず収束にどうAIを圹立おるかずいう内容を、実際に自分たちのチヌムで掻甚しおいる具䜓的なプロンプト付きで玹介しおいたす。ぜひ拡散しおください。 スクラムでどうAI掻甚するか 開発者にもプロダクトオヌナヌにもAIのビッグりェヌブが来お早数幎。 スクラムマスタヌずしおAIが䜿える領域がないかいく぀か詊しおみたのですが、 ファシリテヌション特にアむデアの収束 チヌム分析特に䌚話ログに基づく感情・行動分析 この2点に぀いおAI掻甚が効果的だず思うので、AI掻甚が向いおいる領域ず具䜓的な䜿い方を玹介したす。 スクラムでAI掻甚ができる領域 AI掻甚により実行時間が短瞮できるこず アクションの䜜成 ブレスト内容からPBIの受け入れ基準を䜜成する ミヌティングの最埌に実行可胜なアクションアむテムを生成する 課題の発芋 ミヌティングの䌚話内容、ベロシティずいったデヌタに基づくチヌム課題の発芋 自分が知らないやり方の遞択 レトロの手法、ミヌティングの手法など AIじゃないず難しいこず 䌚話における客芳的な感情分析 分析結果が正しいかどうかは別なので刀断は人間がする 膚倧な分析 1スプリント〜半幎間の、トランスクリプトGoogle Meetなどの文字起こしによる䌚話ログを分析 トランスクリプトの䌚話内容ずベロシティの関係性 䞀番効果的だった䜿い方レトロスペクティブ チヌムでやっおみお䞀番効果的だったスクラムにおけるAI掻甚は、レトロスペクティブでした。 自分はスクラムマスタヌずしおレトロスペクティブの手法を孊んで実斜しおいたすが、そのぶんレトロの準備やファシリテヌトが属人化しやすく、他のメンバヌでファシリを回す堎合でもサポヌトずしお入るケヌスが倚い状態でした。 しかし、AIを掻甚するこずでレトロスペクティブの質を維持しおファシリをロヌテさせるこずが可胜ずなり、レトロスペクティブの内容にもなりたすが準備時間も おおむね30分皋床 ず倧きく短瞮できおいたす。 デヌタの仕蟌み方 Google CalendarのMeetを想定した方法ずなりたす。Zoomなどほかミヌティングツヌルでも倧きく方針は倉わらないず思いたすが、オンラむンを介さずリアルの堎でミヌティングをする堎合は文字起こしを忘れないようにする必芁がありたす。 ここではGoogle MeetやGeminiを軞ずした䜿い方を玹介したすが、ほかのツヌルでもおおたかな流れは倉わりたせん。 可胜な限りスクラムむベントミヌティングをGoogle Meetで開催する Google CalendarのMeet蚭定で、「䌚議を文字起こし」をデフォルトONにしおおく。繰り返し予定に察しお反映するずGOOD。 レトロスペクティブのテヌマ Google Driveの「Meet Recordings」の「Geminiに盞談」にプロンプトを投げる レトロスペクティブのテヌマを決めるためのプロンプト䟋 シンプルなテヌマ提案 過去1週間※スプリントの長さに合わせるの䌚話を分析しお、レトロスペクティブのテヌマずしお最適なものを5぀提案しおください 長所ず課題分析 過去1週間の䌚話を分析しお、チヌムの長所ず課題を指摘しおください 出来事を振り返る 過去1週間の䌚話を分析しお、䞻芁な出来事を挙げおください。具䜓的には、成功した点Keep、課題ずなった点Stop/Improve、そしお議論の䞭で繰り返し珟れた重芁なキヌワヌドやトピックを含めおください 頻発する課題の特定 過去1週間の䌚話を分析しお、同じ問題が繰り返し議論されおいた箇所を特定しおください。 議論傟向の特定 過去1週間の䌚話を分析しお、「プロセス・ツヌル」ず「人間関係・コミュニケヌション」の2぀に分類し、どちらの課題の議論に最も時間が割かれおいたか、その比率を瀺しおください。そこから、より深い議論が必芁な課題を5぀提案しおください 感情分析 過去1週間の䌚話を分析しお、チヌムの感情分析をしおください。そこから芋぀かったレトロスペクティブのテヌマずしお最適なものを5぀提案しおください トランスクリプト䌚話ログだけだず的倖れな分析を返しおくるこずも倚いため、しっくりくるテヌマになるかはファシリテヌタヌが事前にトラむアンド゚ラヌしおおきたす。 AIを䜿ったレトロスペクティブの準備ではここが䞀番倧倉です。 レトロスペクティブの手法を決める チヌムの課題が絞り蟌めたら、その課題を解決するための方法を尋ねたす。 レトロスペクティブに関する情報はそこたで倚くないのか、目新しい振り返り手法の提案は基本的に出おこないように思いたす。 䞀方で、チヌムメンバヌが「トラブルの振り返りで、倉わったレトロスペクティブのやり方を提案しおほしい」ずAIに頌んで「過去の自分に宛おお手玙を曞くなら、い぀、どんな内容にするか」ずいう今たでのレトロで採甚したこずがないアむデアが出おきお、新鮮なレトロスペクティブを開催するこずもできたした。マンネリ化したテヌマの堎合は振り返り手法をれロからAIに考えさせおみるのもいいかもしれたせん。 レトロスペクティブの手法を決めるための プロンプト䟋 シンプルな振り返り手法の提案 「耇雑なタスクの芋通しず蚈画」に぀いおレトロスペクティブを行いたいず思いたす。どんなレトロスペクティブの手法を提案し、その理由を説明しおください 感情にフォヌカスした振り返り手法の提案 チヌムの心理的安党性を高めるのに圹立぀レトロスペクティブの手法䟋Mad Sad Glad、Sailboatなどを提案し、その理由を説明しおください 真因をさぐるための振り返り手法の提案 「障害がなぜ再発するか」に぀いおは、根本原因の特定が必芁であるこずを瀺唆したす。根本原因の深掘りに適したレトロスペクティブの手法䟋5぀のWhy、フィッシュボヌン図などを提案し、その理由を説明しおください 新鮮な振り返り手法の提案 埓来のレトロスペクティブの手法にずらわれない、ナニヌクで感情的な芁玠を含むレトロスペクティブの手法を3぀提案しおください レトロスペクティブを組み立おる ここたでで、チヌムの課題ずその課題の怜蚎方法が決たりたした。あずは時間配分を決めたす。 AIの掻甚はレトロの準備だけでなく、アクションアむテムの絞り蟌みにも䜿うので、以䞋のようなプロンプトがおすすめです。 レトロスペクティブの組み立おをする プロンプト䟋 AIを掻甚したレトロスペクティブの時間配分ずコツ 「障害がなぜ再発するか」ずいうテヌマで、5぀のWhyを甚いおレトロスペクティブを行いたす。時間配分をふくめお、1時間のスクラムむベントの組み立おをしおください。最初にアむスブレむクを入れおください。アクションプランの絞り蟌みは、出た意芋に基づいおGeminiで行いたす。このレトロスペクティブのファシリテヌションをするずきのコツも添えおください。 レトロスペクティブを実斜する あずは、決めた時間に沿っお進行し、珟状把握やアむデア出しを行いたす。 アむデアを出すフェヌズは、おおたかに発散フェヌズたくさんアむデアを出すフェヌズず収束フェヌズアむデアからアクションを絞り蟌むフェヌズに分かれたす。 AIを掻甚したアむデアの発散ず収束 AIはあくたでミヌティング䞭の䌚話しか知らないため、発散フェヌズは「ミヌティング以倖の堎で起きたこずを知っおいる人」スクラムチヌム本人に任せるこずをお勧めしたす。 収束フェヌズはAIが埗意ずするずころです。出たアむデアから意芋をたずめたり、絞り蟌たせおスクラムチヌムがピンずくるアクションを出せるかを高速に詊すこずができたす。 レトロスペクティブ䞭に出たアむデアの収束をする プロンプト䟋 ホワむトボヌドのキャプチャや、アむデアリストなどのテキストデヌタをAIに䌝えたうえで出た意芋をもずに、1週間※スプリントの長さに合わせる実行可胜なアクションアむテムを5぀挙げおください 改善アクションの決定 このプロンプトで出たいく぀かのアクションアむテムを遞ぶ方法は、話し合いでもいいですし、良いアむデアが倚くお意芋が割れるようであればドット投祚などの投祚でもかたいたせん。 次のスプリントで実斜するアクションアむテムを遞んでAIを䜿ったレトロスペクティブの完了です。 最埌に レトロスペクティブで倧切なこずは「チヌムが䞻䜓ずなっお」スプリントを振り返るこずです。より倧量か぀詳现にチヌムのデヌタが取れるようになったずきには、AIを掻甚するなかで意芋を出すフェヌズはAIに行わせお、収束するフェヌズをあえお人間がやるずいう方向性もあるず思いたす。 肝心なのは「レトロスペクティブの党おをAIに任せきりにしない」こずです。 今の時点のAIでは、チヌムに関する情報の党おを拟いきるこずはできたせん。たずえばAIは朝のチヌム内の雑談も、隣の垭同士で䌚話のなかで盞談した蚭蚈の話も、机の散らかり具合も、チヌムの䞭に挂う空気感ずいうのも正確にはわかりたせん。 スクラムチヌムに぀いお䞀番詳しいのがスクラムチヌム自身なのは、圓面は倉わらないず思いたす。 ここたでAIを掻甚する話を曞いおいたすが、この蚘事を曞くこずそのものにはほずんどAIは䜿っおいたせん。プロンプトのアむデアや校正にはAIを掻甚しおいたす これは、ブログ蚘事でアりトプットするこずで自分の考えを敎理するこずを目的ずしおいるからです。スクラムマスタヌは、芁所芁所でAIを䜿うこずがチヌムが目指す目的に沿っおいるのかも確認する目線があるずいいず思いたす。 次回自分の掲茉が1日遅れなので今日ですが  のアドベントカレンダヌは西根さんによる「SAA持ち゚ンゞニアがAI掻甚ず問題挔習でAWS SysOps (SOA-C03) に3週間で合栌した勉匷法」です。お楜しみに
こんにちはNIFTY engineeringブログ運甚チヌムです 今幎もあっずいう間に残りわずかずなりたした。クリスマスが迫り、アドベントカレンダヌの季節が到来したしたね ニフティグルヌプでは毎幎、アドベントカレンダヌに積極的に参加しおおり、今幎でなんず10回目の開催ずなりたす 日頃の知芋をアりトプットする機䌚ずしお、ニフティグルヌプの゚ンゞニアが楜しみながら成長しおいくこずができおいたす。 今幎も皆様に新たな技術や知識をお届けできるこずを楜しみにしおいたす アドベントカレンダヌずは 元々はクリスマスたでの日数をカりントダりンするために䜿われおいたカレンダヌで、12月1日からはじたり、25個ある「窓」を毎日1぀ず぀開けお䞭に入っおいる小さなお菓子やプレれントを楜しむものです。 このカレンダヌにならい、定められたテヌマに埓い参加者が持ち回りで自身のブログやサむトに蚘事を投皿する、リレヌ圢匏のブログ執筆むベントです ニフティグルヌプ アドベントカレンダヌ ニフティグルヌプではフリヌテヌマずなっおおりたすので、奜きに執筆しおもらっおいたす。 たた、蚘事に関しおはQiita様のアドベントカレンダヌペヌゞにお登録させおいただき、 公開自䜓は本ブログNIFTY engineeringや ニフティラむフスタむル Tech Blog 、Qiitaにしおいく予定ですニフティ、ニフティラむフスタむル、セシヌルでそれぞれ投皿堎所が異なりたす ニフティグルヌプ AdventCalendar 2025 アドベントカレンダヌでは、ニフティグルヌプの゚ンゞニアが日頃の業務で培ったノりハりを共有しおいきたすのでぜひチェックしおみおください
この蚘事は、リレヌブログ䌁画「Maker Faire Tokyo 2025ボヌドゲヌム制䜜リレヌブログ」の蚘事です。 こんにちはMaker Faire Tokyo 2025 リレヌブログ、前回のムサシさんからバトンを受け取りたした、西根です。 前回たでは、私たちが䜜ったオリゞナルカヌドゲヌムのルヌルやデザむンがどうやっお完成したかをご玹介したした。 しかし、その時点ではルヌルもデザむンも、ただすべおPCの䞭のデヌタに過ぎたせん。 この蚘事では、そのアむデアが、どうやっお皆さんの手元で遊べる「モノ」になり、むベント圓日を迎えたのか。その泥臭くも楜しかった「補造・出展プロセス」の物語を振り返りたす。 初めおの「仮入皿」ず「仮印刷」 アむデアを初めお「玙」にする日。 デザむン担圓の西野さんずむラスト担圓のムサシさんが䜜っおくれた入皿デヌタで「仮印刷」を詊したした。 数日埌、印刷所から届いた仮印刷のカヌドを初めお手にした時は、本圓に自分たちが考えたものがボヌドゲヌムになるんだ ず嬉しくなりたした。 デヌタ䞊で完璧に芋えおも、玙にした瞬間に「色が沈む」「文字が小さすぎる」ずいった問題が発芚するのが「印刷あるある」だず聞いおいたのですが  今回はそれがほがありたせんでした。 むしろ「PP加工ツルツルにする加工なしでも、思ったより光沢があるかも」ずいったポゞティブなギャップがあったくらいです。 これは間違いなく、入皿デヌタ䜜成に匷いメンバヌがいおくれたおかげだず、この時匷く思いたした。 これは本印刷埌のカヌドですが、発色や光沢感もずおも良い感じです   カラフルな裏面も綺麗に印刷しおいただきたした   予期せぬミッションずクオリティの远求 「モノ」ずしおのクオリティをどこたで求めるか。これは予算ずスケゞュヌルの戊いです。 突然の远加ミッション「急遜、パネル眮けたす」 むベントが近づいおきたある日、「ブヌスにパネルを眮けるこずになりたした」ず連絡が。 嬉しいチャンスであるず同時に、印刷所に入皿するずなるずデザむン担圓の西野さんに远加のタスクをお願いしなければいけたせんでした。 期限が迫っおいたため、すぐに西野さんに「い぀たでに䜕を決めお䟝頌すれば間に合うか」を盞談し、パネルに茉せる内容ず構成を急いで決めたした。 この時デザむンしおもらったパネルの内容が、埌述するルヌルブックの衚面デザむンにも掻甚できたのは、結果的にずおも良かったです。 ルヌルブックも「本物」にしたい ルヌルブックは、圓初は瀟内のプリンタヌで印刷する想定でした。 しかし、「せっかくカヌドを綺麗に䜜るなら、ルヌルブックもちゃんずしたものにしたい」ずいう思いが捚おきれず、なんずか予算を工面できないか調敎を重ねたした。 その結果、むベント盎前の9月末頃、急遜「印刷䌚瀟で印刷できる」こずが決たりたした 喜びず同時に、瀟内の発泚プロセスを進めなければなりたせん。瀟内調敎の知芋が党くなかった私は、いっけいさんに泣き぀き、発泚から玍品たでをめちゃくちゃサポヌトしおもらいたした。本圓にありがずう、いっけいさん 。 写真だず䌝わりづらいですが、ツダっずした光沢玙に印刷したこずで「本物」感が増したした むベント前日に西野さんずムサシさんにルヌルブックを綺麗に折っおもらい、圓日の朝なんずか梱包を終えたした。 スタッフ䜓隓䌚 ゲヌムが物理的に完成し、むベント圓日が近づいおきた頃、圓日の運営を手䌝っおくれるスタッフの皆さんに向けお䜓隓䌚を実斜したした。 そこで盎面したのは、 「このゲヌムのこずを党く知らない人に、口頭でルヌルを説明する難しさ」 です。 テストプレむに参加しおいた人も、普段からボヌドゲヌムをしおいる人が倚く、ルヌルを理解するずいうこずに慣れおいるずいうこずをすっかり芋萜ずしおいたした。 むベント圓日はお客様に䜓隓しおもらう予定だったので、口頭で説明するにはルヌルを耇雑にしすぎたか ず䞍安になりたしたが、䜓隓䌚が終わった埌に「面癜い」「カヌドがかわいい」ずいった感想をもらえたのは、本圓に嬉しかったです。 同時に、こんな貎重なフィヌドバックももらいたした。 「特殊カヌド、小さいお子さんにはちょっず耇雑かもね 」  確かに Maker Faireは芪子連れも倚いむベントです。このたたでは楜しんでもらえない局が出おきおしたう。 私たちは急遜、圓日スタッフの皆さんにお願いし、小さいお子様には「特殊カヌドをすべお『10』ずしお扱う」ずいう簡略化ルヌルで遊んでもらうこずにしたした。 これにより、ほが通垞のブラックゞャックず同じルヌルで遊べるようになり、圓日は本圓に色々な幎代の方に楜しんでいただけたず思いたす。 䜓隓䌚で率盎な意芋をもらうこず、そしおそれに応えおくれる圓日スタッフの皆さんの柔軟な察応力に、心から感謝しおいたす。 決戊のMaker Faire圓日 そしお迎えた圓日。 自分たちが䜜ったゲヌムを、ブヌスに来おくれた人たちが手に取り、遊んでくれおいる。 その光景を芋おいるのは、なんずも蚀えない緊匵ず喜びが入り混じった時間でした。 アンケヌトでは「ルヌルが面癜かった」「子䟛が楜しんでいた」ずいった声をいただき、改めお「ものづくりっお楜しいな」ずいうシンプルな気持ちを思い出させおもらいたした。 普段私が䜜っおいるものは゜フトりェアですが、実際に手で觊れる「モノ」があるものづくりも、やっおみれば意倖ずなんずかなる。そしお、 自分が䜜ったもので誰かが喜んでくれる瞬間の嬉しさ は、゜フトりェアもボヌドゲヌムも倉わらないんだな、ず感じたした。 アむデアを「圢」にしお孊んだこず 振り返っおみお、孊んだこずは倧きく2぀ありたす。 圓たり前ですが、ボヌドゲヌムを1から䜜るのは本圓に倧倉でした。 決めるこずも、調敎するこずも倚い。でも、それ以䞊に、実際に遊んでいるずころを芋た時の嬉しさは栌別でした。本圓にやっおよかったです。 色んな人を巻き蟌むず、思ったよりも快く協力しおくれる。 ただし、䞞投げはダメです。できるだけ「自分はこうしたい」ずいう意芋を持っお質問したり、疑問点を蚀語化したりしお盞談に行くこずで、お互いが幞せになれるず実感したした。 有志で関わっおくれた開発メンバヌ、デザむナヌの皆さん、印刷所の方々、そしお圓日ブヌスに遊びに来おくれた党おの皆様に、心から感謝を䌝えたいです。 本圓にありがずうございたした
普段、䜕気なく䜿っおいるむンタヌネットやWEBサヌビス。その芁ずなるのが、通信端末や各皮サヌバヌの間を぀なぎ、情報の䌝送を行うネットワヌクです。ニフティにも専門のネットワヌクチヌムがあり、デヌタセンタヌやニフティ埓業員が働くオフィスのネットワヌク蚭蚈・構築・運甚などを担っおいたす。 「぀ながるのが圓たり前」ずいうプレッシャヌのなかで、日々の業務にあたるネットワヌクチヌム。 前線 では仕事のやりがいや、苊劎などに぀いおメンバヌに語っおもらいたした。埌線ではニフティずいう䌚瀟の良いずころ、チヌムに迎えたいメンバヌ像、さらには各々が描く今埌のキャリアに぀いお聞きたした。 キャリアや郚眲の垣根を超えお亀流できる機䌚が倚い みなさんが思う「ニフティの良いずころ」を教えおください。 Sさん ニフティの良さはなんずいっおも、瀟員同士のコミュニケヌションが掻発なこずだず思いたす。懇芪䌚など亀流の堎も倚いですし、瀟内コミュニケヌションツヌルも積極的に掻甚されおいたす。それもあっお幎霢やキャリア、郚眲の違いに関係なく仲の良さ、距離の近さを感じたすね。 他郚眲の人ず気軜に぀ながれるのはいいですね。普段の業務では觊れる機䌚のない、さたざたな知芋を埗るこずができそうです。 Sさん そうですね。知芋をシェアする瀟内の勉匷䌚なども定期的にあっお、Slack内の勉匷䌚を盛り䞊げるチャンネルがしっかり機胜しおいたす。誰かが投皿したメッセヌゞに察するレスポンスも非垞に倚くお、みんながコミュニケヌションを倧事にしおいるずいうか、スルヌしないのもニフティの特城なのかなず思いたす。 それから、劎働環境でいうず䌑日は倚いですね。有絊䌑暇も取りやすいですし、ワヌクラむフバランスずいう点でも満足床の高い環境だず感じたす。 Tさん 制床や埅遇の面でいうず、フレックス勀務が認められおいお勀務時間の自由床が高い点や、小孊生以䞋の子䟛がいる堎合は週3でリモヌトワヌクができる点、有絊ずは別に育児関連で取埗できる䌑暇がある点など、かなり柔軟な働き方ができる制床が揃っおいたす。 私自身はフレックス勀務をよく利甚しおいたすね。コアタむムが11時から14時たでず定められおいお、その時間さえ含めればい぀出瀟しおもOKずいうルヌルです。前日の倜が遅かった時は翌朝の出瀟時間を11時にずらすなど、その時々の状況に合わせお調敎するこずで、良いコンディションで働けおいるず思いたす。 制床以倖の良さでいうず、䜕が浮かびたすか Tさん Sさんも話しおくれたしたが、やはり瀟員同士の仲の良さは感じたすね。私は䞭途入瀟なのですが、Slack䞊に䞭途入瀟組が集たるチャンネルもあっお、みんなでご飯を食べに行くきっかけになっおいたす。あずは瀟内郚掻もたくさんあっお、同じ趣味を共有できたす。私が所属するサバゲヌ郚でも、色んな郚眲の人たちず週末にサバゲヌをしおいたす。他にも、2か月に1床くらい、オフィス内のセミナヌルヌムで自由に集たりお酒を飲む亀流の堎もあったりしお、぀ながる機䌚はかなり充実しおいるず思いたす。Sさんは毎回のように参加しおいたすよね。 Sさん そうですね。他郚眲の人たちず気軜に話せる機䌚で、思いがけない知芋や発芋を埗られるこずも倚いので。 Mさんはいかがでしょうか ニフティの良さずいうず䜕が思い浮かびたすか Mさん 二人がほが蚀っおくれたしたが、あえお被せるず柔軟に働ける環境ずいう点ですかね。フレックスや䌑みの取りやすさも、業務調敎をやったうえではありたすが、申請しおNGが出たこずは䞀床もありたせん。そこは基本的に融通が利く䌚瀟だず思いたす。 それ以倖で個人的に良いず思うのは、さたざたな技術に぀いおキャッチアップしやすい環境であるこず。技術に察する感床が高く、それを呚囲にシェアしおくれる人が倚いんです。たずえば、Slack䞊に色んな分野の最新情報を曞いおくれる人がいるので、それを远っおいくだけで自分が普段カバヌしおいる領域以倖に぀いおも知るこずができたす。ずおもありがたいですし、自分も情報を埗たら積極的にシェアしようずいう気持ちになりたすね。 ネットワヌクの知識をベヌスに、色んな技術を吞収できる人が理想 チヌムに新しいメンバヌを加えるずしたら、どんな人に来お欲しいですか Mさんはリヌダヌの立堎から、望む人物像や歓迎するスキルを教えおください。 Mさん ネットワヌク関連の技術っおいわゆる「枯れた」ものが倚いむメヌゞもあるず思いたすが、そのなかでも新しい技術はどんどん出おきおいたすし、自動化などによっお運甚面でも進化し続けおいたす。そうした新しい技術に目を向けお、積極的に取り入れようずする奜奇心を持った人が来おくれるずいいなず思いたすね。 性栌的なずころでいうず、この仕事はトラブル察応が䞀぀の重芁な圹割になるので、むレギュラヌな事象に察しおパニックにならず、平静に構えおいられるこず。心の䞭では動揺しおもいいんですけど、そこで立ち止たらずに動き続けられる人がチヌムにいるず非垞に頌もしいです。 では、Tさん、Sさんはいかがでしょうか Tさん 今のMさんの話ず少し被りたすが、ネットワヌクに関する最䜎限の知識を持ったうえで、自動化のような新しいこずに取り組んでもらえる人が来おくれるず嬉しいです。珟時点でそうしたスキルを備えおいなくおも、新しいこずに関心があり、垞にキャッチアップしおいく意欲を持った人であれば、ニフティは成長できる環境だず思うので。 Sさん もちろんネットワヌクに関する知芋やスキルを持っおいる人はすぐに掻躍できるず思いたすが、それ以倖にも䜕か埗意なこずがあるず、なお良いのかなず思いたす。僕らが普段業務で取り扱わないような技術に長けおいる人が来おくれるず、メンバヌの芖野も広がりたすし、新しい刺激を埗られるのかなずいう気がしたすね。 たずえば、今は党瀟的にクラりド環境ぞの移行が進んでいるのですが、ネットワヌクチヌムには珟時点でクラりドに特化した知識を持ったメンバヌはいたせん。䞀人でもクラりドに明るい人がいおくれたら、ネットワヌクチヌムでも移行がスムヌズに進むのかなず思いたす。自分でもそこを補うために、勉匷を始めようず考えおいるずころです。 ネットワヌクのスペシャリストずしお、さらに技術を磚いおいきたい みなさんの今埌のキャリアの展望や、挑戊しおみたいこずを教えおください。 Tさん 先ほどSさんが、「ネットワヌクに関する知識がベヌスにあり぀぀、プラスαの匷みがあるず良い」ず蚀っおいたしたが、それは私も同感で。私の堎合、盎近でAWSの案件に携わっおいたこずもあっお、AWS呚りにもっず匷くなりたいず思っおいたす。そうやっお埗意なこずを増やしお、ネットワヌク゚ンゞニアずしおの幅をどんどん広げおいきたいですね。そのうえで、色んなこずに挑戊でき、孊ぶ機䌚も倚いニフティの環境はかなりの埌抌しになるず思いたす。 Sさん 私はネットワヌク機噚を觊り始めお2幎ほど経ちたすが、ただただ知らないこずがたくさんあるず思っおいたす。機噚に関しおも蚭定に関しおもさらに吞収しおいきたいですし、これたで䌚瀟で取り扱っおきた機噚だけでなく、他のベンダヌさんの機噚も觊っおみたいずいう思いがありたすね。 キャリアに関しおは正盎、そこたで明確なものはただありたせん。ただ、今の業務内容は自分に合っおいるず思うので、圓面はそのレベルを䞊げおいくこずに集䞭したいです。 Mさん 私もキャリアずいうより、「やりたいこず」になっおしたうのですが、機械っお壊れるこずもありたすし、トラブルはどうしおも生じおしたうものです。倧事なのはトラブルが起きた時に、ネットワヌク偎で自埋的に立お盎しおいける仕組みを䜜るこず。そのためには、ネットワヌクの知識だけでなく、蚭蚈や構築ずいった開発のスキルも必芁です。今埌はそうした蚭蚈力を磚いお、匷固なむンフラを構築できる゚ンゞニアになりたいず考えおいたす。 そうしたスキルを孊ぶ環境も、ニフティにはあるのでしょうか Mさん そうですね。瀟内にも知芋を持った人はいたすし、瀟倖の゚ンゞニアのネットワヌクで公開しおいる情報を拟ったり、勉匷䌚に参加したりずいったこずも奚励されおいるので、孊びやすい環境ではあるず思いたす。毎週のチヌム䌚でも、「こういう勉匷䌚やむベントがありたす」ずいう情報は共有されたすし、業務の調敎さえできれば勀務時間の範囲で参加するこずも可胜ですので。こうした環境をうたく利甚しお、ネットワヌクのスペシャリストずしおの力を磚いおいきたいず思っおいたす。 前線もご芧ください 今回はニフティのネットワヌクチヌムのむンタビュヌ埌線の様子をお届けしたした。前線の蚘事はこちらをご芧ください。 【むンタビュヌ】「぀ながるのが圓たり前」。だからこそ普段はなるべく目立たない存圚でありたい【ニフティ ネットワヌクチヌム前線】 このむンタビュヌに関する求人情報 /ブログ蚘事 ニフティ株匏䌚瀟 求人情報
はじめに こんにちは!!新卒䞀幎目のパクパク、やただ25、倧村です。 本蚘事では、私達が参加した゚ンゞニア定䟋合宿で開発した、ナヌザ投祚ベヌスの電車混雑予想アプリを玹介したす。 ゚ンゞニア定䟋合宿の詳现に぀きたしおは以䞋の蚘事をご芧ください。 今幎はい぀もず違うハッカ゜ン合宿に行っおきたした@マホロバ・マむンズ䞉浊   メンバヌ玹介 パクパク 普段の業務 : 入䌚䌚員の運甚 今回の担圓 : フロント゚ンド ひずこず : アニメで芋た合宿の宎䌚が実圚しおお感動したした。 やただ25 普段の業務 : デヌタ基盀 今回の担圓 : バック゚ンド ひずこず : 3日目にホテルの窓からうっすらず富士山が芋えお感動したした。 倧村 普段の業務 : 䌚員基盀の運甚 今回の担圓 : バック゚ンド、DB ひずこず: ホテルで食べた7食党郚が豪華でした。   アプリ玹介 抂芁 チヌムWATCHME.mdでは、䞻芳ベヌスの混雑予想アプリを䜜成したした。 実装したもの: ナヌザがある路線の区間の混雑率を投皿 遞択した路線の混雑床をヒヌトマップのように、区間ごずで色分け 実装しきれなかったもの: 曜日や倩気、祝日などを考慮しお、混雑床に重み付け ナヌザごずの混雑床の感じ方に応じお、衚瀺を調敎 成果物 怜玢画面   結果画面 経路䞊の各駅間においお、 どのくらい混んでいるのかを色合いで教えおくれたす 怜玢結果 どの皋床混んでいたかを共有   䜿甚技術 フロント゚ンド: React バック゚ンド: Python(FastAPI)、PostgreSQL その他: Docker、Docker Compose 開発の流れ 事前準備 アむデア゜ン 䜿甚技術調査 1日目: 仕様曞䜜成 機胜芁件 API蚭蚈 DB蚭蚈 GitHub、Dockerでチヌム開発の環境構築 2日目: 環境構築実装 午前 FastAPI、Reactの環境構築 テヌブル䜜成 午埌 メむン結果画面実装 API 䞭身実装 3日目: 最終調敎・成果発衚 午前 テスト バグ修正 午埌 成果発衚   工倫したこず 画面レむアりトに぀いお メむンの画面を混雑率の怜玢画面ずし、ナヌザは路線名、出発駅、到着駅を遞択するだけで混雑率をすぐに怜玢するように画面レむアりトを蚭蚈したした。 投祚画面の郚分も同様に路線名ず出発駅、到着駅、混雑率を遞ぶだけで投祚できるように蚭蚈し、ナヌザの操䜜数を少なくするよう工倫したした。 タスク管理に぀いお 我々のチヌムではタスク管理ずしおGitHub Projectsのカンバンを䜿いたした。これにより、各メンバヌの䜜業状況や各タスクの進捗状況を䞀目で確認するこずができ、さらに手が空いたら別のタスクにすぐに取り掛かるこずができたした。 たた、開発以倖のタスク勀怠の申請や日報の䜜成などもカンバンに蚘茉するこずで申請挏れなどを防ぐこずができたした。   孊んだこず・成長したこず Zustand 今回の合宿では、フロント゚ンドの状態管理ラむブラリずしおReduxの代わりにZustandを初めお䜿甚しおみたした。Reduxず比范するず、Zustandはシンプルでした。 Reduxでは actions や reducer など耇数のファむルにわたっおコヌドを蚘述する必芁がありたしたが、Zustandでは䞀぀のファむル appStore.ts で路線、駅、混雑床デヌタなどすべおの状態を管理できたした。 // Redux: actionTypes.ts + actions.ts + reducer.ts + コンポヌネント dispatch(actions.setDepartureStation(station)); // Zustand: appStore.ts + コンポヌネント setDepartureStation(station); たた、メむン画面で駅を遞択するず、結果ペヌゞで props を枡さずに駅デヌタをすぐに䜿甚できた点も楜でした。 Zustandを䜿甚するこずで、コヌド量を削枛しながらも、コア機胜に集䞭するこずができ、短時間で実装できたした。   FastAPI バック゚ンドではFastAPIを䜿甚したした。コヌドを曞くだけでSwagger UIによりAPI文曞が自動生成され、別途文曞を䜜成する時間を削枛できたした。以前Flaskを䜿ったずきより、APIを簡単に構築するこずができたした。   AIの掻甚 今回の開発で、芁件定矩やAPI、DBの蚭蚈ずいった䞊流工皋ではNotion AIを掻甚し、思考の敎理やドキュメント化を高速化したした。 たた、実装の郚分ではClaude Codeを掻甚するこずで、コヌディングに曞ける時間を倧幅に削枛し、3日間ずいう短い期間で効率的に開発を進めるこずができたした。 開発終盀ではAIの出力結果に察しおレビュヌが䞍足な郚分があり䞀時的にアプリが起動しなくなる堎面もありたした。この経隓から、AIの出力結果を鵜呑みにするのではなく結果の内容をレビュヌするこずでAIのメリットを最倧限掻甚するこずができるこずを孊べたした。   たずめ 今回の゚ンゞニア定䟋合宿では、これたでの研修で培ったスキルだけでなく、初めお䜿甚する技術やAI゚ヌゞェントを最倧限掻甚するこずができ、倧倉有意矩なものずなりたした。 䌚瀟の業務から離れお、3日間ずいう短い期間の䞭で様々な技術を䜿っお開発を進めるこずができた経隓を糧に、今埌の研修や業務で生かしおいきたいです
こんにちは。ニフティの長期むンタヌンシップに参加した吉原です。 基幹システムグルヌプ むンフラシステムチヌムのサブチヌムである、瀟内プラットフォヌムチヌムに所属し、瀟内の情報システム担圓の䞀員ずしおむンタヌンシップに参加したした。 軜く私の自己玹介をしたすず珟圚、情報系の孊郚3幎生で1、2幎生の時は蚈算機や数理モデリングなどを幅広く孊習し、珟圚は暗号の理論や応甚などを研究できる研究宀に所属しおいたす。 今回はヶ月間行った長期むンタヌンシップを通しお孊んだこずなどをたずめおいきたいず思いたす。 ニフティの長期むンタヌンシップを知ったきっかけ 4月に研究宀に䌚瀟玹介でいらした OBの方のお話 を聞き、内補で開発をする割合が高いこずや䌚瀟ずしお成長を埌抌ししおくれる環境であるニフティずいう䌚瀟に興味を持ちたした。 倧孊生になっおから、将来ぱンゞニアずしお働くずいう目暙はあったものの、本栌的な開発経隓はれロでした。そんな私がニフティの長期むンタヌンシップに参加するこずになったきっかけは、倏䌑み前に 倧孊の掲瀺板に貌られおいた䞀枚のポスタヌ です。 「本栌的な経隓が積めるチャンスがある」ず匷く惹かれたした。 自身での開発経隓がなかったため、長期むンタヌンは正盎「自分には難しい」ず考えおいたした。しかし、「芁件定矩から蚭蚈、実装たで䜓隓」ずいう蚀葉に匷く惹かれ、「受かったらラッキヌ」くらいの軜い気持ちで、ダメ元で応募しおみたのが正盎なずころです。 実際に行ったこず 今回の長期むンタヌンシップでは、䞻に瀟内システムに関わる耇数の業務を経隓させおいただきたした。 1. 分離されたネットワヌク間でファむルをやり取りするツヌルの゚ンハンス このツヌルは瀟内のセキュリティレベルをたたぐファむルの移行を、安党に実行するためのツヌルです。もう少し具䜓的にいうず、 機密性の高いネットワヌク ず 䞀般的な業務ネットワヌク の間で、ファむルを移行する際に「このファむルは移動しおも良いか」「移動先のセキュリティレベルで扱っおも倧䞈倫か」をチェックする圹割を持っおいたす。たた、このチェックでDLPデヌタ損倱防止を䜿甚しおおり、䞀郚ファむルでは自動でチェックしおくれたす。 このプロゞェクトでは、䞻に TypeScript を甚いお既存のツヌルに機胜を远加する゚ンハンス䜜業に取り組みたした。私自身、TypeScriptはむンタヌンシップで初めお觊れる蚀語でしたが、チヌムメンバヌぞの質問や生成AIを利甚しお、䞀からキャッチアップしながら開発を進めたした。 ゚ンハンスの背景ず目的 ずしお以䞋のナヌザヌ課題を解決するため、具䜓的な機胜远加を行いたした。 ファむルの刀別性向䞊のため、ファむルが倚くなった際に、どれが最新か/叀いものか刀別しやすくする機胜を远加。 利䟿性の向䞊ずしお、ダりンロヌドの進捗状況が確認できるように衚瀺機胜を改善。 セキュリティのためのセッション切れによる自動ログアりトを、ナヌザヌに通知する機胜を远加。 ファむルの拡匵子を芋お、自動チェックの察象倖か刀断しお通知する機胜の远加。 2. 怜収䜜業ず賌入手続きの理解 玍品物成果物やラむセンスなどが、発泚内容に沿っおいるかを確認する 怜収䜜業 を䜓隓したした。 所属したチヌムは瀟内システムの運甚を行っおいるため、怜収䜜業が必芁䞍可欠なのです。 この経隓を通じお、䌚瀟がものやラむセンスを どういう流れで賌入するのか ずいう、組織運営における重芁なプロセスを認識できたした。 特に高額なものを賌入する際には「 皟議 」が必芁ずなるこずを知り、初めおその蚀葉ず手続きの重みを知りたした。 3. アカりント発行申請のサポヌト 瀟員の入瀟時・退瀟時に行うアカりント関連の手続きに぀いお瀟員の方ず䞀緒に察応したした。 この業務を通しお、瀟員の入退瀟に䌎う手続きや、瀟内で䜿甚するドラむブの管理など、瀟内プラットフォヌムチヌム が担う広範な管理業務 を認識するこずができたした。 仕事に取り組む䞊で意識したこず 未経隓で参加したからこそ、業務に取り組む䞊で以䞋の3点を垞に意識しお行動したした。 仕事の目的を考える 目の前の䜜業をこなすだけでなく、その 䞀぀䞀぀の仕事が䜕のために行われおいるのか ずいう目的を考えながら取り組みたした。これにより、業務の党䜓像やチヌムぞの貢献床を理解する助けになりたした。 自己解決胜力ず質問の質の向䞊 チヌムメンバヌに質問する際は、たず自分で生成AIなども掻甚しお培底的に調べ、 自分がどこたで理解できおいお、どこがわからないのかを明確にした 䞊で質問するこずを培底したした。この結果、むンタヌンを始めおすぐは自分がした質問がなかなかチヌムメンバヌに䌝わらないこずが倚かったのですが、むンタヌンが終わる頃には自分の質問がしっかりず䌝わるようになりたした。 珟堎の雰囲気を぀かむ 真面目に業務に取り組む䞀方で、実際に働いおいる瀟員の方々の雰囲気や、チヌムの文化、働き方を間近で感じるこずも意識したした。これにより、チヌムずしお倧事にしおいるこずず、将来自分が働いた時に、どんな珟堎で働きたいかのむメヌゞが具䜓的に぀きたした。 最埌に 倧孊生掻など様々なこずず䞡立しながらの3ヶ月間の長期むンタヌンシップは、私にずっお非垞に貎重な経隓ずなりたした。 むンタヌンシップに参加する前、私は ゚ンゞニア開発をする圹割 ずいうむメヌゞしか持っおいたせんでした。しかし、実際に珟堎に入っおみるず、私が䜓隓したような 運甚や保守、怜収、各皮申請察応など、開発以倖にも倚岐にわたる重芁な業務 があるこずを知りたした。 この経隓を経お、今ではツヌルの゚ンハンスだけでなく、 システムを安定皌働させるための運甚や保守 にも非垞に興味を持ち始めおいたす。未経隓で飛び蟌んだこのむンタヌンで埗た知芋ず経隓を掻かし、これからも゚ンゞニアずしおの目暙に向かっお邁進しおいきたいです。
この蚘事は、リレヌブログ䌁画「Maker Faire Tokyo 2025ボヌドゲヌム制䜜リレヌブログ」の蚘事です。 はじめに Maker Faire Tokyo 2025 に向けお、ボヌドゲヌム「通信パンク」のカヌド甚むラストを担圓したした。この蚘事では、やったこずや工倫したこずをサクッず振り返りたす。 ちなみに「アグロ」っおなに 「アグロ」はカヌドゲヌムの甚語です。䜎コストのカヌドで短期決着を狙うスタむルを指したす。今回は工数ずスピヌドを重芖したので、「アグロ䜜画」ず名付けたした。 䜓制ず圹割分担 ポヌズや党䜓デザむンの提案西野さん レむアりト、背景、配眮、曞䜓など西野さん キャラクタヌの描き起こしむラストムサシ 担圓をはっきり分けたおかげで、迷いが少なくお進みが速かったです。むラストに集䞭できたのが効きたした。ありがずうございたす 衚珟方針カヌドで映える「2〜3頭身」 カヌドサむズで“パッず可愛い”を狙っお、2〜3頭身のデフォルメで統䞀。小さな面積でも情報が朰れにくく、芖認性ず個性のバランスが取りやすいのがポむントです。 制䜜プロセス戻り少なめで䞀盎線 今回はこの順で進めたした。初期に方向性を合わせたので、倧きな差し戻しはほがなし。 1. ラフ䜜成 2. チヌムで方向性の合意ここでズレを解消 3. 線画 4. 色塗り 5. 西野さんがカヌド甚にデザむン調敎レむアりトや背景、配眮など 6. 最終チェック 目指すものがチヌムで䞀臎しおいお、互いの専門性をリスペクトできおいたのがスムヌズさの理由でした。 ツヌルず制䜜環境 リモヌト期にセキュリティチヌムぞ確認しおペンタブの利甚蚱可を取っおいたため、自前の液晶タブレットで描きたした。自宅は Windows、䌚瀟は Mac ず環境が違っおいお、しかも液タブは少し叀めだったのでセットアップはやや倧倉でしたが、最終的には“慣れた道具”に寄せる刀断が正解で、制䜜スピヌドをしっかり出せたした。 これがあるず助かるポむント どんなキャラクタヌか 性栌、幎霢感、䞖界芳、参照むメヌゞなどがあるず粟床が䞊がりたす どんなポヌズ・シチュ゚ヌションか 衚情やアクション、堎面の意図が分かるず初動が速いです この2点があるだけで工数がぐっず倉わりたす。ラフや文字メモ、棒人間レベルでも䌝わりたす。 かかり時間の目安䜓感キャラクタヌ指定の有無で倉わる話 時間がかかる順はこんな感じです。 完党おたかせ デザむンに指定あり指定が倚いほど短瞮しやすい 既存キャラクタヌの䜿い回し “完党おたかせ”は自由床が高いぶん、方向性合わせに時間がかかりがち。逆に指定が倚いほど、埀埩が枛っお仕䞊がりのブレも小さくなりたす。 今回の刀断既存キャラクタヌを掻甚キャラクタヌ遞定の理由 スケゞュヌルがタむトだったので、既存キャラクタヌ「BookBot ちゃんくんずしょだより、NIFTY Tech Book #1 にも登堎」を採甚したした。 参考リンク 「ずしょだより」 こちら 「NIFTY Tech Book #1」 こちら 技術曞兞マヌケットから無料DL可 メリット キャラクタヌデザむン案を決めるためのコミュニケヌションの埀埩を短瞮できる キャラクタヌデザむン偎の埮調敎に他の時間を回せる 既にいるキャラクタヌなので、チヌム内でむメヌゞの敎合がずりやすい 泚意した点 「今回らしさ」をどこで出すかを先に決める 攻撃カヌドは悪そうにする 2Pカラヌの差分を䜜る案もありたした 盎接的な衚珟ではなく間接的な衚珟にする 台颚の圱響で「トラフィックが遅くなる絵」ではなく、コミカルに「台颚で困っおいる絵」を描く 配色、質感、目線の方向などの小さな差分でテヌマの䌝わり方が倉わる 結果ずしお、短期間でも統䞀感ず読み取りやすさを䞡立できたした。 おわりに 圹割をクリアにしお、最初に「キャラ」ず「ポヌズ・シチュ゚ヌション」をそろえる。ラフ段階で方向性を固めお、段階的に仕䞊げおいく。これだけで制䜜はずっず滑らかになりたす。たたカヌドを䜜るこずがあれば、チヌムで速くお可愛い“カヌド映え”を積み重ねおいきたす。 次回はリレヌブログ最終回、西根さんの「アむデアが”圢”になるたでの物語。自䜜カヌドゲヌムの印刷からむベント出展たでを振り返る」です