{"id":1282,"date":"2025-03-24T08:52:26","date_gmt":"2025-03-23T23:52:26","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=1282"},"modified":"2025-03-24T08:52:26","modified_gmt":"2025-03-23T23:52:26","slug":"%e3%80%90%e4%bf%9d%e5%ad%98%e7%89%88%e3%80%91ruby%e3%81%ae%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e6%93%8d%e4%bd%9c%e5%ae%8c%e5%85%a8%e3%82%ac%e3%82%a4%e3%83%89%ef%bc%9a%e5%9f%ba%e6%9c%ac%e3%81%8b","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=1282","title":{"rendered":"\u3010\u4fdd\u5b58\u7248\u3011Ruby\u306e\u30d5\u30a1\u30a4\u30eb\u64cd\u4f5c\u5b8c\u5168\u30ac\u30a4\u30c9\uff1a\u57fa\u672c\u304b\u3089\u5b9f\u8df5\u307e\u306715\u306e\u91cd\u8981\u30c6\u30af\u30cb\u30c3\u30af"},"content":{"rendered":"\n<div class=\"toc\"><br \/>\n<b>Warning<\/b>:  Undefined array key \"is_admin\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>116<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_category_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>121<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>128<\/b><br \/>\n    <div id=\"toc_container\" class=\"sgb-toc--bullets js-smooth-scroll\" data-dialog-title=\"\u76ee\u6b21\">\n      <p class=\"toc_title\">\u76ee\u6b21 <\/p>\n      <ul class=\"toc_list\">  <li class=\"first\">    <a href=\"#i-0\">Ruby\u306e\u30d5\u30a1\u30a4\u30eb\u64cd\u4f5c\u306e\u57fa\u790e\u77e5\u8b58<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-1\">\u30d5\u30a1\u30a4\u30eb\u64cd\u4f5c\u306e\u91cd\u8981\u6027\u3068Ruby\u306e\u7279\u5fb4\u7684\u306a\u6a5f\u80fd<\/a>      <\/li>      <li>        <a href=\"#i-2\">\u30d5\u30a1\u30a4\u30eb\u30fbIO\u30fb\u30d1\u30b9\u540d\u30af\u30e9\u30b9\u306e\u9055\u3044\u3068\u4f7f\u3044\u65b9<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-3\">Ruby \u306b\u304a\u3051\u308b\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9\u306e\u6271\u3044\u65b9<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-4\">\u57fa\u672c\u7684\u306a\u30d5\u30a1\u30a4\u30eb\u64cd\u4f5c\u30c6\u30af\u30cb\u30c3\u30af<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-5\">\u30d5\u30a1\u30a4\u30eb\u306e\u8aad\u307f\u8fbc\u307f\u7684\u306a\u65b9\u6cd5\u3092\u4f7f\u3046<\/a>      <\/li>      <li>        <a href=\"#i-6\">\u52b9\u7387\u7684\u306a\u30d5\u30a1\u30a4\u30eb\u66f8\u304d\u8fbc\u307f\u306e\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-7\">\u30d5\u30a1\u30a4\u30eb\u306e\u5b58\u5728\u78ba\u8a8d\u3068\u30d7\u30ed\u30d1\u30c6\u30a3\u7684\u306a\u53d6\u5f97<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-8\">\u5b89\u5168\u3067\u52b9\u7387\u7684\u306a\u30d5\u30a1\u30a4\u30eb\u64cd\u4f5c\u306e\u5b9f\u8df5<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-9\">\u9069\u5207\u306a\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u306e\u5b9f\u88c5<\/a>      <\/li>      <li>        <a href=\"#i-10\">\u5927\u5bb9\u91cf\u30d5\u30a1\u30a4\u30eb\u3092\u6271\u3046\u969b\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-11\">\u30d5\u30a1\u30a4\u30eb\u64cd\u4f5c\u6642\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-12\">\u30d5\u30a1\u30a4\u30eb\u64cd\u4f5c\u306e\u5fdc\u7528\u30c6\u30af\u30cb\u30c3\u30af<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-13\">CSV \u30d5\u30a1\u30a4\u30eb\u306e\u52b9\u7387\u7684\u306a\u51e6\u7406\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-14\">\u4e00\u6642\u30d5\u30a1\u30a4\u30eb\u3068\u81ea\u52d5\u524a\u9664\u306e\u6d3b\u7528<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-15\">\u30d5\u30a1\u30a4\u30eb\u5909\u66f4\u306e\u76e3\u8996\u3068\u81ea\u52d5\u51e6\u7406<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-16\">\u5b9f\u8df5\u7684\u306a\u30e6\u30fc\u30b9\u30b1\u30fc\u30b9\u3068\u5b9f\u88c5\u4f8b<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-17\">\u30ed\u30b0\u30d5\u30a1\u30a4\u30eb\u306e\u81ea\u52d5\u30ed\u30fc\u30c6\u30fc\u30b7\u30e7\u30f3<\/a>      <\/li>      <li>        <a href=\"#i-18\">\u753b\u50cf\u30d5\u30a1\u30a4\u30eb\u306e\u4e00\u62ec\u51e6\u7406\u30b7\u30b9\u30c6\u30e0<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-19\">\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e\u5b89\u5168\u306a\u51e6\u7406<\/a>      <\/li>    <\/ul>  <\/li><\/ul>\n      <a href=\"#\" class=\"sgb-toc-button js-toc-button\" rel=\"nofollow\" data-open-dialog=\"true\"><i class=\"fa fa-list\"><\/i><span class=\"sgb-toc-button__text\">\u76ee\u6b21\u3078<\/span><\/a>\n    <\/div><\/div><h2 class=\"wp-block-heading\" id=\"i-0\">Ruby\u306e\u30d5\u30a1\u30a4\u30eb\u64cd\u4f5c\u306e\u57fa\u790e\u77e5\u8b58<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-1\">\u30d5\u30a1\u30a4\u30eb\u64cd\u4f5c\u306e\u91cd\u8981\u6027\u3068Ruby\u306e\u7279\u5fb4\u7684\u306a\u6a5f\u80fd<\/h3>\n\n\n\n<p>Ruby\u3067\u306e\u30d5\u30a1\u30a4\u30eb\u64cd\u4f5c\u306f\u3001\u591a\u304f\u306e\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u958b\u767a\u3067\u5fc5\u8981\u4e0d\u53ef\u6b20\u306a\u8981\u7d20\u3067\u3059\u3002\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e\u8aad\u307f\u8fbc\u307f\u3001\u30ed\u30b0\u306e\u51fa\u529b\u3001\u30c7\u30fc\u30bf\u306e\u6c38\u7d9a\u5316\u306a\u3069\u3001\u69d8\u3005\u306a\u5834\u9762\u3067\u6d3b\u7528\u3055\u308c\u307e\u3059\u3002Ruby\u306f\u4ee5\u4e0b\u306e\u7279\u5fb4\u7684\u306a\u6a5f\u80fd\u306b\u3088\u308a\u3001\u76f4\u611f\u7684\u3067\u52b9\u7387\u7684\u306a\u30d5\u30a1\u30a4\u30eb\u64cd\u4f5c\u3092\u5b9f\u73fe\u3057\u3066\u3044\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30b7\u30f3\u30d7\u30eb\u306a\u69cb\u6587<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u57fa\u672c\u7684\u306a\u8aad\u307f\u66f8\u304d\u304c\u6570\u884c\u3067\u5b9f\u88c5\u53ef\u80fd<\/li>\n\n\n\n<li>\u30e1\u30bd\u30c3\u30c9\u30c1\u30a7\u30fc\u30f3\u306b\u3088\u308b\u7c21\u6f54\u306a\u8a18\u8ff0<\/li>\n\n\n\n<li>\u30d6\u30ed\u30c3\u30af\u69cb\u6587\u306b\u3088\u308b\u81ea\u52d5\u7684\u306a\u30d5\u30a1\u30a4\u30eb\u30af\u30ed\u30fc\u30ba<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u8c4a\u5bcc\u306a\u7d44\u307f\u8fbc\u307f\u30e1\u30bd\u30c3\u30c9<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>File\/IO\/Dir\/PathName\u30af\u30e9\u30b9\u306b\u3088\u308b\u591a\u5f69\u306a\u6a5f\u80fd<\/li>\n\n\n\n<li>\u30a8\u30f3\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u51e6\u7406\u306e\u5145\u5b9f<\/li>\n\n\n\n<li>\u9ad8\u5ea6\u306a\u4f8b\u5916\u51e6\u7406\u306e\u30b5\u30dd\u30fc\u30c8<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30af\u30ed\u30b9\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u5bfe\u5fdc<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Windows\/Linux\/macOS\u9593\u306e\u4e92\u63db\u6027<\/li>\n\n\n\n<li>\u30d1\u30b9\u533a\u5207\u308a\u6587\u5b57\u306e\u81ea\u52d5\u5909\u63db<\/li>\n\n\n\n<li>\u6539\u884c\u30b3\u30fc\u30c9\u306e\u9069\u5207\u306a\u51e6\u7406<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-2\">\u30d5\u30a1\u30a4\u30eb\u30fbIO\u30fb\u30d1\u30b9\u540d\u30af\u30e9\u30b9\u306e\u9055\u3044\u3068\u4f7f\u3044\u65b9<\/h3>\n\n\n\n<p>Ruby\u306b\u306f\u4e3b\u306b3\u3064\u306e\u30d5\u30a1\u30a4\u30eb\u64cd\u4f5c\u95a2\u9023\u30af\u30e9\u30b9\u304c\u3042\u308a\u3001\u305d\u308c\u305e\u308c\u7570\u306a\u308b\u76ee\u7684\u3067\u4f7f\u7528\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>File\u30af\u30e9\u30b9<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u30d5\u30a1\u30a4\u30eb\u306e\u5b58\u5728\u78ba\u8a8d\nFile.exist?('example.txt')  # =&gt; true\/false\n\n# \u30d5\u30a1\u30a4\u30eb\u306e\u5c5e\u6027\u53d6\u5f97\nFile.size('example.txt')    # =&gt; \u30d5\u30a1\u30a4\u30eb\u30b5\u30a4\u30ba\u3092\u53d6\u5f97\nFile.mtime('example.txt')   # =&gt; \u6700\u7d42\u66f4\u65b0\u65e5\u6642\u3092\u53d6\u5f97\n\n# \u30d1\u30b9\u64cd\u4f5c\nFile.dirname('\/path\/to\/file.txt')   # =&gt; \"\/path\/to\"\nFile.basename('\/path\/to\/file.txt')  # =&gt; \"file.txt\"<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>IO\u30af\u30e9\u30b9<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u57fa\u672c\u7684\u306a\u8aad\u307f\u66f8\u304d\nIO.read('input.txt')        # \u30d5\u30a1\u30a4\u30eb\u5168\u4f53\u3092\u4e00\u5ea6\u306b\u8aad\u307f\u8fbc\u307f\nIO.write('output.txt', '\u30c7\u30fc\u30bf')  # \u30d5\u30a1\u30a4\u30eb\u306b\u66f8\u304d\u8fbc\u307f\n\n# \u30b9\u30c8\u30ea\u30fc\u30e0\u51e6\u7406\nIO.foreach('large.txt') do |line|\n  # 1\u884c\u305a\u3064\u51e6\u7406\nend<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>PathName\u30af\u30e9\u30b9<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">require 'pathname'\n\npath = Pathname.new('\/path\/to\/file.txt')\npath.directory?  # \u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u304b\u3069\u3046\u304b\u3092\u78ba\u8a8d\npath.file?       # \u901a\u5e38\u306e\u30d5\u30a1\u30a4\u30eb\u304b\u3069\u3046\u304b\u3092\u78ba\u8a8d\npath.absolute?   # \u7d76\u5bfe\u30d1\u30b9\u304b\u3069\u3046\u304b\u3092\u78ba\u8a8d<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-3\">Ruby \u306b\u304a\u3051\u308b\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9\u306e\u6271\u3044\u65b9<\/h3>\n\n\n\n<p>\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9\u306e\u9069\u5207\u306a\u6271\u3044\u306f\u3001\u30af\u30ed\u30b9\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u5bfe\u5fdc\u3068\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306e\u4e21\u9762\u3067\u91cd\u8981\u3067\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30d1\u30b9\u306e\u7d50\u5408<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u63a8\u5968\u3055\u308c\u308b\u65b9\u6cd5\nFile.join('path', 'to', 'file.txt')  # =&gt; \"path\/to\/file.txt\"\n\n# \u307e\u305f\u306f\nrequire 'pathname'\nPathname.new('path').join('to', 'file.txt')<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u76f8\u5bfe\u30d1\u30b9\u3068\u7d76\u5bfe\u30d1\u30b9<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u30ab\u30ec\u30f3\u30c8\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u304b\u3089\u306e\u76f8\u5bfe\u30d1\u30b9\n.\/file.txt\n..\/other\/file.txt\n\n# \u7d76\u5bfe\u30d1\u30b9\n\/home\/user\/file.txt\nC:\/Users\/file.txt  # Windows\u74b0\u5883<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30d1\u30b9\u306e\u6b63\u898f\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">require 'pathname'\n\npath = Pathname.new('..\/path\/.\/to\/..\/file.txt')\npath.cleanpath  # \u4f59\u5206\u306a.\u3084..\u3092\u89e3\u6c7a\npath.realpath   # \u30b7\u30f3\u30dc\u30ea\u30c3\u30af\u30ea\u30f3\u30af\u3092\u89e3\u6c7a\u3057\u7d76\u5bfe\u30d1\u30b9\u306b<\/pre>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li><strong>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u8003\u616e\u4e8b\u9805<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u60aa\u610f\u306e\u3042\u308b\u30d1\u30b9\u64cd\u4f5c\u3092\u9632\u3050\ndef safe_path(base_dir, user_input)\n  path = File.expand_path(user_input, base_dir)\n  return nil unless path.start_with?(base_dir)\n  path\nend<\/pre>\n\n\n\n<p>\u4ee5\u4e0a\u306e\u57fa\u790e\u77e5\u8b58\u3092\u8e0f\u307e\u3048\u308b\u3053\u3068\u3067\u3001Ruby\u3067\u306e\u5b89\u5168\u3067\u52b9\u7387\u7684\u306a\u30d5\u30a1\u30a4\u30eb\u64cd\u4f5c\u306e\u571f\u53f0\u304c\u7bc9\u3051\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3053\u308c\u3089\u306e\u77e5\u8b58\u3092\u6d3b\u7528\u3057\u305f\u5177\u4f53\u7684\u306a\u64cd\u4f5c\u30c6\u30af\u30cb\u30c3\u30af\u3092\u898b\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-4\">\u57fa\u672c\u7684\u306a\u30d5\u30a1\u30a4\u30eb\u64cd\u4f5c\u30c6\u30af\u30cb\u30c3\u30af<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-5\">\u30d5\u30a1\u30a4\u30eb\u306e\u8aad\u307f\u8fbc\u307f\u7684\u306a\u65b9\u6cd5\u3092\u4f7f\u3046<\/h3>\n\n\n\n<p>Ruby\u306b\u306f\u69d8\u3005\u306a\u30d5\u30a1\u30a4\u30eb\u8aad\u307f\u8fbc\u307f\u65b9\u6cd5\u304c\u7528\u610f\u3055\u308c\u3066\u304a\u308a\u3001\u7528\u9014\u306b\u5fdc\u3058\u3066\u6700\u9069\u306a\u65b9\u6cd5\u3092\u9078\u629e\u3067\u304d\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30d5\u30a1\u30a4\u30eb\u5168\u4f53\u3092\u4e00\u5ea6\u306b\u8aad\u307f\u8fbc\u3080<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u6587\u5b57\u5217\u3068\u3057\u3066\u8aad\u307f\u8fbc\u307f\ncontent = File.read('input.txt')\n\n# \u884c\u306e\u914d\u5217\u3068\u3057\u3066\u8aad\u307f\u8fbc\u307f\nlines = File.readlines('input.txt')\nlines.each { |line| puts line }\n\n# \u30a8\u30f3\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u3092\u6307\u5b9a\u3057\u3066\u8aad\u307f\u8fbc\u307f\ncontent = File.read('input.txt', encoding: 'UTF-8')<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30e1\u30e2\u30ea\u52b9\u7387\u306e\u826f\u3044\u9010\u6b21\u8aad\u307f\u8fbc\u307f<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># each_line\u306b\u3088\u308b1\u884c\u305a\u3064\u306e\u8aad\u307f\u8fbc\u307f\nFile.open('large.txt', 'r') do |file|\n  file.each_line do |line|\n    # 1\u884c\u305a\u3064\u51e6\u7406\n    process_line(line)\n  end\nend\n\n# \u30c1\u30e3\u30f3\u30af\u30b5\u30a4\u30ba\u3092\u6307\u5b9a\u3057\u305f\u8aad\u307f\u8fbc\u307f\nFile.open('large.txt', 'r') do |file|\n  while chunk = file.read(1024)  # 1KB\u305a\u3064\u8aad\u307f\u8fbc\u307f\n    # \u30c1\u30e3\u30f3\u30af\u3092\u51e6\u7406\n    process_chunk(chunk)\n  end\nend<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u7279\u5b9a\u30d1\u30bf\u30fc\u30f3\u3067\u306e\u8aad\u307f\u8fbc\u307f<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u533a\u5207\u308a\u6587\u5b57\u3092\u6307\u5b9a\u3057\u305f\u8aad\u307f\u8fbc\u307f\nFile.open('data.txt', 'r') do |file|\n  # \u30d1\u30e9\u30b0\u30e9\u30d5\u3054\u3068\u306b\u8aad\u307f\u8fbc\u307f\uff08\u7a7a\u884c\u3067\u533a\u5207\u3089\u308c\u305f\u90e8\u5206\uff09\n  file.each_line('') do |paragraph|\n    process_paragraph(paragraph)\n  end\nend\n\n# \u6b63\u898f\u8868\u73fe\u30d1\u30bf\u30fc\u30f3\u3067\u306e\u8aad\u307f\u8fbc\u307f\nFile.open('log.txt', 'r') do |file|\n  file.each_line do |line|\n    if line =~ \/ERROR\/\n      handle_error_line(line)\n    end\n  end\nend<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-6\">\u52b9\u7387\u7684\u306a\u30d5\u30a1\u30a4\u30eb\u66f8\u304d\u8fbc\u307f\u306e\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u66f8\u304d\u8fbc\u307f\u64cd\u4f5c\u3082\u76ee\u7684\u306b\u5fdc\u3058\u3066\u8907\u6570\u306e\u65b9\u6cd5\u304c\u3042\u308a\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u57fa\u672c\u7684\u306a\u66f8\u304d\u8fbc\u307f<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u30d5\u30a1\u30a4\u30eb\u5168\u4f53\u3092\u4e00\u5ea6\u306b\u66f8\u304d\u8fbc\u307f\nFile.write('output.txt', 'Hello, World!')\n\n# \u8ffd\u8a18\u30e2\u30fc\u30c9\u3067\u306e\u66f8\u304d\u8fbc\u307f\nFile.write('log.txt', 'New log entry', mode: 'a')\n\n# \u30a8\u30f3\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u3092\u6307\u5b9a\u3057\u305f\u66f8\u304d\u8fbc\u307f\nFile.write('output.txt', '\u3053\u3093\u306b\u3061\u306f', encoding: 'UTF-8')<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30b9\u30c8\u30ea\u30fc\u30e0\u66f8\u304d\u8fbc\u307f<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u30d6\u30ed\u30c3\u30af\u3092\u4f7f\u7528\u3057\u305f\u66f8\u304d\u8fbc\u307f\nFile.open('output.txt', 'w') do |file|\n  file.puts 'First line'\n  file.puts 'Second line'\n  file.write \"No automatic newline\"\n  file.printf(\"%d:%s\\n\", 1, \"formatted\")\nend\n\n# \u30d0\u30c3\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u5236\u5fa1\nFile.open('log.txt', 'w') do |file|\n  file.sync = true  # \u30d0\u30c3\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u7121\u52b9\u5316\n  file.puts 'Immediate write'\nend<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u4e00\u6642\u30d5\u30a1\u30a4\u30eb\u306e\u6d3b\u7528<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">require 'tempfile'\n\nTempfile.create('temp') do |file|\n  file.puts 'Temporary data'\n  file.rewind\n  # \u4e00\u6642\u30d5\u30a1\u30a4\u30eb\u3092\u51e6\u7406\n  process_temp_file(file)\nend  # \u30d6\u30ed\u30c3\u30af\u3092\u629c\u3051\u308b\u3068\u81ea\u52d5\u7684\u306b\u524a\u9664<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-7\">\u30d5\u30a1\u30a4\u30eb\u306e\u5b58\u5728\u78ba\u8a8d\u3068\u30d7\u30ed\u30d1\u30c6\u30a3\u7684\u306a\u53d6\u5f97<\/h3>\n\n\n\n<p>\u30d5\u30a1\u30a4\u30eb\u64cd\u4f5c\u306e\u524d\u5f8c\u3067\u5fc5\u8981\u3068\u306a\u308b\u5404\u7a2e\u30c1\u30a7\u30c3\u30af\u3068\u60c5\u5831\u53d6\u5f97\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u5b58\u5728\u78ba\u8a8d\u3068\u7a2e\u985e\u5224\u5b9a<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u57fa\u672c\u7684\u306a\u5b58\u5728\u78ba\u8a8d\nFile.exist?('file.txt')     # \u30d5\u30a1\u30a4\u30eb\u307e\u305f\u306f\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306e\u5b58\u5728\u78ba\u8a8d\nFile.file?('file.txt')      # \u901a\u5e38\u30d5\u30a1\u30a4\u30eb\u306e\u78ba\u8a8d\nFile.directory?('dir')      # \u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306e\u78ba\u8a8d\nFile.symlink?('link')       # \u30b7\u30f3\u30dc\u30ea\u30c3\u30af\u30ea\u30f3\u30af\u306e\u78ba\u8a8d\n\n# \u30a2\u30af\u30bb\u30b9\u6a29\u306e\u78ba\u8a8d\nFile.readable?('file.txt')  # \u8aad\u307f\u53d6\u308a\u53ef\u80fd\u304b\nFile.writable?('file.txt')  # \u66f8\u304d\u8fbc\u307f\u53ef\u80fd\u304b\nFile.executable?('file.txt')# \u5b9f\u884c\u53ef\u80fd\u304b<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30d5\u30a1\u30a4\u30eb\u60c5\u5831\u306e\u53d6\u5f97<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u30bf\u30a4\u30e0\u30b9\u30bf\u30f3\u30d7\u60c5\u5831\nFile.atime('file.txt')      # \u6700\u7d42\u30a2\u30af\u30bb\u30b9\u6642\u523b\nFile.mtime('file.txt')      # \u6700\u7d42\u66f4\u65b0\u6642\u523b\nFile.ctime('file.txt')      # \u6700\u7d42\u72b6\u614b\u5909\u66f4\u6642\u523b\n\n# \u30b5\u30a4\u30ba\u3068\u6a29\u9650\nFile.size('file.txt')       # \u30d5\u30a1\u30a4\u30eb\u30b5\u30a4\u30ba\uff08\u30d0\u30a4\u30c8\uff09\nFile.stat('file.txt').mode  # \u30d5\u30a1\u30a4\u30eb\u306e\u30d1\u30fc\u30df\u30c3\u30b7\u30e7\u30f3<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30d1\u30b9\u60c5\u5831\u306e\u53d6\u5f97\u3068\u64cd\u4f5c<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u30d1\u30b9\u60c5\u5831\u306e\u5206\u89e3\nFile.dirname('\/path\/to\/file.txt')   # =&gt; \"\/path\/to\"\nFile.basename('\/path\/to\/file.txt')  # =&gt; \"file.txt\"\nFile.extname('\/path\/to\/file.txt')   # =&gt; \".txt\"\n\n# \u7d76\u5bfe\u30d1\u30b9\u306e\u53d6\u5f97\nFile.expand_path('~\/file.txt')      # \u30db\u30fc\u30e0\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u5c55\u958b\nFile.absolute_path('file.txt')      # \u30ab\u30ec\u30f3\u30c8\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u304b\u3089\u306e\u7d76\u5bfe\u30d1\u30b9<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u57fa\u672c\u7684\u306a\u64cd\u4f5c\u3092\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u591a\u304f\u306e\u30d5\u30a1\u30a4\u30eb\u64cd\u4f5c\u30bf\u30b9\u30af\u3092\u52b9\u7387\u7684\u306b\u5b9f\u88c5\u3067\u304d\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3053\u308c\u3089\u306e\u64cd\u4f5c\u3092\u3088\u308a\u5b89\u5168\u3067\u52b9\u7387\u7684\u306b\u884c\u3046\u305f\u3081\u306e\u5b9f\u8df5\u7684\u306a\u30c6\u30af\u30cb\u30c3\u30af\u3092\u898b\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-8\">\u5b89\u5168\u3067\u52b9\u7387\u7684\u306a\u30d5\u30a1\u30a4\u30eb\u64cd\u4f5c\u306e\u5b9f\u8df5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-9\">\u9069\u5207\u306a\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u306e\u5b9f\u88c5<\/h3>\n\n\n\n<p>\u30d5\u30a1\u30a4\u30eb\u64cd\u4f5c\u3067\u306f\u69d8\u3005\u306a\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3059\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u3001\u9069\u5207\u306a\u5bfe\u51e6\u304c\u91cd\u8981\u3067\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u57fa\u672c\u7684\u306a\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">begin\n  File.open('important.txt', 'r') do |file|\n    content = file.read\n    process_content(content)\n  end\nrescue Errno::ENOENT\n  # \u30d5\u30a1\u30a4\u30eb\u304c\u5b58\u5728\u3057\u306a\u3044\u5834\u5408\u306e\u51e6\u7406\n  logger.error \"File not found: important.txt\"\nrescue Errno::EACCES\n  # \u30a2\u30af\u30bb\u30b9\u6a29\u9650\u304c\u306a\u3044\u5834\u5408\u306e\u51e6\u7406\n  logger.error \"Permission denied: important.txt\"\nrescue SystemCallError =&gt; e\n  # \u305d\u306e\u4ed6\u306e\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u30a8\u30e9\u30fc\n  logger.error \"File system error: #{e.message}\"\nrescue StandardError =&gt; e\n  # \u305d\u306e\u4ed6\u306e\u4e88\u671f\u305b\u306c\u30a8\u30e9\u30fc\n  logger.error \"Unexpected error: #{e.message}\"\nensure\n  # \u5fc5\u305a\u5b9f\u884c\u3057\u305f\u3044\u5f8c\u51e6\u7406\n  cleanup_resources\nend<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30ea\u30c8\u30e9\u30a4\u30e1\u30ab\u30cb\u30ba\u30e0\u306e\u5b9f\u88c5<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">def read_with_retry(file_path, max_attempts: 3, wait_seconds: 1)\n  attempts = 0\n  begin\n    File.read(file_path)\n  rescue Errno::EBUSY\n    attempts += 1\n    if attempts &lt; max_attempts\n      sleep(wait_seconds)\n      retry\n    else\n      raise \"Failed to read file after #{max_attempts} attempts\"\n    end\n  end\nend<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30ed\u30c3\u30af\u6a5f\u80fd\u306e\u6d3b\u7528<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">require 'fileutils'\n\ndef safe_write(file_path, content)\n  File.open(file_path, File::RDWR | File::CREAT, 0644) do |file|\n    file.flock(File::LOCK_EX) # \u6392\u4ed6\u30ed\u30c3\u30af\u3092\u53d6\u5f97\n    file.rewind\n    file.write(content)\n    file.flush\n    file.truncate(file.pos)\n  end # \u30ed\u30c3\u30af\u306f\u81ea\u52d5\u7684\u306b\u89e3\u653e\nend<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-10\">\u5927\u5bb9\u91cf\u30d5\u30a1\u30a4\u30eb\u3092\u6271\u3046\u969b\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h3>\n\n\n\n<p>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u3092\u6291\u3048\u306a\u304c\u3089\u5927\u5bb9\u91cf\u30d5\u30a1\u30a4\u30eb\u3092\u52b9\u7387\u7684\u306b\u51e6\u7406\u3059\u308b\u65b9\u6cd5\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30b9\u30c8\u30ea\u30fc\u30e0\u51e6\u7406\u306e\u6d3b\u7528<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u884c\u5358\u4f4d\u306e\u51e6\u7406\ndef process_large_file(file_path)\n  File.open(file_path, 'r') do |file|\n    file.each_line do |line|\n      yield line\n    end\n  end\nend\n\n# \u30c1\u30e3\u30f3\u30af\u5358\u4f4d\u306e\u51e6\u7406\ndef copy_large_file(source_path, target_path, chunk_size: 1024 * 1024)\n  File.open(source_path, 'rb') do |source|\n    File.open(target_path, 'wb') do |target|\n      while chunk = source.read(chunk_size)\n        target.write(chunk)\n      end\n    end\n  end\nend<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30e1\u30e2\u30ea\u30de\u30c3\u30d4\u30f3\u30b0<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">require 'fiddle'\n\ndef memory_mapped_read(file_path)\n  File.open(file_path, 'rb') do |file|\n    size = file.size\n    # \u30e1\u30e2\u30ea\u30de\u30c3\u30d4\u30f3\u30b0\u3092\u4f5c\u6210\n    mapped = file.mmap(nil, size, Fiddle::PROT_READ, Fiddle::MAP_SHARED)\n    begin\n      yield mapped\n    ensure\n      mapped.munmap\n    end\n  end\nend<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u4e26\u5217\u51e6\u7406\u306e\u6d3b\u7528<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">require 'parallel'\n\ndef parallel_process_file(file_path, num_workers: 4)\n  # \u30d5\u30a1\u30a4\u30eb\u3092\u5206\u5272\u3057\u3066\u4e26\u5217\u51e6\u7406\n  chunk_size = File.size(file_path) \/ num_workers\n  Parallel.map(0...num_workers) do |i|\n    start_pos = i * chunk_size\n    File.open(file_path, 'r') do |file|\n      file.seek(start_pos)\n      process_chunk(file.read(chunk_size))\n    end\n  end\nend<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-11\">\u30d5\u30a1\u30a4\u30eb\u64cd\u4f5c\u6642\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56<\/h3>\n\n\n\n<p>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30ea\u30b9\u30af\u3092\u6700\u5c0f\u9650\u306b\u6291\u3048\u308b\u305f\u3081\u306e\u5b9f\u8df5\u7684\u306a\u5bfe\u7b56\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30d1\u30b9\u540d\u306e\u691c\u8a3c<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">def secure_path(base_dir, user_input)\n  # \u30d1\u30b9\u306e\u6b63\u898f\u5316\n  full_path = File.expand_path(user_input, base_dir)\n\n  # \u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30c8\u30e9\u30d0\u30fc\u30b5\u30eb\u5bfe\u7b56\n  unless full_path.start_with?(base_dir)\n    raise \"Invalid path: Access denied\"\n  end\n\n  # \u5b58\u5728\u78ba\u8a8d\n  unless File.exist?(full_path)\n    raise \"File not found: #{user_input}\"\n  end\n\n  full_path\nend<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u4e00\u6642\u30d5\u30a1\u30a4\u30eb\u306e\u5b89\u5168\u306a\u4f7f\u7528<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">require 'tempfile'\nrequire 'securerandom'\n\ndef safe_temp_file\n  temp_dir = File.join(Dir.tmpdir, 'my_app')\n  FileUtils.mkdir_p(temp_dir)\n\n  Tempfile.create([SecureRandom.hex(8), '.tmp'], temp_dir) do |file|\n    file.chmod(0600) # \u8aad\u307f\u66f8\u304d\u6a29\u9650\u3092\u5236\u9650\n    yield file\n  end\nend<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30d5\u30a1\u30a4\u30eb\u306e\u5b89\u5168\u306a\u524a\u9664<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">def secure_delete(file_path)\n  return unless File.exist?(file_path)\n\n  # \u30d5\u30a1\u30a4\u30eb\u3092\u4e0a\u66f8\u304d\u3057\u3066\u5185\u5bb9\u3092\u6d88\u53bb\n  File.open(file_path, 'wb') do |file|\n    # \u30d5\u30a1\u30a4\u30eb\u30b5\u30a4\u30ba\u5206\u306e\u30e9\u30f3\u30c0\u30e0\u30c7\u30fc\u30bf\u3067\u4e0a\u66f8\u304d\n    file.write(SecureRandom.random_bytes(File.size(file_path)))\n    file.flush\n  end\n\n  # \u30d5\u30a1\u30a4\u30eb\u3092\u524a\u9664\n  File.delete(file_path)\nend<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5b9f\u8df5\u7684\u306a\u30c6\u30af\u30cb\u30c3\u30af\u3092\u9069\u5207\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u5b89\u5168\u3067\u52b9\u7387\u7684\u306a\u30d5\u30a1\u30a4\u30eb\u64cd\u4f5c\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3088\u308a\u9ad8\u5ea6\u306a\u5fdc\u7528\u30c6\u30af\u30cb\u30c3\u30af\u3092\u898b\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-12\">\u30d5\u30a1\u30a4\u30eb\u64cd\u4f5c\u306e\u5fdc\u7528\u30c6\u30af\u30cb\u30c3\u30af<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-13\">CSV \u30d5\u30a1\u30a4\u30eb\u306e\u52b9\u7387\u7684\u306a\u51e6\u7406\u65b9\u6cd5<\/h3>\n\n\n\n<p>CSV\u30d5\u30a1\u30a4\u30eb\u306f\u4e00\u822c\u7684\u306a\u30c7\u30fc\u30bf\u5f62\u5f0f\u3067\u3042\u308a\u3001\u52b9\u7387\u7684\u306a\u51e6\u7406\u65b9\u6cd5\u3092\u77e5\u308b\u3053\u3068\u306f\u91cd\u8981\u3067\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u6a19\u6e96CSV\u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u6d3b\u7528<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">require 'csv'\n\n# CSV\u30d5\u30a1\u30a4\u30eb\u306e\u8aad\u307f\u8fbc\u307f\ndef read_csv_with_headers(file_path)\n  CSV.foreach(file_path, headers: true) do |row|\n    # \u30d8\u30c3\u30c0\u30fc\u4ed8\u304dCSV\u30921\u884c\u305a\u3064\u51e6\u7406\n    yield row.to_h\n  end\nend\n\n# CSV\u30d5\u30a1\u30a4\u30eb\u306e\u66f8\u304d\u8fbc\u307f\ndef write_csv_with_headers(file_path, headers, data)\n  CSV.open(file_path, 'wb', headers: true) do |csv|\n    csv &lt;&lt; headers\n    data.each { |row| csv &lt;&lt; row }\n  end\nend\n\n# \u5927\u898f\u6a21CSV\u30d5\u30a1\u30a4\u30eb\u306e\u5909\u63db\u51e6\u7406\u4f8b\ndef transform_large_csv(input_path, output_path)\n  headers = ['id', 'name', 'transformed_value']\n\n  CSV.open(output_path, 'wb', headers: true) do |output_csv|\n    output_csv &lt;&lt; headers\n\n    CSV.foreach(input_path, headers: true) do |row|\n      # \u5fc5\u8981\u306a\u30c7\u30fc\u30bf\u5909\u63db\u3092\u884c\u3046\n      transformed_row = [\n        row['id'],\n        row['name'],\n        transform_value(row['value'])\n      ]\n      output_csv &lt;&lt; transformed_row\n    end\n  end\nend<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">require 'csv'\nrequire 'parallel'\n\n# \u4e26\u5217\u51e6\u7406\u3092\u6d3b\u7528\u3057\u305fCSV\u51e6\u7406\ndef parallel_csv_processing(input_path, chunk_size: 1000)\n  headers = CSV.read(input_path, headers: true).headers\n  total_lines = `wc -l \"#{input_path}\"`.to_i - 1  # \u30d8\u30c3\u30c0\u30fc\u3092\u9664\u304f\n\n  Parallel.map(0...(total_lines.fdiv(chunk_size).ceil)) do |i|\n    start_line = i * chunk_size + 1  # \u30d8\u30c3\u30c0\u30fc\u3092\u30b9\u30ad\u30c3\u30d7\n\n    chunk_data = CSV.read(input_path, headers: true, skip_lines: start_line - 1, limit: chunk_size)\n    process_chunk(chunk_data)\n  end\nend\n\n# \u30b9\u30c8\u30ea\u30fc\u30df\u30f3\u30b0\u51e6\u7406\u306b\u3088\u308b\u30e1\u30e2\u30ea\u52b9\u7387\u306e\u6539\u5584\ndef stream_csv_processing(input_path)\n  require 'stringio'\n\n  File.open(input_path, 'r') do |file|\n    buffer = StringIO.new\n    file.each_line do |line|\n      buffer.puts(line)\n\n      if buffer.size &gt; 10_000  # \u30d0\u30c3\u30d5\u30a1\u30b5\u30a4\u30ba\u306e\u95be\u5024\n        process_csv_chunk(buffer.string)\n        buffer.reopen\n      end\n    end\n\n    # \u6b8b\u308a\u306e\u30c7\u30fc\u30bf\u3092\u51e6\u7406\n    process_csv_chunk(buffer.string) unless buffer.size.zero?\n  end\nend<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-14\">\u4e00\u6642\u30d5\u30a1\u30a4\u30eb\u3068\u81ea\u52d5\u524a\u9664\u306e\u6d3b\u7528<\/h3>\n\n\n\n<p>\u4e00\u6642\u30d5\u30a1\u30a4\u30eb\u3092\u4f7f\u7528\u3057\u305f\u5b89\u5168\u306a\u30d5\u30a1\u30a4\u30eb\u64cd\u4f5c\u306e\u5b9f\u88c5\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u57fa\u672c\u7684\u306a\u4e00\u6642\u30d5\u30a1\u30a4\u30eb\u64cd\u4f5c<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">require 'tempfile'\nrequire 'fileutils'\n\n# \u4e00\u6642\u30d5\u30a1\u30a4\u30eb\u3092\u4f7f\u7528\u3057\u305f\u5b89\u5168\u306a\u66f4\u65b0\ndef safe_file_update(file_path)\n  temp_file = Tempfile.new(['update', File.extname(file_path)])\n  begin\n    # \u4e00\u6642\u30d5\u30a1\u30a4\u30eb\u306b\u65b0\u3057\u3044\u5185\u5bb9\u3092\u66f8\u304d\u8fbc\u307f\n    yield temp_file\n\n    temp_file.close\n    # \u53e4\u3044\u30d5\u30a1\u30a4\u30eb\u3092\u65b0\u3057\u3044\u30d5\u30a1\u30a4\u30eb\u3067\u7f6e\u304d\u63db\u3048\n    FileUtils.mv(temp_file.path, file_path)\n  ensure\n    # \u4e00\u6642\u30d5\u30a1\u30a4\u30eb\u306e\u78ba\u5b9f\u306a\u524a\u9664\n    temp_file.close\n    temp_file.unlink\n  end\nend\n\n# \u4e00\u6642\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306e\u6d3b\u7528\ndef with_temp_dir\n  require 'tmpdir'\n\n  Dir.mktmpdir do |dir|\n    yield dir\n  end # \u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306f\u81ea\u52d5\u7684\u306b\u524a\u9664\u3055\u308c\u308b\nend<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u3068\u5fa9\u5143\u6a5f\u80fd<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u30d5\u30a1\u30a4\u30eb\u306e\u81ea\u52d5\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\ndef with_backup(file_path)\n  backup_path = \"#{file_path}.bak\"\n  FileUtils.cp(file_path, backup_path)\n\n  begin\n    yield\n  rescue\n    # \u30a8\u30e9\u30fc\u6642\u306f\u5143\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u5fa9\u5143\n    FileUtils.mv(backup_path, file_path)\n    raise\n  ensure\n    File.delete(backup_path) if File.exist?(backup_path)\n  end\nend<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-15\">\u30d5\u30a1\u30a4\u30eb\u5909\u66f4\u306e\u76e3\u8996\u3068\u81ea\u52d5\u51e6\u7406<\/h3>\n\n\n\n<p>\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u306e\u5909\u66f4\u3092\u76e3\u8996\u3057\u3001\u81ea\u52d5\u7684\u306b\u51e6\u7406\u3092\u884c\u3046\u5b9f\u88c5\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u57fa\u672c\u7684\u306a\u30d5\u30a1\u30a4\u30eb\u76e3\u8996<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">require 'filewatcher'\n\n# \u7279\u5b9a\u306e\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306e\u76e3\u8996\ndef watch_directory(directory_path, pattern: '*.rb')\n  FileWatcher.new([\"#{directory_path}\/#{pattern}\"]).watch do |filename, event|\n    case event\n    when :created\n      handle_new_file(filename)\n    when :updated\n      handle_updated_file(filename)\n    when :deleted\n      handle_deleted_file(filename)\n    end\n  end\nend\n\n# \u5909\u66f4\u691c\u77e5\u306e\u30ab\u30b9\u30bf\u30e0\u5b9f\u88c5\ndef monitor_file_changes(file_path, interval: 1)\n  last_mtime = File.mtime(file_path)\n\n  loop do\n    current_mtime = File.mtime(file_path)\n\n    if current_mtime &gt; last_mtime\n      yield file_path\n      last_mtime = current_mtime\n    end\n\n    sleep interval\n  end\nend<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30a4\u30d9\u30f3\u30c8\u30d9\u30fc\u30b9\u306e\u51e6\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">require 'rb-inotify'\n\n# Linux\u30b7\u30b9\u30c6\u30e0\u3067\u306e\u30d5\u30a1\u30a4\u30eb\u76e3\u8996\ndef monitor_with_inotify(watch_path)\n  notifier = INotify::Notifier.new\n\n  notifier.watch(watch_path, :modify, :create, :delete) do |event|\n    case\n    when event.flags.include?(:create)\n      process_new_file(event.absolute_name)\n    when event.flags.include?(:modify)\n      process_modified_file(event.absolute_name)\n    when event.flags.include?(:delete)\n      process_deleted_file(event.absolute_name)\n    end\n  end\n\n  notifier.run\nend<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30d0\u30c3\u30c1\u51e6\u7406\u3068\u306e\u7d44\u307f\u5408\u308f\u305b<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u5b9a\u671f\u7684\u306a\u30d5\u30a1\u30a4\u30eb\u51e6\u7406\ndef schedule_file_processing(directory_path, interval: 3600)\n  require 'rufus-scheduler'\n\n  scheduler = Rufus::Scheduler.new\n\n  scheduler.every \"#{interval}s\" do\n    Dir.glob(\"#{directory_path}\/**\/*\").each do |file_path|\n      next unless File.file?(file_path)\n\n      if needs_processing?(file_path)\n        process_file(file_path)\n      end\n    end\n  end\n\n  scheduler.join\nend<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5fdc\u7528\u30c6\u30af\u30cb\u30c3\u30af\u3092\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u3088\u308a\u9ad8\u5ea6\u306a\u30d5\u30a1\u30a4\u30eb\u64cd\u4f5c\u30bf\u30b9\u30af\u3092\u52b9\u7387\u7684\u306b\u5b9f\u88c5\u3067\u304d\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3053\u308c\u3089\u306e\u77e5\u8b58\u3092\u6d3b\u7528\u3057\u305f\u5b9f\u8df5\u7684\u306a\u30e6\u30fc\u30b9\u30b1\u30fc\u30b9\u3092\u898b\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-16\">\u5b9f\u8df5\u7684\u306a\u30e6\u30fc\u30b9\u30b1\u30fc\u30b9\u3068\u5b9f\u88c5\u4f8b<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-17\">\u30ed\u30b0\u30d5\u30a1\u30a4\u30eb\u306e\u81ea\u52d5\u30ed\u30fc\u30c6\u30fc\u30b7\u30e7\u30f3<\/h3>\n\n\n\n<p>\u30ed\u30b0\u30d5\u30a1\u30a4\u30eb\u3092\u52b9\u7387\u7684\u306b\u7ba1\u7406\u3059\u308b\u305f\u3081\u306e\u30ed\u30fc\u30c6\u30fc\u30b7\u30e7\u30f3\u6a5f\u80fd\u306e\u5b9f\u88c5\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u57fa\u672c\u7684\u306a\u30ed\u30b0\u30ed\u30fc\u30c6\u30fc\u30b7\u30e7\u30f3<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class LogRotator\n  def initialize(log_path, max_size: 10_485_760, backup_count: 5)\n    @log_path = log_path\n    @max_size = max_size  # 10MB\n    @backup_count = backup_count\n  end\n\n  def rotate_if_needed\n    return unless File.exist?(@log_path)\n    return unless File.size(@log_path) &gt; @max_size\n\n    # \u53e4\u3044\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u30d5\u30a1\u30a4\u30eb\u3092\u30b7\u30d5\u30c8\n    @backup_count.downto(1) do |i|\n      old_name = backup_name(i - 1)\n      new_name = backup_name(i)\n\n      if File.exist?(old_name)\n        File.rename(old_name, new_name)\n      end\n    end\n\n    # \u73fe\u5728\u306e\u30ed\u30b0\u30d5\u30a1\u30a4\u30eb\u3092\u6700\u521d\u306e\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u3068\u3057\u3066\u4fdd\u5b58\n    File.rename(@log_path, backup_name(1))\n\n    # \u65b0\u3057\u3044\u7a7a\u306e\u30ed\u30b0\u30d5\u30a1\u30a4\u30eb\u3092\u4f5c\u6210\n    FileUtils.touch(@log_path)\n    File.chmod(0644, @log_path)\n  end\n\n  private\n\n  def backup_name(index)\n    index.zero? ? @log_path : \"#{@log_path}.#{index}\"\n  end\nend\n\n# \u4f7f\u7528\u4f8b\nrotator = LogRotator.new('\/var\/log\/myapp.log')\nrotator.rotate_if_needed<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u65e5\u4ed8\u30d9\u30fc\u30b9\u306e\u30ed\u30fc\u30c6\u30fc\u30b7\u30e7\u30f3<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class DateBasedLogRotator\n  def initialize(log_dir, prefix: 'app', retention_days: 30)\n    @log_dir = log_dir\n    @prefix = prefix\n    @retention_days = retention_days\n  end\n\n  def current_log_path\n    File.join(@log_dir, \"#{@prefix}_#{Date.today.strftime('%Y%m%d')}.log\")\n  end\n\n  def rotate\n    # \u53e4\u3044\u30ed\u30b0\u30d5\u30a1\u30a4\u30eb\u306e\u524a\u9664\n    Dir.glob(File.join(@log_dir, \"#{@prefix}_*.log\")).each do |log_file|\n      date_str = File.basename(log_file, '.log').split('_').last\n      file_date = Date.strptime(date_str, '%Y%m%d')\n\n      if (Date.today - file_date).to_i &gt; @retention_days\n        File.delete(log_file)\n      end\n    end\n\n    # \u65b0\u3057\u3044\u30ed\u30b0\u30d5\u30a1\u30a4\u30eb\u306e\u4f5c\u6210\uff08\u5fc5\u8981\u306a\u5834\u5408\uff09\n    FileUtils.touch(current_log_path) unless File.exist?(current_log_path)\n  end\nend<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-18\">\u753b\u50cf\u30d5\u30a1\u30a4\u30eb\u306e\u4e00\u62ec\u51e6\u7406\u30b7\u30b9\u30c6\u30e0<\/h3>\n\n\n\n<p>\u5927\u91cf\u306e\u753b\u50cf\u30d5\u30a1\u30a4\u30eb\u3092\u52b9\u7387\u7684\u306b\u51e6\u7406\u3059\u308b\u30b7\u30b9\u30c6\u30e0\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u57fa\u672c\u7684\u306a\u753b\u50cf\u51e6\u7406\u6a5f\u80fd<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">require 'mini_magick'\nrequire 'parallel'\n\nclass ImageProcessor\n  def initialize(input_dir, output_dir)\n    @input_dir = input_dir\n    @output_dir = output_dir\n    FileUtils.mkdir_p(@output_dir)\n  end\n\n  def process_all(max_workers: 4)\n    image_files = Dir.glob(File.join(@input_dir, '*.{jpg,jpeg,png,gif}'))\n\n    Parallel.each(image_files, in_processes: max_workers) do |file_path|\n      process_image(file_path)\n    end\n  end\n\n  private\n\n  def process_image(file_path)\n    image = MiniMagick::Image.open(file_path)\n\n    # \u753b\u50cf\u306e\u6700\u9069\u5316\n    image.strip # \u30e1\u30bf\u30c7\u30fc\u30bf\u306e\u524a\u9664\n    image.quality('85') # \u753b\u8cea\u306e\u6700\u9069\u5316\n    image.resize('1920x1080&gt;') # \u30b5\u30a4\u30ba\u306e\u6700\u9069\u5316\n\n    output_path = File.join(\n      @output_dir, \n      File.basename(file_path, '.*') + '_processed' + File.extname(file_path)\n    )\n\n    image.write(output_path)\n  rescue =&gt; e\n    logger.error \"Failed to process #{file_path}: #{e.message}\"\n  end\nend<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u9032\u6357\u7ba1\u7406\u6a5f\u80fd\u4ed8\u304d\u753b\u50cf\u51e6\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class ImageProcessorWithProgress\n  def initialize(input_dir, output_dir)\n    @input_dir = input_dir\n    @output_dir = output_dir\n    @processed_count = 0\n    @total_count = 0\n    @mutex = Mutex.new\n  end\n\n  def process_with_progress\n    image_files = Dir.glob(File.join(@input_dir, '*.{jpg,jpeg,png,gif}'))\n    @total_count = image_files.size\n\n    Parallel.each(image_files, in_threads: 4) do |file_path|\n      process_single_image(file_path)\n      update_progress\n    end\n  end\n\n  private\n\n  def process_single_image(file_path)\n    # \u753b\u50cf\u51e6\u7406\u30ed\u30b8\u30c3\u30af\n    image = MiniMagick::Image.open(file_path)\n\n    # \u51e6\u7406\u5185\u5bb9\u306b\u5fdc\u3058\u305f\u5909\u63db\u3092\u5b9f\u884c\n    image.combine_options do |cmd|\n      cmd.resize '1920x1080&gt;'\n      cmd.quality '85'\n      cmd.strip\n    end\n\n    output_path = generate_output_path(file_path)\n    image.write(output_path)\n  end\n\n  def update_progress\n    @mutex.synchronize do\n      @processed_count += 1\n      progress = (@processed_count.to_f \/ @total_count * 100).round(2)\n      puts \"Progress: #{progress}% (#{@processed_count}\/#{@total_count})\"\n    end\n  end\nend<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-19\">\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e\u5b89\u5168\u306a\u51e6\u7406<\/h3>\n\n\n\n<p>\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u3092\u5b89\u5168\u306b\u6271\u3046\u305f\u3081\u306e\u5b9f\u88c5\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>YAML\u30d9\u30fc\u30b9\u306e\u8a2d\u5b9a\u7ba1\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">require 'yaml'\nrequire 'erb'\n\nclass ConfigManager\n  class ConfigError &lt; StandardError; end\n\n  def initialize(config_path)\n    @config_path = config_path\n    @config = load_config\n  end\n\n  def get(key, default = nil)\n    keys = key.to_s.split('.')\n    value = keys.reduce(@config) do |acc, k|\n      acc.is_a?(Hash) ? acc[k] : nil\n    end\n    value || default\n  end\n\n  private\n\n  def load_config\n    unless File.exist?(@config_path)\n      raise ConfigError, \"Configuration file not found: #{@config_path}\"\n    end\n\n    content = File.read(@config_path)\n    erb_result = ERB.new(content).result\n    YAML.safe_load(erb_result, permitted_classes: [Date, Time])\n  rescue Psych::SyntaxError =&gt; e\n    raise ConfigError, \"Invalid YAML syntax: #{e.message}\"\n  rescue StandardError =&gt; e\n    raise ConfigError, \"Failed to load config: #{e.message}\"\n  end\nend<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e\u81ea\u52d5\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u3068\u691c\u8a3c<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class SafeConfigUpdater\n  def initialize(config_path)\n    @config_path = config_path\n    @backup_dir = File.join(File.dirname(config_path), 'backups')\n    FileUtils.mkdir_p(@backup_dir)\n  end\n\n  def update_config\n    backup_current_config\n\n    temp_file = Tempfile.new(['config', File.extname(@config_path)])\n    begin\n      # \u65b0\u3057\u3044\u8a2d\u5b9a\u3092\u4e00\u6642\u30d5\u30a1\u30a4\u30eb\u306b\u66f8\u304d\u8fbc\u307f\n      yield temp_file\n\n      # \u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e\u691c\u8a3c\n      validate_config(temp_file.path)\n\n      # \u691c\u8a3c\u304c\u6210\u529f\u3057\u305f\u3089\u672c\u756a\u30d5\u30a1\u30a4\u30eb\u3092\u66f4\u65b0\n      FileUtils.mv(temp_file.path, @config_path)\n    rescue =&gt; e\n      restore_from_backup\n      raise e\n    ensure\n      temp_file.close\n      temp_file.unlink\n    end\n  end\n\n  private\n\n  def backup_current_config\n    return unless File.exist?(@config_path)\n\n    timestamp = Time.now.strftime('%Y%m%d_%H%M%S')\n    backup_path = File.join(@backup_dir, \"config_#{timestamp}.bak\")\n    FileUtils.cp(@config_path, backup_path)\n  end\n\n  def validate_config(config_path)\n    # \u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e\u69cb\u6587\u30c1\u30a7\u30c3\u30af\u3068\u5fc5\u9808\u9805\u76ee\u306e\u78ba\u8a8d\n    config = YAML.safe_load(File.read(config_path))\n    validate_required_keys(config)\n    validate_value_formats(config)\n  end\n\n  def restore_from_backup\n    latest_backup = Dir.glob(File.join(@backup_dir, 'config_*.bak')).max_by { |f| File.mtime(f) }\n    FileUtils.cp(latest_backup, @config_path) if latest_backup\n  end\nend<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5b9f\u88c5\u4f8b\u306f\u3001\u5b9f\u969b\u306e\u696d\u52d9\u3067\u767a\u751f\u3059\u308b\u69d8\u3005\u306a\u30d5\u30a1\u30a4\u30eb\u64cd\u4f5c\u306e\u8981\u4ef6\u306b\u5bfe\u5fdc\u3067\u304d\u308b\u57fa\u790e\u3068\u306a\u308a\u307e\u3059\u3002\u305d\u308c\u305e\u308c\u306e\u30e6\u30fc\u30b9\u30b1\u30fc\u30b9\u306b\u5fdc\u3058\u3066\u3001\u5fc5\u8981\u306a\u6a5f\u80fd\u3092\u7d44\u307f\u5408\u308f\u305b\u305f\u308a\u3001\u62e1\u5f35\u3057\u305f\u308a\u3059\u308b\u3053\u3068\u3067\u3001\u3088\u308a\u5177\u4f53\u7684\u306a\u8981\u4ef6\u306b\u5bfe\u5fdc\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Warning: Undefined array key &#8220;is_admin&#8221; in \/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/ &#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":{"0":"post-1282","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-ruby","7":"nothumb"},"_links":{"self":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/1282","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1282"}],"version-history":[{"count":1,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/1282\/revisions"}],"predecessor-version":[{"id":1284,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/1282\/revisions\/1284"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1282"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1282"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1282"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}