Wikibooks jawikibooks https://ja.wikibooks.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8 MediaWiki 1.39.0-wmf.21 first-letter メディア 特別 トーク 利用者 利用者・トーク Wikibooks Wikibooks・トーク ファイル ファイル・トーク MediaWiki MediaWiki・トーク テンプレート テンプレート・トーク ヘルプ ヘルプ・トーク カテゴリ カテゴリ・トーク Transwiki Transwiki‐ノート TimedText TimedText talk モジュール モジュール・トーク Gadget Gadget talk Gadget definition Gadget definition talk Wikibooks:談話室 4 30 205583 205375 2022-07-20T12:43:57Z VChang (WMF) 69361 /* Announcing the six candidates for the 2022 Board of Trustees election */ 新しい節 wikitext text/x-wiki {{談話室}} ある程度時間のたった議論は[[/過去ログ]]に移動されます。最新の過去ログは [{{fullurl:{{NAMESPACE}}:{{BASEPAGENAME}}|oldid=176963}} 2021年4月15日 (木) 14:30の版] です(確認日: 2021年4月15日)。過去ログ化の方法については[[Wikibooks:過去ログ化のガイドライン]]を参照ください。 {{/告知}} == Moving Wikimania 2021 to a Virtual Event == <div class="mw-content-ltr" lang="en" dir="ltr"> [[File:Wikimania_logo_with_text_2.svg|right|alt=Wikimania's logo.|75px]] ''{{int:Hello}}. Apologies if you are not reading this message in your native language. {{Int:Please-translate}}. {{Int:Feedback-thanks-title}}'' [[:m:Wikimania 2021|Wikimania will be a virtual event this year]], and hosted by a wide group of community members. Whenever the next in-person large gathering is possible again, [[:m:ESEAP Hub|the ESEAP Core Organizing Team]] will be in charge of it. Stay tuned for more information about how ''you'' can get involved in the planning process and other aspects of the event. [https://lists.wikimedia.org/pipermail/wikimedia-l/2021-January/096141.html Please read the longer version of this announcement on wikimedia-l]. ''ESEAP Core Organizing Team, Wikimania Steering Committee, Wikimedia Foundation Events Team'', 2021年1月27日 (水) 15:15 (UTC) </div> <!-- User:Elitre (WMF)@metawiki が https://meta.wikimedia.org/w/index.php?title=User:Elitre_(WMF)/Wikimania21&oldid=21014617 のリストを使用して送信したメッセージ --> == ビデオゲームの攻略本について == 攻略本を解説書として執筆することは許可されているのでしょうか? さっき英語版WIKIBOOKSに「ビデオゲームの執筆の許可」という趣旨のページを見つけました。日本語版ではどうなっているのでしょうか。 == Project Grant Open Call == This is the announcement for the [[m:Grants:Project|Project Grants program]] open call that started on January 11, with the submission deadline of February 10, 2021.<br> This first open call will be focussed on Community Organizing proposals. A second open call focused on research and software proposals is scheduled from February 15 with a submission deadline of March 16, 2021.<br> For the Round 1 open call, we invite you to propose grant applications that fall under community development and organizing (offline and online) categories. Project Grant funds are available to support individuals, groups, and organizations to implement new experiments and proven ideas, from organizing a better process on your wiki, coordinating a campaign or editathon series to providing other support for community building. We offer the following resources to help you plan your project and complete a grant proposal:<br> * Weekly proposals clinics via Zoom during the Open Call. Join us for [[m:Grants:Project|#Upcoming_Proposal_Clinics|real-time discussions]] with Program Officers and select thematic experts and get live feedback about your Project Grants proposal. We’ll answer questions and help you make your proposal better. We also offer these support pages to help you build your proposal: * [[m:Grants:Project/Tutorial|Video tutorials]] for writing a strong application<br> * General [[m:Grants:Project/Plan|planning page]] for Project Grants <br> * [[m:Grants:Project/Learn|Program guidelines and criteria]]<br> Program officers are also available to offer individualized proposal support upon request. Contact us if you would like feedback or more information.<br> We are excited to see your grant ideas that will support our community and make an impact on the future of Wikimedia projects. Put your idea into motion, and [[m:Grants:Project/Apply|submit your proposal]] by February 10, 2021!<br> Please feel free to get in touch with questions about getting started with your grant application, or about serving on the Project Grants Committee. Contact us at projectgrants{{at}}wikimedia.org. Please help us translate this message to your local language. [[利用者:MediaWiki message delivery|MediaWiki message delivery]] ([[利用者・トーク:MediaWiki message delivery|トーク]]) 2021年1月28日 (木) 08:00 (UTC) <!-- User:RSharma (WMF)@metawiki が https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=20808431 のリストを使用して送信したメッセージ --> == Wiki Loves Folklore 2021 is back! == <div lang="en" dir="ltr" class="mw-content-ltr"> {{int:please-translate}} [[File:Wiki Loves Folklore Logo.svg|right|150px|frameless]] You are humbly invited to participate in the '''[[:c:Commons:Wiki Loves Folklore 2021|Wiki Loves Folklore 2021]]''' an international photography contest organized on Wikimedia Commons to document folklore and intangible cultural heritage from different regions, including, folk creative activities and many more. It is held every year from the 1st till the 28th of February. You can help in enriching the folklore documentation on Commons from your region by taking photos, audios, videos, and [https://commons.wikimedia.org/w/index.php?title=Special:UploadWizard&campaign=wlf_2021 submitting] them in this commons contest. Please support us in translating the [[:c:Commons: Wiki Loves Folklore 2021|project page]] and a [https://meta.wikimedia.org/wiki/Special:Translate?group=Centralnotice-tgroup-wikiloveslove2020&language=en&filter=%21translated&action=translate|one-line banner message] to help us spread the word in your native language. '''Kind regards,''' '''Wiki loves Folklore International Team''' [[利用者:MediaWiki message delivery|MediaWiki message delivery]] ([[利用者・トーク:MediaWiki message delivery|トーク]]) 2021年2月6日 (土) 13:25 (UTC) </div> <!-- User:Tiven2240@metawiki が https://meta.wikimedia.org/w/index.php?title=User:Tiven2240/wll&oldid=21073884 のリストを使用して送信したメッセージ --> == Proposal: Set two-letter project shortcuts as alias to project namespace globally == <div lang="en" dir="ltr"> {{int:please-translate}} Hello everyone, I apologize for posting in English. I would like to inform everyone that I created a new global request for comment (GRFC) at Meta Wiki, which may affect your project: [[:m:Requests for comment/Set short project namespace aliases by default globally]]. In this GRFC, I propose that two-project shortcuts for project names will become a default alias for the project namespace. For instance, on all Wikipedias, WP will be an alias to the Wikipedia: namespace (and similar for other projects). Full list is available in the GRFC. This is already the case for Wikivoyages, and many individual projects asked for this alias to be implemented. I believe this makes it easier to access the materials in the project namespace, as well as creating shortcuts like <tt>WP:NPOV</tt>, as well as helps new projects to use this feature, without having to figure out how to request site configuration changes first. As far as I can see, {{SITENAME}} currently does not have such an alias set. This means that such an alias will be set for you, if the GRFC is accepted by the global community. I would like to ask all community members to participate in the request for comment at Meta-Wiki, see [[:m:Requests for comment/Set short project namespace aliases by default globally]]. Please feel free to [[:m:User talk:Martin Urbanec|ask me]] if you have any questions about this proposal. Best regards,<br /> --[[:m:User:Martin Urbanec|Martin Urbanec]] ([[:m:User talk:Martin Urbanec|talk]]) 2021年2月18日 (木) 14:12 (UTC) </div> <!-- User:Martin Urbanec@metawiki が https://meta.wikimedia.org/w/index.php?title=User:Martin_Urbanec/MassMessage&oldid=21125035 のリストを使用して送信したメッセージ --> == Wikifunctions logo contest == <div class="plainlinks mw-content-ltr" lang="ja" dir="ltr"> {{Int:Hello}}. 新規開設のウィキファンクションというウィキについて、ロゴのデザイン構想をまとめようとしています。ぜひ選考過程にご協力いただけませんか。投票は本日から受付を開始、投票期間は2週間です。皆さん、どうか Meta-Wiki にて'''[[m:Special:MyLanguage/Abstract Wikipedia/Wikifunctions logo concept/Vote|このまま詳細と投票方法をご確認の上]]'''、ふるってご参加ください。 {{Int:Feedback-thanks-title}} --[[m:User:Quiddity (WMF)|Quiddity (WMF)]]</div> 2021年3月2日 (火) 01:45 (UTC) <!-- User:Quiddity (WMF)@metawiki が https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=21087740 のリストを使用して送信したメッセージ --> == 一斉配信されるメッセージを別のページに分離したい == 談話室に一斉配信されるメッセージには興味がなく鬱陶しく感じます。見通しも悪くなりますし別ページに配信するようにしてほしいと感じます。 --[[利用者:Naggy Nagumo|Naggy Nagumo]] ([[利用者・トーク:Naggy Nagumo|トーク]]) 2021年3月25日 (木) 04:39 (UTC) == MITライセンスのコンテンツを持ち込むことの是非 == [[WinSock/MSDNのソケットコードの保管場所]]というページでは、外部のコンテンツを丸ごと転載している様子です。著作権侵害ではないかと懸念し、調べたところ、転載元は https://github.com/MicrosoftDocs/win32 内にあることを突き止めました([https://github.com/MicrosoftDocs/win32/blob/0e611cdff84ff9f897c59e4e1d2b2d134bc4e133/desktop-src/WinSock/complete-client-code.md]と[https://github.com/MicrosoftDocs/win32/blob/0e611cdff84ff9f897c59e4e1d2b2d134bc4e133/desktop-src/WinSock/complete-server-code.md])。そこにあるファイル、LICENSEおよびLICENSE-CODEの内容はそれぞれCC-BY 4.0とMIT Licenseでした。基本的にはCC-BY 4.0であり、ただしプログラムのソースコード部分はMIT Licenseだということだと思います。 そこで、掲題のとおりMITライセンスのコンテンツをWikibooksに持ち込むことは問題ないか?という疑問に至りました。主な選択肢は以下のようになると思うのですが、どのように考えるべきでしょうか?皆さんの意見をうかがいたいです。 * MITライセンスの持ち込みは不可であり、削除依頼を出すべき。 * MITライセンスの持ち込みは可であり、削除する対象にはならない。 * MITライセンスの持ち込みは可であるものの、当該コンテンツにはCC-BY 4.0が適用される可能性を否定しきれない。WikibooksのページはCC-BY-SA 3.0のため持ち込めない(バージョンが低くなるので互換性がない)ので、削除依頼を出すべき。 著作権侵害にかかわる問題のため、広く意見を募るべきと思い、当該ページのノートではなく、こちらに話題を起こすことにしました。ご容赦ください。--[[利用者:Wdpp|Wdpp]] ([[利用者・トーク:Wdpp|トーク]]) 2021年4月3日 (土) 18:35 (UTC) :私は著作権やライセンスに関する知識はあまりないのですが、とはいえ Web活動では特定のライセンスを利用したり公言することはあるのですが、しかしそれは何となく有用だと思えるから何となく採用しているだけで、詳しくちゃんと理解しているわけではないんですよ。それにここのページの下部には、<blockquote>テキストはクリエイティブ・コモンズ 表示-継承ライセンス (CC BY-SA 3.0) の下で利用可能です。追加の条件が適用される場合があります。詳細は利用規約[https://foundation.wikimedia.org/wiki/Terms_of_Use/ja]を参照してください。</blockquote>と書いてありますけど、この利用規約[https://foundation.wikimedia.org/wiki/Terms_of_Use/ja]を詳読すればかなりの見解を持つことができると思いますが、このことに関して多くの時間や精力を費やす気はないのであくまでも談話室での無責任なおしゃべりとして書かせてもらいます。 :まずここでウィキメディア以外からの転載が許されるのは、 :#著作権者が許可した :#パブリックドメイン :#著作権法上保護されないと見なされるもの :だと思うんですが、特定のライセンスを持っているものは、転載しないほうがいい、非推奨ってことになりますよね…。ただ何らかの理由で、過去書かれたものがあったとしたら、それはその掲載元のライセンスで上書きされていると見なすといいかもしれませんね…。ですからそのライセンスの指定にしたがって転載されていたらOK、そうでなかったらアウトってことなんですが…。 :いやー単なる思い付きを書いただけで、大したことは言えないんですが…。--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年4月5日 (月) 20:42 (UTC) :{{コメント2|コメント}} MITライセンスは条件が緩いライセンスであって、MIT→CC-BY-SA 3.0 への互換性は問題ないように思います。したがって受け入れ可だと思いますが、細かい条件があるかもしれないので、結局は個別に確認するしかなさそうです。ウィキブックスのコンテンツを外部利用するケースを考えると、ライセンス条件が異なる部分がある場合は本文中に表示した方がよいかもしれません。問題のページに関しては、転載元が明確でないならばライセンス違反だと思います。 --[[利用者:Naggy Nagumo|Naggy Nagumo]] ([[利用者・トーク:Naggy Nagumo|トーク]]) 2021年4月9日 (金) 11:18 (UTC) ::(コメント∧返信)互換性という言葉が出ていますが、そもそも掲載元のライセンスを乗り換え、変更することは元のライセンスに指定がない以上は不可能ではないですかね…。ですから対処としては、ここに他のライセンスの文章を持ち込むなよな、って口で言う以外特にやること思いつかなくて…。ですからそういうページがあって、問題があると考えられる場合は、誰かが妥当な記述に書き換えるか、あるいは削除依頼を提出するかですよね…。著作権の問題は即時削除にならないと明記されていますし…。罪と罰なんて言葉がありますが、罪があると見なされたとしても、では誰がそれを指摘して非難して、罰を与えて物事を正すか? 私自身は今後もすじにく氏の文章を再編集して上書きする気はありますが、それはあくまで内容が良くなくて不適切だと思うからで、著作権の問題で深くかかわる気はないんです…。それに彼自身がここで著作権や転載引用の問題を教科書として執筆しているわけですから、あまりにもわかりやすい明確な逸脱をすることはないようにも思えますし…。ここでこのことを話し合うことで何らかの合意は得られるかもしれませんが、しかし合意以前に一般通念としてどう考えればいいのか?ウィキメディア財団としての見解はないのか?なんか非常に扱いづらい話ですねー。あとコモンズではどうなっているんですか?一番そういう事が問題になっている場にも見えますが…--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年4月9日 (金) 22:35 (UTC) :::見解とも違いますが、[[Wikibooks:著作権]]には「外部からの引用については原則として行わないでください。」とあります。引用ですらそうなら、転載はなおのこと推奨されない行為ではないかと思います。この点も、削除依頼すべきなのかなと考えさせられる要因の1つです。--[[利用者:Wdpp|Wdpp]] ([[利用者・トーク:Wdpp|トーク]]) 2021年4月12日 (月) 15:44 (UTC) ::::ああーそういう記述もありますね…。いずれにせよこの辺の話は込み入ってるから、場合場合でよくわからないことが多いんですよね<s>(^^;)</s>。それにしても世の中の人は著作権を後生大事に、目の覚めるほど重要なものだと思ってるようですが、もちろん私自身も著作権法やその理念は大事にしますし、ウィキメディア財団やプロジェクトに打撃を与えたいとは思っていませんが、しかし実際の運用ではそんな大したこと起こっていない、基本的には人数と金が絡んでいる連中が、がーがー理屈言って、自分たちの利益を死守しているだけで、世の創作物なんて、多くは普遍的にはネガティブな性質と価値しかないのにやたら金を生むものが幅を利かせて、その金と満たされた欲望に多数派のサルが群がってるだけだよね?……と、言ってしまうのはさすがに無茶苦茶な言い分ですが…。^^; ::::それはともかくこの事に関する私の主張は以下ですね。 ::::#まず他ライセンスのコンテンツ持ち込みは引用と同様推奨されない。 ::::#仮にそういうページがあったら、ウィキメディアのクリエイティブコモンズ云々の記述があるにもかかわらず、掲載元のライセンスの記述だと見なすしかない。 ::::#もしそのページに問題があると感じるなら、自分自身の判断と責任で再編集するか削除依頼を提出する。-- [[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年4月13日 (火) 11:34 (UTC) ::::: ”無責任なおしゃべり”ということで、私の解釈を書きます。結論から言えば、受け入れることはできるでしょう。ここで、受け入れられるライセンスというのは編集画面の「変更内容を保存すると、あなたは利用規約に同意するとともに、<u>自分の投稿内容を CC BY-SA 3.0 ライセンスおよび GFDL のもとで公開することに同意したことになります。</u>〔後略〕」や、フッターの「テキストはクリエイティブ・コモンズ 表示-継承ライセンスのもとで利用できます。追加の条件が適用される場合があります。」に表示されている通り、CC BY-SA 3.0ということにほかなりません。前置きが長くなりましたが本題。MITライセンスは、原著作者の表示およびライセンスそれ自身の表示を義務付けます。CC BY-SAも、原著作者の表示を義務付けます。我々は原著作者の表示はURLで十分と同意 (※編集画面の注釈) しているため、我々は要約欄に派生元URLを貼付したりします。さて、ここで問題です。我々はどのようにMITライセンスの要求を満たせば良いでしょうか?答えの一つは原著作者と、MITライセンスの全文が乗ったURLを添付することです。もう一つ問題です。MITライセンスはCC BY-SA 3.0とGFDLに組み込めるでしょうか?肯。https://licenses.opensource.jp/MIT/MIT.html によれば、「〔前略〕本ソフトウェアおよび関連文書のファイル(以下「ソフトウェア」)の複製を取得するすべての人に対し、ソフトウェアを無制限に扱うことを無償で許可します。〔後略〕」とあるため、従って'''異なるライセンスのコンポーネントにMITライセンスのコンポーネントを組み込んでも法的問題は生じない'''ものと考えられます。しかしながら、一般論として、引き写しは単なるコピー本にしかならないため、自身の文章で執筆したほうがこのようなやっかいごとなども生じずに済むでしょう。--[[利用者:Semi-Brace|Semi-Brace]] ([[利用者・トーク:Semi-Brace|トーク]]) 2021年4月13日 (火) 12:14 (UTC) == ユニバーサルな行動規範 第2フェーズ == [[:wmf:Special:MyLanguage/Universal Code of Conduct|'''ユニバーサルな行動規範 (UCoC)''']] はウィキメディア運動とそのプロジェクト群全般に適用し、ユニバーサル (普遍的) な容認できる行動の基本線を提示します。現在、このプロジェクトは第2フェーズに入り、明確な施行経路の概要を示しています。プロジェクト全体の詳細は[[:m:Special:MyLanguage/Universal Code of Conduct|'''プロジェクトのページ''']]をご参照ください。 === 草稿委員会:立候補の受付中 === ウィキメディア財団ではボランティアとして規範の施行方法の草稿をまとめる委員会への参加者を募集中です。ボランティアの委員は4月後半から7月に、また10月から11月にかけて週に2から6時間、時間をとっていただきます。委員会は多様性と包括性を重んじ、初学者から経験者まで、嫌がらせの被害者や対策をした人、間違えて加害者扱いされた人などさまざまな経歴の委員を揃えるよう目指しています。 選考過程と応募の詳細は、[[:m:Special:MyLanguage/Universal Code of Conduct/Drafting committee|Universal Code of Conduct/Drafting committee]] (ユニバーサルな行動規範/草稿委員会) をご参照ください。 === 2021年コミュニティとの協議:お知らせとボランティア / 翻訳者の募集 === 2021年4月5日 – 同5月5日にわたり、多数のウィキメディアのプロジェクトで UCoC 施行の方法についてコミュニティと協議します。ボランティアとして、主要な題材の翻訳者と合わせてそれぞれの言語版もしくはプロジェクトで指定の[[:m:Special:MyLanguage/Universal Code of Conduct/2021 consultations/Discussion|主要な設問]]について協議進行の補佐役を募集します。これらのボランティアのいずれかに関心がある皆さんは、ぜひいつもお使いの言語で[[:m:Talk:Universal Code of Conduct/2021 consultations|ご連絡ください]]。 この過程とその他の会話の詳細は、[[:m:Special:MyLanguage/Universal Code of Conduct/2021 consultations|Universal Code of Conduct/2021 consultations]] (ユニバーサルな行動規範/2021年コミュニティとの協議) をご参照ください。 -- [[User:Xeno (WMF)|Xeno (WMF)]] ([[User talk:Xeno (WMF)|トークページ]]) 2021年4月5日 (月) 21:19 (UTC) <!-- User:SOyeyele (WMF)@metawiki が https://meta.wikimedia.org/w/index.php?title=User:SOyeyele_(WMF)/Announcements/Japanese&oldid=21301359 のリストを使用して送信したメッセージ --> == Line numbering coming soon to all wikis == <div class="plainlinks mw-content-ltr" lang="ja" dir="ltr"> [[File:Technical_Wishes_–_Line_numbering_-_2010_wikitext_editor.png|thumb|使用例]] 4月15日より特定の種類のウィキ文エディタでは行番号が表示できるようになります -今のところ、テンプレート名前空間で、まもなくより多くの名前空間になります。これは改行を見つけやすくしたり、協議で特定の行を示す時に役立ちます。行番号を表示するには、構文強調機能([[mw:Special:MyLanguage/Extension:CodeMirror|CodeMirror 拡張機能]])を有効にする必要があり、ウィキ文エディタの[[mw:Special:MyLanguage/Extension:WikiEditor|2010年版]]と[[mw:Special:MyLanguage/2017 wikitext editor|2017年版]]が対応しています。 詳細情報は[[m:WMDE Technical Wishes/Line Numbering|こちらのプロジェクトページ]]をご参照ください。皆さんも機能のテストにぜひ参加して、[[m:talk:WMDE Technical Wishes/Line Numbering|このトークページ]]でフィードバックを投稿してみませんか。 </div> -- [[m:User:Johanna Strodt (WMDE)|Johanna Strodt (WMDE)]] 2021年4月12日 (月) 15:08 (UTC) <!-- User:Johanna Strodt (WMDE)@metawiki が https://meta.wikimedia.org/w/index.php?title=WMDE_Technical_Wishes/Technical_Wishes_News_list_all_village_pumps&oldid=21329014 のリストを使用して送信したメッセージ --> == Suggested Values == <div class="plainlinks mw-content-ltr" lang="ja" dir="ltr"> 4月29日より、テンプレートのパラメータの推奨値を提案できるようになりました。[[mw:Special:MyLanguage/Help:TemplateData|テンプレートデータ]]に登録された推奨値は[[mw:Special:MyLanguage/Help:VisualEditor/User guide|ビジュアルエディター]]でドロップダウンの一覧として表示されます。すると編集者は適切な値を素早く選択できるようになります。これによりエラーを未然に防ぎ、またテンプレートに値を入力する労力を軽減できます。なお、引き続き入力欄に直接、推奨値以外の値を記すことも可能です。 対応しているパラメータの種別や推奨値の作成方法など、詳細は[[mw:Help:TemplateData#suggestedvalues|[1]]] [[m:WMDE_Technical_Wishes/Suggested_values_for_template_parameters|[2]]]でご確認いただけます。皆さんもこの機能をぜひ試してみて、[[m:Talk:WMDE Technical Wishes/Suggested values for template parameters|トークページ]]にフィードバックをお寄せください。 </div> [[m:User:Timur Vorkul (WMDE)|Timur Vorkul (WMDE)]] 2021年4月22日 (木) 14:08 (UTC) <!-- User:Timur Vorkul (WMDE)@metawiki が https://meta.wikimedia.org/w/index.php?title=WMDE_Technical_Wishes/Technical_Wishes_News_list_all_village_pumps&oldid=21361904 のリストを使用して送信したメッセージ --> == Universal Code of Conduct News – Issue 1 == <section begin="ucoc-newsletter"/> <div style = "line-height: 1.2"> <span style="font-size:200%;">'''ユニバーサルな行動規範ニュース'''</span><br> <span style="font-size:120%; color:#404040;">'''第1号 - 2021年6月'''</span><span style="font-size:120%; float:right;">[[m:Special:MyLanguage/Universal Code of Conduct/Newsletter/1|'''ニュースレター全文はこちら''']]</span> ---- [[m:Special:MyLanguage/Universal Code of Conduct|ユニバーサルな行動規範]]ニュースの創刊号にようこそ! このニュースレターは ウィキメディアンの皆さんに新しいコードの開発に関与し続ける手助けとなり、UCoC 関連のニュースや調査、今後のイベントを配信します。 この号はUCoC ニュースレターの創刊号であり、購読者ならびにプロジェクト群に配信しイニシアティブを発表するものです。将来の号を受信するには、利用者のトークページや井戸端あるいは適切と判断されるいずれのページにするか[[m:Special:MyLanguage/Global message delivery/Targets/UCoC Newsletter Subscription|こちらで購読手続き]]をお願いします。 ニュースを皆さんがお使いの言語で広め、新しい行動規範の意識を創出できるように、私たちが大切にするコミュニティが誰にどっても安全安心であるように、ニュースレターの各号について翻訳をお願いできないでしょうか。草稿がまとまったお知らせを受信し発行前に翻訳に取り掛かるには[[m:Special:MyLanguage/Universal Code of Conduct/Newsletter/Participate|こちらに署名]]してください。皆さんのご参加を期待しご協力に感謝します。 </div><div style="margin-top:3px; padding:10px 10px 10px 20px; background:#fffff; border:2px solid #808080; border-radius:4px; font-size:100%;"> * '''提携団体の聞き取り調査''' – 規模の大小や種別を超え、提携団体には2021年3、4月にわたり UCoC 提携団体聞き取り調査に参加を呼びかけました。 ([[m:Special:MyLanguage/Universal Code of Conduct/Newsletter/1#sec1|続きはこちら]]) * '''2021年主要課題の聞き取り調査''' – ウィキメディア財団は2021年4、5月に実施の主要な課題の聞き取り調査を行い、ウィキメディアのコミュニティからより広く UCoC 実施に関するインプットをお願いしています。 ([[m:Special:MyLanguage/Universal Code of Conduct/Newsletter/1#sec2|続きはこちら]]) * '''円卓会議''' – UCoC 聞き取り調査チームでは90分単位の公開円卓会議を2回、2021年5月に開き、UCoC 実施 に関する重要な質問について話し合いました。会話の今後の日程をご参照ください。([[m:Special:MyLanguage/Universal Code of Conduct/Newsletter/1#sec3|続きはこちら]]) * '''第2フェーズ草案委員会''' – UCoC の第2フェーズに対応する草案委員会は2021年5月12日に作業を始めています。詳細をご参照ください。([[m:Special:MyLanguage/Universal Code of Conduct/Newsletter/1#sec4|続きはこちら]]) * '''<span lang="en" dir="ltr" class="mw-content-ltr">Diff blogs</span>''' – ブログには UCoC 調整役から投稿があり、2021年第1四半期に実施したローカルのプロジェクト聞き取り調査から、それぞれのコミュニティで出会った出来事や洞察を記しています。 ([[m:Special:MyLanguage/Universal Code of Conduct/Newsletter/1#sec5|続きはこちら]])</div><section end="ucoc-newsletter"/> </div> --[[利用者:MediaWiki message delivery|MediaWiki message delivery]] ([[利用者・トーク:MediaWiki message delivery|トーク]]) 2021年6月11日 (金) 22:41 (UTC) <!-- User:SOyeyele (WMF)@metawiki が https://meta.wikimedia.org/w/index.php?title=User:SOyeyele_(WMF)/Announcements/Japanese&oldid=21301359 のリストを使用して送信したメッセージ --> == 日本語版独自ロゴへの変更提案 == 現行のウィキブックス日本語版のロゴは、英語版のものからスローガン(?)を抜いた[[:File:Wikibooks-logo-en-noslogan.svg]]を使用しているようですが、例えば中国語版では[[:File:Wikibooks-logo-zh.svg]]、朝鮮語版では[[:File:Wikibooks-logo-ko-new.svg]]などと、多くの他言語版では各言語毎に独自のロゴ(文字の部分を変更したもの)が使用されています。日本語版でもウィキペディアやウィキニュース、ウィキバーシティでは独自ロゴが使用されています。このウィキブックス日本語版でも、ロゴを変更してみてはどうでしょうか。是非ご意見をお願いします。--[[利用者:TKsdik8900|TKsdik8900]] ([[利用者・トーク:TKsdik8900|トーク]]) 2021年6月12日 (土) 10:08 (UTC) :いやー別に変更するならするでいいのですが,ハングルについてはよくわからないのですが,中国語版の後半は音の訳ではなく意訳ですよね。教科書って書いていますから,books,ブックスではなく,つまり,nerveを神経と訳したようなもので…。WIKIBOOKS→ウィキブックスの変更があまり意味のあるものだとは思えなくて…。と,いうかむしろ,WIKIBOOKSのほうが望ましいようにも見えるんですよね…。でも変更する,作るなら作るでもいいですよ。--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年6月18日 (金) 11:38 (UTC) *{{コメント2|反対}} Honoooさんがおっしゃるように、あまり意味があるようなものではないと思います。Wikibooksの広義の意味を維持するためにも、現状のままがいいと思います。--[[利用者:Mario1257|Mario1257]] ([[利用者・トーク:Mario1257|トーク]]) 2021年6月21日 (月) 16:48 (UTC) == Wikimania 2021: Individual Program Submissions == [[File:Wikimania logo with text 2.svg|right|200px]] Dear all, Wikimania 2021 will be [[:wikimania:2021:Save the date and the Core Organizing Team|hosted virtually]] for the first time in the event's 15-year history. Since there is no in-person host, the event is being organized by a diverse group of Wikimedia volunteers that form the [[:wikimania:2021:Organizers|Core Organizing Team]] (COT) for Wikimania 2021. '''Event Program''' - Individuals or a group of individuals can submit their session proposals to be a part of the program. There will be translation support for sessions provided in a number of languages. See more information [[:wikimania:2021:Submissions/Guidelines#Language Accessibility|here]]. Below are some links to guide you through; * [[:wikimania:2021:Submissions|Program Submissions]] * [[:wikimania:2021:Submissions/Guidelines|Session Submission Guidelines]] * [[:wikimania:2021:FAQ|FAQ]] Please note that the deadline for submission is 18th June 2021. '''Announcements'''- To keep up to date with the developments around Wikimania, the COT sends out weekly updates. You can view them in the Announcement section [[:wikimania:2021:Announcements|here]]. '''Office Hour''' - If you are left with questions, the COT will be hosting some office hours (in multiple languages), in multiple time-zones, to answer any programming questions that you might have. Details can be found [[:wikimania:2021:Organizers#Office hours schedule|here.]] Best regards, [[利用者:MediaWiki message delivery|MediaWiki message delivery]] ([[利用者・トーク:MediaWiki message delivery|トーク]]) 2021年6月16日 (水) 04:18 (UTC) On behalf of Wikimania 2021 Core Organizing Team <!-- User:Bodhisattwa@metawiki が https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/VisualEditor/Newsletter/Wikis_with_VE&oldid=21597568 のリストを使用して送信したメッセージ --> == Editing news 2021 #2 == <div class="plainlinks mw-content-ltr" lang="ja" dir="ltr"> <em>[[m:Special:MyLanguage/VisualEditor/Newsletter/2021/June|他の言語で読む]] • [[m:VisualEditor/Newsletter|多言語ニュースレター配信に登録する]]</em> [[File:Reply Tool A-B test comment completion.png|alt=導入されている全ウィキペディアにおける編集初心者のコメント完了率|thumb|296x296px|初心者が返信ツールを使用してトークページに投稿しようとした際、コメント投稿に成功した割合。([https://wikimedia-research.github.io/Reply-tools-analysis-2021/ 出典])]] 今年の年初め、編集チームは[[mw:Talk pages project/Replying|返信ツール]]の大規模研究を行いました。 主な目的としては、返信ツールが[[mw:Talk pages project/Glossary|編集初心者]]のウィキにおけるコミュニケーションに役立っているかどうかを調べることが挙げられます。2つ目の目的は、新人編集者がこのツールを使って投稿したコメントが既存のwikitextエディタによるコメントよりも不適切なものが多いか調べることでした。 主な結果 : * <span lang="en" dir="ltr" class="mw-content-ltr">Newer editors who had automatic ("default on") access to the Reply tool were [https://wikimedia-research.github.io/Reply-tools-analysis-2021/ more likely] to post a comment on a talk page.</span> * また、編集初心者が返信ツールで行ったコメントは、ページ編集でのコメントよりも取り消し・巻き戻しされる可能性が[https://wikimedia-research.github.io/Reply-tools-analysis-2021/ 低い]という結果が出ました。 この結果により、Editingチームはこのツールが役立っていると確信しました。 <strong>今後の予定</strong> チームは今後数ヶ月で、返信ツールをオプトアウトで全員が利用できるように計画しています。この機能はアラビア語・チェコ語・ハンガリー語版ウィキペディアで先行的に実装されています。 <span lang="en" dir="ltr" class="mw-content-ltr">The next step is to [[phab:T280599|resolve a technical challenge]]. Then, they will deploy the Reply tool first to the [[phab:T267379|Wikipedias that participated in the study]]. After that, they will deploy it, in stages, to the other Wikipedias and all WMF-hosted wikis.</span> 現在、ベータ機能として「{{int:discussiontools-preference-label}}」を有効にできます。返信ツールを導入した後は、[[Special:Preferences#mw-prefsection-editing-discussion]]でいつでも設定を変更することができます。 –[[User:Whatamidoing (WMF)|Whatamidoing (WMF)]] ([[User talk:Whatamidoing (WMF)|トーク]]) </div> 2021年6月24日 (木) 14:14 (UTC) <!-- User:Elitre (WMF)@metawiki が https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/VisualEditor/Newsletter/Wikis_with_VE&oldid=21624491 のリストを使用して送信したメッセージ --> == Server switch == <div class="plainlinks mw-content-ltr" lang="ja" dir="ltr"><div class="plainlinks"> [[:m:Special:MyLanguage/Tech/Server switch 2020|他の言語で読む]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-Tech%2FServer+switch+2020&language=&action=page&filter= {{int:please-translate}}] [[foundation:|ウィキメディア財団]]ではメインと予備のデータセンターの切り替えテストを行います。 災害が起こった場合でも、ウィキペディアとその他のウィキメディア・ウィキが確実にオンラインとなるようにするための措置です。 ウィキメディアの技術部門では計画的にテストを行って、すべてが正常に動作することを確認する必要があります。今回のテストでは、あるデータセンターから他のデータセンターへ確実に切り替えられるかどうかを確かめます。そのため、多くのチームでテストや想定外の問題に対処できるよう準備を行う必要があります。 <!-- '''2020年10月27日(火)'''にすべての通信をメインのデータセンターへ戻します。 --> 残念ながら [[mw:Manual:What is MediaWiki?|MediaWiki]] の技術的制約により、切り替え作業中はすべての編集を停止する必要があります。 ご不便をおかけすることをお詫びします。なお、将来的には制限を最小限にとどめられるよう取り組んでいます。 '''閲覧は可能ですが、すべてのウィキにおいて短時間、編集ができない状態になります。''' *2021年6月29日(火)には、最大1時間ほど編集できない時間が発生します。 テストは以下の時刻に開始します:[https://zonestamp.toolforge.org/1624975200 14:00 UTC](つまり日本時間23:00、インド時間19:30、中央ヨーロッパ時間16:00、西ヨーロッパ時間15:00、米東部時間10:00、米太平洋時間07:00。ニュージーランドでは6月30日(水)のニュージーランド時間02:00。) *この時間帯に編集や保存を行おうとした場合、エラーメッセージが表示されます。 その間に行われた編集が失われないようには努めますが、保証することはできません。 エラーメッセージが表示された場合、通常状態に復帰するまでお待ちください。 その後、編集の保存が可能となっているはずです。 しかし念のため、保存ボタンを押す前に、編集内容のコピーをとっておくことをお勧めします。 ''その他の影響'': *バックグラウンドジョブが遅くなり、場合によっては失われることもあります。 赤リンクの更新が通常時よりも遅くなる場合があります。 特に他のページからリンクされているページを作成した場合、そのページは通常よりも「赤リンク」状態が長くなる場合があります。 実行に長時間を要するスクリプトは、停止しなければなりません。 *6月28日の週は、コード変更を凍結する予定です。 必須ではないコードの展開は行われません。 必要に応じてこの計画は延期されることがあります。 [[wikitech:Switch_Datacenter#Schedule_for_2021_switch|wikitech.wikimedia.org で工程表を見る]]ことができます。 変更はすべて工程表で発表しますので、ご参照ください。 この件に関しては今後、更にお知らせの内容を追加するかもしれません。 作業開始の30分前から、すべてのウィキで画面にバナーを表示する予定です。 '''この情報を皆さんのコミュニティで共有してください。'''</div></div> [[user:SGrabarczuk (WMF)|SGrabarczuk (WMF)]] 2021年6月27日 (日) 01:19 (UTC) <!-- User:SGrabarczuk (WMF)@metawiki が https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=21463754 のリストを使用して送信したメッセージ --> == 利用者:A3aaaaa33333の紹介ページについて == こんにちは。 --A3aaaaa33333です。利用者:A3aaaaa33333の紹介ページを公開しようとすると "エラー: 行なった操作は、有害であると自動的に判断されたため実行できませんでした。 確かに建設的な操作であると考える場合は、行なおうとしていた操作について管理者にお知らせください。 操作に対して発動した違反規則の概略は以下の通りです: LTA from JAWP" と表示され公開できないのですが、どうすればいいでしょうか。ご意見よろしくお願いします。 --[[利用者:A3aaaaa33333|A3aaaaa33333]] ([[利用者・トーク:A3aaaaa33333|トーク]]) 2021年7月28日 (水) 00:35 (UTC) :私は管理者でもないしこのwikiシステムについてもそれほど知らないので大したことは書けませんが、おそらくウィキペディアで,Long-term abuse(LTA:長期にわたる不適切行為)を行う人物に対処するため制限がかけられているIPアドレスからアクセスしているからではないですかね…。あなた自身がそのLTAerとどういう関係、あるいはまったく関係ないかは私には結局判断はできないのですが…。あるいはもうちょっと簡単に、何らかのユーザー側の操作間違いがあるのかもしれません。どちらにしろここでこのことを表明した以上、管理者の方から何らかのアクセスがある、あるいはもうすでにあったかもしれませんが、いやあるいはアクセスがないかもしれませんが、その場合も私は何故そうなるかはよくわからないんですよ…。--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年7月28日 (水) 13:24 (UTC) [[利用者:Honooo|Honooo]]さん、ありがとうございます。 --[[利用者:A3aaaaa33333|A3aaaaa33333]] == Install Extension:Quiz == :{{コメント2|対処}} '''[[phab:T289383]] [[利用者:4nn1l2|4nn1l2]] ([[利用者・トーク:4nn1l2|トーク]]) 2021年8月26日 (木) 19:01 (UTC)''' Hello. Sorry for writing in English. Please help translating this message. In order to install [[mw:Extension:Quiz]] on the Japanese Wikibooks, I need to build a consensus here. This extension is already installed on many language editions of Wikibooks including English, French, German, Spanish, Italian, Russian and many others. You can check [[:en:Special:Version]] (Ctrl+F: quiz) or see phabricator tickets such as [[phab:T157513]]. There are some nice examples at [[:en:Help:Quizzes]]. [[User:Roozitaa]] wants to make her Persian tutorials on the Japanese Wikibooks (such as [[ペルシア語]]) more illustrative using this extension. You can see [[:en:Dutch/Lesson_1#Quiz]] as an example. [[利用者:4nn1l2|4nn1l2]] ([[利用者・トーク:4nn1l2|トーク]]) 2021年7月28日 (水) 02:01 (UTC) * {{コメント2|賛成}}、提案者として [[利用者:4nn1l2|4nn1l2]] ([[利用者・トーク:4nn1l2|トーク]]) 2021年7月28日 (水) 02:01 (UTC) * {{コメント2|賛成}} --[[利用者:Roozitaa|Roozitaa]] ([[利用者・トーク:Roozitaa|トーク]]) 2021年7月29日 (木) 23:06 (UTC) :{{コメント2|賛成}} この機能を活用すれば従来の紙の教科書よりも学習効率の高い教材を作成できると思います。--[[利用者:Nermer314|Nermer314]] ([[利用者・トーク:Nermer314|トーク]]) 2021年8月7日 (土) 14:39 (UTC) == ネコはヤギが好き == あのー談話室なんだから、多少の雑談は許されると思うのですが、今日ふときづいたのですが、ここの検索のページの文字列に、"ネコはヤギが好き"って書かれてる…、これウィキペディア以外のプロジェクトには大抵この文字列なんですが、何かの含蓄があるんですかね^^?。知っている人がいたら教えてほしい(^^)/--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年8月9日 (月) 16:43 (UTC) == Wikimedia Foundation Election 2021 is now stated == Voting for the [[m:Special:MyLanguage/Wikimedia Foundation elections/2021/Voting|2021 Board of Trustees election]] is now open. Candidates from the community were asked to submit their candidacy. After a three week long Call for Candidates, there are [[m:Special:MyLanguage/Wikimedia Foundation elections/2021/Candidates#Candidate%20Table|19 candidates for the 2021 election]]. The [[m:Special:MyLanguage/Wikimedia Foundation Board of Trustees|Wikimedia Foundation Board of Trustees]] oversees the Wikimedia Foundation's operations. The Board wants to improve their competences and diversity as a team. They have shared the [[m:Special:MyLanguage/Wikimedia Foundation elections/2021/Candidates#Skills|areas of expertise]] that they are hoping to cover with new trustees. The Wikimedia movement has the opportunity to select candidates who have the qualities to best serve the needs of the movement for the next several years. The Board is expected to select the four most voted candidates to serve as trustees. This term starts in September and lasts for three years. [[Commons:File:Wikimedia_Foundation_Board_of_Trustees.webm|Learn more about the Board of Trustees in this short video]]. Vote now until August 31. Below is some useful information about the election process. ;Learn more about the candidates [[m:Special:MyLanguage/Wikimedia Foundation elections/2021#Candidate%20Table|Candidates from across the movement have submitted their candidatures]]. Learn about each candidate to inform your vote. The community submitted questions for the candidates to answer during the campaign. [[m:Special:MyLanguage/Wikimedia Foundation elections/2021/Candidates/CandidateQ&A|Candidates answered the list of community questions]] collated by the [[m:Special:MyLanguage/Wikimedia Foundation elections committee|Elections Committee]] on Meta. ;Vote Voting for the 2021 Board of Trustees election opened on 18 August 2021 and closes on 31 August 2021. The Elections Committee chose [[m:Special:MyLanguage/Wikimedia_Foundation_elections/Single_Transferable_Vote|Single Transferable Vote]] for the voting system. The benefit of this is voters can rank their choices in order of preference. Learn more about [[m:Special:MyLanguage/Wikimedia Foundation elections/2021/Voting#Voting_eligibility|voting requirements]], [[m:Special:MyLanguage/Wikimedia_Foundation_elections/2021/Voting|how to vote]], and [[m:Special:MyLanguage/Wikimedia_Foundation_elections/2021/Voting#Voting_FAQ|frequently asked questions about voting]]. Please help in the selection of those people who best fit the needs of the movement at this time. Vote and spread the word so more people can vote for candidates. Those selected will help guide the Wikimedia Foundation and support the needs of the movement over the next few years. Best, The Elections Committee -- [[User:YKo (WMF)]] via [[利用者:MediaWiki message delivery|MediaWiki message delivery]] ([[利用者・トーク:MediaWiki message delivery|トーク]]) 2021年8月18日 (水) 04:21 (UTC) <!-- User:YKo (WMF)@metawiki が https://meta.wikimedia.org/w/index.php?title=User:YKo_(WMF)/javp&oldid=21897428 のリストを使用して送信したメッセージ --> == 2021年理事会選挙 == ↑上の英文でおそらく書かれているのでしょうが、投票権のある皆様は、投票されたでしょうか? 私は以前英語でメールもらったときは、無理無理、そもそも英語のメールなんて最後まで読まんよ><、などと思ったのですが、先日日本語でメールもらいまして、じゃあせっかくだから投票しようと思って、今ログインして投票してきました。 基本的に私の人間を見る目の一つとして、「笑ってる奴は信用できん!!(^^;;)」というのがあるので、結局、パレスチナのFarahさんに投票しましたよ(^^)/。--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年8月27日 (金) 16:14 (UTC) == The 2022 Community Wishlist Survey will happen in January == <div class="plainlinks mw-content-ltr" lang="en" dir="ltr"> Hello everyone, We hope all of you are as well and safe as possible during these trying times! We wanted to share some news about a change to the Community Wishlist Survey 2022. We would like to hear your opinions as well. Summary: <div style="font-style:italic;"> We will be running the [[m:Special:MyLanguage/Community Wishlist Survey|Community Wishlist Survey]] 2022 in January 2022. We need more time to work on the 2021 wishes. We also need time to prepare some changes to the Wishlist 2022. In the meantime, you can use a [[m:Special:MyLanguage/Community Wishlist Survey/Sandbox|dedicated sandbox to leave early ideas for the 2022 wishes]]. </div> === Proposing and wish-fulfillment will happen during the same year === In the past, the [[m:Special:MyLanguage/Community Tech|Community Tech]] team has run the Community Wishlist Survey for the following year in November of the prior year. For example, we ran the [[m:Special:MyLanguage/Community Wishlist Survey 2021|Wishlist for 2021]] in November 2020. That worked well a few years ago. At that time, we used to start working on the Wishlist soon after the results of the voting were published. However, in 2021, there was a delay between the voting and the time when we could start working on the new wishes. Until July 2021, we were working on wishes from the [[m:Special:MyLanguage/Community Wishlist Survey 2020|Wishlist for 2020]]. We hope having the Wishlist 2022 in January 2022 will be more intuitive. This will also give us time to fulfill more wishes from the 2021 Wishlist. === Encouraging wider participation from historically excluded communities === We are thinking how to make the Wishlist easier to participate in. We want to support more translations, and encourage under-resourced communities to be more active. We would like to have some time to make these changes. === A new space to talk to us about priorities and wishes not granted yet === We will have gone 365 days without a Wishlist. We encourage you to approach us. We hope to hear from you in the [[m:Special:MyLanguage/Talk:Community Wishlist Survey|talk page]], but we also hope to see you at our bi-monthly Talk to Us meetings! These will be hosted at two different times friendly to time zones around the globe. We will begin our first meeting '''September 15th at 23:00 UTC'''. More details about the agenda and format coming soon! === Brainstorm and draft proposals before the proposal phase === If you have early ideas for wishes, you can use the [[m:Special:MyLanguage/Community Wishlist Survey/Sandbox|new Community Wishlist Survey sandbox]]. This way, you will not forget about these before January 2022. You will be able to come back and refine your ideas. Remember, edits in the sandbox don't count as wishes! === Feedback === * What should we do to improve the Wishlist pages? * How would you like to use our new [[m:Special:MyLanguage/Community Wishlist Survey/Sandbox|sandbox?]] * What, if any, risks do you foresee in our decision to change the date of the Wishlist 2022? * What will help more people participate in the Wishlist 2022? Answer on the [[m:Special:MyLanguage/Talk:Community Wishlist Survey|talk page]] (in any language you prefer) or at our Talk to Us meetings. </div> [[user:SGrabarczuk (WMF)|SGrabarczuk (WMF)]] ([[user talk:SGrabarczuk (WMF)|talk]]) 2021年9月7日 (火) 00:23 (UTC) <!-- User:SGrabarczuk (WMF)@metawiki が https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=21980442 のリストを使用して送信したメッセージ --> == Participate in the Universal Code of Conduct Roundtable == The Movement Strategy and Governance facilitation team is hosting '''[[m:Special:MyLanguage/Universal Code of Conduct/2021_consultations/Roundtable_discussions|Roundtable discussions]] on 18 September 2021 at 03:00 UTC and 15:00 UTC''' for Wikimedians to talk together about how to enforce the [[m:Special:MyLanguage/Universal Code of Conduct|Universal Code of Conduct]] . These calls are part of the Universal Code of Conduct project Phase 2 [[m:Special:MyLanguage/Universal_Code_of_Conduct/Enforcement_draft_guidelines_review|Enforcement draft guidelines review (EDGR)]]. Each session will last for 90 to 120 minutes and translation support for various languages will be provided. Also, sessions in specific languages may also be held depending on demand. Community members are encouraged to sign up in advance and add the topic to discuss during roundtable session. If you are not able to make the roundtable session, you can provide the comments are at [[m:Talk:Universal Code of Conduct/Enforcement draft guidelines review|the draft review talk page]] in any language, [[m:Special:PrefixIndex/Talk:Universal Code of Conduct/Enforcement draft guidelines review|talk pages of translations]], and [[m:Special:MyLanguage/Universal Code of Conduct/Discussions|local discussions]]. For more information, please visit [[m:Special:MyLanguage/Universal Code of Conduct/2021_consultations/Roundtable_discussions|roundtable discussion information page at Meta-wiki]]. --[[利用者:MediaWiki message delivery|MediaWiki message delivery]] ([[利用者・トーク:MediaWiki message delivery|トーク]]) 2021年9月10日 (金) 04:30 (UTC) <!-- User:YKo (WMF)@metawiki が https://meta.wikimedia.org/w/index.php?title=User:YKo_(WMF)/javp&oldid=21897428 のリストを使用して送信したメッセージ --> == Server switch == <div class="plainlinks mw-content-ltr" lang="ja" dir="ltr"><div class="plainlinks"> [[:m:Special:MyLanguage/Tech/Server switch|他の言語で読む]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-Tech%2FServer+switch&language=&action=page&filter= {{int:please-translate}}] [[foundation:|ウィキメディア財団]]ではメインと予備のデータセンターの切り替えテストを行います。 災害が起こった場合でも、ウィキペディアとその他のウィキメディア・ウィキが確実にオンラインとなるようにするための措置です。 ウィキメディアの技術部門では計画的にテストを行って、すべてが正常に動作することを確認する必要があります。今回のテストでは、あるデータセンターから他のデータセンターへ確実に切り替えられるかどうかを確かめます。そのため、多くのチームでテストや想定外の問題に対処できるよう準備を行う必要があります。 '''2021年9月14日(火)'''にすべての通信をメインのデータセンターへ戻します。 残念ながら [[mw:Manual:What is MediaWiki?|MediaWiki]] の技術的制約により、切り替え作業中はすべての編集を停止する必要があります。 ご不便をおかけすることをお詫びするとともに、将来的にはそれが最小限にとどめられるよう努めます。 '''閲覧は可能ですが、すべてのウィキにおいて編集ができないタイミングが短時間あります。''' *2021年9月14日(火)には、最大1時間ほど編集できない時間が発生します。 テストは以下の時刻に開始します:[https://zonestamp.toolforge.org/1631628049 14:00 UTC](つまり日本時間23:00、インド時間19:30、中央・東ヨーロッパ時間16:00、西ヨーロッパ・英国時間15:00、米東部時間10:00、米太平洋時間07:00。ニュージーランドでは6月15日(水)のニュージーランド時間02:00。) *この間に編集や保存を行おうとした場合、エラーメッセージが表示されます。 その間に行われた編集が失われないようには努めますが、保証することはできません。 エラーメッセージが表示された場合、通常状態に復帰するまでお待ちください。 その後、編集の保存が可能となっているはずです。 しかし念のため、保存ボタンを押す前に、行った変更のコピーをとっておくことをお勧めします。 ''その他の影響'': *バックグラウンドジョブが遅くなり、場合によっては失われることもあります。 赤リンクの更新が通常時よりも遅くなる場合があります。 特に他のページからリンクされているページを作成した場合、そのページは通常よりも「赤リンク」状態が長くなる場合があります。 長時間にわたって実行されるスクリプトは、停止しなければなりません。 * コードの実装は通常の週と同様に行う見込みです。 しかしながら、作業上の必要性に合わせ、ケースバイケースでいずれかのコードフリーズが計画時間に発生することもあります。 必要に応じてこの計画は延期されることがあります。 [[wikitech:Switch_Datacenter|wikitech.wikimedia.org で工程表を見る]]ことができます。 変更はすべて工程表で発表しますので、ご参照ください。 この件に関しては今後、さらにお知らせを掲示するかもしれません。 作業開始の30分前から、すべてのウィキで画面にバナーを表示する予定です。 '''この情報を皆さんのコミュニティで共有してください。'''</div></div> [[user:SGrabarczuk (WMF)|SGrabarczuk (WMF)]] ([[user talk:SGrabarczuk (WMF)|<span class="signature-talk">{{int:Talkpagelinktext}}</span>]]) 2021年9月11日 (土) 00:45 (UTC) <!-- User:SGrabarczuk (WMF)@metawiki が https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=21980442 のリストを使用して送信したメッセージ --> == Talk to the Community Tech == [[File:Magic Wand Icon 229981 Color Flipped.svg|{{dir|{{pagelang}}|left|right}}|frameless|50px]] [[:m:Special:MyLanguage/Community Wishlist Survey/Updates/2021-09 Talk to Us|Read this message in another language]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-Community_Wishlist_Survey/Updates/2021-09_Talk_to_Us&language=&action=page&filter= {{int:please-translate}}] Hello! As we have [[m:Special:MyLanguage/Community Wishlist Survey/Updates|recently announced]], we, the team working on the [[m:Special:MyLanguage/Community Wishlist Survey|Community Wishlist Survey]], would like to invite you to an online meeting with us. It will take place on [https://www.timeanddate.com/worldclock/fixedtime.html?iso=20210915T2300 '''September 15th, 23:00 UTC'''] on Zoom, and will last an hour. [https://wikimedia.zoom.us/j/89828615390 '''Click here to join''']. '''Agenda''' * [[m:Special:MyLanguage/Community Wishlist Survey 2021/Status report 1#Prioritization Process|How we prioritize the wishes to be granted]] * [[m:Special:MyLanguage/Community Wishlist Survey/Updates|Why we decided to change the date]] from November 2021 to January 2022 * Update on the [[m:Special:MyLanguage/Community Wishlist Survey 2021/Warn when linking to disambiguation pages|disambiguation]] and the [[m:Special:MyLanguage/Community Wishlist Survey 2021/Real Time Preview for Wikitext|real-time preview]] wishes * Questions and answers '''Format''' The meeting will not be recorded or streamed. Notes without attribution will be taken and published on Meta-Wiki. The presentation (first three points in the agenda) will be given in English. We can answer questions asked in English, French, Polish, and Spanish. If you would like to ask questions in advance, add them [[m:Talk:Community Wishlist Survey|on the Community Wishlist Survey talk page]] or send to sgrabarczuk@wikimedia.org. [[m:Special:MyLanguage/User:NRodriguez (WMF)|Natalia Rodriguez]] (the [[m:Special:MyLanguage/Community Tech|Community Tech]] manager) will be hosting this meeting. '''Invitation link''' * [https://wikimedia.zoom.us/j/89828615390 Join online] * Meeting ID: 898 2861 5390 * One tap mobile ** +16465588656,,89828615390# US (New York) ** +16699006833,,89828615390# US (San Jose) * [https://wikimedia.zoom.us/u/kctR45AI8o Dial by your location] See you! [[User:SGrabarczuk (WMF)|SGrabarczuk (WMF)]] ([[User talk:SGrabarczuk (WMF)|<span class="signature-talk">{{int:Talkpagelinktext}}</span>]]) 2021年9月11日 (土) 03:03 (UTC) <!-- User:SGrabarczuk (WMF)@metawiki が https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=21980442 のリストを使用して送信したメッセージ --> == 指導要領の改訂にともなうWikibooks == 高等学校(や中学校)のWikibooksの教科書の大半は旧課程(2003年度実施)をもとに構成されていますが、現行課程(2013年度実施)や、新課程(来年度の2022年度から実施)に対応した教科書の作成は進んでいません。内容の移行はありますが、教える事自体はあまり変わらないので、旧課程のWikibooksの教科書を再利用して作成することが現実的かと思いますが、その場合、移行作業は具体的にどのように行うのでしょうか。--[[利用者:Nermer314|Nermer314]] ([[利用者・トーク:Nermer314|トーク]]) 2021年9月17日 (金) 15:56 (UTC) :現行課程や新課程の枠組みに変更がないならば、特に断ることなく、そのまま上書きしてもらって良いかと思います。編集合戦等が生じた場合は、基本的に新たな課程の記載が優先されることとなるでしょう。しかしながら、既存の記事については参考として残してもいいかもしれません(大部になる場合はサブページ化するなど)。改定で削った内容について、改定後の考え方などを応用し出題することはよくあることなので。--[[利用者:Tomzo|Tomzo]] ([[利用者・トーク:Tomzo|トーク]]) 2021年9月17日 (金) 18:15 (UTC) :この件は私も以前から興味があるというか、問題意識を持っていまして、何度か議論提起をさせていただいています。が、あまりリプライがつかず議論が盛り上がらなかったり、反応をいただけた際も私の根気のなさもあり結局話をまとめられずにグダグダで終わってしまったりで、そのままここまで来てしまっています。力不足で申し訳ありません。直近で提起した議論は [[トーク:高等学校の学習/旧課程#旧課程教科書の今後の在り方について]] でして、ここでも結局私がほったらかしてしまったのですが、その中でこれまでの経緯のまとめと先行議論へのリンクをつけてありますので、ご参考にしていただければ幸いです。簡単に申し上げると、私個人としてはどんどん新課程に衣替えして加筆していくのが望ましいと考えるのですが、旧課程教科書の保存や加筆(個人的にはかなり疑問符なのですが)がなされるべきであるとされる方は案外いらっしゃるので、そのあたりきちんと調整しながら進める必要があるようです。私はそこまでの根気がなく、投げ出してしまっています。--[[利用者:K.ito|K.ito]] ([[利用者・トーク:K.ito|トーク]]) 2021年9月18日 (土) 06:22 (UTC) :旧課程と新課程で内容が移行される場合、例えば、旧課程の数学IIの「いろいろな関数」は現行課程と新課程では「三角関数」と「指数関数・対数関数」に分かれていますが、この場合は、 高等学校数学II/ のサブページにそれぞれ作成するのが適切でしょうか?また元の「いろいろな関数」のページはどうするのが適切でしょうか?元のページを消してしまうと履歴の継承が行われなくなってしまうと思います。またベクトルは内容には変化はなく、現行課程では数学Bで、新課程では数学Cで教えられますが、この場合は、(現行課程の学生が卒業する2023年度までは)どちらのサブページに設置するのが適切ですか? [[利用者:Nermer314|Nermer314]] ([[利用者・トーク:Nermer314|トーク]]) 2021年9月20日 (月) 14:23 (UTC) == Movement Charter Drafting Committee - Community Elections to take place October 11 - 24 == <section begin="announcementcontent"/>Dear fellow Wikimedians, This is an update from the Movement Charter process. We have closed the call for candidates on September 14 for the Drafting Committee and now have a pool of candidates with diverse backgrounds to choose from. The 15 member committee will be selected with a [[m:Special:MyLanguage/Movement Charter/Drafting Committee/Set Up Process|3-step process]]: * Election process for project communities to elect 7 members of the committee. * Selection process for affiliates to select 6 members of the committee. * Wikimedia Foundation process to appoint 2 members of the committee. ;Communities elect 7 members: This announcement is related to the community elections, which will take place in a time period of 2 weeks from October 11 to October 24. We look forward to a wide participation across the communities to create the committee to curate the writing of the Movement Charter. The Election Results will be published on November 1. ;Affiliates select 6 members: Parallel to the election process, all affiliates asked to contribute as well: All affiliates were divided into eight geographic and one ‘thematic’ region (check the list), and each region chooses one person who will act as a selector for that region. These 9 selectors will come together to select 6 of the committee (from the same pool of candidates). The selection results will be published on November 1. ; Wikimedia Foundation appoints 2 members: Finally, the Wikimedia Foundation will appoint two members to the committee by November 1. All three processes will be concluded by November 1, 2021, so that the Movement Charter Drafting Committee can start working by then. For the full context of the Movement Charter, its role, as well the process for its creation, please [[:m:Special:MyLanguage/Movement Charter|have a look at Meta]]. You can also contact us at any time on Telegram or via email (wikimedia2030@wikimedia.org). Best regards,<section end=announcementcontent/>--[[利用者:MediaWiki message delivery|MediaWiki message delivery]] ([[利用者・トーク:MediaWiki message delivery|トーク]]) 2021年9月22日 (水) 02:31 (UTC) <!-- User:YKo (WMF)@metawiki が https://meta.wikimedia.org/w/index.php?title=User:YKo_(WMF)/javp&oldid=21897428 のリストを使用して送信したメッセージ --> == デスクトップ版の改善について協議 == [[File:Annotated Wikipedia Vector interface (logged-out).png|thumb]] こんにちは! 実はウィキによって[[mw:Special:MyLanguage/Reading/Web/Desktop Improvements|デスクトップ版のインターフェースが異なる]]と気づいていましたか? 次にどう変わるか、関心は? 設計や技術面で、もしかして質問したいことや提案がありませんか? デスクトップの改良に取り組むチームと、オンラインのミーティングの参加者を募集中です。開催日時は[https://www.timeanddate.com/worldclock/fixedtime.html?iso=20211012T1600 10月12日16:00 UTC]、Zoomで実施します。1時間の予定です。'''[https://wikimedia.zoom.us/j/82936701376 参加登録はこちら]'''。 '''議題''' * 直近の開発について報告 * [[mw:Special:MyLanguage/Reading/Web/Desktop Improvements/Features/Sticky Header|常駐ヘッダー]] - デモ版の発表 * 質疑応答、協議 '''方式''' ミーティングは録画や生配信をしません。議事録は[https://docs.google.com/document/d/1G4tfss-JBVxyZMxGlOj5MCBhOO-0sLekquFoa2XiQb8/edit# Google ドキュメント ファイル]で記す予定です。発表の部分 (議題の1と2) は英語で行います。 質疑応答は英語、フランス語、ポーランド語、スペイン語で質問を受け付けます。 事前に質問を伝えるには、[[mw:Talk:Reading/Web/Desktop Improvements|トークページに投稿]]またはメールでsgrabarczuk@wikimedia.org まで送信してください。 ミーティングの主催者は[[user:OVasileva (WMF)|Olga Vasileva]] (オルガ・バシレバ、チーム管理者) です。 '''参加募集のリンク''' * [https://wikimedia.zoom.us/j/82936701376 オンラインで参加] * 会議 ID: <span dir=ltr>829 3670 1376</span> * [https://wikimedia.zoom.us/u/kB5WUc7yZ 所在地別のフリーダイヤル番号] では当日、お待ちしています! [[User:SGrabarczuk (WMF)|SGrabarczuk (WMF)]] ([[User talk:SGrabarczuk (WMF)|talk]]) 2021年10月5日 (火) 02:12 (UTC) <!-- User:SGrabarczuk (WMF)@metawiki が https://meta.wikimedia.org/w/index.php?title=User:SGrabarczuk_(WMF)/sandbox/MM/Varia&oldid=22122242 のリストを使用して送信したメッセージ --> == Universal Code of Conduct Draft Enforcement Guidelines review still needs your ideas and opinions == Hello, this is just a reminder that the [[:m:Special:MyLanguage/Universal Code of Conduct/Enforcement draft guidelines review|Universal Code of Conduct Draft Enforcement Guidelines]] are open for review and comment. The Drafting Committee will start working on revisions and improvement in '''less than two weeks (October 17)''', so it is important that you give them your ideas and opinions soon! There is now [[m:Special:MyLanguage/Universal Code of Conduct/Enforcement draft guidelines review/Abstract|a short, simple version of the Draft Guidelines]] here to make your review easier. If possible, also help translate the short version into more languages! We will also hold [[m:Special:MyLanguage/Universal_Code_of_Conduct/2021_consultations/Roundtable_discussions|one last conversation hour]] on October 15, 2021 03:00 and 14:00 UTC. On behalf of the [[m:Universal_Code_of_Conduct/Drafting_committee#Phase_2|Drafting Committee]], much thanks to everyone who has given ideas so far. We hope to hear from more of you - the Guidelines will be much stronger if more opinions are included. <!-- User:YKo (WMF)@metawiki が https://meta.wikimedia.org/w/index.php?title=User:YKo_(WMF)/javp&oldid=21897428 のリストを使用して送信したメッセージ --> == The Community election of Movement Charter Drafting committee is now open! == Voting for the election for the members for the Movement Charter drafting committee is now open. In total, 70 Wikimedians from around the world are running for 7 seats in these elections. '''Voting is open from October 12 to October 24, 2021.''' The committee will consist of 15 members in total: The online communities vote for 7 members, 6 members will be selected by the Wikimedia affiliates through a parallel process, and 2 members will be appointed by the Wikimedia Foundation. The plan is to assemble the committee by November 1, 2021. Learn about each candidate to inform your vote in the language that you prefer: <https://meta.wikimedia.org/wiki/Special:MyLanguage/Movement_Charter/Drafting_Committee/Candidates> Learn about the Drafting Committee: <https://meta.wikimedia.org/wiki/Special:MyLanguage/Movement_Charter/Drafting_Committee> We are piloting a voting advice application for this election. Click yourself through the tool and you will see which candidate is closest to you! Check at <https://mcdc-election-compass.toolforge.org/> Read the full announcement: <https://meta.wikimedia.org/wiki/Special:MyLanguage/Movement_Charter/Drafting_Committee/Elections> '''Go vote at SecurePoll on:''' <https://meta.wikimedia.org/wiki/Special:MyLanguage/Movement_Charter/Drafting_Committee/Elections> Best, --[[利用者:MediaWiki message delivery|MediaWiki message delivery]] ([[利用者・トーク:MediaWiki message delivery|トーク]]) 2021年10月13日 (水) 06:54 (UTC) <!-- User:YKo (WMF)@metawiki が https://meta.wikimedia.org/w/index.php?title=User:YKo_(WMF)/jazh&oldid=22182674 のリストを使用して送信したメッセージ --> == 運動戦略実施助成金が運動戦略計画をどのように支援するかを学ぶ == <section begin="announcement-content"/>運動戦略実施助成金は現在、運動戦略計画を実行に移すために2,000ドル以上を提供しています。詳細は[[:m:Special:MyLanguage/Grants:MSIG/About|運動戦略実施助成金の条件および応募方法]]についてを参照してください。<section end="annoumcent-content"/> [[利用者:MNadzikiewicz (WMF)|MNadzikiewicz (WMF)]] ([[利用者・トーク:MNadzikiewicz (WMF)|トーク]]) 2021年10月24日 (日) 09:09 (UTC) == Meet the new Movement Charter Drafting Committee members == :''<div class="plainlinks">[[m:Special:MyLanguage/Movement Charter/Drafting Committee/Elections/Results/Announcement|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Movement Charter/Drafting Committee/Elections/Results/Announcement}}&language=&action=page&filter= {{int:please-translate}}]</div>'' The Movement Charter Drafting Committee election and selection processes are complete. * The [[m:Special:MyLanguage/Movement Charter/Drafting Committee/Elections/Results|election results have been published]]. 1018 participants voted to elect seven members to the committee: '''[[m:Special:MyLanguage/Movement Charter/Drafting Committee/Candidates#Richard_Knipel_(Pharos)|Richard Knipel (Pharos)]]''', '''[[m:Special:MyLanguage/Movement Charter/Drafting Committee/Candidates#Anne_Clin_(Risker)|Anne Clin (Risker)]]''', '''[[m:Special:MyLanguage/Movement Charter/Drafting Committee/Candidates#Alice_Wiegand_(lyzzy)|Alice Wiegand (Lyzzy)]]''', '''[[m:Special:MyLanguage/Movement Charter/Drafting Committee/Candidates#Micha%C5%82_Buczy%C5%84ski_(Aegis_Maelstrom)|Michał Buczyński (Aegis Maelstrom)]]''', '''[[m:Special:MyLanguage/Movement Charter/Drafting Committee/Candidates#Richard_(Nosebagbear)|Richard (Nosebagbear)]]''', '''[[m:Special:MyLanguage/Movement Charter/Drafting Committee/Candidates#Ravan_J_Al-Taie_(Ravan)|Ravan J Al-Taie (Ravan)]]''', '''[[m:Special:MyLanguage/Movement Charter/Drafting Committee/Candidates#Ciell_(Ciell)|Ciell (Ciell)]]'''. * The [[m:Special:MyLanguage/Movement_Charter/Drafting_Committee/Candidates#Affiliate-chosen_members|affiliate process]] has selected six members: '''[[m:Special:MyLanguage/Movement Charter/Drafting Committee/Candidates#Anass_Sedrati_(Anass_Sedrati)|Anass Sedrati (Anass Sedrati)]]''', '''[[m:Special:MyLanguage/Movement Charter/Drafting Committee/Candidates#%C3%89rica_Azzellini_(EricaAzzellini)|Érica Azzellini (EricaAzzellini)]]''', '''[[m:Special:MyLanguage/Movement Charter/Drafting Committee/Candidates#Jamie_Li-Yun_Lin_(Li-Yun_Lin)|Jamie Li-Yun Lin (Li-Yun Lin)]]''', '''[[m:Special:MyLanguage/Movement Charter/Drafting Committee/Candidates#Georges_Fodouop_(Geugeor)|Georges Fodouop (Geugeor)]]''', '''[[m:Special:MyLanguage/Movement Charter/Drafting Committee/Candidates#Manavpreet_Kaur_(Manavpreet_Kaur)|Manavpreet Kaur (Manavpreet Kaur)]]''', '''[[m:Special:MyLanguage/Movement Charter/Drafting Committee/Candidates#Pepe_Flores_(Padaguan)|Pepe Flores (Padaguan)]]'''. * The Wikimedia Foundation has [[m:Special:MyLanguage/Movement_Charter/Drafting_Committee/Candidates#Wikimedia_Foundation-chosen_members|appointed]] two members: '''[[m:Special:MyLanguage/Movement_Charter/Drafting_Committee/Candidates#Runa_Bhattacharjee_(Runab_WMF)|Runa Bhattacharjee (Runab WMF)]]''', '''[[m:Special:MyLanguage/Movement_Charter/Drafting_Committee/Candidates#Jorge_Vargas_(JVargas_(WMF))|Jorge Vargas (JVargas (WMF))]]'''. The committee will convene soon to start its work. The committee can appoint up to three more members to bridge diversity and expertise gaps. If you are interested in engaging with [[m:Special:MyLanguage/Movement Charter|Movement Charter]] drafting process, follow the updates [[m:Special:MyLanguage/Movement Charter/Drafting Committee|on Meta]] and join the [https://t.me/joinchat/U-4hhWtndBjhzmSf Telegram group]. With thanks from the Movement Strategy and Governance team--[[利用者:MediaWiki message delivery|MediaWiki message delivery]] ([[利用者・トーク:MediaWiki message delivery|トーク]]) 2021年11月2日 (火) 04:42 (UTC) <!-- User:YKo (WMF)@metawiki が https://meta.wikimedia.org/w/index.php?title=User:YKo_(WMF)/javp&oldid=21897428 のリストを使用して送信したメッセージ --> == コミュニティ技術との対話を == [[File:Magic Wand Icon 229981 Color Flipped.svg|100px|right]] {{int:Hello}} [[m:Special:MyLanguage/Community Wishlist Survey|コミュニティ要望アンケート]]の担当チーム一同より、皆さんをオンライン会議にお誘いします。期日は[https://www.timeanddate.com/worldclock/fixedtime.html?iso=20211130T1700 '''{{#time:j xg|2021-11-30}} ({{#time:l|2021-11-30}})、{{#time:H:i e|17:00|ja|1}}''']、Zoom, を使用し1時間にわたる予定です。[https://wikimedia.zoom.us/j/82035401393 '''参加申し込みはこちら''']。 '''議題''' * コミュニティ要望アンケート2022が変わります。決定にご助力をお願いします。 * コミュニティ要望アンケート (CWS) の大使になりませんか。皆さんのコミュニティで、CWS に関する情報発信をしてください。 * 質疑応答 '''方式''' ミーティングは録画せず、ストリーム配信もしません。発言者名をつけない記録は取り、メタウィキにて公表の予定です。プレゼンテーション (質疑応答を除く議題の全内容) は英語で行います。 ご質問は英語、フランス語、ポーランド語、スペイン語、ドイツ語、イタリア語でお答えできます。事前に質問をお寄せいただくには、[[m:Talk:Community Wishlist Survey|コミュニティ要望アンケート のトークページ]]に投稿、もしくはメールにて sgrabarczuk@wikimedia.org宛にお送り願います。 ミーティングの主催は[[m:Special:MyLanguage/User:NRodriguez (WMF)|Natalia Rodriguez]] ([[m:Special:MyLanguage/Community Tech|コミュニティ技術]]部長) の予定です。 '''参加募集のリンク''' * [https://wikimedia.zoom.us/j/82035401393 オンラインで参加] * 会議 ID: <span dir=ltr>82035401393</span> * [https://wikimedia.zoom.us/u/keu6UeRT0T 所在地別のフリーダイヤル番号] では当日、お待ちしています! [[User:SGrabarczuk (WMF)|SGrabarczuk (WMF)]] ([[User talk:SGrabarczuk (WMF)|会話]]) 2021年11月27日 (土) 00:41 (UTC) <!-- User:SGrabarczuk (WMF)@metawiki が https://meta.wikimedia.org/w/index.php?title=User:SGrabarczuk_(WMF)/sandbox/MM/Other_TOP20/ja&oldid=22381336 のリストを使用して送信したメッセージ --> == ウィキメディア財団理事会/ご意見募集:2022年理事会選挙/理事会選挙に関するご意見募集のご案内 == 理事会選挙に関するご意見募集の予告 <section begin="announcement-content /> :''このメッセージはMeta-wikiで他の言語に翻訳されています。'' :''<div class="plainlinks">[[m:Special:MyLanguage/Wikimedia Foundation Board of Trustees/Call for feedback:2022 Board of Trustees election/Upcoming Call for Feedback about the Board of Trustees elections|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Wikimedia Foundation Board of Trustees/Call for feedback:2022 Board of Trustees election/Upcoming Call for Feedback about the Board of Trustees elections}}&language=&action=page&filter= {{int:please-translate}}]</div>'' 理事会は、2022年1月7日から2月10日まで行われる理事会選挙について、ご意見を募る準備をしています。 詳細は募集の前週に決定されますが、今回の募集では少なくとも2つの質問が確定していますので、ご意見をお願いします。 * 新興コミュニティから公平に理事会に代表を送るには、どのような方法がありますか? * 候補者は、選挙期間にどのように(コミュニティと)かかわるべきでしょうか? 質問は追加される可能性がありますが、運動戦略・ガバナンス(組織統治)チームでは募集の開始前に確定した設問をお伝えすることで、コミュニティや提携団体の皆さんに事前に読んでアイデアを準備していただく時間を設けたいと考えました。現時点で設問の一覧が完全でないことをお詫びいたします。今後、増えるのは1問または2問だけの見込みです。コミュニティの皆さんにご負担にならないよう、意義のある設問を事前にお知らせしておき、ぜひご意見をいただけないかと考えます。 '''この募集の期間中、地域での対話のまとめ役を引き受けていただける方はおられませんか?''' Meta (メタ)、[https://t.me/wmboardgovernancechat Telegram] (テレグラムのチャット)、またはメール(msg[[File:At sign.svg|16x16px|link=|(_AT_)]]wikimedia.org)で[[m:Special:MyLanguage/Movement Strategy and Governance|運動戦略とガバナンス(組織統治)チーム]]にご連絡ください。 ご質問やご不明な点がございましたら、お気軽にお問い合わせください。運動戦略とガバナンス(組織統治)チームは、1月3日まで最小限の人員で運営されます。この期間中は、対応が遅れますことをご了承ください。また、コミュニティや提携団体の皆さんには、12月の連休中はオフラインにしておられることも承知しています。せっかくの休暇中に私たちがメッセージをお送りしてしまった節には、たいへん失礼しました。 草々 運動戦略とガバナンス(組織統治)チーム一同<section end="announcement-content" />--[[利用者:YShibata (WMF)|YShibata (WMF)]] ([[利用者・トーク:YShibata (WMF)|トーク]]) 2021年12月28日 (火) 10:19 (UTC) == Webで起きていること == あのー私はこういうことについてはほとんど知らないし,情報も持っていないのですが,でもツイッターなんかの発言では時々見るんだけど,なんか,Web上ではあらゆるところで,特定の政治立場や経済利益を手に入れるために,お金をもらって,その勢力に都合いい記述を書きまくっている人物がいるようですね。私自身は完全に趣味で,遊びで,もちろんこういうサイトですからそれなりに公益や学問的な確かさを考慮して書きますが,そうじゃない,馬鹿ばかしい邪念と金のために書いている奴がかなりいるらしいって聞いたことがあるけど…。その辺どうでしょうかね?皆さんはどう思います?--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2022年1月7日 (金) 17:30 (UTC) == Wiki Loves Folklore is back! == <div lang="en" dir="ltr" class="mw-content-ltr"> {{int:please-translate}} [[File:Wiki Loves Folklore Logo.svg|right|150px|frameless]] You are humbly invited to participate in the '''[[:c:Commons:Wiki Loves Folklore 2022|Wiki Loves Folklore 2022]]''' an international photography contest organized on Wikimedia Commons to document folklore and intangible cultural heritage from different regions, including, folk creative activities and many more. It is held every year from the '''1st till the 28th''' of February. You can help in enriching the folklore documentation on Commons from your region by taking photos, audios, videos, and [https://commons.wikimedia.org/w/index.php?title=Special:UploadWizard&campaign=wlf_2022 submitting] them in this commons contest. You can also [[:c:Commons:Wiki Loves Folklore 2022/Organize|organize a local contest]] in your country and support us in translating the [[:c:Commons:Wiki Loves Folklore 2022/Translations|project pages]] to help us spread the word in your native language. Feel free to contact us on our [[:c:Commons talk:Wiki Loves Folklore 2022|project Talk page]] if you need any assistance. '''Kind regards,''' '''Wiki loves Folklore International Team''' --[[利用者:MediaWiki message delivery|MediaWiki message delivery]] ([[利用者・トーク:MediaWiki message delivery|トーク]]) 2022年1月9日 (日) 13:15 (UTC) </div> <!-- User:Tiven2240@metawiki が https://meta.wikimedia.org/w/index.php?title=User:Tiven2240/wlf&oldid=22560402 のリストを使用して送信したメッセージ --> == 2022年コミュニティ要望アンケート == [[File:Community Wishlist Survey Lamp.svg|right|200px]] '''[[m:Special:MyLanguage/Community Wishlist Survey 2022|2022年コミュニティ要望アンケート]]'''が始まりました!''' この調査はコミュニティによって[[m:Special:MyLanguage/Community Tech|コミュニティ技術]]チームが来年度に取り組む課題を決めるプロセスです。〆切の'''1月23日'''までに提案を行うか、他の提案内容について改善のためのコメントを行ってください。 提案に対する投票期間は1月28日から2月11日までです。 コミュニティ技術チームは経験を積んだウィキメディア編集者向けツールの開発に専念します。 提案は何語で書いても問題ありません。こちらで皆さんに代わって翻訳します。投稿をお待ちしていますので、どうぞよろしくお願いします! [[User:SGrabarczuk (WMF)|SGrabarczuk (WMF)]] ([[User talk:SGrabarczuk (WMF)|talk]]) 2022年1月10日 (月) 19:05 (UTC) <!-- User:SGrabarczuk (WMF)@metawiki が https://meta.wikimedia.org/w/index.php?title=User:SGrabarczuk_(WMF)/sandbox/MM/Other_TOP20/ja&oldid=22381336 のリストを使用して送信したメッセージ --> == 理事会選挙に関するご意見募集が始まりました == <section begin="announcement-content" />:''[[m:Special:MyLanguage/Wikimedia Foundation Board of Trustees/Call for feedback: Board of Trustees elections/Call for Feedback about the Board of Trustees elections is now open/Short|Meta-wikiで他の言語にも翻訳されています。]]'' :''<div class="plainlinks">[[m:Special:MyLanguage/Wikimedia Foundation Board of Trustees/Call for feedback: Board of Trustees elections/Call for Feedback about the Board of Trustees elections is now open/Short|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Wikimedia Foundation Board of Trustees/Call for feedback: Board of Trustees elections/Call for Feedback about the Board of Trustees elections is now open/Short}}&language=&action=page&filter= {{int:please-translate}}]</div>'' ご意見募集: 理事会選挙2022年2月7日まで募集をしています。 このご意見募集で、運動戦略と組織統治チームは、これまでと異なる手法を取ることにしました。2021年の経緯について、コミュニティから学ぶのです。こちらから提案をするのではありません。理事会から提示された2点の質問を軸にしています。2021年に理事会選挙が行われました。皆さんの意見をもとに、次の選挙を進めていく予定です。 [[m:Special:MyLanguage/Wikimedia Foundation Board of Trustees/Call for feedback: Board of Trustees elections|対話に参加する]] 敬具 運動戦略と組織統治<section end="announcement-content/> <languages/> == 運動戦略と組織統治ニュース – 記事 5 == <section begin="ucoc-newsletter"/> <div style = "line-height: 1.2"> <span style="font-size:200%;">'''運動戦略と組織統治ニュース'''</span><br> <span style="font-size:120%; color:#404040;">'''記事 5 - 2022年1月'''</span><span style="font-size:120%; float:right;">[[m:Special:MyLanguage/Movement Strategy and Governance/Newsletter/5|'''ニュースレター全文はこちら''']]</span> ---- 運動戦略と組織統治ニュース(旧称:ユニバーサル行動規範ニュース)第5号へようこそ! この刷新されたニュースレターでは、運動憲章、ユニバーサル行動規範、運動戦略実施のための助成金、理事会選挙、その他MSGに関連するニュースやイベントをお知らせしています。 このニュースレターは四半期ごとに配信されますが、より頻度の高いアップデートは、毎週または隔週で配信される予定です。配信を希望される方は、[[:m:Special:MyLanguage/Global message delivery/Targets/MSG Newsletter Subscription|こちら]]を忘れずにご登録ください。 </div><div style="margin-top:3px; padding:10px 10px 10px 20px; background:#fffff; border:2px solid #808080; border-radius:4px; font-size:100%;"> *'''理事選挙に関するご意見募集''' - 次回のウィキメディア財団WMF理事選挙に関するご意見を募集しています。このご意見募集は2022年1月10日に公開され、2022年2月7日に締め切られる予定です。([[:m:Special:MyLanguage/Movement Strategy and Governance/Newsletter/5#Call for Feedback about the Board elections|続きを読む]]) *'''ユニバーサル行動規範の批准''' - 2021年、WMFはユニバーサル行動規範の方針文の施行方法についてコミュニティに質問しました。執行ガイドラインの改訂草案は、3月コミュニティの投票に間に合うはずです。([[:m:Special:MyLanguage/Movement Strategy and Governance/Newsletter/5#Universal Code of Conduct Ratification|続きを読む]]) *'''運動戦略実施のための助成金'''-興味深い提案の審査を続ける中で、運動戦略の提言から特定のイニシアチブをターゲットにした提案やアイデアをより奨励し、歓迎します。([[:m:Special:MyLanguage/Movement Strategy and Governance/Newsletter/5#Movement Strategy Implementation Grants|続きを読む]]) *'''ニュースレターの新しい方向性''' - UCoCニュースレターがMSGニュースレターに移行するにあたり、ファシリテーションチームと共に、このニュースレターの新しい方向性を思い描き、決めていきます。([[:m:Special:MyLanguage/Movement Strategy and Governance/Newsletter/5#The New Direction for the Newsletter|続きを読む]]) *'''Diff Blogs'' - MSGに関する最新の出版物をウィキメディア・ディフでチェックしましょう。([[:m:Special:MyLanguage/Movement Strategy and Governance/Newsletter/5#Diff Blogs|続きを読む]])</div><section end="ucoc-newsletter"/> == Subscribe to the This Month in Education newsletter - learn from others and share your stories == <div lang="en" dir="ltr" class="mw-content-ltr"> Dear community members, Greetings from the EWOC Newsletter team and the education team at Wikimedia Foundation. We are very excited to share that we on tenth years of Education Newsletter ([[m:Education/News|This Month in Education]]) invite you to join us by [[m:Global message delivery/Targets/This Month in Education|subscribing to the newsletter on your talk page]] or by [[m:Education/News/Newsroom|sharing your activities in the upcoming newsletters]]. The Wikimedia Education newsletter is a monthly newsletter that collects articles written by community members using Wikimedia projects in education around the world, and it is published by the EWOC Newsletter team in collaboration with the Education team. These stories can bring you new ideas to try, valuable insights about the success and challenges of our community members in running education programs in their context. If your affiliate/language project is developing its own education initiatives, please remember to take advantage of this newsletter to publish your stories with the wider movement that shares your passion for education. You can submit newsletter articles in your own language or submit bilingual articles for the education newsletter. For the month of January the deadline to submit articles is on the 20th January. We look forward to reading your stories. Older versions of this newsletter can be found in the [[outreach:Education/Newsletter/Archives|complete archive]]. More information about the newsletter can be found at [[m:Education/News/Publication Guidelines|Education/Newsletter/About]]. For more information, please contact spatnaik{{@}}wikimedia.org. ------ <div style="text-align: center;"><div style="margin-top:10px; font-size:90%; padding-left:5px; font-family:Georgia, Palatino, Palatino Linotype, Times, Times New Roman, serif;">[[m:Education/Newsletter/About|About ''This Month in Education'']] · [[m:Global message delivery/Targets/This Month in Education|Subscribe/Unsubscribe]] · [[m:MassMessage|Global message delivery]] · For the team: [[User:ZI Jony|<span style="color:#8B0000">'''ZI Jony'''</span>]] [[User talk:ZI Jony|<sup><span style="color:Green"><i>(Talk)</i></span></sup>]], {{<includeonly>subst:</includeonly>#time:l G:i, d F Y|}} (UTC)</div></div> </div> <!-- User:ZI Jony@metawiki が https://meta.wikimedia.org/w/index.php?title=User:ZI_Jony/MassMessage/Awareness_of_Education_Newsletter/List_of_Village_Pumps&oldid=21244129 のリストを使用して送信したメッセージ --> == 理事会選挙ボランティア募集のお知らせ == 今年の理事会選挙でボランティアをしませんか? :することは、以下の3つのうちの一つでも結構です。 # 夏に行われる理事会選挙を日本語コミュニティの中ですすめる # 理事会選挙についての対話を実行する # 理事会選挙についての翻訳 :興味のある方は[https://ja.wikipedia.org/wiki/%E5%88%A9%E7%94%A8%E8%80%85%E2%80%90%E4%BC%9A%E8%A9%B1:YShibata_(WMF)#c-RottenApple777-2022-01-17T17%3A57%3A00.000Z-%E8%B2%A1%E5%9B%A3%E3%81%AE%E9%83%A8%E9%96%80%E3%81%AE%E4%B8%80%E8%A6%A7%E3%80%81%E2%80%932019%E5%B9%B4%EF%BC%88%E6%83%85%E5%A0%B1%EF%BC%89]か、yshibata-ctr@wikimedia.orgにご連絡ください! 他の地域での参加もできます。 [https://meta.wikimedia.org/wiki/Wikimedia_Foundation_elections/2022/Meetings/New_Year_Conversation_with_Election_Volunteers ]--[[利用者:YShibata (WMF)|YShibata (WMF)]] ([[利用者・トーク:YShibata (WMF)|トーク]]) 2022年1月18日 (火) 15:48 (UTC) == 提携団体の役割についてのご意見募集: 理事会選挙 == <section begin="announcement-content" />:''[[m:Special:MyLanguage/Wikimedia Foundation Board of Trustees/Call for feedback: Board of Trustees elections/Question_about_the_Affiliates%27_role_for_the_Call_for_Feedback:_Board_of_Trustees_elections|このメッセージはMeta-wikiで他の言語に翻訳されています。]]'' :''<div class="plainlinks">[[m:Special:MyLanguage/Wikimedia Foundation Board of Trustees/Call for feedback: Board of Trustees elections/Question_about_the_Affiliates%27_role_for_the_Call_for_Feedback:_Board_of_Trustees_elections|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Wikimedia Foundation Board of Trustees/Call for feedback: Board of Trustees elections/Question_about_the_Affiliates%27_role_for_the_Call_for_Feedback:_Board_of_Trustees_elections}}&language=&action=page&filter= {{int:please-translate}}]</div>'' みなさん、こんにちは。 ご意見募集にご参加いただいた皆様、ありがとうございます。理事会選挙にご参加いただいた皆様、ありがとうございます。運動戦略と組織統治チームは、もう一つの質問がまだ検討中であるとお伝えしていました。本日付で、その重要な質問を発表します。 提携団体はどのように選挙に参加すべきでしょうか? 提携団体は、ウィキメディアの運動の重要な構成要素です。今年補充される理事会の2議席は、2019年に提携団体枠として選出された議席です。 [https://foundation.wikimedia.org/w/index.php?title=Bylaws&type=revision&diff=123603&oldid=123339 細則の変更により、コミュニティと提携団体の枠の区別がなくなりました]。したがって重要な疑問が生じます。新しい議席の選定に提携団体はどのように関与すべきでしょうか? この質問は、寄せられるご意見がこの2議席についてだけでなく、任期中であるコミュニティや提携団体としての枠で選ばれた議席についても及ぶであろうという前提です。理事会は、提携団体の関与を高め、実際的な権限を与えるとともに、最高のスキル、経験、多様性、幅広いコミュニティの支持を有する人物を選ぶという意味で、最大の成果を見出したいと考えています。 理事会は、この質問について、特に提携団体からのご意見を必要としています。が、他の方々のご意見も必要です。どなたでもご意見を共有し、ご意見募集というチャンネルでの対話に参加することができます。オンラインでのご意見募集に加え、運動戦略と組織統治チームは、提携団体メンバーとのオンラインミーティングを数回企画し、ご意見を募集する予定です。これは様々な時間帯に行われ、理事会メンバーも参加します。 この3つ目の追加質問が予定より遅れたため、募集期間を2月16日まで延長します。 [[m:Special:MyLanguage/Wikimedia_Foundation_Board_of_Trustees/Call_for_feedback:_Board_of_Trustees_elections/Discuss_Key_Questions|対話に参加]] 敬具 運動戦略と組織統治 == 編集者 Honooo へのクレーム == トークページで彼からこう言われました。「なんか色々記述を移動させてるねー。以前もあんたその手使ったよね。まあ工学はあんたの専門分野だからね,最後の砦としては妥当だろう。俺も別にあんたを殺すのが目的でここにいる訳じゃあないんだけど,どうしてもついつい目にするとものすごく不快で具合悪くてね,どうしてもかかわらざるを得なくなっちゃうんだよ。今後どうなるかねー。俺がここを去るという道もあるけど,ウィキメディアの仕様自体が,それを難しくしてるんだよ。Honooo (トーク) 2022年1月24日 (月) 14:35 (UTC)」 何か私の編集移動がwiki規約に違反してるとかなら文句をつけられるのは仕方無いと思いますが、しかし工学専攻の私が専門知識に基づいて工学の記事を編集するのを、専門外の彼に文句を言われるのは意味不明です。 そもそも、移動前の「ゲームプログラミング」にあった工学的内容は、もともと工業高校の機械設計あたりの教科書に書いてあった設計図の内容をベースにしている内容ですので、それを私は工学のページに「設計の理論」という新規ページに移動しただけです。設計図書など、工業高校の機械設計用に考えていた内容ですし、もともと市販の工学書などに在った話題です。 彼は形式的にはトークページで対話をしていますが、しかし建設的な提案をしませんので、彼へのトークではなく談話室でクレームを述べさせてもらいます。 あと、「俺がここを去るという道もあるけど,ウィキメディアの仕様自体が,それを難しくしてるんだよ。」とか言われても、私からは「知らんがな」としか言えません。そもそも彼ってウィキペディアの管理人か何かなんですか。彼の今までのトークなどの発言内容が到底、ウィキメディア管理職とは思えません。--[[利用者:すじにくシチュー|すじにくシチュー]] ([[利用者・トーク:すじにくシチュー|トーク]]) 2022年1月24日 (月) 14:49 (UTC) :俺は管理職じゃあないよ。単なる一参加者。工学とか理学とか,専門分野とかいう前に,人間としてあんたの態度,考え方がおかしいと思うから文句言ってるの。一番建設的な話題だよ。「知らんがな」と言うのなら,俺はお前の存在自体が「知らんがな」だね。--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2022年1月24日 (月) 14:56 (UTC) :別に設計の理論で純粋に工学的な話題を展開するなら,何も文句ないし,むしろ俺も読みたいくらいだよ。だけどあんた今までそうじゃあなかったよね。なんだかんだで,人間と社会に関するありえない暴論をぶっこんで来たよね?この辺考え方の違いとか言われると俺も返答難しいんだけど,しかし俺から見ると地獄の100丁目でね,ありえなく不快だからついつい口出ししたくなっちゃうんだよ。だからそうなりたくないから,トークページで釘さしておいただけだよ。--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2022年1月24日 (月) 15:16 (UTC) == デスクトップビュー改善の情報更新と事務局時間へのご招待 == {{int:Hello}}. [[mw:Special:MyLanguage/Reading/Web/Desktop_Improvements|デスクトップビュー改善]]プロジェクト(Desktop Improvements)の更新について、ウィキメディア財団ウェブチームより情報共有をしたいと考えます。 当プロジェクトでは閲覧者も経験を積んだ利用者も、誰でも今よりもっとインターフェースを便利に使えるように目指します。 プロジェクトは一連の機能の改善で構成され、閲覧と編集をしやすくしたり、ページ内の移動、他言語への切り替え、記事のタブや利用者メニューの使用その他を対象にします。 これらの改良点は、すでに24件のウィキで閲覧者と編集者に既定で表示しており、ウィキペディアの [[:fr:|フランス語版]]、[[:pt:|ポルトガル語版]]、[[:fa:|ペルシャ語版]]も対象です。 これらの変更点を反映するのは[{{fullurl:{{FULLPAGENAMEE}}|useskin=vector}} ベクター]外装限定です。[{{fullurl:{{FULLPAGENAMEE}}|useskin=monobook}} モノブック]と [{{fullurl:{{FULLPAGENAMEE}}|useskin=timeless}} Timeless] の利用者に影響はありません。 === 前回の更新以降、展開した機能類 === * 目標としては、ユーザーリンクの構造と目的を強調して見せるなど、ナビゲーションを直観的に操作できるようにします。 * [[mw:Special:MyLanguage/Reading/Web/Desktop_Improvements/Features/Sticky Header|常駐ヘッダー]](Sticky header)- ページ最上部まで画面をロールしなくても、利用者が重要な機能(ログインとログアウト、変更履歴、トークページなど)を利用できるようにします。 当プロジェクトが対象とする機能の一覧は、当チームの[[mw:Special:MyLanguage/Reading/Web/Desktop_Improvements|プロジェクトページ]]をご参照ください。[[mw:Special:MyLanguage/Reading/Web/Desktop_Improvements/Updates|更新情報のページ]]もご案内します。. [[File:Table_of_contents_shown_on_English_Wikipedia_02.webm|thumb|600px|center]] <br clear=all> === 改良点を反映するには === [[File:Desktop Improvements - how to enable globally.png|thumb|[[Special:GlobalPreferences#mw-prefsection-rendering|{{int:globalpreferences}}]]]] * ウィキ単位で有効にするには、それぞれの[[Special:Preferences#mw-prefsection-rendering|個人設定ページを開き〈表示〉タブ]]の「{{int:prefs-vector-enable-vector-1-label}}」のボックスのチェックを外してください。(白色にします。) さらに[[Special:GlobalPreferences#mw-prefsection-rendering|グローバルな個人設定]]を指定すると、すべてのウィキで選択が一意に有効になります。 * 本ウィキにおいてこれが閲覧者や編集者全員にふさわしく、既定にしてよいとお考えの場合は、ぜひコミュニティとの合意形成に取り掛かったり私へのご連絡をご検討ください。 * ウィキによっては変更点を既定で全員に開示しており、その場合もログイン利用者は選択肢をいつでも旧来のベクター(Legacy Vector)に戻すことができます。 新しいベクター外装のサイドバーには、見つけやすいリンクを置いてあります。 === 情報交換とイベントの告知 === 本プロジェクトの進捗を今後も知りたいとお考えなら、[[mw:Special:Newsletter/28/subscribe|ニュースレターを購読]]してください。 [[mw:Special:MyLanguage/Reading/Web/Desktop_Improvements|プロジェクトのページ]](複数)を閲覧、[[mw:Special:MyLanguage/Reading/Web/Desktop_Improvements/Frequently_asked_questions|専用のよくある質問]]をチェック、[[mw:Talk:Reading/Web/Desktop_Improvements|プロジェクトのトークページ]]に投稿、さらにオンラインのミーティングに参加([https://www.timeanddate.com/worldclock/fixedtime.html?iso=20220127T1500 '''{{#time:xgj日|2022-01-27}} ({{#time:l|2022-01-27}}){{#time:H:i e|15:00|ja|1}}'''])など皆さんをお待ちしています。 オンライン会議に参加するには * [https://wikimedia.zoom.us/j/89205402895 オンラインで参加] * 会議 ID: <span dir=ltr>89205402895</span> * [https://wikimedia.zoom.us/u/kdPQ6k2Bcm 所在地別のフリーダイヤル番号] {{int:Feedback-thanks-title}} ウィキメディア財団ウェブチーム一同になりかわり、[[User:SGrabarczuk (WMF)|SGrabarczuk (WMF)]] ([[User talk:SGrabarczuk (WMF)|会話]]) 2022年1月25日 (火) 06:25 (UTC) <!-- User:SGrabarczuk (WMF)@metawiki が https://meta.wikimedia.org/w/index.php?title=User:SGrabarczuk_(WMF)/sandbox/MM/Other_TOP20/ja&oldid=22381336 のリストを使用して送信したメッセージ --> == ユニバーサル行動規範Universal Code of Conduct(UCoC)/施行ガイドライン査読の更新 == <section begin="announcement-content" /> :''[[m:Special:MyLanguage/Universal Code of Conduct/Enforcement guidelines/2022-02-02 Announcement/Short|このメッセージはMeta-wikiで他の言語に翻訳されています。]]'' :''<div class="plainlinks">[[m:Special:MyLanguage/Universal Code of Conduct/Enforcement guidelines/2022-02-02 Announcement/Short|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Universal Code of Conduct/Enforcement guidelines/2022-02-02 Announcement/Short}}&language=&action=page&filter= {{int:please-translate}}]</div>'' 皆さん、こんにちは。 '''[[m:Universal Code of Conduct/Enforcement guidelines|ユニバーサル行動規範Universal Code of Conduct (UCoC) 施行ガイドライン]]''' が2022年1月24日に公開されました。これまでの話し合いに沿い、[[m:Universal Code of Conduct|ユニバーサル行動規範Universal Code of Conduct]] を運動全てに適用させるためです。ガイドラインについてのコメントは [[m:Talk:Universal Code of Conduct/Enforcement guidelines|the Meta-wiki talk page]]こちらにご記入ください。 Zoomでの質疑応答が、2022年2月4日15:00 UTC(日本時間深夜0:00)、2022年2月25日12:00 UTC(日本時間21:00)、2022年3月4日15:00 UTC(日本時間深夜0:00)に行われます。 '''[[m:Special:MyLanguage/Universal Code of Conduct/Conversations|ガイドラインや投票手続きについて、UCoCプロジェクトチームや起草委員会メンバーと話し合う]]。''' [[m:Universal Code of Conduct/Project#Timeline|日程表はMeta-wikiでご覧ください]]。投票期間は3月7日から21日です。'''[[m:Universal Code of Conduct/Enforcement guidelines/Voting|詳細はこちらをご覧ください]]。''' ご参加いただきありがとうございます。 厚意と心をこめて、 運動戦略と組織統治Movement Strategy and Governance<br/> ウィキメディア財団Wikimedia Foundation<section end="announcement-content" /> == 編集合戦が起きたので報告 == 記事『[[病理学/炎症]]』で編集合戦が起きたので、報告します。なお、この井戸端に投稿した編集者「すじにくシチュー」は、編集合戦の当事者の片方です。ログインユ-ザーによる第三者の意見をお待ちしております。なお、この意見招来の要望はwikipedia日本語版の慣習にしたがったものです。wikipedia日本語版でも議論のあるページなどでは、井戸端などに議論のあることを報告し、意見を招来するものと考えます。なお現在、記事の状態は、編集合戦の起きる前に長らく放置されていた状態の版をベースに、議論のある事だけを追記した状態にしてあります。--[[利用者:すじにくシチュー|すじにくシチュー]] ([[利用者・トーク:すじにくシチュー|トーク]]) 2022年2月6日 (日) 09:04 (UTC) :すじにくさん,私は最近は貴方に本当に愛想が尽きたので,基本的には今回の議論は,ほぼ静観,傍観です。はっきり言って,IPv6さんがあなたを上手に料理して,貴方をWikibooks から葬り去ってくれることを期待しているよ。 :貴方もそろそろ自分自身の愚かさに気づいて,自覚,反省したほうがいいよ。俺に言わせりゃあ,人類史上本当に賢い人間なんて一人もいないよ。 :今回の病理学,炎症に関しては確かに私も興味あるけど,貴方の文章は,あなたの性格の悪さ,歪みが如実に表れてるので,まあ読みたくないね。Wikipediaにも,それ以外のWebにも,有益な文章はいっぱいあるよ。お金出して書籍購入してもいいしね。 :はっきり言うけど貴方の文章は,お金もらっても読みたくない部類だね。ここで私がゲームや学習法を上書きしてるのは,このサイトの参加者である以上やらざるを得ないからやってるんであって,貴方に対してはマイナスの評価しかない。 :さて,今後どうなるかね…。しかしあなたもほんと変わり者だね。俺も相当変人の自覚あるけど,貴方はそれをはるかに超えてるよ。--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2022年2月6日 (日) 10:43 (UTC) ::申し訳ありませんが、私「もう疲れたよパトラッシュ……_(:3」∠)_」状態です。すじにく大先生のお言葉の蟲毒に耐えられません(白目)。到底、大先生を葬り去るなんてできません。いや、普通の人は、あそこまで書けば少なくとも自省するんですけどね……。 ::すじにく大先生の最大の業績は「良いものは金を出して買え。無料にロクなものはない」というのを各ページでアピールしていることではないかと思います。--[[特別:投稿記録/2404:7A86:8800:1C00:597A:C4F6:CDF:B28C|2404:7A86:8800:1C00:597A:C4F6:CDF:B28C]] 2022年2月6日 (日) 12:25 (UTC) :::そうですか…。実は私も最近はパトラッシュと語ることが多くて^^;;;。悪いけどすじ肉先輩には業績なんてないと思う。確かに無料のものは怪しいもの多いけど,お金出したのに酷い内容や酷い事する人は本当に多いよ。まあそれはともかく,今日は私はもう寝ます(^^)/。ではではZzzzzzzz…--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2022年2月6日 (日) 12:39 (UTC) ::::Wikipediaみたいに、管理者も多くの執筆者も活動が活発なら葬れるんですけどねぇ……(白目)。すじにく大先生の業績? ないですね(きっばり)。さっきのはご存じかと思いますが、嫌味です(苦笑)。確かに、金返せと言いたくなるものもありますしね。私も、自分のことがありますのでこれにてm(__)m。--[[特別:投稿記録/2404:7A86:8800:1C00:597A:C4F6:CDF:B28C|2404:7A86:8800:1C00:597A:C4F6:CDF:B28C]] 2022年2月6日 (日) 12:47 (UTC) == <section begin="announcement-header" />リーダーシップ開発タスクフォース: ぜひ、ご意見をお聞かせください!<section end="annoncement-header" /> == <section begin="announcement-content" />:''[[m:Special:MyLanguage/Leadership Development Task Force/Call for Feedback Announcement|このメッセージはMeta-wikiで他の言語に翻訳されています。]]'' :''<div class="plainlinks">[[m:Special:MyLanguage/Leadership Development Task Force/Call for Feedback Announcement|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Leadership Development Task Force/Call for Feedback Announcement}}&language=&action=page&filter= {{int:please-translate}}]</div>'' ウィキメディア財団のコミュニティ開発チームは、グローバルな、コミュニティ主導のリーダーシップ開発タスクフォースの策定を支援しています。タスクフォースの目的はリーダーシップ開発作業についてのアドバイスです。 チームは、リーダーシップ開発タスクフォースについてのご意見を募集しています。このMETAページでは、[[m:Special:MyLanguage/Leadership Development Task Force|リーダーシップ開発タスクフォース]]のための提案と、どのようにして[[m:Special:MyLanguage/Leadership Development Task Force/Participate|支援するか]]について共有します。ご意見の募集期間は2022年2月7日から25日までです。<section end="announcement-content" /> == <section begin="announcement-header" />UCoCについての対話にご参加ください。批准のための投票もお願いいたします。<section end="announcement-header" /> == <section begin="announcement-content" /> :''[[m:Universal Code of Conduct/Enforcement guidelines/Voting/Announcement|このメッセージはMeta-wikiで他の言語に翻訳されています。]]'' :''<div class="plainlinks">[[m:Special:MyLanguage/Universal Code of Conduct/Enforcement guidelines/Voting/Announcement|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Universal Code of Conduct/Enforcement guidelines/Voting/Announcement}}&language=&action=page&filter= {{int:please-translate}}]</div>'' 皆さん、こんにちは。 ユニバーサル行動規範Universal Code of Conduct(UCoC)施行ガイドラインの批准プロセスの一環として、[[m:Special:MyLanguage/Universal_Code_of_Conduct/Enforcement_guidelines/Voting|'''2022年3月7日から21日までSecurePollで投票''']]があります。投票資格のある方は、是非、投票をお願い致します。反対の場合はコメントもご記入ください。[[EG2|投票者情報・参加資格の詳細]]。ガイドラインとは、世界共通の規範を各地域でどのように実地するのか、という案です。 [[EG3|ユニバーサル行動規範Universal Code of Conduct]](UCoC)は、最低限の規範です。2022年1月24日、この規範を実施する方法の案として[[m:Special:MyLanguage/Universal_Code_of_Conduct/Enforcement_guidelines|改訂版施行ガイドライン]]が発表されました。 [[m:Special:MyLanguage/Wikimedia_Foundation_Board_noticeboard/January_2022_-_Board_of_Trustees_on_Community_ratification_of_enforcement_guidelines_of_UCoC|ウィキメディア財団理事会声明]]では、投票でUCoC施行ガイドラインの採用について支持、または反対する機会[[m:Special:MyLanguage/Universal_Code_of_Conduct/Enforcement_guidelines/Voting|承認プロセス]]を必要としています。ウィキメディアンは[[m:Special:MyLanguage/Universal_Code_of_Conduct/Enforcement_guidelines/Voter_information/Volunteer|重要な情報の翻訳と共有]]に是非、ご参加ください。UCoCについての詳細は、Meta-wikiの[[m:Special:MyLanguage/Universal Code of Conduct/Project|プロジェクトページ]]と[[m:Special:MyLanguage/Universal Code of Conduct/FAQ|よくある質問]]をご覧ください。 話し合うためのイベントもあります。 * 2022年2月18日15:00 UTCに開催される[[m:Special:MyLanguage/Universal_Code_of_Conduct/Conversations/Panel_Q&A|コミュニティパネル]]では、小規模コミュニティの視点が特に必要です。 * [[m:Movement Strategy and Governance|運動戦略と組織統治Movement Strategy and Governance]](MSG)チームは、2022年2月25日 12:00 UTC と 2022年3月4日 15:00 UTC に話し合いの時間を開催します。ぜひ[[m:Special:MyLanguage/Universal_Code_of_Conduct/Conversations|'''参加''']]して、プロジェクトチームや起草委員会と、更新される施行ガイドラインや批准プロセスについて話し合ってください。2022年2月4日の終了回については[[m:Special:MyLanguage/Universal_Code_of_Conduct/2022_conversation_hour_summaries|話し合いの時間概略]]をご覧ください。 メタウィキのトークページには、どの言語でもコメントすることができます。また、電子メールで連絡することができます。msgemail または ucocproject[[File:At sign.svg|16x16px|link=|(_AT_)]]wikimedia.org です。 今後ともよろしくお願い申し上げます。 運動戦略とガバナンス(組織統治)チーム一同 <br /> ウィキメディア財団 <br /><section end="announcement-content" />--[[利用者:YShibata (WMF)|YShibata (WMF)]] ([[利用者・トーク:YShibata (WMF)|トーク]]) 2022年2月17日 (木) 08:45 (UTC) == ビデオゲームの攻略本について == 攻略本を解説書として執筆することは許可されているのでしょうか? さっき英語版WIKIBOOKSに「ビデオゲームの執筆の許可」という趣旨のページを見つけました。日本語版ではどうなっているのでしょうか。 -{{Unsigned2|Funa-enpitu|2022年2月20日(日)03:03(UTC)|[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]])}} :Funaさん,トーク系のページでは,末尾に署名してください。( <nowiki>--~~~~</nowiki> と書く)。個人的にはゲームの攻略本はここのコンテンツとしては認めたくありませんね。ただ英語版でどういう議論があるのかは気になるので,良ければ,対象ページへのリンクか,ページタイトルを示していただければありがたいのですが…--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2022年2月20日 (日) 04:59 (UTC) :[[:en:Wikibooks:Reading_room/Proposals#Start_allowing_game_strategies|ウィキブックス:読書室/提案 - ウィキブック、オープンワールドのためのオープンブック (wikibooks.org)]]--[[利用者:Funa-enpitu|Funa-enpitu]] ([[利用者・トーク:Funa-enpitu|トーク]]) 2022年2月20日 (日) 07:41 (UTC) :[[:en:Wikibooks:Reading_room/Proposals#Start_allowing_game_strategies|このリンクです]] --[[利用者:Funa-enpitu|Funa-enpitu]] ([[利用者・トーク:Funa-enpitu|トーク]]) 2022年2月20日 (日) 07:39 (UTC) :上部に「ウィキブックスコミュニティは、このウィキのビデオゲーム戦略ガイドを受け入れました!新しく作成された戦略ゲームのポリシーについては、ウィキブック:ストラテジーガイドを参照してください。皆様のご寄付をお待ちしております。」とあります。--[[利用者:Funa-enpitu|Funa-enpitu]] ([[利用者・トーク:Funa-enpitu|トーク]]) 2022年2月20日 (日) 07:42 (UTC) ::日本語版では今のところゲーム攻略本は不可です。日本語版の「[[{{ns:project}}:ウィキブックスは何でないか]]」には「テレビゲームの攻略本ではありません。ウィキブックスの求めるものは教本であり、攻略本ではありません。」と書かれていますので、今のところウィキブックス日本語版にゲーム攻略本を作ることは明確に禁じられています。単なる攻略本ではなく eスポーツ選手養成のための本格的な教材を編纂しようという話なら、受け入れられる可能性はあり得るかと思いますが。 --[[利用者:Kanjy|Kanjy]] ([[利用者・トーク:Kanjy|トーク]]) 2022年2月20日 (日) 09:32 (UTC) ::Funaさん,ある程度明文化された規定がすでにあるようですね。しかしそれはともかくリンクの提示ありがとうございます。[[b:en:Wikibooks:Reading room/Proposals]],[[b:en:Wikibooks:Strategy guides]]あたりですねー。Strategy guides が攻略本って事かな?まあどっちにしろ英語は凄く苦手でね,大したことは分からないんですが^^;;;…。--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2022年2月20日 (日) 10:00 (UTC) == Wiki Loves Folklore is extended till 15th March == <div lang="en" dir="ltr" class="mw-content-ltr">{{int:please-translate}} [[File:Wiki Loves Folklore Logo.svg|right|frameless|180px]] Greetings from Wiki Loves Folklore International Team, We are pleased to inform you that [[:c:Commons:Wiki Loves Folklore|Wiki Loves Folklore]] an international photographic contest on Wikimedia Commons has been extended till the '''15th of March 2022'''. The scope of the contest is focused on folk culture of different regions on categories, such as, but not limited to, folk festivals, folk dances, folk music, folk activities, etc. We would like to have your immense participation in the photographic contest to document your local Folk culture on Wikipedia. You can also help with the [[:c:Commons:Wiki Loves Folklore 2022/Translations|translation]] of project pages and share a word in your local language. Best wishes, '''International Team'''<br /> '''Wiki Loves Folklore''' [[利用者:MediaWiki message delivery|MediaWiki message delivery]] ([[利用者・トーク:MediaWiki message delivery|トーク]]) 2022年2月22日 (火) 04:50 (UTC) </div> <!-- User:Rockpeterson@metawiki が https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=22754428 のリストを使用して送信したメッセージ --> == 記事削除依頼 == 本人からの申し出と、記事内容に虚偽が含まれている事から、下記記事の削除を依頼いたします。 https://ja.wikipedia.org/wiki/%E6%A6%8E%E5%B6%8B%E5%A4%A7%E8%B2%B4{{Unsigned|YuyaAkasaka|2022-02-24T13:57:21|[[利用者:Tomzo|Tomzo]] ([[利用者・トーク:Tomzo|トーク]])}} :ウィキペディア記事に対して、こちらでは、何らの対応も致しかねます。--[[利用者:Tomzo|Tomzo]] ([[利用者・トーク:Tomzo|トーク]]) 2022年2月24日 (木) 09:03 (UTC) == 新しい規範が世界的に実行される前にご意見をお聞かせください。 == おはようございます!こんにちは!こんばんは! ウィキメディア財団、運動戦略と組織統治チームの柴田由美子[[https://meta.wikimedia.org/wiki/Movement_Strategy_and_Governance/Team/ja]]と申します。 新しい規範[[https://meta.wikimedia.org/wiki/Universal_Code_of_Conduct/ja]]が導入されたのですが、これまでの様々な「決まりごとや道徳」と決定的に違うのは'''実行'''させようとしていること[[https://meta.wikimedia.org/wiki/Universal_Code_of_Conduct/Enforcement_guidelines/ja]]です。 新しい規範自体は、「相手を尊重しましょう」など、基礎的なものです。 2022年3月7日~21日、'''この実行方法'''について、'''投票'''[[https://meta.wikimedia.org/wiki/Universal_Code_of_Conduct/Enforcement_guidelines/Voter_information/ja]]があります。 投票'''前に'''、ご意見をこちらにご記入いただければありがたいです。(投票のときにも意見を記入することができます。が、全ての利用者、というわけではありません) *日本語[[https://meta.wikimedia.org/wiki/Talk:Universal_Code_of_Conduct/Enforcement_guidelines/ja#%E3%83%A6%E3%83%8B%E3%83%90%E3%83%BC%E3%82%B5%E3%83%AB%E8%A1%8C%E5%8B%95%E8%A6%8F%E7%AF%84Universal_Code_of_Conduct%28UCoC%29%2F%E6%96%BD%E8%A1%8C%E3%82%AC%E3%82%A4%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3%E3%80%8C%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8B%E3%81%94%E6%84%8F%E8%A6%8B%E3%80%81%E8%B3%AA%E5%95%8F%E3%81%AA%E3%81%A9%E3%80%8D%E3%82%92%E3%81%94%E8%A8%98%E5%85%A5%E3%81%8A%E9%A1%98%E3%81%84%E3%81%84%E3%81%9F%E3%81%97%E3%81%BE%E3%81%99]] *英語[[https://meta.wikimedia.org/wiki/Talk:Universal_Code_of_Conduct/Enforcement_guidelines]] 「実行させようとする」方法の、第一段階は管理者の方々です。管理者、といっても、普通のボランティアの方々です。負担増加が懸念されるので、オンラインミーティングを行いました。日本語ウィキペディアが成立しているのは、管理者の方々がボランティアとして'''見えない'''仕事をしてくださっているからです。 井戸端ではこの点について話し合いがもたれています。暫定まとめ[[https://ja.wikipedia.org/wiki/Wikipedia:%E4%BA%95%E6%88%B8%E7%AB%AF/subj/%E3%83%A6%E3%83%8B%E3%83%90%E3%83%BC%E3%82%B5%E3%83%AB%E8%A1%8C%E5%8B%95%E8%A6%8F%E7%AF%84%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E3%82%A6%E3%82%A3%E3%82%AD%E3%83%9A%E3%83%87%E3%82%A3%E3%82%A2%E6%97%A5%E6%9C%AC%E8%AA%9E%E7%89%88%E3%81%AF%E8%A1%B0%E9%80%80%E3%81%95%E3%81%9B%E3%82%89%E3%82%8C%E3%82%8B%E3%81%AE%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84%E3%81%8B%EF%BC%9F/%E6%9A%AB%E5%AE%9A%E3%81%BE%E3%81%A8%E3%82%8120220223]] 日本語ウィキペディアの存続にかかわることになりかねないのでご一読いただければありがたいです。 ゆとりのないお知らせで申し訳ございません。お忙しいところご迷惑をおかけいたします。 --[[利用者:YShibata (WMF)|YShibata (WMF)]] ([[利用者・トーク:YShibata (WMF)|トーク]]) 2022年2月26日 (土) 05:56 (UTC) == Coming soon == <div class="plainlinks mw-content-ltr" lang="ja" dir="ltr"> === もうすぐ導入:テンプレート数件の改善 === こんにちは、3月9日より皆さんのウィキでテンプレート数件に改善を導入の予定です。 * [[Mw:Special:MyLanguage/Help:VisualEditor/User guide#Editing templates|ビジュアルエディタのテンプレートダイアログ]]を根本的に改善 (VisualEditor [[m:WMDE Technical Wishes/VisualEditor template dialog improvements|1]]、[[special:MyLanguage/m:WMDE Technical Wishes/Removing a template from a page using the VisualEditor|2]])、 * ページにテンプレートを導入しやすくする改善 ([[m:WMDE Technical Wishes/Finding and inserting templates|3]]) (対象は[[Mw:Special:MyLanguage/Help:VisualEditor/User guide#Editing templates|VisualEditor]] (ビジュアルエディタ)、[[Mw:Special:MyLanguage/Extension:WikiEditor#/media/File:VectorEditorBasic-en.png|2010 Wikitext]] (2010年版ウィキテキスト)、[[Mw:Special:MyLanguage/2017 wikitext editor|New Wikitext Mode]] (新ウィキテキストモード) におけるテンプレートダイアログ)、 * さらに構文ハイライト拡張機能 [[Mw:Special:MyLanguage/Extension:CodeMirror|CodeMirror]] (コードミラー) ([[m:WMDE Technical Wishes/Improved Color Scheme of Syntax Highlighting|4]]、[[m:WMDE Technical Wishes/Bracket Matching|5]]) (対応のウィキは右書きつまり横書きの時に左から右方向に書くタイプ。) これらの変更はすべて[[m:WMDE Technical Wishes|ウィキメディア・ドイツ協会技術要望]](WMDE Technical Wishes)の行う「[[m:WMDE Technical Wishes/Templates|テンプレート]]」プロジェクトの配下にあります。皆さんの作業でこれらがお役に立つよう願っており、またこれらのプロジェクトそれぞれのトークページでぜひ皆さんの意見感想をお聞きしたく、お待ちしています。 </div> - [[m:User:Johanna Strodt (WMDE)|Johanna Strodt (WMDE)]] 2022年2月28日 (月) 12:38 (UTC) <!-- User:Johanna Strodt (WMDE)@metawiki が https://meta.wikimedia.org/w/index.php?title=WMDE_Technical_Wishes/Technical_Wishes_News_list_all_village_pumps&oldid=22907463 のリストを使用して送信したメッセージ --> == 荒らし報告 == (すじにくシチューによるコメント)編集者 Honooo による荒らし行為を報告します。[https://ja.wikibooks.org/w/index.php?title=%E3%83%88%E3%83%BC%E3%82%AF:%E4%B8%AD%E5%AD%A6%E6%A0%A1%E5%9B%BD%E8%AA%9E_%E5%8F%A4%E6%96%87/%E6%9E%95%E8%8D%89%E5%AD%90&oldid=194980 『トーク:中学校国語 古文/枕草子』2022年3月2日 (水) 13:38時点による版] <pre> == すじ肉先輩へ == あのさー,これ書くとまた削除されるかもしれないけど,あんた結局最近の更新で嫌がらせしてない?俺みたいな馬鹿は,Wikibooksの方針文読んでるのがつきづきしって言われてる気がするんだけど?--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2022年3月2日 (水) 13:38 (UTC) </pre> Honoooの上記の投稿は中学国語と、何の関係もない意見表明です。 他のページでも編集者 Honooo は類似の行為を行っています。削除されましたが、『トーク:高等学校国語総合/土佐日記』で彼は荒らしを行いました。 そのため、該当のトークページを開くと、下記のように表示されます。 <pre> 警告: 以前削除されたページを再作成しようとしています。 このページの編集を続行するのが適切かどうかご確認ください。 参考までに、このページの削除と移動の記録を以下に示します: 2022年2月28日 (月) 18:31 Tomzo トーク 投稿記録 がページ「トーク:高等学校国語総合/土佐日記」を削除しました (WB:SD 荒らし・落書き・ブロック中ユーザーによる編集: 投稿者:Honooo 内容: 「== もがも == もがなって,タモリさんのハナモゲラに共通するとこない? 無いか^^;;;--Honooo (トーク) 2022年2月28日 (月) 13:24 (UTC)」) (感謝) </pre> 以上、報告。--[[利用者:すじにくシチュー|すじにくシチュー]] ([[利用者・トーク:すじにくシチュー|トーク]]) 2022年3月2日 (水) 13:51 (UTC) :ほんとに汚いやつだなー。あらしあらしって,俺はあんたの道義的な不正行為,とみられるものを非難しているだけだよ。そもそも俺のあてずっぽうは当たってるの?違うの?それぐらいは真面目に返答しろよ。--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2022年3月2日 (水) 13:55 (UTC) :まあまだ色々腑に落ちないことはあるんだけど,それはともかく,すじにく氏は以前,俺が談話室を捏造していると書いていたよね。これどういう意味かなーってずっと考えていたんだけど,ようするにIPv6氏とFUNA氏が俺で,自作自演を疑ってるわけだ?これは断言するけど,両氏は俺ではない。現実世界での知り合いでもない。インターネット上ではやり取りあったかもしれないけど,この世界は自己同一性がめちゃくちゃだからね^^;;;詳しいことは分からないよ。--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2022年3月2日 (水) 14:33 (UTC) == <section begin="announcement-header" />理事会選挙に関するご意見募集が終了しました <section end="announcement-header" /> == <section begin="announcement-content" />:''[[m:Special:MyLanguage/Wikimedia Foundation Board of Trustees/Call for feedback: Board of Trustees elections/Call for Feedback is now closed|このメッセージはMeta-wikiで他の言語に翻訳されています。]]'' :''<div class="plainlinks">[[m:Special:MyLanguage/Wikimedia Foundation Board of Trustees/Call for feedback: Board of Trustees elections/Call for Feedback is now closed|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Wikimedia Foundation Board of Trustees/Call for feedback: Board of Trustees elections/Call for Feedback is now closed}}&language=&action=page&filter= {{int:please-translate}}]</div>'' [[m:Wikimedia Foundation Board of Trustees/Call for feedback: Board of Trustees elections|ご意見募集: 理事会選挙]]は終了しました。この募集は1月10日から実施され、2022年2月16日に締め切られました。この呼びかけは[[m:Wikimedia Foundation Board of Trustees/Call for feedback: Board of Trustees elections/Discuss Key Questions#Questions|3つの重要な質問]]に焦点を当て、[[m:Talk:Wikimedia Foundation Board of Trustees/Call for feedback: Board of Trustees elections/Discuss Key Questions|メタウィキ]]や提携団体との話し合い、様々なコミュニティの会話の中で幅広い議論を得ました。コミュニティも提携団体も、多くの提案を提供してくれました。[[m:Wikimedia Foundation Board of Trustees/Call for feedback: Board of Trustees elections/Reports|報告書]]はMeta-wikiに掲載されています。 いただいたご意見は、理事会および選挙管理委員会と共有され、次回の理事会選挙に向けて検討されます。その後、理事会で審議された後、発表されます。 理事会選挙プロセス改善のための「ご意見の募集」にご参加いただいた皆様、ありがとうございました。 敬具 運動戦略と組織統治<br /><section end="announcement-content" /> [[Category:CfF Board of Trustees elections]]--[[利用者:YShibata (WMF)|YShibata (WMF)]] ([[利用者・トーク:YShibata (WMF)|トーク]]) 2022年3月3日 (木) 06:21 (UTC) == Wikibooks日本語版ってピラミッドだね == しかしすじ肉の別人格(まあこれも定かな指摘ではないけどね、あてずっぽうだよ)たちが、いくら自らの邪な心をセーブして、偏執的に記事を積み上げていっても、すじ肉みたいな汚い発想でWikiの質を充実させたいという方法の主導(現実には絶対うまくいかないけどね)があるこの場って、本当に価値があるかね?まあ価値があろうとなかろうと、もう少し俺はここに居座って、やろうと思ったことをやっていく予定だよ。--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2022年3月4日 (金) 14:38 (UTC) でもよく考えたら,うまくいかないって書いたけど,商業の世界ではそんなのばっかだね^^;;;。そして実際そのやり方で大儲けしている^^;;;。まあそれは仕方ないとして,せめてウィキメディアでは,別の論理でコンテンツが出来ていってほしいな。--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2022年3月4日 (金) 14:46 (UTC) == <section begin="announcement-header" />ユニバーサル行動規範Universal Code of Conduct 施行ガイドライン 批准投票 (終了しました)2022年3月7日から21日<section end="announcement-header" /> == <section begin="announcement-content" /> :''[[m:Special:MyLanguage/Universal Code of Conduct/Enforcement guidelines/Vote|このメッセージはMeta-wikiで他の言語に翻訳されています。]] :''<div class="plainlinks">[[m:Special:MyLanguage/Universal Code of Conduct/Enforcement guidelines/Vote|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Universal Code of Conduct/Enforcement guidelines/Vote}}&language=&action=page&filter= {{int:please-translate}}]</div>'' 皆さん、こんにちは。 [[m:Special:MyLanguage/Universal Code of Conduct|ユニバーサル行動規範Universal Code of Conduct]] (UCoC) の [[m:Special:MyLanguage/Universal Code of Conduct/Enforcement guidelines|査読後の施行ガイドライン]] 批准投票が始まりました! '''[[m:Special:MyLanguage/Universal Code of Conduct/Enforcement guidelines/Voting| SecurePollで投票]]'''します。 2022年3月7日 に始まり、2022年3月21日に終了します。 [[m:Universal Code of Conduct/Enforcement guidelines/Voter information|投票についての詳細と有権者かどうかを確かめるページをご覧ください]]。 ユニバーサル行動規範(UCoC)は、運動全体にとって許容される行動の最低値を示します。この方針を実行させる案として、2022年1月24日に施行ガイドラインの改訂版を発表しました。UCoCプロジェクトについては[[m:Special:MyLanguage/Universal Code of Conduct/Project| UCoC プロジェクトについて]]をご覧ください。 また、Meta-wikiのトークページには、どの言語でもコメントすることができます。メールでの連絡も可能です。ucocproject[[File:At sign.svg|16x16px|link=|(_AT_)]]wikimedia.org 今後ともよろしくお願い申し上げます。 運動戦略とガバナンス(組織統治)チーム一同 ウィキメディア財団<section end="announcement-content" />--[[利用者:YShibata (WMF)|YShibata (WMF)]] ([[利用者・トーク:YShibata (WMF)|トーク]]) 2022年3月7日 (月) 06:15 (UTC) == <section begin="announcement-header" />ハブのイベントへにご参加ください: グローバルカンバセーション(終了しました) 2022年3月12日 UTC13:00 日本時間 22:00<section end="announcement-header" /> == :''[[m:Special:MyLanguage/Hubs/Global Conversations March 12, 2022/Invitation|このメッセージはMeta-wikiで他の言語に翻訳されています。]]'' :''<div class="plainlinks">[[m:Special:MyLanguage/Hubs/Global Conversations March 12, 2022/Invitation|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Hubs/Global Conversations March 12, 2022/Invitation}}&language=&action=page&filter= {{int:please-translate}}]</div>'' <section begin="announcement-content" />こんにちは! ウィキメディア財団の運動戦略ガバナンスチームが主催する「地域・テーマ別ハブ」イベントに是非、ご参加ください。ウィキメディア運動は、地域・テーマ別ハブのあるべき姿を模索しています。11月のワークショップは良いスタートでした([[m:Special:MyLanguage/Hubs/Documentation/27 November Workshop|レポートを読む]])が、まだ終わってはいません。 この数週間、私たちはそれぞれの状況下でハブの設立に取り組んでいるグループに対して約16回のインタビューを行いました([[m:Special:MyLanguage/Hubs/Dialogue|ハブダイアログ]]をご覧ください)。インタビューは、3月12日に行われるディスカッションの土台となる報告書に反映されました。この報告書は、3月9日に発行される予定です。 3月12日13:00~16:00(UTC)にZoomで開催されます。通訳は、フランス語、スペイン語、アラビア語、ロシア語、ポルトガル語で行われます。参加登録は3月10日までです。ご興味のある方は、ぜひご参加ください。'''[[m:Special:MyLanguage/Hubs/Global Conversations March 12, 2022|メタウィキのイベント情報]]''' よろしくお願いします。 [[m:User:KVaidla (WMF)|Kaarel Vaidla]]<br />運動戦略 <section end="announcement-content" />--[[利用者:YShibata (WMF)|YShibata (WMF)]] ([[利用者・トーク:YShibata (WMF)|トーク]]) 2022年3月8日 (火) 11:33 (UTC) == オンラインミーティング日本語のみ3月18日(終了しました) == おはようございます!こんにちは!こんばんは! ウィキメディア財団、運動戦略と組織統治チームの柴田由美子[[https://meta.wikimedia.org/wiki/Movement_Strategy_and_Governance/Team/ja]]と申します。約三か月前から所属しております。 3月18日 金曜 22:00 - 23:00 ミーティングを行います! カメラオフ、ミュートで構いません。録音・録画はしません。議題はありません。しいていえば、「自分の他の利用者さんってどんな人?」と思う方、ご参加ください。顔は分からなくても、声は聞こえなくても、チャットの機能で「他の利用者さん」に話しかけてみてください! 参加してくださる方はお手数をおかけしますが署名をお願いします。 :署名のページ[[https://ja.wikipedia.org/wiki/%E5%88%A9%E7%94%A8%E8%80%85:YShibata_(WMF)/%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%83%86%E3%82%A3%E3%83%9F%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0/20220318]] :後日ウィキメールでオンラインミーティングのIDを送信します。(したがってメールの受信を許可している場合に限られます) Zoomで行いますので、お名前は署名と同じお名前をZoomの名前としてくださるようお願いします。 本来、「どなたでも」が理想ですが、「荒らし」と言われている状態になったことがあります。他の方々に迷惑をかけてしまいました。残念でならないのですが、事前に確認、という手順を取らざるをえなくなってしまいました。99.99%の利用者様にはお詫び申し上げます。 「googleからログアウトしておけば好きな名前でmeet参加できる」と教えて頂いたのですが、気がついたのがIDをとった後だったので、教えてくださった方、もうしわけありません! --[[利用者:YShibata (WMF)|YShibata (WMF)]] ([[利用者・トーク:YShibata (WMF)|トーク]]) 2022年3月10日 (木) 13:23 (UTC) == ウィキメディア財団や理事会にモノ申す機会です。21日までです(終了しました) == 新しい規範[[https://meta.wikimedia.org/wiki/Universal_Code_of_Conduct/ja]]の施行方法[[https://meta.wikimedia.org/wiki/Universal_Code_of_Conduct/Enforcement_guidelines/ja]]について、反対/賛成の投票が行われています。 : 投票用紙は日本語です。[[https://meta.wikimedia.org/wiki/Universal_Code_of_Conduct/Enforcement_guidelines/Voting/ja]]日本語で意見を記入できます。 : 投票の秘密は守られるシステムで、たとえ財団職員でも、誰が賛成/反対なのか、どんな意見を書いたのか、知ることができません。もちろん財団職員やコントラクターが翻訳するわけでは無いので、安心して、日ごろの不満など、ご記入ください。 : 編集回数などの投票資格は[[https://meta.toolforge.org/accounteligibility/62]]に利用者名を入力すると瞬時にわかります。 この施行方法について、あまりにも不完全なので問題が多々生じています。 : 井戸端[[https://ja.wikipedia.org/wiki/Wikipedia:%E4%BA%95%E6%88%B8%E7%AB%AF/subj/%E3%83%A6%E3%83%8B%E3%83%90%E3%83%BC%E3%82%B5%E3%83%AB%E8%A1%8C%E5%8B%95%E8%A6%8F%E7%AF%84%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E3%82%A6%E3%82%A3%E3%82%AD%E3%83%9A%E3%83%87%E3%82%A3%E3%82%A2%E6%97%A5%E6%9C%AC%E8%AA%9E%E7%89%88%E3%81%AF%E8%A1%B0%E9%80%80%E3%81%95%E3%81%9B%E3%82%89%E3%82%8C%E3%82%8B%E3%81%AE%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84%E3%81%8B%EF%BC%9F/%E6%9A%AB%E5%AE%9A%E3%81%BE%E3%81%A8%E3%82%8120220223]] : 施行方法(日本語)のトークページ[[https://meta.wikimedia.org/wiki/Talk:Universal_Code_of_Conduct/Enforcement_guidelines/ja#%E3%83%A6%E3%83%8B%E3%83%90%E3%83%BC%E3%82%B5%E3%83%AB%E8%A1%8C%E5%8B%95%E8%A6%8F%E7%AF%84Universal_Code_of_Conduct%28UCoC%29%2F%E6%96%BD%E8%A1%8C%E3%82%AC%E3%82%A4%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3%E3%80%8C%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8B%E3%81%94%E6%84%8F%E8%A6%8B%E3%80%81%E8%B3%AA%E5%95%8F%E3%81%AA%E3%81%A9%E3%80%8D%E3%82%92%E3%81%94%E8%A8%98%E5%85%A5%E3%81%8A%E9%A1%98%E3%81%84%E3%81%84%E3%81%9F%E3%81%97%E3%81%BE%E3%81%99]] 上記「井戸端」の : アイディアの中「ウィキペディア日本語版を分かっている人を誰か送り込む。例えば、財団職員になるなど」について財団の求人情報[[https://wikimediafoundation.org/about/jobs/#section-1]]を是非ウォッチしてください。 :: スタッフは正社員のような立場です。 :: コントラクターは時給で働いています。柴田は週20時間ですが、30時間の人、40時間の人などがいます。学生さんも多いです。 : その他の中「基本的に従うしかないのでは」 :: 様々なことの決定は、職員ではなく、世界各地の利用者があらゆる機会に手をあげて、グループを作り、彼らが行います。新しい規範も、施行方法も、これから作る上位決定機関もです。どなたか決める側に参加しませんか。--[[利用者:YShibata (WMF)|YShibata (WMF)]] ([[利用者・トーク:YShibata (WMF)|トーク]]) 2022年3月14日 (月) 10:15 (UTC) == <section begin="announcement-header" />リーダーシップ開発ワーキンググループ: 応募しませんか! (応募期間2022年3月14日から4月10日)<section end="announcement-header" /> == <section begin="announcement-content" /> :''[[m:Special:MyLanguage/Leadership Development Working Group/Participate/Announcement|このメッセージはMeta-wikiで他の言語に翻訳されています。]]'' :''<div class="plainlinks">[[m:Special:MyLanguage/Leadership Development Working Group/Participate/Announcement|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Leadership Development Working Group/Participate/Announcement}}&language=&action=page&filter= {{int:please-translate}}]</div>'' 皆さん、こんにちは。 [[m:Special:MyLanguage/Leadership Development Working Group|リーダーシップ開発ワーキンググループ]]は何をするべきかについてフィードバックを送ってくださった皆様、ありがとうございました。メタウィキに[[m:Special:MyLanguage/Leadership Development Working Group/Participate#5. Summary of Call for Feedback|フィードバックのまとめ]]が掲載されています。このフィードバックはワーキンググループで共有され、作業に反映されます。ワーキンググループへの参加は現在募集中で、2022年4月10日に締め切られます。ぜひ[[m:Special:MyLanguage/Leadership_Development_Working_Group/Purpose_and_Structure#3._How_is_the_working_group_formed_and_structured?|ワーキンググループの情報を見て]]、興味を持ちそうなコミュニティメンバーをご存知でしたら、''[[m:Special:MyLanguage/Leadership_Development_Working_Group/Participate#1._How_to_participate|興味があれば応募する]]''ように伝えてください。 よろしくお願いします。 コミュニティ開発チーム<br /><section end="announcement-content" />--[[利用者:YShibata (WMF)|YShibata (WMF)]] ([[利用者・トーク:YShibata (WMF)|トーク]]) 2022年3月14日 (月) 13:22 (UTC) == Wiki Loves Folklore 2022 ends tomorrow == [[File:Wiki Loves Folklore Logo.svg|right|frameless|180px]] International photographic contest [[:c:Commons:Wiki Loves Folklore 2022| Wiki Loves Folklore 2022]] ends on 15th March 2022 23:59:59 UTC. This is the last chance of the year to upload images about local folk culture, festival, cuisine, costume, folklore etc on Wikimedia Commons. Watch out our social media handles for regular updates and declaration of Winners. ([https://www.facebook.com/WikiLovesFolklore/ Facebook] , [https://twitter.com/WikiFolklore Twitter ] , [https://www.instagram.com/wikilovesfolklore/ Instagram]) The writing competition Feminism and Folklore will run till 31st of March 2022 23:59:59 UTC. Write about your local folk tradition, women, folk festivals, folk dances, folk music, folk activities, folk games, folk cuisine, folk wear, folklore, and tradition, including ballads, folktales, fairy tales, legends, traditional song and dance, folk plays, games, seasonal events, calendar customs, folk arts, folk religion, mythology etc. on your local Wikipedia. Check if your [[:m:Feminism and Folklore 2022/Project Page|local Wikipedia is participating]] A special competition called '''Wiki Loves Falles''' is organised in Spain and the world during 15th March 2022 till 15th April 2022 to document local folk culture and [[:en:Falles|Falles]] in Valencia, Spain. Learn more about it on [[:ca:Viquiprojecte:Falles 2022|Catalan Wikipedia project page]]. We look forward for your immense co-operation. Thanks Wiki Loves Folklore international Team [[利用者:MediaWiki message delivery|MediaWiki message delivery]] ([[利用者・トーク:MediaWiki message delivery|トーク]]) 2022年3月14日 (月) 14:40 (UTC) <!-- User:Rockpeterson@metawiki が https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=22754428 のリストを使用して送信したメッセージ --> == <section begin="announcement-header" /> コミュニティ レジリエンスとサスティナビリティ チーム主催の対話に是非ご参加ください。マギー・デニスが質問に答えます。 <section end="annoncement-header" /> == :''[[m:Special:MyLanguage/Leadership Development Working Group/Participate/Announcement|このメッセージはMeta-wikiで他の言語に翻訳されています。]]'' :''<div class="plainlinks">[[m:Special:MyLanguage/IRC office hours/Office hours 2022-03-24/Announcement|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:IRC office hours/Office hours 2022-03-24/Announcement}}&language=&action=page&filter= {{int:please-translate}}]</div>'' ウィキメディア財団の [[m:Community Resilience and Sustainability|コミュニティ レジリエンスとサスティナビリティ]] チームは、チームのバイス プレジデントである [[m:User:Mdennis (WMF)|マギー・デニス]]との対話の時間を行います。 話し合いの内容は、運動戦略、理事会のガバナンス、信頼と安全、ユニバーサル行動規範、コミュニティ開発、人権です。ご質問やご意見を、是非お聞かせください。事前に質問をお送りいただくことも可能です。 2022年3月24日 15:00 UTC ([https://zonestamp.toolforge.org/1648134035 日本時間 日付が24日から25日に替わる深夜0:00]). [[m:IRC office hours/Office hours 2022-03-24|Meta-wikiで詳細]].--[[利用者:YShibata (WMF)|YShibata (WMF)]] ([[利用者・トーク:YShibata (WMF)|トーク]]) 2022年3月20日 (日) 09:47 (UTC) == ウィキメディア財団や理事会にモノ申す機会、日本時間22日朝8:59までです (終了しました)== 新しい規範[[https://meta.wikimedia.org/wiki/Universal_Code_of_Conduct/ja]]の施行方法[[https://meta.wikimedia.org/wiki/Universal_Code_of_Conduct/Enforcement_guidelines/ja]]について、反対/賛成の投票が行われています。 : 投票用紙は日本語です。[[https://meta.wikimedia.org/wiki/Universal_Code_of_Conduct/Enforcement_guidelines/Voting/ja]]日本語で意見を記入できます。 : 投票の秘密は守られるシステムで、たとえ財団職員でも、誰が賛成/反対なのか、どんな意見を書いたのか、知ることができません。もちろん財団職員やコントラクターが翻訳するわけでは無いので、'''安心して、日ごろの不満など'''、ご記入ください。 理事会メンバー(ウィキメディア財団の上部組織の構成員)が全て読みます。 --[[利用者:YShibata (WMF)|YShibata (WMF)]] ([[利用者・トーク:YShibata (WMF)|トーク]]) 2022年3月22日 (火) 10:06 (UTC) == <section begin="announcement-header" />ユニバーサル行動規範Universal Code of Conduct 施行ガイドライン 批准投票は締め切りとなりました。<section end="announcement-header" /> == <section begin="announcement-content" /> :''[[m:Special:MyLanguage/Universal Code of Conduct/Enforcement guidelines/Voter information/Announcement|このメッセージはMeta-wikiで他の言語に翻訳されています。]]'' :''<div class="plainlinks">[[m:Special:MyLanguage/Universal Code of Conduct/Enforcement guidelines/Vote/Closing message|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Universal Code of Conduct/Enforcement guidelines/Vote/Closing message}}&language=&action=page&filter= {{int:please-translate}}]</div>'' ご挨拶申し上げます [[m:Special:MyLanguage/Universal Code of Conduct|ユニバーサル行動規範]](UCoC)の[[m:Special:MyLanguage/Universal Code of Conduct/Enforcement guidelines|査読後施行ガイドライン]]の批准投票は、協定世界時2022年3月21日に締め切りとなりました。{{#expr:2300}}人を超えるウィキメディアンが世界中で投票しました。運動の一環であるこのプロセスに参加した皆さん、ありがとうございました。 現在、精査グループが投票を検証しています。作業が終わるまで最大2週間ほどかかります。 投票による最終結果は、関連統計やコメントのまとめとともに、発表され次第、[[m:Special:MyLanguage/Universal Code of Conduct/Enforcement guidelines/Voting/Results|こちら]]に掲載されます。次のステップについては [[m:Special:MyLanguage/Universal Code of Conduct/Enforcement guidelines/Voter information|投票インフォメーションページ]] をご覧ください。プロジェクトのトークページ [[m:Talk:Universal Code of Conduct/Enforcement guidelines|on Meta-wiki]] には、どの言語でもコメントを書くことができます。また、UCoCプロジェクトチームへの電子メールによる連絡も可能です。ucocproject[[File:At sign.svg|16x16px|link=|(_AT_)]]wikimedia.org よろしくお願いいたします。 運動戦略と組織統治<br /><section end="announcement-content" />--[[利用者:YShibata (WMF)|YShibata (WMF)]] ([[利用者・トーク:YShibata (WMF)|トーク]]) 2022年3月22日 (火) 08:23 (UTC) == 財団がこれから行おうとしていることについて日本語Zoomミーティング4月1日金曜22:00~23:00 == おはようございます!こんにちは!こんばんは! ウィキメディア財団、運動戦略と組織統治チームの柴田由美子[https://meta.wikimedia.org/wiki/Movement_Strategy_and_Governance/Team/ja]と申します。 表題のお題は以下の通りです。 1. 新しい規範の施行についての投票の報告[https://meta.wikimedia.org/wiki/Universal_Code_of_Conduct/Enforcement_guidelines/Voting/Results/ja] :1) 日本語コミュニティ有権者数 = 3375 (英語、ドイツ語、フランス語についで第三位。第四位以下、ロシア語、スペイン語) :2) 日本語コミュニティ投票者数 = 81 (世界中で2352人が投票。日本語コミュニティはこのうち3.444% 中国語も全く同じ%で、両言語7番目) :3) 言語別投票者数降順:英語、ドイツ語、フランス語、ロシア語、ポーランド語、スペイン語、中国語と日本語が同数、イタリア語 :4) 投票した人/有権者 = 2.400% (言語別で世界最小。日本語コミュニティの次に低いのがウクライナ語)(上記リンクが存在しなかったとき、柴田は% of electorateをEligible who votedと勘違いしていました。18日ミーティングなどで5%と表してしまいました。もうしわけありません) システム上、投票者名・賛成/反対・コメントの三つは切り離されて集計されています。 2. 今後の予定[https://meta.wikimedia.org/wiki/Movement_Strategy/Initiatives/ja] :1) 投票結果発表(3月31日まで精査)[https://meta.wikimedia.org/wiki/Universal_Code_of_Conduct/Project/ja] :2) 理事会(財団の上位組織)選挙 (今年の夏に投票 詳細は来月末?に理事会が発表) :3) 運動憲章 Movement Charter[https://meta.wikimedia.org/wiki/Movement_Charter/ja](上記の「新しい規範」は安全と包括性を確保するため、「運動憲章」は意思決定に公平さを確保するため ) :4) ハブ Hubs [https://meta.wikimedia.org/wiki/Hubs/ja] (意思決定に公平さを確保するため ) :5) リーダーシップ開発ワーキンググループ[https://meta.wikimedia.org/wiki/Leadership_Development_Working_Group/ja#3._Timeline] :6) ウィキマニア 8月11日 -14日 「primarily virtual, with support for local gatherings and events where possible」 3. 助成金 Grants[https://meta.wikimedia.org/wiki/Grants:Start/ja] カメラオフ、ミュートで構いません。録音・録画はしません。 参加してくださる方はお手数をおかけしますが署名をお願いいたします。 :署名のページ[[https://ja.wikipedia.org/wiki/%E5%88%A9%E7%94%A8%E8%80%85:YShibata_(WMF)/UCoC%E3%83%9F%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0/20220401]] :後日ウィキメールでオンラインミーティングのIDを送信します。(したがってメールの受信を許可している場合に限られます) Zoomで行いますので、お名前は署名と同じお名前をZoomの名前としてくださるようお願いいたします。 --[[利用者:YShibata (WMF)|YShibata (WMF)]] ([[利用者・トーク:YShibata (WMF)|トーク]]) 2022年3月23日 (水) 07:42 (UTC) ===上記「今後の予定」が決まった過程=== [[metawiki:Strategy/Wikimedia_movement/2018-20/Reports/Movement_Strategy_Playbook/ja|利用者さんたちの話し合いの過程はこちら]]--[[利用者:YShibata (WMF)|YShibata (WMF)]] ([[利用者・トーク:YShibata (WMF)|トーク]]) 2022年3月25日 (金) 12:36 (UTC) ===新年度の計画=== ウィキメディア財団の会計年度は7月に始まり、6月に終わります。 現在、新年度の計画を立てています。以下は次期計画の基礎です。 * [[foundationsite:about/financial-reports/#a1-2021-2022|ファイナンシャル報告]](2005年~2021年) * [[metawiki:Wikimedia_Foundation_Medium-term_plan_2019/Annual_Plan_2021-2022/ja|年次計画2021-2022]] * [[c:File:Wikimedia_Foundation's_2021-2022_Annual_Plan_Overview.pdf|英語pdf]] * [[metawiki:Wikimedia_Foundation_Medium-term_plan_2019/ja|2019年中期事業計画]] おまけ * [https://www.submarinecablemap.com/landing-point/marseille-france 世界中の海底ケーブル地図](テックチームが上層部への説明に使用したそうです) * [[foundationsite:about/jobs/|求人情報]]「急募3年間オーストラリアに住む人renewable contract with a good salary and other incentives」 --[[利用者:YShibata (WMF)|YShibata (WMF)]] ([[利用者・トーク:YShibata (WMF)|トーク]]) 2022年3月26日 (土) 08:23 (UTC) == <section begin="announcement-header" />リーダーシップ開発ワーキンググループ: 応募期間中です。2022年4月10日まで。日本語コミュニティから複数人数応募であれば日本語だけのグループになることもできます。<section end="announcement-header" /> == <section begin="announcement-content" /> :''[[m:Special:MyLanguage/Leadership Development Working Group/Participate/Announcement/Reminder|このメッセージはMeta-wikiで他の言語に翻訳されています。]]'' :''<div class="plainlinks">[[m:Special:MyLanguage/Leadership Development Working Group/Participate/Announcement/Reminder|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Leadership Development Working Group/Participate/Announcement/Reminder}}&language=&action=page&filter= {{int:please-translate}}]</div>'' 皆さん、こんにちは。 ウィキメディア財団コミュニティ開発チームは、コミュニティ主導の[[m:Special:MyLanguage/Leadership Development Working Group|リーダーシップ開発ワーキンググループ]]の設立を支援しています。このワーキンググループの目的は、各コミュニティを活発にすることです。2022年2月にフィードバックが集められ、[[m:Special:MyLanguage/Leadership Development Working Group/Participate#5. Summary of Call for Feedback|フィードバックのまとめ]]がMeta-wikiに掲載されています。ワーキンググループへの参加募集は、2022年4月10日に締め切られます。ぜひ[[m:Special:MyLanguage/Leadership Development Working Group/Purpose and Structure#3. How is the working group formed and structured?|ワーキンググループの情報を確認]]して、興味を持ちそうなコミュニティメンバーに伝えてください。もちろん、[[m:Special:MyLanguage/Leadership Development Working Group/Participate#1. How to participate|興味のある方は応募]]してください。各言語ごとに活動を行うという計画になりました。編集を教えていらっしゃる方々、新しいことを考えていらっしゃる方々、是非、ご応募ください。 よろしくお願いします。 コミュニティ開発チームより<br/><section end="announcement-content" />--[[利用者:YShibata (WMF)|YShibata (WMF)]] ([[利用者・トーク:YShibata (WMF)|トーク]]) 2022年3月30日 (水) 06:17 (UTC) == <section begin="announcement-header />ユニバーサル行動規範Universal Code of Conduct(UCoC)施行ガイドライン批准投票結果<section end="announcement-header" /> == <section begin="announcement-content" /> : ''[[m:Special:MyLanguage/Universal Code of Conduct/Enforcement guidelines/UCoC Phase 2 Ratification Results Announcement|このメッセージはMeta-wikiで他の言語に翻訳されています。]]'' : ''<div class="plainlinks">[[m:Special:MyLanguage/Universal Code of Conduct/Enforcement guidelines/UCoC Phase 2 Ratification Results Announcement|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Universal Code of Conduct/Enforcement guidelines/UCoC Phase 2 Ratification Results Announcement}}&language=&action=page&filter= {{int:please-translate}}]</div>'' こんにちは、 先日行われた [[m:Special:MyLanguage/Universal Code of Conduct/Enforcement guidelines|Enforcement Guidelines for the Universal Code of Conduct (UCoC)]] のコミュニティ投票に参加した2,300人以上のウィキメディアンに感謝いたします。 ボランティアである精査グループが投票の正確性について検証を終えました。[[m:Special:MyLanguage/Universal Code of Conduct/Enforcement guidelines/Voting/Results|''最終結果はMeta-wikiで入手できます'']]。簡単な要約は以下の通りです。 * 58.6% Yes, 41.4% No * 貢献者の方々は、128 home wikis から投票しました * 30を超える言語で行われました この結果が意味していること、それは理事会がこの文書を見直す可能性に十分な支持があるということです。施行ガイドラインが自動的に完成したというわけではないということです。 したがってプロジェクトチームは、投票プロセスで提供されたコメントを照合・要約し、メタウィキ上で公開します。施行ガイドラインは、理事会に提出され、その審議に付されます。理事会は、投票時に寄せられた意見を検討し、ガイドラインにさらなる改良が必要な点を検討します。これらのコメントと、メタウィキや他のコミュニティとの対話を通じて提供された意見はガイドラインを改訂するための出発点となります。 理事会が批准に踏み切った場合、UCoCプロジェクトチームは、ガイドラインの具体的な提案の支援を開始する予定です。その中には、コミュニティメンバーと共にU4C構築委員会を立ち上げること、研修に関する協議を開始すること、報告システムの改善に関する話し合いをサポートすることなどが含まれます。まだまだやるべきことはたくさんありますが、次のフェーズに進むことができそうです。 この方針と施行ガイドラインがコミュニティのためにどのように機能するかを考えるために、多くの人々が参加しました。この一年間さまざまな形でプロジェクトに関わったウィキメディアンが提示した、ガイドラインに概説された強力な提案の詳細について、引き続き共同作業を行います。 改めて、本施行ガイドラインの投票にご参加いただいた皆様に感謝申し上げます。 詳細は [[m:Special:MyLanguage/Universal Code of Conduct/Enforcement guidelines/Voting/Results|the Results page]]をご覧ください。 これからもよろしくお願いいたします、 [[User:SNg (WMF)]] UCoC プロジェクトチームを代表してStella Ng Senior Manager, Trust and Safety Policy<br/><section end="announcement content" /> 翻訳と投稿--[[利用者:YShibata (WMF)|YShibata (WMF)]] ([[利用者・トーク:YShibata (WMF)|トーク]]) 2022年4月6日 (水) 07:11 (UTC) == [[User:LINE VITMAX]]という方について == あのー,つい最近,この方がブロックされて,ブックスで2本,バーシティで一本この方の不適切投稿を目にしたのですが,まあバーシティのほうはともかく,こっちの方では何故一本しか管理者の方は差し戻ししないのでしょうか^^;;;?。私はこの投稿を最初に見た時,ゲームの方ね,もう面倒だし面白いから,このままにしておこうかなんて思ったんですが^^;;;,でも管理者の方は立場が違いますよね?まあその意図も分からないではないけど^^;;;。でも私も生活がいろいろあって,そんなにこのサイトにがっぷり関わってはいられないので,しばらくはここ,差し戻しとか更新しませんよ。だから対策考えるとしたら,次に本文直してアップする時になりますね。ではでは,以上業務連絡でした。(^^)/--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2022年4月6日 (水) 16:54 (UTC) あっそうだ,よく考えたら,つい最近すじにく氏の動向に変化有ったので,ゲームはしばらく休んで経済行こうかなーとも思っていたんですよ。どっちにしろ,継続して2分野にしかかかわらない,2ページですね,メインとしてはですが…。だから方針変えて,ゲームの方は差し戻ししておきます。ではでは。--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2022年4月6日 (水) 17:01 (UTC) == <section begin="announcement-header" />運動戦略と組織統治ニュース – 記事 6<section end="announcement-header"/> == <section begin="ucoc-newsletter"/> <div style = "line-height: 1.2"> <span style="font-size:200%;">'''運動戦略と組織統治ニュース'''</span><br> <span style="font-size:120%; color:#404040;">'''2022年4月 記事6'''</span><span style="font-size:120%; float:right;">[[m:Special:MyLanguage/Movement Strategy and Governance/Newsletter/6|'''ニュースレター全文はこちら''']]</span> ---- 運動戦略と組織統治ニュース第6号へようこそ。この刷新されたニュースレターでは、運動憲章、輸入、運動戦略を実施するための助成金、理事会選挙、その他MSGに関連するニュースやイベントを配信しています。 このニュースレターは四半期ごとに配信され、より頻度の高いアップデートも毎週配信される予定です。本ニュースレターの配信を希望される方は、[[m:Special:MyLanguage/Global message delivery/Targets/MSG Newsletter Subscription|こちら]]にご登録下さい。 </div><div style="margin-top:3px; padding:10px 10px 10px 20px; background:#fffff; border:2px solid #808080; border-radius:4px; font-size:100%;"> *'''リーダーシップ開発 -''' ワーキンググループが結成されます! 2022年4月10日に募集を締め切った「リーダーシップ開発ワーキンググループ」に、最大12名のコミュニティメンバーが参加することが決定しました。([[:m:Special:MyLanguage/Movement Strategy and Governance/Newsletter/6#A1|続きを読む]]) *'''ユニバーサル行動規範の批准結果発表 -''' 3月7日から21日にかけて、SecurePollによるUCoCの施行に関するグローバルな意思決定プロセスが行われました。少なくとも128のホームプロジェクトから2,300人以上の有権者が意見・コメントを寄せました。([[:m:Special:MyLanguage/Movement Strategy and Governance/Newsletter/6#A2|続きを読む]]) *'''ハブをめぐる運動論議-''' 3月12日(土)、地域・テーマ別ハブに関するグローバル対話イベントが開催され、運動全体から84名の多様なウィキメディアンが参加しました。([[:m:Special:MyLanguage/Movement Strategy and Governance/Newsletter/6#A3|続きを読む]]) *'''運動戦略のための助成金、引き続き募集中! -''''' 今年に入ってから、6件、総額約8万ドルの提案が承認されています。運動戦略プロジェクトのアイデアはありませんか?声をかけてください。([[:m:Special:MyLanguage/Movement Strategy and Governance/Newsletter/6#A4|続きを読む]]) *運動憲章起草委員会が発足しました。-''' 2021年10月に選出された15名の委員からなる委員会は、その活動に不可欠な価値観や方法について合意し、運動憲章草案の概要作成に着手しています。([[:m:Special:MyLanguage/Movement Strategy and Governance/Newsletter/6#A5|続きを読む]]) *'''週刊運動戦略のご紹介 -'''。投稿と購読をお願いします - MSGチームは、メタウィキ上の様々な運動戦略ページに接続された更新ポータルを立ち上げたところです。購読していただくと、現在進行中の様々なプロジェクトに関する最新のニュースを入手することができます。([[:m:Special:MyLanguage/Movement Strategy and Governance/Newsletter/6#A6|続きを読む]]) *'''Diff Blogs -'''Wikimedia DiffでUCoCに関する最新の出版物をチェックしてください。 ([[:m:Special:MyLanguage/Movement Strategy and Governance/Newsletter/6#A7|続きを読む]]) </div><section end="ucoc-newsletter"/>読んでくださってありがとうございます--[[利用者:YShibata (WMF)|YShibata (WMF)]] ([[利用者・トーク:YShibata (WMF)|トーク]]) 2022年4月13日 (水) 06:44 (UTC) == <section begin="announcement-header" />ウィキメディア財団の年次計画をめぐり、マリアナ・イスカンダーと話しませんか<section end="announcement-header" /> == <section begin="announcement-content" /> :[[m:Special:MyLanguage/Wikimedia Foundation Annual Plan/2022-2023/Conversations/Announcement|''このメッセージはメタウィキ(Meta-wiki)で他の言語に翻訳されています。'']] :''<div class="plainlinks">[[m:Special:MyLanguage/Wikimedia Foundation Annual Plan/2022-2023/Conversations/Announcement|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Wikimedia Foundation Annual Plan/2022-2023/Conversations/Announcement}}&language=&action=page&filter= {{int:please-translate}}]</div>'' こんにちは [[m:Special:MyLanguage/Movement Communications|運動意思疎通]]チーム<sup>※1</sup>と[[m:Special:MyLanguage/Movement Strategy and Governance|運動戦略・組織統治]]チーム<sup>※2</sup>では、'''[[m:Special:MyLanguage/Wikimedia Foundation Annual Plan/2022-2023/draft|2022-23年ウィキメディア財団年次計画]]'''すなわちウィキメディア財団のPOR<sup>※3</sup>(訳注:利害関係者の同意が必要な活動計画)をめぐり、皆さんと協議したいと考えます。(※:1=Movement Communications。2=Movement Strategy and Governance。3=plan of record。) これらの対話は、[[m:User:MIskander-WMF|マリアナ・イスカンダー]](Maryana Iskander)が進めてきた[[m:Special:MyLanguage/Wikimedia Foundation Chief Executive Officer/Maryana’s Listening Tour|ウィキメディア財団最高経営責任者の聴き取りツアー]]の延長線上にあります。 対話では次の質問を取り上げます。 * [[m:Special:MyLanguage/Wikimedia 2030|2030年ウィキメディア運動戦略]]では、方向性として「サービスとしての知識」ならびに「知識の公平さ」を提唱しています。財団はこれら2つのゴールに従って計画を立てようとしています。財団がその業務において、これらをどのように適合させるべきでしょうか? * 財団は地域レベルでの働きかけにもっと優れた方法がないか探し続けています。たとえば助成金、新しい機能、コミュニティとの対話などの領域で地域単位に注目ポイントを増やしてきました。うまくいっているのはどれでしょう? 改善できるとしたら、何かですか? * ウィキメディアの運動戦略過程にはどなたでも貢献ができます。皆さんの活動や発想、要望、実地に体験から学んだことを出し合いませんか。運動戦略の活動を進めているボランティアや提携団体の皆さんを、どうやったらウィキメデア財団はもっとうまくサポートできそうでしょうか? 日時は [[m:Special:MyLanguage/Wikimedia Foundation Annual Plan/2022-2023/draft/Your Input|'''Meta-wiki''']]でご覧ください。 情報は複数言語で提供します。どの会議もどなたでも参加できます。中には逐次通訳を用意する会議もあります。 どうぞよろしくお願いいたします。<br /><section end="announcement-content" />--[[利用者:YShibata (WMF)|YShibata (WMF)]] ([[利用者・トーク:YShibata (WMF)|トーク]]) 2022年4月15日 (金) 08:44 (UTC) ==財団の新年度計画についてトップと話しませんか。4月24日日曜16:00(プロの同時通訳が付く予定です)== 直前の節をご覧いただければありがたいです。日本語コミュニティのために力をおかしください。 [[metawiki:Wikimedia_Foundation_Annual_Plan/2022-2023/draft/Goals/ja|「多言語にわたる740以上のウィキメディア・プロジェクトが増え続ける中、財団の現在の支援にどのように優先順位をつけるべきか」]]<blockquote>上記リンクの中には「 偽情報とどう戦うか」「世界のさまざまな地域の~中略~耳を傾けることから1年をスタートさせます」「優先順位の議論」「財団全体での翻訳・通訳サービス」「今後数ヶ月の間に」と書かれています。</blockquote> [[metawiki:Wikimedia_Foundation_Chief_Executive_Officer/Maryana’s_Listening_Tour/ja|トップ]]は約六カ月前に就任しました。「[[metawiki:Wikimedia_Foundation_Chief_Executive_Officer/Maryana’s_Listening_Tour/External_Trends/ja|人々が検索するものが変わってきています。利用者は、検索クエリに対する答えをリッチコンテンツ(画像、ビデオ、オーディオ形式など)に求めるようになってきています。]]」<blockquote>上記リンクの中で、以下の内容などについて'''ご意見を記入'''できます。 「従来のテキスト検索によるトラフィックのほとんどに依存しているプラットフォームとして、検索行動のこれらのシフトは、私たちの現在および将来にとって何を意味するのでしょうか?」 「自分の言語には無いコンテンツを検索するユーザーは、機械翻訳されたウェブサイトコンテンツ(ウィキペディアを含む)を目にする機会が増えています」 「ウィキメディアのプロジェクトは、どのようにすれば関連するローカル言語の知識のギャップを確実に埋めることができるでしょうか。 他のプラットフォームとは異なる、私たちのコミュニティ主導のコンテンツ作成モデルについて、どのように認識を高め続けることができるでしょうか」 「偽情報と誤報が増加」 「Google と Facebook は、ウィキペディアのホバーカードを使用して、誤解を招く可能性のある情報に対してより多くのコンテキストを提供」 「誤報や偽情報がウィキメディア・プロジェクトや他のプラットフォーム上の情報の質を脅かしている中、より広い知識のエコシステムにおける偽情報への対処において、ウィキメディア運動が果たすべき役割があるとすれば、それは何でしょうか」</blockquote> 年次計画についてのご意見はこちらにお願いいたします[https://meta.wikimedia.org/wiki/Talk:Wikimedia_Foundation_Annual_Plan/2022-2023/draft] '''参加方法''' 24日については、事前の登録は不要です。下にある全日程のリンクをクリックし、●右をクリックするとズームにつながります。--[[利用者:YShibata (WMF)|YShibata (WMF)]] ([[利用者・トーク:YShibata (WMF)|トーク]]) 2022年4月18日 (月) 08:39 (UTC) [[metawiki:Wikimedia_Foundation_Annual_Plan/2022-2023/draft/Your_Input/ja|4月24日を含む全日程]]<blockquote> 21日の理事との話し合いについて、日本語コミュニティの一人から通訳の依頼が担当者にあったそうです。その担当者から、「YShibata ではないですね」という確認がありました。私は内部でいろいろな機会をとらえては日本語のチャンスを頼んできましたが、他の多くの言語でも同様です。そのため、利用者の方々からの働きかけが最も効果的です。私ではないと分かったので通訳派遣会社に依頼をするそうです。 日本語コミュニティ利用者の方々の働きかけの大きさが発揮されたのがユニバーサル行動規範の施行ガイドライン投票です。どなたが何を書いたのかは誰にもわかりませんが、日本語コミュニティから81人が投票しました。全体として賛成が反対を上回った(わずか)にもかかわらず、文言修正(コメントを参照しながら)になりました。 </blockquote>[[metawiki:Wikimedia_Foundation_Chief_Executive_Officer/Maryana’s_Listening_Tour/Overview/ja|すべてのメッセージをMaryanaに伝えます(必要に応じて翻訳もします)]]。(お手数をおかけしますがスクロールダウンをして真ん中あたりです) [[metawiki:Wikimedia_Foundation_Chief_Executive_Officer/Maryana’s_Listening_Tour/Overview/ja|もし、トップのMaryanaをイベントに招待したい場合]]は、movementcomms@wikimedia.orgでご連絡ください。なお、Maryanaはできるだけ多くの人に会うようにしていますが、すべてのイベントに参加できない可能性があります。 --[[利用者:YShibata (WMF)|YShibata (WMF)]] ([[利用者・トーク:YShibata (WMF)|トーク]]) 2022年4月15日 (金) 08:45 (UTC) == <section begin="announcement-header" />次のステップ: ユニバーサル行動規範(Universal Code of Conduct略UCoC)およびUCoC施行ガイドライン<section end="announcement-header" /> == <section begin="announcement-content" /> :''<div class="plainlinks">[[m:Special:MyLanguage/Wikimedia Foundation Board noticeboard/April 2022 - Board of Trustees on Next steps: Universal Code of Conduct (UCoC) and UCoC Enforcement Guidelines|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Wikimedia Foundation Board noticeboard/April 2022 - Board of Trustees on Next steps: Universal Code of Conduct (UCoC) and UCoC Enforcement Guidelines}}&language=&action=page&filter= {{int:please-translate}}]</div>'' ウィキメディア財団理事会のコミュニティアフェアーズ委員会は、先日行われた「ユニバーサル行動規範(UCoC)」の施行ガイドラインについてコミュニティの投票に参加された皆様に感謝いたします。 ボランティア精査班が投票の正確性の検証を終えました。総投票数は2,283票でした。2,283票のうち、1,338人(58.6%)が施行ガイドラインに賛成、945人(41.4%)が反対です。また、658名の方からコメントをいただき、そのうち77%が英語でのコメントでした。 敵対的で有害な行為を止めさせるため、また、そのような行為の標的となった人々を支援し、ウィキメディアのプロジェクトにおいて善意の人々が生産的になるよう、安全で歓迎すべき文化を創造するためにコミュニティメンバーが示した情熱と献身に感謝いたします。 寄せられたコメントには、ガイドラインが未完成な段階であるとも述べられています。理事会が検討するのに必要な支持率に達しましたが、コミュニティの懸念に対応するため、さらなる編集を開始することが望ましいと思われる場合には、賛否にかかわらず、修正が必要だと思われる要素とその理由についてご意見を提供するよう、有権者に呼び掛けていました。 その結果、コミュニティアフェアーズ委員会として、財団に草案作成委員会を再開し、先日の投票で寄せられたコミュニティの意見をもとに、施行ガイドラインを改良するため、再度コミュニティ参加を行うよう要請することを決定しました。 ご意見は4つのセクションに分類しています。 # 研修の種類、目的、適用範囲を明確にすること。 # 専門家でない人が翻訳や理解をしやすいように、言葉を単純化すること。 # affirmation(訳注:日本語コミュニティでも多くのご意見が出ました)という概念について、その是非を含めて探求すること。 # プライバシー/被害者保護と聞く権利の相反する役割を見直すこと。 対話の中で、また特に施行ガイドラインの草案が進化する中で、他の問題が浮上するかもしれませんが、これらを有権者が懸念する主要な分野と見なし、これらの問題の検討を促進するよう、委員会はスタッフに求めています。さらなる関与の後、財団は、改訂された施行を評価するためにコミュニティ投票を再度行い、新しい文書が公式に批准する準備ができているかどうかを確認する必要があります。 さらに、ユニバーサル行動規範方針(Policy)の注釈(note)3.1に対する懸念も認識しています。年末に予定されている方針全体の見直しを待たずに、方針が安全で包括的なコミュニティを支援するという目的を満たすよう、文言の見直しを促進するよう委員会は財団に指示しています。 参加された皆様には、このような重要かつ困難な課題について考えていただき、運動全体でより良い協力関係を築くために貢献していただいたことに、改めて感謝いたします。<br /><section end="announcement-content" /> これからもよろしくお願いいたします Rosie Rosie Stephenson-Goodknight (she/her) コミュニティ事案委員会長代理 ウィキメディア財団 理事会 (当初、上記署名が翻訳フォーマットに無かったため混乱させてしまったことをお詫び申し上げます。)訳・掲載[[利用者:YShibata (WMF)|YShibata (WMF)]] ([[利用者・トーク:YShibata (WMF)|トーク]]) 2022年4月18日 (月) 23:54 (UTC) == <section begin="announcement-header" />2022年理事会選挙候補者の募集<section end="announcement-header" /> == <section begin="announcement-content" /> :''[[m:Special:MyLanguage/Wikimedia Foundation elections/2022/Announcement/Call for Candidates/Short|このメッセージはMeta-wikiで他の言語に翻訳されています。]]'' :''<div class="plainlinks">[[m:Special:MyLanguage/Wikimedia Foundation elections/2022/Announcement/Call for Candidates/Short|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Wikimedia Foundation elections/2022/Announcement/Call for Candidates/Short}}&language=&action=page&filter= {{int:please-translate}}]</div>'' 理事会は2022年理事選挙の候補者を募集しています。[[m:Special:MyLanguage/Wikimedia_Foundation_elections/2022/Announcement/Call_for_Candidates|'''続きはメタウィキをご参照ください''']]。 [[m:Special:MyLanguage/Wikimedia Foundation elections/2022|2022年理事会選挙]]はこちら! 理事への立候補をご検討ください。 ウィキメディア財団理事会は、ウィキメディア財団の運営を監督します。コミュニティおよび提携団体から選ばれた理事と、理事会が任命した理事が理事会を構成します。各理事の任期は3年です。ウィキメディアコミュニティには、投票によりコミュニティ兼提携団体出身の理事を選ぶ機会があります。 ウィキメディアコミュニティは、2022年に理事会の2つの議席を埋めるために投票を行います。チームとしての理事会の代表性、多様性、専門性を向上させるチャンスです。 どのような人が候補になるのでしょうか? ご自身はいかがでしょうか? 詳しくは[[m:Special:MyLanguage/Wikimedia Foundation elections/2022/Apply to be a Candidate|立候補のページ]]でご確認ください。 ご協力ありがとうございます。 選挙管理委員会と理事会に代わり、運動戦略と組織統治チーム一同<br /><section end="announcement-content" /> [[Category:Wikimedia Foundation Board of Trustees]] [[Category:Wikimedia Foundation elections 2022]] --[[利用者:YShibata (WMF)|YShibata (WMF)]] ([[利用者・トーク:YShibata (WMF)|トーク]]) 2022年4月26日 (火) 14:30 (UTC) == Coming soon: Improvements for templates == <div class="plainlinks mw-content-ltr" lang="ja" dir="ltr"> <!--T:11--> [[File:Overview of changes in the VisualEditor template dialog by WMDE Technical Wishes.webm|thumb|テンプレートのダイアログに根本的な変更を施します。]] こんにちは、まもなく皆さんのウィキに以下のテンプレート系の変更を展開する予定ですのでお知らせします。 [[mw:Special:MyLanguage/Help:VisualEditor/User guide#Editing templates|ビジュアルエディターには'''テンプレートのダイアログ ''']](VisualEditor)を、[[mw:Special:MyLanguage/2017 wikitext editor|2017年ウィキ文エディター]](ベータ版)には'''根本からの改善を'''それぞれご用意しています。 これはテンプレートに書き込むべきこと、テンプレートの各部の読み方やそれぞれの変数の追加方法<!-- how to navigate the template, and how to add parameters. -->について、利用者の皆さんの理解を助けるものです。 * それぞれのリンクは[[metawiki:WMDE Technical Wishes/VisualEditor template dialog improvements|プロジェクトページ]]、[[metawiki:Talk:WMDE Technical Wishes/VisualEditor template dialog improvements|トークページ]]をご参照ください。 '''構文強調表示'''機能([[mw:Special:MyLanguage/Extension:CodeMirror|CodeMirror]] 拡張機能) では、利用者設定にて'''色覚にやさしい'''配色を選べるようになりました。 * リンクはそれぞれ[[metawiki:WMDE Technical Wishes/Improved Color Scheme of Syntax Highlighting#Color-blind_mode|プロジェクトページ]]、[[metawiki:Talk:WMDE Technical Wishes/Improved Color Scheme of Syntax Highlighting|トークページ]]をご参照ください。 展開は5月10日を予定しています。これは[[m:WMDE Technical Wishes|WMDE 技術要望]](ウィキメディア・ドイツ協会)発信では「[[m:WMDE Technical Wishes/Templates|テンプレート]]」系改善の一連の最後になります。 ぜひ皆さんからのフィードバックをトークページにてお聞かせください。 </div> -- [[m:User:Johanna Strodt (WMDE)|Johanna Strodt (WMDE)]] 2022年4月29日 (金) 11:13 (UTC) <!-- User:Johanna Strodt (WMDE)@metawiki が https://meta.wikimedia.org/w/index.php?title=WMDE_Technical_Wishes/Technical_Wishes_News_list_all_village_pumps&oldid=23222263 のリストを使用して送信したメッセージ --> == 編集機能ニュース 2022年第1号 == <section begin="message"/><i>[[metawiki:VisualEditor/Newsletter/2022/April|他の言語で読む]] • [[m:VisualEditor/Newsletter|この多言語版ニュースレターの購読者名簿]]</i> [[File:Junior Contributor New Topic Tool Completion Rate.png|thumb|編集初学者はこの新しいツールを使ったほうが編集の失敗が減りました。]] [[mw:Special:MyLanguage/Help:DiscussionTools#New discussion tool|新しい主題ツール]]<!-- New topic tool -->を使うと、編集者が議論のページに新しい <nowiki>==節(見出し)==</nowiki> を作りやすくなります。 この新しいツールを使うと、編集初学者の編集が保持されやすくなります。 <span class="mw-translate-fuzzy">状況報告は[[mw:Talk pages project/New topic#21 April 2022|こちら]]にあります。</span> 間もなく編集チームはこの試験に参加する20個のウィキペディアの編集者全員にこのことを要請します。 無効にするには[[Special:Preferences#mw-prefsection-editing-discussion|個人設定]]で指定してください。<section end="message"/> [[User:Whatamidoing (WMF)|Whatamidoing (WMF)]] 2022年5月2日 (月) 18:55 (UTC) <!-- User:Quiddity (WMF)@metawiki が https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/VisualEditor/Newsletter/Wikis_with_VE&oldid=22019984 のリストを使用して送信したメッセージ --> == <section begin="announcement-header" />ウィキメディア財団理事会2022年選挙 - ボランティア募集<section end="announcement-header" /> == <section begin="announcement-content" /> :''[[m:Special:MyLanguage/Movement Strategy and Governance/Election Volunteers/2022/Call for Election Volunteers|このメッセージはMeta-wikiで他の言語に翻訳されています。]]'' :''<div class="plainlinks">[[m:Special:MyLanguage/Movement Strategy and Governance/Election Volunteers/2022/Call for Election Volunteers|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Movement Strategy and Governance/Election Volunteers/2022/Call for Election Volunteers}}&language=&action=page&filter= {{int:please-translate}}]</div>'' 運動戦略と組織統治チームでは、理事会選挙の選挙ボランティアとしてローカルで活動していただける方々を募集しています。 選挙ボランティアのアイデアは、2021年ウィキメディア理事会選挙で出てきました。効果がありました。選挙ボランティアのおかげで2017年と比較し、投票者は1,753人増加しました。 全体の投票率は1.1ポイント増の10.13%でした。214のウィキが選挙に反映されました。 2017年に参加しなかった合計74のウィキから、2021年の選挙では投票者があらわれました。今年も投票者を増やすために力を貸していただけませんか? 選挙ボランティアは、以下のような分野で活躍します。 * 短いメッセージを翻訳し、ご自身のコミュニティで進行中の選挙プロセスを告知。 * 任意。ご自身のコミュニティでのコメントや質問のモニター ボランティアは、 * 対話やイベントの際に、フレンドリーな空間ポリシーを維持させます。 * ガイドラインや投票情報を中立的な立場でコミュニティーに提示します。 選挙ボランティアになり、ご自身のコミュニティが投票で反映されるようにしませんか?[[m:Special:MyLanguage/Movement Strategy and Governance/Election Volunteers/About|こちら]] に登録して最新情報を受け取りましょう。翻訳に関する質問は、[[m:Special:MyLanguage/Talk:Movement Strategy and Governance/Election Volunteers/About|トークページ]]をご利用ください。<br /><section end="announcement-content" />--[[利用者:YShibata (WMF)|YShibata (WMF)]] ([[利用者・トーク:YShibata (WMF)|トーク]]) 2022年5月6日 (金) 10:48 (UTC) == ウィキブックスの整理 == もう実行されているものもあるかもしれませんが # <code><nowiki>{{UserAN}}</nowiki></code>テンプレートの作成 # CU、OS、その他管理者の下位権限(巻き戻し者,削除者、インターフェース管理者など)の方針の明記 # 依頼関連の整備 # [[Wikibooks:コメント依頼]]の作成 最後に,これが1番の難題ですが : 5. 利用者の増加 1については、ブロックを実行しやすくするためです。[[w:WP:AN/I]]で採用されているものは,「ブロック」リンクがついています。 2は、ソックパペットの確認、機密情報の秘匿化などを実施するためです。Wikipediaに準じたものでいいと思います。下位権限などは必要であればといったところでしょうか。 3は投稿ブロック依頼,削除依頼などですね。依頼ごとに個別のサブページを作り,合意が形成されればその通りに対処を行う。削除依頼などには合意形成がなされているのに未対処という案件も少々あります。また、サブページを作れば依頼の可読性がアップします。投稿ブロック依頼などにはサブページを作ったり作らなかったりとまちまちです。 4はコメント依頼の必要性です。特に利用者の行為については,会話ページ,ノートページなどで議論するわけにも行きません。ですが先述の通り,コメント依頼は赤リンクです。合意形成,またトラブルの円滑な処理、[[w:Wikipedia:論争の解決]]の観点から見てもコメント依頼は必要であると感じます。 5番は難しいですが,まあ今いる我々がプロジェクトをでかくしていけば自然に参加する人も増えてくると思います。--[[利用者:スタリオン箕浦|スタリオン箕浦]] <small>([[利用者・トーク:スタリオン箕浦|会話]]/[[特別:投稿記録/スタリオン箕浦|投稿記録]]/[[特別:Log/スタリオン箕浦|ログ]]/[[特別:メール送信/スタリオン箕浦|メール]])</small> 2022年5月8日 (日) 04:26 (UTC) :こんばんはー。私はルール関係の整備にはあまり興味なくて,むしろあいまいなほうが書きやすいなーなどとも思っています。参加人員はどうですかね。むかしはここ,もう少し盛況だったんですが,様々な理由で活動休止された方が多くなってしまいましたね…。ところでサイト形式の整備はいいんですが,例えば私と先輩のブロック依頼なんて,構造が複雑になってしまって,あまり良くない状態ですよ…。そうですね,目指している版削除が仮になされれば,少しすっきり纏められるでしょうけどね…。まあ仕方ないですね,どっちにしろブロック依頼もコメント依頼もあまりこの先進展有るようにも見えませんしね…--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2022年5月8日 (日) 09:36 (UTC) ::(返信) 利用者が少ないゆえに綿密な対応ができないのが1番の課題ですね。--[[利用者:スタリオン箕浦|スタリオン箕浦]] <small>([[利用者・トーク:スタリオン箕浦|会話]]/[[特別:投稿記録/スタリオン箕浦|投稿記録]]/[[特別:Log/スタリオン箕浦|ログ]]/[[特別:メール送信/スタリオン箕浦|メール]])</small> 2022年5月8日 (日) 10:13 (UTC) :::綿密な対応ってそんな重要?--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2022年5月8日 (日) 10:18 (UTC) ::::(返信)利用者が多ければその分視点が広がるので,緻密な対応が可能でしょう。対応がきめ細かければ,トラブルも円滑に処理できるのではないでしょうか。--[[利用者:スタリオン箕浦|スタリオン箕浦]] <small>([[利用者・トーク:スタリオン箕浦|会話]]/[[特別:投稿記録/スタリオン箕浦|投稿記録]]/[[特別:Log/スタリオン箕浦|ログ]]/[[特別:メール送信/スタリオン箕浦|メール]])</small> 2022年5月8日 (日) 13:22 (UTC) :::::うーん,そう,かも,知れないですね…。ただ私の感覚では人数が多かろうが少なかろうが,駄目なものは駄目,通るものは通る。トラブルから完全に逃れて生きる事も出来ないしね…。--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2022年5月8日 (日) 16:15 (UTC) :一応,コメント依頼は私がWikipediaを参考に作ります。1週間待って異論が出なければ実行に移ります。--[[利用者:スタリオン箕浦|スタリオン箕浦]] <span style="font-family:Times"><small>([[利用者・トーク:スタリオン箕浦|会話]]/[[特別:投稿記録/スタリオン箕浦|投稿記録]]/[[特別:Log/スタリオン箕浦|ログ]]/[[特別:メール送信/スタリオン箕浦|メール]])</small></span> 2022年5月9日 (月) 23:33 (UTC) ::WikibooksよりはWikipediaの方が盛況ですしね、、、、--[[利用者:ドラみそブックス|ドラみそブックス]] ([[利用者・トーク:ドラみそブックス|トーク]]) 2022年5月10日 (火) 01:26 (UTC) ::{{コメント2|コメント}} 同じ提案は過去にもなされたことがありますが、結局合意には至っておりません。スタリオン箕浦さんも「1週間待って」ではなく過去の議論も参考にし、まさに「合意形成」がされてから実行に移った方がよいと思います。--[[利用者:Shokupan|Shokupan]] ([[利用者・トーク:Shokupan|トーク]]) 2022年5月15日 (日) 10:19 (UTC) :::{{コメント2|返信}} [[User:Shokupan|Shokupan]]様、過去の提案がいくら探しても見つかりません。--[[利用者:スタリオン箕浦|スタリオン箕浦]] <span style="font-family:Times"><small>([[利用者・トーク:スタリオン箕浦|会話]]/[[特別:投稿記録/スタリオン箕浦|投稿記録]]/[[特別:Log/スタリオン箕浦|ログ]]/[[特別:利用者権限/スタリオン箕浦|権限]]/[[特別:メール送信/スタリオン箕浦|メール]])</small></span> 2022年7月18日 (月) 02:59 (UTC) == 資金の分配を決める委員を募集中(日本語コミュニティを含むアジア太平洋地域を担当) == エディタソンなどを行う際の交通費などへの助成等、決定権限は、[[metawiki:Grants:Committees/ja|それぞれの地域の地域委員会]]に属します。日本語コミュニティからの申請を[[metawiki:Grants:Regions/ESEAP/ja|審査する委員(利用者)一覧]] は現在、5人ですが新たな方を募集中です。 交通費などの他、日本語コミュニティからの委員がいれば重要な書類・ミーティングでの通訳について翻訳会社・通訳会社へとの契約を確実にすることができます。 担当者が「ウィキメディア運動の意義を理解する方、文化的・言語的・性的多様性の観点から募集しています 」とのことで、多様性の点で、日本語コミュニティの参加が無いことを心配しています。費用の請求フォーマット、公式ウェブサイト、年度計画、収支報告書など、重要な文書に日本語版がありません。柴田は財団内部で大勢の人に掛け合っていますが、お金の使い方など、重要なことは利用者による委員会が決めます。財団内部の人間ではありません。 興味を持ってくださる方は、ESEAP シニア プログラム オフィサーのジャクリーン・チェン(上記担当者、二番目のリンクに写真が載っています); jchen@wikimedia.orgにご連絡ください。 締め切りは 31 May 2022年5月31日です。--[[利用者:YShibata (WMF)|YShibata (WMF)]] ([[利用者・トーク:YShibata (WMF)|トーク]]) 2022年5月10日 (火) 15:29 (UTC) == 移動依頼 == どなたか記事[[エスニックジョーク]]を[[ジョーク集/エスニックジョーク]]へ移動お願いします。--[[特別:投稿記録/240F:7A:EA2E:1:7865:36BF:53E8:693E|240F:7A:EA2E:1:7865:36BF:53E8:693E]] 2022年5月15日 (日) 10:36 (UTC) :基本的には、合意の必要のない整備は、気づいた人が自分でやるのが基本です。各種ヘルプを参照すれば、たいていの人は大抵のことが出来る。それでもできないのであれば仕方ないですが…--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2022年5月19日 (木) 15:13 (UTC) :私が作った記事なので、移動したいですが、--[[利用者:ドラみそ|ドラみそ]] ([[利用者・トーク:ドラみそ|トーク]]) 2022年6月24日 (金) 10:13 (UTC) * {{cmt|報告}} - <del>依頼者は自動承認されていないので<code>move</code>権限がありません。</del>初版立項者のアカウントから「移動したい」との意思表示が<ins>あり、なおかつ他に編集された方がいなかった</ins>ため代わりに移動しておきました。--[[利用者:春春眠眠|春春眠眠]] ([[利用者・トーク:春春眠眠|トーク]]) 2022年6月24日 (金) 10:44 (UTC)<small>一部修正--[[利用者:春春眠眠|春春眠眠]] ([[利用者・トーク:春春眠眠|トーク]]) 2022年6月24日 (金) 10:49 (UTC)</small><small>1部撤回</small> * 移動の残骸ですが、即時削除するか残すかは[[利用者:ドラみそ|ドラみそ]]さんにお任せします。即時削除するにせよ、こちらに関しては私はドラみそさんの意向を支持します。--[[利用者:春春眠眠|春春眠眠]] ([[利用者・トーク:春春眠眠|トーク]]) 2022年6月24日 (金) 11:26 (UTC) * よくよく確認したところ[[利用者:ドラみそ|ドラみそ]]さんは自動承認されているようでした。今回依頼したのはやり方が分からなかったからだと考えます。ですので、[[:w:ja:Help:ページの移動]]をご覧下さいとのご案内を致します。--[[利用者:春春眠眠|春春眠眠]] ([[利用者・トーク:春春眠眠|トーク]]) 2022年6月24日 (金) 12:25 (UTC) *:わかりました。--[[利用者:ドラみそ|ドラみそ]] ([[利用者・トーク:ドラみそ|トーク]]) 2022年6月27日 (月) 01:37 (UTC) == ユニバーサル行動規範Universal Code of Conduct(UCoC)施行ガイドライン批准投票でのコメントについて報告します == こんにちは、 ユニバーサル行動規範(UCoC)プロジェクトチームは、批准投票に伴うコメントの分析を完了しました。 2022年にUCoC施行ガイドライン草案が完成した後、ガイドラインについてウィキメディアン・コミュニティが投票しました。投票者は137のコミュニティにわたり、上位9つのコミュニティは英語、ドイツ語、フランス語、ロシア語、ポーランド語、スペイン語、中国語、日本語、イタリア語のウィキペディア、メタウィキです。 投票の際、草案の内容に対してコメントを提供する機会がありました。658名の参加者がコメントを残しました。コメントの77%は英語でした。投票者は24の言語でコメントを書き、最も多かったのは英語(508人)、ついでドイツ語(34人)、日本語(28人)、フランス語(25人)、ロシア語(12人)でした。 この報告書は改訂起草委員会に送られ、委員会は最近行われた投票から得られたコミュニティのご意見をもとに、施行ガイドラインを改良します。報告書の公開版は [[m:Special:MyLanguage/Universal Code of Conduct/Enforcement guidelines/Voting/Results#Summary|'''このMeta-wiki で公開''']] です。 この報告書はメタウィキで翻訳版が公開されています。 {{int:please-translate}} 投票や議論に参加された方々に改めて感謝申し上げます。是非、今後のコミュニティとの話し合いにご参加ください。ユニバーサル行動規範と施行ガイドラインの詳細については [[m:Special:MyLanguage/Universal Code of Conduct/Project|on Meta-wiki]] をご覧ください。 ユニバーサル行動規範プロジェクトチームを代表して<br /> (翻訳と投稿)--[[利用者:YShibata (WMF)|YShibata (WMF)]] ([[利用者・トーク:YShibata (WMF)|トーク]]) 2022年5月20日 (金) 07:18 (UTC) == イベントなどの費用の請求の仕方 == ウィキ'''ペ'''ディアに限らず、ウィキに関するエディタソンや講義、大学や学校での活動、ウィキペディアタウン、その他、費用請求の仕方についてご一読ください。 2022年4月15日に、請求の仕方が大幅に変わりました。以下は2022年5月31日の情報です。文書は英語が多く申し訳ないのですが、記入は日本語でかまいません。 === 助成金 === 個人でも、団体でも申請できます。 : 1. [https://meta.wikimedia.org/wiki/Grants:Programs/Wikimedia_Community_Fund/ja ウィキメディアコミュニティ基金] :: エディタソンやコンテスト、写真ウォーク、促進キャンペーンの運営に必要な一般的な経費として、作業場・集会室賃料、サービス経費、賞品、普及活動、オンラインのイベントへのアクセスを支える通信費用、主催者の旅費滞在費と参加費、グラフィックデザイン、トレーニング、託児サービス、翻訳、プロジェクト管理、ウィキメディアン・イン・レジデンスなど、ボランティア活動に取って代わるものではない役割に対する報酬など。 :: '''[https://wmf.fluxx.io/user_sessions/new 申請する]'''日本語記入でかまいません。 ::: ⋆随時助成金 = 短期、低予算(平均支給額 500 - 5,000 USD) ::: ⋆カンファレンスとイベント基金 = ウィキメディアンが集い経験の共有や技能開発、ネットワーク作りをする場を提供するもの(平均支給額 10,000 - 90,000 USD) ::: ⋆一般支援基金 = より規模の大きなプロジェクトもしくはプログラム、戦略計画を開発しそれぞれの目的達成のために増額した投資を長期に必要とするもの。複数年助成金支給も考慮(平均支給額10,000 - 300,000 USD) : 2. [https://meta.wikimedia.org/wiki/Grants:Programs/Wikimedia_Alliances_Fund/ja ウィキメディアアライアンス基金] :: 知識を入手することが困難な地域に住む人のためのプロジェクト : 3. [https://meta.wikimedia.org/wiki/Grants:Programs/Wikimedia_Research_%26_Technology_Fund/ja ウィキメディア研究技術基金] :: ⋆Research Fund終了 :: ⋆Technology Fund2022年中に開始 : 4. [https://meta.wikimedia.org/wiki/Grants:MSIG/About/ja 運動戦略を施行するための助成金] :: [https://meta.wikimedia.org/wiki/Movement_Strategy/Initiatives/ja 45のイニシアチブ]のいずれか一つを推進するため。(申請額は25,000USDまでを条件として募集します。これを超える金額の申請には、手続きを開始する前に運動戦略チームにご連絡をお願いします) :: '''[https://meta.wikimedia.org/wiki/Grants:MSIG/Apply/ja 申請する]''' : 5. [https://wikimania.wikimedia.org/wiki/Scholarships 奨学金(2022年8月から)] : 6. [https://meta.wikimedia.org/wiki/Knowledge_Equity_Fund 知識の公平性のための基金] ::: 「racial equity」のための基金です。 : 7. ウィキメディア・ハッカソン 助成金(終了) : 8. [https://outreach.wikimedia.org/wiki/Education/Tools_%26_Resources ウィキペディア教育のための助成金] 上記1から8までをまとめたページは[https://meta.wikimedia.org/wiki/Grants:Start/ja こちら]です。 === より多くの方々に支給されるであろう「1.ウィキメディアコミュニティ基金」の[[metawiki:Grants:FAQ/ja|助成金の審査の過程]] は次の通りです === :* 第1:応募 :* 第2:適格性の審査 :* 第3:プログラム管理者(複数)による審査 :* 第4:地域委員会による熟慮 :* 第5:地域委員会が審査結果を発表 :* 第6:助成金の支給 : 決定権限は、[[metawiki:Grants:Committees/ja|それぞれの地域の地域委員会]]に属します。地域委員会は各国語の利用者から構成されます。日本語コミュニティが属するEast, Southeast Asia, and Pacific (ESEAP)には現在5名の委員(利用者)がいます。 : 手続きとしては、「4. 運動戦略を施行するための助成金」の方が簡単です。 : 助成金の申請は、必要とする「一人の個人」または「グループ(代表者)」がしなければなりません。「グループ」は数人のグループでかまいません。 : 財団から口座に直接、お金が振り込まれます。「運動戦略の」助成金の場合(上記4)、申請から受け取りまで、法律上の氏名住所を伝える必要はありません。口座の名義人を公開しません。名義は任意団体でもかまいません。送金のためファイナンスのチームにのみ、個人データを開示する必要があります。--[[利用者:YShibata (WMF)|YShibata (WMF)]] ([[利用者・トーク:YShibata (WMF)|トーク]]) 2022年6月1日 (水) 00:53 (UTC) == <section begin="announcement-header" /> 2022年理事選挙候補者の募集<section end="announcement-header" /> == <section begin="announcement-content" /> :''[[m:Special:MyLanguage/Wikimedia Foundation elections/2022/Announcement/2022 Candidates for the Board of Trustees|このメッセージはMeta-wikiで他の言語に翻訳されています。]]'' :''<div class="plainlinks">[[m:Special:MyLanguage/Wikimedia Foundation elections/2022/Announcement/2022 Candidates for the Board of Trustees|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Wikimedia Foundation elections/2022/Announcement/2022 Candidates for the Board of Trustees}}&language=&action=page&filter= {{int:please-translate}}]</div>'' [[m:Special:MyLanguage/Wikimedia Foundation elections/2022|2022 理事会選挙]]候補者の募集は締め切りました。この募集により、コミュニティーから12名の候補者が応募しました。[[m:Special:MyLanguage/Wikimedia Foundation elections/2022/Candidates|2022 理事会選挙 候補者]]をご覧ください。 監査委員会は、今後、理事会から提供された技能などに関する基準により、候補者の申請書を検討します。理事会は、理事会の能力を向上させるために、一定の技能と能力を求めています。監査委員会が検討を終えた後、各候補者のランクが公表される予定です。これらのランクは、情報提供のみを目的としています。 2022年の理事会選挙について、タイムライン、投票情報、参加方法など [[m:Special:MyLanguage/Wikimedia Foundation elections/2022|Meta-wiki]] をご覧ください。 ご協力ありがとうございます。 選挙管理委員会と理事会に代わり、運動戦略と組織統治チーム一同 <br /><section end="announcement-content" />(翻訳と投稿)--[[利用者:YShibata (WMF)|YShibata (WMF)]] ([[利用者・トーク:YShibata (WMF)|トーク]]) 2022年6月2日 (木) 01:58 (UTC) == Results of Wiki Loves Folklore 2022 is out! == <div lang="en" dir="ltr" class="mw-content-ltr"> {{int:please-translate}} [[File:Wiki Loves Folklore Logo.svg|right|150px|frameless]] Hi, Greetings The winners for '''[[c:Commons:Wiki Loves Folklore 2022|Wiki Loves Folklore 2022]]''' is announced! We are happy to share with you winning images for this year's edition. This year saw over 8,584 images represented on commons in over 92 countries. Kindly see images '''[[:c:Commons:Wiki Loves Folklore 2022/Winners|here]]''' Our profound gratitude to all the people who participated and organized local contests and photo walks for this project. We hope to have you contribute to the campaign next year. '''Thank you,''' '''Wiki Loves Folklore International Team''' --[[利用者:MediaWiki message delivery|MediaWiki message delivery]] ([[利用者・トーク:MediaWiki message delivery|トーク]]) 2022年7月4日 (月) 16:12 (UTC) </div> <!-- User:Tiven2240@metawiki が https://meta.wikimedia.org/w/index.php?title=Distribution_list/Non-Technical_Village_Pumps_distribution_list&oldid=23454230 のリストを使用して送信したメッセージ --> == <span lang="en" dir="ltr" class="mw-content-ltr"> Upcoming activities for the 2022 Board of Trustees election</span> == <div lang="en" dir="ltr" class="mw-content-ltr"> <section begin="announcement-content" /> :''[[m:Special:MyLanguage/Wikimedia Foundation elections/2022/Announcement/Upcoming Activities| You can find this message translated into additional languages on Meta-wiki.]]'' :''<div class="plainlinks">[[m:Special:MyLanguage/Wikimedia Foundation elections/2022/Announcement/Upcoming Activities|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Wikimedia Foundation elections/2022/Announcement/Upcoming Activities}}&language=&action=page&filter= {{int:please-translate}}]</div>'' Hi all, This message covers two upcoming activities for the 2022 Board of Trustees election. The Board of Trustees election will have an Election Compass to support voters in their decision-making process. Eligible voters can propose statements in July and vote on which statements are used in the Election Compass in late July. Please visit the [[m:Special:MyLanguage/Wikimedia Foundation elections/2022/Community Voting/Election Compass|Election Compass page]] for more information. Join conversations with the 2022 Board of Trustees candidates July 27 to August 7. Each candidate will have a one hour conversation with the community. Each conversation will be recorded and made available for future viewing. Live interpretation will be available. Languages available will be announced when the dates are set. These conversations will be scheduled with the candidates once the results of the Affiliate Selection are available. That information will be shared on the [[m:Special:MyLanguage/Wikimedia Foundation elections/2022/Events|2022 Board of Trustees election campaign events]] page. Best, Movement Strategy and Governance on behalf of the Board Selection Task Force and the Elections Committee<br /><section end="announcement-content" /> </div> [[User:RamzyM (WMF)|RamzyM (WMF)]] 2022年7月11日 (月) 01:23 (UTC) <!-- User:RamzyM (WMF)@metawiki が https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery/ja&oldid=22374876 のリストを使用して送信したメッセージ --> == Announcing the six candidates for the 2022 Board of Trustees election == <section begin="announcement-content"/> :''[[m:Special:MyLanguage/Wikimedia Foundation elections/2022/Announcement/Announcing the six candidates for the 2022 Board of Trustees election| You can find this message translated into additional languages on Meta-wiki.]]'' :''<div class="plainlinks">[[m:Special:MyLanguage/Wikimedia Foundation elections/2022/Announcement/Announcing the six candidates for the 2022 Board of Trustees election|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Wikimedia Foundation elections/2022/Announcement/Announcing the six candidates for the 2022 Board of Trustees election}}&language=&action=page&filter= {{int:please-translate}}]</div>'' Hi everyone, I'm Vivien from the Movement Strategy and Governance team. My apologies for posting this in English; If any of you would be so kind to help translate the message to Japanese, we would really appreciate it! If you have any questions or concerns, please do not hesitate to reach out to us. I'm writing to inform you the Affiliate voting process has concluded. Representatives from each Affiliate organization learned about the candidates by reading candidates’ statements, reviewing candidates’ answers to questions, and considering the candidates’ ratings provided by the Analysis Committee. The selected 2022 Board of Trustees candidates are: * Tobechukwu Precious Friday ([[m:User:Tochiprecious|Tochiprecious]]) * Farah Jack Mustaklem ([[m:User:Fjmustak|Fjmustak]]) * Shani Evenstein Sigalov ([[m:User:Esh77|Esh77]]) * Kunal Mehta ([[User:Legoktm|Legoktm]]) * Michał Buczyński ([[m:User:Aegis Maelstrom|Aegis Maelstrom]]) * Mike Peel ([[m:User:Mike Peel|Mike Peel]]) You may see more information about the [[m:Special:MyLanguage/Wikimedia Foundation elections/2022/Results|Results]] and [[m:Special:MyLanguage/Wikimedia Foundation elections/2022/Stats|Statistics]] of this Board election. '''The next part of the Board election process is the community voting period.''' [[m:Special:MyLanguage/Wikimedia Foundation elections/2022#Timeline|You may view the Board election timeline here]]. To prepare for the community voting period, there are several things community members can engage with in the following ways: * [[m:Special:MyLanguage/Wikimedia Foundation elections/2022/Candidates|Read candidates’ statements]] and [[m:Special:MyLanguage/Wikimedia_Foundation_elections/2022/Affiliate_Organization_Participation/Candidate_Questions|read the candidates’ answers to the questions posed by the Affiliate Representatives]]. * [[m:Special:MyLanguage/Wikimedia_Foundation_elections/2022/Community_Voting/Questions_for_Candidates|Propose and select the 6 questions for candidates to answer during their video Q&A]]. * See the [[m:Special:MyLanguage/Wikimedia Foundation elections/2022/Candidates|Analysis Committee’s ratings of candidates on each candidate’s statement]]. * [[m:Special:MyLanguage/Wikimedia Foundation elections/2022/Community Voting/Election Compass|Propose statements for the Election Compass]] voters can use to find which candidates best fit their principles. * Encourage others in your community to take part in the election. Thank you, Movement Strategy and Governance ''This message was sent on behalf of the Board Selection Task Force and the Elections Committee'' </div><section end="announcement-content"/>--[[利用者:VChang (WMF)|VChang (WMF)]] ([[利用者・トーク:VChang (WMF)|トーク]]) 2022年7月20日 (水) 12:43 (UTC) bmaqoqhntadipg9krew45y2uukiq0fs オブジェクト指向 0 2771 205613 203554 2022-07-21T08:20:58Z Ef3 694 /* 継承 */ 承禁止にはいくつかの理由がありますが、大きく分けるとセキュリティと効率です。 悪意のあるプログラマが、本質的にセキュアである必要のあるオブジェクトを継承し、ロギング機能をインジェクトするかもしれません。この様な理由で、JavaのStringは final 修飾されています。継承される可能性のあるクラスのコードは、final class より Hook が付く分、実行効率が落ちます。 wikitext text/x-wiki {{stub}} <small>{{Pathnav|メインページ|工学|情報技術|プログラミング}}</small> {{Wikipedia|オブジェクト指向|オブジェクト指向}} {{Wikipedia|オブジェクト指向プログラミング|オブジェクト指向プログラミング}} オブジェクト指向(''Object-oriented'')は、多義的多態的な事物を表すための手法ですが、「オブジェクト指向」という言葉自体も適用される対象によって多義的多態的です。 * [[オブジェクト指向言語]]([[W:オブジェクト指向プログラミング#OOP言語]], ''[[W:en:W:en:Object-oriented programming|Object-oriented programming|Object-oriented programming languages]]'') * [[オブジェクト指向プログラミング]]([[W:オブジェクト指向プログラミング]], ''[[W:en:Object-oriented programming|Object-oriented programming]]'') * [[オブジェクト指向分析設計]]([[W:オブジェクト指向分析設計]], [[W:en:Object-oriented analysis and design|Object-oriented analysis and design]]) * [[オブジェクト指向開発方法論]](Object-oriented methodology) * [[オブジェクト指向ユーザーインターフェース]]([[W:オブジェクト指向ユーザーインターフェース]], [[W:en:Object-oriented user interface|Object-oriented user interface]]) * [[オブジェクト指向オペレーティング・システム]]([[W:en:Object-oriented operating system|Object-oriented operating system]]) == コード再利用の手法としての「オブジェクト指向」 == オブジェクト指向プログラミングは、先にデータセットを定義し、それを操作するコードを書き、実際にオブジェクトとして生成し、処理を記述していく手法です。手続きの累積で記述する手続き型のプログラミングとは、順序が逆です。ですから、生成的な処理が記述できる言語なら、どのようなプログラミング言語でも記述できます。しかし、その場合は、自分で取り決めや仕組みを用意しなければなりませんし、他の人が書いたコードと共通の定義にはならないでしょう。 オブジェクト指向プログラミング言語は、オブジェクト指向プログラミングがしやすいように設計されたプログラミング言語です。これらは、オブジェクトの操作に統一された方法を提供しています。例えば、オブジェクトを生成するコンストラクタ、破壊するデストラクタなどは、記述が統一されており、誰が書いても同じようなコードになります。更には、オブジェクトをコピーするクローンや、文字列化なども、統一されているものがあります。これらは、プログラミングにある種のパターン化をもたらします。 逆に言えば、パターンにしにくいコードは、オブジェクト指向に向かないかも知れません。例えば、多様なデバイスに対応できる必要があるデバイスドライバーや組み込みプログラミングには、あまり向いていないかも知れません。 オブジェクト指向では、コードはデータセットと強く結び付いています。これはプログラミングを容易にしますが、機能の一部を切り出して再利用するのには、少し不利かも知れません。ですが、大抵のプログラミング言語は、他の言語のコードも再利用できるので、大きな問題ではないでしょう。更に次のものは、強力な援軍となるでしょう。 * インターネット上のフリーソフトウエア、オープンソースによるコードの共有 * オペレーティングシステムが提供する機能 * 他の言語との組み合わせ など おそらく「オブジェクト指向」が提唱されただろう1950年代ごろの当時、まだOSの機能が貧弱だったり、インターネット環境が無かったりするので、オブジェクト指向の意義を主張するのは、現代よりも難しかったのかも知れません。 実際にコード再利用で必要な知識は :適度な情報公開 :使用するOSの理解 等です。 「情報公開」とあるのは当然ですが、公開されていないコードは他社・他者からは再利用されません。 また、そもそもOSの普及の理由のひとつに、コードの短縮と再利用があります。同じOSどうしなら、各種の仕様が統一されているので、OS内の統一仕様の部分はコードを短縮できるし、同じOSならコードの互換性をOS業者が優先しているからです。 OSの内部まで知る必要は無いですが、最新のOSに実装された新機能の勉強は価値があるでしょう。それらは、現代的なニーズに沿って提供されていることが多いからです。ですが、あまり極端でもいけません。実験的な実装だと、新機能でも削除されることもあるからです。これは便利さとリスクとのトレードオフです。 === コードの共有 === インターネットの発達した現在において、再利用を実現するために重要なことは、言語の仕様よりも、 アプリ開発者がなるべくコードを公開したりして設計書・仕様書も用意しておくとか、 開発者が自身のノウハウの一部を公開するとか、 そういう姿勢だと言えるでしょう。 極端な例を言えば、開発者がアプリケーション・プログラムのコードを無料で公開すれば、ほかの開発者は似たアプリを作りたい場合に、いちいちゼロからコードをプログラミングをしなくても、コード公開されたアプリを組み合わせたり、公開コードの一部だけを書き換えれば済みます。 なお、仕様書はけっして形式的に存在するだけでは駄目であって、他人が読んでもコードの仕組みが分かるように、必要な情報をそろえておく必要があります。(ネット上では「操作説明書」と「仕様書」を勘違いしている人も多く、コードの仕組みを説明せずに操作方法だけかいてある仕様書が多い。しかし、コードの共有が目的なら、コードの仕組みを優先して紹介する書類こそが真っ先に必要である。そういう事情もわからずに、形式的に書類を用意する人が多い 1950年代くらい「オブジェクト指向」の用語が(おそらく)提案された時代はまだインターネットの機能が貧弱だったので、やはり用語の意味が、現在のアプリ開発の実態にあっていません。 === オペレーティングシステム === また、過去の勘違いでは、オペレーティングシステムの存在を見落としていると言っても過言ではないかもしれません。つまり、 1990~2010年代の実際のコンピュータ産業の歴史ではどのアプリにも存在するウィンドウ表示などのコード再利用の実装は、実際にはオペレーティングシステムの仕事 でした。 そもそも1995年ごろの[[W:ウィンドウズ|ウィンドウズ]]や[[W:マッキントッシュ|マッキントッシュ]]の当時の宣伝文句は、そういったものでした。 すなわち、当時のよくあった宣伝文句で :「 『オペレーティングシステム』という新システムによってどのアプリでも活用する、ファイル管理機能や画像出力機能などの管理の細部を担当するので、アプリ開発者はOSに指令する機能だけを覚えば良くなるため学習負担や開発コストが減って、コスト削減ができます!!」 という'''感じ<!-- 誰の主観? -->'''の宣伝文句でした(マイクロソフトやアップル自身がそう言ってたかは覚えてない<!-- 誰の主観? -->が、よく書店のパソコン入門の書籍などで、当時は新型OSがそう説明されていた)。 どの言語で開発するにしても、たとえばWindowsアプリならオペレーティングシステムが共通(当然、WindowsアプリのOSはすべてWindowsである)しており、それらOSのコードはC言語またはC++に類似の言語で書かれています。 アプリのコードを書く場合にはOSの機能(「システムコール」と言います)を呼び出すコードを書くのですが、必ずしも直接呼び出すとは限りません。オペレーティングシステムが異なる場合、コードの共通化はラッパーライブラリを利用すれば、共通のコードにできます。今どきのアプリケーションは、フリーソフトウエアでもクロスプラットホームは普通のことです。 このように、たとえ同じC++どうしでMacintosh向けアプリとWindows向けアプリを書いても、そうなってしまうのです。 繰り返しますが、人類で最初に「オブジェクト指向」の用語が提案された時代(おそらく1950年代くらい)は、まだOSの機能が貧弱だったので、あまり用語の意味が現在のアプリ開発の実態にあってません。 === 他の言語 === C言語でも部品ごとに動作を検証できます。 なぜなら、 * C言語の「関数」を部品として利用すれば済む。 * コードのあるファイルを組み合わせる機能は無印の標準C言語(C++ではなくC)にもある。(「分割コンパイル」とか「ヘッダファイル」とかの機能) です。 実際にC言語で書かれた大規模なプログラムはたくさんあります。(LinuxのカーネルはC言語です。) かつて、1990年代ごろまでは「コードの再利用のためには言語の仕様が重要だ!」とか思われてた時代がありました。 == GUIプログラミングの要素物を「オブジェクト」という流儀もある == GUIプログラミングには、ツールキットライブラリを利用したり、ブラウザのウインドウを利用したりします。これらは、オブジェクト指向プログラミングとは何の関係もありませんが、ボタンやら入力欄やらをオブジェクトとして扱うと便利なので、初心者向けのお手本として良く使われますし、これらを使う仕掛けも実際にそうなっています。実際に生成したオブジェクトが、ウインドウ上に現れて目視できるというのも、わかりやすいです。 さて、GUIプログラミングをする時ウィンドウ内の表示対象として、 ボタン(こういうの→ <span style= "border-style:outset; background-color:#f9f9f9" > ボタン </span>) や テキストボックス(こういうの→ <span style="border-style:inset">        </span> ) など、 いろいろな表示対象を選ぶのですが、この表示対象のことを「オブジェクト」とまとめて言う場合があります。 いちいち「ボタンやテキストボックス など」などと言うのが面倒なので、「オブジェクト」というわけです。(なお、'''マウス操作やキーボード入力などのイベントのこともオブジェクトという場合がある'''が、本書の理解には不要なので説明を省略する Windowsを用いた Visual C++ や Visual C# など(まとめて Visual Studio という)をもちいた GUIプログラミングではこのようなウィンドウ部品としての意味での「オブジェクト」という用法が)現状では)避けられません。 たとえば、初期状態では空白表示のテキストボックス(名前は"textBox1"とする)内部に、ボタンを押すと「こんにちは」と文字表示させる機能をつけたい場合には、Visual Studio が自動的につくる <!-- 型指定に使う Asキーワードがないので Visual Basicではなさそう --> <syntaxhighlight lang="csharp"> private void button1_Click(object sender, EventArgs e) {           // ここにテキストを挿入 (編注: このコメントは生成されない。)       } </syntaxhighlight> というカッコの中に、 プログラマーは手動で、 <syntaxhighlight lang="csharp"> private void button1_Click(object sender, EventArgs e) { textBox1.Text = "こんにちは"; } </syntaxhighlight> となるように{{code|textBox1.Text {{=}} "こんにちは";}}と、コードを記述します。 なお、 <syntaxhighlight lang="csharp"> private void button1_Click(object sender, EventArgs e) { } </syntaxhighlight> の部分はプログラマーがマウス操作でボタンをつくったときにVisual Studio が自動的につくる部分なので、この部分を手作業で入力することはありません。 上記のコードでいう{{code|textBox1}}の部分がオブジェクトです。ドット(.)のあとについている「Text」の部分は一般に[[W:プロパティ|プロパティ]]と言います。 つまり書式は、「オブジェクト.プロパティ」という書式になります。 テキストボックスには、表示文字のほかにもプロパティがあり、ボックスの大きさとか、ボックスの背景色とか、表示文字のフォントやフォントサイズとか、表示文というプロパティの他にも様々なプロパティがあるので、どのプロパティなのかを区別するために、「textBox1.Text」のようにオブジェクト名とプロパティ名とを併記する必要があるのです。 このような、ウィンドウにあるテキストボックスやボタンなどの部品としての用法の「オブジェクト」が、GUIプログラミングで一般的に使われる「オブジェクト」という意味です。 == GUIにかぎらない「オブジェクト」とは == たとえば、「170.0」という数値データだけでは意図が不明ですが、しかし、たとえばあらかじめ仕様書などで「このプログラムはウイキ高校での身体測定の結果を処理するプログラムです。」という情報がったとして、さらにコードで「<code>yamada.sintyou=170</code>」と書けば、意図が、ヤマダ(山田?)氏の身長だと、ハッキリ分かります。 現代では、「オブジェクト」とは、このような記法における、「yamada」の部分のことだけです。 「sintyou」にあたる部分は、アトリビュート(「属性」の意味)とかメンバとかプロパティ(「特性」や「属性」の意味)などといいます。つまり、オブジェクトが持っているデータの定義のことが、アトリビュート(またはプロパティまたはメンバ)です。 また、ヤマダ氏に歩いてもらう処理は(例えばCGソフトなどで、ヤマダ氏の形をしたキャラクターが歩行するとか。)、「<code>yamada.aruki()</code>」などとコードを書けば、同業プログラマーにコードの意図が伝わりやすくなります。 この「<code>yamada.aruki()</code>」というコードの場合、オブジェクトはyamadaヤマダだけです。「aruki()」にあたる部分はメソッド(「方法」という意味)といいます。 もし、ヤマダさんではなく、ロボット1号くん(オブジェクト名は「roboiti」としよう)に歩いてもらうことをオブジェクトの記法で表現するなら、「<code>roboiti.aruki()</code>」というコードになります。 そして、このようなコードでは、「<code>yamada.</code>」の部分が、再利用できます。 もしヤマダ以外に、サトウなどの新しい人員が加わっても、オブジェクトの部分を「satou.」などに変えて、コードを再利用すれば、済むような仕組みになっています。 「<code>satou.aruki()</code>」で、サトウさんの歩きをオブジェクトの記法で表現したことになります。 この場合、satouもオブジェクトです。 == 「オブジェクト」の定義は人によってバラバラ == 「オブジェクト指向」という言葉そのものはコンピュータの黎明期からあったようですが、しかし広く言われ始めたのが1990年代ごろからなので、この時代のWindows95やマッキントッシュ用OSなどのOSの特徴(GUI指向、マルチスレッド作業に対応など)を指して「オブジェクト指向」とか言う人もいます。しかし、特にパソコン業界では「オブジェクト指向」とは何かの決まりはありません。 単に、90年代のOSを「オブジェクト指向」という人もいる、そういう人もいるってだけです。 90年代後半ごろにC++というプログラミング言語が流行り始めたり、あるいは、Visual Basicなどのwindows用プログラミング言語が流行り始めたこともあり、これらの90年代後半ごろに流行しはじめたプログラム言語のことを「オブジェクト指向」と言ったりする人もいます。 ですが、やはりパソコン業界では結局、「オブジェクト指向」とは何かの決まりはありません。 == 「オブジェクト指向」対応のプログラム言語はなくてもプログラミングできる == 1990年代の後半ごろから、「オブジェクト指向」に対応したプログラム言語(C++など)が登場し始めました。 1990年代後半の当初、これからは「オブジェクト指向」を活用したプログラミングが主流になると考えられましたが、しかし10数年ほどたても、実際には、「オブジェクト指向」とやらの概念は主流になりませんでした。 そのため、かつて1995年〜2005年ごろは、書店のパソコン書籍コーナーに「オブジェクト指向」を説明した理工書などが多くありましたが、2010年代後半以降の現代では、あまり見かけなくなりました。 なので、このページを読んでる読者は、あまり深く「オブジェクト指向」とやらの意味を考える必要がありません。そのような論説(「オブジェクト指向の言葉の意味を探求すべき」というような論説)は、市場淘汰されました。 「オブジェクト指向」の細かい定義は、人によって、バラバラです。あまり、定義にこだわる必要もありません。 C++(シープラスプラス)などの1990年代後半あたりから普及し始めたプログラム言語に見られる文法(「クラス」機能など)の特徴を説明するのに、「オブジェクト指向」という用語が使われることがあります。 この1995〜2005年ごろの消費者は「きっと、これから、プログラミングに、クラスの概念が必要・ほぼ必須になるだろう」と予想していましたが、しかし現状では、「クラス」機能を使わなくても高度なプログラムができます。 じっさい、C言語には「クラス」機能がないし、C言語で書かれた高度なプログラムは多くあります。リナックスOSの「カーネル」(OSの中核部分)はC言語で書かれています(C++では、カーネルは書かれていません)。 また、他のプログラム言語でも、クラス機能のある言語でも、多くの実用的なプログラムが、クラス機能を使わなくても書かれています。 そして、このC++ですら、1980年代に登場しはじめた当初は「きっと、それまで普及していたC言語に代わって、これから普及していくだろう」と期待されていましたが、しかし2010年代の現代でも、あいかわらず、C++よりもC言語のほうが主流です。 == 「オブジェクト指向」の流行の以前には「構造化」があった == そもそも、1990年代バージョンのオブジェクト指向よりも前に、1970〜80年代には「構造化プログラミング」という考えがありました。 構造化プログラミングに基づいたプログラミング言語のほうが、C言語などとして、先に(構造化プログラミングにもとづく言語が)実装され、普及しました。 構造化プログラミングは、たとえば、「(処理手順を含まない)データは、データどうしで、まとめる」、「(処理手順を含まない)データが何種類もある場合、関連性のあるデータどうしで分類する」、「処理は、処理どうしで、まとめる」(そのため)「処理とデータとは、区別する」、などのような考えかたです。 処理手順の妥当性を吟味するのは大変ですから、なるべく、処理手順を考えなくても作業できるようにする必要があり、そのため、処理手順についてのコード内容と、処理手順をのぞいたデータとを、別々のグループにまとめる、という設計手法があります。 とはいえ、まったく処理手順と、データとが、完全に切り離されいたら、そもそもアクセスできないので、プログラム実行の最初と最後だけで、データと処理手順とを連動させたりしますが・・・。 ともかく、同じ種類のデータをまとめる「構造体」(こうぞうたい、structure)という機能が考えられ、実用化されました。 また、そのプログラムの処理手順を、さらに複数の小さな処理手順(「サブルーチン」「モジュール」)に分解することにより、「プログラムは、サブルーチンの組み合わせである」とする機能も、実用化されました。 なお、C言語などでいう、処理をまとめたもののことを「関数」(function)というのは、このサブルーチンのようなものの事です。もっともサブ(副、予備)があるならメイン(主)があるわけで、C言語では、最初に実行する特別なルーチンの事を「メイン関数」と呼んでいます。 なお、コンピュータで三角関数などの数学的な意味の関数を扱う場合は、例えば「数学関数」などと呼んで、サブルーチンとしての「関数」の用法との混同をふせぐ場合もあります。 この「構造体」でまとめられるデータとは、C言語などの場合、変数データです。処理手順(「関数」)などは、C言語の「構造体」では、まとめられません。 本来、「構造化プログラミング」の考え方では、関数(処理手順)をさらにまとめて構造化してもかまわないハズでしょうが、しかし、C言語はそうなっていません。そのため、後述する「オブジェクト指向」にもとづいた(C言語よりも)新しいプログラム言語で、関数を含めてまとめて構造化する機能が追加されるように、なりました。(後述する「オブジェクト指向」にもとづく言語では、「クラス」という機能を用いて、変数データも関数も、まとめる事ができます。) さて、ともかく、上述のような構造化プログラミングの利点として、まず、企業などでプログラマーが集団で作業している際に、コード内容が、理解しやすくなります。なぜなら、プログラマーがデータを調整するときは、プログラマーは、データの書かれたコードだけを見れば、済むからです。 そして、このように構造化をして分かりやすくすることによって、もしバグが発生しても、構造が分かりやすいので、バグの箇所も特定しやすく、そのため、修正しやすいという事へと、つながっていきます。 さらに、分業も、しやすくなります。 プログラミング言語である「C言語」そのものの開発では、構造化プログラミングの考えかたも取り入れて、C言語の仕様が決められました。 しかし、構造化プログラミングをすすめているうちに、単にC言語の機能を利用だけでは、まだまだ、構造化が不十分だという事が、分かってきました。 それこそC言語は、複数の種類の変数データを「構造体」として、まとめる事ができるくせに、しかし一方で、複数の種類の関数をまとめる機能すら、C言語には、ありませんでした。 もちろん、個々のソフトウェア会社が、関数をまとめるための関数をコードに記述することで、当面の対応はできます。しかし、個々の企業が自分たちで独自の構造化を行っていては、他社と共同作業を行うのに支障がありますし、大学などの学校教育でも個別の企業の方法については教育できませんし、そのため、ソフトウェア生産の効率が下がってしまいます。 そして、さらに新しいプログラミング手法が提案され、結果的に、(次の節で示しますが)「オブジェクト指向」などとして、新手法が、ひとまとめに呼ばれていきます。 しかし、もしかしたら実態は「C言語が不便なので、新しい言語を考えよう」という側面も、『オブジェクト指向』というフレーズには、あったかもしれません。 こういう実態もあるため、本来なら「構造化」として分類されるべき手法であっても、「オブジェクト指向」に分類されてしまっている手法もあります。 たとえば、(C++言語にある)「複数の関数(処理手順)どうしをまとめる機能」なんて、なんで『構造化』に分類されずに『オブジェクト指向』に分類されるのか、後世の人間には、いまいち分かりません。 なので、あまり、「オブジェクト指向」の厳密な定義にこだわる必要もありません。 === クラスの構成要素としての「オブジェクト」 === 「クラス」とは、何なのかというと、言語によって意味が微妙に異なりますが、とりあえず この節で説明する意味では、 :「クラス」とは、C言語にあった構造体という機能を拡張した新機能(1980年ごろの登場当時)だったもの です。 具体的にどう拡張しているのかは、プログラム言語ごとによって微妙に異なるので、覚える必要がありません。 いちおう、C++のクラスには、C言語の構造体には無い新機能もありますが、しかし、ほとんどの初心者プログラマーのクラスの使い方は、構造体と似たようなものになるでしょう。 「オブジェクト指向」の定義は人によって、バラバラです。クラスの定義も、プログラム言語によって細部の意味がバラバラです。あまり、定義にこだわる必要もありません。 よくある「オブジェクト指向」の定義の例として、たとえば、 「''型から実体を作る''」 というのがあります。 「クラス」と呼ばれる「設計図」から、実体物に対応するデータを作ろう、とする理念です。 この「実体のデータ」(※ 実体の特性を反映したいデータ)は、一般的には「オブジェクト」や、「インスタンス」と呼ばれています。 ですが、構造体プログラミングの産物である構造体が、とっくの昔から、「構造体」という設計図のようなものと、「構造体変数」というデータとの分離を、実現しています。 そして、C++の「クラス」は、単に構造体を拡張したものにすぎないので、C++のクラスに関するかぎり、実はオブジェクト指向で提唱された新理念は、あまり実装的には新しくなかったのが実態です。 このように、プログラミング言語にある「クラス」機能は、あまり名前と内容が、一致していません。なので学習者は、あまり正確な理念内容には、こだわらないほうが、得策でしょう。 「クラス」と聞くと、なんとなく、階層的な分類を思い浮かべるでしょう。しかし、「クラス」をもちいずに、従来の「構造体」でも、階層的な分類は、可能です。結局、データをまとめようとした時点で、個々のデータと、そのデータの集まりとしてのグループという、階層が出来上がってしまいます。 さて、もし、あるデータに、将来的に実体の特性を反映させたい場合、いちばん手軽な方法として、そのデータがなんのためのデータなのかを、コード中で定義してしまう事です。 たとえば、「170.0」という数値データだけでは意図が不明ですが、しかし、たとえばコードで「<code>yamada.sintyou=170</code>」と書けば、意図が、ヤマダ(山田?)氏の身長だと、ハッキリ分かります。もっとも、このような記述は、クラス機能を使わなくても、「構造体」でも可能です。そもそも、このような記法は、もともと、C言語などで構造体を定義するときの記法です。 このため、「そもそもクラス機能は不要では?」とか「構造体の亜流では?」などと考える人たちもいて、その人たちは、C++ではなく(クラス機能のない)C言語でプログラムをしたりするわけです。 さて、「クラス」機能の用語では、この「<code>yamada.sintyou</code>」というコードの場合、オブジェクトはyamadaヤマダだけです。「sintyou」にあたる部分は、アトリビュート(「属性」の意味)とかメンバとかプロパティ(「特性」や「属性」の意味)などといいます。つまり、オブジェクトが持っているデータの定義のことが、アトリビュート(またはプロパティまたはメンバ)です。 また、ヤマダ氏に歩いてもらう処理は(例えばCGなどで、ヤマダ氏の形をした模型が歩行するとか。あるいはヤマダがロボットなら、ロボット歩行のコードになる)、「<code>yamada.aruki()</code>」などとコードを書けば、同業プログラマーにコードの意図が伝わりやすくなります。 この「<code>yamada.aruki()</code>」というコードの場合、オブジェクトはyamadaヤマダだけです。「aruki()」にあたる部分はメソッド(「方法」という意味)といいます。 そして、このようなコードでは、「<code>yamada.</code>」の部分が、再利用できます。 もしヤマダ以外に、サトウなどの新しい人員が加わっても、オブジェクトの部分を「satou.」などに変えて、コードを再利用すれば、済むような仕組みになっています。 もっとも、このような記法(<code>yamada.sintyou</code>)は、けっして「クラス」機能に特有ではありません。「構造体」の時代からある記法です。 結局、用語が統一されていません。そもそも、「オブジェクト指向」時代以前からすでに用語がおかしく、構造化プログラミング時代の「構造体」という用語がオカシイです。英語の日常語でいうstructure(構造)とは、C言語のstrucureは、まったく意味が違います。 もし、変数などのデータをまとめる機能(いまでいう「構造体」)に日常語と似た名前をつけるなら、「グループ」とか名付けるべきだったのでしょう。 結局、そもそも「構造体」という用語そのものが、1960年代ごろのIT業界内部での流行語だった「構造化プログラミング」という用語をもとにつくっただけの、目先の造語でしかありません。1960年ごろに目先の流行語を追って命名しただけのプログラム用語が、2010年代の今だに修正されずに改革されずに続いてるわけです。 このように、プログラムの用語は、発明当時の開発者たちが、あとさき考えずに当時の流行にあわせて用語を命名してたりして、その命名のまま放置されています。けっして物理学や数学などのように、用語が修正されたりしません。 なので、あまり、プログラミング用語の深い意味を考えないほうが、私たち利用者としては得策です。 はたして、実際のいくつかのプログラミング言語にある「クラス」と呼ばれる機能が、はたして「オブジェクト指向」とされる理念を実現できてるかどうかの実情はともかくとして、情報科学・情報工学などではプログラミング言語での「クラス」の構成要素は「オブジェクト」などと呼ばれます。 == 関数の分類としてのクラス分け == == カプセル化 == {{Wikipedia|オブジェクト指向|カプセル化}} 大規模なソフトウェアであればあるほど、デバッグが大変で煩雑になります。 そのため、関数やデータの中身を秘匿し、コンパイラの静的なレベルでアクセスが不可能になるようにすることがカプセル化の目的です。 あるプログラミング言語が「クラス」という機能を採用している場合、たいてい、その言語では、「クラス」機能をつかって、「カプセル化」的なプログラムも記述できます。 ひょっとしたら、本来なら、プログラミング言語にある「クラス」機能は、本来なら「カプセル」機能と名付けるべきだったのかもしれません。しかし、歴史的な経緯により、「クラス」という名前がついてしまい、学習者の混乱の原因になっています。 こうすると、もし、クラスにバグがないと証明できれば、オブジェクトの使い方が間違っていると分かり、デバッグが楽にできるようになります。 なお、「クラスのデータ(変数)は極力全てを隠すか、書き込み不可にし、関数しか使えないようにするべき」という意見もある。 なお、データをまとめるとき、結局、変数を用意する必要がある。一例として、たとえば山田くんの身長も、佐藤くんの身長も、変数「sintyou」で扱う・・・というように。 なので、クラスのデータを隠すとは、つまり、そのデータ名の変数を隠すことに、つながる。 さて、単に変数データをまとめるだけなら、「構造体」(structure)という、もともとは変数データをまとめるだけに特化した機能が、クラス発明の以前から、存在していた。 なお、言語によっては、独立した「構造体」機能がない言語もある。構造体のない言語の場合、「クラス」機能で「構造体」機能と同じことをする言語もあり、そのため、「クラス」が「構造体」を代用するプログラム言語の場合、原則的に「クラス」宣言だけではカプセル化を行わない仕様になっている。 このように、言語によって、「クラス」機能では、原則的にカプセル化を行う仕様になってるか、そうでないかが、異なる。 そのため、プログラマーは、けっして、言語によるクラス機能の自動設定まかせに、カプセル化をするべきではないだろう。 なるべく明示的に、カプセル化をしたいかどうかを、コード中に書けるようにするのが、合理的である(他の言語に移植するときにも、作業者が理解しやすい)。 このような、カプセル化の有無の明示化の目的のため、あるデータの修飾に「public」(パブリック)または「private」(プライベート)といったアクセス指定子をつけることによって、そのデータをカプセル化するか、しないかを設定できるようになっている言語も多い。 一般に、あるデータの修飾に「public」(パブリック)というアクセス指定子をつけることによって、「そのデータを、カプセル化しない」(「隠さないで、他の関数から」、「アクセスできるぞ、他の関数からは」)と宣言した事になります。 一方、あるデータの修飾に「private」(プライベート)というアクセス指定子をつけることによって、「そのデータを、カプセル化する」(「隠せ、他の関数からは」、「アクセスさせないぞ、他の関数からは」)と宣言した事になります。 なお、アクセス指定子はクラス内で、それぞれのデータや変数に対して書かれます。そのように書かれたアクセス指定子により、アクセス指定をされる対象は、クラス自身ではなく、クラスのなかに書かれているデータとクラスの中に書かれている関数が、アクセス指定をされるのです。 クラスのなかで、クラス内にある、それぞれのデータごとに、public(公開)にするか、それともprivate(非公開)にするかを、アクセス指定子により決定します。 一般には、クラス内のごく一部のデータと一部の関数だけをpublicで公開にして、クラス外の他の関数とのやりとりをできるようにして、いっぽう、クラス外との直接のやりとりに必要の無い、その他のデータはprivateで非公開にすることにより、誤ったプログラムなどによる書き換えなどを防ぐという工夫をする、・・・という手法が取られる手法が、多くあります。(プログラム入門書の書籍などでも、そのように記載される事が多い。) さて、プログラム言語の種類によって、アクセス権限を指定しない場合に「カプセル化をするか」「カプセル化をしないか」が、異なります。 それぞれ一長一短であり、どちらが良いとかは、決められません。 もし、ある言語が、アクセス指定子をつけない場合に、自動的にカプセル化をする仕組みの場合、欠点として、学習者がカプセル化の仕組みを理解するまでは、なかなか、動作するコードを書きづらくなる、・・・という欠点もあります。 このため、入門用の言語などでは、アクセス指定子のない場合にはカプセル化をしないという仕様にしている場合もあります。 いっぽう、このような、アクセス指定をしない場合にデータ等を隠さない言語は、コードミスだが動作してしまうバグなどの際に、本来なら隠したい処理に客先などがアクセスしてしまう、というような事故なども、起こりやすくなるでしょう。 もし、コードミスがなければ、アクセス指定子のない場合に自動的にカプセル化をしてもしなくても、どちらでも構わないでしょうが、しかし現実には、プログラマーがコードミスをしない言語なんて、ありえません。 「もしアクセス指定子のない場合に、カプセル化をする仕様か、しない仕様か?」という仕様は、コードミスの観点から見れば、つまり、 「もし、うっかりミスで、アクセス指定子をつけ忘れた場合に、カプセル化をする仕様なのか、しない仕様なのか?」という仕様になりますので、つまり、コード中の企業秘密などの扱いかたに、つながるわけです。 このため、ある程度、専門IT技術者むけの言語の場合、企業秘密を守れる仕様であるべきですから、おそらく、その言語では、「アクセス指定子のない場合に、カプセル化をする仕様」でしょう。じっさい、「C++」言語が、そのような仕組みです。 そもそも、もともとカプセル化をするために、「クラス」機能が開発されたという経緯もあります。(C言語では、構造体にはアクセス指定子をつけられませんので、カプセル化をできません。) プログラミング言語によっては、大規模なプログラムを開発するためのアクセス権限を指定しない場合、自動的に他の関数からは隠される仕様になっている事も、多くあります。 == 継承 == クラス(かりにクラスGとする)を作ったときに、それと似た仕組みの他のクラス(かりにクラスHとする)も、作る必要があったとしましょう。このようなとき、わざわざクラスHに、クラスGと同じ内容のコードを書かなくても、クラスGと違う内容だけを指定すれば、クラス Hを作成できるような仕組みで、クラスを作成できるようにする機能のことを「継承」(けいしょう、inheritance)といいます。 裏を返せば、右クリックによるコピー&ペーストで記述しても構わないなら、つまり、クラスHを作る時に、クラスGと同じ内容のコードを実際にコード上に(コピー&ペーストで)書いてもかまわないなら、わざわざ「継承」の仕組みをつかう必要はありません。 このため、小規模なプログラムでは、「継承」の仕組みをつかうメリットは、少ないでしょうし、むしろ、継承もとを探す手間を考えれば、小規模なプログラムでは、むやみやたらに継承をつかうべきではないかもしれません。 このような考えのためか、プログラム言語によっては、継承の機能はないプログラム言語もあります。(たとえばC言語には、そもそも「継承」の機能はない。なお、C言語には、「クラス」の機能もない。) 構造体を継承できるかどうかは、プログラム言語ごとに異なります。C++では構造体を継承できます。 下記では、特にことわらないかぎり、クラスの継承について、記述します。 さて、継承の機能のある言語の場合、もしクラスGから派生した似た内容のクラスが、クラスHのほかにも、クラスJ、クラスK、クラスL、クラスM、クラスP、・・・などと大量にあるような場合なら、継承によって、手間を大幅に省けるかもしれません。 しかし、そうでない場合なら、かならずしも「継承」にこだわる必要は、ないかもしれません。似たクラスの数が、それほど多くない場合、いっそコピー&ペーストで実際にコードをコピーしてしまうことにより、「継承」を使わないのも、ひとつの手法でしょう。 なお、「継承」という場合、継承元となったクラスは、それ自身でも単独でクラスと機能するのが通常です。 いっぽう、もし、元となったコードが、それ自身が単独ではクラスとして機能しない場合は、例えば「テンプレート」や「抽象クラス」などと呼び、通常のクラスとは区別します。 言語によって、派生もとのクラスの呼び方と、派生先のクラスの呼び方が、異なっています。おおむね、次のような組み合わせになっています。 :{| class="wikitable" |+ 継承に関するクラスの名前 |- style="text-align:center" ! 派生元のクラス ← 派生先のクラス |- style="text-align:center" | 基底クラス ← 派生クラス |- style="text-align:center" | 親クラス ← 子クラス |- style="text-align:center" | スーパークラス ← サブクラス |- |} : <code>←</code> は継承関係を示し、アローヘッド側は継承元です。この記法は UML でも同じです。 :: 派生元に「基底クラス」という言い方を使うなら、派生先に「派生クラス」という言い方を使います。 :: 派生元に「親クラス」という言い方を使うなら、派生先に「子クラス」という言い方を使います。 言語によって、上記の呼び方の表のうちの、どの言い方が主流かが、異なっています。それぞれの言語で主流になっている呼び方をしてください。 また、継承時のカプセル化にかんする仕様が、言語によって、異なっています。 このため、「基底クラス」と言ったときと、「親クラス」と言った時とで、聞き手によっては「継承にかんする仕様が異なっているんだろう」とイメージする人も、多いでしょう。 なので、それぞれの言語で主流になっている呼び方を、してください。 特に、多重継承が可能な言語においては(2つ以上に継承の矢印が向いているので)、使い分けが行われている場合があります。 なお、一部の言語では、クラスの宣言時に、そのクラスを継承することを禁止する機能をつけることもでき、JavaやC#などが、そのような継承禁止宣言の機能を取り入れています。ですが、あまり他のプログラム言語には、普及していません。Javaの場合は final ファイナルという修飾子で、C#の場合は「sealed」シールド(封印された という意味)という修飾子をつけ、継承禁止を宣言します。 継承禁止にはいくつかの理由がありますが、大きく分けるとセキュリティと効率です。 悪意のあるプログラマが、本質的にセキュアである必要のあるオブジェクトを継承し、ロギング機能をインジェクトするかもしれません。この様な理由で、JavaのStringは final 修飾されています。継承される可能性のあるクラスのコードは、final class より Hook が付く分、実行効率が落ちます。 == 関数すらクラス化するプログラム言語もある == C言語などでいう「関数」は、手続きをまとめたものです。 さて、オラクル社のJavaや、マイクロソフト社のVisual C++ などのVisual ◯◯やC#では、手続きをまとめたものを定義するときに、「class」という宣言を使います。これらJavaやC♯では、もしプログラマーが関数を使用したいときに「class」という構文をつかわないと、そもそも関数を宣言できず、関数を使用できません。 それらのプログラム言語では、どうも、関数すらクラスとして分類しようという方針のようです。 ですが、ほかの多くのプログラム言語では、採用されてない仕様ですので、分かならくても悩まなくても良いです。 このJavaやVisual ◯◯などの、関数がclassによって定義される仕様の欠点として、簡単な処理を書きたいだけの場合ですらコードが長くなる、という不便な欠陥があります。 たとえば、「Hello」という文章を表示したい場合、 もしJavaなら、 (Javaの場合) public class クラス名 { public static void main(String[] args){ System.out.println("Hello"); } } という、かなり長い文になります。 マイクロソフト社のVisual ◯◯も、同様に長くなる傾向です。たとえばVisual C♯(シーシャープ)および単なる「C♯」では、 (C♯の場合) class クラス名 { static void Main() { Console.WriteLine("Hello"); } } というふうな感じになります。 これらJavaやC♯のプログラム言語の入門書を読んでも、結局、クラスについて、2度、説明することになります。まず、書籍冒頭での、C言語でいう関数としての機能の「クラス」の説明するほかに、書籍の中盤のほうで、従来のC++でのクラスの機能をもつ別内容の「クラス」について説明するというように、クラスについて2度説明しなおす羽目になります。 なので、関数とクラスとを同一視することは、けっして普遍的な原理ではなくて、いちぶの企業の提供するプログラム言語の仕様にすぎません。 また、上記のような関数の分類をする文法で、構造体による分類ではなく、クラスを使って分類するという文法にされている理由も、単に歴史的な偶然にすぎないでしょう。単に、マイクロソフト社などの大手の会社が、そのような文法を採用した、というだけの事です。 == オブジェクト型 == C#(シー シャープ)などの いくつかの言語で採用されている「オブジェクト型」という型は、一般的な値型とは考え方が違います。 値型では、 a = 2 b = 3 a = b a = 4 とすると、a = 4、b = 3 になります。しかし、オブジェクト型では、a = 4、b = 4 となります。 こうなる理由は、値型とオブジェクト型の仕組みが違うからです。 値型では、変数自体が値を持っているという考え方をします。 [[File:Object-binding1.png|frame|none|値型の場合]] しかし、オブジェクト型の場合は違い、メモリへのポインタという考え方です。 [[File:Object-binding2.png|frame|none|オブジェクト型の場合]] メモリのどこかへオブジェクトが作られ、オブジェクト名というのはリファレンス名であり、メモリを参照しているだけである。 これがオブジェクト型と値型の違いです。これをしっかり把握しておかないと、あとで混乱してしまうことになります。 == デジタル家電など == 歴史的な経緯により、Javaという言語が、よくデジタル家電で使われていた時代が2005年くらいまでありました。 また、日本のフィーチャーフォン向けアプリケーションプログラムが、Javaで記述されていた時代もありました。 原理的には、デジタル家電と、Javaなどのクラスや継承・カプセル化などの概念は無関係ですが、しかし歴史的な理由により、Java的な言語によるアプリ開発環境がデジタル家電の界隈では普及していますので、これらの分野に興味ある人にはJavaの学習も必要かもしれません。 スマーフォンの Android OS もアプリ開発言語としては、Java または Kotlin というJava系文法の言語を採用しています。 {{DEFAULTSORT:おふしえくとしこう}} [[Category:コンピュータ言語]] [[Category:計算機科学]] 0flvtbd2ki5pqqdpeyaffgwc9f61ez7 C言語/関数 0 11668 205595 188891 2022-07-21T01:05:43Z Ef3 694 /* コラム */ 関数呼出しABIを誤解し多くの誤りがあり訂正できる規模でないので削除、少なくともスタックフレームの正確な理解をした上で、具体的なアセンブリーコードを使って説明すべき。 wikitext text/x-wiki {{Nav}} == 関数の基本 == C言語のプログラムは全て1つ以上の「関数」(かんすう)と呼ばれる処理のまとまりから構成されます。 関数を用いて、いくつかの文をまとめることができます。「main関数」も関数であり、「printf」や「scanf」なども関数であるが、それとは別に、ユーザーがいくつかの処理をまとめて「関数」として定義できます。 C言語の「関数」は、他のプログラム言語でいう「サブルーチン」のような性質がある(値を返すことができるかが関数とサブルルーチンの大きな違いです。)。 {{コラム|Visual Studio で、デバッグ セッションの終了時にコンソールが閉じてしまう場合| Visual Studio で、デバッグ セッションの終了時にコンソールが閉じてしまう場合は、 : [ツール] -> [オプション] -> [デバッグ] -> [デバッグの停止時に自動的にコンソールを閉じる] を無効にします。 }} === 関数の定義 === ユーザーが自分で定義する関数について、記法の例を表します。 ; 例 2つの整数を引数にとりその和を返却する関数 : <syntaxhighlight lang="C"> int function(int a, int b) { return a + b; } </syntaxhighlight> 上記コードの「function」の部分が、その関数の名前であり、プログラマーが英数字と _ なら自由に関数に名前をつけられます(ただし「if」などのキーワードや「printf」などのライブラリ関数名は使用できません)。「function」でなくても「myFunc」などでも構いません。 以下、特にことわらないかぎり、ユーザーが定義した関数を、単に「関数」と省略する。main関数やprintfなども「関数」と省略する場合がありますが、ユーザーが定義したこと以外に違いはありません。 関数を呼び出す際、関数の 呼び出し元(仮に「親」と呼ぼう) から 呼び出し先関数(仮に「子」と呼ぼう)へ情報を渡すことができ、この渡された情報のことを'''仮引数'''(かりひきすう、''parameter'')、渡した情報のことを'''実引数'''(じつひきすう、''argument'')と呼びます。 関数の定義の記述は次のようになっている。 ; 形式 : <syntaxhighlight lang="C"> 返却値のデータ型 関数名 ( 引数リスト ) { /*いくつかの文*/ } </syntaxhighlight> 関数名とはその関数を他の関数と区別するために付ける名前のことで、関数名に使えるのは半角英数、「_(下線)」である。ただし、先頭は非数字でなければならない。 多バイト文字を使用できるかは言語処理系によります。 関数は他の関数の中で呼び出すことができます。 また、引数は省略できる場合があります。 :<syntaxhighlight lang="C"> 返却値のデータ型 関数名() { /*いくつかの文*/ } </syntaxhighlight> のように関数を記述する場合もある<ref>引数の省略はC23で廃止予定で、voidを明示する必要があります。</ref>。 === 関数の呼び出し === 定義した関数を呼び出す際の記述は、たとえば次のように行う。 <syntaxhighlight lang="C"> //例 上の例の関数を呼び出す int myFunc(int a, int b) { return a + b; } int main(void){ int r; r = myFunc(1, 2);//rには1と2との和である3が代入されます。 } </syntaxhighlight> 関数の定義側で書かれた引数のことを'''仮引数'''(かりひきすう、''parameter'')という。 いっぽう、関数の呼び出し側で書かれた引数のことを'''実引数'''(じつひきすう、''argument'')という。 ---- 複数の仮引数を持つ場合、「,(コンマ)」で区切る。仮引数を持たない場合 void を書きます。 ; 仮引数 : <syntaxhighlight lang="C"> 仮引数のデータ型 仮引数名 </syntaxhighlight> ---- 任意個数の実引数について、実引数を持たない場合は何も書かきません。 複数の実引数を持つ場合、「,(コンマ)」で区切る。 ; 実引数 : <syntaxhighlight lang="C"> 関数名(任意個数の実引数); </syntaxhighlight> ---- また、関数の呼び出し先から呼び出し元へ情報を渡すこともでき、この情報を返却値と呼びます。 返却値のデータ型で返却値の有無や種類を決定すします。 任意個数の仮引数で仮引数の数や種類を決定すします。 ---- この例では、myFunc関数の実引数である1,2が、myFunc関数の仮引数であるa,bにコピーされ、a+bがmyFunc関数の返却値として返され、その値がrに代入されます。 関数を呼び出すとき、 引数と戻り番地(リターンアドレス)がスタックに格納されます<ref>ARMアーキテクチャの様にリンクレジスタに戻り番地を記憶するアーキテクチャもあります。</ref>。 また、返却値がレジスタや予め呼び出し側の関数が用意した領域に格納されます<ref>引数・返却値・戻り番地をどの様に渡したり返したりするかはアーキテクチャごとに異なり、ABI(application binary interface)で定められています。</ref>。 == 引数と返却値 == === 引数と返却値をもたない関数 === <syntaxhighlight lang="C"> //例 引数と返却値をもたない関数 #include <stdio.h> void HelloWorld() { printf("Hello, World!\n"); } int main(void) { HelloWorld(); } </syntaxhighlight> この例では自作のHelloWorld関数を使って文字列を表示しています。 このHelloWorld関数は引数と返却値をもたない関数である。 このプログラムでは、 まずmain関数が呼ばれ、 次にmain関数内のHelloWorld関数を呼ぶ文が実行されることでHelloWorld関数が呼ばれ、 HelloWorld関数内のprintf関数を呼ぶ文が実行されることでprintf関数が呼ばれる。 そしてprintf関数が終了してHelloWorld関数に戻り、 HelloWorld関数が終了してmain関数に戻り、 main関数が終了してプログラムが終了する。 この例では関数を自作したメリットはないが、 同じ処理がソースコードのあちこちに出てくる場合などは、 その同じ処理を自作の関数にまとめるとメリットがあります。 === 引数と返却値をもつ関数 === <syntaxhighlight lang="C"> //例 引数と返却値をもつ関数 #include <stdio.h> double calc(double radius)//「calc関数の定義」 { return 3.14*radius*radius; } int main(void) { double radius, area; printf("円の半径を入力してください。:"); scanf("%lf", &radius); area=calc(radius);//「calc関数の呼び出し」 printf("円の面積は%fです。\n",area); } </syntaxhighlight> この例では、自作のcalc関数を用いて、円の半径から円の面積を計算しています。 このcalc関数は引数と返却値をもつ関数である。 「calc関数の呼び出し」のところのradiusを実引数と呼びます。 「calc関数の定義」のところのradiusを仮引数と呼びます。 このプログラムでは、 「calc関数の呼び出し」で、まずmain関数のradiusが実引数としてcalc関数に渡され、 その値がcalc関数の仮引数のradiusにコピーされ、 それから、計算結果が返却値として返され、 その値が変数areaに代入されている。 === 関数に複数の返却値を持たせる方法 === 関数による通常の返却値の方法では、1つの値しか、呼び出し元関数に値を送れない しかし、特殊な方法を使うことにより、呼び出しもとの関数に、複数の値を送ることができます。 下記に述べるように、少なくとも以下の3つの方法があります。 === 「サブルーチン」との違い === C言語の関数のような「関数スコープの変数」のシステムは、他のプログラム言語(BASICなど)の「サブルーチン」には無いシステムです<ref name=full-basic>Full BASIC(ISO/IEC 10279)などの構造化BASICではサブルーチンや関数のなかでローカル変数を使用できます。</ref>。BASICのプログラム言語に、C言語でいう「ポインタ」システムが無いのは、そもそも関数スコープの変数のシステムがBASICには無いからです。 このC言語の「関数スコープの変数」システムこそが、C言語の「関数」システムの真骨頂(しんこっちょう)なのです。 構造化以前のBASICでサブルーチンを呼び出しても、ルーチン内で使用する変数に呼び出し前の変数とは別アドレスは与えられませんし、そもそもサブルーチン呼び出し時に「引数」のコピーをしませんし、そもそもサブルーチン呼び出しに「引数」は不要ですし、そもそも「引数」のような概念じたいBASICのサブルーチンの仕様には無いのです<ref name=full-basic/>。 BASICでのサブルーチンの呼び出しは、単に「GOSUB 100」の形式で100行目に処理を移し、RETURNで呼び出した行の次の行(GOSUBの次の行)から処理を続行します。 === 「メソッド」 === 「関数」というが、C言語の関数(function)は、数学の関数(function)とは、まったく違う。 == static 変数とポインタの必要性 == このように、C言語の(ユーザーが自分で定義する)「関数」は、かなり特殊なシステムである。 <syntaxhighlight lang="C"> // static変数の使用例(コンパイルできる) #include <stdio.h> void func(void) { int b = 0; static int c = 0; b = b + 1; c = c + 1; printf("b = %d ,c = %d \n\n", b, c); } int main(void) { func(); func(); } </syntaxhighlight> ;実行結果 b = 1 ,c = 1 b = 1 ,c = 2 のようになる。 このように、static宣言された変数(上の例ではc)は、その関数が終わっても、数値が保存されます。 また、初期化がされる(cに0が代入される)のは、最初に呼び出された1回だけである。 いったい何が「静か」(static)なのか不明であるが、おそらく、関数の再度の呼び出し時にも変数を初期化しないままでいるという意味で、「静か」なのだろう。 なお、下記のように書くと、エラーになる <syntaxhighlight lang="C"> // static宣言でエラーになる例1 #include <stdio.h> void func(void) { int b = 0; static int c = 0; b = b + 1; c = c + 1; } int main(void) { func(); printf("b = %d ,c = %d \n\n", b, c); // このprintf関数がstatic宣言されたcにアクセスできない func(); printf("b = %d ,c = %d \n\n", b, c); // このprintf関数がstatic宣言されたcにアクセスできない return 0; } </syntaxhighlight> このように、static変数は、呼び出し元の関数は、存在を感知できない仕組みである。これによって、バグ発生時に原因箇所を特定しやすくしています。 また、以下のコードも、エラーになる。 <syntaxhighlight lang="C"> // static宣言でエラーになる例2 #include <stdio.h> void func(void) { b = b + 1; // ここでエラー発生。bが何かを判断できない c = c + 1; } int main(void) { int b = 0; // main関数で定義を行った場合 static int c = 0; func(); printf("b = %d ,c = %d \n\n", b, c); // このprintf関数がstatic宣言されたcにアクセスできない func(); printf("b = %d ,c = %d \n\n", b, c); // このprintf関数がstatic宣言されたcにアクセスできない } </syntaxhighlight> コンパイルの仕組みでは、上から順に部品を組み立てていくような仕組みなので、コード上方にある関数はコード下方にある関数の内容を知らない。 たとえ、コード下にある関数がmain関数であっても、その内容を知りません。よって、上記のようなコードはコンパイルエラーになる。 かといって、<code>func</code>をmain関数よりも下に書くと、今度はmain関数が、funcの内容を感知できません。 main関数といえども、main関数ブロックよりも下に書かれた内容を知ることはできません。 なので通常、main関数は一番下に書かれます。 なお、最初の「例1」で紹介した例では、main関数で使用される変数bとcの上にある関数funcで定義されてるので、順序的には問題ないのですが、しかしC言語では、アクセスできないようになっています。 staticかどうかに関わらずアクセスできません。 funcの終了時に、その関数の型などの情報も消えるので、エラー例1のコードでは変数bとcの宣言内容を発見できず、利用できません。 結局、冒頭に書いたコンパイル成功例のような書き方しか、ありません。 なお、static宣言した変数を、他の関数とも共有したい場合には、さらに「グローバル変数」という物を使います。 すべての関数ブロックの外の、コード前半部の部分(グローバル領域)で、変数宣言をすると、その変数は、すべての関数からアクセスできます。 :※ 日本では、なぜか勘違い・生半可な理解で「グローバル変数はなるべく一切(いっさい)使わないで、保守性のために外部ファイルからアクセスできないように、ソフトウェア工学のカプセル化の手法を使うほうがイイ」という迷信があります。しかしこれはマチガイ・勘違いであり、証拠として文献『低レベルプログラミング』(Igor Zhirkov 著、古川邦夫 監訳)には、堂々と、カプセル化された部品(文献には「パーツ」とある)的なプログラムを呼び出す方法は「グローバル変数を使う」か「隠されていない一群の関数を使う」と書いてあります<ref>Igor Zhirkov 著、古川邦夫 監訳『低レベルプログラミング』、翔泳社、2018年01月19日 初版 第1刷 発行、310ページ</ref>。考えてみれば当然で、そもそも外部ファイルから何も変数や関数にアクセスできなければ、そもそもプログラムを起動できません。 さて、ともかく実用では、子サイド(呼び出し先)の関数で、親サイド(呼び出しもと)の変数の値も変更したい場合も多く、その場合には、「グローバル変数としての static 変数」(静的変数)もしくは「ポインタ」という機能をつかう。 グローバル領域でのstatic 変数は、その名前の変数は、どこの変数で呼び出されても、かつ共通のアドレスで管理しているので、呼び出した(子サイドの)関数の先で、親サイド(呼び出し元の)関数も書き換えできる機能をもつ。 さて、C言語の入門書での「関数」の章の前半に書いてあるプログラムで、static変数やグローバル変数やポインタを使わなくても利用できる(ユーザー定義)関数は、むしろ珍しいプログラムなのである。画面に「こんにちは!」などの文字などを表示するだけなら、static変数などを使わなくても、そのようなアルゴリズムを構築できるので、そのようなプログラムがC言語の入門書の『関数』の章に書かれるのであろう。 なお、「return a;」などのように戻り値をつかって 計算結果の数値を 親(呼び出しもと)の関数に送信したりする方法は、じつは、あまり実用的ではなく、現実には不便な場合が多いのである。 なぜなら、 :まず、親(呼び出しもと)の どの変数に値を送るかを、子(呼び出し先)のreturn文からは指定できないし、(けっして、親(呼び出しもと)の変数aなどを指定して、数値を代入してくれるわけではない) :しかも、その関数が終了してしまうので、ほかにも処理をその関数で続行したい場合に不便であるし、 :しかも、1つの数値しか送れない、 など、いろんな欠点があります。 :また、returnはエラーの有無を判定結果を呼び出しもと関数に送信するときに使用することが、実務では多い。たとえば if文などで、想定外の事態がなければ0を返却するようにプログラムを記述して、いっぽう想定外があれば-1を返却する、などのように、返却値の値により、想定外の有無を送信することが、実務などで多い。 C言語の入門書で、「return a + b;」などのように、return文で計算結果を送信する記述が書かれてるのは、初心者の学習のための配慮(はいりょ)なのであり、じつは、あまり実務的ではないプログラムである。そもそも、わざわざ別関数で「a+b」を計算せずとも、最初からmain関数内で「a+b」を計算すれば済む。 また、入門書で、ポインタの章と関数の章が別々に書かれていることが多いのは、初心者のための配慮(はいりょ)なのであり、じつは、現実では、ポインタと関数を別々に考えるのは、あまり実用的ではないだろう。 === 変数とスコープ === <syntaxhighlight lang="C"> int g; // gはグローバルスコープの変数 int main(void) { int l; // lはmain関数の関数スコープな変数 } </syntaxhighlight> C言語では通常、変数をある関数ブロックの内部で宣言した際、その変数は、その関数を抜けると参照できなくなります。 ある関数でしか通用しない変数を'''関数スコープの変数'''と呼びます。 これに対して、関数外で宣言した変数をグローバルスコープな変数と呼びプログラム中どこからでも参照できます。 関数スコープな変数は、関数ブロックを抜けると参照できなくなります。 そして、再度関数を呼び出したときには、以前の同名の変数の値は引き継ぎません。 用途によっては、この性質は好ましくなくグローバルスコープの変数の様にプログラムが実行中は値が永続してほしいことがあります。 そこで、関数スコープな変数の値を永続化する「記憶域クラス指定子static」があり、変数宣言に前置します。前の値は保存されていない。 ; スコープ 変数(などの識別子)の通用範囲のことをスコープと呼びます。 スコープは関数の本体を示す { から } までが代表的ですが、ブロック({ から } まで)もブロックスコープでブロック内で宣言された変数は、ブロックを抜けると参照できなくなります。 また、for文の第一項で宣言された変数のスコープは(たとえ { } で囲まれていなくても)もfor文がスコープになります。 === 関数原型 === main関数から呼び出される別の関数は、main関数よりも前で、存在が宣言されていなければならない。 そのため、main関数以外の関数は、main関数よりも前で、宣言されていなければならない。 しかし、main関数から呼び出される関数は、mainよりも前で宣言さえされていれば、たとえ具体的な定義内容がmain関数のあとで書かれていても、その関数をmain関数から呼び出して使用できます。そのため、以下のように、main関数から呼び出される関数の存在の宣言だけを先に行うという記法が許されており、この記法では、呼び出し先の関数の具体的な定義内容はmain関数のあとで定義する事が許されている。 このような関数の宣言方法のことを「関数のプロトタイプ宣言」などという。 (関数のプロトタイプ宣言の例) <syntaxhighlight lang="C"> //例 関数原型の使用例 #include <stdio.h> double function(double a, double b);//関数原型 int main(void) { printf("%f", function(0.12, 3.45)); } //2つの浮動小数点数の和を求めるfunction関数 //関数原型があるおかげで、 //関数の使用の後に関数の定義を書くことができます。 double function(double a, double b) { return a + b; } </syntaxhighlight> 関数原型(関数プロトタイプ)とは、関数の宣言である。 ある関数が使われる前に、その関数名、引数、返却値を示し、その関数が使えるようにする。 関数原型を使うと、引数の個数とデータ型がチェックされます。 関数原型を使わなくても、関数が使われる前に、その関数の定義を書くことで、その関数を使うことができます。 だが、ソースコードが大規模になるとそれも難しくなる。 また、関数原型を使わず、関数が使われる前にその関数の定義を書かなかった場合、返却値は暗黙のうちint型とされ引数のデータ型もチェックされません(C11 では、関数宣言において型指定子を必須とし、暗黙的な型指定を禁じています)。 関数原型の記述は次のようになっている。 <syntaxhighlight lang="C"> 返却値のデータ型 関数名(引数のリスト); </syntaxhighlight> 引数のリストの記述は次のようになっている。 <syntaxhighlight lang="C"> 引数のデータ型 引数名 </syntaxhighlight> 引数のリストには、引数がない場合はvoidのみを書く。 複数の引数がある場合、コンマで区切る。 関数原型の引数の有効範囲は、関数宣言子の最後で終了する(関数原型有効範囲)。 <ref>『JISX3010:2003』p.21「6.2.1 識別子の有効範囲」</ref> ==== static変数を使う ==== :(※ 未記述) 上述したとおり。 ==== ポインタを使う方法 ==== ポインタを使う方法である。しかし、ポインタを使えば、2つ以上の数値を操作する事ができるので、ポインタを使って、親(呼び出し元)関数の複数の値を操作する事ができるので、それを「複数の返却値である」と解釈する事もできる このような事を、「ポインタによる参照渡しの引数を、返却値として用いる」などと言ったりするが、要するにポインタを使って親(呼び出し元)の変数の値を操作するというだけの事であり、あまり深い意味はない。 <syntaxhighlight lang="C"> //例 ポインタを使って関数に複数の返却値を持たせる。 #include <stdio.h> int function(int *a, int *b) { *a = 1234; *b = 5678; } int main(void) { int i,j; function(&i, &j); printf("iの値は%d、jの値は%d。", i, j); } </syntaxhighlight> ==== 構造体を使う方法 ==== 別の方法として、返却値のデータ型に構造体を使って、 その構造体で複数の返却値を表現する方法もある。 <syntaxhighlight lang="C"> #include <stdio.h> #include <string.h> //例 構造体を使って関数に複数の返却値を持たせる。 typedef struct { int i; double d; char c; char str[32]; } sKouzoutai; sKouzoutai function() { sKouzoutai ret; ret.i = 1234; ret.d = 3.14; ret.c = 'a'; strcpy(ret.str, "Hello. World!"); return ret; } int main(void) { sKouzoutai kouzoutai; kouzoutai = function(); printf("kouzoutaiのメンバの値は、%d %f %c %sです。\n", kouzoutai.i, kouzoutai.d, kouzoutai.c, kouzoutai.str); return 0; } </syntaxhighlight> しかし、関数の返却値は、エラー判別などに利用される場合も多いので(関数によって「エラーなら返却値に 0 以外を返却する」などの仕様のある場合も多い)、よって上述の手法は、あまりオススメできません。 なお、strcpyは、文字列をコピーするための関数。strcpyを使うには、string.hのインクルードが必要である。 === swap関数 === aとbとの値を入れ替えるswap関数を考える。下記コードは誤った例である。 <syntaxhighlight lang="C"> //例 誤ったswap関数 #include <stdio.h> // グロ-バル変数を使って、交換用の変数をswap外部と共有しようと意図しているが・・・ int x; int a; int b; void swap(int a, int b) { x = a; a = b; b = x; } int main() { a = 1; b = 2; printf("swap前のa=%d, b=%d\n", a, b); swap(a, b); printf("swap後のa=%d, b=%d\n", a, b); } </syntaxhighlight> この例は意図通りに動作しない。結果は <pre> swap前のa=1, b=2 swap後のa=1, b=2 </pre> と表示され、なにも交換されていない。 こう失敗する原因は、呼び出され側のswap()の引数で用いられている値を格納する変数(上記コード例の<code> swap(int a,int b) </code> のaおよびb )によって、グローバル変数の a ,b が隠されてしまっているからである。 たとえグローバル領域で「a」「b」と同名の変数があっても、swap関数内では同名なだけの別変数としての仮引数「a」「b」が新たに関数swap内では用意されてしまう。 :この様に、外部のスコープのインスタンスがより内側のスコープで同じ識別子を持つインスタンスによって隠されてしまう事を、シャドーイング(Shadowing)と呼びます。 ユーザ定義関数内で変数の値を交換させるためには、一例として、下記のようにポインタを使ってmain関数の変数a,bを書き換える方法があります。 <syntaxhighlight lang="C"> //例 正しいswap関数 #include <stdio.h> void swap(int *a, int *b) { int x = *a; *a = *b; *b = x; } int main() { int a = 1, b = 2; printf("swap前のa=%d, b=%d\n", a, b); swap(&a, &b); printf("swap後のa=%d, b=%d\n", a, b); } </syntaxhighlight> この例は意図通りに動作する。 <pre> swap前のa=1, b=2 swap後のa=2, b=1 </pre> と表示されます。 ポインタを使うと成功する理由は、main関数の関数スコープの変数のアドレスが仮引数にコピーされたため、swap関数がmain関数の関数スコープの変数a,bにアクセスできているからである(ポインタを介したswap関数内のa,bはもはや関数スコープの変数だけでなくグローバル変数にもアクセスできる)。 <!-- ポインタを使った例は「参照渡し」ではなく「ポインタの値を用いた値渡し」である。(C言語に参照渡しはない)。これを間違えると C++ で本物の参照渡しに出会ったとき混乱する。 なお、 :ポインタを使わない例「誤ったswap関数」のように実引数の値を仮引数にコピーすることを''値渡し''と呼びます。 :ポインタを使った例「正しいswap関数」のように実引数のアドレスを仮引数にコピーすることを''参照渡し''と呼びます。 <ref>値渡しと参照渡しという用語はよく使われるが、『JISX3010:2003』には出てこない。</ref> --> ---- ユーザ定義関数を何も書かずに全てmain関数に書く方法を使えば、ポインタを使わずとも交換できます。 標準C言語では考える必要は無いが、別のプログラム言語だと、言語によってはポインタが標準設定では使用禁止されていたり(たとえばC#がそうである)、そもそもポインタに相当する機能の無い言語も考えられる<ref>最近は Fortran ですらポインタがあるのでポインタのない言語は非常に限られ、ポインタがなくてもVariant型に類する型がある場合が多い。</ref>。そのような場合でも、下記コードのようなアルゴリズムで、変数の交換は可能である。 <syntaxhighlight lang="C"> //例 swap関数を使わない場合 #include <stdio.h> int main() { int a = 1, b = 2; printf("swap前のa=%d, b=%d\n", a, b); int x = a; a = b; b = x; printf("swap後のa=%d, b=%d\n", a, b); } </syntaxhighlight> <pre> swap前のa=1, b=2 swap後のa=2, b=1 </pre> この処理を、マクロを使って一般化すると <syntaxhighlight lang="C"> //例 マクロを使った場合 #include <stdio.h> #define swap_int(a,b) do {int __temp=a;a=b;b=__temp;}while(0) int main() { int a = 1, b = 2; printf("swap前のa=%d, b=%d\n", a, b); swap_int(a,b); printf("swap後のa=%d, b=%d\n", a, b); } </syntaxhighlight> ※ 一度も反復しない<syntaxhighlight lang="C" inline>do { ... } while(0)</syntaxhighlight>は、変数__temp のスコープを切るため。 <pre> swap前のa=1, b=2 swap後のa=2, b=1 </pre> {{コラム|新たに変数を用意せず2つの変数を入れ替える|2= <syntaxhighlight lang="C"> #include <stdio.h> int main() { int a = 1, b = 2; /* a の初期値を A、b の初期値を B として... */ printf("swap前のa=%d, b=%d\n", a, b); a ^= b; /* a = A ^ B */ b ^= a; /* b = B ^ A ^ B ... A */ a ^= b; /* a = A ^ B ^ A ... B */ printf("swap後のa=%d, b=%d\n", a, b); } </syntaxhighlight> ※ <code>^</code>は、排他的論理和演算子。 結果 swap前のa=1, b=2 swap後のa=2, b=1 }} === 関数の引数として配列を渡す === 関数の引数として配列を渡すには、配列変数名を引数とする(配列変数名は配列の先頭要素へのポインタ)。 ;[https://paiza.io/projects/iNPWQDNDnb3BgbBpGe_b4A?language=c 関数の引数として配列を渡す]:<syntaxhighlight lang="C"> #include <stdio.h> int sum(int *array, int size) { int s = 0; for (int i = 0; i < size; i++) s += array[i]; return s; } int main(void) { int a[10] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29}; int s = sum(a, sizeof a / sizeof *a); printf("%d\n", s); } </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> 129 </syntaxhighlight> == ブロックスコープ == 複合文( Compound statement )は、ブロックとも呼ばれ、宣言や文を1つの構文単位にまとめたものです。自動保存期間を持つオブジェクトの初期化子や、ブロックスコープを持つ通常の識別子の可変長配列宣言子は、宣言が実行順に到達するたびに、あたかも文のように評価されてオブジェクトに値が格納され(初期化子のないオブジェクトに不確定な値が格納されることも含む)、各宣言内では宣言子が現れる順に評価されます<ref name="jtc1-sc22-wg14-n2596-6.8">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2596.pdf | title = N2596 working draft — December 11, 2020 ISO/IEC 9899:202x (E) | page = 122, §6.8 ''Statements and blocks'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>。 == 文字列型を引数にする関数 == {{Main|[[C言語/文字と文字列]]}} == 脚註・出典など == <references/> == 参考文献 == * 日本工業標準調査会『JISX3010 プログラム言語C』2003年12月20日改正 [[Category:C言語|かんすう]] c05f9lzo6xp46uua974s9dflronk35n 205596 205595 2022-07-21T01:09:23Z Ef3 694 /* 「メソッド」 */ C言語にはメソッドはありません。 wikitext text/x-wiki {{Nav}} == 関数の基本 == C言語のプログラムは全て1つ以上の「関数」(かんすう)と呼ばれる処理のまとまりから構成されます。 関数を用いて、いくつかの文をまとめることができます。「main関数」も関数であり、「printf」や「scanf」なども関数であるが、それとは別に、ユーザーがいくつかの処理をまとめて「関数」として定義できます。 C言語の「関数」は、他のプログラム言語でいう「サブルーチン」のような性質がある(値を返すことができるかが関数とサブルルーチンの大きな違いです。)。 {{コラム|Visual Studio で、デバッグ セッションの終了時にコンソールが閉じてしまう場合| Visual Studio で、デバッグ セッションの終了時にコンソールが閉じてしまう場合は、 : [ツール] -> [オプション] -> [デバッグ] -> [デバッグの停止時に自動的にコンソールを閉じる] を無効にします。 }} === 関数の定義 === ユーザーが自分で定義する関数について、記法の例を表します。 ; 例 2つの整数を引数にとりその和を返却する関数 : <syntaxhighlight lang="C"> int function(int a, int b) { return a + b; } </syntaxhighlight> 上記コードの「function」の部分が、その関数の名前であり、プログラマーが英数字と _ なら自由に関数に名前をつけられます(ただし「if」などのキーワードや「printf」などのライブラリ関数名は使用できません)。「function」でなくても「myFunc」などでも構いません。 以下、特にことわらないかぎり、ユーザーが定義した関数を、単に「関数」と省略する。main関数やprintfなども「関数」と省略する場合がありますが、ユーザーが定義したこと以外に違いはありません。 関数を呼び出す際、関数の 呼び出し元(仮に「親」と呼ぼう) から 呼び出し先関数(仮に「子」と呼ぼう)へ情報を渡すことができ、この渡された情報のことを'''仮引数'''(かりひきすう、''parameter'')、渡した情報のことを'''実引数'''(じつひきすう、''argument'')と呼びます。 関数の定義の記述は次のようになっている。 ; 形式 : <syntaxhighlight lang="C"> 返却値のデータ型 関数名 ( 引数リスト ) { /*いくつかの文*/ } </syntaxhighlight> 関数名とはその関数を他の関数と区別するために付ける名前のことで、関数名に使えるのは半角英数、「_(下線)」である。ただし、先頭は非数字でなければならない。 多バイト文字を使用できるかは言語処理系によります。 関数は他の関数の中で呼び出すことができます。 また、引数は省略できる場合があります。 :<syntaxhighlight lang="C"> 返却値のデータ型 関数名() { /*いくつかの文*/ } </syntaxhighlight> のように関数を記述する場合もある<ref>引数の省略はC23で廃止予定で、voidを明示する必要があります。</ref>。 === 関数の呼び出し === 定義した関数を呼び出す際の記述は、たとえば次のように行う。 <syntaxhighlight lang="C"> //例 上の例の関数を呼び出す int myFunc(int a, int b) { return a + b; } int main(void){ int r; r = myFunc(1, 2);//rには1と2との和である3が代入されます。 } </syntaxhighlight> 関数の定義側で書かれた引数のことを'''仮引数'''(かりひきすう、''parameter'')という。 いっぽう、関数の呼び出し側で書かれた引数のことを'''実引数'''(じつひきすう、''argument'')という。 ---- 複数の仮引数を持つ場合、「,(コンマ)」で区切る。仮引数を持たない場合 void を書きます。 ; 仮引数 : <syntaxhighlight lang="C"> 仮引数のデータ型 仮引数名 </syntaxhighlight> ---- 任意個数の実引数について、実引数を持たない場合は何も書かきません。 複数の実引数を持つ場合、「,(コンマ)」で区切る。 ; 実引数 : <syntaxhighlight lang="C"> 関数名(任意個数の実引数); </syntaxhighlight> ---- また、関数の呼び出し先から呼び出し元へ情報を渡すこともでき、この情報を返却値と呼びます。 返却値のデータ型で返却値の有無や種類を決定すします。 任意個数の仮引数で仮引数の数や種類を決定すします。 ---- この例では、myFunc関数の実引数である1,2が、myFunc関数の仮引数であるa,bにコピーされ、a+bがmyFunc関数の返却値として返され、その値がrに代入されます。 関数を呼び出すとき、 引数と戻り番地(リターンアドレス)がスタックに格納されます<ref>ARMアーキテクチャの様にリンクレジスタに戻り番地を記憶するアーキテクチャもあります。</ref>。 また、返却値がレジスタや予め呼び出し側の関数が用意した領域に格納されます<ref>引数・返却値・戻り番地をどの様に渡したり返したりするかはアーキテクチャごとに異なり、ABI(application binary interface)で定められています。</ref>。 == 引数と返却値 == === 引数と返却値をもたない関数 === <syntaxhighlight lang="C"> //例 引数と返却値をもたない関数 #include <stdio.h> void HelloWorld() { printf("Hello, World!\n"); } int main(void) { HelloWorld(); } </syntaxhighlight> この例では自作のHelloWorld関数を使って文字列を表示しています。 このHelloWorld関数は引数と返却値をもたない関数である。 このプログラムでは、 まずmain関数が呼ばれ、 次にmain関数内のHelloWorld関数を呼ぶ文が実行されることでHelloWorld関数が呼ばれ、 HelloWorld関数内のprintf関数を呼ぶ文が実行されることでprintf関数が呼ばれる。 そしてprintf関数が終了してHelloWorld関数に戻り、 HelloWorld関数が終了してmain関数に戻り、 main関数が終了してプログラムが終了する。 この例では関数を自作したメリットはないが、 同じ処理がソースコードのあちこちに出てくる場合などは、 その同じ処理を自作の関数にまとめるとメリットがあります。 === 引数と返却値をもつ関数 === <syntaxhighlight lang="C"> //例 引数と返却値をもつ関数 #include <stdio.h> double calc(double radius)//「calc関数の定義」 { return 3.14*radius*radius; } int main(void) { double radius, area; printf("円の半径を入力してください。:"); scanf("%lf", &radius); area=calc(radius);//「calc関数の呼び出し」 printf("円の面積は%fです。\n",area); } </syntaxhighlight> この例では、自作のcalc関数を用いて、円の半径から円の面積を計算しています。 このcalc関数は引数と返却値をもつ関数である。 「calc関数の呼び出し」のところのradiusを実引数と呼びます。 「calc関数の定義」のところのradiusを仮引数と呼びます。 このプログラムでは、 「calc関数の呼び出し」で、まずmain関数のradiusが実引数としてcalc関数に渡され、 その値がcalc関数の仮引数のradiusにコピーされ、 それから、計算結果が返却値として返され、 その値が変数areaに代入されている。 === 関数に複数の返却値を持たせる方法 === 関数による通常の返却値の方法では、1つの値しか、呼び出し元関数に値を送れない しかし、特殊な方法を使うことにより、呼び出しもとの関数に、複数の値を送ることができます。 下記に述べるように、少なくとも以下の3つの方法があります。 === 「サブルーチン」との違い === C言語の関数のような「関数スコープの変数」のシステムは、他のプログラム言語(BASICなど)の「サブルーチン」には無いシステムです<ref name=full-basic>Full BASIC(ISO/IEC 10279)などの構造化BASICではサブルーチンや関数のなかでローカル変数を使用できます。</ref>。BASICのプログラム言語に、C言語でいう「ポインタ」システムが無いのは、そもそも関数スコープの変数のシステムがBASICには無いからです。 このC言語の「関数スコープの変数」システムこそが、C言語の「関数」システムの真骨頂(しんこっちょう)なのです。 構造化以前のBASICでサブルーチンを呼び出しても、ルーチン内で使用する変数に呼び出し前の変数とは別アドレスは与えられませんし、そもそもサブルーチン呼び出し時に「引数」のコピーをしませんし、そもそもサブルーチン呼び出しに「引数」は不要ですし、そもそも「引数」のような概念じたいBASICのサブルーチンの仕様には無いのです<ref name=full-basic/>。 BASICでのサブルーチンの呼び出しは、単に「GOSUB 100」の形式で100行目に処理を移し、RETURNで呼び出した行の次の行(GOSUBの次の行)から処理を続行します。 == static 変数とポインタの必要性 == このように、C言語の(ユーザーが自分で定義する)「関数」は、かなり特殊なシステムである。 <syntaxhighlight lang="C"> // static変数の使用例(コンパイルできる) #include <stdio.h> void func(void) { int b = 0; static int c = 0; b = b + 1; c = c + 1; printf("b = %d ,c = %d \n\n", b, c); } int main(void) { func(); func(); } </syntaxhighlight> ;実行結果 b = 1 ,c = 1 b = 1 ,c = 2 のようになる。 このように、static宣言された変数(上の例ではc)は、その関数が終わっても、数値が保存されます。 また、初期化がされる(cに0が代入される)のは、最初に呼び出された1回だけである。 いったい何が「静か」(static)なのか不明であるが、おそらく、関数の再度の呼び出し時にも変数を初期化しないままでいるという意味で、「静か」なのだろう。 なお、下記のように書くと、エラーになる <syntaxhighlight lang="C"> // static宣言でエラーになる例1 #include <stdio.h> void func(void) { int b = 0; static int c = 0; b = b + 1; c = c + 1; } int main(void) { func(); printf("b = %d ,c = %d \n\n", b, c); // このprintf関数がstatic宣言されたcにアクセスできない func(); printf("b = %d ,c = %d \n\n", b, c); // このprintf関数がstatic宣言されたcにアクセスできない return 0; } </syntaxhighlight> このように、static変数は、呼び出し元の関数は、存在を感知できない仕組みである。これによって、バグ発生時に原因箇所を特定しやすくしています。 また、以下のコードも、エラーになる。 <syntaxhighlight lang="C"> // static宣言でエラーになる例2 #include <stdio.h> void func(void) { b = b + 1; // ここでエラー発生。bが何かを判断できない c = c + 1; } int main(void) { int b = 0; // main関数で定義を行った場合 static int c = 0; func(); printf("b = %d ,c = %d \n\n", b, c); // このprintf関数がstatic宣言されたcにアクセスできない func(); printf("b = %d ,c = %d \n\n", b, c); // このprintf関数がstatic宣言されたcにアクセスできない } </syntaxhighlight> コンパイルの仕組みでは、上から順に部品を組み立てていくような仕組みなので、コード上方にある関数はコード下方にある関数の内容を知らない。 たとえ、コード下にある関数がmain関数であっても、その内容を知りません。よって、上記のようなコードはコンパイルエラーになる。 かといって、<code>func</code>をmain関数よりも下に書くと、今度はmain関数が、funcの内容を感知できません。 main関数といえども、main関数ブロックよりも下に書かれた内容を知ることはできません。 なので通常、main関数は一番下に書かれます。 なお、最初の「例1」で紹介した例では、main関数で使用される変数bとcの上にある関数funcで定義されてるので、順序的には問題ないのですが、しかしC言語では、アクセスできないようになっています。 staticかどうかに関わらずアクセスできません。 funcの終了時に、その関数の型などの情報も消えるので、エラー例1のコードでは変数bとcの宣言内容を発見できず、利用できません。 結局、冒頭に書いたコンパイル成功例のような書き方しか、ありません。 なお、static宣言した変数を、他の関数とも共有したい場合には、さらに「グローバル変数」という物を使います。 すべての関数ブロックの外の、コード前半部の部分(グローバル領域)で、変数宣言をすると、その変数は、すべての関数からアクセスできます。 :※ 日本では、なぜか勘違い・生半可な理解で「グローバル変数はなるべく一切(いっさい)使わないで、保守性のために外部ファイルからアクセスできないように、ソフトウェア工学のカプセル化の手法を使うほうがイイ」という迷信があります。しかしこれはマチガイ・勘違いであり、証拠として文献『低レベルプログラミング』(Igor Zhirkov 著、古川邦夫 監訳)には、堂々と、カプセル化された部品(文献には「パーツ」とある)的なプログラムを呼び出す方法は「グローバル変数を使う」か「隠されていない一群の関数を使う」と書いてあります<ref>Igor Zhirkov 著、古川邦夫 監訳『低レベルプログラミング』、翔泳社、2018年01月19日 初版 第1刷 発行、310ページ</ref>。考えてみれば当然で、そもそも外部ファイルから何も変数や関数にアクセスできなければ、そもそもプログラムを起動できません。 さて、ともかく実用では、子サイド(呼び出し先)の関数で、親サイド(呼び出しもと)の変数の値も変更したい場合も多く、その場合には、「グローバル変数としての static 変数」(静的変数)もしくは「ポインタ」という機能をつかう。 グローバル領域でのstatic 変数は、その名前の変数は、どこの変数で呼び出されても、かつ共通のアドレスで管理しているので、呼び出した(子サイドの)関数の先で、親サイド(呼び出し元の)関数も書き換えできる機能をもつ。 さて、C言語の入門書での「関数」の章の前半に書いてあるプログラムで、static変数やグローバル変数やポインタを使わなくても利用できる(ユーザー定義)関数は、むしろ珍しいプログラムなのである。画面に「こんにちは!」などの文字などを表示するだけなら、static変数などを使わなくても、そのようなアルゴリズムを構築できるので、そのようなプログラムがC言語の入門書の『関数』の章に書かれるのであろう。 なお、「return a;」などのように戻り値をつかって 計算結果の数値を 親(呼び出しもと)の関数に送信したりする方法は、じつは、あまり実用的ではなく、現実には不便な場合が多いのである。 なぜなら、 :まず、親(呼び出しもと)の どの変数に値を送るかを、子(呼び出し先)のreturn文からは指定できないし、(けっして、親(呼び出しもと)の変数aなどを指定して、数値を代入してくれるわけではない) :しかも、その関数が終了してしまうので、ほかにも処理をその関数で続行したい場合に不便であるし、 :しかも、1つの数値しか送れない、 など、いろんな欠点があります。 :また、returnはエラーの有無を判定結果を呼び出しもと関数に送信するときに使用することが、実務では多い。たとえば if文などで、想定外の事態がなければ0を返却するようにプログラムを記述して、いっぽう想定外があれば-1を返却する、などのように、返却値の値により、想定外の有無を送信することが、実務などで多い。 C言語の入門書で、「return a + b;」などのように、return文で計算結果を送信する記述が書かれてるのは、初心者の学習のための配慮(はいりょ)なのであり、じつは、あまり実務的ではないプログラムである。そもそも、わざわざ別関数で「a+b」を計算せずとも、最初からmain関数内で「a+b」を計算すれば済む。 また、入門書で、ポインタの章と関数の章が別々に書かれていることが多いのは、初心者のための配慮(はいりょ)なのであり、じつは、現実では、ポインタと関数を別々に考えるのは、あまり実用的ではないだろう。 === 変数とスコープ === <syntaxhighlight lang="C"> int g; // gはグローバルスコープの変数 int main(void) { int l; // lはmain関数の関数スコープな変数 } </syntaxhighlight> C言語では通常、変数をある関数ブロックの内部で宣言した際、その変数は、その関数を抜けると参照できなくなります。 ある関数でしか通用しない変数を'''関数スコープの変数'''と呼びます。 これに対して、関数外で宣言した変数をグローバルスコープな変数と呼びプログラム中どこからでも参照できます。 関数スコープな変数は、関数ブロックを抜けると参照できなくなります。 そして、再度関数を呼び出したときには、以前の同名の変数の値は引き継ぎません。 用途によっては、この性質は好ましくなくグローバルスコープの変数の様にプログラムが実行中は値が永続してほしいことがあります。 そこで、関数スコープな変数の値を永続化する「記憶域クラス指定子static」があり、変数宣言に前置します。前の値は保存されていない。 ; スコープ 変数(などの識別子)の通用範囲のことをスコープと呼びます。 スコープは関数の本体を示す { から } までが代表的ですが、ブロック({ から } まで)もブロックスコープでブロック内で宣言された変数は、ブロックを抜けると参照できなくなります。 また、for文の第一項で宣言された変数のスコープは(たとえ { } で囲まれていなくても)もfor文がスコープになります。 === 関数原型 === main関数から呼び出される別の関数は、main関数よりも前で、存在が宣言されていなければならない。 そのため、main関数以外の関数は、main関数よりも前で、宣言されていなければならない。 しかし、main関数から呼び出される関数は、mainよりも前で宣言さえされていれば、たとえ具体的な定義内容がmain関数のあとで書かれていても、その関数をmain関数から呼び出して使用できます。そのため、以下のように、main関数から呼び出される関数の存在の宣言だけを先に行うという記法が許されており、この記法では、呼び出し先の関数の具体的な定義内容はmain関数のあとで定義する事が許されている。 このような関数の宣言方法のことを「関数のプロトタイプ宣言」などという。 (関数のプロトタイプ宣言の例) <syntaxhighlight lang="C"> //例 関数原型の使用例 #include <stdio.h> double function(double a, double b);//関数原型 int main(void) { printf("%f", function(0.12, 3.45)); } //2つの浮動小数点数の和を求めるfunction関数 //関数原型があるおかげで、 //関数の使用の後に関数の定義を書くことができます。 double function(double a, double b) { return a + b; } </syntaxhighlight> 関数原型(関数プロトタイプ)とは、関数の宣言である。 ある関数が使われる前に、その関数名、引数、返却値を示し、その関数が使えるようにする。 関数原型を使うと、引数の個数とデータ型がチェックされます。 関数原型を使わなくても、関数が使われる前に、その関数の定義を書くことで、その関数を使うことができます。 だが、ソースコードが大規模になるとそれも難しくなる。 また、関数原型を使わず、関数が使われる前にその関数の定義を書かなかった場合、返却値は暗黙のうちint型とされ引数のデータ型もチェックされません(C11 では、関数宣言において型指定子を必須とし、暗黙的な型指定を禁じています)。 関数原型の記述は次のようになっている。 <syntaxhighlight lang="C"> 返却値のデータ型 関数名(引数のリスト); </syntaxhighlight> 引数のリストの記述は次のようになっている。 <syntaxhighlight lang="C"> 引数のデータ型 引数名 </syntaxhighlight> 引数のリストには、引数がない場合はvoidのみを書く。 複数の引数がある場合、コンマで区切る。 関数原型の引数の有効範囲は、関数宣言子の最後で終了する(関数原型有効範囲)。 <ref>『JISX3010:2003』p.21「6.2.1 識別子の有効範囲」</ref> ==== static変数を使う ==== :(※ 未記述) 上述したとおり。 ==== ポインタを使う方法 ==== ポインタを使う方法である。しかし、ポインタを使えば、2つ以上の数値を操作する事ができるので、ポインタを使って、親(呼び出し元)関数の複数の値を操作する事ができるので、それを「複数の返却値である」と解釈する事もできる このような事を、「ポインタによる参照渡しの引数を、返却値として用いる」などと言ったりするが、要するにポインタを使って親(呼び出し元)の変数の値を操作するというだけの事であり、あまり深い意味はない。 <syntaxhighlight lang="C"> //例 ポインタを使って関数に複数の返却値を持たせる。 #include <stdio.h> int function(int *a, int *b) { *a = 1234; *b = 5678; } int main(void) { int i,j; function(&i, &j); printf("iの値は%d、jの値は%d。", i, j); } </syntaxhighlight> ==== 構造体を使う方法 ==== 別の方法として、返却値のデータ型に構造体を使って、 その構造体で複数の返却値を表現する方法もある。 <syntaxhighlight lang="C"> #include <stdio.h> #include <string.h> //例 構造体を使って関数に複数の返却値を持たせる。 typedef struct { int i; double d; char c; char str[32]; } sKouzoutai; sKouzoutai function() { sKouzoutai ret; ret.i = 1234; ret.d = 3.14; ret.c = 'a'; strcpy(ret.str, "Hello. World!"); return ret; } int main(void) { sKouzoutai kouzoutai; kouzoutai = function(); printf("kouzoutaiのメンバの値は、%d %f %c %sです。\n", kouzoutai.i, kouzoutai.d, kouzoutai.c, kouzoutai.str); return 0; } </syntaxhighlight> しかし、関数の返却値は、エラー判別などに利用される場合も多いので(関数によって「エラーなら返却値に 0 以外を返却する」などの仕様のある場合も多い)、よって上述の手法は、あまりオススメできません。 なお、strcpyは、文字列をコピーするための関数。strcpyを使うには、string.hのインクルードが必要である。 === swap関数 === aとbとの値を入れ替えるswap関数を考える。下記コードは誤った例である。 <syntaxhighlight lang="C"> //例 誤ったswap関数 #include <stdio.h> // グロ-バル変数を使って、交換用の変数をswap外部と共有しようと意図しているが・・・ int x; int a; int b; void swap(int a, int b) { x = a; a = b; b = x; } int main() { a = 1; b = 2; printf("swap前のa=%d, b=%d\n", a, b); swap(a, b); printf("swap後のa=%d, b=%d\n", a, b); } </syntaxhighlight> この例は意図通りに動作しない。結果は <pre> swap前のa=1, b=2 swap後のa=1, b=2 </pre> と表示され、なにも交換されていない。 こう失敗する原因は、呼び出され側のswap()の引数で用いられている値を格納する変数(上記コード例の<code> swap(int a,int b) </code> のaおよびb )によって、グローバル変数の a ,b が隠されてしまっているからである。 たとえグローバル領域で「a」「b」と同名の変数があっても、swap関数内では同名なだけの別変数としての仮引数「a」「b」が新たに関数swap内では用意されてしまう。 :この様に、外部のスコープのインスタンスがより内側のスコープで同じ識別子を持つインスタンスによって隠されてしまう事を、シャドーイング(Shadowing)と呼びます。 ユーザ定義関数内で変数の値を交換させるためには、一例として、下記のようにポインタを使ってmain関数の変数a,bを書き換える方法があります。 <syntaxhighlight lang="C"> //例 正しいswap関数 #include <stdio.h> void swap(int *a, int *b) { int x = *a; *a = *b; *b = x; } int main() { int a = 1, b = 2; printf("swap前のa=%d, b=%d\n", a, b); swap(&a, &b); printf("swap後のa=%d, b=%d\n", a, b); } </syntaxhighlight> この例は意図通りに動作する。 <pre> swap前のa=1, b=2 swap後のa=2, b=1 </pre> と表示されます。 ポインタを使うと成功する理由は、main関数の関数スコープの変数のアドレスが仮引数にコピーされたため、swap関数がmain関数の関数スコープの変数a,bにアクセスできているからである(ポインタを介したswap関数内のa,bはもはや関数スコープの変数だけでなくグローバル変数にもアクセスできる)。 <!-- ポインタを使った例は「参照渡し」ではなく「ポインタの値を用いた値渡し」である。(C言語に参照渡しはない)。これを間違えると C++ で本物の参照渡しに出会ったとき混乱する。 なお、 :ポインタを使わない例「誤ったswap関数」のように実引数の値を仮引数にコピーすることを''値渡し''と呼びます。 :ポインタを使った例「正しいswap関数」のように実引数のアドレスを仮引数にコピーすることを''参照渡し''と呼びます。 <ref>値渡しと参照渡しという用語はよく使われるが、『JISX3010:2003』には出てこない。</ref> --> ---- ユーザ定義関数を何も書かずに全てmain関数に書く方法を使えば、ポインタを使わずとも交換できます。 標準C言語では考える必要は無いが、別のプログラム言語だと、言語によってはポインタが標準設定では使用禁止されていたり(たとえばC#がそうである)、そもそもポインタに相当する機能の無い言語も考えられる<ref>最近は Fortran ですらポインタがあるのでポインタのない言語は非常に限られ、ポインタがなくてもVariant型に類する型がある場合が多い。</ref>。そのような場合でも、下記コードのようなアルゴリズムで、変数の交換は可能である。 <syntaxhighlight lang="C"> //例 swap関数を使わない場合 #include <stdio.h> int main() { int a = 1, b = 2; printf("swap前のa=%d, b=%d\n", a, b); int x = a; a = b; b = x; printf("swap後のa=%d, b=%d\n", a, b); } </syntaxhighlight> <pre> swap前のa=1, b=2 swap後のa=2, b=1 </pre> この処理を、マクロを使って一般化すると <syntaxhighlight lang="C"> //例 マクロを使った場合 #include <stdio.h> #define swap_int(a,b) do {int __temp=a;a=b;b=__temp;}while(0) int main() { int a = 1, b = 2; printf("swap前のa=%d, b=%d\n", a, b); swap_int(a,b); printf("swap後のa=%d, b=%d\n", a, b); } </syntaxhighlight> ※ 一度も反復しない<syntaxhighlight lang="C" inline>do { ... } while(0)</syntaxhighlight>は、変数__temp のスコープを切るため。 <pre> swap前のa=1, b=2 swap後のa=2, b=1 </pre> {{コラム|新たに変数を用意せず2つの変数を入れ替える|2= <syntaxhighlight lang="C"> #include <stdio.h> int main() { int a = 1, b = 2; /* a の初期値を A、b の初期値を B として... */ printf("swap前のa=%d, b=%d\n", a, b); a ^= b; /* a = A ^ B */ b ^= a; /* b = B ^ A ^ B ... A */ a ^= b; /* a = A ^ B ^ A ... B */ printf("swap後のa=%d, b=%d\n", a, b); } </syntaxhighlight> ※ <code>^</code>は、排他的論理和演算子。 結果 swap前のa=1, b=2 swap後のa=2, b=1 }} === 関数の引数として配列を渡す === 関数の引数として配列を渡すには、配列変数名を引数とする(配列変数名は配列の先頭要素へのポインタ)。 ;[https://paiza.io/projects/iNPWQDNDnb3BgbBpGe_b4A?language=c 関数の引数として配列を渡す]:<syntaxhighlight lang="C"> #include <stdio.h> int sum(int *array, int size) { int s = 0; for (int i = 0; i < size; i++) s += array[i]; return s; } int main(void) { int a[10] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29}; int s = sum(a, sizeof a / sizeof *a); printf("%d\n", s); } </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> 129 </syntaxhighlight> == ブロックスコープ == 複合文( Compound statement )は、ブロックとも呼ばれ、宣言や文を1つの構文単位にまとめたものです。自動保存期間を持つオブジェクトの初期化子や、ブロックスコープを持つ通常の識別子の可変長配列宣言子は、宣言が実行順に到達するたびに、あたかも文のように評価されてオブジェクトに値が格納され(初期化子のないオブジェクトに不確定な値が格納されることも含む)、各宣言内では宣言子が現れる順に評価されます<ref name="jtc1-sc22-wg14-n2596-6.8">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2596.pdf | title = N2596 working draft — December 11, 2020 ISO/IEC 9899:202x (E) | page = 122, §6.8 ''Statements and blocks'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>。 == 文字列型を引数にする関数 == {{Main|[[C言語/文字と文字列]]}} == 脚註・出典など == <references/> == 参考文献 == * 日本工業標準調査会『JISX3010 プログラム言語C』2003年12月20日改正 [[Category:C言語|かんすう]] o8803ndb4f0ajklfbh9tkpa5sfxoq3h 205597 205596 2022-07-21T01:16:40Z Ef3 694 /* static 変数とポインタの必要性 */ static(静的)はdynamic(動的)との対比からです。ローカル変数はスタック上に一時的に記憶領域が確保され、関数を抜ける度にスコープを抜けます。 これに対して、static 変数は、プログラムが開始され終了するまでの期間に渡って同じ領域(同じアドレス)を持ち、これはグローバル変数と同じ特徴ですが、関数内で static 宣言された変数は、関数の外から参照できません。 wikitext text/x-wiki {{Nav}} == 関数の基本 == C言語のプログラムは全て1つ以上の「関数」(かんすう)と呼ばれる処理のまとまりから構成されます。 関数を用いて、いくつかの文をまとめることができます。「main関数」も関数であり、「printf」や「scanf」なども関数であるが、それとは別に、ユーザーがいくつかの処理をまとめて「関数」として定義できます。 C言語の「関数」は、他のプログラム言語でいう「サブルーチン」のような性質がある(値を返すことができるかが関数とサブルルーチンの大きな違いです。)。 {{コラム|Visual Studio で、デバッグ セッションの終了時にコンソールが閉じてしまう場合| Visual Studio で、デバッグ セッションの終了時にコンソールが閉じてしまう場合は、 : [ツール] -> [オプション] -> [デバッグ] -> [デバッグの停止時に自動的にコンソールを閉じる] を無効にします。 }} === 関数の定義 === ユーザーが自分で定義する関数について、記法の例を表します。 ; 例 2つの整数を引数にとりその和を返却する関数 : <syntaxhighlight lang="C"> int function(int a, int b) { return a + b; } </syntaxhighlight> 上記コードの「function」の部分が、その関数の名前であり、プログラマーが英数字と _ なら自由に関数に名前をつけられます(ただし「if」などのキーワードや「printf」などのライブラリ関数名は使用できません)。「function」でなくても「myFunc」などでも構いません。 以下、特にことわらないかぎり、ユーザーが定義した関数を、単に「関数」と省略する。main関数やprintfなども「関数」と省略する場合がありますが、ユーザーが定義したこと以外に違いはありません。 関数を呼び出す際、関数の 呼び出し元(仮に「親」と呼ぼう) から 呼び出し先関数(仮に「子」と呼ぼう)へ情報を渡すことができ、この渡された情報のことを'''仮引数'''(かりひきすう、''parameter'')、渡した情報のことを'''実引数'''(じつひきすう、''argument'')と呼びます。 関数の定義の記述は次のようになっている。 ; 形式 : <syntaxhighlight lang="C"> 返却値のデータ型 関数名 ( 引数リスト ) { /*いくつかの文*/ } </syntaxhighlight> 関数名とはその関数を他の関数と区別するために付ける名前のことで、関数名に使えるのは半角英数、「_(下線)」である。ただし、先頭は非数字でなければならない。 多バイト文字を使用できるかは言語処理系によります。 関数は他の関数の中で呼び出すことができます。 また、引数は省略できる場合があります。 :<syntaxhighlight lang="C"> 返却値のデータ型 関数名() { /*いくつかの文*/ } </syntaxhighlight> のように関数を記述する場合もある<ref>引数の省略はC23で廃止予定で、voidを明示する必要があります。</ref>。 === 関数の呼び出し === 定義した関数を呼び出す際の記述は、たとえば次のように行う。 <syntaxhighlight lang="C"> //例 上の例の関数を呼び出す int myFunc(int a, int b) { return a + b; } int main(void){ int r; r = myFunc(1, 2);//rには1と2との和である3が代入されます。 } </syntaxhighlight> 関数の定義側で書かれた引数のことを'''仮引数'''(かりひきすう、''parameter'')という。 いっぽう、関数の呼び出し側で書かれた引数のことを'''実引数'''(じつひきすう、''argument'')という。 ---- 複数の仮引数を持つ場合、「,(コンマ)」で区切る。仮引数を持たない場合 void を書きます。 ; 仮引数 : <syntaxhighlight lang="C"> 仮引数のデータ型 仮引数名 </syntaxhighlight> ---- 任意個数の実引数について、実引数を持たない場合は何も書かきません。 複数の実引数を持つ場合、「,(コンマ)」で区切る。 ; 実引数 : <syntaxhighlight lang="C"> 関数名(任意個数の実引数); </syntaxhighlight> ---- また、関数の呼び出し先から呼び出し元へ情報を渡すこともでき、この情報を返却値と呼びます。 返却値のデータ型で返却値の有無や種類を決定すします。 任意個数の仮引数で仮引数の数や種類を決定すします。 ---- この例では、myFunc関数の実引数である1,2が、myFunc関数の仮引数であるa,bにコピーされ、a+bがmyFunc関数の返却値として返され、その値がrに代入されます。 関数を呼び出すとき、 引数と戻り番地(リターンアドレス)がスタックに格納されます<ref>ARMアーキテクチャの様にリンクレジスタに戻り番地を記憶するアーキテクチャもあります。</ref>。 また、返却値がレジスタや予め呼び出し側の関数が用意した領域に格納されます<ref>引数・返却値・戻り番地をどの様に渡したり返したりするかはアーキテクチャごとに異なり、ABI(application binary interface)で定められています。</ref>。 == 引数と返却値 == === 引数と返却値をもたない関数 === <syntaxhighlight lang="C"> //例 引数と返却値をもたない関数 #include <stdio.h> void HelloWorld() { printf("Hello, World!\n"); } int main(void) { HelloWorld(); } </syntaxhighlight> この例では自作のHelloWorld関数を使って文字列を表示しています。 このHelloWorld関数は引数と返却値をもたない関数である。 このプログラムでは、 まずmain関数が呼ばれ、 次にmain関数内のHelloWorld関数を呼ぶ文が実行されることでHelloWorld関数が呼ばれ、 HelloWorld関数内のprintf関数を呼ぶ文が実行されることでprintf関数が呼ばれる。 そしてprintf関数が終了してHelloWorld関数に戻り、 HelloWorld関数が終了してmain関数に戻り、 main関数が終了してプログラムが終了する。 この例では関数を自作したメリットはないが、 同じ処理がソースコードのあちこちに出てくる場合などは、 その同じ処理を自作の関数にまとめるとメリットがあります。 === 引数と返却値をもつ関数 === <syntaxhighlight lang="C"> //例 引数と返却値をもつ関数 #include <stdio.h> double calc(double radius)//「calc関数の定義」 { return 3.14*radius*radius; } int main(void) { double radius, area; printf("円の半径を入力してください。:"); scanf("%lf", &radius); area=calc(radius);//「calc関数の呼び出し」 printf("円の面積は%fです。\n",area); } </syntaxhighlight> この例では、自作のcalc関数を用いて、円の半径から円の面積を計算しています。 このcalc関数は引数と返却値をもつ関数である。 「calc関数の呼び出し」のところのradiusを実引数と呼びます。 「calc関数の定義」のところのradiusを仮引数と呼びます。 このプログラムでは、 「calc関数の呼び出し」で、まずmain関数のradiusが実引数としてcalc関数に渡され、 その値がcalc関数の仮引数のradiusにコピーされ、 それから、計算結果が返却値として返され、 その値が変数areaに代入されている。 === 関数に複数の返却値を持たせる方法 === 関数による通常の返却値の方法では、1つの値しか、呼び出し元関数に値を送れない しかし、特殊な方法を使うことにより、呼び出しもとの関数に、複数の値を送ることができます。 下記に述べるように、少なくとも以下の3つの方法があります。 === 「サブルーチン」との違い === C言語の関数のような「関数スコープの変数」のシステムは、他のプログラム言語(BASICなど)の「サブルーチン」には無いシステムです<ref name=full-basic>Full BASIC(ISO/IEC 10279)などの構造化BASICではサブルーチンや関数のなかでローカル変数を使用できます。</ref>。BASICのプログラム言語に、C言語でいう「ポインタ」システムが無いのは、そもそも関数スコープの変数のシステムがBASICには無いからです。 このC言語の「関数スコープの変数」システムこそが、C言語の「関数」システムの真骨頂(しんこっちょう)なのです。 構造化以前のBASICでサブルーチンを呼び出しても、ルーチン内で使用する変数に呼び出し前の変数とは別アドレスは与えられませんし、そもそもサブルーチン呼び出し時に「引数」のコピーをしませんし、そもそもサブルーチン呼び出しに「引数」は不要ですし、そもそも「引数」のような概念じたいBASICのサブルーチンの仕様には無いのです<ref name=full-basic/>。 BASICでのサブルーチンの呼び出しは、単に「GOSUB 100」の形式で100行目に処理を移し、RETURNで呼び出した行の次の行(GOSUBの次の行)から処理を続行します。 == static 変数とポインタの必要性 == このように、C言語の(ユーザーが自分で定義する)「関数」は、かなり特殊なシステムである。 <syntaxhighlight lang="C"> // static変数の使用例(コンパイルできる) #include <stdio.h> void func(void) { int b = 0; static int c = 0; b = b + 1; c = c + 1; printf("b = %d ,c = %d \n\n", b, c); } int main(void) { func(); func(); } </syntaxhighlight> ;実行結果 b = 1 ,c = 1 b = 1 ,c = 2 のようになる。 このように、static宣言された変数(上の例ではc)は、その関数が終わっても、数値が保存されます。 また、初期化がされる(cに0が代入される)のは、最初に呼び出された1回だけである。 static(静的)はdynamic(動的)との対比からです。ローカル変数はスタック上に一時的に記憶領域が確保され、関数を抜ける度にスコープを抜けます。 これに対して、static 変数は、プログラムが開始され終了するまでの期間に渡って同じ領域(同じアドレス)を持ち、これはグローバル変数と同じ特徴ですが、関数内で static 宣言された変数は、関数の外から参照できません。 なお、下記のように書くと、エラーになる なお、static宣言した変数を、他の関数とも共有したい場合には、さらに「グローバル変数」という物を使います。 すべての関数ブロックの外の、コード前半部の部分(グローバル領域)で、変数宣言をすると、その変数は、すべての関数からアクセスできます。 :※ 日本では、なぜか勘違い・生半可な理解で「グローバル変数はなるべく一切(いっさい)使わないで、保守性のために外部ファイルからアクセスできないように、ソフトウェア工学のカプセル化の手法を使うほうがイイ」という迷信があります。しかしこれはマチガイ・勘違いであり、証拠として文献『低レベルプログラミング』(Igor Zhirkov 著、古川邦夫 監訳)には、堂々と、カプセル化された部品(文献には「パーツ」とある)的なプログラムを呼び出す方法は「グローバル変数を使う」か「隠されていない一群の関数を使う」と書いてあります<ref>Igor Zhirkov 著、古川邦夫 監訳『低レベルプログラミング』、翔泳社、2018年01月19日 初版 第1刷 発行、310ページ</ref>。考えてみれば当然で、そもそも外部ファイルから何も変数や関数にアクセスできなければ、そもそもプログラムを起動できません。 さて、ともかく実用では、子サイド(呼び出し先)の関数で、親サイド(呼び出しもと)の変数の値も変更したい場合も多く、その場合には、「グローバル変数としての static 変数」(静的変数)もしくは「ポインタ」という機能をつかう。 グローバル領域でのstatic 変数は、その名前の変数は、どこの変数で呼び出されても、かつ共通のアドレスで管理しているので、呼び出した(子サイドの)関数の先で、親サイド(呼び出し元の)関数も書き換えできる機能をもつ。 さて、C言語の入門書での「関数」の章の前半に書いてあるプログラムで、static変数やグローバル変数やポインタを使わなくても利用できる(ユーザー定義)関数は、むしろ珍しいプログラムなのである。画面に「こんにちは!」などの文字などを表示するだけなら、static変数などを使わなくても、そのようなアルゴリズムを構築できるので、そのようなプログラムがC言語の入門書の『関数』の章に書かれるのであろう。 なお、「return a;」などのように戻り値をつかって 計算結果の数値を 親(呼び出しもと)の関数に送信したりする方法は、じつは、あまり実用的ではなく、現実には不便な場合が多いのである。 なぜなら、 :まず、親(呼び出しもと)の どの変数に値を送るかを、子(呼び出し先)のreturn文からは指定できないし、(けっして、親(呼び出しもと)の変数aなどを指定して、数値を代入してくれるわけではない) :しかも、その関数が終了してしまうので、ほかにも処理をその関数で続行したい場合に不便であるし、 :しかも、1つの数値しか送れない、 など、いろんな欠点があります。 :また、returnはエラーの有無を判定結果を呼び出しもと関数に送信するときに使用することが、実務では多い。たとえば if文などで、想定外の事態がなければ0を返却するようにプログラムを記述して、いっぽう想定外があれば-1を返却する、などのように、返却値の値により、想定外の有無を送信することが、実務などで多い。 C言語の入門書で、「return a + b;」などのように、return文で計算結果を送信する記述が書かれてるのは、初心者の学習のための配慮(はいりょ)なのであり、じつは、あまり実務的ではないプログラムである。そもそも、わざわざ別関数で「a+b」を計算せずとも、最初からmain関数内で「a+b」を計算すれば済む。 また、入門書で、ポインタの章と関数の章が別々に書かれていることが多いのは、初心者のための配慮(はいりょ)なのであり、じつは、現実では、ポインタと関数を別々に考えるのは、あまり実用的ではないだろう。 === 変数とスコープ === <syntaxhighlight lang="C"> int g; // gはグローバルスコープの変数 int main(void) { int l; // lはmain関数の関数スコープな変数 } </syntaxhighlight> C言語では通常、変数をある関数ブロックの内部で宣言した際、その変数は、その関数を抜けると参照できなくなります。 ある関数でしか通用しない変数を'''関数スコープの変数'''と呼びます。 これに対して、関数外で宣言した変数をグローバルスコープな変数と呼びプログラム中どこからでも参照できます。 関数スコープな変数は、関数ブロックを抜けると参照できなくなります。 そして、再度関数を呼び出したときには、以前の同名の変数の値は引き継ぎません。 用途によっては、この性質は好ましくなくグローバルスコープの変数の様にプログラムが実行中は値が永続してほしいことがあります。 そこで、関数スコープな変数の値を永続化する「記憶域クラス指定子static」があり、変数宣言に前置します。前の値は保存されていない。 ; スコープ 変数(などの識別子)の通用範囲のことをスコープと呼びます。 スコープは関数の本体を示す { から } までが代表的ですが、ブロック({ から } まで)もブロックスコープでブロック内で宣言された変数は、ブロックを抜けると参照できなくなります。 また、for文の第一項で宣言された変数のスコープは(たとえ { } で囲まれていなくても)もfor文がスコープになります。 === 関数原型 === main関数から呼び出される別の関数は、main関数よりも前で、存在が宣言されていなければならない。 そのため、main関数以外の関数は、main関数よりも前で、宣言されていなければならない。 しかし、main関数から呼び出される関数は、mainよりも前で宣言さえされていれば、たとえ具体的な定義内容がmain関数のあとで書かれていても、その関数をmain関数から呼び出して使用できます。そのため、以下のように、main関数から呼び出される関数の存在の宣言だけを先に行うという記法が許されており、この記法では、呼び出し先の関数の具体的な定義内容はmain関数のあとで定義する事が許されている。 このような関数の宣言方法のことを「関数のプロトタイプ宣言」などという。 (関数のプロトタイプ宣言の例) <syntaxhighlight lang="C"> //例 関数原型の使用例 #include <stdio.h> double function(double a, double b);//関数原型 int main(void) { printf("%f", function(0.12, 3.45)); } //2つの浮動小数点数の和を求めるfunction関数 //関数原型があるおかげで、 //関数の使用の後に関数の定義を書くことができます。 double function(double a, double b) { return a + b; } </syntaxhighlight> 関数原型(関数プロトタイプ)とは、関数の宣言である。 ある関数が使われる前に、その関数名、引数、返却値を示し、その関数が使えるようにする。 関数原型を使うと、引数の個数とデータ型がチェックされます。 関数原型を使わなくても、関数が使われる前に、その関数の定義を書くことで、その関数を使うことができます。 だが、ソースコードが大規模になるとそれも難しくなる。 また、関数原型を使わず、関数が使われる前にその関数の定義を書かなかった場合、返却値は暗黙のうちint型とされ引数のデータ型もチェックされません(C11 では、関数宣言において型指定子を必須とし、暗黙的な型指定を禁じています)。 関数原型の記述は次のようになっている。 <syntaxhighlight lang="C"> 返却値のデータ型 関数名(引数のリスト); </syntaxhighlight> 引数のリストの記述は次のようになっている。 <syntaxhighlight lang="C"> 引数のデータ型 引数名 </syntaxhighlight> 引数のリストには、引数がない場合はvoidのみを書く。 複数の引数がある場合、コンマで区切る。 関数原型の引数の有効範囲は、関数宣言子の最後で終了する(関数原型有効範囲)。 <ref>『JISX3010:2003』p.21「6.2.1 識別子の有効範囲」</ref> ==== static変数を使う ==== :(※ 未記述) 上述したとおり。 ==== ポインタを使う方法 ==== ポインタを使う方法である。しかし、ポインタを使えば、2つ以上の数値を操作する事ができるので、ポインタを使って、親(呼び出し元)関数の複数の値を操作する事ができるので、それを「複数の返却値である」と解釈する事もできる このような事を、「ポインタによる参照渡しの引数を、返却値として用いる」などと言ったりするが、要するにポインタを使って親(呼び出し元)の変数の値を操作するというだけの事であり、あまり深い意味はない。 <syntaxhighlight lang="C"> //例 ポインタを使って関数に複数の返却値を持たせる。 #include <stdio.h> int function(int *a, int *b) { *a = 1234; *b = 5678; } int main(void) { int i,j; function(&i, &j); printf("iの値は%d、jの値は%d。", i, j); } </syntaxhighlight> ==== 構造体を使う方法 ==== 別の方法として、返却値のデータ型に構造体を使って、 その構造体で複数の返却値を表現する方法もある。 <syntaxhighlight lang="C"> #include <stdio.h> #include <string.h> //例 構造体を使って関数に複数の返却値を持たせる。 typedef struct { int i; double d; char c; char str[32]; } sKouzoutai; sKouzoutai function() { sKouzoutai ret; ret.i = 1234; ret.d = 3.14; ret.c = 'a'; strcpy(ret.str, "Hello. World!"); return ret; } int main(void) { sKouzoutai kouzoutai; kouzoutai = function(); printf("kouzoutaiのメンバの値は、%d %f %c %sです。\n", kouzoutai.i, kouzoutai.d, kouzoutai.c, kouzoutai.str); return 0; } </syntaxhighlight> しかし、関数の返却値は、エラー判別などに利用される場合も多いので(関数によって「エラーなら返却値に 0 以外を返却する」などの仕様のある場合も多い)、よって上述の手法は、あまりオススメできません。 なお、strcpyは、文字列をコピーするための関数。strcpyを使うには、string.hのインクルードが必要である。 === swap関数 === aとbとの値を入れ替えるswap関数を考える。下記コードは誤った例である。 <syntaxhighlight lang="C"> //例 誤ったswap関数 #include <stdio.h> // グロ-バル変数を使って、交換用の変数をswap外部と共有しようと意図しているが・・・ int x; int a; int b; void swap(int a, int b) { x = a; a = b; b = x; } int main() { a = 1; b = 2; printf("swap前のa=%d, b=%d\n", a, b); swap(a, b); printf("swap後のa=%d, b=%d\n", a, b); } </syntaxhighlight> この例は意図通りに動作しない。結果は <pre> swap前のa=1, b=2 swap後のa=1, b=2 </pre> と表示され、なにも交換されていない。 こう失敗する原因は、呼び出され側のswap()の引数で用いられている値を格納する変数(上記コード例の<code> swap(int a,int b) </code> のaおよびb )によって、グローバル変数の a ,b が隠されてしまっているからである。 たとえグローバル領域で「a」「b」と同名の変数があっても、swap関数内では同名なだけの別変数としての仮引数「a」「b」が新たに関数swap内では用意されてしまう。 :この様に、外部のスコープのインスタンスがより内側のスコープで同じ識別子を持つインスタンスによって隠されてしまう事を、シャドーイング(Shadowing)と呼びます。 ユーザ定義関数内で変数の値を交換させるためには、一例として、下記のようにポインタを使ってmain関数の変数a,bを書き換える方法があります。 <syntaxhighlight lang="C"> //例 正しいswap関数 #include <stdio.h> void swap(int *a, int *b) { int x = *a; *a = *b; *b = x; } int main() { int a = 1, b = 2; printf("swap前のa=%d, b=%d\n", a, b); swap(&a, &b); printf("swap後のa=%d, b=%d\n", a, b); } </syntaxhighlight> この例は意図通りに動作する。 <pre> swap前のa=1, b=2 swap後のa=2, b=1 </pre> と表示されます。 ポインタを使うと成功する理由は、main関数の関数スコープの変数のアドレスが仮引数にコピーされたため、swap関数がmain関数の関数スコープの変数a,bにアクセスできているからである(ポインタを介したswap関数内のa,bはもはや関数スコープの変数だけでなくグローバル変数にもアクセスできる)。 <!-- ポインタを使った例は「参照渡し」ではなく「ポインタの値を用いた値渡し」である。(C言語に参照渡しはない)。これを間違えると C++ で本物の参照渡しに出会ったとき混乱する。 なお、 :ポインタを使わない例「誤ったswap関数」のように実引数の値を仮引数にコピーすることを''値渡し''と呼びます。 :ポインタを使った例「正しいswap関数」のように実引数のアドレスを仮引数にコピーすることを''参照渡し''と呼びます。 <ref>値渡しと参照渡しという用語はよく使われるが、『JISX3010:2003』には出てこない。</ref> --> ---- ユーザ定義関数を何も書かずに全てmain関数に書く方法を使えば、ポインタを使わずとも交換できます。 標準C言語では考える必要は無いが、別のプログラム言語だと、言語によってはポインタが標準設定では使用禁止されていたり(たとえばC#がそうである)、そもそもポインタに相当する機能の無い言語も考えられる<ref>最近は Fortran ですらポインタがあるのでポインタのない言語は非常に限られ、ポインタがなくてもVariant型に類する型がある場合が多い。</ref>。そのような場合でも、下記コードのようなアルゴリズムで、変数の交換は可能である。 <syntaxhighlight lang="C"> //例 swap関数を使わない場合 #include <stdio.h> int main() { int a = 1, b = 2; printf("swap前のa=%d, b=%d\n", a, b); int x = a; a = b; b = x; printf("swap後のa=%d, b=%d\n", a, b); } </syntaxhighlight> <pre> swap前のa=1, b=2 swap後のa=2, b=1 </pre> この処理を、マクロを使って一般化すると <syntaxhighlight lang="C"> //例 マクロを使った場合 #include <stdio.h> #define swap_int(a,b) do {int __temp=a;a=b;b=__temp;}while(0) int main() { int a = 1, b = 2; printf("swap前のa=%d, b=%d\n", a, b); swap_int(a,b); printf("swap後のa=%d, b=%d\n", a, b); } </syntaxhighlight> ※ 一度も反復しない<syntaxhighlight lang="C" inline>do { ... } while(0)</syntaxhighlight>は、変数__temp のスコープを切るため。 <pre> swap前のa=1, b=2 swap後のa=2, b=1 </pre> {{コラム|新たに変数を用意せず2つの変数を入れ替える|2= <syntaxhighlight lang="C"> #include <stdio.h> int main() { int a = 1, b = 2; /* a の初期値を A、b の初期値を B として... */ printf("swap前のa=%d, b=%d\n", a, b); a ^= b; /* a = A ^ B */ b ^= a; /* b = B ^ A ^ B ... A */ a ^= b; /* a = A ^ B ^ A ... B */ printf("swap後のa=%d, b=%d\n", a, b); } </syntaxhighlight> ※ <code>^</code>は、排他的論理和演算子。 結果 swap前のa=1, b=2 swap後のa=2, b=1 }} === 関数の引数として配列を渡す === 関数の引数として配列を渡すには、配列変数名を引数とする(配列変数名は配列の先頭要素へのポインタ)。 ;[https://paiza.io/projects/iNPWQDNDnb3BgbBpGe_b4A?language=c 関数の引数として配列を渡す]:<syntaxhighlight lang="C"> #include <stdio.h> int sum(int *array, int size) { int s = 0; for (int i = 0; i < size; i++) s += array[i]; return s; } int main(void) { int a[10] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29}; int s = sum(a, sizeof a / sizeof *a); printf("%d\n", s); } </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> 129 </syntaxhighlight> == ブロックスコープ == 複合文( Compound statement )は、ブロックとも呼ばれ、宣言や文を1つの構文単位にまとめたものです。自動保存期間を持つオブジェクトの初期化子や、ブロックスコープを持つ通常の識別子の可変長配列宣言子は、宣言が実行順に到達するたびに、あたかも文のように評価されてオブジェクトに値が格納され(初期化子のないオブジェクトに不確定な値が格納されることも含む)、各宣言内では宣言子が現れる順に評価されます<ref name="jtc1-sc22-wg14-n2596-6.8">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2596.pdf | title = N2596 working draft — December 11, 2020 ISO/IEC 9899:202x (E) | page = 122, §6.8 ''Statements and blocks'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>。 == 文字列型を引数にする関数 == {{Main|[[C言語/文字と文字列]]}} == 脚註・出典など == <references/> == 参考文献 == * 日本工業標準調査会『JISX3010 プログラム言語C』2003年12月20日改正 [[Category:C言語|かんすう]] fc8qzvhhiu6xjcrz288reg9q1qq4vzy 205598 205597 2022-07-21T01:22:28Z Ef3 694 /* static 変数とポインタの必要性 */ グローバル変数には、かつての errno の様に有用な用途もありますが、プログラムのどこからも参照や変更ができるので、goto文と同程度に有害です。 C11からは、errno はマクロになりました。 wikitext text/x-wiki {{Nav}} == 関数の基本 == C言語のプログラムは全て1つ以上の「関数」(かんすう)と呼ばれる処理のまとまりから構成されます。 関数を用いて、いくつかの文をまとめることができます。「main関数」も関数であり、「printf」や「scanf」なども関数であるが、それとは別に、ユーザーがいくつかの処理をまとめて「関数」として定義できます。 C言語の「関数」は、他のプログラム言語でいう「サブルーチン」のような性質がある(値を返すことができるかが関数とサブルルーチンの大きな違いです。)。 {{コラム|Visual Studio で、デバッグ セッションの終了時にコンソールが閉じてしまう場合| Visual Studio で、デバッグ セッションの終了時にコンソールが閉じてしまう場合は、 : [ツール] -> [オプション] -> [デバッグ] -> [デバッグの停止時に自動的にコンソールを閉じる] を無効にします。 }} === 関数の定義 === ユーザーが自分で定義する関数について、記法の例を表します。 ; 例 2つの整数を引数にとりその和を返却する関数 : <syntaxhighlight lang="C"> int function(int a, int b) { return a + b; } </syntaxhighlight> 上記コードの「function」の部分が、その関数の名前であり、プログラマーが英数字と _ なら自由に関数に名前をつけられます(ただし「if」などのキーワードや「printf」などのライブラリ関数名は使用できません)。「function」でなくても「myFunc」などでも構いません。 以下、特にことわらないかぎり、ユーザーが定義した関数を、単に「関数」と省略する。main関数やprintfなども「関数」と省略する場合がありますが、ユーザーが定義したこと以外に違いはありません。 関数を呼び出す際、関数の 呼び出し元(仮に「親」と呼ぼう) から 呼び出し先関数(仮に「子」と呼ぼう)へ情報を渡すことができ、この渡された情報のことを'''仮引数'''(かりひきすう、''parameter'')、渡した情報のことを'''実引数'''(じつひきすう、''argument'')と呼びます。 関数の定義の記述は次のようになっている。 ; 形式 : <syntaxhighlight lang="C"> 返却値のデータ型 関数名 ( 引数リスト ) { /*いくつかの文*/ } </syntaxhighlight> 関数名とはその関数を他の関数と区別するために付ける名前のことで、関数名に使えるのは半角英数、「_(下線)」である。ただし、先頭は非数字でなければならない。 多バイト文字を使用できるかは言語処理系によります。 関数は他の関数の中で呼び出すことができます。 また、引数は省略できる場合があります。 :<syntaxhighlight lang="C"> 返却値のデータ型 関数名() { /*いくつかの文*/ } </syntaxhighlight> のように関数を記述する場合もある<ref>引数の省略はC23で廃止予定で、voidを明示する必要があります。</ref>。 === 関数の呼び出し === 定義した関数を呼び出す際の記述は、たとえば次のように行う。 <syntaxhighlight lang="C"> //例 上の例の関数を呼び出す int myFunc(int a, int b) { return a + b; } int main(void){ int r; r = myFunc(1, 2);//rには1と2との和である3が代入されます。 } </syntaxhighlight> 関数の定義側で書かれた引数のことを'''仮引数'''(かりひきすう、''parameter'')という。 いっぽう、関数の呼び出し側で書かれた引数のことを'''実引数'''(じつひきすう、''argument'')という。 ---- 複数の仮引数を持つ場合、「,(コンマ)」で区切る。仮引数を持たない場合 void を書きます。 ; 仮引数 : <syntaxhighlight lang="C"> 仮引数のデータ型 仮引数名 </syntaxhighlight> ---- 任意個数の実引数について、実引数を持たない場合は何も書かきません。 複数の実引数を持つ場合、「,(コンマ)」で区切る。 ; 実引数 : <syntaxhighlight lang="C"> 関数名(任意個数の実引数); </syntaxhighlight> ---- また、関数の呼び出し先から呼び出し元へ情報を渡すこともでき、この情報を返却値と呼びます。 返却値のデータ型で返却値の有無や種類を決定すします。 任意個数の仮引数で仮引数の数や種類を決定すします。 ---- この例では、myFunc関数の実引数である1,2が、myFunc関数の仮引数であるa,bにコピーされ、a+bがmyFunc関数の返却値として返され、その値がrに代入されます。 関数を呼び出すとき、 引数と戻り番地(リターンアドレス)がスタックに格納されます<ref>ARMアーキテクチャの様にリンクレジスタに戻り番地を記憶するアーキテクチャもあります。</ref>。 また、返却値がレジスタや予め呼び出し側の関数が用意した領域に格納されます<ref>引数・返却値・戻り番地をどの様に渡したり返したりするかはアーキテクチャごとに異なり、ABI(application binary interface)で定められています。</ref>。 == 引数と返却値 == === 引数と返却値をもたない関数 === <syntaxhighlight lang="C"> //例 引数と返却値をもたない関数 #include <stdio.h> void HelloWorld() { printf("Hello, World!\n"); } int main(void) { HelloWorld(); } </syntaxhighlight> この例では自作のHelloWorld関数を使って文字列を表示しています。 このHelloWorld関数は引数と返却値をもたない関数である。 このプログラムでは、 まずmain関数が呼ばれ、 次にmain関数内のHelloWorld関数を呼ぶ文が実行されることでHelloWorld関数が呼ばれ、 HelloWorld関数内のprintf関数を呼ぶ文が実行されることでprintf関数が呼ばれる。 そしてprintf関数が終了してHelloWorld関数に戻り、 HelloWorld関数が終了してmain関数に戻り、 main関数が終了してプログラムが終了する。 この例では関数を自作したメリットはないが、 同じ処理がソースコードのあちこちに出てくる場合などは、 その同じ処理を自作の関数にまとめるとメリットがあります。 === 引数と返却値をもつ関数 === <syntaxhighlight lang="C"> //例 引数と返却値をもつ関数 #include <stdio.h> double calc(double radius)//「calc関数の定義」 { return 3.14*radius*radius; } int main(void) { double radius, area; printf("円の半径を入力してください。:"); scanf("%lf", &radius); area=calc(radius);//「calc関数の呼び出し」 printf("円の面積は%fです。\n",area); } </syntaxhighlight> この例では、自作のcalc関数を用いて、円の半径から円の面積を計算しています。 このcalc関数は引数と返却値をもつ関数である。 「calc関数の呼び出し」のところのradiusを実引数と呼びます。 「calc関数の定義」のところのradiusを仮引数と呼びます。 このプログラムでは、 「calc関数の呼び出し」で、まずmain関数のradiusが実引数としてcalc関数に渡され、 その値がcalc関数の仮引数のradiusにコピーされ、 それから、計算結果が返却値として返され、 その値が変数areaに代入されている。 === 関数に複数の返却値を持たせる方法 === 関数による通常の返却値の方法では、1つの値しか、呼び出し元関数に値を送れない しかし、特殊な方法を使うことにより、呼び出しもとの関数に、複数の値を送ることができます。 下記に述べるように、少なくとも以下の3つの方法があります。 === 「サブルーチン」との違い === C言語の関数のような「関数スコープの変数」のシステムは、他のプログラム言語(BASICなど)の「サブルーチン」には無いシステムです<ref name=full-basic>Full BASIC(ISO/IEC 10279)などの構造化BASICではサブルーチンや関数のなかでローカル変数を使用できます。</ref>。BASICのプログラム言語に、C言語でいう「ポインタ」システムが無いのは、そもそも関数スコープの変数のシステムがBASICには無いからです。 このC言語の「関数スコープの変数」システムこそが、C言語の「関数」システムの真骨頂(しんこっちょう)なのです。 構造化以前のBASICでサブルーチンを呼び出しても、ルーチン内で使用する変数に呼び出し前の変数とは別アドレスは与えられませんし、そもそもサブルーチン呼び出し時に「引数」のコピーをしませんし、そもそもサブルーチン呼び出しに「引数」は不要ですし、そもそも「引数」のような概念じたいBASICのサブルーチンの仕様には無いのです<ref name=full-basic/>。 BASICでのサブルーチンの呼び出しは、単に「GOSUB 100」の形式で100行目に処理を移し、RETURNで呼び出した行の次の行(GOSUBの次の行)から処理を続行します。 == static 変数とポインタの必要性 == このように、C言語の(ユーザーが自分で定義する)「関数」は、かなり特殊なシステムである。 <syntaxhighlight lang="C"> // static変数の使用例(コンパイルできる) #include <stdio.h> void func(void) { int b = 0; static int c = 0; b = b + 1; c = c + 1; printf("b = %d ,c = %d \n\n", b, c); } int main(void) { func(); func(); } </syntaxhighlight> ;実行結果 b = 1 ,c = 1 b = 1 ,c = 2 のようになる。 このように、static宣言された変数(上の例ではc)は、その関数が終わっても、数値が保存されます。 また、初期化がされる(cに0が代入される)のは、最初に呼び出された1回だけである。 static(静的)はdynamic(動的)との対比からです。ローカル変数はスタック上に一時的に記憶領域が確保され、関数を抜ける度にスコープを抜けます。 これに対して、static 変数は、プログラムが開始され終了するまでの期間に渡って同じ領域(同じアドレス)を持ち、これはグローバル変数と同じ特徴ですが、関数内で static 宣言された変数は、関数の外から参照できません。 なお、下記のように書くと、エラーになる なお、static宣言した変数を、他の関数とも共有したい場合には、さらに「グローバル変数」という物を使います。 すべての関数ブロックの外の、コード前半部の部分(グローバル領域)で、変数宣言をすると、その変数は、すべての関数からアクセスできます。 グローバル変数には、かつての errno の様に有用な用途もありますが、プログラムのどこからも参照や変更ができるので、goto文と同程度に有害です。 C11からは、errno はマクロになりました。 === 変数とスコープ === <syntaxhighlight lang="C"> int g; // gはグローバルスコープの変数 int main(void) { int l; // lはmain関数の関数スコープな変数 } </syntaxhighlight> C言語では通常、変数をある関数ブロックの内部で宣言した際、その変数は、その関数を抜けると参照できなくなります。 ある関数でしか通用しない変数を'''関数スコープの変数'''と呼びます。 これに対して、関数外で宣言した変数をグローバルスコープな変数と呼びプログラム中どこからでも参照できます。 関数スコープな変数は、関数ブロックを抜けると参照できなくなります。 そして、再度関数を呼び出したときには、以前の同名の変数の値は引き継ぎません。 用途によっては、この性質は好ましくなくグローバルスコープの変数の様にプログラムが実行中は値が永続してほしいことがあります。 そこで、関数スコープな変数の値を永続化する「記憶域クラス指定子static」があり、変数宣言に前置します。前の値は保存されていない。 ; スコープ 変数(などの識別子)の通用範囲のことをスコープと呼びます。 スコープは関数の本体を示す { から } までが代表的ですが、ブロック({ から } まで)もブロックスコープでブロック内で宣言された変数は、ブロックを抜けると参照できなくなります。 また、for文の第一項で宣言された変数のスコープは(たとえ { } で囲まれていなくても)もfor文がスコープになります。 === 関数原型 === main関数から呼び出される別の関数は、main関数よりも前で、存在が宣言されていなければならない。 そのため、main関数以外の関数は、main関数よりも前で、宣言されていなければならない。 しかし、main関数から呼び出される関数は、mainよりも前で宣言さえされていれば、たとえ具体的な定義内容がmain関数のあとで書かれていても、その関数をmain関数から呼び出して使用できます。そのため、以下のように、main関数から呼び出される関数の存在の宣言だけを先に行うという記法が許されており、この記法では、呼び出し先の関数の具体的な定義内容はmain関数のあとで定義する事が許されている。 このような関数の宣言方法のことを「関数のプロトタイプ宣言」などという。 (関数のプロトタイプ宣言の例) <syntaxhighlight lang="C"> //例 関数原型の使用例 #include <stdio.h> double function(double a, double b);//関数原型 int main(void) { printf("%f", function(0.12, 3.45)); } //2つの浮動小数点数の和を求めるfunction関数 //関数原型があるおかげで、 //関数の使用の後に関数の定義を書くことができます。 double function(double a, double b) { return a + b; } </syntaxhighlight> 関数原型(関数プロトタイプ)とは、関数の宣言である。 ある関数が使われる前に、その関数名、引数、返却値を示し、その関数が使えるようにする。 関数原型を使うと、引数の個数とデータ型がチェックされます。 関数原型を使わなくても、関数が使われる前に、その関数の定義を書くことで、その関数を使うことができます。 だが、ソースコードが大規模になるとそれも難しくなる。 また、関数原型を使わず、関数が使われる前にその関数の定義を書かなかった場合、返却値は暗黙のうちint型とされ引数のデータ型もチェックされません(C11 では、関数宣言において型指定子を必須とし、暗黙的な型指定を禁じています)。 関数原型の記述は次のようになっている。 <syntaxhighlight lang="C"> 返却値のデータ型 関数名(引数のリスト); </syntaxhighlight> 引数のリストの記述は次のようになっている。 <syntaxhighlight lang="C"> 引数のデータ型 引数名 </syntaxhighlight> 引数のリストには、引数がない場合はvoidのみを書く。 複数の引数がある場合、コンマで区切る。 関数原型の引数の有効範囲は、関数宣言子の最後で終了する(関数原型有効範囲)。 <ref>『JISX3010:2003』p.21「6.2.1 識別子の有効範囲」</ref> ==== static変数を使う ==== :(※ 未記述) 上述したとおり。 ==== ポインタを使う方法 ==== ポインタを使う方法である。しかし、ポインタを使えば、2つ以上の数値を操作する事ができるので、ポインタを使って、親(呼び出し元)関数の複数の値を操作する事ができるので、それを「複数の返却値である」と解釈する事もできる このような事を、「ポインタによる参照渡しの引数を、返却値として用いる」などと言ったりするが、要するにポインタを使って親(呼び出し元)の変数の値を操作するというだけの事であり、あまり深い意味はない。 <syntaxhighlight lang="C"> //例 ポインタを使って関数に複数の返却値を持たせる。 #include <stdio.h> int function(int *a, int *b) { *a = 1234; *b = 5678; } int main(void) { int i,j; function(&i, &j); printf("iの値は%d、jの値は%d。", i, j); } </syntaxhighlight> ==== 構造体を使う方法 ==== 別の方法として、返却値のデータ型に構造体を使って、 その構造体で複数の返却値を表現する方法もある。 <syntaxhighlight lang="C"> #include <stdio.h> #include <string.h> //例 構造体を使って関数に複数の返却値を持たせる。 typedef struct { int i; double d; char c; char str[32]; } sKouzoutai; sKouzoutai function() { sKouzoutai ret; ret.i = 1234; ret.d = 3.14; ret.c = 'a'; strcpy(ret.str, "Hello. World!"); return ret; } int main(void) { sKouzoutai kouzoutai; kouzoutai = function(); printf("kouzoutaiのメンバの値は、%d %f %c %sです。\n", kouzoutai.i, kouzoutai.d, kouzoutai.c, kouzoutai.str); return 0; } </syntaxhighlight> しかし、関数の返却値は、エラー判別などに利用される場合も多いので(関数によって「エラーなら返却値に 0 以外を返却する」などの仕様のある場合も多い)、よって上述の手法は、あまりオススメできません。 なお、strcpyは、文字列をコピーするための関数。strcpyを使うには、string.hのインクルードが必要である。 === swap関数 === aとbとの値を入れ替えるswap関数を考える。下記コードは誤った例である。 <syntaxhighlight lang="C"> //例 誤ったswap関数 #include <stdio.h> // グロ-バル変数を使って、交換用の変数をswap外部と共有しようと意図しているが・・・ int x; int a; int b; void swap(int a, int b) { x = a; a = b; b = x; } int main() { a = 1; b = 2; printf("swap前のa=%d, b=%d\n", a, b); swap(a, b); printf("swap後のa=%d, b=%d\n", a, b); } </syntaxhighlight> この例は意図通りに動作しない。結果は <pre> swap前のa=1, b=2 swap後のa=1, b=2 </pre> と表示され、なにも交換されていない。 こう失敗する原因は、呼び出され側のswap()の引数で用いられている値を格納する変数(上記コード例の<code> swap(int a,int b) </code> のaおよびb )によって、グローバル変数の a ,b が隠されてしまっているからである。 たとえグローバル領域で「a」「b」と同名の変数があっても、swap関数内では同名なだけの別変数としての仮引数「a」「b」が新たに関数swap内では用意されてしまう。 :この様に、外部のスコープのインスタンスがより内側のスコープで同じ識別子を持つインスタンスによって隠されてしまう事を、シャドーイング(Shadowing)と呼びます。 ユーザ定義関数内で変数の値を交換させるためには、一例として、下記のようにポインタを使ってmain関数の変数a,bを書き換える方法があります。 <syntaxhighlight lang="C"> //例 正しいswap関数 #include <stdio.h> void swap(int *a, int *b) { int x = *a; *a = *b; *b = x; } int main() { int a = 1, b = 2; printf("swap前のa=%d, b=%d\n", a, b); swap(&a, &b); printf("swap後のa=%d, b=%d\n", a, b); } </syntaxhighlight> この例は意図通りに動作する。 <pre> swap前のa=1, b=2 swap後のa=2, b=1 </pre> と表示されます。 ポインタを使うと成功する理由は、main関数の関数スコープの変数のアドレスが仮引数にコピーされたため、swap関数がmain関数の関数スコープの変数a,bにアクセスできているからである(ポインタを介したswap関数内のa,bはもはや関数スコープの変数だけでなくグローバル変数にもアクセスできる)。 <!-- ポインタを使った例は「参照渡し」ではなく「ポインタの値を用いた値渡し」である。(C言語に参照渡しはない)。これを間違えると C++ で本物の参照渡しに出会ったとき混乱する。 なお、 :ポインタを使わない例「誤ったswap関数」のように実引数の値を仮引数にコピーすることを''値渡し''と呼びます。 :ポインタを使った例「正しいswap関数」のように実引数のアドレスを仮引数にコピーすることを''参照渡し''と呼びます。 <ref>値渡しと参照渡しという用語はよく使われるが、『JISX3010:2003』には出てこない。</ref> --> ---- ユーザ定義関数を何も書かずに全てmain関数に書く方法を使えば、ポインタを使わずとも交換できます。 標準C言語では考える必要は無いが、別のプログラム言語だと、言語によってはポインタが標準設定では使用禁止されていたり(たとえばC#がそうである)、そもそもポインタに相当する機能の無い言語も考えられる<ref>最近は Fortran ですらポインタがあるのでポインタのない言語は非常に限られ、ポインタがなくてもVariant型に類する型がある場合が多い。</ref>。そのような場合でも、下記コードのようなアルゴリズムで、変数の交換は可能である。 <syntaxhighlight lang="C"> //例 swap関数を使わない場合 #include <stdio.h> int main() { int a = 1, b = 2; printf("swap前のa=%d, b=%d\n", a, b); int x = a; a = b; b = x; printf("swap後のa=%d, b=%d\n", a, b); } </syntaxhighlight> <pre> swap前のa=1, b=2 swap後のa=2, b=1 </pre> この処理を、マクロを使って一般化すると <syntaxhighlight lang="C"> //例 マクロを使った場合 #include <stdio.h> #define swap_int(a,b) do {int __temp=a;a=b;b=__temp;}while(0) int main() { int a = 1, b = 2; printf("swap前のa=%d, b=%d\n", a, b); swap_int(a,b); printf("swap後のa=%d, b=%d\n", a, b); } </syntaxhighlight> ※ 一度も反復しない<syntaxhighlight lang="C" inline>do { ... } while(0)</syntaxhighlight>は、変数__temp のスコープを切るため。 <pre> swap前のa=1, b=2 swap後のa=2, b=1 </pre> {{コラム|新たに変数を用意せず2つの変数を入れ替える|2= <syntaxhighlight lang="C"> #include <stdio.h> int main() { int a = 1, b = 2; /* a の初期値を A、b の初期値を B として... */ printf("swap前のa=%d, b=%d\n", a, b); a ^= b; /* a = A ^ B */ b ^= a; /* b = B ^ A ^ B ... A */ a ^= b; /* a = A ^ B ^ A ... B */ printf("swap後のa=%d, b=%d\n", a, b); } </syntaxhighlight> ※ <code>^</code>は、排他的論理和演算子。 結果 swap前のa=1, b=2 swap後のa=2, b=1 }} === 関数の引数として配列を渡す === 関数の引数として配列を渡すには、配列変数名を引数とする(配列変数名は配列の先頭要素へのポインタ)。 ;[https://paiza.io/projects/iNPWQDNDnb3BgbBpGe_b4A?language=c 関数の引数として配列を渡す]:<syntaxhighlight lang="C"> #include <stdio.h> int sum(int *array, int size) { int s = 0; for (int i = 0; i < size; i++) s += array[i]; return s; } int main(void) { int a[10] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29}; int s = sum(a, sizeof a / sizeof *a); printf("%d\n", s); } </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> 129 </syntaxhighlight> == ブロックスコープ == 複合文( Compound statement )は、ブロックとも呼ばれ、宣言や文を1つの構文単位にまとめたものです。自動保存期間を持つオブジェクトの初期化子や、ブロックスコープを持つ通常の識別子の可変長配列宣言子は、宣言が実行順に到達するたびに、あたかも文のように評価されてオブジェクトに値が格納され(初期化子のないオブジェクトに不確定な値が格納されることも含む)、各宣言内では宣言子が現れる順に評価されます<ref name="jtc1-sc22-wg14-n2596-6.8">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2596.pdf | title = N2596 working draft — December 11, 2020 ISO/IEC 9899:202x (E) | page = 122, §6.8 ''Statements and blocks'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>。 == 文字列型を引数にする関数 == {{Main|[[C言語/文字と文字列]]}} == 脚註・出典など == <references/> == 参考文献 == * 日本工業標準調査会『JISX3010 プログラム言語C』2003年12月20日改正 [[Category:C言語|かんすう]] kenrufgucip2qqb97h8jqh7jka3jluk 205603 205598 2022-07-21T03:18:08Z Ef3 694 /* static 変数とポインタの必要性 */ cleanup wikitext text/x-wiki {{Nav}} == 関数の基本 == C言語のプログラムは全て1つ以上の「関数」(かんすう)と呼ばれる処理のまとまりから構成されます。 関数を用いて、いくつかの文をまとめることができます。「main関数」も関数であり、「printf」や「scanf」なども関数であるが、それとは別に、ユーザーがいくつかの処理をまとめて「関数」として定義できます。 C言語の「関数」は、他のプログラム言語でいう「サブルーチン」のような性質がある(値を返すことができるかが関数とサブルルーチンの大きな違いです。)。 {{コラム|Visual Studio で、デバッグ セッションの終了時にコンソールが閉じてしまう場合| Visual Studio で、デバッグ セッションの終了時にコンソールが閉じてしまう場合は、 : [ツール] -> [オプション] -> [デバッグ] -> [デバッグの停止時に自動的にコンソールを閉じる] を無効にします。 }} === 関数の定義 === ユーザーが自分で定義する関数について、記法の例を表します。 ; 例 2つの整数を引数にとりその和を返却する関数 : <syntaxhighlight lang="C"> int function(int a, int b) { return a + b; } </syntaxhighlight> 上記コードの「function」の部分が、その関数の名前であり、プログラマーが英数字と _ なら自由に関数に名前をつけられます(ただし「if」などのキーワードや「printf」などのライブラリ関数名は使用できません)。「function」でなくても「myFunc」などでも構いません。 以下、特にことわらないかぎり、ユーザーが定義した関数を、単に「関数」と省略する。main関数やprintfなども「関数」と省略する場合がありますが、ユーザーが定義したこと以外に違いはありません。 関数を呼び出す際、関数の 呼び出し元(仮に「親」と呼ぼう) から 呼び出し先関数(仮に「子」と呼ぼう)へ情報を渡すことができ、この渡された情報のことを'''仮引数'''(かりひきすう、''parameter'')、渡した情報のことを'''実引数'''(じつひきすう、''argument'')と呼びます。 関数の定義の記述は次のようになっている。 ; 形式 : <syntaxhighlight lang="C"> 返却値のデータ型 関数名 ( 引数リスト ) { /*いくつかの文*/ } </syntaxhighlight> 関数名とはその関数を他の関数と区別するために付ける名前のことで、関数名に使えるのは半角英数、「_(下線)」である。ただし、先頭は非数字でなければならない。 多バイト文字を使用できるかは言語処理系によります。 関数は他の関数の中で呼び出すことができます。 また、引数は省略できる場合があります。 :<syntaxhighlight lang="C"> 返却値のデータ型 関数名() { /*いくつかの文*/ } </syntaxhighlight> のように関数を記述する場合もある<ref>引数の省略はC23で廃止予定で、voidを明示する必要があります。</ref>。 === 関数の呼び出し === 定義した関数を呼び出す際の記述は、たとえば次のように行う。 <syntaxhighlight lang="C"> //例 上の例の関数を呼び出す int myFunc(int a, int b) { return a + b; } int main(void){ int r; r = myFunc(1, 2);//rには1と2との和である3が代入されます。 } </syntaxhighlight> 関数の定義側で書かれた引数のことを'''仮引数'''(かりひきすう、''parameter'')という。 いっぽう、関数の呼び出し側で書かれた引数のことを'''実引数'''(じつひきすう、''argument'')という。 ---- 複数の仮引数を持つ場合、「,(コンマ)」で区切る。仮引数を持たない場合 void を書きます。 ; 仮引数 : <syntaxhighlight lang="C"> 仮引数のデータ型 仮引数名 </syntaxhighlight> ---- 任意個数の実引数について、実引数を持たない場合は何も書かきません。 複数の実引数を持つ場合、「,(コンマ)」で区切る。 ; 実引数 : <syntaxhighlight lang="C"> 関数名(任意個数の実引数); </syntaxhighlight> ---- また、関数の呼び出し先から呼び出し元へ情報を渡すこともでき、この情報を返却値と呼びます。 返却値のデータ型で返却値の有無や種類を決定すします。 任意個数の仮引数で仮引数の数や種類を決定すします。 ---- この例では、myFunc関数の実引数である1,2が、myFunc関数の仮引数であるa,bにコピーされ、a+bがmyFunc関数の返却値として返され、その値がrに代入されます。 関数を呼び出すとき、 引数と戻り番地(リターンアドレス)がスタックに格納されます<ref>ARMアーキテクチャの様にリンクレジスタに戻り番地を記憶するアーキテクチャもあります。</ref>。 また、返却値がレジスタや予め呼び出し側の関数が用意した領域に格納されます<ref>引数・返却値・戻り番地をどの様に渡したり返したりするかはアーキテクチャごとに異なり、ABI(application binary interface)で定められています。</ref>。 == 引数と返却値 == === 引数と返却値をもたない関数 === <syntaxhighlight lang="C"> //例 引数と返却値をもたない関数 #include <stdio.h> void HelloWorld() { printf("Hello, World!\n"); } int main(void) { HelloWorld(); } </syntaxhighlight> この例では自作のHelloWorld関数を使って文字列を表示しています。 このHelloWorld関数は引数と返却値をもたない関数である。 このプログラムでは、 まずmain関数が呼ばれ、 次にmain関数内のHelloWorld関数を呼ぶ文が実行されることでHelloWorld関数が呼ばれ、 HelloWorld関数内のprintf関数を呼ぶ文が実行されることでprintf関数が呼ばれる。 そしてprintf関数が終了してHelloWorld関数に戻り、 HelloWorld関数が終了してmain関数に戻り、 main関数が終了してプログラムが終了する。 この例では関数を自作したメリットはないが、 同じ処理がソースコードのあちこちに出てくる場合などは、 その同じ処理を自作の関数にまとめるとメリットがあります。 === 引数と返却値をもつ関数 === <syntaxhighlight lang="C"> //例 引数と返却値をもつ関数 #include <stdio.h> double calc(double radius)//「calc関数の定義」 { return 3.14*radius*radius; } int main(void) { double radius, area; printf("円の半径を入力してください。:"); scanf("%lf", &radius); area=calc(radius);//「calc関数の呼び出し」 printf("円の面積は%fです。\n",area); } </syntaxhighlight> この例では、自作のcalc関数を用いて、円の半径から円の面積を計算しています。 このcalc関数は引数と返却値をもつ関数である。 「calc関数の呼び出し」のところのradiusを実引数と呼びます。 「calc関数の定義」のところのradiusを仮引数と呼びます。 このプログラムでは、 「calc関数の呼び出し」で、まずmain関数のradiusが実引数としてcalc関数に渡され、 その値がcalc関数の仮引数のradiusにコピーされ、 それから、計算結果が返却値として返され、 その値が変数areaに代入されている。 === 関数に複数の返却値を持たせる方法 === 関数による通常の返却値の方法では、1つの値しか、呼び出し元関数に値を送れない しかし、特殊な方法を使うことにより、呼び出しもとの関数に、複数の値を送ることができます。 下記に述べるように、少なくとも以下の3つの方法があります。 === 「サブルーチン」との違い === C言語の関数のような「関数スコープの変数」のシステムは、他のプログラム言語(BASICなど)の「サブルーチン」には無いシステムです<ref name=full-basic>Full BASIC(ISO/IEC 10279)などの構造化BASICではサブルーチンや関数のなかでローカル変数を使用できます。</ref>。BASICのプログラム言語に、C言語でいう「ポインタ」システムが無いのは、そもそも関数スコープの変数のシステムがBASICには無いからです。 このC言語の「関数スコープの変数」システムこそが、C言語の「関数」システムの真骨頂(しんこっちょう)なのです。 構造化以前のBASICでサブルーチンを呼び出しても、ルーチン内で使用する変数に呼び出し前の変数とは別アドレスは与えられませんし、そもそもサブルーチン呼び出し時に「引数」のコピーをしませんし、そもそもサブルーチン呼び出しに「引数」は不要ですし、そもそも「引数」のような概念じたいBASICのサブルーチンの仕様には無いのです<ref name=full-basic/>。 BASICでのサブルーチンの呼び出しは、単に「GOSUB 100」の形式で100行目に処理を移し、RETURNで呼び出した行の次の行(GOSUBの次の行)から処理を続行します。 == static 変数とポインタの必要性 == このように、C言語の(ユーザーが自分で定義する)「関数」は、かなり特殊なシステムである。 <syntaxhighlight lang="C"> // static変数の使用例(コンパイルできる) #include <stdio.h> void func(void) { int b = 0; static int c = 0; b = b + 1; c = c + 1; printf("b = %d ,c = %d \n\n", b, c); } int main(void) { func(); func(); } </syntaxhighlight> ;実行結果 b = 1 ,c = 1 b = 1 ,c = 2 のようになる。 このように、static宣言された変数(上の例ではc)は、その関数が終わっても、数値が保存されます。 また、初期化がされる(cに0が代入される)のは、最初に呼び出された1回だけである。 static(静的)はdynamic(動的)との対比からです。ローカル変数はスタック上に一時的に記憶領域が確保され、関数を抜ける度にスコープを抜けます。 これに対して、static 変数は、プログラムが開始され終了するまでの期間に渡って同じ領域(同じアドレス)を持ち、これはグローバル変数と同じ特徴ですが、関数内で static 宣言された変数は、関数の外から参照できません。 すべての関数ブロックの外の、コード前半部の部分(グローバル領域)で、変数宣言をすると、その変数は、すべての関数からアクセスできます。 グローバル変数には、かつての errno の様に有用な用途もありますが、プログラムのどこからも参照や変更ができるので、goto文と同程度に有害です。 C11からは、errno はマクロになりました。 === 変数とスコープ === <syntaxhighlight lang="C"> int g; // gはグローバルスコープの変数 int main(void) { int l; // lはmain関数の関数スコープな変数 } </syntaxhighlight> C言語では通常、変数をある関数ブロックの内部で宣言した際、その変数は、その関数を抜けると参照できなくなります。 ある関数でしか通用しない変数を'''関数スコープの変数'''と呼びます。 これに対して、関数外で宣言した変数をグローバルスコープな変数と呼びプログラム中どこからでも参照できます。 関数スコープな変数は、関数ブロックを抜けると参照できなくなります。 そして、再度関数を呼び出したときには、以前の同名の変数の値は引き継ぎません。 用途によっては、この性質は好ましくなくグローバルスコープの変数の様にプログラムが実行中は値が永続してほしいことがあります。 そこで、関数スコープな変数の値を永続化する「記憶域クラス指定子static」があり、変数宣言に前置します。前の値は保存されていない。 ; スコープ 変数(などの識別子)の通用範囲のことをスコープと呼びます。 スコープは関数の本体を示す { から } までが代表的ですが、ブロック({ から } まで)もブロックスコープでブロック内で宣言された変数は、ブロックを抜けると参照できなくなります。 また、for文の第一項で宣言された変数のスコープは(たとえ { } で囲まれていなくても)もfor文がスコープになります。 === 関数原型 === main関数から呼び出される別の関数は、main関数よりも前で、存在が宣言されていなければならない。 そのため、main関数以外の関数は、main関数よりも前で、宣言されていなければならない。 しかし、main関数から呼び出される関数は、mainよりも前で宣言さえされていれば、たとえ具体的な定義内容がmain関数のあとで書かれていても、その関数をmain関数から呼び出して使用できます。そのため、以下のように、main関数から呼び出される関数の存在の宣言だけを先に行うという記法が許されており、この記法では、呼び出し先の関数の具体的な定義内容はmain関数のあとで定義する事が許されている。 このような関数の宣言方法のことを「関数のプロトタイプ宣言」などという。 (関数のプロトタイプ宣言の例) <syntaxhighlight lang="C"> //例 関数原型の使用例 #include <stdio.h> double function(double a, double b);//関数原型 int main(void) { printf("%f", function(0.12, 3.45)); } //2つの浮動小数点数の和を求めるfunction関数 //関数原型があるおかげで、 //関数の使用の後に関数の定義を書くことができます。 double function(double a, double b) { return a + b; } </syntaxhighlight> 関数原型(関数プロトタイプ)とは、関数の宣言である。 ある関数が使われる前に、その関数名、引数、返却値を示し、その関数が使えるようにする。 関数原型を使うと、引数の個数とデータ型がチェックされます。 関数原型を使わなくても、関数が使われる前に、その関数の定義を書くことで、その関数を使うことができます。 だが、ソースコードが大規模になるとそれも難しくなる。 また、関数原型を使わず、関数が使われる前にその関数の定義を書かなかった場合、返却値は暗黙のうちint型とされ引数のデータ型もチェックされません(C11 では、関数宣言において型指定子を必須とし、暗黙的な型指定を禁じています)。 関数原型の記述は次のようになっている。 <syntaxhighlight lang="C"> 返却値のデータ型 関数名(引数のリスト); </syntaxhighlight> 引数のリストの記述は次のようになっている。 <syntaxhighlight lang="C"> 引数のデータ型 引数名 </syntaxhighlight> 引数のリストには、引数がない場合はvoidのみを書く。 複数の引数がある場合、コンマで区切る。 関数原型の引数の有効範囲は、関数宣言子の最後で終了する(関数原型有効範囲)。 <ref>『JISX3010:2003』p.21「6.2.1 識別子の有効範囲」</ref> ==== static変数を使う ==== :(※ 未記述) 上述したとおり。 ==== ポインタを使う方法 ==== ポインタを使う方法である。しかし、ポインタを使えば、2つ以上の数値を操作する事ができるので、ポインタを使って、親(呼び出し元)関数の複数の値を操作する事ができるので、それを「複数の返却値である」と解釈する事もできる このような事を、「ポインタによる参照渡しの引数を、返却値として用いる」などと言ったりするが、要するにポインタを使って親(呼び出し元)の変数の値を操作するというだけの事であり、あまり深い意味はない。 <syntaxhighlight lang="C"> //例 ポインタを使って関数に複数の返却値を持たせる。 #include <stdio.h> int function(int *a, int *b) { *a = 1234; *b = 5678; } int main(void) { int i,j; function(&i, &j); printf("iの値は%d、jの値は%d。", i, j); } </syntaxhighlight> ==== 構造体を使う方法 ==== 別の方法として、返却値のデータ型に構造体を使って、 その構造体で複数の返却値を表現する方法もある。 <syntaxhighlight lang="C"> #include <stdio.h> #include <string.h> //例 構造体を使って関数に複数の返却値を持たせる。 typedef struct { int i; double d; char c; char str[32]; } sKouzoutai; sKouzoutai function() { sKouzoutai ret; ret.i = 1234; ret.d = 3.14; ret.c = 'a'; strcpy(ret.str, "Hello. World!"); return ret; } int main(void) { sKouzoutai kouzoutai; kouzoutai = function(); printf("kouzoutaiのメンバの値は、%d %f %c %sです。\n", kouzoutai.i, kouzoutai.d, kouzoutai.c, kouzoutai.str); return 0; } </syntaxhighlight> しかし、関数の返却値は、エラー判別などに利用される場合も多いので(関数によって「エラーなら返却値に 0 以外を返却する」などの仕様のある場合も多い)、よって上述の手法は、あまりオススメできません。 なお、strcpyは、文字列をコピーするための関数。strcpyを使うには、string.hのインクルードが必要である。 === swap関数 === aとbとの値を入れ替えるswap関数を考える。下記コードは誤った例である。 <syntaxhighlight lang="C"> //例 誤ったswap関数 #include <stdio.h> // グロ-バル変数を使って、交換用の変数をswap外部と共有しようと意図しているが・・・ int x; int a; int b; void swap(int a, int b) { x = a; a = b; b = x; } int main() { a = 1; b = 2; printf("swap前のa=%d, b=%d\n", a, b); swap(a, b); printf("swap後のa=%d, b=%d\n", a, b); } </syntaxhighlight> この例は意図通りに動作しない。結果は <pre> swap前のa=1, b=2 swap後のa=1, b=2 </pre> と表示され、なにも交換されていない。 こう失敗する原因は、呼び出され側のswap()の引数で用いられている値を格納する変数(上記コード例の<code> swap(int a,int b) </code> のaおよびb )によって、グローバル変数の a ,b が隠されてしまっているからである。 たとえグローバル領域で「a」「b」と同名の変数があっても、swap関数内では同名なだけの別変数としての仮引数「a」「b」が新たに関数swap内では用意されてしまう。 :この様に、外部のスコープのインスタンスがより内側のスコープで同じ識別子を持つインスタンスによって隠されてしまう事を、シャドーイング(Shadowing)と呼びます。 ユーザ定義関数内で変数の値を交換させるためには、一例として、下記のようにポインタを使ってmain関数の変数a,bを書き換える方法があります。 <syntaxhighlight lang="C"> //例 正しいswap関数 #include <stdio.h> void swap(int *a, int *b) { int x = *a; *a = *b; *b = x; } int main() { int a = 1, b = 2; printf("swap前のa=%d, b=%d\n", a, b); swap(&a, &b); printf("swap後のa=%d, b=%d\n", a, b); } </syntaxhighlight> この例は意図通りに動作する。 <pre> swap前のa=1, b=2 swap後のa=2, b=1 </pre> と表示されます。 ポインタを使うと成功する理由は、main関数の関数スコープの変数のアドレスが仮引数にコピーされたため、swap関数がmain関数の関数スコープの変数a,bにアクセスできているからである(ポインタを介したswap関数内のa,bはもはや関数スコープの変数だけでなくグローバル変数にもアクセスできる)。 <!-- ポインタを使った例は「参照渡し」ではなく「ポインタの値を用いた値渡し」である。(C言語に参照渡しはない)。これを間違えると C++ で本物の参照渡しに出会ったとき混乱する。 なお、 :ポインタを使わない例「誤ったswap関数」のように実引数の値を仮引数にコピーすることを''値渡し''と呼びます。 :ポインタを使った例「正しいswap関数」のように実引数のアドレスを仮引数にコピーすることを''参照渡し''と呼びます。 <ref>値渡しと参照渡しという用語はよく使われるが、『JISX3010:2003』には出てこない。</ref> --> ---- ユーザ定義関数を何も書かずに全てmain関数に書く方法を使えば、ポインタを使わずとも交換できます。 標準C言語では考える必要は無いが、別のプログラム言語だと、言語によってはポインタが標準設定では使用禁止されていたり(たとえばC#がそうである)、そもそもポインタに相当する機能の無い言語も考えられる<ref>最近は Fortran ですらポインタがあるのでポインタのない言語は非常に限られ、ポインタがなくてもVariant型に類する型がある場合が多い。</ref>。そのような場合でも、下記コードのようなアルゴリズムで、変数の交換は可能である。 <syntaxhighlight lang="C"> //例 swap関数を使わない場合 #include <stdio.h> int main() { int a = 1, b = 2; printf("swap前のa=%d, b=%d\n", a, b); int x = a; a = b; b = x; printf("swap後のa=%d, b=%d\n", a, b); } </syntaxhighlight> <pre> swap前のa=1, b=2 swap後のa=2, b=1 </pre> この処理を、マクロを使って一般化すると <syntaxhighlight lang="C"> //例 マクロを使った場合 #include <stdio.h> #define swap_int(a,b) do {int __temp=a;a=b;b=__temp;}while(0) int main() { int a = 1, b = 2; printf("swap前のa=%d, b=%d\n", a, b); swap_int(a,b); printf("swap後のa=%d, b=%d\n", a, b); } </syntaxhighlight> ※ 一度も反復しない<syntaxhighlight lang="C" inline>do { ... } while(0)</syntaxhighlight>は、変数__temp のスコープを切るため。 <pre> swap前のa=1, b=2 swap後のa=2, b=1 </pre> {{コラム|新たに変数を用意せず2つの変数を入れ替える|2= <syntaxhighlight lang="C"> #include <stdio.h> int main() { int a = 1, b = 2; /* a の初期値を A、b の初期値を B として... */ printf("swap前のa=%d, b=%d\n", a, b); a ^= b; /* a = A ^ B */ b ^= a; /* b = B ^ A ^ B ... A */ a ^= b; /* a = A ^ B ^ A ... B */ printf("swap後のa=%d, b=%d\n", a, b); } </syntaxhighlight> ※ <code>^</code>は、排他的論理和演算子。 結果 swap前のa=1, b=2 swap後のa=2, b=1 }} === 関数の引数として配列を渡す === 関数の引数として配列を渡すには、配列変数名を引数とする(配列変数名は配列の先頭要素へのポインタ)。 ;[https://paiza.io/projects/iNPWQDNDnb3BgbBpGe_b4A?language=c 関数の引数として配列を渡す]:<syntaxhighlight lang="C"> #include <stdio.h> int sum(int *array, int size) { int s = 0; for (int i = 0; i < size; i++) s += array[i]; return s; } int main(void) { int a[10] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29}; int s = sum(a, sizeof a / sizeof *a); printf("%d\n", s); } </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> 129 </syntaxhighlight> == ブロックスコープ == 複合文( Compound statement )は、ブロックとも呼ばれ、宣言や文を1つの構文単位にまとめたものです。自動保存期間を持つオブジェクトの初期化子や、ブロックスコープを持つ通常の識別子の可変長配列宣言子は、宣言が実行順に到達するたびに、あたかも文のように評価されてオブジェクトに値が格納され(初期化子のないオブジェクトに不確定な値が格納されることも含む)、各宣言内では宣言子が現れる順に評価されます<ref name="jtc1-sc22-wg14-n2596-6.8">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2596.pdf | title = N2596 working draft — December 11, 2020 ISO/IEC 9899:202x (E) | page = 122, §6.8 ''Statements and blocks'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>。 == 文字列型を引数にする関数 == {{Main|[[C言語/文字と文字列]]}} == 脚註・出典など == <references/> == 参考文献 == * 日本工業標準調査会『JISX3010 プログラム言語C』2003年12月20日改正 [[Category:C言語|かんすう]] 3ky2aonmjv3kboksey48rqvl4nie61d C言語/標準ライブラリ/stdio.h 0 11671 205604 189065 2022-07-21T03:48:06Z Ef3 694 /* gets関数 */ gets関数はC11で削除されました。 また、gets関数は読取る文字数を指定できないため、 原理的に、バッファオーバーランを防ぐことができません。 wikitext text/x-wiki {{Nav}} ヘッダー <code><stdio.h></code> にはいくつかのマクロが定義されており、入出力を行うための3つの型と多くの関数が宣言されています。 == 概要 == 入出力の関数を使用するためには、ヘッダー <code>stdio.h</code> をインクルードする<ref>『JISX3010:2003』p.188「7.19 入出力<stdio.h>」</ref><ref name="jtc1-sc22-wg14-n1570-7.21">{{cite book | url=http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf | title= C11: WG14/N1570 Committee Draft — April 12, 2011 ISO/IEC 9899:201x | page=296,§ 7.21 ''Input/output <stdio.h>'' | publisher=ISO/IEC}}</ref>。 === ストリーム === <ref>『JISX3010:2003』p.190「7.19.2 ストリーム」</ref> ストリーム(stream)とは、物理装置やファイルなどに対する入出力を統一的に扱う概念です。 ストリームには、テキストストリーム(text stream)とバイナリストリーム(binary stream)の2種類があります。 テキストストリームは、行(line)を構成する順序づけた文字の並びです。 テキストとは、メモ帳(notepad.exe)などのテキストエディタでデータを閲覧したときのように、データをテキスト形式で処理します。 バイナリストリームは、内部データをそのまま記録することのできる順序付けされた文字の並びです。 バイナリとは、バイナリエディタでデータを閲覧したときのように、データをバイナリ形式で処理します。 === ファイル === <ref>『JISX3010:2003』p.191「7.19.3 ファイル」</ref> ファイルに対する操作は次のような手順で行う。 #FILEポインタを宣言します。 #ファイルをオープン(open)します。 #ファイルにデータを入出力します。 #ファイルをクローズ(close)します。(ただし、main関数が最初の呼び出し元に戻る場合又はexit関数が呼ばれた場合、すべてのオープンされているファイルをプログラム終了前にクローズします。) プログラム開始時に3つのテキストストリームがあらかじめ定義されています。 ; stdinは、通常の入力を読み取るための'''標準入力(standard input)'''です。 ; stdoutは、通常の出力を書き込むための'''標準出力(standard output)'''です。 ; stderrは、診断出力を書き込むための'''標準エラー(standard error)'''です。 === 例 === 入出力<stdio.h>には、一定の手順で呼び出さなければならない関数が多い。 そこで、用途別にいくつかの例を挙げておくこととします。 ==== 例:テキストファイルの読み書き ==== テキストファイルへ書き込む場合、fopen関数の第二引数に"w"などを指定します。 テキストファイルから読み込む場合、fopen関数の第二引数に"r"などを指定します。 : <syntaxhighlight lang=c> #include <stdio.h> int main(void) { FILE *fp; char *filename = "example.txt"; char str[16] = ""; //ファイルへ文字列を出力します。 if ((fp = fopen(filename, "w")) == NULL) { //ファイルをテキスト書き込みモードでオープンします。 printf("オープン操作が失敗しました。\n"); return 1; } fprintf(fp, "Hello,World!\n"); //ファイルへ文字列を書き込む。 fclose(fp); //ファイルをクローズします。 //ファイルから文字列を入力します。 if ((fp = fopen(filename, "r")) == NULL) { //ファイルをテキスト読み取りモードでオープンします。 printf("オープン操作が失敗しました。\n"); return 1; } fscanf(fp, "%15s", str); //ファイルから文字列を読み込む。 fclose(fp); //ファイルをクローズします。 //文字列を表示します。 printf("%s", str); } </syntaxhighlight> リンク:[[#fopen関数]]、[[#fprintf関数]]、[[#fclose関数]]、[[#fscanf関数]] : <syntaxhighlight lang=c> #include <stdio.h> int main(void) { FILE *fp; char *filename = "example.txt"; char c; //ファイルへ文字を出力します。 if ((fp = fopen(filename, "w")) == NULL) { //ファイルをテキスト書き込みモードでオープンします。 printf("オープン操作が失敗しました。\n"); return 1; } fputc('a', fp); //ファイルへ文字を書き込む。 fclose(fp); //ファイルをクローズします。 //ファイルから文字を入力します。 if ((fp = fopen(filename, "r")) == NULL) { //ファイルをテキスト読み取りモードでオープンします。 printf("オープン操作が失敗しました。\n"); return 1; } c = fgetc(fp); //ファイルから文字を読み込む。 fclose(fp); //ファイルをクローズします。 //文字を表示します。 printf("%c", c); } </syntaxhighlight> リンク:[[#fopen関数]]、[[#fputc関数]]、[[#fclose関数]]、[[#fgetc関数]] : <syntaxhighlight lang=c> //例 fputs、fgets関数を用いたテキストファイルの読み書き #include <stdio.h> int main(void) { FILE *fp; char *filename="example.txt"; char str[16]=""; //ファイルへ文字列を出力します。 if((fp=fopen(filename, "w"))==NULL){//ファイルをテキスト書き込みモードでオープンします。 printf("オープン操作が失敗しました。\n"); return 1; } fputs("Hello,World!\n", fp);//ファイルへ文字列を書き込む。 fclose(fp);//ファイルをクローズします。 //ファイルから文字列を入力します。 if((fp=fopen(filename, "r"))==NULL){//ファイルをテキスト読み取りモードでオープンします。 printf("オープン操作が失敗しました。\n"); return 1; } fgets(str, sizeof(str), fp);//ファイルから文字列を読み込む。 fclose(fp);//ファイルをクローズします。 //文字列を表示します。 printf("%s", str); } </syntaxhighlight> リンク:[[#fopen関数]]、[[#fputs関数]]、[[#fclose関数]]、[[#fgets関数]] ==== 例:バイナリファイルの読み書き ==== バイナリファイル<ref>バイナリファイルはテキストファイルと比較して、エンディアンやパディングなど環境依存度が高いので注意が必要です。</ref>へ書き込む場合、fopen関数の第二引数に"wb"などを指定します。 バイナリファイルから読み込む場合、fopen関数の第二引数に"rb"などを指定します。 : <syntaxhighlight lang=c> #include <stdio.h> int main(void) { FILE *fp; char *filename="example.dat"; int i=1234; //ファイルへ数値を出力します。 if((fp=fopen(filename, "wb"))==NULL){//ファイルをバイナリ書き込みモードでオープンします。 printf("オープン操作が失敗しました。\n"); return 1; } fwrite(&i, sizeof(int), 1, fp);//ファイルへ数値を書き込む。 fclose(fp);//ファイルをクローズします。 //ファイルから数値を入力します。 if((fp=fopen(filename, "rb"))==NULL){//ファイルをバイナリ読み取りモードでオープンします。 printf("オープン操作が失敗しました。\n"); return 1; } fread(&i, sizeof(int), 1, fp);//ファイルから数値を読み込む。 fclose(fp);//ファイルをクローズします。 //数値を表示します。 printf("%d", i); } </syntaxhighlight> リンク:[[#fopen関数]]、[[#fwrite関数]]、[[#fclose関数]]、[[#fread関数]] ==== 例:printf関数での変換指定の使い方 ==== printf関数などでは、フラグ、最小フィールド幅、精度などを指定することで、様々な書式で文字列を出力することができる。 : <syntaxhighlight lang=c> #include <stdio.h> int main(void) { int i=1234; double pi=3.14159265359; //フラグの使い方 printf("%8d\n", i); //「 1234(改行)」と表示される。 printf("%-8d\n", i); //「1234 (改行)」と表示される。 printf("%+d\n", i); //「+1234(改行)」と表示される。 printf("% d\n", i); //「 1234(改行)」と表示される。 printf("%#o\n", i); //「02322(改行)」と表示される。 printf("%#x\n", i); //「0x4d2(改行)」と表示される。 printf("%08d\n", i); //「00001234(改行)」と表示される。 //最小フィールド幅の使い方 printf("%8d\n", i); //「 1234(改行)」と表示される。 //精度の使い方 printf("%.2f", pi); //「3.14(改行)」と表示される。 } </syntaxhighlight> リンク:[[#printf関数]] ==== 例:scanf関数での変換指定の使い方 ==== scanf関数などでは、代入抑止文字、最大フィールド幅、走査文字集合などを指定することで、様々な書式で文字列を入力することができる。 : <syntaxhighlight lang=c> //例 代入抑止文字*の使用例 #include <stdio.h> int main(void) { char c; printf("\n2文字の文字を入力してください:"); if (scanf("%*c%c", &c) == EOF) {; //1文字目を読み飛ばし、2文字目を入力します。 printf("End of File に達しました。\n"); return 1; } printf("\n入力した2文字目は%cです。", c); } </syntaxhighlight> リンク:[[#printf関数]]、[[#scanf関数]] : <syntaxhighlight lang=c> //例 最大フィールド幅の使用例 #include <stdio.h> int main(void) { char str[16]; printf("\n15文字の文字列を入力してください:"); if (scanf("%15s", str) == EOF) { //15文字入力します。 printf("End of File に達しました。\n"); return 1; } printf("\n入力した文字列は%sです。", str); } </syntaxhighlight> リンク:[[#printf関数]]、[[#scanf関数]] : <syntaxhighlight lang=c> //例 走査文字集合の使用例 #include <stdio.h> int main(void) { char str[2]=""; printf("\nyまたはnを入力してください:"); if (scanf("%1[yn]", &str) == EOF) { //ynのみを入力します。 printf("End of File に達しました。\n"); return 1; } printf("\n入力した文字は%cです。", str[0]); } </syntaxhighlight> リンク:[[#printf関数]]、[[#scanf関数]] ==== 例:fgetpos関数とfsetpos関数の使い方 ==== : <syntaxhighlight lang=c> #include <stdio.h> int main(void) { FILE *fp; char *filename="example.txt"; fpos_t pos_first, pos_second; if((fp=fopen(filename, "w+"))==NULL){//ファイルをテキストファイルの更新(書き込み及び読み取り)モードでオープンします。 printf("オープン操作が失敗しました。\n"); return 1; } //最初のファイル位置表示子を取得し表示します。 fgetpos(fp, &pos_first); printf("最初のファイル位置表示子は%ld\n", pos_first); //文字列を書き込んでから、ファイル位置表示子を取得し表示します。 fprintf(fp, "Hello,World!\n");//ファイルへ文字列を書き込む。 fgetpos(fp, &pos_second); printf("文字列を書き込んだ後のファイル位置表示子は%ld\n", pos_second); //最初のファイル位置表示子に設定します。 if(fsetpos(fp, &pos_first)==0){ //元に戻したファイル位置表示子を取得し表示します。 fgetpos(fp, &pos_first); printf("元に戻したファイル位置表示子は%ld\n", pos_first); }else{ printf("fsetpos関数に失敗しました。"); } fclose(fp);//ファイルをクローズします。 } </syntaxhighlight> リンク:[[#fopen関数]]、[[#fgetpos関数]]、[[#fprintf関数]]、[[#fsetpos関数]]、[[#fclose関数]] ==== 例:fseek関数とftell関数の使い方 ==== : <syntaxhighlight lang=c> //getfilesize.c #include <stdio.h> int main(int argc, char *argv[]) { FILE *fp; if(argc<2){//コマンドライン引数をチェック printf("getfilesize ファイル名\n"); return 1; } if((fp=fopen(argv[1], "rb"))==NULL){//ファイルをバイナリファイルの読み取りモードでオープンします。 printf("オープン操作が失敗しました。\n"); return 1; } //ファイルサイズを取得し表示します。 fseek(fp, 0L, SEEK_END); printf("%sのファイルサイズは%ldバイトです。\n", argv[1], ftell(fp)); fclose(fp);//ファイルをクローズします。 } </syntaxhighlight> リンク:[[#fopen関数]]、[[#fseek関数]]、[[#ftell関数]]、[[#fclose関数]] ==== 例:clearerr関数とfeof関数の使い方 ==== : <syntaxhighlight lang=c> //feof.c #include <stdio.h> int main(int argc, char *argv[]) { FILE *fp; char c; if(argc<2){//コマンドライン引数をチェック printf("feof ファイル名\n"); return 1; } if((fp=fopen(argv[1], "r"))==NULL){//ファイルをテキストファイルの読み取りモードでオープンします。 printf("オープン操作が失敗しました。\n"); return 1; } //ファイル終了表示子がセットされるまで、ファイルから文字を読み込む。 while(feof(fp)==0){ c=fgetc(fp); } //ファイル終了表示子がセットされているか判定し表示します。 if(feof(fp)!=0) printf("ファイル終了表示子がセットされています。\n"); else printf("ファイル終了表示子がセットされていません。\n"); clearerr(fp);//ファイル終了表示子をクリアします。 //ファイル終了表示子がセットされているか判定し表示します。 if(feof(fp)!=0) printf("ファイル終了表示子がセットされています。\n"); else printf("ファイル終了表示子がセットされていません。\n"); fclose(fp);//ファイルをクローズします。 } </syntaxhighlight> リンク:[[#fopen関数]]、[[#feof関数]]、[[#fgetc関数]]、[[#clearerr関数]]、[[#fclose関数]] ==== 例:clearerr関数とferror関数の使い方 ==== : <syntaxhighlight lang=c> //ferror.c #include <stdio.h> int main(int argc, char *argv[]) { FILE *fp; char c; if(argc<2){//コマンドライン引数をチェック printf("ferror ファイル名\n"); return 1; } if((fp=fopen(argv[1], "r"))==NULL){//ファイルをテキストファイルの読み取りモードでオープンします。 printf("オープン操作が失敗しました。\n"); return 1; } //ファイルへ文字を書き込む。 fputc('a', fp); //エラー表示子がセットされているか判定し表示します。 if(ferror(fp)!=0) printf("エラー表示子がセットされています。\n"); else printf("エラー表示子がセットされていません。\n"); clearerr(fp);//エラー表示子をクリアします。 //エラー表示子がセットされているか判定し表示します。 if(ferror(fp)!=0) printf("エラー表示子がセットされています。\n"); else printf("エラー表示子がセットされていません。\n"); fclose(fp);//ファイルをクローズします。 } </syntaxhighlight> リンク:[[#fopen関数]]、[[#fputc関数]]、[[#ferror関数]]、[[#clearerr関数]]、[[#fclose関数]] == 概説 == ヘッダー <stdio.h> にはいくつかのマクロが定義されており、入出力を行うための3つの型と多くの関数が宣言されています<ref name="jtc1-sc22-wg14-n2596-7.21.1">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 217, §7.21.1 ''Introduction'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>。 === 型 === ; size_t :size_tは、sizeof演算子の結果の符号なし整数型とします<ref name="jtc1-sc22-wg14-n2596-7.19">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 211, §7.19 ''Common definitions <stddef.h>'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>。 ; FILE :FILEは、ファイル位置表示子、結び付けられたバッファへのポインタ、エラー表示子、ファイル終了表示子など、ストリームを制御するために必要なすべての情報を記録することのできるオブジェクト型です。 :;ファイル位置表示子(''file position indicator'') ::ファイル内のすべての位置を一意に特定するために必要なすべての情報。 :;エラー表示子(''error indicator'') ::読み取りエラーまたは書き込みエラーが起こったかどうかを記録します。 :;ファイル終了表示子(''end-of-file indicator'') ::ファイルの終わりに達したかどうかを記録します。 ; fpos_t :fpos_tは、ファイルの中の任意の位置を一意に指定するために必要なすべての情報を記録することが可能な配列型以外のオブジェクト型です。 === マクロ === ; NULL :NULLは、処理系定義の空ポインタ定数に展開します<ref name="jtc1-sc22-wg14-n2596-7.19"/>。 ; _IOFBF、_IOLBF、_IONBF :setvbuf関数の第3実引数として使用するために適した別々の値をもつ整数定数式。{{See also|#setvbuf関数}} ; BUFSIZ :setbuf関数によって使われるバッファの大きさを表す整数定数式。{{See also|#setbuf関数}} ; EOF :ファイルの終わり(end-of-file)を示す、int型の負の値をもつ整数定数式。 ; FOPEN_MAX :同時にオープンできることを処理系が保証するファイル数の最小値を表す整数定数式。 ; FILENAM_MAX :オープンできることを処理系が保証する最大長のファイル名文字列を保持するのに、char型の配列が必要とする十分な大きさを表す整数定数式。 ; L_tmpnam :tmpnam関数によって生成される一時ファイルを保持するのに、char型の配列が必要とする十分な大きさを表す整数定数式。{{See also|#tmpnam関数}} ; SEEK_CUR、SEEK_END、SEEK_SET :fseek関数の第3実引数として使用するために適した別々の値をもつ整数定数式{{See also|#fseek関数}} ; TMP_MAX :tmpnam関数によって生成される一意なファイル名の最大個数を表す整数定数式{{See also|#tmpnam関数}} ; stderr、stdin、stdout :それぞれ標準エラー、標準入力及び標準出力ストリームに結び付けられたFILEオブジェクトを指す型「FILEへのポインタ」をもつ式。 == ファイルに対する操作 == ISO/IEC 9899:2017 §7.21.4 ''Operations on files''<ref name="jtc1-sc22-wg14-n2596-7.21.4">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 221, §7.21.4 ''Operations on files'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>. === remove関数 === ISO/IEC 9899:2017 § 7.21.4.1 ''The remove function''<ref name="jtc1-sc22-wg14-n2596-7.21.4.1">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 221, §7.21.4.1 ''The remove function'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>。 ; 形式 : <syntaxhighlight lang=c> #include <stdio.h> int remove(const char *filename); </syntaxhighlight> ; 機能 : remove関数は、filenameが指し示す文字列を名前とするファイルを、その名前ではアクセスできないようにします。その後、その名前でファイルを開こうとしても、新たに作成しない限り失敗します。ファイルが開かれている場合、remove関数の動作は実装によって異なります。<!--2 The remove function causes the file whose name is the string pointed to by filename to be no longer accessible by that name. A subsequent attempt to open that file using that name will fail, unless it is created anew. If the file is open, the behavior of the remove function is implementation-defined.--> ; 返却値 : remove関数は、操作が成功した場合はゼロを、失敗した場合は非ゼロを返します。<!--3 The remove function returns zero if the operation succeeds, nonzero if it fails.--> ; 例 : <syntaxhighlight lang=c> #include <stdio.h> int main(void) { char filename[256]; printf("削除するファイルの名前を入力してください。:"); if (scanf("%256s", filename)) { printf("End of File に達しました。\n"); return 1; } if (remove(filename) == 0) printf("%sを削除しました。\n", filename); else perror("削除に失敗しました。"); } </syntaxhighlight> === rename関数 === ISO/IEC 9899:2017 § 7.21.4.2 ''The rename function''<ref name="jtc1-sc22-wg14-n2596-7.21.4.2">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 221, §7.21.4.2 ''The rename function'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>。 ; 形式 : <syntaxhighlight lang=c> #include <stdio.h> int rename(const char *old, const char *new); </syntaxhighlight> ; 機能 : rename関数は、oldが指す文字列を名前とするファイルを、newが指す文字列で指定された名前で今後は知られるようにします。old という名前のファイルは、その名前ではアクセスできなくなります。rename 関数が呼び出される前に new が指す文字列で指定されたファイルが存在していた場合、その動作は実装で定義されています。<!--The rename function causes the file whose name is the string pointed to by old to be henceforth known by the name given by the string pointed to by new. The file named old is no longer accessible by that name. If a file named by the string pointed to by new exists prior to the call to the rename function, the behavior is implementation-defined.--> ; 返却値 : rename関数は、操作が成功した場合はゼロを返し、失敗した場合はゼロ以外を返します。 その場合、ファイルが以前に存在していれば、元の名前でアクセスできます。<!--The rename function returns zero if the operation succeeds, nonzero if it fails,273) in which case if the file existed previously it is still known by its original name. to copy its contents to effectuate its renaming.--> ; 例 : <syntaxhighlight lang=c> #include <stdio.h> int main(void) { char oldfilename[256], newfilename[256]; printf("リネーム前のファイル名を入力してください。:"); if (scanf("%256s", oldfilename) == EOF) { printf("End of File に達しました。\n"); return 1; } printf("リネーム後のファイル名を入力してください。:"); if (scanf("%256s", newfilename) == EOF) { printf("End of File に達しました。\n"); return 1; } if (rename(oldfilename, newfilename) == 0) printf("%sを%sへリネームしました。\n", oldfilename, newfilename); else perror("リネームに失敗しました。"); } </syntaxhighlight> === tmpfile関数 === ISO/IEC 9899:2017 § 7.21.4.3 ''The tmpfile function''<ref name="jtc1-sc22-wg14-n2596-7.21.4.3">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 222, §7.21.4.3 ''The tmpfile function'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>。 ; 形式 : <syntaxhighlight lang=c> #include <stdio.h> FILE *tmpfile(void); </syntaxhighlight> ; 機能 :tmpfile関数は、他の既存のファイルとは異なる一時的なバイナリファイルを作成し、閉じたときやプログラムの終了時に自動的に削除されます。プログラムが異常終了した場合 プログラムが異常終了した場合、開いている一時ファイルが削除されるかどうかは実装で決まる。ファイルは "wb+"モードで更新用にオープンされる。 ; 返却値 :tmpfile 関数は、作成したファイルのストリームへのポインタを返す。ファイルが作成できない場合、tmpfile 関数は NULL ポインタを返す。 {{See also| [[../stdio.h#fopen関数 | fopen関数<stdio.h>]] }} ; 例 : <syntaxhighlight lang=c> #include <stdio.h> int main(void) { FILE *fp = tmpfile(); if (fp == NULL) { printf("一次バイナリファイルの生成に失敗しました。\n"); return 1; } printf("一次バイナリファイルの生成に成功しました。\n"); //一次バイナリファイルへの入出力処理など fclose(fp); } </syntaxhighlight> === tmpnam関数 === ISO/IEC 9899:2017 § 7.21.4.4 ''The tmpnam function''<ref name="jtc1-sc22-wg14-n2596-7.21.4.4">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 222, §7.21.4.4 ''The tmpnam function'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>。 ; 形式 : <syntaxhighlight lang=c> #include <stdio.h> char *tmpnam(char *s); </syntaxhighlight> ; 機能 : tmpnam 関数は、有効なファイル名で、かつ既存のファイル名と同じでない文字列を 生成する。この関数は、少なくともTMP_MAX個の文字列を生成することができますが、それらの文字列はすでに既存のファイルで使用されている可能性があり、'''戻り値としては適切ではありません'''。 : tmpnam 関数は、呼び出すたびに異なる文字列を生成する。 : ヌルポインタを引数にしたtmpnam関数の呼び出しは、相互にデータ競合を起こす可能性がある。実装では、どのライブラリ関数もtmpnam関数を呼び出していないかのように動作する。 ; 返却値 :もし、適切な文字列が生成できなかった場合、tmpnam関数はnullポインタを返す。それ以外の場合、引数がnullポインタであれば、tmpnam関数はその結果を内部のスタティックオブジェクトに残し、そのオブジェクトへのポインタを返す(以降のtmpnam関数の呼び出しは、同じオブジェクトを変更することができる)。 : 引数がNULLポインタでない場合は、少なくともL_tmpnam文字の配列を指していると仮定し、tmpnam関数はその結果を配列に書き込み、その値として引数を返す。 ; 例 : <syntaxhighlight lang=c> #include <stdio.h> int main(void) { char filename[L_tmpnam]=""; tmpnam(filename); printf("ファイル名として正しく、既存のファイル名と一致しない文字列は%sです。\n", filename); } </syntaxhighlight> == ファイルアクセス関数 == ISO/IEC 9899:2017 § 7.21.5 ''File access functions''<ref name="jtc1-sc22-wg14-n2596-7.21.5">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 222, §7.21.5 ''File access functions'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>. === fclose関数 === ISO/IEC 9899:2017 § 7.21.5.1 ''The fclose function''<ref name="jtc1-sc22-wg14-n2596-7.21.5.1">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 222, §7.21.5.1 ''The fclose function'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>。 ; 形式 : <syntaxhighlight lang=c> #include <stdio.h> int fclose(FILE *stream); </syntaxhighlight> ; 機能 : fclose関数の呼び出しに成功すると、streamが指すストリームがフラッシュされ、関連するファイルがクローズされます。ストリームに書き込まれていないバッファリングされたデータはホスト環境に配信され、ファイルに書き込まれ、読み込まれていないバッファリングされたデータは破棄されます。呼び出しが成功したかどうかにかかわらず、ストリームはファイルから切り離され、setbuf または setvbuf 関数によって設定されたバッファはストリームから切り離されます (自動的に割り当てられていた場合は解放されます)。 ; 返却値 : fclose関数は、ストリームのクローズに成功した場合は0を、エラーが検出された場合はEOFを返します。 ; 例 {{See also|#例:テキストファイルの読み書き|#例:バイナリファイルの読み書き}} === fflush関数 === ISO/IEC 9899:2017 § 7.21.5.2 ''The fflush function''<ref name="jtc1-sc22-wg14-n2596-7.21.5.2">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 223, §7.21.5.2 ''The fflush function'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>。 ; 形式 : <syntaxhighlight lang=c> #include <stdio.h> int fflush(FILE *stream); </syntaxhighlight> ; 機能 : streamが出力ストリームまたは最新の操作が入力されていない更新ストリームを指している場合、fflush関数は、そのストリームに対する未書き込みのデータをホスト環境に配信してファイルに書き込ませます。それ以外の場合は、動作は未定義です。 : stream が NULL ポインタの場合、fflush 関数は、上記の動作が定義されているすべてのストリームに対してこのフラッシュ動作を実行します。 ; 返却値 : fflush関数は、ストリームのエラーインジケータを設定し、書き込みエラーが発生した場合はEOFを、そうでない場合は0を返します。 {{See also| [[../stdio.h#fopen関数 | fopen関数<stdio.h>]] }} ; 例 : <syntaxhighlight lang=c> #include <stdio.h> #include <windows.h>//Sleep関数を使うためにインクルード int main(void) { char buf[BUFSIZ]; setbuf(stdout, buf);//標準出力に対して、完全バッファリングで、bufをバッファとして設定します。 printf("Hello, world!\n");//バッファへ出力される。 Sleep(1000);//1000ミリ秒待つ。 fflush(stdout);//バッファから出力される。 } </syntaxhighlight> === fopen関数 === ISO/IEC 9899:2017 § 7.21.5.3 ''The fopen function''<ref name="jtc1-sc22-wg14-n2596-7.21.5.3">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 223, §7.21.5.3 ''The fopen function'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>。 ; 形式 : <syntaxhighlight lang=c> #include <stdio.h> FILE *fopen(const char * restrict filename, const char * restrict mode); </syntaxhighlight> ; 機能 :filenameが指す名前のファイルを、modeで指定したモードで、オープンします。 :modeは次の表のいずれかの文字列を指定します。 :次の表以外の文字列の時、動作は未定義です。 :{|class="wikitable" |+ fopen関数のmode引数の取り得る値と意味 !文字列!!モード |- |r||テキストファイルの読み取りモード |- |w||テキストファイルの書き込みモード |- |x||書き込み用テキストファイルの作成(C11以降)<ref name="c11-fopen-x-mode">{{cite book | url=http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf | title= C11: WG14/N1570 Committee Draft — April 12, 2011 ISO/IEC 9899:201x | pages=305-306,§ 7.21.5.3 ''The fopen function'' |publisher=ISO/IEC | date = 2011-04-12 }}</ref> |- |a||テキストファイルの追加書き込みモード |- |rb||バイナリファイルの読み取りモード |- |wb||バイナリファイルの書き込みモード |- |wbx||書き込み用バイナリファイルの作成(C11以降)<ref name="c11-fopen-x-mode"/> |- |ab||バイナリファイルの追加書き込みモード |- |r+||テキストファイルの更新(読み取り及び書き込み)モード |- |w+||テキストファイルの更新(書き込み及び読み取り)モード |- |a+||テキストファイルの更新(読み取りおよび追加書き込み)モード |- |r+b又はrb+||バイナリファイルの更新(読み取り及び書き込み)モード |- |w+b又はwb+||バイナリファイルの更新(書き込み及び読み取り)モード |- |w+bx又はwb+x||アップデート用バイナリファイルの作成(C11以降)<ref name="c11-fopen-x-mode"/> |- |a+b又はab+||バイナリファイルの更新(読み取りおよび追加書き込み)モード |- |} :;C11で追加されたエクスクルーシブモード ::C11で追加されたエクスクルーシブモード(排他モード; mode引数の最後の文字が'x')でファイルを開いた場合、ファイルがすでに存在するか、作成できない場合は失敗します。 ::それ以外の場合は、基礎となるシステムが排他的アクセスをサポートしている範囲で、排他的(非共有)アクセスでファイルが作成されます<ref name="c11-fopen-x-mode"/>。 :オーブン時に、ストリームに対するエラー表示子とファイル終了表示子をクリアします。 ; 返却値 : fopen関数は、ストリームを制御するオブジェクトへのポインタを返します。オープン操作に失敗した場合、fopenはNULLポインタを返します。 {{See also|[[#例:テキストファイルの読み書き]]|[[#例:バイナリファイルの読み書き]]}} === freopen関数 === ISO/IEC 9899:2017 § 7.21.5.4 ''The freopen function''<ref name="jtc1-sc22-wg14-n2596-7.21.5.4">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 224, §7.21.5.4 ''The freopen function'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>。 ; 形式 : <syntaxhighlight lang=c> #include <stdio.h> FILE *freopen(const char * restrict filename, const char * restrict mode, FILE restrict stream); </syntaxhighlight> ; 機能 : freopen関数は、filenameが指す文字列をファイル名とするファイルを開き、streamが指すストリームをそれに関連付ける。モード引数はfopen関数と同様に使用されます。 : filenameがNULLポインタの場合、freopen関数はストリームのモードをmodeで指定されたものに変更しようとし、あたかも現在ストリームに関連付けられているファイルの名前が使われているかのようにします。どのようなモードの変更が許可されるか(もし許可されるなら)、またどのような状況下で許可されるかは実装で定義されています。 : freopen関数は、まず、指定されたストリームに関連付けられているすべてのファイルを閉じようとします。ファイルのクローズに失敗しても無視されます。ストリームのエラー・インジケータとファイル終了インジケータはクリアされます。 ; 返却値 : freopen関数は、オープン操作に失敗した場合、ヌルポインタを返します。そうでなければ、freopenはstreamの値を返します。 ; 例 : <syntaxhighlight lang=c> #include <stdio.h> int main(void) { char *filename = "example.txt"; FILE *fp = freopen(filename, "w", stdout); if (fp == NULL) { perror("再オープンに失敗しました。"); return 1; } printf("Hello, world!\n"); fclose(fp); } </syntaxhighlight> === setbuf関数 === ISO/IEC 9899:2017 § 7.21.5.5 ''The setbuf function''<ref name="jtc1-sc22-wg14-n2596-7.21.5.5">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 225, §7.21.5.5 ''The setbuf function'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>。 ; 形式 : <syntaxhighlight lang=c> #include <stdio.h> void setbuf(FILE * restrict stream, char * restrict buf); </syntaxhighlight> ; 引数 :stream バッファを設定するファイルのストリーム :buf バッファとする配列 ; 返却値 :なし ; 機能 :streamが指すファイルのストリームに対して、bufが指す配列をバッファとした、入出力用のバッファを設定します。 :setbuf関数は、modeを_IOFBF, sizeをBUFSIZとしたsetvbuf関数と同じです。 :ただし、bufが空ポインタの場合、modeを_IONBFとしたsetvbuf関数と同じです。 {{See also| [[../stdio.h#setvbuf関数 | setvbuf関数<stdio.h>]] }} ; 例 : <syntaxhighlight lang=c> #include <stdio.h> #if defined(unix) #include <unistd.h> #elif defined(_WINDOWS) #include <windows.h> #define usleep(t) Sleep(t / 1000) #else #error Unknown pratform #endif int main(void) { printf("START:\n"); char buf[BUFSIZ]; setbuf(stdout, buf); for (char *p = "Hello, world1!\n"; *p != '\0'; p++) { printf("%c", *p); usleep(200 * 1000); // 200 * 1000 usec = 0.2 sec } fflush(stdout); setbuf(stdout, NULL); for (char *p = "Hello, world2!\n"; *p != '\0'; p++) { printf("%c", *p); usleep(200 * 1000); } } </syntaxhighlight> === setvbuf関数 === ISO/IEC 9899:2017 § 7.21.5.6 ''The setvbuf function''<ref name="jtc1-sc22-wg14-n2596-7.21.5.6">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 225, §7.21.5.6 ''The setvbuf function'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>。 ; 形式 : <syntaxhighlight lang=c> #include <stdio.h> int setvbuf(FILE * restrict stream, char * restrict buf, int mode, size_t size); </syntaxhighlight> ; 引数 :stream バッファを設定するファイルのストリーム :buf バッファとする配列 :mode バッファリングの方法 :size バッファの大きさ ; 返却値 :成功した場合0を返し、modeに無効な値が指定された場合、又は要求に従うことができなかった場合、0以外の値を返す。 ; 機能 :streamが指すファイルのストリームに対して、sizeの大きさを持ったbufが指す配列をバッファとし、modeで指定したバッファリングの方法で、入出力用のバッファを設定します。 :bufにNULLを指定した場合、setvbuf関数がsizeの大きさを持ったバッファを割り付ける。 :modeは以下の表のいずれかを指定します。 {|class="wikitable" !値!!モード!!意味 |- |_IOFBF||完全バッファリング||バッファがいっぱいになった時点で、ホスト環境へ又はホスト環境から文字をブロック単位で転送します。 |- |_IOLBF||行バッファリング||改行文字に達した時点で、ホスト環境へ又はホスト環境から文字をブロック単位で転送します。 |- |_IONBF||バッファリングをしない||文字が入力元から又は出力先へ可能な限りすぐ現れる。 |- |} ; 例 : <syntaxhighlight lang=c> #include <stdio.h> #if defined(unix) #include <unistd.h> #elif defined(_WINDOWS) #include <windows.h> #define usleep(t) Sleep(t / 1000) #else #error Unknown pratform #endif int main(void) { printf("START:\n"); char buf[BUFSIZ]; setvbuf(stdout, buf, _IOLBF, sizeof(buf)); for (char *p = "Hello, world1!\n"; *p != '\0'; p++) { printf("%c", *p); usleep(200 * 1000); // 200 * 1000 usec = 0.2 sec } setvbuf(stdout, NULL, _IONBF, 0); for (char *p = "Hello, world2!\n"; *p != '\0'; p++) { printf("%c", *p); usleep(200 * 1000); } printf("\n"); } </syntaxhighlight> == 書式付き入出力関数 == <ref>『JISX3010:2003』p.198「7.19.6 書式付き入出力関数」</ref> === fprintf関数 === <ref>『JISX3010:2003』p.198「7.19.6.1 fprintf関数」</ref> ; 形式 : <syntaxhighlight lang=c> #include <stdio.h> int fprintf(FILE * restrict stream, const char * restrict format, ...) </syntaxhighlight> ; 引数 :stream ストリーム :format 書式文字列 :... 任意個数の実引数 ; 返却値 :書き出された文字数。出力エラーまたは表現形式エラーが発生した場合、負の値。 ; 機能 :fprintf関数とは、formatが指す書式文字列に従って、streamが指すストリームへ書き込む関数です。書式文字列には、それに続く任意個数の実引数と同じ数だけの変換指定が含まれなければならない。書式文字列に含まれる変換指定の部分が、それに対応する後の実引数の値によって置換される。 :変換指定は以下のようになる。 : <syntaxhighlight lang=c> %[フラグ][最小フィールド幅][.][精度][長さ修飾子]変換指定子 </syntaxhighlight> :「[]」は省略可能であることを示す。 :;フラグ、 ::; '-' : 変換結果をフィールド内に左詰めにする(デフォルトで右詰)。 ::; '+' : 符号付き変換の結果を常に正符号又は負符号で始める(デフォルトで負の値の場合のみ負符号で始める)。 ::; '&nbsp;' (space) : 符号付き変換の結果の最初の文字が符号でない場合、1個の空白を結果の前に付ける。 ::; '#' : 変換指定子がoなら「0」を、xなら「0x」を、Xなら「0X」を結果の前に付加します。変換指定子がa, A, e, E, f, F, g, Gなら、小数点文字の後ろに数字が続かない場合でも、浮動小数点数の返還の結果に常に小数点文字を含める。変換指定子がg, Gなら、後ろの続く0を結果から取り除かない。 ::; '0' : 0を文字列の左に付加することができる。 :: 最小フィールド幅 : 値を変換した結果の文字数が最小フィールド幅より少ない場合、最小フィールド幅を満たすまで左側に(-フラグがあるときは右側に)空白を詰めることです。 :; 精度 : 変換指定子がd, i, u, x, Xなら、出力する数字の最小の個数を指定します。変換指定子がa, A, e, E, f, Fなら、小数点文字の後ろに出力すべき数字の個数を指定します。変換指定子がg, Gなら、最大の有効桁数を指定します。変換指定子がsなら、書き込む最大のバイト数を指定します。 ==== 長さ修飾子 ==== :{| class="wikitable" |+ 長さ修飾子 !修飾子!!意味!!導入バージョン |- |hh||実引数は char 型||C99以降 |- |h||実引数は short 型||全バージョン |- |l(エル)||実引数は long 型または wchar_t 型または double 型<ref>可変長引数では「既定の実引数拡張」により、float型の引数はdouble型へと変換されるため、本来はdoubleに対して修飾子を適用する必要はない。</ref>||wchar_t についてはC95以降、double についてはC99以降 |- |ll(エルエル)||実引数は long long 型||C99以降 |- |j||実引数は intmax_t 型||C99以降 |- |z||実引数は size_t 型||C99以降 |- |t||実引数は ptrdiff_t 型||C99以降 |- |L||実引数は long double 型||全バージョン <!-- |- |||実引数は char16_t 型|| |- |||実引数は char32_t 型|| --> |} ==== 変換指定子 ==== :{|class="wikitable" |+ printfの主な変換指定子 |- !変換指定!!意味 |- |%d, %i||実引数を符号付き10進表記に変換する |- |%u||実引数を符号無し10進表記に変換する |- |%o||実引数を符号無し8進表記に変換する |- |%x, %X||実引数を符号無し16進表記に変換する<br>%xは英字abcdefを、%Xは英字ABCDEFを用いる |- |%f, %F||実引数を小数形式の10進浮動小数点数表記に変換する |- |%e, %E||実引数を指数形式の10進浮動小数点数表記に変換する |- |%g, %G||実引数を小数形式または指数形式の10進浮動小数点数表記に変換する |- |%a, %A||実引数を指数形式の16進浮動小数点数表記に変換する |- |%c||実引数を文字に変換する |- |%s||実引数を文字列に変換する |- |%p||ポインタの値に変換する |- |%n||整数変数に出力した文字数を格納する |- |%%||'%'を出力する |} === fscanf関数 === ISO/IEC 9899:2017 § 7.21.6.2 ''The fscanf function''<ref name="jtc1-sc22-wg14-n2596-7.21.6.2">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 231, §7.21.6.2 ''The fscanf function'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>。 ; 形式 : <syntaxhighlight lang=c> #include <stdio.h> int fscanf(FILE * restrict stream, const char * restrict format, ...); </syntaxhighlight> ; 引数 :stream ストリーム :format 書式文字列 :... 任意個数の実引数 ; 返却値 :変換が一つも行われないまま入力誤りが発生した場合、マクロEOFの値。その他の場合、代入された入力項目の個数。この個数は、入力中に照合誤りが発生すると、与えられた入力項目の個数より少なくなることもあり、0になることもある。 ; 機能 :fscanf関数とは、formatが指す書式文字列に従って、streamが指すストリームから入力を、任意個数の実引数へ読み込む関数です。書式文字列には、それに続く任意個数の実引数と同じ数だけの変換指定が含まれなければならない。ストリームからの入力が、書式文字列に含まれる変換指定に従って、それに対応する後の実引数が指す変数に代入される。 :変換指定は以下のようになる。 : <syntaxhighlight lang=c> %[*][最大フィールド幅][長さ修飾子]変換指定子 </syntaxhighlight> :「[]」は省略可能であることを示す。 :「*」とは、代入抑止文字です。「*」を指定すると、入力は変換されず、読み飛ばされる。 :最大フィールド幅とは、最大フィールド幅(文字で数えて)を指定する正の10進整数です。入力から指定した文字数だけ変換される。 ==== 長さ修飾子 ==== :{| class="wikitable" |+ 長さ修飾子 !修飾子!!意味!!導入バージョン |- |hh||実引数は char 型||C99以降 |- |h||実引数は short 型||全バージョン |- |l(エル)||実引数は long 型または wchar_t 型または double 型<ref>可変長引数では「既定の実引数拡張」により、float型の引数はdouble型へと変換されるため、本来はdoubleに対して修飾子を適用する必要はない。</ref>||wchar_t についてはC95以降、double についてはC99以降 |- |ll(エルエル)||実引数は long long 型||C99以降 |- |j||実引数は intmax_t 型||C99以降 |- |z||実引数は size_t 型||C99以降 |- |t||実引数は ptrdiff_t 型||C99以降 |- |L||実引数は long double 型||全バージョン <!-- |- |||実引数は char16_t 型|| |- |||実引数は char32_t 型|| --> |}<!-- :長さ修飾子とは、hh, h, l, ll, j, z, t, Lのいずれかです。hh, h, l, ll, j, z, t, Lとは、それぞれchar, short, long, long long, intmax_t, size_t, ptrdiff_t, long doubleに対応することを指定します。--> ==== 変換指定子 ==== :{| class="wikitable" |+ fscanfの主な変換指定子 !変換指定!!意味 |- |%d||入力を符号付き10進整数に変換する |- |%i||入力を符号付き整数に変換する |- |%u||入力を符号無し10進整数に変換する |- |%o||入力を符号無し8進整数に変換する |- |%x||入力を符号無し16進整数に変換する |- |%a, %e, %f, %g||入力を浮動小数点数に変換する |- |%c||入力を文字に変換する |- |%s||入力を文字列に変換する |- |%p||入力をポインタの値に変換する |- |%n||整数変数に入力した文字数を格納する |- |%%||1つの%と照合する |- |%[走査文字の並び]||走査文字の並びに含まれる文字のみを入力し、文字列に変換します。<br>[の直後に^を指定した場合、走査文字の並びに含まれない文字のみを入力し、文字列に変換します。 |- |} {{See also|#例:テキストファイルの読み書き |#例:scanf関数での変換指定の使い方 }} === printf関数 === <ref>『JISX3010:2003』p.210「7.19.6.3 printf関数」</ref> ; 形式 : <syntaxhighlight lang=c> #include <stdio.h> int printf(const char * restrict format, ...); </syntaxhighlight> ; 引数 :format 書式文字列 :... 任意個数の実引数 ; 返却値 :書き出された文字数。出力エラーまたは表現形式エラーが発生した場合、負の値。 ; 機能 :printf関数とは、formatが指す書式文字列に従って、標準出力へ書き込む関数です。 :printf関数は、与えられた実引数の前にstdoutを実引数として付加したfprintf関数と等価です。詳しくは[[#fprintf関数]]を参照せよ。 ; 例 :printf関数の基本的な使い方は、[[C言語/基礎知識#printf関数の使用例]]を参照せよ。 :[[#例:printf関数での変換指定の使い方]]を参照せよ。 === scanf関数 === <ref>『JISX3010:2003』p.210「7.19.6.4 scanf関数」</ref> ; 形式 : <syntaxhighlight lang=c> #include <stdio.h> int scanf(const char * restrict format, ...); </syntaxhighlight> ; 引数 :format 書式文字列 :... 任意個数の実引数 ; 返却値 :変換が一つも行われないまま入力誤りが発生した場合、マクロEOFの値。その他の場合、代入された入力項目の個数。この個数は、入力中に照合誤りが発生すると、与えられた入力項目の個数より少なくなることもあり、0になることもある。 ; 機能 :scanf関数とは、formatが指す書式文字列に従って、標準入力を、任意個数の実引数へ読み込む関数です。 :scanf関数は、与えられた実引数の前にstdinを実引数として付加したfscanf関数と等価です。詳しくは[[#fscanf関数]]を参照せよ。 ; 例 :scanf関数の基本的な使い方は、[[C言語/基礎知識#scanf関数の使用例]]を参照せよ。 :[[#例:scanf関数での変換指定の使い方]]を参照せよ。 === snprintf関数 === <ref>『JISX3010:2003』p.210「7.19.6.5 snprintf関数」</ref> ; 形式 : <syntaxhighlight lang=c> #include <stdio.h> int snprintf(char * restrict s, size_t n, const char * restrict format, ...); </syntaxhighlight> ; 引数 :s 配列 :n 書き込む文字数 :format 書式文字列 :... 任意個数の実引数 ; 返却値 :nが十分に大きい場合に配列に書き込んだはずの文字数。ただし、終端ナル文字は数えない。表現形式エラーが発生した場合、負の値を返す。すなわち、返却値が非負かつn未満の場合、そしてその場合に限り、ナル文字で終了している出力が完全に書き込まれています。 ; 機能 :snprintf関数とは、formatが指す書式文字列に従って、nで指定した書き込む文字数分だけ、sが指す配列へ書き込む関数です。 :snprintf関数は、生成された出力をストリームではなく実引数sで指定する配列に書き込むことを除いては、fprintf関数と等価です。詳しくは[[#fprintf関数]]を参照せよ。 :書き込む文字数にはナル文字を含む。 :領域の重なり合うオブジェクト間でコピーが行われるとき、その動作は未定義です。 ; 例 : <syntaxhighlight lang=c> #include <stdio.h> int main(void) { char s[16]; int i=1234; double d=3.14; char c='a'; char s2[]="Hello"; snprintf(s, sizeof(s), "%d %.2f %c %s", i, d, c, s2); printf("%s", s); } </syntaxhighlight> :[[#例:printf関数での変換指定の使い方]]を参照せよ。 === sprintf関数 === <ref>『JISX3010:2003』p.211「7.19.6.6 sprintf関数」</ref> : <syntaxhighlight lang=c> warning! sprintf関数は配列へ書き込む文字数を指定できないため、 使い方によってはバッファオーバーランが発生する場合があります。 </syntaxhighlight> ; 形式 : <syntaxhighlight lang=c> #include <stdio.h> int sprintf(char * restrict s, const char * restrict format, ...); </syntaxhighlight> ; 引数 :s 配列 :format 書式文字列 :... 任意個数の実引数 ; 返却値 :配列に書き込まれた文字数。ただし、ナル文字は文字数に数えない。表現形式エラーが発生した場合、負の値。 ; 機能 :sprintf関数とは、formatが指す書式文字列に従って、sが指す配列へ書き込む関数です。 :sprintf関数は、生成された出力をストリームではなく実引数sで指定する配列に書き込むことを除いては、fprintf関数と等価です。詳しくは[[#fprintf関数]]を参照せよ。 :書き込まれた出力文字の列の後にナル文字を書き込む。 :領域の重なり合うオブジェクト間でコピーが行われるとき、その動作は未定義です。 ; 例 : <syntaxhighlight lang=c> #include <stdio.h> int main(void) { char s[32]; int i=1234; double d=3.14; char c='a'; char s2[]="Hello"; sprintf(s, "%d %.2f %c %s", i, d, c, s2); printf("%s", s); } </syntaxhighlight> :[[#例:printf関数での変換指定の使い方]]を参照せよ。 === sscanf関数 === <ref>『JISX3010:2003』p.211「7.19.6.7 sscanf関数」</ref> ; 形式 : <syntaxhighlight lang=c> #include <stdio.h> int sscanf(const char * restrict s, const char * restrict format, ...); </syntaxhighlight> ; 引数 :s 文字列 :format 書式文字列 :... 任意個数の実引数 ; 返却値 :変換が一つも行われないまま入力誤りが発生した場合、マクロEOFの値。その他の場合、代入された入力項目の個数。この個数は、入力中に照合誤りが発生すると、与えられた入力項目の個数より少なくなることもあり、0になることもある。 ; 機能 :sscanf関数とは、formatが指す書式文字列に従って、sが指す文字列を、任意個数の実引数へ読み込む関数です。 :sscanf関数は、入力をストリームではなく実引数sで指定される文字列から得ることを除けば、fscanf関数と等価です。詳しくは[[#fscanf関数]]を参照せよ。 :文字列の終わりに達することが、fscanf関数でファイルの終わりに達することと等価です。 :領域の重なり合うオブジェクト間でコピーが行われるとき、その動作は未定義です。 ; 例 : <syntaxhighlight lang=c> #include <stdio.h> int main(void) { char s[]="1234 3.14 a Hello"; int i; double d; char c; char s2[16]; sscanf(s, "%d %lf %c %15s", &i, &d, &c, &s2); printf("i=%d, d=%.2f, c=%c, s2=%s", i, d, c, s2); } </syntaxhighlight> :[[#例:scanf関数での変換指定の使い方]]を参照せよ。 === vfprintf関数 === <ref>『JISX3010:2003』p.211「7.19.6.8 vfprintf関数」</ref> ; 形式 : <syntaxhighlight lang=c> #include <stdarg.h> #include <stdio.h> int vfprintf(FILE * restrict stream, const char * restrict format, va_list arg); </syntaxhighlight> ; 引数 :stream ストリーム :format 書式文字列 :arg 可変個数の実引数のリスト ; 返却値 :書き出された文字数。出力エラーまたは表現形式エラーが発生した場合、負の値。 ; 機能 :vfprintf関数とは、formatが指す書式文字列に従って、可変個数の実引数のリストを、streamが指すストリームへ書き込む関数です。 :vfprintf関数は、可変個数の実引数並びを、argで置き換えたfprintfと等価です。詳しくは[[#fprintf関数]]を参照せよ。 :vfprintf関数の呼び出し前に、va_startマクロでargを初期化しておかなければならない。 :vfprintf関数はva_endマクロを呼び出さない。 ; 例 : <syntaxhighlight lang=c> #include <stdarg.h> #include <stdio.h> //fprintf関数と同じ働きをするmyfprintf関数 int myfprintf(FILE * stream, const char * format, ...) { va_list ap; int ret; va_start(ap, format); ret=vfprintf(stream, format, ap); va_end(ap); return ret; } </syntaxhighlight> :[[#例:printf関数での変換指定の使い方]]を参照せよ。 === vfscanf関数 === <ref>『JISX3010:2003』p.212「7.19.6.9 vfscanf関数」</ref> ; 形式 : <syntaxhighlight lang=c> #include <stdarg.h> #include <stdio.h> int vfscanf(FILE * restrict stream, const char * restrict format, va_list arg); </syntaxhighlight> ; 引数 :stream ストリーム :format 書式文字列 :arg 可変個数の実引数のリスト ; 返却値 :変換が一つも行われないまま入力誤りが発生した場合、マクロEOFの値。その他の場合、代入された入力項目の個数。この個数は、入力中に照合誤りが発生すると、与えられた入力項目の個数より少なくなることもあり、0になることもある。 ; 機能 :vfscanf関数とは、formatが指す書式文字列に従って、streamが指すストリームから入力を、可変個数の実引数のリストへ読み込む関数です。 :vfscanf関数は、可変個数の実引数並びをargで置き換えたfscanf関数と等価です。詳しくは[[#fscanf関数]]を参照せよ。 :vfscanf関数の呼び出し前に、va_startマクロでargを初期化しておかなければならない。 :vfscanf関数はva_endマクロを呼び出さない。 ; 例 : <syntaxhighlight lang=c> #include <stdarg.h> #include <stdio.h> //fscanf関数と同じ働きをするmyfscanf関数 int myfscanf(FILE * stream, const char * format, ...) { va_list ap; int ret; va_start(ap, format); ret=vfscanf(stream, format, ap); va_end(ap); return ret; } </syntaxhighlight> :[[#例:scanf関数での変換指定の使い方]]を参照せよ。 === vprintf関数 === <ref>『JISX3010:2003』p.212「7.19.6.10 vprintf関数」</ref> ; 形式 : <syntaxhighlight lang=c> #include <stdarg.h> #include <stdio.h> int vprintf(const char * restrict format, va_list arg); </syntaxhighlight> ; 引数 :format 書式文字列 :arg 可変個数の実引数のリスト ; 返却値 :書き出された文字数。出力エラーまたは表現形式エラーが発生した場合、負の値。 ; 機能 :vprintf関数とは、formatが指す書式文字列に従って、可変個数の実引数のリストを、標準出力へ書き込む関数です。 :vprintf関数は、可変個数の実引数並びをargで置き換えたprintf関数と等価です。詳しくは[[#printf関数]]を参照せよ。 :vprintf関数の呼び出し前に、va_startマクロでargを初期化しておかなければならない。 :vprintf関数はva_endマクロを呼び出さない。 ; 例 : <syntaxhighlight lang=c> #include <stdarg.h> #include <stdio.h> //printf関数と同じ働きをするmyprintf関数 int myprintf(const char * format, ...) { va_list ap; int ret; va_start(ap, format); ret=vprintf(format, ap); va_end(ap); return ret; } </syntaxhighlight> :[[#例:printf関数での変換指定の使い方]]を参照せよ。 === vscanf関数 === <ref>『JISX3010:2003』p.213「7.19.6.11 vscanf関数」</ref> ; 形式 : <syntaxhighlight lang=c> #include <stdarg.h> #innlude <stdio.h> int vscanf(const char * restrict format, va_list arg); </syntaxhighlight> ; 引数 :format 書式文字列 :arg 可変個数の実引数のリスト ; 返却値 :変換が一つも行われないまま入力誤りが発生した場合、マクロEOFの値。その他の場合、代入された入力項目の個数。この個数は、入力中に照合誤りが発生すると、与えられた入力項目の個数より少なくなることもあり、0になることもある。 ; 機能 :vscanf関数とは、formatが指す書式文字列に従って、標準入力を、可変個数の実引数のリストへ読み込む関数です。 :vscanf関数は、可変個数の実引数並びをargで置き換えたscanf関数と等価です。詳しくは[[#scanf関数]]を参照せよ。 :vscanf関数の呼び出し前に、va_startマクロでargを初期化しておかなければならない。 :vscanf関数はva_endマクロを呼び出さない。 ; 例 : <syntaxhighlight lang=c> #include <stdarg.h> #include <stdio.h> //scanf関数と同じ働きをするmyscanf関数 int myscanf(const char * format, ...) { va_list ap; int ret; va_start(ap, format); ret=vscanf(format, ap); va_end(ap); return ret; } </syntaxhighlight> :[[#例:scanf関数での変換指定の使い方]]を参照せよ。 === vsnprintf関数 === <ref>『JISX3010:2003』p.213「7.19.6.12 vsnprintf関数」</ref> ; 形式 : <syntaxhighlight lang=c> #include <stdarg.h> #include <stdio.h> int vsnprintf(char * restrict s, size_t n, const char * restrict format, va_list arg); </syntaxhighlight> ; 引数 :s 配列 :n 書き込む文字数 :format 書式文字列 :arg 可変個数の実引数のリスト ; 返却値 :nが十分に大きい場合に配列に書き込んだはずの文字数。ただし、終端ナル文字は数えない。表現形式エラーが発生した場合、負の値を返す。すなわち、返却値が非負かつn未満の場合、そしてその場合に限り、ナル文字で終了している出力が完全に書き込まれています。 ; 機能 :vsnprintf関数とは、formatが指す書式文字列に従って、可変個数の実引数のリストを、nで指定した書き込む文字数分だけ、sが指す配列へ書き込む関数です。 :vsnprintf関数は、可変個数の実引数並びをargで置き換えたsnprintfと等価です。詳しくは[[#snprintf関数]]を参照せよ。 :vsnprintf関数の呼び出し前に、va_startマクロでargを初期化しておかなければならない。 :vsnprintf関数はva_endマクロを呼び出さない。 :領域の重なり合うオブジェクト間でコピーが行われるとき、その動作は未定義です。 ; 例 : <syntaxhighlight lang=c> #include <stdarg.h> #include <stdio.h> //snprintf関数と同じ働きをするmysnprintf関数 int mysnprintf(char * s, size_t n, const char * format, ...) { va_list ap; int ret; va_start(ap, format); ret=vsnprintf(s, n, format, ap); va_end(ap); return ret; } </syntaxhighlight> :[[#例:printf関数での変換指定の使い方]]を参照せよ。 === vsprintf関数 === <ref>『JISX3010:2003』p.213「7.19.6.13 vsprintf関数」</ref> ; 形式 : <syntaxhighlight lang=c> #include <stdarg.h> #include <stdio.h> int vsprintf(char * restrict s, const char * restrict format, va_list arg); </syntaxhighlight> ; 引数 :s 配列 :format 書式文字列 :arg 可変個数の実引数のリスト ; 返却値 :配列に書き込まれた文字数。ただし、ナル文字は文字数に数えない。表現形式エラーが発生した場合、負の値。 ; 機能 :vsprintf関数とは、formatが指す書式文字列に従って、可変個数の実引数のリストを、sが指す配列へ書き込む関数です。 :vsprintf関数は、可変個数の実引数並びをargで置き換えたsprintfと等価です。詳しくは[[#sprintf関数]]を参照せよ。 :vsprintf関数の呼び出し前に、va_startマクロでargを初期化しておかなければならない。 :vsprintf関数はva_endマクロを呼び出さない。 :領域の重なり合うオブジェクト間でコピーが行われるとき、その動作は未定義です。 ; 例 : <syntaxhighlight lang=c> #include <stdarg.h> #include <stdio.h> //sprintf関数と同じ働きをするmysprintf関数 int mysprintf(char * s, const char * format, ...) { va_list ap; int ret; va_start(ap, format); ret=vsprintf(s, format, ap); va_end(ap); return ret; } </syntaxhighlight> :[[#例:printf関数での変換指定の使い方]]を参照せよ。 === vsscanf関数 === <ref>『JISX3010:2003』p.214「7.19.6.14 vsscanf関数」</ref> ; 形式 : <syntaxhighlight lang=c> #include <stdarg.h> #include <stdio.h> int vsscanf(const char * restrict s, const char * restrict format, va_list arg); </syntaxhighlight> ; 引数 :s 文字列 :format 書式文字列 :arg 可変個数の実引数のリスト ; 返却値 :変換が一つも行われないまま入力誤りが発生した場合、マクロEOFの値。その他の場合、代入された入力項目の個数。この個数は、入力中に照合誤りが発生すると、与えられた入力項目の個数より少なくなることもあり、0になることもある。 ; 機能 :vsscanf関数とは、formatが指す書式文字列に従って、sが指す文字列を、可変個数の実引数のリストへ読み込む関数です。 :vsscanf関数は、可変個数の実引数並びをargで置き換えたsscanf関数と等価です。詳しくは[[#sscanf関数]]を参照せよ。 :vsscanf関数の呼び出し前に、va_startマクロでargを初期化しておかなければならない。 :vsscanf関数はva_endマクロを呼び出さない。 ; 例 : <syntaxhighlight lang=c> #include <stdarg.h> #include <stdio.h> //sscanf関数と同じ働きをするmysscanf関数 int mysscanf(const char * s, const char * format, ...) { va_list ap; int ret; va_start(ap, format); ret=vsscanf(s, format, ap); va_end(ap); return ret; } </syntaxhighlight> :[[#例:scanf関数での変換指定の使い方]]を参照せよ。 == 文字入出力関数 == <ref>『JISX3010:2003』p.214「7.19.7 文字入出力関数」</ref> === fgetc関数 === <ref>『JISX3010:2003』p.214「7.19.7.1 fgetc関数」</ref> ; 形式 : <syntaxhighlight lang="C"> #include <stdio.h> int fgetc(FILE *stream); </syntaxhighlight> ; 引数 :stream 入力ストリーム ; 返却値 :ファイル終了表示子がセットされている場合、またはファイルの終わりに達している場合、ファイル終了表示子をセットし、EOF。読み取りエラーが発生した場合、エラー表示子をセットし、EOF。その他の場合、次の文字。 ; 機能 :fgetc関数とは、streamが指す入力ストリームから、1文字取り込みその値を返却する関数です。 :その文字はunsigned char型として取り込み、int型に変換される。 :そして、ファイル位置表示子を進める。 ; 例 :[[#例:テキストファイルの読み書き]]を参照せよ。 ;その他のコード例 : <syntaxhighlight lang="C"> #include <stdio.h> int main(void) { int c; printf("\n1文字の文字を入力してください:"); c = fgetc(stdin); printf("\n入力した文字は%cです。\n", c); } </syntaxhighlight> fgetc では、Fedora Linuxの場合、上記のようなコードで、エンターキーを押して入力しないといけない。 Linuxにて、エンターキーを押さずに文字列を入力するようにする場合、<code>#include <termios.h></code><ref>termios は標準Cライブラリではなく、POSIXの機能です。</ref> を使って設定を変える方法もあるが、しかしプログラム終了の直前に設定を戻す必要がある(プログラムの実行を終了しても、ターミナルを終了しないかぎり、設定は自動では戻らない)。(Fedora32で2020年8月26日に動作を確認)。 このため、設定を変える前に、現在の設定を保存しなければならない。しかし、とても面倒なので、初心者はあまり、この termios.h の方法には手を出さないほうが良い。もし、間違えて設定を書き換えてしまった場合、いったんターミナルを終了すれば、設定はもとに戻る。 if文と組み合わせる場合は、右辺の文字側の引用符は一重引用符でなければならない。 ;コード例 : <syntaxhighlight lang="C"> #include <stdio.h> int main() { while (1) { printf("fまたはFを押すと終了します。:"); int temp = fgetc(stdin); if (temp == 'f' || temp == 'F') { break; } printf("\n"); } printf("\n"); return 0; } </syntaxhighlight> ;実行例 : <pre> fまたはFを押すと終了します。:r fまたはFを押すと終了します。:t fまたはFを押すと終了します。:f 終了しています </pre> termios.h は標準入出力ではないが、termios を使った場合のコード例は下記のようになる。 ;コード例 : <syntaxhighlight lang="C"> #include <stdio.h> #include <termios.h> #include <unistd.h> // STDIN_FILENO に必要 int main() { struct termios term; tcgetattr(STDIN_FILENO, &term); struct termios original; original = term; term.c_lflag &= (~ICANON) | ECHO; // 非カノニカルモード。エコーありに設定。 tcsetattr(STDIN_FILENO, TCSANOW, &term); int temp; while (1) { temp = fgetc(stdin); if (temp == 'f' || temp == 'F') { break; } } printf("\n"); tcsetattr(STDIN_FILENO, TCSANOW, &original); // もとの設定に戻さないと、プログラム終了後も設定が残留します。 return 0; } </syntaxhighlight> ;実行例 :<pre> iuiytf </pre> :※ 文字「f」が入力された時点で、(エンターキーを押さずに)自動的にプログラム終了します。 ;解説 まず、<code>struct termios term;</code> で termios型の構造体を呼び出す。 特別な構造体であり、既に構造体の中身が作成済みになっているので、その設定をこれから書き換えるのだが、書き換え前に標準設定を保存しておく必要があります。(でないと、書き換え後も、ターミナル終了まで、設定が残ってしまう。) なので、たとえば「 original 」などの名前でtermios構造体をさらに新規作成し、このoriginalに標準設定を残しておく。 original = term; だけで、構造体 term の内容が 構造体 original の内容がコピーされる。なお、構造体にかぎらず、一般に構造体は、イコール記号で一括でコピーできる。配列や文字列のコピーだと、等号だけでは一括コピーできずに特殊な操作が必要になるのに、なぜか構造体では等号だけでコピーできるのは不思議に思うかもしれないが、C言語は、そういう奇妙な仕様です。 ターミナルの普段の、エンターキーを押して入力するという入力設定のモード名は「カノニカルモード」というモードです。 一方、エンターキーを押さずに済むモードは、非カノニカルモードである、。 term.c_lflag &= ~ICANON; で、termos構造体変数termを、非カノニカルモードにしています。 「ICANON 」だけだとカノニカルモードだが、それの冒頭に否定の意味のチルダ記号「~」がついて、非カノニカルモードになっています。チルダの機能は、ビット列の反転です。 「ECHO」とは、ターミナルに入力文字が表示されるかどうかの設定。本wikiでは説明しやすさの都合で、エコーありにした。 もし、エコー無しにしたければ、チルダをつけて「~ECHO」にすれば、入力文字が表示されなくなる。 <code>&=</code>とは、ビット演算の複合代入演算子で、単に a &= b は a = a & b の意味。 なお、 term.c_lflag &= (~ICANON) | ECHO; と書かずとも、なぜか term.c_lflag &= (~ICANON); term.c_lflag &= ECHO; というふうに1行ずつ個別に実行しても同様の設定が行えてしまう。 === fgets関数 === <ref>『JISX3010:2003』p.214「7.19.7.2 fgets関数」</ref> ; 形式 : <syntaxhighlight lang=c> #include <stdio.h> char *fgets(char * restrict s, int n, FILE * restrict stream); </syntaxhighlight> ; 引数 :s 配列 :n 読み取る文字数(ナル文字を含む) :stream ストリーム ; 返却値 :成功した場合、s。ファイルの終わりを検出し、かつ配列に1文字も読み取っていなかった場合、又は読み取りエラーが発生した場合、空ポインタ。 ; 機能 :fgets関数とは、streamが指すストリームから、文字の列を読み取り、sが指す配列に格納する関数です。 :読み取る文字の列は改行又はファイルの終わりまでで、読み取る文字数の最大値はn-1です。 :最後にナル文字を付ける。 ; 例 :[[#例:テキストファイルの読み書き]]を参照せよ。 === fputc関数 === <ref>『JISX3010:2003』p.215「7.19.7.3 fputc関数」</ref> ; 形式 : <syntaxhighlight lang=c> #include <stdio.h> int fputc(int c, FILE *stream); </syntaxhighlight> ; 引数 :c 書き込む文字 :stream 出力ストリーム ; 返却値 :書き込んだ文字。書き込みエラーが発生した場合、エラー表示子をセットし、EOF。 ; 機能 :fputc関数とは、streamが指す出力ストリームにcで指定された文字を書き込む関数です。 :その文字は、int型からunsigned char型に変換される。 :そして、ファイル位置表示子を進める。 ; 例 :[[#例:テキストファイルの読み書き]]を参照せよ。 === fputs関数 === <ref>『JISX3010:2003』p.215「7.19.7.4 fputs関数」</ref> ; 形式 :<syntaxhighlight lang=c> #include <stdio.h> int fputs(const char * restrict s, FILE * restrict stream); </syntaxhighlight> ; 引数 :s 文字列 :stream ストリーム ; 返却値 :書き込みエラーが発生した場合、EOF。その他の場合、非負の値。 ; 機能 :fputs関数とは、streamが指すストリームにsが指す文字列を書き込む関数です。 :終端ナル文字の書き込みは行わない。 ; 例 :[[#例:テキストファイルの読み書き]]を参照せよ。 === getc関数 === <ref>『JISX3010:2003』p.215「7.19.7.5 getc関数」</ref> ; 形式 :<syntaxhighlight lang=c> #include <stdio.h> int getc(FILE *stream); </syntaxhighlight> ; 引数 :stream 入力ストリーム ; 返却値 :ファイルの終わりに達している場合、ファイル終了表示子をセットし、EOF。読み取りエラーが発生した場合、エラー表示子をセットし、EOF。その他の場合、次の文字。 ; 機能 :getc関数とは、streamが指す入力ストリームから、1文字取り込みその値を返却する関数です。 :getc関数はfgetc関数と等価です。詳しくは[[#fgetc関数]]を参照せよ。 ; 例 :[[#例:テキストファイルの読み書き]]の「例 fputc、fgetc関数を用いたテキストファイルの読み書き」を参照せよ。 === getchar関数 === <ref>『JISX3010:2003』p.215「7.19.7.6 getchar関数」</ref> ; 形式 :<syntaxhighlight lang="C"> #include <stdio.h> int getchar(void); </syntaxhighlight> ; 引数 :なし ; 返却値 :ファイルの終わりに達している場合、ファイル終了表示子をセットし、EOF。読み取りエラーが発生した場合、エラー表示子をセットし、EOF。その他の場合、次の文字。 ; 機能 :getchar関数とは、標準入力から、1文字取り込みその値を返却する関数です。 :getchar関数は、実引数としてstdinを指定したgetcと等価です。詳しくは[[#getc関数]]を参照せよ。 ; 例 :<syntaxhighlight lang="C"> #include <stdio.h> int main(void) { int c; printf("\n1文字の文字を入力してください:"); c = getchar(); printf("\n入力した文字は%cです。\n", c); } </syntaxhighlight> 実行環境にもよるだろうが、文字を入力したあと、さらにエンターキーを押す必要があります。(Linux の Fedora32でその動作を2020年8月26日に確認。) ;コード例 :<syntaxhighlight lang="C"> #include <stdio.h> int main(void) { int c; while (1) { printf("終了するにはfを1文字入力してください:\n"); c = getchar(); if (c == 'f' || c == 'F') { break;} } printf("終了しました\n"); } </syntaxhighlight> ;動作結果 ::※ 一例 :<pre> 終了するにはfを1文字入力してください: j 終了するにはfを1文字入力してください: 終了するにはfを1文字入力してください: r 終了するにはfを1文字入力してください: 終了するにはfを1文字入力してください: f 終了しました </pre> if文で比較するには、引用符は一重引用符を使う必要があります。二重引用符だとコンパイル時にエラーになる。(Fedora 32で確認.) === gets関数 === <div style="margin:1em; text-align: center; color:#660; background-color:#fcc;font-size:1.5em"> gets関数はC11で削除されました。 また、gets関数は読取る文字数を指定できないため、 原理的に、バッファオーバーランを防ぐことができません。 </div> ; 形式 :<syntaxhighlight lang=c> #include <stdio.h> char *gets(char *s); </syntaxhighlight> ; 引数 :s 配列 ; 返却値 :成功した場合、s。ファイルの終わりを検出し、かつ配列に1文字も読み取っていなかった場合、又は読み取りエラーが発生した場合、空ポインタ。 ; 機能 :gets関数とは、標準入力から、文字の列を読み取り、sが指す配列に格納する関数です。 :読み取る文字の列は改行又はファイルの終わりまでです。 :最後に改行文字の代わりにナル文字を付ける。 ; 例 :<syntaxhighlight lang=c> //※このプログラムにはバッファオーバーランの可能性があります。 #include <stdio.h> int main(void) { char str[256]; printf("\n文字列を入力してください(半角255文字以内):"); gets(str); printf("\n入力した文字列は%sです。", str); } </syntaxhighlight> === putc関数 === <ref>『JISX3010:2003』p.216「7.19.7.8 putc関数」</ref> ; 形式 :<syntaxhighlight lang=c> #include <stdio.h> int putc(int c, FILE *stream); </syntaxhighlight> ; 引数 :c 書き込む文字 :stream 出力ストリーム ; 返却値 :書き込んだ文字。書き込みエラーが発生した場合、エラー表示子をセットし、EOF。 ; 機能 :putc関数とは、streamが指す出力ストリームにcで指定された文字を書き込む関数です。 :putc関数は、fputcと等価です。詳しくは[[#fputc関数]]を参照せよ。 ; 例 :[[#例:テキストファイルの読み書き]]の「例 fputc、fgetc関数を用いたテキストファイルの読み書き」を参照せよ。 === putchar関数 === <ref>『JISX3010:2003』p.216「7.19.7.9 putchar関数」</ref> ; 形式 :<syntaxhighlight lang=c> #include <stdio.h> int putchar(int c); </syntaxhighlight> ; 引数 :c 書き込む文字 ; 返却値 :書き込んだ文字。書き込みエラーが発生した場合、エラー表示子をセットし、EOF。 ; 機能 :putchar関数とは、標準出力にcで指定された文字を書き込む関数です。 :putchar関数は、第2実引数としてstdoutを指定したputcと等価です。詳しくは[[#putc関数]]を参照せよ。 ; 例 :<syntaxhighlight lang=c> #include <stdio.h> int main(void) { int c='a'; putchar(c); } </syntaxhighlight> === puts関数 === <ref>『JISX3010:2003』p.216「7.19.7.10 puts関数」</ref> ; 形式 :<syntaxhighlight lang=c> #include <stdio.h> int puts(const char *s); </syntaxhighlight> ; 引数 :s 文字列 ; 返却値 :書き込みエラーが発生した場合、EOF。その他の場合、非負の値。 ; 機能 :puts関数とは、標準出力にsが指す文字列を書き込む関数です。 :出力の最後に改行文字を追加します。 :終端ナル文字の書き込みは行わない。 ; 例 :<syntaxhighlight lang=c> #include <stdio.h> int main(void) { char str[]="Hello, world!"; puts(str); } </syntaxhighlight> === ungetc関数 === ISO/IEC 9899:2017 § 7.21.7.10 ''The ungetc function''<ref name="jtc1-sc22-wg14-n2596-7.21.7.10">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 243, §7.21.7.10 ''The ungetc function'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>。 ; 形式 :<syntaxhighlight lang=c> #include <stdio.h> int ungetc(int c, FILE *stream); </syntaxhighlight> ; 機能 : ungetc関数は、cで指定された(unsigned charに変換された)文字を、streamが指す入力ストリームに押し戻します。押し戻された文字は、そのストリームに対する後続の読み込みによって、押し戻された順序とは逆の順序で返されます。ファイル位置指定関数(fseek、fsetpos、rewind)を(streamが指すストリームで)正常に呼び出した場合、そのストリームで押し戻された文字は破棄されます。ストリームに対応する外部記憶装置は変更されません。 : 1文字分のプッシュバックが保証されます。ungetc関数が同一ストリーム上で何度も呼び出され、その間にそのストリームの読み込みやファイルの位置決め操作が行われなかった場合、操作は失敗することがあります。 : cの値がマクロEOFの値と等しい場合、操作は失敗し、入力ストリームは変更されません。 : ungetc 関数の呼び出しに成功すると、ストリームのファイル終端インジケータがクリアされます。テキストストリームの場合、ungetc関数の呼び出しに成功した後のファイル位置インジケータの値は、押し戻された文字がすべて読み込まれるか、または廃棄されるまで特定できない。バイナリストリームの場合、ungetc関数の呼び出しが成功するたびに、そのファイルポジションインジケーターはデクリメントされます。呼び出し前にその値がゼロだった場合、呼び出し後は不定です。 ; 返却値 : ungetc関数は、変換後に押し戻された文字を返し、操作が失敗した場合はEOFを返します。 ; 例 :<syntaxhighlight lang=c> #include <stdio.h> int main(void) { int c; printf("\n1文字の文字を入力してください:"); c = getchar(); printf("\n入力した文字は%cです。", c); ungetc(c, stdin); c = getchar(); printf("\nungetc()で標準入力へ押し戻した文字は%cです。", c); } </syntaxhighlight> == 直接入出力関数 == <ref>『JISX3010:2003』p.217「7.19.8 直接入出力関数」</ref> === fread関数 === <ref>『JISX3010:2003』p.217「7.19.8.1 fread関数」</ref> ; 形式 : <syntaxhighlight lang=c> #include <stdio.h> size_t fread(void * restrict ptr, size_t size, size_t nmemb, FILE * restrict stream); </syntaxhighlight> ; 引数 :ptr 配列 :size 大きさ :nmemb 個数 :stream ストリーム ; 返却値 :読み取りに成功した要素の個数。その個数は、読み取りエラーが発生した場合、又はファイルの終わりに達した場合、nmembより小さいことがあります。 ; 機能 :fread関数とは、streamが指すストリームから、最大nmemb個の大きさsizeの要素を、ptrが指す配列に読み取る関数です。 :ファイル位置表示子を読み取りに成功した文字数分進める。 :エラーが発生した場合、そのストリームのファイル位置表示子の値は不定です。 :1つの要素の一部だけが読み取られた時、その値は不定です。 ; 例 :[[#例:バイナリファイルの読み書き]]を参照せよ。 === fwrite関数 === * N2176 C17 ballot ISO/IEC 9899:2017 §7.21.8.2 ''The fwrite function''<ref name="jtc1-sc22-wg14-n2596-7.21.8.2">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 244, §7.21.8.2 ''The fwrite function'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>. ; 形式 :<syntaxhighlight lang=c> #include <stdio.h> size_t fwrite(const void * restrict ptr, size_t size, size_t nmemb, FILE * restrict stream); </syntaxhighlight> ; 説明 : fwrite関数は,ptrが指す配列から,sizeで指定されたサイズのnmemb要素までをstreamが指すストリームに書き込みます。各オブジェクトに対して、サイズコールがfputc関数に行われ、オブジェクトの上に正確に重なっているunsigned charの配列から値を(順に)取得します。ストリームのファイル・ポジション・インジケータ(定義されている場合)は、正常に書き込まれた文字数だけ進みます。エラーが発生した場合、ストリームのファイルポジションインジケータの結果は不定です。<!-- The fwrite function writes, from the array pointed to by ptr, up to nmemb elements whose size is specified by size, to the stream pointed to by stream. For each object, size calls are made to the fputc function, taking the values (in order) from an array of unsigned char exactly overlaying the object. The file position indicator for the stream (if defined) is advanced by the number of characters successfully written. If an error occurs, the resulting value of the file position indicator for the stream is indeterminate. --> ; 返却値 : fwrite関数は、書き込みに成功した要素の数を返しますが、書き込みエラーが発生した場合のみ、nmembよりも小さくなります。sizeまたはnmembが0の場合、fwriteは0を返し、ストリームの状態は変更されません。<!-- The fwrite function returns the number of elements successfully written, which will be less than nmemb only if a write error is encountered. If size or nmemb is zero, fwrite returns zero and the state of the stream remains unchanged. --> {{See also|#例:バイナリファイルの読み書き}} == ファイル位置付け関数 == <ref>『JISX3010:2003』p.218「7.19.9 ファイル位置付け関数」</ref> === fgetpos関数 === <ref>『JISX3010:2003』p.218「7.19.9.1 fgetpos関数」</ref> ; 形式 : <syntaxhighlight lang=c> #include <stdio.h> int fgetpos(FILE * restrict stream, fpos_t * restrict pos); </syntaxhighlight> ; 引数 :stream ストリーム :pos ストリームの解析状態及びファイル位置情報を格納するオブジェクト ; 返却値 :成功したときは0。失敗したときは0以外で、処理系定義の正の値をerrnoに格納します。 ; 機能 :fgetpos関数とは、streamが指すストリームの解析状態及びファイル位置表示子のその時点の値を、posが指すオブジェクトに格納する関数です。 :fsetpos関数を用いて、fgetpos関数で取得したファイル位置に、ストリームを再び位置づけることができる。 ; 例 :[[#例:fgetpos関数とfsetpos関数の使い方]]を参照せよ。 === fseek関数 === <ref>『JISX3010:2003』p.218「7.19.9.2 fseek関数」</ref> ; 形式 : <syntaxhighlight lang=c> #include <stdio.h> int fseek(FILE *stream, long int offset, int whence); </syntaxhighlight> ; 引数 :stream ストリーム :offset オフセット :whence 位置(SEEK_SET, SEEK_CUR, SEEK_END) ; 返却値 :要求を満足できなかった場合に限り、0以外の値。 ; 機能 :fseek関数とは、streamが指すストリームのファイル位置表示子の値を、変更する関数です。 :読み取りエラーまたは書き込みエラーが発生した場合、エラー表示子をセットし、fseek関数は失敗します。 :バイナリストリームの場合、新しい位置は、whenceが指す位置にoffsetを加えた位置です。 :whenceにはSEEK_SET, SEEK_CUR, SEEK_ENDのいずれかを指定し、SEEK_SETはファイルの初め、SEEK_CURはファイル位置表示子のその時点の値、SEEK_ENDはファイルの終わりを意味します。 :SEEK_ENDを指定した場合、呼び出しが意味のあるものとしてサポートされるとは限らない。 :テキストストリームの場合、offsetに0を指定する、又は同じファイルに結び付けられたストリームに対する以前の成功したftell関数の呼び出しで返された値を指定しなければならない。 :後者の場合whenceにはSEEK_SETを指定します。 :fseek関数の呼び出しに成功すると、新しい位置を決定した後、ストリームに対するungetc関数の効果をすべて解除し、そのストリームのファイル終了表示子をクリアした上で、ファイル位置表示子を新しい位置に設定します。 :fseek関数の呼び出しが成功した後では、更新ストリームに対する次の操作は入力でも出力でもよい。 ; 例 :[[#例:fseek関数とftell関数の使い方]]を参照せよ。 === fsetpos関数 === <ref>『JISX3010:2003』p.219「7.19.9.3 fsetpos関数」</ref> ; 形式 : <syntaxhighlight lang=c> #include <stdio.h> int fsetpos(FILE *stream, const fpos_t *pos); </syntaxhighlight> ; 引数 :stream ストリーム :pos 位置 ; 返却値 :成功したとき、0。失敗したとき、0以外の値で、処理系定義の正の値をerrnoに格納します。 ; 機能 :fsetpos関数とは、posが指すオブジェクトの値に従って、streamが指すストリームのmbstate_tオブジェクト及びファイル位置表示子を設定する関数です。 :fsetpos関数を用いて、fgetpos関数で取得したファイル位置に、ストリームを再び位置づけることができる。 :読み取りエラーまたは書き込みエラーが発生した場合、そのストリームに対するエラー表示子が設定され、fsetposは失敗します。 :fsetpos関数の呼び出しに成功すると、そのストリームに対するungetc関数の効果をすべて解除し、そのストリームのファイル終了表示子をクリアしたうえで、新しい解析状態を設定し、ファイル位置表示子を新しい位置に設定します。 :fsetposの呼び出しが成功した後では、更新ストリームに対する次の操作は入力でも出力でもよい。 ; 例 :[[#例:fgetpos関数とfsetpos関数の使い方]]を参照せよ。 === ftell関数 === <ref>『JISX3010:2003』p.219「7.19.9.4 ftell関数」</ref> ; 形式 : <syntaxhighlight lang=c> #include <stdio.h> long int ftell(FILE *stream); </syntaxhighlight> ; 引数 :stream ストリーム ; 返却値 :成功したとき、そのストリームのファイル位置表示子のその時点の値。失敗したとき-1Lで、処理系定義の正の値をerrnoに格納します。 ; 機能 :ftell関数とは、streamが指すストリームのファイル位置表示子のその時点の値を得る関数です。 :バイナリストリームの場合、その値はファイルの始めからの文字数です。 :テキストストリームの場合、そのファイル位置表示子は、ftell関数の呼び出し時の位置にそのストリームのファイル位置表示子を戻すために、fseek関数で使用できる情報を含む。 :ただし、この情報の内容は、未規定です。 :ftell関数の2回の呼び出し返却値の差は、書き込み文字数又は読み取り文字数という意味を持つとは限らない。 ; 例 :[[#例:fseek関数とftell関数の使い方]]を参照せよ。 === rewind関数 === <ref>『JISX3010:2003』p.219「7.19.9.5 rewind関数」</ref> ; 形式 : <syntaxhighlight lang=c> #include <stdio.h> void rewind(FILE *stream); </syntaxhighlight> ; 引数 :stream ストリーム ; 返却値 :なし ; 機能 :rewind関数とは、streamが指すストリームに対応するファイル位置表示子を、そのファイルの始めに位置付ける関数です。 :すなわち、そのストリームに対応するエラー表示子をクリアすることを除けば、 : <syntaxhighlight lang=c> (void)fseek(stream, 0L, SEEK_SET) </syntaxhighlight> と等価です。 ; 例 : <syntaxhighlight lang=c> //showfiletwice.c #include <stdio.h> int main(int argc, char *argv[]) { FILE *fp; int c; if(argc<2){//コマンドライン引数をチェック printf("showfiletwice ファイル名\n"); return 1; } if((fp=fopen(argv[1], "r"))==NULL){//ファイルをテキストファイルの読み取りモードでオープンします。 printf("オープン操作が失敗しました。\n"); return 1; } //ファイルの内容を表示します。 while((c=fgetc(fp))!=EOF){ putchar(c); } //ファイルの内容を再び表示します。 rewind(fp); putchar('\n');//改行します。 while((c=fgetc(fp))!=EOF){ putchar(c); } fclose(fp);//ファイルをクローズします。 } </syntaxhighlight> == エラー処理関数 == <ref>『JISX3010:2003』p.219「7.19.10 エラー処理関数」</ref> === clearerr関数 === <ref>『JISX3010:2003』p.219「7.19.10.1 clearerr関数」</ref> ; 形式 : <syntaxhighlight lang=c> #include <stdio.h> void clearerr(FILE *stream); </syntaxhighlight> ; 引数 :stream ストリーム ; 返却値 :なし ; 機能 :clearerr関数とは、streamが指すストリームのファイル終了表示子及びエラー表示子をクリアする関数です。 ; 例 :[[#例:clearerr関数とfeof関数の使い方]]を参照せよ。 :[[#例:clearerr関数とferror関数の使い方]]を参照せよ。 === feof関数 === <ref>『JISX3010:2003』p.220「7.19.10.2 feof関数」</ref> ; 形式 : <syntaxhighlight lang=c> #include <stdio.h> int feof(FILE *stream); </syntaxhighlight> ; 引数 :stream ストリーム ; 返却値 :streamのファイル終了表示子がセットされている場合、0以外の値。セットされていない場合、0。 ; 機能 :feof関数とは、streamが指すストリームのファイル終了表示子を判定する関数です。 ; 例 :[[#例:clearerr関数とfeof関数の使い方]]を参照せよ。 === ferror関数 === <ref>『JISX3010:2003』p.220「7.19.10.3 ferror関数」</ref> ; 形式 : <syntaxhighlight lang=c> #include <stdio.h> int ferror(FILE *stream); </syntaxhighlight> ; 引数 :stream ストリーム ; 返却値 :streamのエラー表示子がセットされている場合、0以外の値。セットされていない場合、0。 ; 機能 :ferror関数とは、streamが指すストリームのエラー表示子を判定する関数です。 ; 例 :[[#例:clearerr関数とferror関数の使い方]]を参照せよ。 === perror関数 === <ref>『JISX3010:2003』p.220「7.19.10.4 perror関数」</ref> ; 形式 : <syntaxhighlight lang=c> #include <stdio.h> void perror(const char *s); </syntaxhighlight> ; 引数 :s 文字列 ; 返却値 :なし ; 機能 :perror関数とは、整数式errnoのエラー番号に対応するエラーメッセージを生成する、すなわち標準エラーストリームに文字の並びを書き込む関数です。 :その文字の並びは、<var>s</var> が空ポインタでなく、かつ <var>s</var> が指す文字がナル文字でないならば、 :: <syntaxhighlight lang=text> { 仮引数 s の内容 }: エラーメッセージ </syntaxhighlight> :であり、それ以外ならば、 :: <syntaxhighlight lang=text> エラーメッセージ </syntaxhighlight> :です。 :<code>errno</code>は静的な場所に格納されるエラーコードによってエラー状態を報告するマクロです<ref name="jtc1-sc22-wg14-n1570-7.5">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf | title = N1570 Committee Draft — April 12, 2011 ISO/IEC 9899:201x | page=205, §7.5 ''Errors'' | publisher = ISO/IEC}}</ref>。ヘッダー<code>[[C言語/標準ライブラリ/|errno.h|errno.h]]</code>で定義されています(宣言ではなくマクロ定義です)。 {{See also|C言語/標準ライブラリ/エラー}} ; [https://paiza.io/projects/1kGujkciqyeGO93T3FMxVQ?language=c 例] : <syntaxhighlight lang=c> #include <stdio.h> int main(void) { FILE *fp; const char *filename = "file_not_existing", *s = "エラー"; //ファイルをテキストファイルの読み取りモードでオープンします。 if ((fp = fopen(filename, "r")) == NULL) { perror(s); return 1; } fclose(fp); //ファイルをクローズします。 return 0; } </syntaxhighlight> ;結果:<syntaxhighlight lang=text> エラー: No such file or directory </syntaxhighlight> {{See also|C言語/標準ライブラリ/文字列操作#strerror関数}} == 脚注 == <references/> == 参考文献 == * {{cite book | url=https://www.iso.org/obp/ui/#iso:std:iso-iec:9899:ed-4:v1:en | title= ISO/IEC 9899:2018(en) Information technology — Programming languages — C | publisher=[[W:国際標準化機構|ISO]]/[[W:国際電気標準会議|IEC]] | date = 2018-07-05}} * 日本工業標準調査会(当時、現:日本産業標準調査会)『JISX3010 プログラム言語C』2003年12月20日改正 [[Category:C言語|stdio.h]] 9elrgy3w9jaxqmflwopsczfyl5f5x7x PostgreSQL 0 12677 205618 96231 2022-07-21T10:24:06Z すじにくシチュー 12058 /* 公式ドキュメント */ リンク切れをコメントアウト。ついでにhttps対応。 wikitext text/x-wiki <div class="pathnavbox"> * {{Pathnav|メインページ|情報技術}} </div> {{Wikipedia}} == 公式ドキュメント == 公式ドキュメントは以下のサイトで参照できる。 * [https://www.postgresql.jp/document/ PostgreSQL日本語ドキュメント] (日本語) * [https://www.postgresql.org/docs/ PostgreSQL: Documentation] (英語) * <!-- [http://developer.postgresql.org/pgdocs/postgres/ PostgreSQL devel Documentation]--> <del>PostgreSQL devel Documentation (英語, 開発版)</del> ※リンク切れのためコメントアウト == 関連項目 == * [[:en:Postgres RDBMS/Trickery/Select without elimination]] - How to use a conditional to narrow down without elimination. * [[:en:Converting MySQL to PostgreSQL]] [[Category:PostgreSQL|*]] [[Category:データベース管理システム]] kzb9olnemjjwlm4ajzabx266jtx24p2 205619 205618 2022-07-21T10:24:49Z すじにくシチュー 12058 /* 関連項目 */ wikitext text/x-wiki <div class="pathnavbox"> * {{Pathnav|メインページ|情報技術}} </div> {{Wikipedia}} == 公式ドキュメント == 公式ドキュメントは以下のサイトで参照できる。 * [https://www.postgresql.jp/document/ PostgreSQL日本語ドキュメント] (日本語) * [https://www.postgresql.org/docs/ PostgreSQL: Documentation] (英語) * <!-- [http://developer.postgresql.org/pgdocs/postgres/ PostgreSQL devel Documentation]--> <del>PostgreSQL devel Documentation (英語, 開発版)</del> ※リンク切れのためコメントアウト == 関連項目 == * [[:en:PostgreSQL/Select without elimination]] - How to use a conditional to narrow down without elimination. * [[:en:Converting MySQL to PostgreSQL]] [[Category:PostgreSQL|*]] [[Category:データベース管理システム]] 5a4ze0zimwkxtwf1o13jxd5jw1gnjb1 さまざまな面から見た日本 地理 気候 0 15932 205614 202069 2022-07-21T08:44:01Z 218.219.176.182 wikitext text/x-wiki <small> [[小学校・中学校・高等学校の学習]] > [[中学校の学習]] > [[中学校社会]] > [[中学校社会 地理]] >気候 </small> [[中学校社会 地理/世界の気候|世界の気候の単元]]で見てきたように、世界の国々には一年を通して暑い国もあれば、夏でも日本の冬と同じぐらいの気温にしかならない国もある。また、砂漠のようにほとんど雨の降らない国や、逆に一年中たくさんの雨が降る国、他にも季節によって雨の多い時期と少ない時期のある国とさまざまな特徴がある。 では、日本はどうだろうか。日本列島は南北に長いため、北海道のように冬の気温が氷点下にまで下がるところもあれば、沖縄のように冬でも15度と東京の春ごろの気温と変わらないところもある。また、新潟県(山間部)及び青森県津軽地方のように雪が数メートルも積もる地方や、三重県{{ruby|尾鷲市|おわせし}}のように非常に雨の多い地方、あるいは岡山県{{ruby|倉敷市|くらしきし}}のように一年中雨の少ない地方がある。 ここでは、日本の気候の違いを通して、日本各地の環境とそれに影響されている産業や文化などを見ていこう。 == 気候帯 == まず、日本の大半が属している温帯と北海道のほとんどが属している亜寒帯について復習しよう。なお、ここは[[中学校社会 地理/世界の気候]]と同じ内容である。 === 温帯気候 === :(読み おんたい) {| class="wikitable" style="float:right" |+ 温帯の種類 ! colspan="2" | <span style="font-size: large;">気候名</span> ||特色||<span style="font-size: large;">場所</span> |- | rowspan="3" |<SPAN STYLE="FONT-WEIGHT:NORMAL;"><span style="font-size: large;">温<br />帯</span></SPAN> |<SPAN STYLE="FONT-WEIGHT:NORMAL;"><span style="font-size: large;">温暖湿潤気候</span></SPAN> |季節風(モンスーン)がある。<br />夏は高温で雨が多い。冬は低温。<br>降水量は多い。||東アジア<br />北アメリカ南東部 |- |<SPAN STYLE="FONT-WEIGHT:NORMAL;"><span style="font-size: large;">西岸海洋性気候</span></SPAN> |偏西風により、<br />季節による温度差が小さい。<br>||ヨーロッパ州の西岸<br />北アメリカ州の西岸  |- |<SPAN STYLE="FONT-WEIGHT:NORMAL;"><span style="font-size: large;">地中海性気候</span></SPAN> |夏は暑くて乾燥する。<br>冬は雨が降る。||イタリアなどの<br />地中海沿岸地域  |} もっとも寒い時期でも氷点下になることは少ないが、夏は地域によっては熱帯と同じぐらいの暑さになることがある。このため、四季の変化に富み、多くの動物・植物が生息する。気温・降水量共に農業に適していることから、古代から現代に至るまで農業や産業の発展した地域が多い。 雨の降りかたなどによって、気候の区分が、次の3つの、<span style="font-size: large;">{{ruby|温暖湿潤気候|おんだん しつじゅん きこう}}</span>、<span style="font-size: large;">{{ruby|西岸海洋性気候|せいがん かいようせい きこう}}</span>、<span style="font-size: large;">{{ruby|地中海性気候|ちちゅうかいせい きこう}}</span>に分けられる。 * 温暖湿潤気候 日本のように、1年間をとおして気温の変化が大きく、降水量の変化も大きい、<span style="font-size: large;">温暖湿潤気候</span>がある。 * 西岸海洋性気候 ヨーロッパの大西洋沿岸では、偏西風の影響のため、1年間を通して降水量の変化が小さい。このヨーロッパの大西洋沿岸の一帯の気候のこと<span style="font-size: large;">西岸海洋性気候</span>(せいがん かいようせい きこう)という。日本では道南地方の室蘭市と日高地方で分布している。 * 地中海性気候 イタリアなどの、ヨーロッパ州とアフリカ州の間にある地中海の周辺の国に多い気候である。夏には乾燥するが、冬は偏西風のために雨が降る。 ==== 温暖湿潤気候 ==== [[Image:ClimateTokyoJapan.png|thumb|200px|left|東京の雨温図]] [[Image:Subtropicworldmap.png|thumb|260px|温暖湿潤気候の世界的な分布]] 温帯モンスーン気候ということもある。主に中緯度の大陸東岸に分布する。 この気候に属する主な都市は、東京(日本)、シャンハイ(中国)、ブエノスアイレス(アルゼンチン)。 季節風の影響を強く受けるため、特に四季がはっきりとしている。 温帯の中では、四季の変化が、もっともはっきりしている。 日本や、周辺の東アジア諸国での温暖湿潤気候での季節ごとの変化の大きさの原因は、季節によって、気候に影響を与える季節風が変わるためである。 夏は低緯度の海からの風を受けるために高温多湿となるが、冬は高緯度の大陸からの風を受けるために乾燥した寒い季節となる(しかし、0度を下回ることは少ない)。また、夏には台風のような[[w:熱帯低気圧|熱帯低気圧]]に襲われることもある。 夏は暑く、冬は寒いので、ここに住む人々はそれぞれの季節にあうような生活スタイルを作っていった。例えば日本の伝統的な衣服は夏は涼しく、冬は暖かくなるような素材が好まれた。豊かな水と適度な気温のため、農業に適している。日本などの東アジア周辺では米作りが盛んである。 温帯の植物は、いっぱんに、広葉樹林と針葉樹林が混合している。 また、アルゼンチンのパンパ・アメリカのプレーリーのように豊かな草原地帯もある。パンパやプレーリーでは放牧も盛んに行われている。 {{clear}} ==== 西岸海洋性気候 ==== [[画像:German Climate Stuttgart.png|thumb|left|200px|シュツットガルト(Cfb)の雨温図]] [[画像:Koppen classification worldmap CfbCfc.png|thumb|260px|西岸海洋性気候の地域の世界的な分布]] この気候に属する主な都市は、ロンドン(イギリス)、パリ(フランス)、メルボルン(オーストラリア)である。 ちなみに日本では北海道の室蘭市と日高地方が属している。 大陸西岸の高緯度地方(緯度40度 - 60度付近)に分布する。西ヨーロッパの多くはこの気候に属している。温暖湿潤気候などと比べると、西岸海洋性気候の気温の年間の変化は小さい。夏はあまり暑くならずすごしやすい。冬は長く寒いが、暖流からの偏西風の影響を受けるため、緯度のわりに冷え込みはきびしくない。例えばロンドンやパリは、サハリン(樺太)と同じ緯度だが、冬の平均気温は5度くらいで東京よりも少し寒いぐらいである。また、降水量は一年を通して一定である。 落葉広葉樹や針葉樹林もあるが、牧草も育ちやすい。牧畜に適している地域であるため、農業と牧畜を組み合わせた混合農業が盛んに行われてきた。例えばフランスは小麦の生産が盛んな国であるが、チーズなどの乳製品の生産量も多い。 {{clear}} ==== 地中海性気候 ==== [[ファイル:Climograma Santiago.png|thumb|left|200px|サンティアゴの雨温図]] [[ファイル:KoppenclassificationworldmapCs.png|thumb|260px|地中海性気候 (Cs) の世界的な分布]] イタリアのような地中海沿岸が中心だが、南北アメリカ大陸の西側にも見られる。夏は乾燥帯なみに乾燥するが、冬には雨が降る〔偏西風〕。また、ヨーロッパ州の沿岸の場合、大西洋沿岸には暖流の北大西洋海流が流れているので、緯度の割には温かい。冬はあまり気温が下がらないため、常緑広葉樹林となる。 赤土やテラロッサと呼ばれる石灰岩が風化してできた土に覆われているため、土地はあまり豊かではない。しかし、夏の強い乾燥に耐えられるオレンジ・レモン・の柑橘類トマトやぶどう、オリーブの生産が盛んで、雨の降る冬に小麦を栽培する。こうした農業を{{ruby|地中海式農業|ちちゅうかいしき のうぎょう}}という。また、日光の少ない地域の人々が夏にやってくることも多いため、リゾート地として有名なところも多い。 この気候に属する主な都市は、ローマ(イタリア)、アテネ(ギリシャ)、サンフランシスコ(アメリカ)である。 {{clear}} === 亜寒帯・寒帯 === (読み:あかんたい・かんたい) {| class="wikitable" style="float:right" |+ 寒帯と亜寒帯の種類 ! colspan="2" | <span style="font-size: large;">気候名</span> ||特色||<span style="font-size: large;">場所</span> |- | colspan="2" | <SPAN STYLE="FONT-WEIGHT:NORMAL;"><span style="font-size: large;">亜寒帯(冷帯)</span></SPAN>  |タイガ。針葉樹。<br>冬は長くて寒く、特に真冬はかなり低温となるが、<br>夏はわりあい暑い。||シベリア中部、<br>アラスカ中部、<br>カナダ中部など |- | rowspan="2" |<SPAN STYLE="FONT-WEIGHT:NORMAL;"><span style="font-size: large;">寒<br>帯</span></SPAN> |<SPAN STYLE="FONT-WEIGHT:NORMAL;"><span style="font-size: large;">ツンドラ気候</span></SPAN> |ツンドラ。コケ類。<br>地中は永久凍土。||シベリア北部、<br>アラスカ北部、<br>カナダ北部など |- |<SPAN STYLE="FONT-WEIGHT:NORMAL;"><span style="font-size: large;">氷雪気候</span></SPAN> |年中、氷雪。<br>植物は育たない。||南極大陸や北極  |} [[Image:ClimateMoscowRussia.PNG|thumb|left|200px|モスクワの雨温図]] [[Image:Koppen classification worldmap Dw.png|thumb|left|260px|亜寒帯冬季少雨気候 (Dw) の世界的な分布]] [[Image:Koppen classification worldmap Df.png|thumb|260px|亜寒帯湿潤気候 (Df) の世界的な分布]] {{ruby|冷帯|れいたい}}ともいう。 シベリアのような気候である。冬は長く、特に真冬は寒さがとても厳しいが、夏は気温が上がり、天気が良ければかなり暑くなる。夏には気温が高くなるため、樹木も育つ。 森林には、針葉樹やシラカバなどの木々が多い。 亜寒帯での針葉樹林のことを'''タイガ'''といい、これが多く分布する。 ユーラシア大陸の北部や、北アメリカ大陸の北部に見られる気候である。 ロシアの首都のモスクワの気候も亜寒帯である。 亜寒帯の分布地域は、中国北東部・朝鮮半島北部・ロシアの半分以上・アメリカ北部からカナダにかけての地域など、おおむね緯度40度以上の高緯度地域に分布する。季節は、温帯と同様に、四季が見られるが、夏は温帯ほどではないがやはり暑くなる。また、夏は日照時間が長いため昼夜の気温差が大きいのも特徴であり、特に内陸地方では昼にかけては暑くなるが、朝夜は一転して冷え込む。冬の平均気温は0度を下回るのが普通である。 季節による、1年間の夏と冬との温度差が大きい。特に中国の北京のように、夏と冬の気温差が40度近くもあるところも存在する。 冬の寒さが厳しい気候なので、人々は寒さ対策を行ってきた。朝鮮半島の[[w:オンドル|オンドル]]はその典型例である。春から夏にかけては比較的温暖なので、その時期に小麦を栽培することが多い。特にロシア南部の黒土地帯は世界有数の小麦生産地帯である。また、寒さに強い、カブ・ソバ・ライ麦・ジャガイモの生産も盛んである。また、タイガは豊かな針葉樹林地帯であるので、林業も盛んである。 この気候に属する主な都市は、札幌(日本)、ペキン(中国)、モスクワ(ロシア)である。 細かくは、亜寒帯には亜寒帯冬季少雨気候や亜寒帯湿潤気候などがある。中学ではあまりこの区別は重要ではない。 {{clear}} == 日本の気候 == === 日本全体の気候の傾向 === [[File:Japan climate classification 1.png|thumb|left|320px|1:太平洋側気候(黄緑色) 2:日本海側気候(青色) 3:瀬戸内海式気候(黄色) 4:中央高地式(内陸式)気候 学校の教科書にある図とは異なるので注意]] [[File:ClimateTokyoJapan.png|thumb|right|220px|東京の雨温図。太平洋側の地域の例。]] [[Image:ClimateNiigataJapan.png|thumb|right|220px|新潟市の雨温図。日本海側の地域の例。]] 日本の気候は、ほとんどの地域は <span style="font-size: large;">温帯</span> に属し、温帯のうちの温暖湿潤気候に属する。だが北海道や東北地方は <span style="font-size: large;">亜寒帯(冷帯)</span> に属する。 また、南西諸島の気候は、<span style="font-size: large;">{{ruby|亜熱帯|あねったい}}</span>という、熱帯と温帯のあいだのような気候である。 日本は季節風(モンスーン)の影響で、四季がはっきりしている。また、日本には<span style="font-size: large;">梅雨</span>(「つゆ」または「ばいう」)があり、日本の冬には雪もあるため、日本は年間の降水量が多い。 なお、北海道では梅雨が無い。 日本は南北に長いため、南の沖縄県と、北の北海道とでは、気候が大きくことなる。 気候に影響するのは、緯度だけでは無く、山脈や山地によって、<span style="font-size: large;">太平洋側と日本海側では、気候が大きく異なる。</span> ==== 春から夏にかけて ==== 6月はじめごろから梅雨があり、日本の多くの地域で降水量が多くなる期間が、1ヶ月ほど続く。 梅雨の原因は、北方にある冬の季節風と、南方にある夏の季節風とが、ぶつかりあって、ほとんど動かない梅雨前線が発生するからである。 この梅雨前線では、夏と冬の季節風がぶつかっているので、天気が不安定となり、雨が降りやすい。 夏の季節風も、冬の季節風も、どちらとも、太平洋や日本海を通ってくるので、水分を含んでいる。 しかも、梅雨の間の6月は前線が停滞しているので、前線が北に抜けるまでの1ヶ月ほど、雨の日が多い。 季節が夏に近づくにつれ、夏の季節風のほうが強くなり、冬の季節風を北に押し返すので、前線は北に抜ける。 梅雨前線が北に抜けると、梅雨が終わる。 そして日本は、7月ごろに夏を迎え、気温の暑い日々が9月くらいまでつづく。 夏の季節風は、太平洋の水蒸気を含んでいるので、日本列島の太平洋側の地域では、湿っている。 いっぽう日本海側では、山地をこえるときに季節風が水分を失うので、日本海側では乾燥している。 ==== 夏から秋・冬にかけて ==== * 秋 夏から秋にかけての9月ごろは、<span style="font-size: large;">{{ruby|台風|たいふう}}</span>という、強風や大雨を起こす低気圧が南方から日本列島に北上してやってくる。台風で{{ruby|被害|ひがい}}を受ける場合も多い。 台風は、もともと赤道近くの熱帯の海で発生した低気圧( {{ruby|熱帯性低気圧|ねったいせい ていきあつ}} )である。 春から夏にかけての梅雨前線と同様に、秋から冬にかけても、{{ruby|秋雨前線|あきさめ ぜんせん}}が、やってくる。 * 冬 冬は、シベリア気団の発達により、北西の季節風が強くなる。季節風が日本海の水分をふくんでいるので、日本海側では雪が多く降る。いっぽう太平洋側では、山地をこえるときに季節風が水分を失うので、太平洋側では乾燥している。太平洋側では、日本海側とくらべると、雪もあまり降らない。 冬の太平洋側の地域で、北方の山地から北風が南へ向かって、ふいてくる。この北方の山から吹き降ろしてくる風のことを「<span style="font-size: large;">からっ{{ruby|風|かぜ}}</span>」といい、冷たくて乾燥している。 ==== 太平洋側と日本海側の気候の違い ==== 前の節では、季節ごとによる気候の特徴を説明した。 逆に、太平洋側の地域、および日本海側の地域を基準に、気候を見てみよう。 * 太平洋側の地域では、夏は{{ruby|湿気|しっけ}}が多く、雨も多い。太平洋側の冬は、乾燥している。北方の山から「からっ風」が吹き降ろす。 * 日本海側の地域では、夏は乾燥している。冬は季節風に水分が多く、雨及び雪が多い。全体的に見ると曇りの日が多い。 ==== その他の気候 ==== 他にも、地域の特性によって、多くの気候がある。一例として、瀬戸内気候を説明する。 * {{ruby|瀬戸内|せとうち}}気候 瀬戸内海ぞいの瀬戸内では、南北ともに、四国山地または中国山地にさえぎられているので、瀬戸内では雨も雪も少ない。 このように、南北を山にさえぎられている地域では、雨や雪が少ない。 === 日本各地の気候の傾向 === 日本の気候区分はいろいろな説があるが、普通の教科書では以下のように分けられる。 * 北海道の気候 * 日本海の気候 * 太平洋の気候 * 南西諸島の気候 * 内陸性の気候 * 瀬戸内の気候 気候によって、農業など、産業や生活の特徴も変わってくる。それらの説明は、後の節や別の記事で説明を行う。 === 太平洋側の気候 === 「太平洋岸気候」や「太平洋型気候」などとも言う。夏は太平洋からの暖かく湿った季節風の影響で高温多湿となるが、冬は大陸からの冷たく乾いた風の影響を受けて乾燥する。西日本では暖流の日本海流(黒潮)の影響を強く受けるため、高温多湿となるが、東日本、特に東北地方は寒流の千島海流(親潮)の影響も受けるため、気温が上がらないときもある。特に千島海流の影響が強いときには夏でも '''やませ''' とよばれる冷たい風が吹き、冷害が起こることもある。 夏から秋にかけて雨が多く、東北地方を除いて、冬でも寒いとはいえ霜が降ったり雪が降ったりすることは少ない。そのため、米以外の野菜や花の生産も盛んである。また、静岡県や鹿児島県では茶の生産も盛んである。 === 日本海側の気候 === [[Image:ClimateNiigataJapan.png|thumb|left|220px|新潟市の雨温図]] 「日本海岸気候」などとも言う。その名の通り日本海側に見られる気候である。日本海側には暖流である対馬海流が流れており、暖かく湿った空気を運んでくる。しかし、冬になるとユーラシア大陸からの冷たく乾燥した風が対馬海流の湿った風を冷やして雪にする。このため、気温のわりに雪がとても多く、世界有数の豪雪地帯となっている。 冬に雪が多いため、雪への対策が行われている。例えば、雪が積もり過ぎないように屋根の角度を急にしたり、信号機を縦にしたりしている(特に東北と北海道が多い)。また、'''消雪パイプ'''を使って道路の雪をとかすことも行われている。 この気候では雪が多いため、冬は農業ができない。しかし、春になると雪は豊富な雪解け水をもたらす。これを利用して春から秋にかけて米作りに集中する'''水田単作地帯'''が多い。特に新潟県は米作りで有名である。また、冬の間には農業ができないかわりに、さまざまなものづくりが行われてきた。新潟県の小千谷ちぢみ、石川県の輪島塗や加賀友禅などの伝統工業はもともと冬の間の仕事として発展してきたものである。現在でも燕市(新潟)の金属製洋食器、三条市(新潟)の金物、鯖江市(福井)の眼鏡などが有名である。また、豊富な雪解け水を生かした水力発電も積極的に行われてきたため、'''日本の電源地帯'''と呼ばれてきた。 === 北海道の気候 === 古い教科書では北海道式気候といったが、現在ではあまり使われない。 温帯ではなく亜寒帯に属する。このため、夏は比較的すごしやすいが、秋の終わりから春の初めまでの気温は氷点下まで下がる。また、梅雨がなく、台風もあまり来ないため、夏は他の地方よりも乾燥する。ただ、北海道は太平洋側・日本海側・内陸・オホーツク海側とで気温や降水量に差があるため、札幌市や函館市と稚内市などでは違いがあるので注意したい。 明治時代まで朝廷や幕府の力があまり及ばなかったため、長い間、先住民族である'''アイヌ'''の人々の伝統的な狩猟や漁業が中心で農業は盛んではなかった。明治以降に北海道として日本に正式に組み込まれると、開拓が進み、農業も活発に行われるようになった。当初は寒さに強い作物と酪農が中心であった。現在でもジャガイモ、ビート(てんさい・さとうだいこん)、小豆、小麦、乳製品の生産量は全国一である。しかし、品種改良によって寒さに強い米が開発され、北海道でも石狩平野を中心に米作りが盛んになり、現在では都道府県別の米の生産量も全国一となった。 === 内陸の気候 === {| class="wikitable" !!! 標高 !! 最多月 !! 最少月 !! 年間降水量 !! 8月の降水量 !! 12月の降水量 |- !長野 |418.2 m |11.2(7月) |6.8(11月) |901.2 mm |95.0 mm |38.2 mm |- !松本 |610 m |11.6(7月) |3.7(12月) |1,018.5 mm |95.8 mm |23.3 mm |- !諏訪 |760.1 m |13.5(7月) |4.7(1月) |1,307.0 mm |129.6 mm |33.8 mm |} '''中央高地式気候'''ともいう。古い教科書では内陸式気候、あるいは、大陸性気候という言葉も使われたが、今はあまり使われない。 中央高地(長野県・山梨県・岐阜県北部など)に見られる気候であるが、似たような気候は山形盆地や京都盆地にも見られる。夏は太平洋側で雨が降り、冬は日本海側で雪が降るため、一年を通して降水量は少ない。また、海から離れているため、夏と冬との気温差が大きく、夏は暑く、冬の気温は氷点下になることも珍しくない。特に夏の暖かく乾いた空気がフェーン現象を起こすこともあり、夏の気温をさらに高めることがある。ただし、標高の高い地域では夏でも気温があまり上がらないところもある。 水源は多いが、平地が少ないため、米作りはあまり盛んではない。そのかわり、日当たりのよい山あいと乾燥した気候を利用した果物の栽培が盛んである。長野県のりんごの生産量は全国2位であり、山梨県のぶどう・もも の生産量は全国一である。また、長野県の{{ruby|野辺山原|のべやまはら}}や群馬県の{{ruby|嬬恋村|つまごいむら}}では夏でも涼しい気候を利用した{{ruby|抑制栽培|よくせい さいばい}}による、キャベツ・レタスの栽培も盛んである。かつては{{ruby|生糸|きいと}}をつくるための{{ruby|養蚕|ようさん}}も盛んだったが、日本の産業が軽工業から重工業にうつったため、現在では衰退している。 === 瀬戸内の気候 === [[Image:ClimateOsakaJapan.png|thumb|left|220px|大阪市の雨温図]] '''瀬戸内式気候'''ともいう。瀬戸内海沿岸地域に見られる気候である。夏の季節風は四国山地に、冬の季節風は中国山地にさえぎられるために一年を通して降水量は少ない。このため、梅雨が短かったり、台風があまり来なかったりするときには'''{{ruby|干|かん}}ばつ'''が起こりやすい。その対策として人工的に大きな池を作って水を確保する施設である'''ため{{ruby|池|いけ}}'''が各地に作られた。気温は海に面していることもあって温暖である。 雨も雪も少ないため、畑作が中心で、特に小麦が多く作られた。香川県のさぬきうどんは、この小麦を利用して作られてきた。また、雨が少ないということは晴れの日も多いということでもあり、それを利用した果物の栽培も盛んである。岡山県はオリーブやキウイフルーツの生産量が日本一である。愛媛県は長くみかんの生産量が全国一であった(現在は2位)。他にも晴れの日の多さを利用した塩の生産が以前は盛んで、広大な塩を作るための土地(塩田)が、広がっていた。しかし、塩作りの方法が変わったことなどによって、塩田を利用する必要がなくなり、現在は広大な塩田の跡地を工業用地として活用している。 {{clear}} === 南西諸島の気候 === [[ファイル:ClimateNahaJapan.png|thumb|left|220px|{{ruby|那覇|なは}}市の雨温図]] '''南西諸島気候'''または'''{{ruby|亜熱帯|あねったい}}'''ともいう。鹿児島県の{{ruby|奄美大島|あまみ おおしま}}から沖縄県にかけての気候である。冬の平均気温でも15度程度と本州に比べて温暖であるが、海に面しているため、夏は極端に暑くなることもない(八重山諸島は除く)。日本海流からの暖かく湿った風の影響で、年間降水量も多い。昼と夜の気温差と年間気温差が小さい。 しかし、大きな川がないため、降水量のわりに水不足になりやすく、また台風の直撃を受けることも多いため、農業は畑作が中心であった。米作りは畑作ほど、さかんでない。特にパイナップルやさとうきびの栽培が盛んである。近年はマンゴーやパパイヤといったトロピカルフルーツと呼ばれるものだけでなく、暖かい気温を生かして季節をずらした花や野菜の栽培も盛んとなっているが、航空機の輸送コストの影響を受けやすいという問題も抱えている。 このような様々な気候の特色を知ればこれからはもっと自然との付き合いが楽しめるようになるだろう。 まとめ 日本は四季がはっきりしており、梅雨の影響によって太平洋側と日本海側で降水量が大きく違う。 6月から7月にかけて雨が降り続く梅雨や、夏から秋にやってきて強い風と雨をもたらす台風は、重要な農業用水や飲料水の確保には欠かせない。しかし、台風の強い風と多くの雨で、くらしや農業に大きな影響が出ることがある。 {{-}} == ※ 他教科関連 == * [[中学校理科 第2分野/天気とその変化]] :※ なお、理科の天気関係は中学2年の範囲。 :中1での地理の授業の時点では、まだ理科で天気を習ってないので、読者は中3での受験勉強の復習の際などに他教科関連リンクを活用すればよいかと思われます。 [[Category:中学校教育|きこう]] [[Category:地理学|きこう]] b35c729souavxqd9xdzwlixcp1akng6 205615 205614 2022-07-21T08:45:06Z 218.219.176.182 /* 南西諸島の気候 */ wikitext text/x-wiki <small> [[小学校・中学校・高等学校の学習]] > [[中学校の学習]] > [[中学校社会]] > [[中学校社会 地理]] >気候 </small> [[中学校社会 地理/世界の気候|世界の気候の単元]]で見てきたように、世界の国々には一年を通して暑い国もあれば、夏でも日本の冬と同じぐらいの気温にしかならない国もある。また、砂漠のようにほとんど雨の降らない国や、逆に一年中たくさんの雨が降る国、他にも季節によって雨の多い時期と少ない時期のある国とさまざまな特徴がある。 では、日本はどうだろうか。日本列島は南北に長いため、北海道のように冬の気温が氷点下にまで下がるところもあれば、沖縄のように冬でも15度と東京の春ごろの気温と変わらないところもある。また、新潟県(山間部)及び青森県津軽地方のように雪が数メートルも積もる地方や、三重県{{ruby|尾鷲市|おわせし}}のように非常に雨の多い地方、あるいは岡山県{{ruby|倉敷市|くらしきし}}のように一年中雨の少ない地方がある。 ここでは、日本の気候の違いを通して、日本各地の環境とそれに影響されている産業や文化などを見ていこう。 == 気候帯 == まず、日本の大半が属している温帯と北海道のほとんどが属している亜寒帯について復習しよう。なお、ここは[[中学校社会 地理/世界の気候]]と同じ内容である。 === 温帯気候 === :(読み おんたい) {| class="wikitable" style="float:right" |+ 温帯の種類 ! colspan="2" | <span style="font-size: large;">気候名</span> ||特色||<span style="font-size: large;">場所</span> |- | rowspan="3" |<SPAN STYLE="FONT-WEIGHT:NORMAL;"><span style="font-size: large;">温<br />帯</span></SPAN> |<SPAN STYLE="FONT-WEIGHT:NORMAL;"><span style="font-size: large;">温暖湿潤気候</span></SPAN> |季節風(モンスーン)がある。<br />夏は高温で雨が多い。冬は低温。<br>降水量は多い。||東アジア<br />北アメリカ南東部 |- |<SPAN STYLE="FONT-WEIGHT:NORMAL;"><span style="font-size: large;">西岸海洋性気候</span></SPAN> |偏西風により、<br />季節による温度差が小さい。<br>||ヨーロッパ州の西岸<br />北アメリカ州の西岸  |- |<SPAN STYLE="FONT-WEIGHT:NORMAL;"><span style="font-size: large;">地中海性気候</span></SPAN> |夏は暑くて乾燥する。<br>冬は雨が降る。||イタリアなどの<br />地中海沿岸地域  |} もっとも寒い時期でも氷点下になることは少ないが、夏は地域によっては熱帯と同じぐらいの暑さになることがある。このため、四季の変化に富み、多くの動物・植物が生息する。気温・降水量共に農業に適していることから、古代から現代に至るまで農業や産業の発展した地域が多い。 雨の降りかたなどによって、気候の区分が、次の3つの、<span style="font-size: large;">{{ruby|温暖湿潤気候|おんだん しつじゅん きこう}}</span>、<span style="font-size: large;">{{ruby|西岸海洋性気候|せいがん かいようせい きこう}}</span>、<span style="font-size: large;">{{ruby|地中海性気候|ちちゅうかいせい きこう}}</span>に分けられる。 * 温暖湿潤気候 日本のように、1年間をとおして気温の変化が大きく、降水量の変化も大きい、<span style="font-size: large;">温暖湿潤気候</span>がある。 * 西岸海洋性気候 ヨーロッパの大西洋沿岸では、偏西風の影響のため、1年間を通して降水量の変化が小さい。このヨーロッパの大西洋沿岸の一帯の気候のこと<span style="font-size: large;">西岸海洋性気候</span>(せいがん かいようせい きこう)という。日本では道南地方の室蘭市と日高地方で分布している。 * 地中海性気候 イタリアなどの、ヨーロッパ州とアフリカ州の間にある地中海の周辺の国に多い気候である。夏には乾燥するが、冬は偏西風のために雨が降る。 ==== 温暖湿潤気候 ==== [[Image:ClimateTokyoJapan.png|thumb|200px|left|東京の雨温図]] [[Image:Subtropicworldmap.png|thumb|260px|温暖湿潤気候の世界的な分布]] 温帯モンスーン気候ということもある。主に中緯度の大陸東岸に分布する。 この気候に属する主な都市は、東京(日本)、シャンハイ(中国)、ブエノスアイレス(アルゼンチン)。 季節風の影響を強く受けるため、特に四季がはっきりとしている。 温帯の中では、四季の変化が、もっともはっきりしている。 日本や、周辺の東アジア諸国での温暖湿潤気候での季節ごとの変化の大きさの原因は、季節によって、気候に影響を与える季節風が変わるためである。 夏は低緯度の海からの風を受けるために高温多湿となるが、冬は高緯度の大陸からの風を受けるために乾燥した寒い季節となる(しかし、0度を下回ることは少ない)。また、夏には台風のような[[w:熱帯低気圧|熱帯低気圧]]に襲われることもある。 夏は暑く、冬は寒いので、ここに住む人々はそれぞれの季節にあうような生活スタイルを作っていった。例えば日本の伝統的な衣服は夏は涼しく、冬は暖かくなるような素材が好まれた。豊かな水と適度な気温のため、農業に適している。日本などの東アジア周辺では米作りが盛んである。 温帯の植物は、いっぱんに、広葉樹林と針葉樹林が混合している。 また、アルゼンチンのパンパ・アメリカのプレーリーのように豊かな草原地帯もある。パンパやプレーリーでは放牧も盛んに行われている。 {{clear}} ==== 西岸海洋性気候 ==== [[画像:German Climate Stuttgart.png|thumb|left|200px|シュツットガルト(Cfb)の雨温図]] [[画像:Koppen classification worldmap CfbCfc.png|thumb|260px|西岸海洋性気候の地域の世界的な分布]] この気候に属する主な都市は、ロンドン(イギリス)、パリ(フランス)、メルボルン(オーストラリア)である。 ちなみに日本では北海道の室蘭市と日高地方が属している。 大陸西岸の高緯度地方(緯度40度 - 60度付近)に分布する。西ヨーロッパの多くはこの気候に属している。温暖湿潤気候などと比べると、西岸海洋性気候の気温の年間の変化は小さい。夏はあまり暑くならずすごしやすい。冬は長く寒いが、暖流からの偏西風の影響を受けるため、緯度のわりに冷え込みはきびしくない。例えばロンドンやパリは、サハリン(樺太)と同じ緯度だが、冬の平均気温は5度くらいで東京よりも少し寒いぐらいである。また、降水量は一年を通して一定である。 落葉広葉樹や針葉樹林もあるが、牧草も育ちやすい。牧畜に適している地域であるため、農業と牧畜を組み合わせた混合農業が盛んに行われてきた。例えばフランスは小麦の生産が盛んな国であるが、チーズなどの乳製品の生産量も多い。 {{clear}} ==== 地中海性気候 ==== [[ファイル:Climograma Santiago.png|thumb|left|200px|サンティアゴの雨温図]] [[ファイル:KoppenclassificationworldmapCs.png|thumb|260px|地中海性気候 (Cs) の世界的な分布]] イタリアのような地中海沿岸が中心だが、南北アメリカ大陸の西側にも見られる。夏は乾燥帯なみに乾燥するが、冬には雨が降る〔偏西風〕。また、ヨーロッパ州の沿岸の場合、大西洋沿岸には暖流の北大西洋海流が流れているので、緯度の割には温かい。冬はあまり気温が下がらないため、常緑広葉樹林となる。 赤土やテラロッサと呼ばれる石灰岩が風化してできた土に覆われているため、土地はあまり豊かではない。しかし、夏の強い乾燥に耐えられるオレンジ・レモン・の柑橘類トマトやぶどう、オリーブの生産が盛んで、雨の降る冬に小麦を栽培する。こうした農業を{{ruby|地中海式農業|ちちゅうかいしき のうぎょう}}という。また、日光の少ない地域の人々が夏にやってくることも多いため、リゾート地として有名なところも多い。 この気候に属する主な都市は、ローマ(イタリア)、アテネ(ギリシャ)、サンフランシスコ(アメリカ)である。 {{clear}} === 亜寒帯・寒帯 === (読み:あかんたい・かんたい) {| class="wikitable" style="float:right" |+ 寒帯と亜寒帯の種類 ! colspan="2" | <span style="font-size: large;">気候名</span> ||特色||<span style="font-size: large;">場所</span> |- | colspan="2" | <SPAN STYLE="FONT-WEIGHT:NORMAL;"><span style="font-size: large;">亜寒帯(冷帯)</span></SPAN>  |タイガ。針葉樹。<br>冬は長くて寒く、特に真冬はかなり低温となるが、<br>夏はわりあい暑い。||シベリア中部、<br>アラスカ中部、<br>カナダ中部など |- | rowspan="2" |<SPAN STYLE="FONT-WEIGHT:NORMAL;"><span style="font-size: large;">寒<br>帯</span></SPAN> |<SPAN STYLE="FONT-WEIGHT:NORMAL;"><span style="font-size: large;">ツンドラ気候</span></SPAN> |ツンドラ。コケ類。<br>地中は永久凍土。||シベリア北部、<br>アラスカ北部、<br>カナダ北部など |- |<SPAN STYLE="FONT-WEIGHT:NORMAL;"><span style="font-size: large;">氷雪気候</span></SPAN> |年中、氷雪。<br>植物は育たない。||南極大陸や北極  |} [[Image:ClimateMoscowRussia.PNG|thumb|left|200px|モスクワの雨温図]] [[Image:Koppen classification worldmap Dw.png|thumb|left|260px|亜寒帯冬季少雨気候 (Dw) の世界的な分布]] [[Image:Koppen classification worldmap Df.png|thumb|260px|亜寒帯湿潤気候 (Df) の世界的な分布]] {{ruby|冷帯|れいたい}}ともいう。 シベリアのような気候である。冬は長く、特に真冬は寒さがとても厳しいが、夏は気温が上がり、天気が良ければかなり暑くなる。夏には気温が高くなるため、樹木も育つ。 森林には、針葉樹やシラカバなどの木々が多い。 亜寒帯での針葉樹林のことを'''タイガ'''といい、これが多く分布する。 ユーラシア大陸の北部や、北アメリカ大陸の北部に見られる気候である。 ロシアの首都のモスクワの気候も亜寒帯である。 亜寒帯の分布地域は、中国北東部・朝鮮半島北部・ロシアの半分以上・アメリカ北部からカナダにかけての地域など、おおむね緯度40度以上の高緯度地域に分布する。季節は、温帯と同様に、四季が見られるが、夏は温帯ほどではないがやはり暑くなる。また、夏は日照時間が長いため昼夜の気温差が大きいのも特徴であり、特に内陸地方では昼にかけては暑くなるが、朝夜は一転して冷え込む。冬の平均気温は0度を下回るのが普通である。 季節による、1年間の夏と冬との温度差が大きい。特に中国の北京のように、夏と冬の気温差が40度近くもあるところも存在する。 冬の寒さが厳しい気候なので、人々は寒さ対策を行ってきた。朝鮮半島の[[w:オンドル|オンドル]]はその典型例である。春から夏にかけては比較的温暖なので、その時期に小麦を栽培することが多い。特にロシア南部の黒土地帯は世界有数の小麦生産地帯である。また、寒さに強い、カブ・ソバ・ライ麦・ジャガイモの生産も盛んである。また、タイガは豊かな針葉樹林地帯であるので、林業も盛んである。 この気候に属する主な都市は、札幌(日本)、ペキン(中国)、モスクワ(ロシア)である。 細かくは、亜寒帯には亜寒帯冬季少雨気候や亜寒帯湿潤気候などがある。中学ではあまりこの区別は重要ではない。 {{clear}} == 日本の気候 == === 日本全体の気候の傾向 === [[File:Japan climate classification 1.png|thumb|left|320px|1:太平洋側気候(黄緑色) 2:日本海側気候(青色) 3:瀬戸内海式気候(黄色) 4:中央高地式(内陸式)気候 学校の教科書にある図とは異なるので注意]] [[File:ClimateTokyoJapan.png|thumb|right|220px|東京の雨温図。太平洋側の地域の例。]] [[Image:ClimateNiigataJapan.png|thumb|right|220px|新潟市の雨温図。日本海側の地域の例。]] 日本の気候は、ほとんどの地域は <span style="font-size: large;">温帯</span> に属し、温帯のうちの温暖湿潤気候に属する。だが北海道や東北地方は <span style="font-size: large;">亜寒帯(冷帯)</span> に属する。 また、南西諸島の気候は、<span style="font-size: large;">{{ruby|亜熱帯|あねったい}}</span>という、熱帯と温帯のあいだのような気候である。 日本は季節風(モンスーン)の影響で、四季がはっきりしている。また、日本には<span style="font-size: large;">梅雨</span>(「つゆ」または「ばいう」)があり、日本の冬には雪もあるため、日本は年間の降水量が多い。 なお、北海道では梅雨が無い。 日本は南北に長いため、南の沖縄県と、北の北海道とでは、気候が大きくことなる。 気候に影響するのは、緯度だけでは無く、山脈や山地によって、<span style="font-size: large;">太平洋側と日本海側では、気候が大きく異なる。</span> ==== 春から夏にかけて ==== 6月はじめごろから梅雨があり、日本の多くの地域で降水量が多くなる期間が、1ヶ月ほど続く。 梅雨の原因は、北方にある冬の季節風と、南方にある夏の季節風とが、ぶつかりあって、ほとんど動かない梅雨前線が発生するからである。 この梅雨前線では、夏と冬の季節風がぶつかっているので、天気が不安定となり、雨が降りやすい。 夏の季節風も、冬の季節風も、どちらとも、太平洋や日本海を通ってくるので、水分を含んでいる。 しかも、梅雨の間の6月は前線が停滞しているので、前線が北に抜けるまでの1ヶ月ほど、雨の日が多い。 季節が夏に近づくにつれ、夏の季節風のほうが強くなり、冬の季節風を北に押し返すので、前線は北に抜ける。 梅雨前線が北に抜けると、梅雨が終わる。 そして日本は、7月ごろに夏を迎え、気温の暑い日々が9月くらいまでつづく。 夏の季節風は、太平洋の水蒸気を含んでいるので、日本列島の太平洋側の地域では、湿っている。 いっぽう日本海側では、山地をこえるときに季節風が水分を失うので、日本海側では乾燥している。 ==== 夏から秋・冬にかけて ==== * 秋 夏から秋にかけての9月ごろは、<span style="font-size: large;">{{ruby|台風|たいふう}}</span>という、強風や大雨を起こす低気圧が南方から日本列島に北上してやってくる。台風で{{ruby|被害|ひがい}}を受ける場合も多い。 台風は、もともと赤道近くの熱帯の海で発生した低気圧( {{ruby|熱帯性低気圧|ねったいせい ていきあつ}} )である。 春から夏にかけての梅雨前線と同様に、秋から冬にかけても、{{ruby|秋雨前線|あきさめ ぜんせん}}が、やってくる。 * 冬 冬は、シベリア気団の発達により、北西の季節風が強くなる。季節風が日本海の水分をふくんでいるので、日本海側では雪が多く降る。いっぽう太平洋側では、山地をこえるときに季節風が水分を失うので、太平洋側では乾燥している。太平洋側では、日本海側とくらべると、雪もあまり降らない。 冬の太平洋側の地域で、北方の山地から北風が南へ向かって、ふいてくる。この北方の山から吹き降ろしてくる風のことを「<span style="font-size: large;">からっ{{ruby|風|かぜ}}</span>」といい、冷たくて乾燥している。 ==== 太平洋側と日本海側の気候の違い ==== 前の節では、季節ごとによる気候の特徴を説明した。 逆に、太平洋側の地域、および日本海側の地域を基準に、気候を見てみよう。 * 太平洋側の地域では、夏は{{ruby|湿気|しっけ}}が多く、雨も多い。太平洋側の冬は、乾燥している。北方の山から「からっ風」が吹き降ろす。 * 日本海側の地域では、夏は乾燥している。冬は季節風に水分が多く、雨及び雪が多い。全体的に見ると曇りの日が多い。 ==== その他の気候 ==== 他にも、地域の特性によって、多くの気候がある。一例として、瀬戸内気候を説明する。 * {{ruby|瀬戸内|せとうち}}気候 瀬戸内海ぞいの瀬戸内では、南北ともに、四国山地または中国山地にさえぎられているので、瀬戸内では雨も雪も少ない。 このように、南北を山にさえぎられている地域では、雨や雪が少ない。 === 日本各地の気候の傾向 === 日本の気候区分はいろいろな説があるが、普通の教科書では以下のように分けられる。 * 北海道の気候 * 日本海の気候 * 太平洋の気候 * 南西諸島の気候 * 内陸性の気候 * 瀬戸内の気候 気候によって、農業など、産業や生活の特徴も変わってくる。それらの説明は、後の節や別の記事で説明を行う。 === 太平洋側の気候 === 「太平洋岸気候」や「太平洋型気候」などとも言う。夏は太平洋からの暖かく湿った季節風の影響で高温多湿となるが、冬は大陸からの冷たく乾いた風の影響を受けて乾燥する。西日本では暖流の日本海流(黒潮)の影響を強く受けるため、高温多湿となるが、東日本、特に東北地方は寒流の千島海流(親潮)の影響も受けるため、気温が上がらないときもある。特に千島海流の影響が強いときには夏でも '''やませ''' とよばれる冷たい風が吹き、冷害が起こることもある。 夏から秋にかけて雨が多く、東北地方を除いて、冬でも寒いとはいえ霜が降ったり雪が降ったりすることは少ない。そのため、米以外の野菜や花の生産も盛んである。また、静岡県や鹿児島県では茶の生産も盛んである。 === 日本海側の気候 === [[Image:ClimateNiigataJapan.png|thumb|left|220px|新潟市の雨温図]] 「日本海岸気候」などとも言う。その名の通り日本海側に見られる気候である。日本海側には暖流である対馬海流が流れており、暖かく湿った空気を運んでくる。しかし、冬になるとユーラシア大陸からの冷たく乾燥した風が対馬海流の湿った風を冷やして雪にする。このため、気温のわりに雪がとても多く、世界有数の豪雪地帯となっている。 冬に雪が多いため、雪への対策が行われている。例えば、雪が積もり過ぎないように屋根の角度を急にしたり、信号機を縦にしたりしている(特に東北と北海道が多い)。また、'''消雪パイプ'''を使って道路の雪をとかすことも行われている。 この気候では雪が多いため、冬は農業ができない。しかし、春になると雪は豊富な雪解け水をもたらす。これを利用して春から秋にかけて米作りに集中する'''水田単作地帯'''が多い。特に新潟県は米作りで有名である。また、冬の間には農業ができないかわりに、さまざまなものづくりが行われてきた。新潟県の小千谷ちぢみ、石川県の輪島塗や加賀友禅などの伝統工業はもともと冬の間の仕事として発展してきたものである。現在でも燕市(新潟)の金属製洋食器、三条市(新潟)の金物、鯖江市(福井)の眼鏡などが有名である。また、豊富な雪解け水を生かした水力発電も積極的に行われてきたため、'''日本の電源地帯'''と呼ばれてきた。 === 北海道の気候 === 古い教科書では北海道式気候といったが、現在ではあまり使われない。 温帯ではなく亜寒帯に属する。このため、夏は比較的すごしやすいが、秋の終わりから春の初めまでの気温は氷点下まで下がる。また、梅雨がなく、台風もあまり来ないため、夏は他の地方よりも乾燥する。ただ、北海道は太平洋側・日本海側・内陸・オホーツク海側とで気温や降水量に差があるため、札幌市や函館市と稚内市などでは違いがあるので注意したい。 明治時代まで朝廷や幕府の力があまり及ばなかったため、長い間、先住民族である'''アイヌ'''の人々の伝統的な狩猟や漁業が中心で農業は盛んではなかった。明治以降に北海道として日本に正式に組み込まれると、開拓が進み、農業も活発に行われるようになった。当初は寒さに強い作物と酪農が中心であった。現在でもジャガイモ、ビート(てんさい・さとうだいこん)、小豆、小麦、乳製品の生産量は全国一である。しかし、品種改良によって寒さに強い米が開発され、北海道でも石狩平野を中心に米作りが盛んになり、現在では都道府県別の米の生産量も全国一となった。 === 内陸の気候 === {| class="wikitable" !!! 標高 !! 最多月 !! 最少月 !! 年間降水量 !! 8月の降水量 !! 12月の降水量 |- !長野 |418.2 m |11.2(7月) |6.8(11月) |901.2 mm |95.0 mm |38.2 mm |- !松本 |610 m |11.6(7月) |3.7(12月) |1,018.5 mm |95.8 mm |23.3 mm |- !諏訪 |760.1 m |13.5(7月) |4.7(1月) |1,307.0 mm |129.6 mm |33.8 mm |} '''中央高地式気候'''ともいう。古い教科書では内陸式気候、あるいは、大陸性気候という言葉も使われたが、今はあまり使われない。 中央高地(長野県・山梨県・岐阜県北部など)に見られる気候であるが、似たような気候は山形盆地や京都盆地にも見られる。夏は太平洋側で雨が降り、冬は日本海側で雪が降るため、一年を通して降水量は少ない。また、海から離れているため、夏と冬との気温差が大きく、夏は暑く、冬の気温は氷点下になることも珍しくない。特に夏の暖かく乾いた空気がフェーン現象を起こすこともあり、夏の気温をさらに高めることがある。ただし、標高の高い地域では夏でも気温があまり上がらないところもある。 水源は多いが、平地が少ないため、米作りはあまり盛んではない。そのかわり、日当たりのよい山あいと乾燥した気候を利用した果物の栽培が盛んである。長野県のりんごの生産量は全国2位であり、山梨県のぶどう・もも の生産量は全国一である。また、長野県の{{ruby|野辺山原|のべやまはら}}や群馬県の{{ruby|嬬恋村|つまごいむら}}では夏でも涼しい気候を利用した{{ruby|抑制栽培|よくせい さいばい}}による、キャベツ・レタスの栽培も盛んである。かつては{{ruby|生糸|きいと}}をつくるための{{ruby|養蚕|ようさん}}も盛んだったが、日本の産業が軽工業から重工業にうつったため、現在では衰退している。 === 瀬戸内の気候 === [[Image:ClimateOsakaJapan.png|thumb|left|220px|大阪市の雨温図]] '''瀬戸内式気候'''ともいう。瀬戸内海沿岸地域に見られる気候である。夏の季節風は四国山地に、冬の季節風は中国山地にさえぎられるために一年を通して降水量は少ない。このため、梅雨が短かったり、台風があまり来なかったりするときには'''{{ruby|干|かん}}ばつ'''が起こりやすい。その対策として人工的に大きな池を作って水を確保する施設である'''ため{{ruby|池|いけ}}'''が各地に作られた。気温は海に面していることもあって温暖である。 雨も雪も少ないため、畑作が中心で、特に小麦が多く作られた。香川県のさぬきうどんは、この小麦を利用して作られてきた。また、雨が少ないということは晴れの日も多いということでもあり、それを利用した果物の栽培も盛んである。岡山県はオリーブやキウイフルーツの生産量が日本一である。愛媛県は長くみかんの生産量が全国一であった(現在は2位)。他にも晴れの日の多さを利用した塩の生産が以前は盛んで、広大な塩を作るための土地(塩田)が、広がっていた。しかし、塩作りの方法が変わったことなどによって、塩田を利用する必要がなくなり、現在は広大な塩田の跡地を工業用地として活用している。 {{clear}} === 南西諸島の気候 === [[ファイル:ClimateNahaJapan.png|thumb|left|220px|{{ruby|那覇|なは}}市の雨温図]] '''南西諸島気候'''または'''{{ruby|亜熱帯|あねったい}}'''ともいう。鹿児島県の{{ruby|奄美大島|あまみ おおしま}}から沖縄県にかけての気候である。冬の平均気温でも15度程度と本州に比べて温暖であるが、海に面しているため、夏は極端に暑くなることもない(八重山諸島は除く)。日本海流からの暖かく湿った風の影響で、年間降水量も多い。昼と夜の気温差と年間気温差が小さい。 しかし、大きな川がないため、降水量のわりに水不足になりやすく、また台風の直撃を受けることも多いため、農業は畑作が中心であった。米作りは畑作ほど、さかんでない。特にパイナップルやさとうきびの栽培が盛んである。近年はマンゴーやパパイヤといったトロピカルフルーツと呼ばれるものだけでなく、暖かい気温を生かして季節をずらした花や野菜の栽培も盛んとなっているが、航空機の輸送コストの影響を受けやすいという問題も抱えている。 このような様々な気候の特色を知ればこれからはもっと自然との付き合いが楽しめるようになるだろう。 日本は四季がはっきりしており、梅雨の影響によって太平洋側と日本海側で降水量が大きく違う。 6月から7月にかけて雨が降り続く梅雨や、夏から秋にやってきて強い風と雨をもたらす台風は、重要な農業用水や飲料水の確保には欠かせない。しかし、台風の強い風と多くの雨で、くらしや農業に大きな影響が出ることがある。 {{-}} == ※ 他教科関連 == * [[中学校理科 第2分野/天気とその変化]] :※ なお、理科の天気関係は中学2年の範囲。 :中1での地理の授業の時点では、まだ理科で天気を習ってないので、読者は中3での受験勉強の復習の際などに他教科関連リンクを活用すればよいかと思われます。 [[Category:中学校教育|きこう]] [[Category:地理学|きこう]] 32i2ynq1jq3lp7ruvns7lbrcrzyxguz C言語/演算子と式 0 17924 205594 201652 2022-07-21T00:59:50Z Ef3 694 語尾の統一 wikitext text/x-wiki {{Nav}} == 演算子と式の基本 == {{Wikipedia|結合法則#プログラミング言語|結合法則}} 演算子とは演算の内容を指示する記号です。 式とは定数、変数、関数の返却値などを演算子を使って結合したものです。 演算子には優先順位があります。 次の表の優先順位は、その演算子の優先順位を表しています。 演算子は優先順位が高いものから評価されます。 例えば「1+2*3」の場合は、「4.加減演算子」より「3.乗除演算子」の方が優先順位が高いので、「3.乗除演算子」が先に評価され、値は「7」となります。 演算子には結合規則(結合性)があります。 次の表の結合規則は、「→(左から右、左結合)」と「←(右から左、右結合)」とで結合の方向を表しています。 演算子の優先順位が同じ優先順位の場合は、結合規則の方向に演算が行われます。 例えば「a=b=1」の場合は、「14.代入演算子」は「←(右から左、右結合)」なので「b=1」が先に行われ、aとbの値はともに「1」となります。 数学と同様に()で囲むことにより優先させることができます。 オペランドとは、演算子が操作を行う対象のことであり、 定数、変数、関数の返却値、及びオペランドと演算子の組み合わせなどがオペランドとなりえます。 オペランドのデーター型は、より大きなオペランドのデーター型に変換されます(暗黙の型変換)<ref>『ISO/IEC 9899:2011』p.39「6.3.1.8 Usual arithmetic conversions」</ref><ref>『JISX3010:2003』p.33「6.3.1.8 通常の算術型変換」</ref>。 {|class="wikitable" |+ 演算子の優先順位と結合規則 |- style="position:sticky;top:0" ! 優先順位 !! 演算子の種類 !! 演算子 !! 演算子の名称 !! 意味 !! 結合規則 |- | rowspan="7" | 1.後置式 || [[C言語/配列|配列の添字付け]] || [] || 添字演算子[] || |配列オブジェクトの要素の添字による指定。 || rowspan="7"|→ |- |[[C言語/関数|関数呼び出し]] || () || 関数呼び出し || 関数呼び出し。 |- |rowspan="2" | [[C言語/構造体|構造体]]及び[[C言語/共用体|共用体]]のメンバー || . || .演算子 || 構造体又は共用体オブジェクトの一つのメンバー。 |- | -> || ->演算子 || 構造体又は共用体オブジェクトの一つのメンバー。 |- |rowspan="2" | [[#増分及び減分演算子|後置増分及び後置減分演算子]] || ++ || 後置++演算子 || 左オペランドが指す変数の値を返した後、その変数の値に1を加えます。 |- | -- || 後置--演算子 || 左オペランドが指す変数の値を返した後、その変数の値から1を引く。 |- | [[#複合リテラル|複合リテラル]] || (型名){初期化子並び} || 複合リテラル || 初期化子並びで与えられる値を持つ名前のないオブジェクト |- | rowspan="11" | 2.単項演算子<br>キャスト演算子 || rowspan="2" | [[#増分及び減分演算子|前置増分及び前置減分演算子]] || ++ || 前置++演算子 || 右オペランドが指す変数の値に1を加え、その変数の値を返す。 || rowspan="10"|← |- | -- || 前置--演算子 || 右オペランドが指す変数の値から1を引き、その変数の値を返す。 |- | rowspan="2" | [[C言語/ポインタ|アドレスおよび間接演算子]] || & || 単項&演算子 || 右オペランドのアドレスを返す。 |- || * || 単項*演算子 || 右オペランドの間接参照を表す。 |- |rowspan="2" | [[#算術演算子と代入演算子|単項算術演算子]] || + || 単項+演算子 || 右オペランドの値 |- | - || 単項-演算子 || 右オペランドの符号を反転した値 |- | [[#ビット単位の演算子|単項算術演算子]] || ~ || ~演算子 || 右オペランドのビット単位の補数 |- | [[#論理演算子|単項算術演算子]] || ! || 論理否定演算子! || 右オペランドの否定<br>(右オペランドの値を0と比較し、等しい場合は1、等しくない場合は0) |- | [[#sizeof演算子|sizeof演算子]] || sizeof(型名)<hr>sizeof(式) || sizeof演算子 || オペランドの大きさ(バイト数) |- | [[#Alignof演算子|_Alignof演算子]] || _Alignof(型名) || _Alignof演算子 || オペランドのアライメント要件(バイト数) |- | [[#キャスト演算子|キャスト演算子]] || (データー型)式 || キャスト演算子 || 式の値を指定された型に型変換した値を返す。 |- | rowspan="3" | 3.乗除演算子 || rowspan="3" | [[#算術演算子と代入演算子|乗除演算子]] || * || 2項*演算子 || 左右オペランドの積 || rowspan="18" | → |- | / || 2項/演算子 || 左オペランドを右オペランドで除した商<br>右オペランドの値が0の場合、その動作は未定義です。<br>左右オペランドが整数型の場合、商の小数部は切り捨てられます。 |- | % || 2項%演算子 || 左オペランドを右オペランドで除した剰余<br>右オペランドの値が0の場合、その動作は未定義です。<br>左右オペランドは整数型でなければなりません。 |- | rowspan="2" | 4.加減演算子 || rowspan="2" | [[#算術演算子と代入演算子|加減演算子]] || + || 2項+演算子 || 左右オペランドの和 |- | - ||2項-演算子||左オペランドから右オペランドを引いた差 |- | rowspan="2" | 5.ビット単位のシフト演算子 || rowspan="2" | [[#ビット単位の演算子|ビット単位のシフト演算子]] || << || <<演算子 || 左オペランドを右オペランドビット分左にシフトした値。<br>空いたビットには0を詰めます。 |- | >> || >>演算子 || 左オペランドを右オペランドビット分右にシフトした値。 |- | rowspan="4" | 6.関係演算子 || rowspan="4" | [[#比較演算子|関係演算子]] || < || <演算子 || 左オペランドが右オペランドより小さい場合は1、それ以外の場合は0 |- || > || >演算子 || 左オペランドが右オペランドより大きい場合は1、それ以外の場合は0 |- || <= || <=演算子 || 左オペランドが右オペランド以下の場合は1、それ以外の場合は0 |- || >= || >=演算子 || 左オペランドが右オペランド以上の場合は1、それ以外の場合は0 |- | rowspan="2" | 7.等価演算子 || rowspan="2" | [[#比較演算子|等価演算子]] || == || ==演算子 || 左右オペランド同士を比較し、等しい場合は1、それ以外の場合は0 |- || != || !=演算子 || 左右オペランド同士を比較し、等しくない場合は1、それ以外の場合は0 |- | 8.ビット単位のAND演算子 || [[#ビット単位の演算子|ビット単位のAND演算子]] || & || 2項&演算子 || 両オペランドのビット単位の論理積 |- | 9.ビット単位の排他OR演算子 || [[#ビット単位の演算子|ビット単位の排他OR演算子]] || ^ || ^演算子 || 両オペランドのビット単位の排他的論理和 |- |10.ビット単位のOR演算子 || [[#ビット単位の演算子|ビット単位のOR演算子]] || &#124; || |演算子 || 両オペランドのビット単位の論理和 |- | 11.論理AND演算子 || [[#論理演算子|論理AND演算子]] || && || &&演算子 || 左右オペランドの論理積<br>(左右オペランドの値を0と比較し、ともに等しくない場合は1、それ以外の場合は0) |- | 12.論理OR演算子 || [[#論理演算子|論理OR演算子]] || &#124;&#124; || &#124;&#124;演算子 || 左右オペランドの論理和<br>(左右オペランドの値を0と比較し、いずれか一方でも等しくない場合は1、それ以外の場合は0) |- | 13.条件演算子 || [[#条件演算子|条件演算子]] || 式1 ? 式2 : 式3 || |条件演算子 || 式1が0と比較して等しい場合式2を評価し、等しくない場合式3を評価します。|| rowspan="12"|← |- | rowspan="11" | 14.代入演算子 || [[#算術演算子と代入演算子|単純代入]] || = || 単純代入演算子 || 左オペランドが指す変数に右オペランドの値を格納する<br>代入後の左オペランドの値 |- | rowspan="10" | [[#複合代入|複合代入]] || *= || *=演算子 || rowspan="10" | 形式E1 op= E2の複合代入は、 左辺値E1がただ一回だけ評価される点を除いて、 単純代入式E1 = E1 op (E2)と同じとします。 |- | /= || /=演算子 |- | %= || %=演算子 |- | + =|| +=演算子 |- | -= || -=演算子 |- | <<= || <<=演算子 |- | >>= || >>=演算子 |- | &== || &=演算子 |- | ^= || ^=演算子 |- | &#124;= || &#124;=演算子 |- | 15.コンマ演算子 || [[#コンマ演算子|コンマ演算子]] || , || |コンマ演算子 || 左オペランドをボイド式として評価し、次に右オペランドを評価しそれを結果として返す。|| → |- |} == 算術演算子と代入演算子 == 算術演算子とは加減乗除などの算術的な計算を行う演算子です。 算術演算子には、加法を指示する<code>+</code>、減法を指示する<code>-</code><ref name="jtc1-sc22-wg14-n2596-6.5.6">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 66, §6.5.6 ''Additive operators'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>、 乗法を指示する<code>*</code>、除法を指示する<code>/</code>および剰余を指示する</code>%</code>があり<ref name="jtc1-sc22-wg14-n2596-6.5.5">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 66, §6.5.5 ''Multiplicative operators'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>、 また、<code>-</code>は符号の反転を指示するためにも用いられる<ref name="jtc1-sc22-wg14-n2596-6.5.3.3">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 64, §6.5.3.3 ''Unary arithmetic operators'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>。 代入演算子とは代入を指示する演算子です。 代入演算子には右辺の値を左辺が指す変数へそのまま代入するように指示する=があります<ref name="jtc1-sc22-wg14-n2596-6.5.16.1">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 73, §6.5.16.1 ''Simple assignment'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>。 {| class="wikitable" |+ 算術演算子と代入演算子 ! 演算子の種類 !! 演算子 !! 演算子の名称 !! 意味 !! 結合規則 |- | rowspan="2" | 単項演算子 || + || 単項+演算子 || 右オペランドの値 || ← |- | - || 単項-演算子 || 右オペランドの符号を反転した値 || ← |- | rowspan="3" | 乗除演算子 || * || 2項*演算子 || 左右オペランドの積 || → |- | / || 2項/演算子 || 左オペランドを右オペランドで除した商<br>右オペランドの値が0の場合、その動作は未定義です。<br>左右オペランドが整数型の場合、商の小数部は切り捨てられます。|| → |- | % || 2項%演算子 || 左オペランドを右オペランドで除した剰余<br>右オペランドの値が0の場合、その動作は未定義です。<br>左右オペランドは整数型でなければなりません。 || → |- | rowspan="2" | 加減演算子 || + || 2項+演算子 || 左右オペランドの和 || → |- | - || 2項-演算子 || 左オペランドから右オペランドを引いた差 || → |- | 代入演算子 || = || 単純代入演算子 || 左オペランドが指す変数に右オペランドの値を格納する<br>代入後の左オペランドの値||← |} <syntaxhighlight lang="C"> //例 変数に算術演算子を用いた式の値を、代入演算子を用いて代入します。 int main(void) { int i = -1; // iを-1で初期化します。 i = 1 * 1; // iに1×1である1を代入します。 i = 1 / 1; // iに1÷1である1を代入します。 i = 1 % 1; // iに1÷1の余りである0を代入します。 i = 1 + 1; // iに1+1である2を代入します。 i = 1 - 1; // iに1-1である0を代入します。 } </syntaxhighlight> * C言語に冪乗演算子はありません。<code>^</code>は、[[#ビット単位の演算子|ビット単位の排他的論理和演算子]]です。{{See also|C言語/標準ライブラリ/math.h#pow関数群}} * 平方根{{See also|C言語/標準ライブラリ/math.h#sqrt関数群}} * 浮動小数点数の剰余{{See also|C言語/標準ライブラリ/math.h#fmod関数群|C言語/標準ライブラリ/math.h#remainder関数群|C言語/標準ライブラリ/math.h#remquo関数群関数群}} == 比較演算子 == 比較演算子とは、左辺と右辺の比較を指示する演算子です。 比較演算子は左辺が右辺と比較して、 「<(より小さい)」、「>(より大きい)」「<=(以下)」「>=(以上)」 「==(等しい)」「!=(等しくない)」の場合は真(1)を、 それ以外の場合は偽(0)を、値として返す。 <ref>『JISX3010:2003』p.62「6.5.8 関係演算子」</ref> <ref>『JISX3010:2003』p.63「6.5.8 等価演算子」</ref> C99で、true や false など論理値定数とのbool(論理型)が追加されました。 {| class="wikitable" |+ 比較演算子 ! 演算子の種類 !! 演算子 !! 演算子の名称 !! 意味 !! 結合規則 |- | rowspan="4" | 関係演算子 || < || <演算子 || 左オペランドが右オペランドより小さい場合は1、それ以外の場合は0 || → |- || > || >演算子 || 左オペランドが右オペランドより大きい場合は1、それ以外の場合は0 || → |- || <= || <=演算子 || 左オペランドが右オペランド以下の場合は1、それ以外の場合は0 || → |- || >= || >=演算子 || 左オペランドが右オペランド以上の場合は1、それ以外の場合は0 || → |- | rowspan="2" | 等価演算子 || == || ==演算子 || 左右オペランド同士を比較し、等しい場合は1、それ以外の場合は0 || → |- || != || !=演算子 || 左右オペランド同士を比較し、等しくない場合は1、それ以外の場合は0 || → |- |} <syntaxhighlight lang="C"> //例 変数に比較演算子を用いた式の値を、代入演算子を用いて代入します。 #include <stdbool.h> int main(void) { bool r; // 変数 r を論理型として宣言 r = 10 < 20; // true r = 10 > 20; // false r = 10 <= 20; // true r = 10 >= 20; // false r = 10 == 20; // false r = 10 != 20; // true } </syntaxhighlight> == 論理演算子 == 論理演算子とは、論理値の計算を指示する演算子です。 論理演算子には否定を指示する!、<ref>『JISX3010:2003』p.58「6.5.3.3 単項算術演算子」</ref> 論理積を指示する&&、<ref>『JISX3010:2003』p.65「6.5.8 論理AND演算子」</ref> 論理和を指示する&#124;&#124;があります。<ref>『JISX3010:2003』p.65「6.5.8 論理OR演算子」</ref> {|class="wikitable" |+ 論理演算子 !演算子の種類!!演算子!!演算子の名称!!意味!!結合規則 |- |単項演算子||!||論理否定演算子!||右オペランドの否定<br>(右オペランドの値を0と比較し、等しい場合は1、等しくない場合は0)||← |- |論理AND演算子||&&||&&演算子||左右オペランドの論理積<br>(左右オペランドの値を0と比較し、ともに等しくない場合は1、それ以外の場合は0)||→ |- |論理OR演算子||&#124;&#124;||&#124;&#124;演算子||左右オペランドの論理和<br>(左右オペランドの値を0と比較し、いずれか一方でも等しくない場合は1、それ以外の場合は0)||→ |- |} 否定とは論理値の真と偽を入れ替えることを表す。 論理積とは左右両方の論理値がともに真であるときのみ真(1)を、それ以外は偽(0)を値として返す。 論理和とは左右両方の論理値のうちいずれか一方でも真であるとき真(1)を、それ以外は偽(0)を値として返す。 {|class="wikitable" |+ 否定、論理積、論理和に対する真理値表 !p!!q!! !p<br>否定 !!p&&q<br>論理積!!p&#124;&#124;q<br>論理和 |- |0||0||1||0||0 |- |0||1||1||0||1 |- |1||0||0||0||1 |- |1||1||0||1||1 |- |} <syntaxhighlight lang=c> //例 変数に論理演算子を用いた式の値を、代入演算子を用いて代入します。 int main(void) { int r; r = !0; // rに1を代入します。 r = 0 && 1; // rに0を代入します。 r = 0 || 1; // rに1を代入します。 } </syntaxhighlight> === 短絡評価 === &&演算子と&#124;&#124;演算子とは、短絡評価を行う。 短絡評価とは、第1オペランドの値でその式の値が決まるとき、第2オペランドを評価しないことです。 &&演算子は第1オペランドの値が偽(0)の時、第2オペランドを評価しません。 &#124;&#124;演算子は第1オペランドの値が真(0以外)の時、第2オペランドを評価しません。 短絡評価は、第2オペランドに副作用を伴う式を指定したとき、特に注意が必要です。 つまり、第2オペランドに関数呼び出しの式を指定して、短絡評価が行われた時、 その関数呼び出しは実行されません。 === 排他的論理和 === C言語には、排他的論理和の論理演算子は定義されていません。 しかし、排他的論理和は、否定・論理積・論理和を用いて次のように記述できます。 <syntaxhighlight lang=c> (!p != !q) (p && !q) || (!p && q) (p || q) && (!p || !q) (p || q) && !(p && q) </syntaxhighlight> 排他的論理和とは、2つの論理値のいずれかただ1つのみが真であるとき真(1)を、それ以外は偽(0)を値として返す。 {|class="wikitable" |+ 排他的論理和の真偽表 !p!!q!! p xor q<br>排他的論理和 |- |0||0||0 |- |0||1||1 |- |1||0||1 |- |1||1||0 |- |} == 増分及び減分演算子 == 増分及び減分演算子とは、変数の値に1を加えたり、1を引いたりすることを指示する演算子です。 増分及び減分演算子には、それぞれ後置演算子と前置演算子とがあります。 後置演算子は変数の値を返した後に、増減を行う。<ref>『JISX3010:2003』p.54「6.5.2.4 後置増分及び後置減分演算子」</ref> 前置演算子は変数の値を返す前に、増減を行う。<ref>『JISX3010:2003』p.57「6.5.3.1 前置増分及び前置減分演算子」</ref> {|class="wikitable" |+ 後置増分、後置減分演算子、前置増分および前置減分演算子 !演算子の種類!!演算子!!演算子の名称!!意味!!結合規則 |- |rowspan="2"|後置演算子||++||後置++演算子||左オペランドが指す変数の値を返した後、その変数の値に1を加えます。||→ |- | -- ||後置--演算子||左オペランドが指す変数の値を返した後、その変数の値から1を引く。||→ |- |rowspan="2"|単項演算子||++||前置++演算子||右オペランドが指す変数の値に1を加え、その変数の値を返す。||← |- | -- ||前置--演算子|| 右オペランドが指す変数の値から1を引き、その変数の値を返す。||← |- |} 増分及び減分演算子を単独で用いた場合、後置と前置との結果に違いはありません。 <syntaxhighlight lang=c> //例 後置++演算子を単独で用います。 int main(void) { i = 0; i++; // iには1が格納されます。 } </syntaxhighlight> <syntaxhighlight lang=c> //例 前置++演算子を単独で用います。 int main(void) { i = 0; ++i; // iには1が格納されます。 } </syntaxhighlight> ただし、増分及び減分演算子を代入演算子とともに用いた場合、後置と前置との結果に違いがあります。 <syntaxhighlight lang=c> //例 後置++演算子を代入演算子とともに用います。 int main(void) { int i = 0; int j; j = i++; // iには1が格納され、jには0が格納されます。 } </syntaxhighlight> <syntaxhighlight lang=c> //例 前置++演算子を代入演算子とともに用います。 int main(void) { int i = 0; int j; j = ++i; // iには1が格納され、jには1が格納されます。 } </syntaxhighlight> == その他の演算子 == === 複合リテラル === ISO/IEC 9899:2017§6.5.2.5 ''Compound literals'' 括弧で囲まれた型名の後に、ブレースで囲まれた初期化子並び( ''initializer lists'' )を続けた後置式( ''postfix expression'')<ref name="jtc1-sc22-wg14-n2596-6.5.2">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 57, §6.5.2 ''Postfix operators'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>は、複合リテラル(ふくごう- 、''Compound literals'')です<ref name="jtc1-sc22-wg14-n2596-6.5.2.5">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 61, §6.5.2.5 ''Compound literals'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>。 : ( ''[[#type-name|type-name]]'' ) { ''[[#initializer-list|initializer-list]]'' } : ( ''[[#type-name|type-name]]'' ) { ''[[#initializer-list|initializer-list]]'' , } 複合リテラルは、初期化子並びで与えられる値を持つ名前のないオブジェクトを与えます<ref name="jtc1-sc22-wg14-n2596-6.5.2.5" />。 型名が未知のサイズの配列を指定している場合、そのサイズは初期化子並びによって決定され、複合リテラルの型は完成した配列の型になります。それ以外の場合(型名がオブジェクト型を指定している場合)は,型名で指定された型が複合リテラルの型となります。いずれの場合も結果は左辺値です<ref name="jtc1-sc22-wg14-n2596-6.5.2.5" />。 複合リテラルの値は、初期化子並びで初期化された無名のオブジェクトの値です。複合リテラルが関数本体の外にある場合、そのオブジェクトは静的な保存期間を持ちますが、そうでない場合は、囲んでいるブロックに関連付けられた自動保存期間を持ちます<ref name="jtc1-sc22-wg14-n2596-6.5.2.5" />。 初期化子並びに関するすべての意味的規則は、複合リテラルにも適用されます<ref name="jtc1-sc22-wg14-n2596-6.5.2.5" />。 文字列リテラル、およびconst修飾された型を持つ複合リテラルは、異なるオブジェクトを指定する必要はありません<ref name="jtc1-sc22-wg14-n2596-6.5.2.5" />。 関数の引数に定数として構造体を渡したいとき、変数を宣言して値を代入し、それを渡す必要があります。 ; 構造体変数を関数に渡す : <syntaxhighlight lang=c highlight="11" line> #include <stdio.h> struct sPoint { int x, y; }; void DrawPoint(const struct sPoint *p) { printf("%d %d\n", p->x, p->y); } int main(void) { struct sPoint p = { 200, 100 }; DrawPoint(&p); } </syntaxhighlight> : 複合リテラルを使えば上の処理をより簡潔に下のように書くことができます。 ; 複合リテラルを引数として関数に渡す : <syntaxhighlight lang=c highlight="10,12" line> #include <stdio.h> struct sPoint { int x, y; }; void DrawPoint(const struct sPoint *p) { printf("%d %d\n", p->x, p->y); } int main(void) { DrawPoint(&(struct sPoint){.x = 200, .y = 100}); // あるいは DrawPoint(&(struct sPoint){200, 100}); } </syntaxhighlight> ; [https://paiza.io/projects/_siGLtD_i_cxUpu17XIcGQ?language=c 配列の複合リテラル] : <syntaxhighlight lang=c highlight="4" line> #include <stdio.h> int main(void) { for (int *ip = (int[]){ 2, 3, 5, 7, 11, -1}; *ip > 0; ip++) printf("%d\n", *ip); } </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> 2 3 5 7 11 </syntaxhighlight> ; 文字列の複合リテラル : <syntaxhighlight lang=c highlight="4" line> #include <stdio.h> int main(void) { puts((char []){'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '\n', 0}); } </syntaxhighlight> === sizeof演算子 === sizeof演算子とは、オペランドの大きさ(バイト数: 型は size_t)を返す演算子です。<ref>『JISX3010:2003』p.58「6.5.3.4 sizeof演算子」</ref> {|class="wikitable" |+ sizeof演算子 !演算子の種類!!演算子!!演算子の名称!!意味!!結合規則 |- |rowspan="1"|単項演算子||sizeof(型名)||sizeof演算子||オペランドの大きさ(バイト数)||← |- |rowspan="1"|単項演算子||sizeof 式||sizeof演算子||オペランドの大きさ(バイト数)||← |- |} sizeof演算子はオペランドの大きさをバイト数で返す。 <syntaxhighlight lang=c> //例 sizeof演算子の使用例 #include <stdio.h> int main(void) { char c; int i; float f; double d; long v[100]; printf("charのサイズは%zu。\n", sizeof(char)); printf("intのサイズは%zu。\n", sizeof(int)); printf("floatのサイズは%zu。\n", sizeof(float)); printf("doubleのサイズは%zu。\n", sizeof(double)); printf("変数cのサイズは%zu。\n", sizeof c); printf("変数iのサイズは%zu。\n", sizeof i); printf("変数fのサイズは%zu。\n", sizeof f); printf("変数dのサイズは%zu。\n", sizeof d); printf("配列vのサイズは%zu。\n", sizeof *v); printf("sizeof(sizeof 0)のサイズは%zu。\n", sizeof(sizeof(0))); } </syntaxhighlight> === _Alignof演算子 === _Alignof演算子とは、オペランドのアラインメント要件(バイト数: 型は size_t)を返す演算子です。<ref>『ISO/IEC 9899:2011』p.64「6.5.3.4 The sizeof and _Alignof operators」</ref> {|class="wikitable" !演算子の種類!!演算子!!演算子の名称!!意味!!結合規則 |- |rowspan="1"|単項演算子||_Alignof(型名)||_Alignof演算子||オペランドのアラインメント要件(バイト数)||← |- |} _Alignof演算子はオペランドのアラインメント要件をバイト数で返す。 _Alignof演算子のオペランドには(sizeof演算子と異なり)式を指定できません。 <stdalign.h>ヘッダファイルが標準に追加された。 <syntaxhighlight lang=c> //例 _Alignof演算子の使用例 #include <stdio.h> int main(void) { printf("charのアラインメント要件は%zu。\n", _Alignof(char)); printf("intのアラインメント要件は%zu。\n", _Alignof(int)); printf("floatのアラインメント要件は%zu。\n", _Alignof(float)); printf("doubleのアラインメント要件は%zu。\n", _Alignof(double)); return 0; } </syntaxhighlight> 実行例(環境: Intel Xeon Processor (Cascadelake) 上の FreeBSD 13.0-STABLE #0 stable/13-6e405dd9e x clang version 11.0.1/llvmorg-11.0.1-0-g43ff75f2c3fe) charのアラインメント要件は1。 intのアラインメント要件は4。 floatのアラインメント要件は4。 doubleのアラインメント要件は8。 === キャスト演算子 === キャスト演算子とは、式の値を指定された型に型変換した値を返す演算子です。<ref>『JISX3010:2003』p.59「6.5.4 キャスト演算子」</ref> {|class="wikitable" !演算子の種類!!演算子!!演算子の名称!!意味!!結合規則 |- |rowspan="1"|キャスト演算子||(データー型)式||キャスト演算子||式の値を指定された型に型変換した値を返す。||← |- |} 型キャストとは、式の値を指定されたデーター型に変換します(明示的な型変換)。 <syntaxhighlight lang=c> //例 型キャストの使用例 #include "stdio.h" int main(void) { double d = 3.14; printf("dを整数型に変換した値は%d。\n", (int)d); //浮動小数点型の変数dを整数型に変換したものを表示します。 } </syntaxhighlight> === ビット単位の演算子 === 各オペランドは整数型をもたなければなりません。 <<演算子の結果は、左オペランドを右オペランド分左にシフトした値です。 >>演算子の結果は、左オペランドを右オペランド分右にシフトした値です。<ref>『JISX3010:2003』p.62「6.5.7 ビット単位のシフト演算子」</ref> {|class="wikitable" |+ ビット単位のシフト演算子 !演算子の種類!!演算子!!演算子の名称!!意味!!結合規則 |- |rowspan="2"|ビット単位のシフト演算子||<<||<<演算子||左オペランドを右オペランドビット分左にシフトした値。<br>空いたビットには0を詰めます。||→ |- |>>||>>演算子||左オペランドを右オペランドビット分右にシフトした値。||→ |- |} ;ビット単位のシフト演算子の使用例:<syntaxhighlight lang=c> #include <stdio.h> int main(void) { unsigned char c = 0xaa; // 0b10101010 unsigned char d = c << 1; // 0b01010100 unsigned char e = c >> 1; // 0b01010101 printf("dの値は%#x。\n", d); printf("eの値は%#x。\n", e); } </syntaxhighlight> ~演算子は右オペランドの各ビットを0なら1へ1なら0へ反転します。 右オペランドは整数型をもたなければなりません。 <ref>『JISX3010:2003』p.58「6.5.3.3 単項算術演算子」</ref> 2項&演算子の結果は、オペランドのビット単位の論理積です。 つまり、対応するビットが両方ともセットされている場合ビットをセットし、それ以外の場合ビットをセットしません。 各オペランドの型は、整数型でなければなりません。 <ref>『JISX3010:2003』p.64「6.5.10 ビット単位のAND演算子」</ref> ^演算子の結果は、オペランドのビット単位の排他的論理和です。 つまり、対応するビットのいずれか一方だけがセットされている場合ビットをセットし、それ以外の場合ビットをセットしません。 各オペランドの型は、整数型でなければなりません。 <ref>『JISX3010:2003』p.64「6.5.11 ビット単位の排他OR演算子」</ref> |演算子の結果は、オペランドのビット単位の論理和です。 つまり、対応するビットの少なくとも一方がセットされている場合ビットをセットし、それ以外の場合ビットをセットしません。 各オペランドの型は、整数型でなければなりません。 <ref>『JISX3010:2003』p.65「6.5.10 ビット単位のOR演算子」</ref> {|class="wikitable" |+ ビット単位の論理演算子 !演算子の種類!!演算子!!演算子の名称!!意味!!結合規則 |- |単項演算子||~||~演算子||右オペランドのビット単位の補数||← |- |ビット単位のAND演算子||&||2項&演算子||両オペランドのビット単位の論理積||→ |- |ビット単位の排他OR演算子||^||^演算子||両オペランドのビット単位の排他的論理和||→ |- |ビット単位のOR演算子||&#124;|| |演算子||両オペランドのビット単位の論理和||→ |- |} ;~演算子の使用例:<syntaxhighlight lang=c> #include <stdio.h> int main(void) { unsigned char c = 0xaa; // 0b10101010 unsigned char d = ~c; // 0b01010101 printf("dの値は%#x。\n", d); } </syntaxhighlight> ;ビット単位のAND演算子の使用例:<syntaxhighlight lang=c> #include <stdio.h> int main(void) { unsigned char c = 0x3; // 0b00000011 unsigned char d = 0x5; // 0b00000101 unsigned char e = c & d; // 0b00000001 printf("eの値は%#x。\n", e); } </syntaxhighlight> ;ビット単位の排他OR演算子の使用例:<syntaxhighlight lang=c> #include <stdio.h> int main(void) { unsigned char c = 0x3; // 0b00000011 unsigned char d = 0x5; // 0b00000101 unsigned char e = c ^ d; // 0b00000110 printf("eの値は%#x。\n", e); } </syntaxhighlight> ;ビット単位のOR演算子の使用例:<syntaxhighlight lang=c> #include <stdio.h> int main(void) { unsigned char c = 0x3; // 0b00000011 unsigned char d = 0x5; // 0b00000101 unsigned char e = c | d; // 0b00000111 printf("eの値は%#x。\n", e); } </syntaxhighlight> === 条件演算子 === 条件演算子は、式1が0と比較して等しい場合式2を評価し、等しくない場合式3を評価します。 式2または式3の値を結果とします。<ref>『JISX3010:2003』p.65「6.5.15 条件演算子」</ref> {|class="wikitable" |+ 条件演算子 !演算子の種類!!演算子!!演算子の名称!!意味!!結合規則 |- |rowspan="1"|条件演算子||式1 ? 式2 : 式3|| |条件演算子||式1が0と比較して等しい場合式2を評価し、等しくない場合式3を評価します。||← |- |} 次のようなif文は、条件演算子を用いて、次のように書き換えることができます。 :<syntaxhighlight lang=c> // aとbの内、大きいほうをcに代入します。 if (a > b) c = a; else c = b; </syntaxhighlight> ↓ <syntaxhighlight lang=c> c = (a > b) ? a : b; </syntaxhighlight> === 複合代入 === 形式E1 op= E2の複合代入は、 左辺値E1がただ一回だけ評価される点を除いて、 単純代入式E1 = E1 op (E2)と同じとします。<ref>『JISX3010:2003』p.68「6.5.16.2 複合代入」</ref> {|class="wikitable" |+ 複合代入 !演算子の種類!!演算子!!演算子の名称!!意味!!結合規則 |- |rowspan="10"|代入演算子||*=||*=演算子||rowspan="10"|形式E1 op= E2の複合代入は、 左辺値E1がただ一回だけ評価される点を除いて、 単純代入式E1 = E1 op (E2)と同じとします。||rowspan="10"|← |- |/=||/=演算子 |- |%=||%=演算子 |- | + =|| +=演算子 |- | -= || -=演算子 |- |<<=||<<=演算子 |- |>>=||>>=演算子 |- |&==||&=演算子 |- |^=||^=演算子 |- |&#124;=||&#124;=演算子 |- |} 次のような代入文は、複合代入を用いて、次のように書き換えることができます。 <syntaxhighlight lang=c> a = a * b; a *= b; a = a / b; a /= b; a = a + b; a += b; a = a - b; a -= b; a = a << b; a <<= b; a = a >> b; a >>= b; a = a & b; a &= b; a = a ^ b; a ^= b; a = a | b; a |= b; </syntaxhighlight> === コンマ演算子 === コンマ演算子は、左オペランドをボイド式として評価し、次に右オペランドを評価しそれを結果として返す。<ref>『JISX3010:2003』p.68「6.5.17 コンマ演算子」</ref> {|class="wikitable" |+ コンマ演算子 !演算子の種類!!演算子!!演算子の名称!!意味!!結合規則 |- |rowspan="1"|コンマ演算子||,|| |コンマ演算子||左オペランドをボイド式として評価し、次に右オペランドを評価しそれを結果として返す。||→ |- |} ;コンマ演算子の使用例:<syntaxhighlight lang=c> #include <stdio.h> int main(void) { int i = 1, j = 2, k; k = (i, j); // kにはjの値が代入されます。 printf("kの値は%d。\n", k); } </syntaxhighlight> == 式に関する構文の抜粋 == N2176 C17 ballot ISO/IEC 9899:2017 § Annex A (informative) ''Language syntax summary'' から、§6.5 ''Expressions'':式に関連した部分を抜粋しました。 トークンはリンクになっています。 * N2176 C17 ballot ISO/IEC 9899:2017 §6.5 ''Expressions'':式<ref name="jtc1-sc22-wg14-n2596-6.5">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 55, §6.5 ''Expressions'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>. * N2176 C17 ballot ISO/IEC 9899:2017 §6.5.1 ''Primary expressions'':一次式<ref name="jtc1-sc22-wg14-n2596-6.5.1">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 56, §6.5.1 ''Primary expressions'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>. *; ''{{Anchor|primary-expression}}'' *: ''[[#identifier|identifier]]'' *: ''[[#constant|constant]]'' *: ''[[#string-literal|string-literal]]'' *: ( ''[[#expression|expression]]'' ) *: ''[[#generic-selection|generic-selection]]'' * N2176 C17 ballot ISO/IEC 9899:2017 §6.5.1.1 ''Generic selection''<sup>C11</sup>:総称選択<ref name="jtc1-sc22-wg14-n2596-6.5.1.1">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 56, §6.5.1.1 ''Generic selection'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>. *; ''{{Anchor|generic-selection}}'' *: '''_Generic''' ( ''[[#assignment-expression|assignment-expression]]'' , ''[[#generic-assoc-list|generic-assoc-list]]'' ) *; ''{{Anchor|generic-assoc-list}}'' *: ''[[#generic-association|generic-association]]'' *: ''[[#generic-assoc-list|generic-assoc-list]]'' , ''[[#generic-association|generic-association]]'' *; ''{{Anchor|generic-association}}'' *: ''[[#type-name|type-name]]'' : ''[[#assignment-expression|assignment-expression]]'' *: '''default''' : ''[[#assignment-expression|assignment-expression]]'' * N2176 C17 ballot ISO/IEC 9899:2017 §6.5.2 ''Postfix operators'':後置演算子<ref name="jtc1-sc22-wg14-n2596-6.5.2">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 57, §6.5.2 ''Postfix operators'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>. *; ''{{Anchor|postfix-expression}}'' *: ''[[#primary-expression|primary-expression]]'' *: ''[[#postfix-expression|postfix-expression]]'' [ ''[[#expression|expression]]'' ] *: ''[[#postfix-expression|postfix-expression]]'' ( [[#argument-expression-list|argument-expression-list]]<sub>opt</sub> ) *: ''[[#postfix-expression|postfix-expression]]'' . ''[[#identifier|identifier]]'' *: ''[[#postfix-expression|postfix-expression]]'' -> ''[[#identifier|identifier]]'' *: ''[[#postfix-expression|postfix-expression]]'' ++ *: ''[[#postfix-expression|postfix-expression]]'' -- *: ( ''[[#type-name|type-name]]'' ) { ''[[#initializer-list|initializer-list]]'' } *: ( ''[[#type-name|type-name]]'' ) { ''[[#initializer-list|initializer-list]]'' , } *; ''{{Anchor|argument-expression-list}}'' *: ''[[#assignment-expression|assignment-expression]]'' *: ''[[#argument-expression-list|argument-expression-list]]'' , ''[[#assignment-expression|assignment-expression]]'' * N2176 C17 ballot ISO/IEC 9899:2017 §6.5.2.1 ''Array subscripting'':配列の添字付け<ref name="jtc1-sc22-wg14-n2596-6.5.2.1">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 57, §6.5.2.1 ''Array subscripting'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>. * N2176 C17 ballot ISO/IEC 9899:2017 §6.5.2.2 ''Function calls'':関数呼出し<ref name="jtc1-sc22-wg14-n2596-6.5.2.2">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 58, §6.5.2.2 ''Function calls'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>. * N2176 C17 ballot ISO/IEC 9899:2017 §6.5.2.3 ''Structure and union members'':構造体及び共用体のメンバー<ref name="jtc1-sc22-wg14-n2596-6.5.2.3">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 59, §6.5.2.3 ''Structure and union members'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>. * N2176 C17 ballot ISO/IEC 9899:2017 §6.5.2.4 ''Postfix increment and decrement operators'':後置増分及び後置減分演算子<ref name="jtc1-sc22-wg14-n2596-6.5.2.4">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 60, §6.5.2.4 ''Postfix increment and decrement operators'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>. * N2176 C17 ballot ISO/IEC 9899:2017 §6.5.2.5 ''Compound literals'':複合リテラル<ref name="jtc1-sc22-wg14-n2596-6.5.2.5">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 61, §6.5.2.5 ''Compound literals'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>. * N2176 C17 ballot ISO/IEC 9899:2017 §6.5.3 ''Unary operators'':単項演算子<ref name="jtc1-sc22-wg14-n2596-6.5.3">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 63, §6.5.3 ''Unary operators'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>. *; ''{{Anchor|unary-expression}}'' *: ''[[#postfix-expression|postfix-expression]]'' *: ++ ''[[#unary-expression|unary-expression]]'' *: -- ''[[#unary-expression|unary-expression]]'' *: ''[[#unary-operator|unary-operator]]'' ''[[#cast-expression|cast-expression]]'' *: '''sizeof''' ''[[#unary-expression|unary-expression]]'' *: '''sizeof''' ( ''[[#type-name|type-name]]'' ) *: '''_Alignof''' ( ''[[#type-name|type-name]]'' ) *; ''{{Anchor|unary-operator}}'' *: '''&''' '''*''' '''+''' '''-''' '''~''' '''!''' * N2176 C17 ballot ISO/IEC 9899:2017 §6.5.3.1 ''Prefix increment and decrement operators'':前置増分及び前置減分演算子<ref name="jtc1-sc22-wg14-n2596-6.5.3.1">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 63, §6.5.3.1 ''Prefix increment and decrement operators'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>. * N2176 C17 ballot ISO/IEC 9899:2017 §6.5.3.2 ''Address and indirection operators'':アドレス及び間接演算子<ref name="jtc1-sc22-wg14-n2596-6.5.3.2">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 64, §6.5.3.2 ''Address and indirection operators'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>. * N2176 C17 ballot ISO/IEC 9899:2017 §6.5.3.3 ''Unary arithmetic operators'':単項算術演算子<ref name="jtc1-sc22-wg14-n2596-6.5.3.3">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 64, §6.5.3.3 ''Unary arithmetic operators'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>. * N2176 C17 ballot ISO/IEC 9899:2017 §6.5.3.4 ''The sizeof and _Alignof operators'':sizeof演算子<ref name="jtc1-sc22-wg14-n2596-6.5.3.4">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 64, §6.5.3.4 ''The sizeof and _Alignof operators'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>. * N2176 C17 ballot ISO/IEC 9899:2017 §6.5.4 ''Cast operators'':キャスト演算子<ref name="jtc1-sc22-wg14-n2596-6.5.4">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 65, §6.5.4 ''Cast operators'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>. *; ''{{Anchor|cast-expression}}'' *: ''[[#unary-expression|unary-expression]]'' *: ( ''[[#type-name|type-name]]'' ) ''[[#cast-expression|cast-expression]]'' * N2176 C17 ballot ISO/IEC 9899:2017 §6.5.5 ''Multiplicative operators'':乗除演算子<ref name="jtc1-sc22-wg14-n2596-6.5.5">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 66, §6.5.5 ''Multiplicative operators'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>. *; ''{{Anchor|multiplicative-expression}}'' *: ''[[#cast-expression|cast-expression]]'' *: ''[[#multiplicative-expression|multiplicative-expression]]'' * ''[[#cast-expression|cast-expression]]'' *: ''[[#multiplicative-expression|multiplicative-expression]]'' / ''[[#cast-expression|cast-expression]]'' *: ''[[#multiplicative-expression|multiplicative-expression]]'' % ''[[#cast-expression|cast-expression]]'' * N2176 C17 ballot ISO/IEC 9899:2017 §6.5.6 ''Additive operators'':加減演算子<ref name="jtc1-sc22-wg14-n2596-6.5.6">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 66, §6.5.6 ''Additive operators'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>. *; ''{{Anchor|additive-expression}}'' *: ''[[#multiplicative-expression|multiplicative-expression]]'' *: ''[[#additive-expression|additive-expression]]'' + ''[[#multiplicative-expression|multiplicative-expression]]'' *: ''[[#additive-expression|additive-expression]]'' - ''[[#multiplicative-expression|multiplicative-expression]]'' * N2176 C17 ballot ISO/IEC 9899:2017 §6.5.7 ''Bitwise shift operators'':ビット単位のシフト演算子<ref name="jtc1-sc22-wg14-n2596-6.5.7">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 68, §6.5.7 ''Bitwise shift operators'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>. *; ''{{Anchor|shift-expression}}'' *: ''[[#additive-expression|additive-expression]]'' *: ''[[#shift-expression|shift-expression]]'' << ''[[#additive-expression|additive-expression]]'' *: ''[[#shift-expression|shift-expression]]'' >> ''[[#additive-expression|additive-expression]]'' * N2176 C17 ballot ISO/IEC 9899:2017 §6.5.8 ''Relational operators'':関係演算子<ref name="jtc1-sc22-wg14-n2596-6.5.8">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 68, §6.5.8 ''Relational operators'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>. *; ''{{Anchor|relational-expression}}'' *: ''[[#shift-expression|shift-expression]]'' *: ''[[#relational-expression|relational-expression]]'' < ''[[#shift-expression|shift-expression]]'' *: ''[[#relational-expression|relational-expression]]'' > ''[[#shift-expression|shift-expression]]'' *: ''[[#relational-expression|relational-expression]]'' <= ''[[#shift-expression|shift-expression]]'' *: ''[[#relational-expression|relational-expression]]'' >= ''[[#shift-expression|shift-expression]]'' * N2176 C17 ballot ISO/IEC 9899:2017 §6.5.9 ''Equality operators'':等価演算子<ref name="jtc1-sc22-wg14-n2596-6.5.9">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 69, §6.5.9 ''Equality operators'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>. *; ''{{Anchor|equality-expression}}'' *: ''[[#relational-expression|relational-expression]]'' *: ''[[#equality-expression|equality-expression]]'' == ''[[#relational-expression|relational-expression]]'' *: ''[[#equality-expression|equality-expression]]'' != ''[[#relational-expression|relational-expression]]'' * N2176 C17 ballot ISO/IEC 9899:2017 §6.5.10 ''Bitwise AND operator'':ビット単位のAND演算子<ref name="jtc1-sc22-wg14-n2596-6.5.10">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 70, §6.5.10 ''Bitwise AND operator'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>. *; ''{{Anchor|AND-expression}}'' *: ''[[#equality-expression|equality-expression]]'' *: ''[[#AND-expression|AND-expression]]'' & ''[[#equality-expression|equality-expression]]'' * N2176 C17 ballot ISO/IEC 9899:2017 §6.5.11 ''Bitwise exclusive OR operator'':ビット単位の排他OR演算子<ref name="jtc1-sc22-wg14-n2596-6.5.11">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 70, §6.5.11 ''Bitwise exclusive OR operator'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>. *; ''{{Anchor|exclusive-OR-expression}}'' *: ''[[#AND-expression|AND-expression]]'' *: ''[[#exclusive-OR-expression|exclusive-OR-expression]]'' ^ ''[[#AND-expression|AND-expression]]'' * N2176 C17 ballot ISO/IEC 9899:2017 §6.5.12 ''Bitwise inclusive OR operator'':ビット単位のOR演算子<ref name="jtc1-sc22-wg14-n2596-6.5.12">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 70, §6.5.12 ''Bitwise inclusive OR operator'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>. *; ''{{Anchor|inclusive-OR-expression}}'' *: ''[[#exclusive-OR-expression|exclusive-OR-expression]]'' *: ''[[#inclusive-OR-expression|inclusive-OR-expression]]'' | ''[[#exclusive-OR-expression|exclusive-OR-expression]]'' * N2176 C17 ballot ISO/IEC 9899:2017 §6.5.13 ''Logical AND operator'':論理AND演算子<ref name="jtc1-sc22-wg14-n2596-6.5.13">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 71, §6.5.13 ''Logical AND operator'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>. *; ''{{Anchor|logical-AND-expression}}'' *: ''[[#inclusive-OR-expression|inclusive-OR-expression]]'' *: ''[[#logical-AND-expression|logical-AND-expression]]'' && ''[[#inclusive-OR-expression|inclusive-OR-expression]]'' * N2176 C17 ballot ISO/IEC 9899:2017 §6.5.14 ''Logical OR operator'':論理OR演算子<ref name="jtc1-sc22-wg14-n2596-6.5.14">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 71, §6.5.14 ''Logical OR operator'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>. *; ''{{Anchor|logical-OR-expression}}'' *: ''[[#logical-AND-expression|logical-AND-expression]]'' *: ''[[#logical-OR-expression|logical-OR-expression]]'' || ''[[#logical-AND-expression|logical-AND-expression]]'' * N2176 C17 ballot ISO/IEC 9899:2017 §6.5.15 ''Conditional operator'':条件演算子<ref name="jtc1-sc22-wg14-n2596-6.5.15">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 71, §6.5.15 ''Conditional operator'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>. *; ''{{Anchor|conditional-expression}}'' *: ''[[#logical-OR-expression|logical-OR-expression]]'' *: ''[[#logical-OR-expression|logical-OR-expression]]'' ? ''[[#expression|expression]]'' : ''[[#conditional-expression|conditional-expression]]'' * N2176 C17 ballot ISO/IEC 9899:2017 §6.5.16 ''Assignment operators'':代入演算子<ref name="jtc1-sc22-wg14-n2596-6.5.16">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 72, §6.5.16 ''Assignment operators'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>. *; ''{{Anchor|assignment-expression}}'' *: ''[[#conditional-expression|conditional-expression]]'' *: ''[[#unary-expression|unary-expression]]'' ''[[#assignment-operator|assignment-operator]]'' ''[[#assignment-expression|assignment-expression]]'' *; ''{{Anchor|assignment-operator}}'' *: '''=''' '''*=''' '''/=''' '''%=''' '''+=''' '''-=''' '''<<=''' '''>>=''' '''&=''' '''^=''' '''|=''' * N2176 C17 ballot ISO/IEC 9899:2017 §6.5.16.1 ''Simple assignment'':単純代入<ref name="jtc1-sc22-wg14-n2596-6.5.16.1"/>. * N2176 C17 ballot ISO/IEC 9899:2017 §6.5.16.2 ''Compound assignment'':複合代入<ref name="jtc1-sc22-wg14-n2596-6.5.16.2">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 74, §6.5.16.2 ''Compound assignment'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>. * N2176 C17 ballot ISO/IEC 9899:2017 §6.5.17 ''Comma operator'':コンマ演算子<ref name="jtc1-sc22-wg14-n2596-6.5.17">{{cite book | url = http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archiveurl = https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf | archivedate = 2018-12-30 | title = N2176 C17 ballot ISO/IEC 9899:2017 | page = 75, §6.5.17 ''Comma operator'' | publisher = ISO/IEC JTC1/SC22/WG14}}</ref>. *; ''{{Anchor|expression}}'' *: ''[[#assignment-expression|assignment-expression]]'' *: ''[[#expression|expression]]'' , ''[[#assignment-expression|assignment-expression]]'' == 脚註 == <references/> == 参考文献 == * 国際標準化機構/国際電気標準会議 [https://www.iso.org/obp/ui/#iso:std:iso-iec:9899:ed-4:v1:en ISO/IEC 9899:2018(en) Information technology — Programming languages — C](2018-07-05) * 日本工業標準調査会(当時、現:日本産業標準調査会)『JISX3010 プログラム言語C』2003年12月20日改正 [[Category:C言語|えんさんしとしき]] 8gwq2js9ganz54667mtx6tp24jblbf9 中学校社会 公民/自由権 0 18955 205616 199775 2022-07-21T08:50:22Z Nermer314 62933 wikitext text/x-wiki == 基本的人権と自由権 == 基本的人権は、おおまかに<big>'''平等権'''</big>(びょうどうけん) 、 <big>'''自由権'''</big>(じゆうけん) 、 <big>'''社会権'''</big>(しゃかいけん) などの権利に分けられる。 このうち、自由権は大まかには<big>'''身体の自由'''</big>、<big>'''精神の自由'''</big>、<big>'''経済活動の自由'''</big>に分かれます。 == 自由権 == === 身体の自由 === 犯罪をして逮捕されるときなどをのぞけば、体を不当に拘束されない、という権利です。 日本国憲法では、 :「何人も、法律の定める手続によらなければ、その生命若しくは自由を奪はれ、又はその他の刑罰を科せられない。」(第31条) という言い方をしています。 生命を法によらなければ奪われない権利と合わせて「生命・身体の自由」と言われています。 法律によらなければ、逮捕はされません。(第33条) 警察官が逮捕をする場合も、裁判官の発行する令状(逮捕令状)が必要になります。<ref>※現行犯の場合は令状なしで逮捕できる </ref>  逮捕された場合でも、裁判をすぐに受ける権利があります。(第37条)  また、裁判とも関連して、憲法の条文では、取り調べでの自白の強要はゆるされていないというような定めがあり、自白のみを証拠にする場合には裁判の判決で処罰を下すことはできないことが定められています。被告人には不都合なことを黙る黙秘権(もくひけん)もあります。 また、「身体の自由」は、奴隷的な拘束を禁じた義務でも、あります。 === 精神の自由 === どのような考えを持っていても、少なくとも法律では、その考えを持つだけでは罰しない、ということに、憲法では、なっています。 精神の自由には、思想・良心の自由、表現の自由、信教の自由や、学問の自由 などがあります。 * 思想・良心の自由 どのような政治信条を持っていたり人生観を持っていようが、法律では罰されません。 また、何を正義と思おうが、思うだけなら罰されません。 ただし、思うだけでなく、実際に行動にうつせば、もし、その行動が法律に違反していれば、当然、 取り締まりを受けます。 また、役所以外が、特定の考えを批判しても、べつに思想の自由を侵害したことになりません。 たとえば、政治の政党は、当然、政党ごとに政治信条がちがってきます。ですが、たとえ政党が別の政党の政治信条を批判したところで、それはべつに憲法違反になりません。 あなたの父母などの保護者が、あなたの考えを批判しても、保護者は憲法違反になりません。 学校などの場合、生徒の考えが道徳に違反している場合、先生が生徒の考えを批判する場合もあります。 厳密(げんみつ)に考えれば、たとえ子供であっても精神の自由があるのですが、教育上の理由から、生徒の考えが明らかに社会道徳にさからっている場合には、慣習的に教育者は生徒をしかることも、社会的には、ゆるされています。 * <big>表現の自由</big> どんな考えを発表しても、その主張が侮辱(ぶじょく)や脅迫(きょうはく)などを目的とした違法な主張で無い限りは、発表をしたことで刑罰や取り締まりを受けない、・・・と一般に考えられており、これを「表現の自由」と言います。 {{コラム| 日本国憲法と「表現の自由」と侮辱・脅迫 | (※ 範囲外) 日本国憲法そのものの表現の自由に関する条文には、侮辱・脅迫などの例外規定はない。憲法では、表現の自由について、単に 「'''第二十一条''' :集会、結社及び言論、出版その他一切の表現の自由は、これを保障する。 :検閲は、これをしてはならない。通信の秘密は、これを侵してはならない。」 とだけ書いてある。だが、現実の社会においては、主張に侮辱(ぶじょく)や脅迫(きょうはく)などの違法な主張があれば、警察などによって取り締まられている。 例えば、もしも「○○(実在の人名)を殺してしまえ。」(犯罪の指示)とか「△△しないと、○○(実在の人名・地名など)を襲撃するぞ。」(脅迫)とか言ったり発表したりすれば、その人は、取り締まりを受ける場合もある。 なので、wikibooksでは「表現の自由」について「どんな考えを発表しても、その主張が侮辱(ぶじょく)や脅迫(きょうはく)などの違法な主張で無い限りは、発表をしたことで刑罰や取り締まりを受けない、」のように説明した。 もちろん、推理小説とかで作中の殺人犯とかが、「○○を殺す。」と言っても、脅迫を目的とした小説ではないので、取り締まりは受けないだろう。同様に、歴史小説とかで源頼朝が「平家を滅ぼす。」などと言ったとしても、その小説の作者は取り締まりは受けないだろう。 だが、もしも、単に現代の一般人が「○○(実在の人名)を殺せ。」などと言ったりすれば、当然、刑法などによって取り締まりを受ける。 検定教科書によっては、「侮辱や脅迫」などの例外については説明せず、単に「どんな考えを説明しても、取り締まりを受けない」などと説明する場合もありうる。中学生徒は、定期テストのため、答案は、自校で採用している検定教科書に合わせよう。 }} * <big>信教(しんきょう)の自由</big> キリスト教を信じようが、仏教を信じようが、神道を信じようが、あるいは自分で作った宗教を信じようが、または、宗教を信じないとしても、法律では罰されません。つまり、どんな宗教を信じても、あるいは、宗教を信じないとしても、それは自由であるということです。 なお、キリスト教の教会が、教会の中で仏教など他教の儀式を禁じようが、それは信教の自由をやぶったことになりません。国や法律以外のことについては、憲法による信教の自由は関与しません。 ある宗教の信者が、その宗教をやめたいと思ったら、教団の側は、信者が信仰をやめて宗教から抜ける自由をみとめなければ、ならないでしょう。また、たとえ、親や学校の教師だとしても、あなたに特定の宗教を強要したり、あるいは、特定の宗教を信仰しないように強要することはできません。 また、政府と宗教とは分離されています。(政教分離) 原則として日本では、政府が特定の宗教を保護することは禁じられています。ただし、裁判の判例では、例外として、宗教的文化財への補助や宗教系私立学校への補助などを許しています。 また、外部的行為を伴う宗教行為は、他者の人権と衝突する可能性がある以上、信教の自由の保障は無制限ではない。 {{コラム|加持祈祷事件|事件:ある僧侶Aは、精神異常者Bの母親に頼まれて、Bの平癒のための加持祈祷(仏教に関連する宗教行為)として、Bを縛り線香の火で煙らせ背中を殴りつけるといった暴行を加え、Bを死に至らしめた。 判旨:精神異常者の平癒のために加持祈祷が宗教行為としてなされても、それが他人の生命、身体等に危害を及ぼすものであり、それによってBが死亡した以上、信教の自由の保障の限度を逸脱したものであり、Aの加持祈祷行為は傷害致死罪に当たる。}} * 範囲外: 学問の自由 憲法の保障する『学問の自由』とは、具体的に何のことかと言うと、通説では、おもに大学の自治のこととされています。(※ 日本の大学入試センター試験でも、この見解である。そういう出題がされている。)つまり、小学校・中学校・高校は、対象になっていません。 === 経済活動の自由 === <big>職業選択の自由</big>などがあります。近代よりも昔は、人々は身分のしばりがあって、自由に職業を選ぶことが出来ませんでした。職業選択の自由では、そのような職業を選ぶ際の制限をなくしています。(第22条) ただし、どんな仕事も、お金を払う客がいないと成り立たないので、かならずしも、ある職業を目指したからと、その職業になれるとはかぎりません。 たとえばプロのスポーツ選手を目指しても、その職業につける人は少ないでしょう。 職業選択の自由は、その職業になれることまでは、保証しません。職業選択の自由が保証するのは、ある職業を目指しても、法律では、その目標が禁止されることはない、ということです。 ただし医者や弁護士のように、その仕事につくのに免許などの資格が必要な仕事もあります。 * 居住(きょじゅう)・移転(いてん)の自由 原則的に、どこの地域にも引越しができて、住所をかえることができます。明治よりも前の、江戸時代では、人々は自由には移り住むことが出来ませんでした。明治時代になって、こういった引越しをさまたげる制限は、なくなりました。 ただし未成年の子供は、親など保護者の許可がなくては、引越しはできません。 * 財産権(ざいさんけん) 自分の財産をもてる権利と、その財産が不当におかされない権利です(第29条)。むかしは、支配者が勝手に人々の財産を取り上げることがあったので、そういう不当な取り上げが出来ないようにしています。 どうしても、国が土地などの財産をゆずってほしい場合には、かわりに、たとえば国が金を払って買い取るなどの、相応の補償(ほしょう)をしなければなりません。 [[Category:中学校公民|きほんてきしんけんのそんちよう]] pli6it9kv6njjt9oig2vv475n5jtspb 中学校社会 歴史/戦国時代と安土桃山時代 0 19234 205600 189113 2022-07-21T02:07:41Z Artanisen 41776 /* 豊臣秀吉の天下統一 */ より良い画像= Toyotomi_Hideyoshi_c1598_Kodai-ji_Temple.png wikitext text/x-wiki [[{{PAGENAME}}]]では、戦国時代と安土桃山時代について解説します。 == 戦国時代の到来 == === 下剋上と戦国大名 === 室町時代の後半は、応仁の乱がきっかけで各地に領土獲得のための争いが広がった。この室町時代後期の日本各地で戦乱があった時代を {{中付きルビ|2|戦国|せんごく|時代|じだい}}と言い、戦乱が続いた。応仁の乱で、守護大名が京都に出向いて兵を指揮していたころ、国もとに残っていた家臣らが実権をにぎるというということが起きた。他にも、各地で、身分が下の者が、守護大名に取って代わろうとして争い、大名になった者たちが現れ始めた。このように身分の下のものが身分が上の大名を倒して、新しく大名になることを{{Ruby|'''下克上'''|げこくじょう}}という。 そして、戦国時代の大名を'''戦国大名'''という。戦国大名の多くは、下克上によって、大名に成り上がった。 <gallery widths="200px" heights="200px"> File:Takeda Harunobu.jpg|{{中付きルビ|2|武田|たけだ|信玄|しんげん}}(1521〜1573) - 守護大名の一族の出身。 File:Uesugi Kenshin.jpg|{{中付きルビ|2|上杉|うえすぎ|謙信|けんしん}}(1530〜1578) File:Soun Hojo portrait.jpg|{{中付きルビ|2|北条|ほうじょう|早雲|そううん}}(1432〜1519) File:Saitō Dōsan.jpg|{{Ruby|斎藤道三|さいとうどうさん}}(?〜1556) File:Mohri Motonari.jpg|{{中付きルビ|2|毛利|もうり|元就|もとなり}}(1497〜1571) File:Otomo Sorin.jpg|{{中付きルビ|2|大友|おおとも|宗麟|そうりん}} - 守護大名の一族の出身。 File:Shimazu Takahisa.jpg|{{中付きルビ|2|島津|しまづ|貴久|たかひさ}} - 守護大名の一族の出身。 </gallery> 無論、すべての守護大名が下克上で倒されたわけでなく、守護大名のまま、時代が戦国時代になり、守護大名から戦国大名になった者もいる。守護大名出身の戦国大名には、武田氏、{{Ruby|今川|いまがわ}}氏、{{Ruby|佐竹|さたけ}}氏、{{Ruby|山名|やまな}}氏、大友氏、島津氏などがある。 その他の戦国大名は、ほとんどが下剋上によって戦国大名に成り上がった者である。 === 分国法 === 戦国大名どうしが戦うことから、領地内での{{Ruby|統制|とうせい}}も強める必要があった。戦乱の時代に対応した、領地を管理するための法律を、新たに作る必要がある。 それぞれの戦国大名が領地内でしか通用しない法律を勝手に作った。これが {{Ruby|'''分国法'''|ぶんこくほう}} である。戦国大名の領地を{{Ruby|分国|ぶんこく}}と呼んでいた。その分国の中で通用する法律だから分国法というわけである。 たとえば甲斐 (山梨県) の戦国大名である武田信玄は『{{中付きルビ|4|甲州|こうしゅう|法度|はっと| |の|次第|しだい}}』という分国法を1547年に作った。 <div style="border:1px solid #000000;"> :武田氏の分国法 ::一. 武田信玄の許可なく同盟を結ぶことを禁止する。 ::一. 他国に勝手に手紙や{{Ruby|贈|おく|り物}}を出してはならない。 ::一. 喧嘩をしたものは、どちらが良いか悪いかに関わらず、いかなる理由でも、両方とも処罰する。ただし、相手から喧嘩を仕掛けられても、こらえた者は処罰しない。 ::一. 主君から、もらった土地は、勝手に売買してはならない。やむをえず売買する場合は理由を申し出ること。 :『甲州法度次第』(重要事項をまとめた現代語訳) </div> 甲州法度次第のように、部下どうしの争いを両方とも処罰することを '''{{中付きルビ|2|喧嘩|けんか|両成敗|りょうせいばい}}''' という。 他にも今川氏の『今川{{Ruby|仮名目録|かなもくろく}}』などの分国法がある。 <div style="border:1px solid #000000;"> :今川氏の分国法 ::一. 今川家の{{Ruby|家臣|かしん}}は、勝手に他国から{{Ruby|嫁|よめ}}をもらったり、あるいは{{Ruby|[[wikt:婿|婿]]|むこ}}に取ったり、あるいは他国に嫁を出すことは、今後は禁止する。 :『今川仮名目録』(重要事項を抜粋した現代語訳) </div> 分国法の内容は大名によって違うが、多くの大名の分国法では、勝手に他国と連絡をとることを禁止するなど、家臣の裏切りを防ぐための決まりや、家臣同志が争った場合は両方とも罰することで領内を団結させるなどの決まりであることが多い。 大名の多くは家来を自分の城の近くに住まわせた。このため、城の近くに街が出来た。これが {{Ruby|'''城下町'''|じょうかまち}} がである。朝倉氏の{{Ruby|一乗谷|いちじょうだに}} (現在は福井県内) や、北条氏の{{Ruby|小田原|おだわら}} (現在は神奈川県内) などが城下町である。 <div style="border:1px solid #000000;"> :朝倉氏の分国法 ::一. 本拠である朝倉の{{Ruby|館|たち}}の他には、国の中に城をかまえてはならない。有力な家臣は一乗谷に引越し、村などの所領があれば、村に{{Ruby|代官|だいかん}}を置け。 :『{{中付きルビ|3|朝倉|あさくら|考景|たかかげ|条々|じょうじょう}}』(重要条文を抜粋した現代語訳) </div> 戦国大名たちは、荘園領主の支配を認めず、荘園だった土地を自国の領土とした。 == 信長の台頭 == 多くの大名がおり、各地で争いがおきているので、その全てを解説する時間はない。なので、代表的な人物を中心に取り上げる。 === {{中付きルビ||桶狭間|おけはざま|の||戦い|たたかい}} === [[ファイル:Odanobunaga.jpg|250px|thumb|{{中付きルビ|2|織田|おだ|信長|のぶなが}}]] [[ファイル:Tenkahubu.svg|100px|thumb|「天下布武」の印]] 戦国時代には各地に大名がおり、多くの大名どうしが争っていた。1560年以降から、まず、{{Ruby|尾張|おわり}} (現在の愛知県西部) の '''織田信長''' が勢力を伸ばし始める。きっかけは、1560年に、尾張が'''桶狭間の戦い'''で{{Ruby|駿河|するが}} (現在の静岡県) の大名である{{中付きルビ|2|今川|いまがわ|義元|よしもと}}の軍に攻めこまれたが、今川義元を織田らの軍が討ち取り、今川義元は死亡する。このため、今川軍は負ける。 今川討ち死にのいきさつは、信長軍の兵が少数の軍勢で今川の本陣を攻撃し、今川義元を討ち取った。 :(※ 範囲外: ) 織田軍は桶狭間では奇襲攻撃はしかけてはいない。21世紀の歴史学的には、織田軍は今川の陣営を正面から攻撃したものと思われている<ref>山本博文 著『【東大流】流れをつかかむ すごい!日本史講義』、PHP研究所(出版社名)、2020年5月5日 第1版 第1刷、188ページ</ref>。奇襲説を取ったのは、明治時代の陸軍のようであり、その参考文献として『甫庵信長記』(ほあん しんちょうき)という江戸時代の文献を明治陸軍は参考にしているが、しかしここの『甫庵信長記』(ほあん しんちょうき)は江戸時代初期の娯楽としての歴史読み物であり、史料としての信頼性に欠ける。一方、戦国時代の当時に書かれた『信長公記』(しんちょう こうき)という歴史書には奇襲とは何も書かれておらず<ref>山本博文 著『【東大流】流れをつかかむ すごい!日本史講義』、PHP研究所(出版社名)、2020年5月5日 第1版 第1刷、188ページ</ref>、よって21世紀の歴史学では正面攻撃だというのが有力説である。 * 発展的事項: 徳川家康の独立 :この桶狭間の戦いを期(き)に、今川氏に支配されていた三河(みかわ)の松平元康(まつだいら もとやす)および彼の家臣が今川から独立し、松平元康は松平家康(まつだいら いえやす)と改名する。(元康の「元」の字は、義元の「元」の字と同じである。)松平元康は、後の江戸時代に、江戸幕府の征夷大将軍になる '''徳川家康'''(とくがわ いえやす) である。しかし、このころの松平家康は、まだ一介の戦国大名であった。 :桶狭間の戦いから2年後の1562年に、家康は織田信長と同盟をむすぶ。これが 清洲同盟(きよす どうめい) です。「清洲」(きよす)とは尾張(おわり)にある信長の居城の清州城(きよす じょう)のことです。なお、1582年の清洲会議(きよす かいぎ)とは、別の出来事です。1582年の清洲会議は、1582年に信長が死んだので後継者(こうけいしゃ)を決めるための会議です。 (発展的事項、おわり。) なお、豊臣秀吉(とよとみひでよし)は、桶狭間の当時は織田信長の家臣であり、当時の名は 木下藤吉郎(きのした とうきちろう) と名乗っていました。のちの1570年のころに名を変え、木下藤吉郎から羽柴秀吉(はしば ひでよし)に名前を変えています。 :※ 中学校では「羽柴秀吉」の名前も習う教科書もあるので、知っておこう。東京書籍の『新しい社会 歴史』平成23年検定版の98ページの本文にも「羽柴秀吉」の語句がある。 [[File:Map_Japan_Genki1.png|thumb|500px|元亀元年の戦国大名の版図(推定)]] 桶狭間の戦い以降、信長は西へと勢力を伸ばしていく。1568年には、足利義昭(あしかが よしあき)を支援して京都に入った。義昭が、室町幕府の第15代将軍になる。 :※ 中学校では「足利義昭」の名前も習う教科書がある。東京書籍の『新しい社会 歴史』平成23年検定版の98ページの本文にも「足利義昭」の語句がある。 1569年、キリスト教の宣教師のルイス・フロイスと初めて出会い、彼にキリスト教の布教を許可します。(※ ルイス=フロイスについては、中学の範囲外。清水書院など一部の教科書ではコラムなどで紹介されている。) :※ 世間では、よくザビエルとフロイスとを混同する人が多い。信長に仕えた(つかえた)宣教師はフロイスである。ザビエルは信長に仕えてない。 信長本人はキリスト教の信者ではなく、信長の狙いは宣教師のもたらす情報などが狙いだとか、あるいは当時に信長と敵対していた仏教勢力への対策などと、一般に言われています。 * 発展的事項: 信長包囲網(のぶながほういもう) :義昭が、第15代将軍になる。後に信長に実権をうばわれることをおそれた義昭が1571年ごろに各地の大名と密かに協力して御内書(ごないしょ)を送る。 :御内書は、上杉謙信(うえすぎけんしん)や毛利輝元(もうりてるもと)、本願寺光佐(ほんがんじこうさ)や武田信玄(たけだしんげん)など、各地の大名に御内書が下された。これは現代(2014年に記述)では信長包囲網(のぶながほういもう)と一般には呼ばれている。この包囲網に、さらに、かねてから信長と対立していた大名なども加わる。 :その後、各地の大名たちと織田軍は戦争になるが、織田軍は生き延びる。 (発展的事項「信長包囲網」、おわり。) :1570年には、信長に敵対する浅井・朝倉の連合軍と戦争になり姉川の戦いが起きるが、この浅井・朝倉連合軍をやぶる。 :1571年には仏教勢力の延暦寺が浅井・朝倉に味方してことなどから、比叡山延暦寺(ひえいざん えんりゃくじ)を焼き討ちにする。いわゆる'''「延暦寺の焼き打ち」'''をした。 また、仏教勢力にも容赦は無く、一向一揆の根拠地である大阪の石山本願寺を1580年には屈服させた。 義昭は1573年に京都の槇島城(まきしまじょう)で挙兵したが失敗し、織田によって義昭は京都から追放された。 (※「槇島城」については、おぼえなくてよい。) これによって、室町幕府は、ほろんだ。 * 長篠の戦い [[ファイル:Battle-of-Nagashino-Map-Folding-Screen-1575.png|500px|thumb|長篠の戦い。左側が織田・徳川の連合軍。右側が武田軍。]] 1575年に織田・徳川の同盟と、対する敵は、甲斐(かい)の大名の武田勝頼(たけだ かつより)らの戦争である '''長篠の戦い'''(ながしのの たたかい) が三河(みかわ)で起きる。この戦いでは、織田・徳川らの鉄砲隊の活躍により、織田が勝ち、武田は負ける。 武田の戦法は騎馬兵による従来の戦法であった。 * 安土城(あづちじょう) 1576年、近江(おうみ、滋賀県)に城を築かせ(きずかせ)、5層の天守閣(てんしゅかく)を持つ '''安土城'''(あづちじょう) を築かせる。 安土城の城下町では、次に説明する楽市楽座(らくいち らくざ)などの新しい政策が行われた。 * 楽市楽座(らくいち らくざ) 商業をさかんにするため、関所(せきしょ)で通行税(つうこうぜい)を取ることを廃止(はいし)する政策を、岐阜や安土で行った。 一般に商人は、利益をだすために、費用をあまり払いたくないので、そのため税のひくい場所で商売をしたがります。 また、各産業の同業者組合である座(ざ)の独占権を廃止し、だれでも商売が始められるようにします。このように座の独占権を廃止したことを 「楽座」(らくざ) と言います。 そして、商業を活発にするための信長による一連の規制(きせい)の撤廃(てっぱい)などの商業の振興策(しんこうさく)を、'''楽市楽座'''(らくいち らくざ)といいます。 商業都市の堺は自治都市だったが、信長は堺を支配下に置き、自治の権利をうばい、直轄領にした。 <div style="border:1px solid #000000;"> :楽市楽座 ::安土の町中での定め ::一. この安土の町を楽市としたので、色々な座の特権は廃止し、座の色々な労役や税は免除する。 ::一. 都に上る商人、都から下る商人は、この安土の町に宿泊しなければならない。 ::一. 他の土地からやってきた者でも、以前から住んでいた者と同等の扱いにする。 :『八幡町共有文書』(はちまんちょう きょうゆう もんじょ)『安土山下町中掟書』(あづち さんげちょう ちゅう おきてがき) </div> === 本能寺の変 === 1582年、中国地方へと勢力をひろめるため、織田軍は家臣の秀吉(ひでよし)などに命じて、中国地方の大名の毛利と戦争をしていました。信長はこれを支援するため中国地方に向かう途中、京都の本能寺に泊まって(とまって)ました。 このとき、家臣の'''明智光秀'''(あけち みつひで)が反逆をして、この本能寺で信長および信長の子の織田信忠(おだ のぶただ)たちは死亡します。 信長は当初は応戦していたといいますが、やがて敵の兵数を知るとけを覚悟し、家臣の森蘭丸(もり らんまる)らに寺に火を放たせ、信長は自刃(じじん)したと 言います。 この1582年の本能寺での一連の事件が'''本能寺の変'''(ほんのうじのへん) です。 '''信長は、天下統一をしていません。''' 天下統一ならず、信長は死亡します。 のちに、戦国時代の天下統一をした人は、羽柴秀吉です。 == 豊臣秀吉の天下統一 == 織田信長の時代のころ、秀吉は、信長に仕えていた有力な武将であった。そのころは、羽柴秀吉(はしば ひでよし)などと名乗っていた。 [[ファイル:Toyotomi_Hideyoshi_c1598_Kodai-ji_Temple.png|thumb|300px|豊臣秀吉。]] 本能寺の変のとき、秀吉は、信長の命令により、毛利軍と戦争をしている時期だった。信長の死の報告を聞いた羽柴秀吉は、ただちに毛利との停戦をし、そして京都・大阪に向かい 山崎の戦い(やまざき の たたかい) で明智光秀を倒す。 その後、信長の家来だった柴田勝家と戦い、賤ヶ岳の戦い(しずがたけのたたかい)で秀吉軍は柴田軍を倒す。 このようにして、信長の支配権の争いに秀吉は勝って行き、信長の領地を受け継いでいく。 1583年に秀吉は、大阪にあった石山本願寺(いしやまほんがんじ)の跡地(あとち)に'''大阪城'''(おおさかじょう)を築かせ、この大阪城を本拠地(ほんきょち)にした。 そのあと、秀吉は各地の大名たちを平定し従えていきます。徳川家康も、秀吉は従えさせた。 1585年、羽柴秀吉は朝廷から '''関白'''(かんぱく) の称号を、もらう。 1586年、羽柴秀吉は朝廷から'''豊臣'''(とよとみ)の姓(せい)をもらい、'''豊臣秀吉'''(とよとみ ひでよし)と名乗る許可を得ます。秀吉は、関白と太政大臣(だいじょうだいじん)の朝廷の地位を手に入れる。 そして秀吉は、各地の大名どうしに争いをやめるように停戦命令として惣無事令(そうぶじれい)を1585年に出す。停戦命令に従わなかった九州の島津(しまづ)氏は、1587年に征伐され屈服させられた。 :(※ 範囲外: )歴史学では20世紀のかつて、「惣無事令」というのは固有名詞かと思われていたが、しかし1585年以前の1583年や1584年からも、秀吉の命令とは無関係に各地の大名も「惣無事」という言葉をつかって各種の停戦協定を出していることが古文書などから明らかになった<ref>山本博文 著『【東大流】流れをつかかむ すごい!日本史講義』、PHP研究所(出版社名)、2020年5月5日 第1版 第1刷、213ページ</ref>。つまり、「惣無事令」とは固有名詞ではなく、「停戦命令」や「停戦協定」などを意味する一般名詞である可能性が、歴史学では考え始められている。このため、もしかしたら将来的に教科書の「惣無事令」という歴史用語が変わる可能性がある。 :高校では、すでに平成25年の高校教科書(山川出版社)では、「惣無事令」という用語は消えている(その3年前の平成22年まで「惣無事令」の用語は使われていた)<ref>山本博文 著『【東大流】流れをつかかむ すごい!日本史講義』、PHP研究所(出版社名)、2020年5月5日 第1版 第1刷、213ページ</ref>。 :史実としては、少なくとも秀吉が諸国の大名に停戦命令を出したのは事実だし、また、秀吉の停船命令が当時の人々によって「惣無事」と呼ばれたのも事実である<ref>山本博文 著『【東大流】流れをつかかむ すごい!日本史講義』、PHP研究所(出版社名)、2020年5月5日 第1版 第1刷、213ページ</ref>。 そして1590年には、秀吉に従わなかった北条(ほうじょう)氏の治める関東の小田原(おだわら)を攻め、北条氏政(ほうじょう うじまさ)を滅ぼします。同1590年、秀吉に従っていなかった東北の奥羽(おうう)の伊達(だて)氏など東北の大名は、秀吉にしたがい、これで'''秀吉が天下統一をなした。''' 秀吉は支配下に大坂、堺、京都、などの重要都市を直接支配下に置いた。佐渡(さど)金山、生野(いくの)銀山、石見銀山(いわみぎんざん)なども直接支配下に置いた。 === 秀吉の政策 === * 太閤検地(たいこうけんち) 農民から年貢を取るための土地の調査を'''検地'''(けんち)という。 検知そのものは信長の時代からも行われていたが(※ 教育出版などの検定教科書に記述がある)、さらに秀吉は各地でちがっていた物さし(ものさし)の長さや ます の容積などを統一し、また、全国の田畑の面積や土地のよしあしを調べた。(※ 信長はそもそも全国統一してないので、物差し などの全国統一のやりようがない。日本を全国統一したのは秀吉である。) マスの基準(きじゅん)は、京都で使われていた京枡(きょうます)が全国の基準の枡になった。このような、秀吉が行った検知の改革のことを'''太閤検地'''(たいこう けんち)という。「太閤」(たいこう)とは「関白をやめた人」という意味であり、秀吉のことである。秀吉は関白をやめた後には「太閤」(たいこう)と名乗っていました。 そして検知の記録によって、田畑の面積や、田の収穫高である'''石高'''(こくだか)、その田畑を耕す農民の名前などが記録される 検地帳(けんちちょう) が作られた。 検地帳によって耕作者が、はっきりしたので、農民は田畑を持つ権利を認められたが、同時に年貢(ねんぐ)をおさめる義務をおうことになり、土地を勝手に離れる(はなれる)ことができなくなった。 また、これで、かつての荘園のように土地の権利がはっきりしない土地がなくなった。そして公家や寺社などの荘園領主としの権利は完全に否定され、公家などの勢力は衰えた。 :(※ 範囲外: ) もうひとつ、教科書には記述は無いが、太閤検地には重要な意味があって、秀吉以前の当時の納税の仕方には、農産物による「石高」(こくだか)のほかにも、銅貨などを収める貫高(かんだか)という方法もあったが([[w:貫高制]])、太閤検地にともなう石高制への移行により、農民は通貨による納税をしなくてよくなったという意味もある。このため、農民は農産物を貨幣に換金する手間が省けるので、商人などに暴利をむさぼられる心配もなくなる。また、納税される領主や秀吉たちからすれば、中間搾取が減るので、いいこと尽くめである。なお、貫高から石高への納税システムの変更は、秀吉の発明ではなく、信長の時代から幾つかの地域の戦国大名の領地で行われていたようである。 * '''刀狩'''(かたながり) 1588年に農民から刀や鉄砲などの武器を没収する命令の'''刀狩令'''(かたながりれい)をだします。名目は大仏を京都の方広寺(ほうこうじ)に作るので材料の鉄が必要なため、という名目です。秀吉の狙いは、一揆(いっき)を防ぐため、というのが現代(2014年に記述)での一般的な考えです。 <div style="border:1px solid #000000;"> :刀狩令 ::一. 百姓が、刀、わきざし、弓、槍、鉄砲、その他の武具を所持することを禁止する。その理由は、農耕に不要な武器をもつと、年貢を納めずに一揆をくわだてることになる。もし一揆を起こし、領主に対して無礼なことをすれば、もちろん処罰する。大名、代官は農民から武具をことごとく取り集め、差し出させるようにせよ。 :『小早川家文書』(こばやかわけ もんじょ)、抜粋 </div> * 兵農分離 このような検地や刀狩の結果、農民と武士との中間的な立場の人間がいなくなり、農民と武士との身分のちがいが、はっきりとしました。このようなことを現代の用語で'''兵農分離'''(へいのう ぶんり)といいます。 *人掃令(ひとばらい れい) さらに秀吉は1592年に、人々が身分を勝手に変えることを許さなくした。これを人掃令(ひとばらい れい)という。 *キリスト教の禁止 豊臣秀吉は、キリスト教を禁止する。いっぽう、信長はキリスト教を優遇して保護していました。信長がキリスト教の布教を認めた理由は、信長に敵対する仏教勢力と対抗する目的だと思われている。秀吉も、最初のほうはキリスト教を許可していた。 秀吉がキリスト教を禁止した理由として一般に言われているのは、一般に、 キリシタン大名の大村純正が長崎をキリスト教に寄付し、長崎がキリスト教の領地になっていることを、九州の平定の際に知った秀吉が、キリスト教は天下統一のさまたげになるだろうと考えたから、と言われています。 :※ 範囲外 :また秀吉はキリスト教の禁教の際、南蛮貿易を通じて日本人が海外に奴隷として輸出され売り飛ばされていたようだ、ということを、キリスト教の取り締まりの理由にあげます。 :もっとも、その秀吉じしん、朝鮮出兵の際には、日本軍が捕らえた朝鮮人を捕虜として日本に連行している事から、もしかしたら奴隷解放は秀吉の本音ではなく、単に、秀吉のイイワケであるかもしれません。 :(また、奴隷を買っているのは、かならずしも白人の南蛮商人だけとは限らない可能性もあり、中国など東洋の外国の商人も日本人奴隷を買っている可能性もあります。 :また、奴隷を買う側の他にも、日本人のなかにも戦乱などの際に日本人を狩って奴隷にして海外に売りさばいている悪人もいるわけだが・・・。) 1587年にキリスト教の宣教師(せんきょうし)を日本の外へ追放(ついほう)する'''バテレン追放令'''(バテレンついほうれい) を出します。バテレンとは、ポルトガル語で神父を意味する パードレ padre が由来の言葉。 (※ ポルトガル語表記「padre」は、おぼえなくてよい。) しかし南蛮貿易は許可していたこともあり、取り締まりの効果は不十分だった。 === 朝鮮出兵 === 国内を統一した秀吉は、つぎに、外国を征服(せいふく)しようとした。そのため、中国大陸の帝国である明(みん)に、日本が取ってかわろうと考えた。まず、マニラ(フィリピン)や台湾に、日本への服属を求める手紙を送った。そして、明を征服することを秀吉は考えた。このための足がかりとして、まず朝鮮(ちょうせん)に通行の許可(きょか)や協力などをもとめたが、朝鮮に断られたため、朝鮮との戦争になり、2度にわたって朝鮮に兵をおくって戦争をした。この戦争を日本での現代の呼び方で、'''朝鮮出兵'''(ちょうせん しゅっぺい) とか '''朝鮮侵略'''(ちょうせん しんりゃく)と 言う。 ※ 教科書には「朝鮮侵略」という表記のみを用いる教科書もあるが、日本国民間での「朝鮮侵略という表記のみを用いる。」というような合意は無いし、教科書検定も指示していない。「朝鮮出兵」の表記も、教科書検定で認められている。( たとえば平成23年度検定版、育鵬社(いくほうしゃ)「新しい日本の歴史」にて「朝鮮出兵」の表記を確認。 ) ここで気をつけてほしいのは、朝鮮の最初の目的は、けっして朝鮮半島への征服ではなく、中国大陸への征服です。名前が「朝鮮出兵」とか「朝鮮」侵略なので、てっきり朝鮮の領土などをねらった戦争だろうとマチガイやすいかもしれませんが、秀吉が最初に狙ったのは明(みん)の征服であって朝鮮の領土ではありません。 なぜ秀吉が明への侵略戦争を考えたはじめたかについては、学者でも、まだ理由が解明されていません。仮説(かせつ)は多くありますが、学者の研究途中です。 なお、20世紀の後の時代の戦争で朝鮮戦争(ちょうせんせんそう)という戦争がありますが、朝鮮出兵とは別の戦争です。朝鮮戦争は北朝鮮と韓国戦争との戦争です。名前が似ていますが、まちがえないでください。 秀吉の朝鮮出兵は2度あり、最初の1回目の出兵は1592年( 天正(てんしょう)20年 )にあり 文禄の役(ぶんろくのえき) と言い15万人ほどの日本兵が出兵され、2回目の出兵は1597年( 慶長(けいちょう)2年 )にあり 慶長の役(けいちょうのえき) と言います。 2つの出兵とも、最終的に日本は朝鮮の征服に失敗します。 [[image:TurtleShip1795.jpg|thumb|left|250px|『行録』などの記述をそのまま絵にしたもので、亀甲船の'''想像図'''。少なくとも18世紀以後に描かれたものであり、史料価値はほとんどない。]] [[File:Statue of Yi Sunsin - Sejongro Seoul.JPG|thumb|200px|李舜臣の銅像。(韓国、ソウル。)]] 1回目の朝鮮出兵である文禄の役 では、朝鮮の各地や海上で日本軍は朝鮮軍と戦い、朝鮮の首都の漢城(かんじょう、今のソウル)なども一時は占領したが、最終的に敗退する。朝鮮の水軍(すいぐん)の軍人である李舜臣(日本語よみ :り しゅんしん、  韓国語よみ :イ スンシン)がひきいる亀甲船(きっこうせん)に、日本は苦戦した、といわれている。また明からの援軍が朝鮮に協力したので、日本の戦況は不利になっていった。 朝鮮の民衆も朝鮮軍に協力したが、このため、朝鮮軍だけでなく朝鮮の民衆も戦争に巻き込まれた。 戦争が長引き、一度、休戦した。しかし、明の皇帝の国書には秀吉を日本国王に命じる、などと書かれており、秀吉が不満を持ち、講和がまとまらず、二度目の戦争が起き、14万人あまりの大軍が朝鮮半島に出兵された。 [[File:Mimizuka2.jpg|thumb|left|240px|京都にある耳塚(鼻塚)。朝鮮出兵で切り取られた耳や鼻を供養(くよう)している。]] 2回目の出兵では、秀吉は、部下に手柄を証明させるために、敵の耳や鼻を切り取って送ってこい、という命令をだします。 このため日本に多くの朝鮮人・民国人の耳や鼻が送られてきます。 戦国時代では、手柄をしめすために敵の将の首を切り取り送るのが一般だったのです。階級の低い敵兵の場合には首ではなく鼻などを切り取っていました。 1598年に日本国内で秀吉が病死し、朝鮮出兵は終わります。 * 朝鮮出兵の結果: ::・日本の諸大名などからの豊臣氏への信用が弱まり、のちに、豊臣氏が没落していくキッカケの一つになる。 ::・朝鮮に、大きな被害を与えた。 ::・戦争で消耗した明(みん)の力も弱まる。 ::・朝鮮の陶器(とうき)の文化が日本に伝わる。朝鮮人の捕虜が日本に連行されたり、物品の略奪などを通して。佐賀県の有田焼(ありたやき)、鹿児島県の薩摩焼(さつまやき)、山口県の萩焼(はぎやき)など。今では、その地方の特産品の一つになっている。 有田焼は朝鮮人の李参平(り さんぺい、イ チャムピョン)などの陶工によって始められた。 検定教科書によっては、「朝鮮侵略の際に、儒学の一派である朱子学(しゅしがく)が日本に伝わった。」というような記述もあるが、朱子学じたいは鎌倉時代ごろには既に日本に伝わっている。 朝鮮出兵の当事、朝鮮王朝が官学として朱子学を採用していた。江戸時代に日本で朱子学が、はやることになる。江戸以前は、あまり朱子学は、はやらなかった。儒教についても同様で、古代から日本に伝わっており、けっして朝鮮出兵で日本に儒教が伝わったのでは無い。江戸時代に朱子学のはやるきっかけの一つの可能性かもしれないが、可能性であり、定かではない。 == 安土・桃山文化 == 信長が生きてて影響力の強かったころの安土文化(あづち ぶんか)と言います。信長が安土城(あづちじょう)を建てさせたころの文化だからです。秀吉の時代の文化を桃山文化(ももやま ぶんか)と言います。「桃山」とは、秀吉が築いた伏見城(ふしみじょう)の、のちの時代の地名です。安土文化と桃山文化を合わせて安土桃山文化(あづちももやま ぶんか)と言います。 * 茶道(さどう) [[Image:Sen no Rikyu JPN.jpg|200px|thumb|千利休<br>(画:長谷川等伯)。利休は、のちに秀吉の怒りを買い、自害を命じられ、自害した。]] 室町時代に生まれた茶の湯は、'''千利休'''(せんの りきゅう)により、質素さや簡素さなどの「わび」(侘び)を重んじる、「侘び茶」(わびちゃ)とよばれる茶道(さどう)へと発展した。 織田信長のころから、めずらしい茶器(ちゃき)が好まれるようになった。朝鮮出兵のときに陶工を捕虜として連行した理由の一つには、このようなことがある。 千利休により、妙喜庵待庵(みょうぎあん たいあん)などの茶室が造られた。(※ ウィキペディアに茶室内部の画像が無いので、外部で探してください。)妙喜庵待庵は国宝になってる。妙喜庵待庵の茶室の広さは、わずか二畳しかない。 * 絵画 [[Image:Kano_Eitoku_002.jpg|330px|thumb|left|『唐獅子図屏風』(からじし ずびょうぶ)、狩野永徳。]] ふすま絵や屏風絵(びょうぶえ)が発達した。'''狩野永徳'''(かのう えいとく) や 弟子の狩野山楽(かのう さんらく) などの 狩野派(かのうは) の画家が活躍した。ふすま絵や屏風絵(びょうぶえ)を合わせて障壁画(しょうへきが)という。 狩野永徳の作品の『唐獅子図屏風』(からじし ずびょうぶ)が有名。 ほかの派の画家では、長谷川等伯(はせがわ とうはく)が有名。 {{clear}} [[画像:洛中洛外図左.jpg|thumb|center|700px|『洛中洛外図』(らくちゅうらくがいず)。狩野永徳の作品と、されている。]] {{clear}} * 南蛮文化 南蛮貿易により、ヨーロッパの医学・天文学・印刷技術が日本に伝わる。 パン(pão)やカステラ(pão de castela)、カボチャ、カッパ、カルタ(carta)、テンプラ(Temporas)、たばこ(tabaco)、ボタン(Botão)が日本に伝わる。 (※ ポルトガル語表記は、おぼえなくてよい。「pão」や「carta」などは、おぼえなくてよい。) 「カステラ」の由来は、有力な説はポルトガル語でCastelaがスペインのカスティーリャ地方のことだが、カスティーリャ地方のパンケーキという意味でカステラが日本に伝わって、日本語の「カステラ」になったという。 (※ ポルトガル語表記は、おぼえなくてよい。) 逆に日本からの輸出では、銀や刀や茶などが輸出され、catana(「カタナ」、刀のこと)などのポルトガル語の由来になった。屏風がbiomboに、坊主がbonzoに、伝わった。 * 芸能 浄瑠璃(じょうるり)と歌舞伎(かぶき) [[画像:Shitahaku_kejo.jpg|thumb|150px|三線(さんしん)]] :* 三味線(しゃみせん)と浄瑠璃(じょうるり) 琉球から 三味線(しゃみせん)のもとになる三線(さんしん)が日本に伝わった。日本で 三味線(しゃみせん)として発展した。民衆のあいだでは、三味線の音色に合わせて、人が物語をかたるのを見て楽しむ浄瑠璃(じょうるり)が流行る。この浄瑠璃は、さらに発展し、人の代わりに人形を使う人形浄瑠璃(にんぎょうじょうるり)へと発展した。 [[File:Izumo no Okuni.jpg|thumb|left|出雲(いづも)の阿国(おくに)。歌舞伎踊り。(かぶき おどり)で、念仏踊りをしている。 『国女歌舞伎絵詞』(くにじょ かぶきえ ことば)]] :* 歌舞伎(かぶき) :「出雲(いづも)の阿国(おくに)」という女が始めた歌舞伎踊り(かぶき おどり)が人気(にんき)になる。出雲とは、今でいう島根県。当時は異様な服装や行いをすることを「かぶく」(傾く)と言っていた。 のちの江戸時代には歌舞伎は演劇となっていき男だけが歌舞伎を行うことになるが、この安土桃山時代には女が歌舞伎踊りをしていた。 衣服では、小袖(こそで)が普及していった。木綿(もめん)の衣服が、麻にかわって一般的になった。民家の屋根には瓦屋根(かわら やね)の様式が京都などでは増えていった。 {{clear}} [[Category:中学校歴史|せんこくしたいとあつちももやましたい]] 6bjcooo3uwg2omg4mvda4oc3is3075z 学習方法/高校受験/英語 0 19527 205588 205470 2022-07-20T17:05:45Z Honooo 14373 /*難関私立高校*/ wikitext text/x-wiki {{Notice|'''{{PAGENAME}}'''では、中学校英語高校受験対策の学習方法について解説します。独自研究や中立性を欠いた文章が含まれる場合があります。ご了承ください。}} ==高校受験に向けた英単語学習== 英作文をはじめ、基本的に英語のスペルは正しく書くべきだろう。もちろん試験ではスペル間違いはそれなりに減点、あるいは不可になる。 英単語のスペルを覚えるいい方法、効果的な方法があればよいが、それぞれの学習者の工夫も必要だと思うが、一般的にもさまざまな主張やアドバイスがある。 『進研ゼミ 高校入試情報サイト』では、中学校の英単語学習として、意味や用法を覚え、スペルも書いて練習しようと勧めている<ref name=":0">[https://czemi.benesse.ne.jp/open/nyushi/study/1367896_13980.html]2022年4月25日に確認</ref>。 英単語書き取り練習は漢字練習と同じようなものでしょう。まず中学校必須単語から、一単語あたり5~10回書いて覚えたい。 英語学習では英単語をそれなりの数覚えているのが有効、というのは、多くの人の主張するところで、中学生は中学生として覚えているのが妥当で必要な単語を、意味、スペル、そして出来れば品詞もしっかり覚えていくといいですよね。 しかし単語を覚えただけで、英語の学習バッチリとはならないだろうし、他にも発音や熟語、様々な用法を考慮した文作成や解釈、英語学習の要素は色々ありますよね。 しかし前編集者の推奨はあくまで単語書きとり練習中心、その過程でCD音声や例文読解を取り込めば、総合的な学習になるだろう、という主張<ref name=":0" />。 しかし一方で、書き取り練習は、英単語を覚えるための効果的な学習法ではない、という主張と、それを支持する論文もある<ref>[https://www.jstage.jst.go.jp/article/cogpsy/2005/0/2005_0_104/_article/-char/ja/ 見崎研志, & 仲真紀子. (2005). 記憶促進における反復書記の有効性に関する検討. ''日本認知心理学会発表論文集'', ''2005''(0), 104-104.]</ref><ref>[https://www.jstage.jst.go.jp/article/cogpsy/2006/0/2006_0_171/_article/-char/ja/ 見崎研志, & 仲真紀子. (2006). 反復書記学習が記憶に及ぼす影響. ''日本認知心理学会発表論文集'', ''2006''(0), 171-171.]</ref>。 その場合は、こういうやり方がいいだろう。まず、英単語を見てその意味を思い浮かべる。思い浮かべた意味と真の意味が違っていたら、真の意味を覚えて次の単語に移る。これを覚えるまで何回か繰り返す。こういう学習法が最適だという主張もあります。 また、最近は英単語を覚えるためのスマホアプリなどが登場している。これらを活用することも有効な手段であろう。 実は世の中学習法については諸説紛々で、いろいろな方法を語る人物がいるから、学習者の自主的な判断、選択、発想が必要になるだろう。いろいろ試して自分自身で学習法を見出すことも重要だし、他者の意見を取り入れるにしても、種々の方法を併用して、学習法、勉強とは何かという事を発展的に考えていくことが大切だと思います。 単語学習の方法の視点として、学習するなら覚えるなら、重要度の高い単語から覚えていきたい、そういう考えがありますよね。 もちろん長文や、読解問題では、結局それほど重要だとみなされない単語が使われることも多いので、この視点がどれほど的を射ているかも一考の余地がある。 しかし高校入試の試験問題では、あまり馴染みのない単語には注釈がついている場合が多いので、学習重要語、記憶優先順位というのはやっぱりあると思います。 ただ大筋では、中学校重要単語、高校重要単語と、段階を示す事が出来るでしょうが、実際の試験問題でその分類が徹底的に守られるわけではないでしょう。例えば disappoint「がっかりする」や opinion「意見」などは一般的に、高校 2~3年で学習する単語だと見なされてれているようですが、事実上高校入試で使われている。とはいえほとんどの場合は中学生では難しすぎる単語として、注釈、解説はあるでしょう。 ところで前編集者はやたら中学範囲と高校範囲の分別にこだわるけど、そんなの最初っからあいまいなものでね。結局学校での学習内容なんて、学校により、クラスにより、それぞれ違うもので、あるクラスで学習したことが別のクラスでは学習しない、ある中学課程の本に書かれていることがあるクラスでは学習しない、あるいはその逆、そんなことはしょっちゅうだし、あって当たり前だよ。 そういう差異やあいまいさ、むらを踏まえた上で、統一の試験問題、選考方針で入学者を選ぼうというのが高校入試なんだよね。その差異や違いについていちいち理屈を言って、不平を言って議論するなんて、愚論の極みだろう。 しかもそうやって選考した結果が、絶対の人間判断基準でもない。入試に受かるのも人生なら、落ちるのも人生だよ。 さて、英単語学習の話に戻りますが、例えば中学校向けあるいは高校受験対策向けの英単語集で勉強する道もありますよね。 前編集者の推奨では、この手の単語集の学習では前半部分は飛ばして、と、いうのは、多くの初歩的すぎる単語は別の機会で学習している可能性が高いから、中間の単語から学習するのがいいようですね。そして最後まで学習したら最初に戻る…。あるいは前半部分はもうやらないで、より次の段階の、例えば高校で学習するような単語の勉強に向かうのもいいようです。 ==受験勉強の学習範囲== 前項でも書いたように、中学範囲、高校範囲と区別して、その違いにこだわることはあまり意味がないし、その区別も事実上あいまいだ。特に学習すべき単語については、明確に中学単語、高校単語と区別することは、ごく基本的な単語以外、はっきりしない、おおざっぱな物になるだろう。 公立高校の入学試験は、一般的に標準的、基本的な出題が多いので、英単語に関してもそんな難しい単語を使わず、学校教科書の範囲の単語が使用されると思われる。 近年は中学校英語で扱う単語数が増加しているようだ。しかし、基本的には学校で習う単語をよく理解して覚えておくのを現編集者は推奨するが、むしろ少し背伸びして手を伸ばして、高校1年向けの参考書(3000語程度)を学習するのも良いのではないか、という意見もある。 単語集は、高校受験用の単語集はもちろん中学校範囲の単語を扱っていますが、やはり依然として、高校初等の単語集にも手を出すことを勧める意見もある。 ただ県立・都立などの公立高校やごく普通の私立高校では、そんな難度の高い英単語は出てこないでしょう。国立大付属高校の試験でも、それほど英単語難度は高くないようだ。だから多少難易度の高い単語を使用するのは、私立の難易高入試でしょうね。 現編集者は、中学校時の学習は、中学校の範囲をじっくり良く理解すればそれで十分だと考えるが、いやそうではない、ある程度高校範囲を先行したほうが良いという主張も根強くある。ただその場合でも、例えば英単語において、高校3年くらいをターゲットにした難関大学受験用英単語を覚える必要はなく、せいぜい高校初歩、最基本英単語の理解で十分だろう。 前編集者は頑なに、英語の学校教科書と中学用単語集だけではやや受験対策として不足だと主張するが、本当だろうか? 現編集者は、中学生は高校受験も含めて、中学校の学習をしっかりすれば対策として十分だと考える。 と、言うか、それが十分なのに不合格にするような高校、行かなくてもいいのでは? ==難関私立高校== ……とは言え、難関私立高校入試では、英語試験問題としてかなりの難しい出題があるだろう。ある程度成績のいい子はそういう高校に行ってみたい、受験したいと思うだろうし、それは自然な希望だろう。 使用される単語、熟語も、かなり難しい言葉が使われる場合もある。 ただ現編集者は基本的に、優秀な人間の集まりとか、エリートの集まりとか、その辺の存在には全く興味がないので、この問題についてはほぼ何も知らないし語ることもない。だから、前編集をそのまま継承しつつ、幾つかの指摘をしておく。 まず、やはり使われる英単語の難度として、高いものになるだろうから、高校初等の単語集の学習は有用。 しかし、仮にその学習をするにした所で、高校初等重要語3000語を覚えればもう十分だと考えられる。 高校英単語4500語は覚える必要はないだろう。やはりある程度難易度の高い単語には解説がつく。 単語の他に、私立難易高では英作文の出題が目立つ。そのためには少しハードルを下げて、高校1800語をしっかり学習するとよいだろうという指摘がある。 しかしせっかく英作文をするなら、英米人が読んでも妥当な、自然な文章が書けると当然望ましいが、やはり初学者や中学生、ネイティブでもない日本人がいきなりそんな奇麗な文を書けるわけではないので、ある程度許容できると見なされれば、試験ではそこそこ点数になる。 基本的に高校入試とは、中学の学習に関する試験なので、まず中学校の課程をきちんと身に着けて理解することが重要だが、私立の難易高の場合は、少しそれより背伸びした学習も必要かもしれない。 == 文法 == === 一般 === 中学校レベルの英文法とはいうのは、実用英語でも確実に使う、基本的なものです。そもそも、そういう重要事項が中学レベルとして選ばれて教科書に掲載されています。なので、受験標準レベルの問題集なども活用して、確実に習得しましょう。 たぶん、不勉強な子供は、せいぜい中間期末対策のために学校の検定教科書にある英語の練習問題しか練習していなかったりするでしょうから、受験勉強としては中学3年になったあたりからでも簡単な問題集でよいので自発的に文法問題あるいは基本的な語法問題などを練習するだけで、標準レベルの受験なら対応できると思います。 また、文法の予習などをしてあるなら、高校受験用の問題集で練習してしまうのも、良いかもしれません。 === 古い参考書 === 古い参考書などはカリキュラムの変更などに伴い、現在の高校入試に適切なものではない可能性があるため、現在のカリキュラムに合った参考書を購入したほうがいいだろう。 === 私立対策 === 英単語だと、私立高校などでよく高校レベルの単語を出す高校もあるのですが、しかし文法となると、あまり高校入試では先取り学習を要求しないのが通例です。もしかしたら若干、中学で習わなかった文法でも要求する高校があるかもしれませんが、しかしおそらく高校受験用のやや発展的な一般的な新しい参考書などで対応可能でしょう。 現代では中学生むけの参考書も充実していますし、わざわざ高校生むけを買う必要もうすいです。 ;高校の参考書は必要か不要か 高校の参考書は、やさしい参考書であるなら実は2020年代の現代では中学生でも読めますが(1990年代は高校で教えていた仮定法や無生物主語なども、2020年代では中学で仮定法および無生物主語を習うようになったので、現代ではあまり中学英文法と高校英文法との分野の違いは無い)、高校受験の時点で、わざわざ高校生むけの文法参考書を買う必要は無いでしょう。 それでも買いたければどうぞ自己責任で。 ;英検2級レベルの文法問題について 英検準2級が、(仮定法ではなく一般の)過去完了や未来完了など、やや複合的な文法を扱います。もしかしたら、英検準2級程度の文法があると、読解しやすい問題を出す私立高校もあるかもしれません。ただし書店の英検コーナーで探しても、英検の参考書ではあまり文法の解説が充実していないので、代わりに高校生向けの参考書のうち、やさしいレベルのものを通読することになるでしょうか。(高校では文法参考書は、学年別には分かれていません。) どうしても高校受験の段階で文法を先取りするなら、英検準2級程度で十分でしょう。 なお、準2級ではない英検2級の文法事項は、おおよそ高校3年間の範囲です。 私立高校とはいえ、高校入試で仮に仮定法過去完了が出たとしても、推測ですが、せいぜい長文読解などでチラっと出てくるくらいとかで、特に細かい文法知識を要求する設問ではなく、おそらくはおおよその意味を把握するような問題でしょうか。 だとしたら、せいぜい文法参考書を通読するくらいで十分です。 == 発音 == 発音に関しては、各種参考書や問題集などに乗ってる発音記号や音源などを参考にすればよいだろう。 英単語の発音がわからないとリスニングができないし、スピーキングや実用的な英語会話をしようというときに障害になる。 前編集者は発音の詳細にこだわるよりは単語熟語を覚えるほうが優先だろうと書いているが、高校入試だけに目的を特化する限りは、現編集者も特に異議を述べるつもりはない。 == リスニング == 都立共通問題英語ではリスニング問題が出題されます。おそらく他県でもリスニング問題は出題されるはずです。 リスニング問題の対策について、リスニング問題には、やはり、日常的に英語教材を聞くというのが一番効果的です。参考書付属のリスニング対策音声を聞くなどして対策しましょう。 YouTubeなどで検索すれば、実際に話されている生の英語をいくらでも聞くことができますが、しかし中学生では語彙や文法の面で、いきなりネイティブの英語を聞き取るのは難しいと思います。もちろん、英語力にとても自身のある人はチャレンジしても構いませんが、しかし高校レベルの単語すら習得できていない中学生の多くにはYouTubeなどは非実用的です。 まず、高校レベルのリスニング教材を習得してからでないと、YouTubeなどに深入りしても、時間の無駄になります。 中学レベルでは、せいぜい、YouTubeの英語動画で英会話の雰囲気を掴んだり、実際の英会話のスピードを知るための参考としてYouTubeなどを視聴してみるぐらいが関の山でしょうか。 なお、前編集で、発音の教育が日本では軽視されてきたという主張があったのですが、間違いです。 CDどころかカセットテープすらも無かった明治や大正の時代、その代わりに国定教科書などで長々と発音の説明しています。「近代図書デジタルアーカイブ」という公共サイトに戦前の教科書があるので、それが証拠です(中高生の人は読みにいく必要ありません)。 ともかく、最近の動向として、リスニングも重視されるようになってきています。 なので、バランスよく勉強しましょう。もちろん、リスニングばかりを勉強して、書き取りも英作文もできないのでは本末転倒で、それはそれで困りますし、海外での実用性も乏しいでしょう。海外でも英作文や読み書きは必要なはずです。 なので、高校受験英語の勉強では、要するに普通に英単語の勉強などと併行して、リスニング教材なども勉強すればいいだけです。 == スピーキング == 都立高入試では、2023年度からスピーキングテストが導入されます。おそらく、他県でもスピーキングテストが導入されるようになるのではないでしょうか。 == シャドーイング == シャドーイングとは、英語を「聞こえたままに」発音する練習方法です。英語の音についての理解が深まるので、リスニングやスピーキング対策に適しています。英文は何でもいいので、手頃なリスニング問題の音声からシャドーイングしてみましょう。また、慣れてきたら英語の曲をシャドーイングしてみるというのもいいでしょう。受験勉強の息抜きにもなりますし、楽しみながら学ぶというのも大切です。 == 英検 == 英検を取っておくと高校受験において有利になる可能性があります。 東京都の場合、英検3級以上を取っておくと、私立併願や推薦で内申点を加算されるところが多いです。加算される点数は1点の場合が多いですが、加算方法や加算基準は高校により異なるので、公式HPや学校見学などで事前に確認しておきましょう。 英検3級以上は英語で面接官とのインタビューがあるので、英検を取得する場合、その対策が必要になります。 都立高一般入試の場合は英検取得が受験に有利になることはありません。 しかし、推薦の場合は都立私立どちらとも、英検はアピールポイントになるでしょう。 結果的に、英検を入試で使わなかったとしても、英検取得は英語学習のモチベーションになりますし、今の自分にどのくらいの英語力があるか分かったり、今後の英語の学習の指針になったりするので、余裕があれば受験したほうがいいでしょう。 なお、かつて俗に「英検3級が中学卒業レベル、標準的な高校受験レベル」みたいに言われていましたが、あくまで大まかな目安にすぎず(それもかなり大まか)、実際には出題傾向の違いもあり、英検と高校受験では単純には換算できません。なお近年、中学英語の教育範囲が変わり、今まで高校レベルで教えていた文法の一部(たとえば仮定法など)が中学に前倒しになったので、もしかしたら英検3級では高校受験対策としては不適かもしれません。(英検準2級程度のほうが文法的には近いのかもしれません。) ともかく、一般入試を受けるなら、英検よりもまずは高校受験そのものの対策をするのが優先事項です。英検の対策ばかりして肝心の高校受験英語の勉強をしなければ、一般入試での高校受験英語の成績は当然ながら悪化します。なので、志望校への推薦合格などが確実で無い限りは、あくまで英検対策は補助にするのが安全でしょう。 [[Category:中学校教育|がくしゅうほうほうこうこうじゅけんえいご]] [[Category:学習方法|がくしゅうほうほうこうこうじゅけんえいご]] iz9w3too6ktkdumalrshqshfbnw8wre 学習方法/中学校英語/辞書 0 21965 205586 205083 2022-07-20T15:59:30Z Nermer314 62933 /* 辞書を選ぶ */ wikitext text/x-wiki ==辞書を選ぶ== 英語の辞書の一番基本的な 3つを挙げると、英和辞典(えいわ じてん)、和英辞典(わえい じてん)、英英辞典(えいえい じてん)、に、なります。 英和辞典は、英語で引いて、その単語の日本語訳を知る、まずその英単語のつづりでスタートですね。つづりを頼りに意味を調べる。英単語の順序は、ABCD順に掲載されています。 和英辞典は国語辞典のように日本語で引くと、対応する英単語、表現が書かれています。単語・表現の順序は、国語辞典と同じ、「あいうえお」「あかさたな順」に掲載されています。 英和辞典と和英辞典が一冊に、二部構成の辞書もあります。 中学校ではこの英和・和英辞典を手に入れるのもいいですが、やや詳述した辞書が欲しいなら、それぞれ持ってもいいと思います。学校で指定して購入する場合も多いですね。 英英辞典に関しては、英語で引いて英語の解説があるので、英語の国語辞典ですよね。あらゆる言語使用者が英語学習のリファレンスとして使えますが、中学生が使うことはあまりないように思えます。高校生でも使うのはかなり難しい。 和英辞典より英和辞典の方が辞書として優先でしょうね。なんだかんだで英和辞書しか持ち合わせていない事は結構ある。 中学生・高校生用の学習辞書として、市販のもので、ジーニアス英和辞典、プログレッシプ英和辞典、ライトハウス英和辞典などが有名。 リーダーズ英和辞典というより進んだ辞書もあるが、英語を専門に扱う者向けに書かれていて、やや高価で、大冊で持ち運びには向かない。 電子辞書でもいいでしょう。上に示した辞書の電子版がある場合もある。ただ、電子辞書は画面が限られていて、内容が多い場合はスクロールして読むが、そのスクロールを億劫がる生徒が多いという指摘がある。 また、インターネットで使える辞書として有名なものに、[https://ejje.weblio.jp/ Weblio辞書]や[https://eow.alc.co.jp/ 英辞郎]などがある。紙の辞書が手元にない場合などはこれらを活用することも一つの手であろう。 ==辞書を使う== まず英和辞書はわからない単語を引いて調べるために使う。ほぼ当たり前の指摘ですが、引いた場合かなりいろいろなことが書いてあって、それを全部読むのかという問題がある。詳しい辞書ほど記述が多いし、それを長々読んでいると、本題がおろそかになって、そもそも何をやっていたんだろうという事になってしまいます。 ですからその辺はそれぞれの学習者の匙加減ですね。引くたびにすべての記述をいちいちすべて読んでいる学習者は一人もいないでしょう。 余談ですが、現編集者が大学4年の時、非常に薄い簡単な辞書を使って専門の英語の研究論文を読んでいたら、先輩が、お前の辞書良くないな、もっと詳しいいい辞書いっぱいあるだろう、それを買えよ、と言われたことがあります。しかし実は私のほうは不満があって、そもそも詳しい辞書は持っているけど、それで論文を読んでいると辞書の単語の詳しい記述のほうに気を取られて、なかなか本題の論文の読解が進まないから、あえて小さな辞書を使っていたんですよね。ですから正直、うるせーなー先輩風吹かすなよ、と、その時思いました^^;;;。 そして、調べるためではなく、新たな単語を学習し、覚えるためには辞書は使わない方が良いという指摘があります。 推奨としては、参考書や教科書ガイドの記述から、単語を覚える。単語集というのもありますが、これは中学3年生以降、高校にわたって活用するのが推奨です。 辞書は基本的に単語、英語の意味を調べるときに使う。ただ多くの辞書には重要語に印がつけてあったり、大きい活字で書いてあったりと、重要語が段階的にわかるようになっている。ですからそのことを上手に利用し、学習過程で混乱して迷走しないように勉強するなら、辞書を使った単語学習、記憶学習も成り立つ可能性はありますが、前編集者は基本的に辞書は単語学習に使わない方が良いという主張です。 ==参考:フリーの辞書について== 中学生の英語学習としては、市販の辞書を利用するのが推奨です。 しかし何らかの理由で、インターネット上の無料の辞書を使いたいなら、いくつかありますし、ここでは edict というページを挙げておきます。[https://www.edrdg.org/jmdict/edict.html EDICT] これは和英辞典ですが、通常のテキストファイルで書かれているため、検索の仕方を工夫することで、英和辞典として用いることも出来ます。ただし、例文や語法、発音などの情報が不足しているため、市販の辞書をうまく組み合わせて用いることが重要です。 1i3bnkkbu3yhr2rtc3ja74snzantghr 中学校社会 公民/検定教科書で紹介されている時事、大衆娯楽、企業名など 0 22300 205584 205573 2022-07-20T13:13:41Z Nermer314 62933 中学の公民教科書に高校の理科教科書で書かれている話題を紹介することには疑問が残る。後半部分については論理がめちゃくちゃなので削除。 wikitext text/x-wiki つぎのものは、検定教科書でも紹介されている。 {| class="wikitable" style="float:right" |+ ! !! 日本 !! 世界 |- |1945年 || ポツダム宣言を受諾 || |- |1946年 || 日本国憲法公布 (47 施行) || |- |1949年 || || NATO成立<br />中華人民共和国成立 |- | |- |1950年 || || 朝鮮戦争 |- |1951年 || サンフランシスコ平和条約調印<br />日米安全保障条約調印 || |- |1954年 || 第五福竜丸が被爆<br />防衛庁設置 || |- |1955年 || || アジア・アフリカ会議 |- |1956年 || 日ソ共同宣言<br />日本が国際連合加盟 || |- |1958年 || インタントラーメン発売 || |- | |- |1960年 || 日米'''新'''安保条約調印 || |- |1962年 || || キューバ危機 |- |1965年 || 東海道新幹線開通<br />東京オリンピック || |- |1967年 || || ヨーロッパ共同体(EC)発足 |- |1968年 || GNP資本主義国2位に || 核不拡散防止条約 |- |1969年 || 日韓基本条約調印 || アメリカの宇宙船アポロ11号が月面着陸 |- | |- |1970年 || 大阪万国博覧会 || |- |1972年 || 沖縄が日本復帰<br />日中国交正常化 || |- |1973年 || || 第一次石油危機 |- |1973年 || コンビニエンスストアが開店 || |- |1978年 || 日中平和友好条約調印 || |- |1979年 || 東京サミット開催 || 米中国交樹立 |- | |- |1980年 || 自動車の生産台数が世界1位に || イラン・イラク戦争 |- |1982年 || 参院選で比例代表制導入 || |- |1983年 || 東京ディズニーランドが開店<br />ファミコン発売 || |- |1984年 || 日本の平均寿命が世界1位に || |- |1985年 || 男女雇用機会均等法公布<br />電電公社が民営化してNTTに || |- |1986年 || 牛肉・オレンジ輸入自由化 || チェルノブイリ原発事故 |- |1987年 || 国鉄分割民営化でJR発足 || 米ソ、中距離核戦力全廃条約調印 |- |1988年 || 青函トンネル、瀬戸大橋の開通 || |- |1989年 || 消費税の導入(当時の税率3%) || ベルリンの壁崩壊 |- | |- |1991年 || バブル経済崩壊 || ソビエト連邦解体<br />湾岸戦争 |- |1992年 || PKO協力法成立 || 国連環境開発会議 |- |1993年 || Jリーグ開幕<br />連立政権(細川内閣) || ヨーロッパ連合(EU)発足 |- |1995年 || 阪神淡路(あわじ)大震災、地下鉄サリン事件 || |- |1996年 || DVD発売開始 || |- |1997年 || クローン羊ドリーの誕生が発表される || 香港、中国に返還 |- |1998年 || 長野冬季オリンピック<br />日本で「環境ホルモン」の害が話題になる || |- | |- |2001年 || || アメリカ同時多発テロ |- |2002年 || 日韓共催サッカー・ワールドカップ<br />日朝首脳会談、<br />一部の拉致被害者が帰国 || |- |2003年 || || イラク戦争 |- |2004年 || イラクで自衛隊が復興支援 || スマトラ沖地震・津波 |- |2005年 || 愛知県で万博(愛・地球博)<br />道路公団民営化 || |- |2008年 || 国民投票法の成立、郵政民営化 || |- |2008年 || 洞爺湖(とうやこ)サミット || 世界金融危機 |- |2009年 || 新型インフルエンザの流行<br />民主党連立政権 || |- |2011年 || 東日本大震災、福島第一原子力発電所で事故 || |- |} == 未分類 == * リーマンショックとサブプライムローン問題の関係 2007年までアメリカ合衆国の大手証券会社のリーマン・ブラザーズが、アメリカでの低所得者向け住宅ローンのサブプライムローン関連の金融商品などを大量を扱っていたところ、2007年のサブプライムローンの破綻により、リーマン・ブラザーズが巨額の損失を抱え、そして2008年にリーマン・ブラザースが経営破綻したという経緯である。このリーマン・ブラザーズの破綻をきっかけに、世界的な不況になった(※ なお、リーマン・ブラザーズの会社の種類が「証券会社」なのか「投資銀行」なのかは、文献によって記載が異なる)。 == 高度経済成長の消費文化 == : 1958年のチキンラーメン : 日清のカップヌードル 1971年 :安藤百福(あんどう ももふく)『魔法のラーメン発明物語』日本経済新聞社 安藤百福は、インスタントラーメンの発明者で、日清食品の創業者。 :レトルト食品の誕生、ボンカレーが1968年に登場 :少年マガジンの1959年の創刊(教科書では写真あり)、少年サンデーの創刊 :1970年の大阪万博 :ファミコンの1983年ブーム :「鉄腕アトム」が1952年に連載開始。 == マンガ、アニメなど == :「ドラえもん」 :犬夜叉、ワンピース、ナルト、(日本のマンガ・アニメが外国でも人気の件、写真などで検定教科書では説明) キャリア教育などの単元で、職業の例として、アニメ声優(東京書籍が紹介)とゲームクリエイター(日本文教出版)を紹介している教科書もある。 ゲームクリエイターが分業制であることを紹介している。「プログラムを書く人、キャラクターデザインをする人など、さまざまな専門分野に分業して作られえ地増す」とある。 == 製造業など == :ヘラ絞りの北嶋絞(きたじましぼり)製作所 国産ロケット「H2」の補助ロケットの先端部分が、ここの製作所の職人による、金属板に棒を押し当てて丸い形状の板をつくる「ヘラ絞り」加工で生産されている。 :「ゆるまないナット」、※ H社とのこと、(おそらくハードロックナット) :「まいど1号」、大坂の町工場、しかし不況により活動停滞の件も記述あり。 :液晶テレビ、プラズマテレビ == ビジネス用語 == :「牛丼チェーン店」という用語。「チェーン店」という言葉を知ってるリテラシー。「牛丼」(ぎゅうどん)という国語力。 :「外食チェーン」 :コンビニの'''POS'''システム :コンビニなどの「フランチャイズ」店、(チェーン店との違いも) == 2006年の会社法 == 1円起業が認められた。 取締役は1人でもよくなった(それまでは取締役3人と、監査役1人)。 == 消費者リテラシー == :国民生活センターと、地方公共団体の消費生活センター :「クレジットカード」、「プリペイドカード」、「電子マネー」 クレジットカードは後払いであり、つまり借金である。 :(※ 範囲外: )世間には時々「クレジットカードは借金ではない」と言う人がいて、その論拠として「クレジットカードによる買い物は、銀行口座から預金を引き落としているだけである。銀行残高の範囲内の買い物であれば、借金ではない」という人がいる。 :※ 全国銀行協会連合会も、クレジットによる買い物は「借金」だと明言している<ref>[https://www.zenginkyo.or.jp/article/tag-d/8079/ 『ローンやクレジットを使い過ぎないための7つのポイント - 全国銀行協会』] 2019年2月24日に閲覧して確認</ref>。 :正確にいうなら、クレジットカードによる買い物は、法律上はおそらく「金銭債務」(きんせん さいむ)に分類されるだろうが、しかし中学の範囲を超えた概念なので、中学段階では「クレジットは借金」と認識してよい。 プリペイドカードは前払い。図書カードなどもプリペイドカード。プリペイドカードには、たいてい、割引(わりびき)などが付いている(もし、割引がついてないと、カードは使用可能なお店が限られたりするので、お金のままで持つよりも損をしてしまう)。 電子マネーについて、Suica(スイカ)などの画像が検定教科書にあり。また、鉄道会社が定期券を、IC(集積回路)の組み込まれたカード化をして、それに電子マネーの機能も持たせていて、駅構内の買い物などに使えるようになっている。 :「自己破産」 :'''ATM'''、「現金自動預払機」(げんきんじどう あずけばらいき) なお、ATMで使うカードは、「キャッシュカード」。 == 未分類 == 自動車の購入について、日本政府は、環境保護のため、電気自動車やハイブリッドカーなどのエコカーの購入に補助金を出している('''エコカー補助金''')。 :アムステルダムや名古屋市の「ロードブライシング」 : :「北九州市」の「エコタウン」 :環境問題で、2009年の鳩山の国際公約の25%削減の件、(温室効果ガス削減の件) :東京モーターショー(2009年、千葉) :発光「ダイオード」の裁判の金額の件、 :トランスミッション、パワーステアリング(自動車産業の国際分業化の件、検定教科書では画像で紹介してるので、自動車工学を知らなくても分かるようになってる) :ASIMOの写真、二足歩行ロボット == 金融 == === 株価 === :始値(はじめね) :終値(おわりね) :安値(やすね) :高値(たかね) :日経平均株価、(画像で紹介されている) === 平成バブル === 「バブル」 bubble とは「泡(あわ)」という意味。1990年から2000年まで「失われた十年」と言われた。バブル経済(bubble economy <ref>小森清久 ほか編著『新版完全征服 データベース5500 合格英単語・熟語』、桐原書店、2019年2月10日 第41刷発行、P.328</ref> )が崩壊してから、企業への銀行からの融資の条件がきびしくなり、そのような銀行の態度が「貸し渋り」(かししぶり)と言われた。このため、資金ぐりに行き詰まって倒産した企業も多い。 かといって、銀行側も経営が苦しく、資金の回収のめどが無い会社に貸すわけにはいかない。実際に銀行ですら、1997年には、いくつかの銀行が破綻している。北海道拓殖銀行(ほっかいどう たくしょくぎんこう)や、日本長期信用銀行(にほん ちょうきしんようぎんこう)などが、1997年に破綻した。もっとも、バブル崩壊後に、銀行は国から救済のための公的資金を受け入れており、公的支援を受けていながら貸し渋りをするのは問題行為だろうという意見もある(検定教科書にも、そういう意見が紹介されている。教育出版など)。 === その他、金融コラムなど === クラウドファンディング(Crowd Funding)について、ある検定教科書で紹介されているらしい<ref>[https://www.jsda.or.jp/gakusyu/edu/web_curriculum/images/mailmagazine/Vol.146_20200827.pdf 『5分で話せる金融経済「新しい教科書で中学校の経済の授業はどう変わる?②」 - Vol.146_20200827.pdf』]</ref>。クラウドファンディングの手法で集めた資金で製作されたアニメ映画についても言及しているらしい。 また、出典とは別情報源だが、帝国書院の中学公民の教科書でアニメ映画『この世界の片隅に』がクラウドファンディングで製作されたことが照会されているとのこと。 Crowd とは群集、Funding とは資金の意味。 インターネット技術のCloud (雲)とは別の単語なので混同しないように。 == 通信 == :「ショルダーホン」、「ポケベル」などの昔の無線通信ツール :1930年代の電話交換手の写真画像も、検定教科書にあり。 :そして、GPS機能付の現代の携帯電話へという紹介の流れ。(以上、東京書籍の公民教科書にて) :「NTT」および「NCC」「(KDDI、日本テレコムなど)」 == バイオテクノロジー == :植物工場 :バイオマス発電 :青いバラ(遺伝子組み換え) == 未分類 == :「経理」、「総務」、「営業」 (株主会社について) :デフレスパイラル :行政機関情報公開制度、2001年 :新日鉄・住金、三洋子会社化(パナソニック傘下に)、などの大型合併 :マオリ族のあいさつ、鼻と鼻をこすりつける :沖縄のゴーヤーチャンプル、エイサー(踊り)、紅型(びんがた)、 :アイヌのチェプオハウ(スープ料理)、アットゥシ(衣装)、 :兌換(だかん)紙幣 :フランスの公立学校での(イスラム教徒の)スカーフ着用禁止の件 :モスクなどの幾何学模様、「アラベスク」 * 日本の地域の文化 :ヨサコイ祭り :「YOSAKOIソーラン祭り」、高知市のヨサコイ祭りと北海道のソーラン祭りが合体 :「津軽三味線」(つがる しゃみせん) :ユニクロでは、不要になった衣料品を回収してリサイクルしているとのこと。 :シルバー人材センター :バレーボールのルールの歴史、(きまりとは何か、)ちなみにアメリカのモルガンが1895年にバレーボールを考案とのこと :2011年のエジプトの政変 :アメリカの「sushi」寿司 :イタリアのサッカーチームで活躍する日本人 :フェアトレード フェアトレード(fair trade<ref>高等学校英語 検定教科書『FACTBOOK English Logic and Expression I』、令和3年5月 文部科学省検定済、令和4年2月25日発行、P121 </ref>)とは、発展途上国では、たとえば児童などが違法に低賃金で酷使されていたりするので、そういう商品を買わないようにしよう、という運動である。 だが、「具体的に、どういう商品が違法に生産されているか? どうやって、それを見分けるか?」は消費者からは分かりづらいので、「発展途上国の商品を買うときは、適正な価格の商品を買いましょう」という運動になっており、高校の検定教科書でも、そういう風に「適正価格がどうこう」な感じで紹介されてしまっている。どうやって適正な価格であることを調べるかについては、中学高校の教科書・参考書では言及されてない。 :マイバッグ :グリーンカーテン - 植物によって日差しをさえぎり、エアコンの電力消費を抑えるなどして、環境にやさしい。 :ストリートチルドレン :メーデー : :中村哲(なかむら てつ) - 医師。アフガニスタンで難民の医療を行っている。 [[File:Wangari Maathai in Nairobi.jpg|thumb|ワンガリ=マータイさん]] :'''ワンガリ=マータイ'''さん、「MOTTAINAI(もったいない)」の人。 [[File:Sadako Ogata - World Economic Forum on Africa 2008.jpg|thumb|緒方貞子 - 国連の難民保護の責任者として、1991年から10年間、活動していた。2003年から11年までは国際協力機構(JICA、ジャイカ)理事長。 ]] : :国連高等難民弁務官事務所(こくれん こうとう なんみん べんむかん じむしょ) (英略称: UNHCR)- 本部はジュネーブにある。緒方貞子が国連難民高等弁務官を1991年から2000年まで務めた。 :EU大統領のファン=ロンバイ :長崎市の'''平和記念式典''' :原爆ドーム、広島県 広島市 [[File:Cornerstone of Peace.jpg|thumb|平和の礎(いしじ) (沖縄県 糸満市(いとまんし))<br />沖縄戦で亡くなった戦没者の氏名が刻まれている石碑(せきひ)。]] :「あたらしい憲法のはなし」、文章の抜粋 :「立憲主義」 :'''ワイマール憲法'''と社会権 :ボルテールとバスティーユ監獄 :薬局の距離制限の撤廃の件、1975年の最高裁判決により撤廃 :「水俣メモリアル」(水俣病の慰霊施設) == 福祉 == :補助犬(ほじょけん)、介護犬、盲導犬(もうどうけん)、 :2002年の身体障害者補助犬(ほじょけん)法 :「デイサービス」、「ケア マネジャ」 :介護福祉士、訪問介護員(ホームヘルパー)、社会福祉士 :'''ハンセン病'''、「らい病」、「らい病予防法」の欠陥、 * 医療関連 :着床前診断 :臓器移植法、2009年の改正内容 :薬のインターネット販売の議論 [[File:臓器提供意思表示カード(表面)2.jpg|thumb|臓器提供意思表示カード(表面)]] [[File:臓器提供意思表示カード(裏面)2.gif|thumb|臓器提供意思表示カード(裏面)]] :臓器提供意思表示カード、いわゆる「'''ドナーカード'''」 {{-}} ドナーカードの文面: ---- :<span style="font-size: larger;">(1,2,3) いずれかの番号を○で囲んでください。)</span> :<span style="font-size: larger;">1. 私は、<span style="color:red"><span style="text-decoration:underline">脳死後及び心臓が停止した死後のいずれでも</span></span>、移植の為に<br />  臓器を提供します。</span> :<span style="font-size: larger;">2. 私は、<span style="color:red"><span style="text-decoration:underline">心臓が停止した死後に限り</span></span>、移植の為に臓器を提供します。</span> :<span style="font-size: larger;">3. 私は臓器を提供しません。</span> :(1 又は 2 を選んだ方で、提供したくない臓器があれば、×をつけてください。) :::【 心臓 ・ 肺 ・ 肝臓 ・ 腎臓 ・ 膵臓 ・ 小腸 ・ 眼球 】 :〔特記欄 :                               〕 :署 名 年 月 日 :<span style="text-decoration:underline">  年  月  日</span> :本人署名(自筆) :<span style="text-decoration:underline">         </span> :家族署名(自筆) :<span style="text-decoration:underline">         </span> ---- 日本では2009年の臓器移植法(ぞうき いしょくほう)の改正により、本人の意志が不明でも、家族の承諾があれば、脳死での臓器提供ができるようになった。また、15歳未満の子どもからも、家族の承諾で脳死での臓器移植が可能になった。また、健康保険証や運転免許証にも、近年では、臓器提供の意思表示を記載できるようになっている。なお、目の角膜なども移植の対象になっている。マスメディアなどでの議論では、「脳死は、その人の死か?」という論点がある。 :臓器移植の論点 ::賛成の意見 ::反対の意見 [[File:Grameen Yunus Dec 04.jpg|thumb|マハマド=ユヌス]] :グラミン銀行、「'''マイクロクレジット'''」という用語、2006年ノーベル平和賞、ムハマド=ユヌス ダッカ事業はムハマド=ユヌスのグラミン銀行の融資によるMITメディアラボ、ペンシルベニア大学、キーランティンバーレイク建築設計事務所、社会学者の松本良多の協働で推進された開発事業計画がある。 ムハマド=ユヌスはバングラデシュの経済学者。 :「気候にかんする政府間パネル(IPCC)」 :アル・ゴア 元アメリカ副大統領 が温暖化問題の啓発活動の業績にてノーベル平和賞を2007年に受賞。 :佐渡トキ保護センター :ハリケーン、干ばつ、サンゴの白化、 : :2002年のSARS(サーズ、重症急性呼吸器症候群)、 :2009年の新型インフルエンザ。この年、成田空港では新型インフルの検疫も大規模に行われた。 :朝日新聞、毎日新聞、読売新聞、および、新聞によって論調が違うというメディア・リテラシー :湾岸戦争のときの水鳥の写真の件 :スイスの直接民主制 - スイスの一部の州では直接民主制が行われてる。挙手で、多数決の数を数える。 :ローマクラブ『成長の限界』、1972年 :気象衛星「ひまわり」、JAXA :国際宇宙ステーション、野口聡一(そういち)さんの長期滞在 :リニアーモーターカー、山梨県 都留市(つるし) :野田・元総理 :'''アウンサン=スー=チー'''、「軟禁」という用語 [[File:Martin Luther King Jr NYWTS.jpg|thumb|キング牧師]] :'''キング牧師'''、ワシントン大行進。黒人解放運動のえらい人。英語の教科書に「I Have a Dream」(私には夢がある)などの記述あり。 [[File:MotherTeresa 094.jpg|thumb|マザー=テレサ]] :'''マザー=テレサ''' :「アファーマティブ アクション」 :「ポジティブ アクション」 なお、アファーマティブはアメリカ系の表現、ポジティブはイギリス・欧州系の表現である(※どこかの高校教科書にそう書いてある)。 ポジティブアクションの例として学生に身近なのは、大学の「女子大」であろうか。(ただし、日本で女子大が出来たときには、まだ「ポジティブアクション」の言葉はなかったが)。 日本の文部科学省の管轄の大学に、「女子大」はあっても「男子大」はない。(なお防衛大は文科省ではなく防衛省の管轄なので、問題を簡単にするため、この話題では考えないとする。) ともかく、いわゆる「女子大」は、日本では歴史的には、先に男子の大学教育が出来てから、あとから女子にも大学教育を与えるべきだという理念にもとづいて行われた措置なので、「法の下(もと)の平等」の侵害には当たらないとされている。(教育出版の高校「公共」教科書の見解。) なお現代でも、共学の学校でも、いくつかの大学で(いくつもの大学で)、いわゆる「女子枠」というものが公言されたが、しかし受験の男女の機会均等の問題もあるので、たとえばある有名大学(T大学)では得点の加算は行わずに家賃補助など学費の優遇だけに留めるなど、抑制的な例もある。 ほか、K大学が、女子だけの入学定員を用意しようとしたが、しかし「法の下(もと)の平等」の件からの反対意見が多く、中止になった。 逆に、「女子差別」とマスコミなどで話題になった例だが、ある医大で、女子の入学者を減らそうとして、面接などで意図的に低い採点をして女子を減らしていたことが発覚した。その医大がそうしたことの背景には、せっかく女子の医者を育成しても、皮膚科・眼科や小児科に片寄ったりする統計的な事実があるなどの医学特有の事情もある。救急医療などの過酷な現場は、男性の医者が多いのが今のところは現実である(※ たとえば、月経などのタイミングで急患が来た場合の問題など、リアルな問題が色々とあるだろう。人手を増やそうとしても、それには予算の増額が必要であり、つまり国からの医療費の援助が必要だが、私たちが払える医療費にも限界がある)。 :※ なお、高校の教育出版「公共」の教科書に医大の地域枠や女子定員の問題が取り上げられている。 ※ 日本のばあい、中学・高校は基本的に男女の定員が同数だが、しかし大学はそうではない。大学には基本、男女別の定員は無い。 ※ 日本の場合、学部によっては、男女比が片寄っているのが現実である。理系や難関大学は男が多い傾向がある。(※ 教育出版の見解) 医大学側の経営の裁量もあるので、私たちが口出しをできることではないかもしれない。だが他人事とは考えず、医療費を増やす決断をするのか、それとも女性の医者はある程度は制限を受けることは仕方無いと考えるのか、色々と考えざるを得ないだろう。 性別の例ではないが、関連しそうな実例として、たとえば医大には「地域枠」という制度があり、医師不足が問題になっている地域の医大において、地元・近隣の受験生を優遇して得点加算などをする措置が、女子定員の問題になった医大だけでなく、多くの地方の医大で行われている。 この「地域枠」だって、地域外の受験生は、受験の成績が良くても、やや成績の劣る地元の受験生に入学枠をうばわれてしまう結果になっているわけである。しかしそれでも、地域の医師不足という問題を是正するために、他地域の受験生には我慢してもらっているわけである。 このように、なにかの差別や片寄りを是正しようとすることは、ほかの何かに負担を要求することでもある。そういったことを自覚した上で、その是正措置を導入すべきか、それとも導入しないのかを、私たちは、いろいろと考えていかなければならないだろう。 ※ 文献などは確認してないので正確な記述ではないが、「アファーマティブ・アクション」や「ポジティブ・アクション」とは、少数派や現状での不利益層のこうむっている格差是正のために、多数派や現状での利益層の不利がやや大きくなってでも介入すること。「積極的格差是正」などと翻訳されることも多い。実際にネット検索で「積極的格差是正」で検索しても、たとえば公的機関である内閣府のwebサイトが出てくる(たとえば[https://www.gender.go.jp/research/kenkyu/ishiki/kekka53.html 『ポジティブ・アクション(積極的差別是正措置)に対する意識』Copyright 2016 Gender Equality Bureau Cabinet Office.] 2022年2月21日に閲覧して確認)。 検定教科書では紹介していないが、かつて「ネガティブ・アクション」という用語があったはずなのだが、しかし意味が多義的であり、論者によって異なる意味で使われるので混乱があり、現代では用いないほうが安全だろう。(なので当然、検定教科書でも「ネガティブ・アクション」を紹介していない。) 英語圏では現代、差別的措置という意味で negative action ネガティブアクションという用語を用いているサイトもある。だが、かつては、自由競争を重視した限定的・弱めの格差是正という意味でネガティブ・アクションと言う用語が使われたこともあり、そういう弱めの是正介入がよく「消極的格差是正」などと和訳されていた。(1990年代の昔は普通に『イミダス』だったか『現代用語の基礎知識』あたりに、ポジティブアクションの対比としてネガティブアクションも紹介されていたような気がするのだが…。) 現代でも、上述の内閣府のweb資料にあるアメリカ人の意識調査の結果での、ポジティブアクション反対者のかかげる主な反対理由 ※ 以下、引用 <pre> ○アメリカでは、「自由な競争を妨げ、社会や企業の活力を損なう恐れがあるから」、「女性が優遇される結果、同じ能力を持つ男性が差別されるから」を挙げた者の割合が高い。 </pre> ※ 以上、引用 に、かつての1990年代にあっただろう「消極的格差是正」の議論の名残りが、うかがえる。 こういう混乱があるので現代では「ネガティブ・アクション」の用語は使わないほうが良いだろう。しかし、「消極的格差是正」の概念は消えたのに、一方でポジティブアクションの和訳である「積極的格差是正」の和訳の言葉だけが残りつづけており、なんとも意味不明な状況になっている。 さて、日本では、厚生労働省などが「男女共同参画社会」などの政策においてポジティブ・アクションの方策を打ち出している。だから教科書にも書かれるのだろう。 だが、何も男女格差の問題だけでなく、たとえば移民問題などでもこれらの格差是正のありかたは議論になる。実際、例えば文献『社会学のエッセンス』(有斐閣)<ref>友枝敏雄 ほか著『社会学のエッセンス 新版補訂版』、2018年8月5日 新版補訂版、P236</ref>を見れば、移民問題についてのイギリスにおけるアファーマテイブアクションの採用およびフランスにおける不採用の成果が両国とも芳しく(かんばしく)ないことを論じている。 フランスは移民問題で、たとえば公立学校でイスラム教徒の女子がスカーフをするのを禁じており、イスラム教徒を追放した。これは文献『社会学のエッセンス 新版補訂版』によれば移民問題においては、アファーマティブ・アクションを採用していないことになる<ref>友枝敏雄 ほか著『社会学のエッセンス 新版補訂版』、2018年8月5日 新版補訂版、P236</ref>。このフランスの例のように、別に欧米だからといって、アファーマティブ・アクション一色というわけではない。 ほか、高校の理科の教科書にある話題だが、教科書会社の東京書籍(教科書会社のひとつ)が「物理」科目の教科書で、大学の理系の学科で男女の比率が違うことをあげている。[https://www.asahi.com/articles/ASQ3Y5TC9Q3YUTIL01M.html ジェンダーギャップのリアル、物理でも歴史でも 変わる高校教科書 2022年3月29日 19時00分] 例えば、東京大学の令和四年度入学者の女子比率は20.8%<ref>https://www.u-tokyo.ac.jp/ja/about/overview/e08_01.html</ref>であり、これは諸外国の大学と比べても男女比が偏っている。 :通信傍受法、1999年に成立、2000年に施行 : :'''足利の冤罪'''(えんざい)事件、および「冤罪」という用語、菅谷さん(すがやさん)、「自由奪って申し訳ない」、2009年に釈放、2010年に無罪判決、1990年から殺人の罪で服役していた。 :検察審査会 :「住基カード」「共通番号制」 :「グラフィックデザイン」などの新しい職業名 :乳児死亡率 :薬害エイズ事件、「エイズウイルス」、「血友病」、「血液製剤」 : :エゴイズム :インフォームド・コンセント、 :'''アムネスティ・インターナショナル''' :良心の囚人 :説明責任(アカウンタビリティ) : :日本の紙幣(「お札」)の「ホログラム」、「特殊発光インキ」などの偽造対策 :ハンバーガーのM社、(マクドナルド、シカゴに本社)、多国籍企業の例として :イラクの「'''サマーワ'''」などへの自衛隊派遣。 :ロシアのメドベージェフ大統領(2009年)が核兵器削減の件で、アメリカのオバマ大統領とともに紹介されてる。 :爾来除去機と、それを開発したY社。 :都市鉱山 - 携帯電話やパソコンの中には、チタン、コバルトなどの貴重な金属が使われてる。これをうまく回収できれば儲けることもでき、限りある資源を有効利用することにもなる。 == 政治関連 == :閣議(かくぎ) :問責決議(もんせき けつぎ) :「ねじれ国会」2007年、 :首相官邸の屋上のヘリポートと、地下1階の危機管理センター :選挙の比例代表の「'''ドント式'''」 :'''政見放送'''(せいけん ほうそう) :政治家の「後援会」(こうえんかい) [[File:Badge of representatives of Japan 2012-05-17.jpg|thumb|議員バッジ(衆議院)]] :'''議員バッジ''' :'''議員立法''' :イギリスの政治のしくみ、(図解) 内閣不信任案の可決例 :馴れ合い解散(第2字吉田内閣)1948年、227:130 :バカヤロー解散(第2次 吉田内閣)1953年、229:218 :ハプニング解散(第4次 大平内閣)1980年、243:287 :嘘つき解散(宮澤内閣)1993年、255:220 刑罰の種類 :死刑 :懲役(ちょうえき) :禁固 :罰金 :科料(かりょう) 取り調べの可視化 == 未分類 == :子ども兵士 : :安藤忠雄(あんどうただお)、建築家 : :人権週間 :'''国境なき医師団'''(MSF) == 安全保障 == :コスタリカ憲法第12条 :ソマリアの海賊対策 :イージス艦 : :なお、イージス艦の値段は、1隻あたり訳1200億円(※ とうほう社「ビジュアル公民2020」調べ。参照ページはプライバシー保護(地域版なので)のため秘匿。) 「つくる会」や育鵬社などの教科書に併記の値段があるが、けっして「つくる会」がミリタリーオタクとか国威高揚とかで軍艦の値段を出してるわけではなく、他社の資料集にも軍艦など兵器の値段が書いてある。(なので検定にも通るのは当然。) なお、とうほう社の資料集によると、 :陸上自衛隊の「10式戦車」は1輌あたり約10億円。 :海上自衛隊のイージス艦の値段は、1隻あたり約1200億円 :航空自衛隊のF-35戦闘機は1機あたり約116億円とのこと。(※ 上記の陸海空の兵器の値段の出典は、すべてのとうほう社「ビジュアル公民2020」調べ) 最近の中学校では、こういうのも(受験範囲外だが)教養ということ。昭和とは、隔世の感がある。 == 地域振興、地方文化 == :せんとくん(奈良県)、ひこにゃん(滋賀県 彦根市(ひこねし) )、チーバくん、などの ゆるキャラ :たま駅長(和歌山県) :水木しげるロード(鳥取県、境港市(さかいみなとし))、 どっかの資料集で、マンガ「らきすた」 の かがみん (埼玉県の久喜市(くきし)のゆるキャラになった)を紹介してるらしい。 :※ 埼玉県自体のゆるキャラはコバトンという鳩のキャラが別にいる。 : == 規制緩和 == :かぜ薬のコンビニ販売 :バス事業の規制緩和 :「ゆうちょ銀行」(郵政民営化) : :大型店舗立地法が2000年制定。これは、規制緩和のほう(※ 名前の似た、緩和前の法律と混同しないように) 民営化 :1985年に電電公社がNTTに。 :1987年に国鉄がJRに。 :2007年に郵政民営化。 == 金融 == :銀行窓口で保険などが購入できることになった規制緩和の件。 :日銀の「公開市場操作」 :「管理通過制度」 :「外貨準備」 :「外国為替市場」 :1899年の古い紙幣の写真(日本の) :金利の「単利」と「複利」 == 労働問題 == :'''ハローワーク''' - 公共の職業紹介・案内所が、「ハローワーク」と言われる。また、失業保険などの手続きの方法も教えてくれる。 近年、まじめに働いても、収入が少ない人が増えてきて、そのような低収入の人たちは「'''ワーキングプア'''」と言われる。具体的には、年収200万円以下が、ワーキングプアだろう(正社員の新人の年収の相場が、だいたい300万円くらい)。また、低収入などの理由で、アパートなどの住居を借りれず、ネットカフェなどで寝泊まりする若者や低所得者が増えてきて、「ネットカフェ難民」と言われた。 2008年の世界的不況などで、派遣労働者が解雇され、「年越し派遣村」(としこし はけんむら)などに集まり、ボランティアの炊き出しなどを受けた。 :フレックスタイム制、'''パート'''、'''アルバイト''' :「'''セーフティネット'''」 :「就職氷河期」- 1993年〜2003年ごろは、就職がきびしく、「就職氷河期」(しゅうしょく ひょうがき)と言われた。 :プロ野球のストライキ(2004年)、ちなみにヤフースタジアムなどの写真が教科書にあり プロ野球選手だって、労働者です。プロ野球選手にだって、ストライキの権利はある。 :「名ばかり店長」 コンビニや牛丼屋など、夜中も商売してる小売業で、従業員に長時間労働をさせるため、名目的に管理職にする「名ばかり店長」が横行し、労働問題になっている。 :「労働審判(しんぱん)制度」、2006年 == 格差問題 == :「ジニ係数」 :「格差社会」 == 財政、税など == :「'''財政投融資'''」、「第二の予算」、「一般会計」と「特別会計」 : :「揮発油税」、「酒税」、「事業税」、 :「ふるさと納税」 == 貿易 == :GATT :牛肉とオレンジの輸入自由化 == 貿易の理論 == [[File:David ricardo.jpg|thumb|'''リカード'''(1772〜1823年) イギリスの経済学者。]] 貿易では、その国が相手の外国よりも安い値段で高品質に作れる製品を作ったほうが、両国にとって得である。また、もしもある国が2種類以上の商品を相手国よりも安く作れるとしたら、相対的により安いほうの商品の生産に集中して輸出するほうが、さらに利益をあげられる。この、相対的に安い商品の生産・輸出に特化したほうが利益をあげられるという説を、'''比較生産費説'''(ひかくせいさんひ せつ)という。 比較生産費説は、19世紀初めのイギリスの経済学者'''リカード'''(D.Rocardo)が初めて理論的に示した。このような理論が、自由貿易を主張する立場の者たちの、理論的根拠となっている。いっぽう、現実の貿易は、けっして完全な自由貿易ではなく、実際には、何らかの規制を加えている。自由貿易論に反対して、19世紀の当時、工業が発展途上であったドイツの経済学者'''リスト'''(F.List)は、自国の幼稚な産業を保護するための保護貿易が必要であると主張した。 == 未分類 == :「ビザ」(「入国許可証」) : : :国際法に強制力が「原則なし」という件 : == 紛争 == :ルワンダ虐殺の例の「教会」 : :サラエボが平和だったころ(1990年代の紛争前)の「サラエボ冬季オリンピック」(1984年) : == パレスチナ問題 == :ファタハ、パレスチナ解放機構(PLO)、 :インティファーダ :シャロン首相 :ラビン首相が暗殺された件 : : : : :「人間の安全保障」 : このほか、資料集には、第二次大戦中のイギリスの二枚舌(にまいじた)外交についての解説があるらしい。 == 環境、エコ == : : : : == 未分類 == :「メタンハイドレート」、(※ 日本文教出版がweb公開している教師用の指導書によると、まだ開発中であり実用化してないとのこと。また、教育出版の検定教科書でも、「開発が進められています」としかない。) :「iPS細胞」、※ 教育出版の公民教科書(2022年に公式webサイトで確認)の用語解説にある。あくまで研究段階であり、「研究が進められています」との記述があるが、一切実用化していますとかは書いてない。ES細胞などにも倫理問題(胚細胞を使うので)とともに言及。なお、iPS細胞は皮膚細胞から作るので、その種の問題が回避できると考えられている。公民教科書でも皮膚細胞からiPS細胞をつくることに言及。 :イギリスの防犯カメラ事情 :日本の防犯カメラ事情 :「仮想水」(virtual water<ref>高等学校英語 検定教科書『FACTBOOK English Logic and Expression I』、令和3年5月 文部科学省検定済、令和4年2月25日発行、P184 </ref>) :「フード・マイレージ」 :「農業生産法人」 :マラリア、ハマダラカ、アフリカのサハラ以南 : :トクホのマーク、「特定保健用食品」、(※ これは家庭科や保健体育などでも習う) :電気のPSEマーク(※ これは技術科でも習う)、 :おもちゃのSTマーク(※ これは家庭科でも習う)、 : :QRコード :「金融資本主義」 : :スマトラ島沖地震 : : :地下鉄サリン事件(1995年、年表中にて) :1994年の松本サリン事件。別人が犯人とうたがわれて、誤報になった件。 : :院内学級 義務教育などの教育を受ける権利は、たとえ病気で入院していても保障される。そのため、一部の病院には、教育施設のついた病院がある。「院内学級」のこと。 ;教育費の公的負担 帝国書院によると、公立学校の学費の年間の財政負担は、生徒1人あたり、 :小学生: 889,404円 :中学生: 1,033,857円 :高校生: 1,168,993円 ::(小中高とも平成18年度の金額) である。 なお、検定教科書では紹介されてないが、大学の学費は、国公立大では、年間の授業料は年間で50数万円だが、入学金が20数万円ほど掛かる。私立はもっと高い。 また(検定教科書では紹介されてないが)新人サラリーマンの年収が、おおよそ300万円前後だと言われている。 ;パソコン普及率 日本文教出版の教科書にあるグラフで(P.10)、世帯ごとのパソコンやスマホなどの機器別の普及率のグラフがあるのだが、それを見るとパソコン普及率はあいかわらず高く(2017年までのグラフだが)、2008年あたりからずっとパソコン普及率は80%前後を推移している。 2010年からスマホ普及率が急速に上昇して2010年の10%から2013年の60%に到達するのだが、別にそのあとの時代もパソコン普及率は低下していない。 ネットのデタラメ・不正確な情報(「最近の若者はパソコンを使えない」とかの類)にダマされないようにしよう。 == 資料集 == === スポーツのドラフト制度 === ある資料集では、プロ野球のドラフト制度と、「職業選択の自由」との関連を、考察させようとしているらしい。 (たしか正進社の)公民資料集で、オウム真理教問題の松本サリン事件を紹介。憲法の「身体の自由」や、メディアリテラシーの関連として紹介されているようだ。 戦前の「表現の自由」への弾圧の例として、蟹工船の作品内の文章が 伏せ字(ふせじ)にされた事の紹介。「ストライキ」などの文字が伏せ字にされた。 1988年の長崎市長銃撃事件が紹介されてるが、この解説文に犯人の特徴として「右翼」の文字がある。 「右翼」とか「左翼」とかの語彙は、じつは中学あたりで資料集で習っている可能性がある。 (教学社、正進社とも、)アメリカの近年の経済政策を紹介している。また、ヨーロッパの近年の移民問題などの動向も紹介している。 :アメリカのTPP離脱、 :メキシコとの国境に壁(まだ未達成)、 :鉄鋼・アルミに関税、 :移民制限、 などなど。 「アメリカ第一主義」や「アメリカファースト」などの用語(?)で、トランプのこれらの政策を紹介。 2018年のアメリカによる中国への関税措置。知的財産権の侵害などを理由に、アメリカは2018年、中国に関税などの処置をした。 ネット情報だが、2022年現在、中学あたりの教科書または資料集に、(TPPではなく)RCEP協定(アールセップきょうてい)についても言及しているようである(※教科書の現物はwiki編集時点では未確認)。 === ヨーロッパ情勢 === :イギリスがEUからの離脱の方針の事を紹介。2016年の国民投票でRU離脱派が勝利したことにより、イギリスでEU離脱の議論が活発化している事の紹介。 移民の受け入れ制限の方針転換<br> (いちぶの資料集では)ヨーロッパでは、移民が多くなりすぎた事により、既存の人種からの反発が高まり、移民受け入れを制限する方針になってる事を紹介している。 移民流入の制限のため、ハンガリーがルーマニアやセルビアとの国境を封鎖した事を紹介。 === 日本をとりまく国際関係 === ===== 北朝鮮および中国 ===== とうほう社の資料集「ビジュアル公民2020」によると、北朝鮮が2017年にロケット打ち上げしたりして国際問題になっていると言われてたり、中国(中間人民共和国)が南シナ海の南沙諸島を、2016年のオランダ・ハーグの常設仲裁裁判所の出した判決(中国の主張を退けた)に逆らって(中国が)軍事基地化を進めている事が問題視されている事などを紹介。 北朝鮮問題については、2018年の米朝韓の合意で、朝鮮半島の非核化の合意がされた事を紹介しつつも、しかし具体的なプロセスは進んでおらず、そして2019年には北朝鮮は再び強硬姿勢をつよめている、・・・と資料集は紹介。 南沙諸島については、中国の狙いは、南沙諸島の支配の既成事実化だろうという分析を、その資料集が紹介。また、日本の尖閣諸島も、同様の狙いで、中国に狙われているだろうと、資料集が分析を紹介。このため、日本も予断を許すべきではないと結んでいる。 :※ テレビや新聞などを読むと、取材などの都合でテレビ局は中国などには及び腰であったりするが、しかし実際の国際情勢認識は、とうほう社の資料集のように、きびしいものである。やはり勉強の手段としては、テレビではなく、教育的な書籍で勉強するに限る。 ===== 中国内 ===== 資料集では別のページだが、香港民主化デモの問題も述べている。民主活動家のアグネス・チョウさん(周・庭さん)を資料集では紹介。 資料集には、スウェーデンの環境活動家のグレタさんとか、イスラムの女性の人権問題の活動家のアフメディさんとか、黒人問題のケリスさんなどの若い女性の政治運動を紹介するページが資料集にあり、そのページで、アグネス・チョウさんも紹介している。 2019年に、香港の犯罪者の中国引渡しの条例があり、香港では激しい抗議運動が起きた。アグネス・チョウさんもその活動に関わっている。なお、べつに2019年にアグネスさんは活動を始めたわけではなく、遅くとも2014年の「雨傘運動」(あまがさ うんどう)という民主化運動にはアグネスさんは参加している。 ※ と、とうほう社の資料集はアグネスさんを紹介。 ===== 日韓 ===== 日韓問題では、徴用工問題が、とうほう社の資料集で紹介されている。(慰安婦問題は、未紹介。) 韓国の最高裁にあたる大法院のくだした新日鉄住金(企業名)への賠償命令など、資料集に記載。そして、この判決にもとづいて、韓国内で日本企業に対する差し押さえが進んでいると、資料集は言っている。 なお日本政府は、原告(徴用されたとする朝鮮人)は「徴用」ではなく「募集」に応じたものだという(日本政府の)見解である(※ 資料集が伝えている)。日本政府はこの件では、韓国側の行動には否定的である。 半導体の製造に必要なフッ化水素の輸出規制の件も、資料集は上記の徴用工問題に続けて紹介している。輸出規制といっても、許可不要で輸出できる対象から韓国を外しただけである(そう資料集に書いてある)。(※ なので、フッ化水素の輸入自体は、韓国はいまでも可能である。) しかし、韓国は日本のこの輸出規制の強化に反発し、そして日米韓の3か国で結んでいる軍事包括協定(GSOMIA、ジーショミア)の破棄を 韓国は通告した(※ と、資料集が言っている)。 ===== 日露 ===== さて、日露方面では、北方領土の返還交渉は、2020年以降も、いまだに済んでいない。 たびたび日露両国の政府どうしの返還交渉が話題になるが、しかし2019年の時点ではプーチン大統領が「北方領土を日本に引き渡す計画は無い」と発言している。(と、資料集が紹介している。) ===== 日米 ===== 日米関係については、アメリカのトランプ政権誕生のことが資料集に紹介されているが、しかし2020年の後半(資料集の編集期間はその前だろう)、米国でトランプが大統領選に敗退したので、さてwikibooksでは紹介するべきか否か?(なるべく今後の教科書本文にも応用できそうな話題を書きたいので。) 条約や協定として、経済協定として、「日米物品貿易協定」が2019年に合意された(※ 資料集でも紹介されている)。これは、アメリカがトランプ政権時にTPPから離脱しており、アメリカにとっては代わりの貿易協定のようなものと考えられる。 他のページだが資料集では、沖縄の米軍基地の、オスプレイ問題なども紹介。 === その他、資料集にある時事 === :・ヘイトスピーチ問題の件 :・2019年の「アイヌ民族支援法」。なおこれにより、アイヌ文化振興法は役割を終えた。 ※ なお2019年成立のこの法律のことを「アイヌ施策推進法」ともいう。一部のマスコミなどが「アイヌ民族支援法」とも呼んでいるので、間違いではない。※ 高校の話題だが、高校教科書の第一学習社「公共」教科書で、漫画『ゴールデンカムイ』を明治時代のアイヌ文化を描いた作品だと紹介していた(いちいち高校側で専用ページを設けるほどでもないので、中学側でまとめて紹介)。 :・某私立医大の女子受験生への差別の件 :・LGBT (※2022年現在、(資料集だけでなく)教育出版の公民の検定教科書でも、コラムでLGBTが取り上げられているらしい。(※現物は未確認) )高校の範囲だが、なお、すでに2003年の時点で'''性同一性障害特例法'''という法律が制定されており、裁判所から性同一性障害を公的に認められれば性別を変更でき、結婚などもできる(※ 高校の第一学習社の「公共」教科書で確認)。 :・足利事件(やや古いが、検索の都合上、このリストに載せておく) :・共謀罪。なお2017年に成立した組織犯罪処罰法における、「テロ等準備罪」のこと。 :・皇族の減少問題。もちろん、日本の天皇家やその親戚のこと。女性皇族の是非の議論のあることの紹介や、それにともなう皇室典範の改正の是非の議論などが紹介されている。 :・医薬品販売の規制緩和により、一般用医薬品のネット販売が2014年から原則的に解禁されてる事。なお、それ以前から、コンビニで2009年から風邪薬や鎮痛剤が販売可能になっている。 :・2018年、中国が廃プラスチックの輸入禁止。2019年、廃プラスチックの輸出を禁止するバーゼル条約改正案が採択された。 :・2019年、アメリカがパリ協定から離脱。 :・2018年、イスラエルが、イランが核開発を行っている証拠をつかんだと発表。これをうけアメリカのトランプ政権は、イラン核合意から離脱。イラン核合意は、イランが核兵器開発につながるウラン濃縮をしない代わりに、イランへの制裁を解除するという合意。つまり、イランへの制裁が強まる可能性が高い。もちろんイランは、アメリカのイラン核合意からの離脱に反発し、アメリカへの抗議が行われてた。 逆に、無い話題をあげれば、コロナ問題は、まだ、とうほう社の資料集には、なにも言及されていない。 : : : : == 脚注 == 67apk3uk334nkmf0kckgnqc40sc7ok0 205585 205584 2022-07-20T13:22:44Z Nermer314 62933 /* 福祉 */ wikitext text/x-wiki つぎのものは、検定教科書でも紹介されている。 {| class="wikitable" style="float:right" |+ ! !! 日本 !! 世界 |- |1945年 || ポツダム宣言を受諾 || |- |1946年 || 日本国憲法公布 (47 施行) || |- |1949年 || || NATO成立<br />中華人民共和国成立 |- | |- |1950年 || || 朝鮮戦争 |- |1951年 || サンフランシスコ平和条約調印<br />日米安全保障条約調印 || |- |1954年 || 第五福竜丸が被爆<br />防衛庁設置 || |- |1955年 || || アジア・アフリカ会議 |- |1956年 || 日ソ共同宣言<br />日本が国際連合加盟 || |- |1958年 || インタントラーメン発売 || |- | |- |1960年 || 日米'''新'''安保条約調印 || |- |1962年 || || キューバ危機 |- |1965年 || 東海道新幹線開通<br />東京オリンピック || |- |1967年 || || ヨーロッパ共同体(EC)発足 |- |1968年 || GNP資本主義国2位に || 核不拡散防止条約 |- |1969年 || 日韓基本条約調印 || アメリカの宇宙船アポロ11号が月面着陸 |- | |- |1970年 || 大阪万国博覧会 || |- |1972年 || 沖縄が日本復帰<br />日中国交正常化 || |- |1973年 || || 第一次石油危機 |- |1973年 || コンビニエンスストアが開店 || |- |1978年 || 日中平和友好条約調印 || |- |1979年 || 東京サミット開催 || 米中国交樹立 |- | |- |1980年 || 自動車の生産台数が世界1位に || イラン・イラク戦争 |- |1982年 || 参院選で比例代表制導入 || |- |1983年 || 東京ディズニーランドが開店<br />ファミコン発売 || |- |1984年 || 日本の平均寿命が世界1位に || |- |1985年 || 男女雇用機会均等法公布<br />電電公社が民営化してNTTに || |- |1986年 || 牛肉・オレンジ輸入自由化 || チェルノブイリ原発事故 |- |1987年 || 国鉄分割民営化でJR発足 || 米ソ、中距離核戦力全廃条約調印 |- |1988年 || 青函トンネル、瀬戸大橋の開通 || |- |1989年 || 消費税の導入(当時の税率3%) || ベルリンの壁崩壊 |- | |- |1991年 || バブル経済崩壊 || ソビエト連邦解体<br />湾岸戦争 |- |1992年 || PKO協力法成立 || 国連環境開発会議 |- |1993年 || Jリーグ開幕<br />連立政権(細川内閣) || ヨーロッパ連合(EU)発足 |- |1995年 || 阪神淡路(あわじ)大震災、地下鉄サリン事件 || |- |1996年 || DVD発売開始 || |- |1997年 || クローン羊ドリーの誕生が発表される || 香港、中国に返還 |- |1998年 || 長野冬季オリンピック<br />日本で「環境ホルモン」の害が話題になる || |- | |- |2001年 || || アメリカ同時多発テロ |- |2002年 || 日韓共催サッカー・ワールドカップ<br />日朝首脳会談、<br />一部の拉致被害者が帰国 || |- |2003年 || || イラク戦争 |- |2004年 || イラクで自衛隊が復興支援 || スマトラ沖地震・津波 |- |2005年 || 愛知県で万博(愛・地球博)<br />道路公団民営化 || |- |2008年 || 国民投票法の成立、郵政民営化 || |- |2008年 || 洞爺湖(とうやこ)サミット || 世界金融危機 |- |2009年 || 新型インフルエンザの流行<br />民主党連立政権 || |- |2011年 || 東日本大震災、福島第一原子力発電所で事故 || |- |} == 未分類 == * リーマンショックとサブプライムローン問題の関係 2007年までアメリカ合衆国の大手証券会社のリーマン・ブラザーズが、アメリカでの低所得者向け住宅ローンのサブプライムローン関連の金融商品などを大量を扱っていたところ、2007年のサブプライムローンの破綻により、リーマン・ブラザーズが巨額の損失を抱え、そして2008年にリーマン・ブラザースが経営破綻したという経緯である。このリーマン・ブラザーズの破綻をきっかけに、世界的な不況になった(※ なお、リーマン・ブラザーズの会社の種類が「証券会社」なのか「投資銀行」なのかは、文献によって記載が異なる)。 == 高度経済成長の消費文化 == : 1958年のチキンラーメン : 日清のカップヌードル 1971年 :安藤百福(あんどう ももふく)『魔法のラーメン発明物語』日本経済新聞社 安藤百福は、インスタントラーメンの発明者で、日清食品の創業者。 :レトルト食品の誕生、ボンカレーが1968年に登場 :少年マガジンの1959年の創刊(教科書では写真あり)、少年サンデーの創刊 :1970年の大阪万博 :ファミコンの1983年ブーム :「鉄腕アトム」が1952年に連載開始。 == マンガ、アニメなど == :「ドラえもん」 :犬夜叉、ワンピース、ナルト、(日本のマンガ・アニメが外国でも人気の件、写真などで検定教科書では説明) キャリア教育などの単元で、職業の例として、アニメ声優(東京書籍が紹介)とゲームクリエイター(日本文教出版)を紹介している教科書もある。 ゲームクリエイターが分業制であることを紹介している。「プログラムを書く人、キャラクターデザインをする人など、さまざまな専門分野に分業して作られえ地増す」とある。 == 製造業など == :ヘラ絞りの北嶋絞(きたじましぼり)製作所 国産ロケット「H2」の補助ロケットの先端部分が、ここの製作所の職人による、金属板に棒を押し当てて丸い形状の板をつくる「ヘラ絞り」加工で生産されている。 :「ゆるまないナット」、※ H社とのこと、(おそらくハードロックナット) :「まいど1号」、大坂の町工場、しかし不況により活動停滞の件も記述あり。 :液晶テレビ、プラズマテレビ == ビジネス用語 == :「牛丼チェーン店」という用語。「チェーン店」という言葉を知ってるリテラシー。「牛丼」(ぎゅうどん)という国語力。 :「外食チェーン」 :コンビニの'''POS'''システム :コンビニなどの「フランチャイズ」店、(チェーン店との違いも) == 2006年の会社法 == 1円起業が認められた。 取締役は1人でもよくなった(それまでは取締役3人と、監査役1人)。 == 消費者リテラシー == :国民生活センターと、地方公共団体の消費生活センター :「クレジットカード」、「プリペイドカード」、「電子マネー」 クレジットカードは後払いであり、つまり借金である。 :(※ 範囲外: )世間には時々「クレジットカードは借金ではない」と言う人がいて、その論拠として「クレジットカードによる買い物は、銀行口座から預金を引き落としているだけである。銀行残高の範囲内の買い物であれば、借金ではない」という人がいる。 :※ 全国銀行協会連合会も、クレジットによる買い物は「借金」だと明言している<ref>[https://www.zenginkyo.or.jp/article/tag-d/8079/ 『ローンやクレジットを使い過ぎないための7つのポイント - 全国銀行協会』] 2019年2月24日に閲覧して確認</ref>。 :正確にいうなら、クレジットカードによる買い物は、法律上はおそらく「金銭債務」(きんせん さいむ)に分類されるだろうが、しかし中学の範囲を超えた概念なので、中学段階では「クレジットは借金」と認識してよい。 プリペイドカードは前払い。図書カードなどもプリペイドカード。プリペイドカードには、たいてい、割引(わりびき)などが付いている(もし、割引がついてないと、カードは使用可能なお店が限られたりするので、お金のままで持つよりも損をしてしまう)。 電子マネーについて、Suica(スイカ)などの画像が検定教科書にあり。また、鉄道会社が定期券を、IC(集積回路)の組み込まれたカード化をして、それに電子マネーの機能も持たせていて、駅構内の買い物などに使えるようになっている。 :「自己破産」 :'''ATM'''、「現金自動預払機」(げんきんじどう あずけばらいき) なお、ATMで使うカードは、「キャッシュカード」。 == 未分類 == 自動車の購入について、日本政府は、環境保護のため、電気自動車やハイブリッドカーなどのエコカーの購入に補助金を出している('''エコカー補助金''')。 :アムステルダムや名古屋市の「ロードブライシング」 : :「北九州市」の「エコタウン」 :環境問題で、2009年の鳩山の国際公約の25%削減の件、(温室効果ガス削減の件) :東京モーターショー(2009年、千葉) :発光「ダイオード」の裁判の金額の件、 :トランスミッション、パワーステアリング(自動車産業の国際分業化の件、検定教科書では画像で紹介してるので、自動車工学を知らなくても分かるようになってる) :ASIMOの写真、二足歩行ロボット == 金融 == === 株価 === :始値(はじめね) :終値(おわりね) :安値(やすね) :高値(たかね) :日経平均株価、(画像で紹介されている) === 平成バブル === 「バブル」 bubble とは「泡(あわ)」という意味。1990年から2000年まで「失われた十年」と言われた。バブル経済(bubble economy <ref>小森清久 ほか編著『新版完全征服 データベース5500 合格英単語・熟語』、桐原書店、2019年2月10日 第41刷発行、P.328</ref> )が崩壊してから、企業への銀行からの融資の条件がきびしくなり、そのような銀行の態度が「貸し渋り」(かししぶり)と言われた。このため、資金ぐりに行き詰まって倒産した企業も多い。 かといって、銀行側も経営が苦しく、資金の回収のめどが無い会社に貸すわけにはいかない。実際に銀行ですら、1997年には、いくつかの銀行が破綻している。北海道拓殖銀行(ほっかいどう たくしょくぎんこう)や、日本長期信用銀行(にほん ちょうきしんようぎんこう)などが、1997年に破綻した。もっとも、バブル崩壊後に、銀行は国から救済のための公的資金を受け入れており、公的支援を受けていながら貸し渋りをするのは問題行為だろうという意見もある(検定教科書にも、そういう意見が紹介されている。教育出版など)。 === その他、金融コラムなど === クラウドファンディング(Crowd Funding)について、ある検定教科書で紹介されているらしい<ref>[https://www.jsda.or.jp/gakusyu/edu/web_curriculum/images/mailmagazine/Vol.146_20200827.pdf 『5分で話せる金融経済「新しい教科書で中学校の経済の授業はどう変わる?②」 - Vol.146_20200827.pdf』]</ref>。クラウドファンディングの手法で集めた資金で製作されたアニメ映画についても言及しているらしい。 また、出典とは別情報源だが、帝国書院の中学公民の教科書でアニメ映画『この世界の片隅に』がクラウドファンディングで製作されたことが照会されているとのこと。 Crowd とは群集、Funding とは資金の意味。 インターネット技術のCloud (雲)とは別の単語なので混同しないように。 == 通信 == :「ショルダーホン」、「ポケベル」などの昔の無線通信ツール :1930年代の電話交換手の写真画像も、検定教科書にあり。 :そして、GPS機能付の現代の携帯電話へという紹介の流れ。(以上、東京書籍の公民教科書にて) :「NTT」および「NCC」「(KDDI、日本テレコムなど)」 == バイオテクノロジー == :植物工場 :バイオマス発電 :青いバラ(遺伝子組み換え) == 未分類 == :「経理」、「総務」、「営業」 (株主会社について) :デフレスパイラル :行政機関情報公開制度、2001年 :新日鉄・住金、三洋子会社化(パナソニック傘下に)、などの大型合併 :マオリ族のあいさつ、鼻と鼻をこすりつける :沖縄のゴーヤーチャンプル、エイサー(踊り)、紅型(びんがた)、 :アイヌのチェプオハウ(スープ料理)、アットゥシ(衣装)、 :兌換(だかん)紙幣 :フランスの公立学校での(イスラム教徒の)スカーフ着用禁止の件 :モスクなどの幾何学模様、「アラベスク」 * 日本の地域の文化 :ヨサコイ祭り :「YOSAKOIソーラン祭り」、高知市のヨサコイ祭りと北海道のソーラン祭りが合体 :「津軽三味線」(つがる しゃみせん) :ユニクロでは、不要になった衣料品を回収してリサイクルしているとのこと。 :シルバー人材センター :バレーボールのルールの歴史、(きまりとは何か、)ちなみにアメリカのモルガンが1895年にバレーボールを考案とのこと :2011年のエジプトの政変 :アメリカの「sushi」寿司 :イタリアのサッカーチームで活躍する日本人 :フェアトレード フェアトレード(fair trade<ref>高等学校英語 検定教科書『FACTBOOK English Logic and Expression I』、令和3年5月 文部科学省検定済、令和4年2月25日発行、P121 </ref>)とは、発展途上国では、たとえば児童などが違法に低賃金で酷使されていたりするので、そういう商品を買わないようにしよう、という運動である。 だが、「具体的に、どういう商品が違法に生産されているか? どうやって、それを見分けるか?」は消費者からは分かりづらいので、「発展途上国の商品を買うときは、適正な価格の商品を買いましょう」という運動になっており、高校の検定教科書でも、そういう風に「適正価格がどうこう」な感じで紹介されてしまっている。どうやって適正な価格であることを調べるかについては、中学高校の教科書・参考書では言及されてない。 :マイバッグ :グリーンカーテン - 植物によって日差しをさえぎり、エアコンの電力消費を抑えるなどして、環境にやさしい。 :ストリートチルドレン :メーデー : :中村哲(なかむら てつ) - 医師。アフガニスタンで難民の医療を行っている。 [[File:Wangari Maathai in Nairobi.jpg|thumb|ワンガリ=マータイさん]] :'''ワンガリ=マータイ'''さん、「MOTTAINAI(もったいない)」の人。 [[File:Sadako Ogata - World Economic Forum on Africa 2008.jpg|thumb|緒方貞子 - 国連の難民保護の責任者として、1991年から10年間、活動していた。2003年から11年までは国際協力機構(JICA、ジャイカ)理事長。 ]] : :国連高等難民弁務官事務所(こくれん こうとう なんみん べんむかん じむしょ) (英略称: UNHCR)- 本部はジュネーブにある。緒方貞子が国連難民高等弁務官を1991年から2000年まで務めた。 :EU大統領のファン=ロンバイ :長崎市の'''平和記念式典''' :原爆ドーム、広島県 広島市 [[File:Cornerstone of Peace.jpg|thumb|平和の礎(いしじ) (沖縄県 糸満市(いとまんし))<br />沖縄戦で亡くなった戦没者の氏名が刻まれている石碑(せきひ)。]] :「あたらしい憲法のはなし」、文章の抜粋 :「立憲主義」 :'''ワイマール憲法'''と社会権 :ボルテールとバスティーユ監獄 :薬局の距離制限の撤廃の件、1975年の最高裁判決により撤廃 :「水俣メモリアル」(水俣病の慰霊施設) == 福祉 == :補助犬(ほじょけん)、介護犬、盲導犬(もうどうけん)、 :2002年の身体障害者補助犬(ほじょけん)法 :「デイサービス」、「ケア マネジャ」 :介護福祉士、訪問介護員(ホームヘルパー)、社会福祉士 :'''ハンセン病'''、「らい病」、「らい病予防法」の欠陥、 * 医療関連 :着床前診断 :臓器移植法、2009年の改正内容 :薬のインターネット販売の議論 [[File:臓器提供意思表示カード(表面)2.jpg|thumb|臓器提供意思表示カード(表面)]] [[File:臓器提供意思表示カード(裏面)2.gif|thumb|臓器提供意思表示カード(裏面)]] :臓器提供意思表示カード、いわゆる「'''ドナーカード'''」 {{-}} ドナーカードの文面: ---- :<span style="font-size: larger;">(1,2,3) いずれかの番号を○で囲んでください。)</span> :<span style="font-size: larger;">1. 私は、<span style="color:red"><span style="text-decoration:underline">脳死後及び心臓が停止した死後のいずれでも</span></span>、移植の為に<br />  臓器を提供します。</span> :<span style="font-size: larger;">2. 私は、<span style="color:red"><span style="text-decoration:underline">心臓が停止した死後に限り</span></span>、移植の為に臓器を提供します。</span> :<span style="font-size: larger;">3. 私は臓器を提供しません。</span> :(1 又は 2 を選んだ方で、提供したくない臓器があれば、×をつけてください。) :::【 心臓 ・ 肺 ・ 肝臓 ・ 腎臓 ・ 膵臓 ・ 小腸 ・ 眼球 】 :〔特記欄 :                               〕 :署 名 年 月 日 :<span style="text-decoration:underline">  年  月  日</span> :本人署名(自筆) :<span style="text-decoration:underline">         </span> :家族署名(自筆) :<span style="text-decoration:underline">         </span> ---- 日本では2009年の臓器移植法(ぞうき いしょくほう)の改正により、本人の意志が不明でも、家族の承諾があれば、脳死での臓器提供ができるようになった。また、15歳未満の子どもからも、家族の承諾で脳死での臓器移植が可能になった。また、健康保険証や運転免許証にも、近年では、臓器提供の意思表示を記載できるようになっている。なお、目の角膜なども移植の対象になっている。マスメディアなどでの議論では、「脳死は、その人の死か?」という論点がある。 :臓器移植の論点 ::賛成の意見 ::反対の意見 [[File:Grameen Yunus Dec 04.jpg|thumb|マハマド=ユヌス]] :グラミン銀行、「'''マイクロクレジット'''」という用語、2006年ノーベル平和賞、ムハマド=ユヌス ダッカ事業はムハマド=ユヌスのグラミン銀行の融資によるMITメディアラボ、ペンシルベニア大学、キーランティンバーレイク建築設計事務所、社会学者の松本良多の協働で推進された開発事業計画がある。 ムハマド=ユヌスはバングラデシュの経済学者。 :「気候にかんする政府間パネル(IPCC)」 :アル・ゴア 元アメリカ副大統領 が温暖化問題の啓発活動の業績にてノーベル平和賞を2007年に受賞。 :佐渡トキ保護センター :ハリケーン、干ばつ、サンゴの白化、 : :2002年のSARS(サーズ、重症急性呼吸器症候群)、 :2009年の新型インフルエンザ。この年、成田空港では新型インフルの検疫も大規模に行われた。 :朝日新聞、毎日新聞、読売新聞、および、新聞によって論調が違うというメディア・リテラシー :湾岸戦争のときの水鳥の写真の件 :スイスの直接民主制 - スイスの一部の州では直接民主制が行われてる。挙手で、多数決の数を数える。 :ローマクラブ『成長の限界』、1972年 :気象衛星「ひまわり」、JAXA :国際宇宙ステーション、野口聡一(そういち)さんの長期滞在 :リニアーモーターカー、山梨県 都留市(つるし) :野田・元総理 :'''アウンサン=スー=チー'''、「軟禁」という用語 [[File:Martin Luther King Jr NYWTS.jpg|thumb|キング牧師]] :'''キング牧師'''、ワシントン大行進。黒人解放運動のえらい人。英語の教科書に「I Have a Dream」(私には夢がある)などの記述あり。 [[File:MotherTeresa 094.jpg|thumb|マザー=テレサ]] :'''マザー=テレサ''' :「アファーマティブ アクション」 :「ポジティブ アクション」 なお、アファーマティブはアメリカ系の表現、ポジティブはイギリス・欧州系の表現である(※どこかの高校教科書にそう書いてある)。 ポジティブアクションの例として学生に身近なのは、大学の「女子大」であろうか。(ただし、日本で女子大が出来たときには、まだ「ポジティブアクション」の言葉はなかったが)。 日本の文部科学省の管轄の大学に、「女子大」はあっても「男子大」はない。(なお防衛大は文科省ではなく防衛省の管轄なので、問題を簡単にするため、この話題では考えないとする。) ともかく、いわゆる「女子大」は、日本では歴史的には、先に男子の大学教育が出来てから、あとから女子にも大学教育を与えるべきだという理念にもとづいて行われた措置なので、「法の下(もと)の平等」の侵害には当たらないとされている。(教育出版の高校「公共」教科書の見解。) なお現代でも、共学の学校でも、いくつかの大学で(いくつもの大学で)、いわゆる「女子枠」というものが公言されたが、しかし受験の男女の機会均等の問題もあるので、たとえば東京大学では得点の加算は行わずに家賃補助など学費の優遇だけに留めるなど、抑制的な例もある<ref>https://www.u-tokyo.ac.jp/ja/students/welfare/h04_11.html</ref>。 ほか、K大学が、女子だけの入学定員を用意しようとしたが、しかし「法の下(もと)の平等」の件からの反対意見が多く、中止になった。 逆に、「女子差別」とマスコミなどで話題になった例だが、東京医科大学で、女子の入学者を減らそうとして、面接などで意図的に低い採点をして女子を減らしていたことが発覚した<ref>https://www.nikkei.com/article/DGXMZO33701370S8A800C1CC0000/</ref>。東京医科大学がそうしたことの背景には、せっかく女子の医者を育成しても、皮膚科・眼科や小児科に片寄ったりする統計的な事実があるなどの医学特有の事情もある。救急医療などの過酷な現場は、男性の医者が多いのが今のところは現実である(※ たとえば、月経などのタイミングで急患が来た場合の問題など、リアルな問題が色々とあるだろう。人手を増やそうとしても、それには予算の増額が必要であり、つまり国からの医療費の援助が必要だが、私たちが払える医療費にも限界がある)。 :※ なお、高校の教育出版「公共」の教科書に医大の地域枠や女子定員の問題が取り上げられている。 ※ 日本のばあい、中学・高校は基本的に男女の定員が同数だが、しかし大学はそうではない。大学には基本、男女別の定員は無い。 ※ 日本の場合、学部によっては、男女比が片寄っているのが現実である。理系や難関大学は男が多い傾向がある。(※ 教育出版の見解) 医大学側の経営の裁量もあるので、私たちが口出しをできることではないかもしれない。だが他人事とは考えず、医療費を増やす決断をするのか、それとも女性の医者はある程度は制限を受けることは仕方無いと考えるのか、色々と考えざるを得ないだろう。 性別の例ではないが、関連しそうな実例として、たとえば医大には「地域枠」という制度があり、医師不足が問題になっている地域の医大において、地元・近隣の受験生を優遇して得点加算などをする措置が、女子定員の問題になった医大だけでなく、多くの地方の医大で行われている。 この「地域枠」だって、地域外の受験生は、受験の成績が良くても、やや成績の劣る地元の受験生に入学枠をうばわれてしまう結果になっているわけである。しかしそれでも、地域の医師不足という問題を是正するために、他地域の受験生には我慢してもらっているわけである。 このように、なにかの差別や片寄りを是正しようとすることは、ほかの何かに負担を要求することでもある。そういったことを自覚した上で、その是正措置を導入すべきか、それとも導入しないのかを、私たちは、いろいろと考えていかなければならないだろう。 ※ 文献などは確認してないので正確な記述ではないが、「アファーマティブ・アクション」や「ポジティブ・アクション」とは、少数派や現状での不利益層のこうむっている格差是正のために、多数派や現状での利益層の不利がやや大きくなってでも介入すること。「積極的格差是正」などと翻訳されることも多い。実際にネット検索で「積極的格差是正」で検索しても、たとえば公的機関である内閣府のwebサイトが出てくる(たとえば[https://www.gender.go.jp/research/kenkyu/ishiki/kekka53.html 『ポジティブ・アクション(積極的差別是正措置)に対する意識』Copyright 2016 Gender Equality Bureau Cabinet Office.] 2022年2月21日に閲覧して確認)。 検定教科書では紹介していないが、かつて「ネガティブ・アクション」という用語があったはずなのだが、しかし意味が多義的であり、論者によって異なる意味で使われるので混乱があり、現代では用いないほうが安全だろう。(なので当然、検定教科書でも「ネガティブ・アクション」を紹介していない。) 英語圏では現代、差別的措置という意味で negative action ネガティブアクションという用語を用いているサイトもある。だが、かつては、自由競争を重視した限定的・弱めの格差是正という意味でネガティブ・アクションと言う用語が使われたこともあり、そういう弱めの是正介入がよく「消極的格差是正」などと和訳されていた。(1990年代の昔は普通に『イミダス』だったか『現代用語の基礎知識』あたりに、ポジティブアクションの対比としてネガティブアクションも紹介されていたような気がするのだが…。) 現代でも、上述の内閣府のweb資料にあるアメリカ人の意識調査の結果での、ポジティブアクション反対者のかかげる主な反対理由 ※ 以下、引用 <pre> ○アメリカでは、「自由な競争を妨げ、社会や企業の活力を損なう恐れがあるから」、「女性が優遇される結果、同じ能力を持つ男性が差別されるから」を挙げた者の割合が高い。 </pre> ※ 以上、引用 に、かつての1990年代にあっただろう「消極的格差是正」の議論の名残りが、うかがえる。 こういう混乱があるので現代では「ネガティブ・アクション」の用語は使わないほうが良いだろう。しかし、「消極的格差是正」の概念は消えたのに、一方でポジティブアクションの和訳である「積極的格差是正」の和訳の言葉だけが残りつづけており、なんとも意味不明な状況になっている。 さて、日本では、厚生労働省などが「男女共同参画社会」などの政策においてポジティブ・アクションの方策を打ち出している。だから教科書にも書かれるのだろう。 だが、何も男女格差の問題だけでなく、たとえば移民問題などでもこれらの格差是正のありかたは議論になる。実際、例えば文献『社会学のエッセンス』(有斐閣)<ref>友枝敏雄 ほか著『社会学のエッセンス 新版補訂版』、2018年8月5日 新版補訂版、P236</ref>を見れば、移民問題についてのイギリスにおけるアファーマテイブアクションの採用およびフランスにおける不採用の成果が両国とも芳しく(かんばしく)ないことを論じている。 フランスは移民問題で、たとえば公立学校でイスラム教徒の女子がスカーフをするのを禁じており、イスラム教徒を追放した。これは文献『社会学のエッセンス 新版補訂版』によれば移民問題においては、アファーマティブ・アクションを採用していないことになる<ref>友枝敏雄 ほか著『社会学のエッセンス 新版補訂版』、2018年8月5日 新版補訂版、P236</ref>。このフランスの例のように、別に欧米だからといって、アファーマティブ・アクション一色というわけではない。 ほか、高校の理科の教科書にある話題だが、教科書会社の東京書籍(教科書会社のひとつ)が「物理」科目の教科書で、大学の理系の学科で男女の比率が違うことをあげている。[https://www.asahi.com/articles/ASQ3Y5TC9Q3YUTIL01M.html ジェンダーギャップのリアル、物理でも歴史でも 変わる高校教科書 2022年3月29日 19時00分] 例えば、東京大学の令和四年度入学者の女子比率は20.8%<ref>https://www.u-tokyo.ac.jp/ja/about/overview/e08_01.html</ref>であり、これは諸外国の大学と比べても男女比が偏っている。 :通信傍受法、1999年に成立、2000年に施行 : :'''足利の冤罪'''(えんざい)事件、および「冤罪」という用語、菅谷さん(すがやさん)、「自由奪って申し訳ない」、2009年に釈放、2010年に無罪判決、1990年から殺人の罪で服役していた。 :検察審査会 :「住基カード」「共通番号制」 :「グラフィックデザイン」などの新しい職業名 :乳児死亡率 :薬害エイズ事件、「エイズウイルス」、「血友病」、「血液製剤」 : :エゴイズム :インフォームド・コンセント、 :'''アムネスティ・インターナショナル''' :良心の囚人 :説明責任(アカウンタビリティ) : :日本の紙幣(「お札」)の「ホログラム」、「特殊発光インキ」などの偽造対策 :ハンバーガーのM社、(マクドナルド、シカゴに本社)、多国籍企業の例として :イラクの「'''サマーワ'''」などへの自衛隊派遣。 :ロシアのメドベージェフ大統領(2009年)が核兵器削減の件で、アメリカのオバマ大統領とともに紹介されてる。 :爾来除去機と、それを開発したY社。 :都市鉱山 - 携帯電話やパソコンの中には、チタン、コバルトなどの貴重な金属が使われてる。これをうまく回収できれば儲けることもでき、限りある資源を有効利用することにもなる。 == 政治関連 == :閣議(かくぎ) :問責決議(もんせき けつぎ) :「ねじれ国会」2007年、 :首相官邸の屋上のヘリポートと、地下1階の危機管理センター :選挙の比例代表の「'''ドント式'''」 :'''政見放送'''(せいけん ほうそう) :政治家の「後援会」(こうえんかい) [[File:Badge of representatives of Japan 2012-05-17.jpg|thumb|議員バッジ(衆議院)]] :'''議員バッジ''' :'''議員立法''' :イギリスの政治のしくみ、(図解) 内閣不信任案の可決例 :馴れ合い解散(第2字吉田内閣)1948年、227:130 :バカヤロー解散(第2次 吉田内閣)1953年、229:218 :ハプニング解散(第4次 大平内閣)1980年、243:287 :嘘つき解散(宮澤内閣)1993年、255:220 刑罰の種類 :死刑 :懲役(ちょうえき) :禁固 :罰金 :科料(かりょう) 取り調べの可視化 == 未分類 == :子ども兵士 : :安藤忠雄(あんどうただお)、建築家 : :人権週間 :'''国境なき医師団'''(MSF) == 安全保障 == :コスタリカ憲法第12条 :ソマリアの海賊対策 :イージス艦 : :なお、イージス艦の値段は、1隻あたり訳1200億円(※ とうほう社「ビジュアル公民2020」調べ。参照ページはプライバシー保護(地域版なので)のため秘匿。) 「つくる会」や育鵬社などの教科書に併記の値段があるが、けっして「つくる会」がミリタリーオタクとか国威高揚とかで軍艦の値段を出してるわけではなく、他社の資料集にも軍艦など兵器の値段が書いてある。(なので検定にも通るのは当然。) なお、とうほう社の資料集によると、 :陸上自衛隊の「10式戦車」は1輌あたり約10億円。 :海上自衛隊のイージス艦の値段は、1隻あたり約1200億円 :航空自衛隊のF-35戦闘機は1機あたり約116億円とのこと。(※ 上記の陸海空の兵器の値段の出典は、すべてのとうほう社「ビジュアル公民2020」調べ) 最近の中学校では、こういうのも(受験範囲外だが)教養ということ。昭和とは、隔世の感がある。 == 地域振興、地方文化 == :せんとくん(奈良県)、ひこにゃん(滋賀県 彦根市(ひこねし) )、チーバくん、などの ゆるキャラ :たま駅長(和歌山県) :水木しげるロード(鳥取県、境港市(さかいみなとし))、 どっかの資料集で、マンガ「らきすた」 の かがみん (埼玉県の久喜市(くきし)のゆるキャラになった)を紹介してるらしい。 :※ 埼玉県自体のゆるキャラはコバトンという鳩のキャラが別にいる。 : == 規制緩和 == :かぜ薬のコンビニ販売 :バス事業の規制緩和 :「ゆうちょ銀行」(郵政民営化) : :大型店舗立地法が2000年制定。これは、規制緩和のほう(※ 名前の似た、緩和前の法律と混同しないように) 民営化 :1985年に電電公社がNTTに。 :1987年に国鉄がJRに。 :2007年に郵政民営化。 == 金融 == :銀行窓口で保険などが購入できることになった規制緩和の件。 :日銀の「公開市場操作」 :「管理通過制度」 :「外貨準備」 :「外国為替市場」 :1899年の古い紙幣の写真(日本の) :金利の「単利」と「複利」 == 労働問題 == :'''ハローワーク''' - 公共の職業紹介・案内所が、「ハローワーク」と言われる。また、失業保険などの手続きの方法も教えてくれる。 近年、まじめに働いても、収入が少ない人が増えてきて、そのような低収入の人たちは「'''ワーキングプア'''」と言われる。具体的には、年収200万円以下が、ワーキングプアだろう(正社員の新人の年収の相場が、だいたい300万円くらい)。また、低収入などの理由で、アパートなどの住居を借りれず、ネットカフェなどで寝泊まりする若者や低所得者が増えてきて、「ネットカフェ難民」と言われた。 2008年の世界的不況などで、派遣労働者が解雇され、「年越し派遣村」(としこし はけんむら)などに集まり、ボランティアの炊き出しなどを受けた。 :フレックスタイム制、'''パート'''、'''アルバイト''' :「'''セーフティネット'''」 :「就職氷河期」- 1993年〜2003年ごろは、就職がきびしく、「就職氷河期」(しゅうしょく ひょうがき)と言われた。 :プロ野球のストライキ(2004年)、ちなみにヤフースタジアムなどの写真が教科書にあり プロ野球選手だって、労働者です。プロ野球選手にだって、ストライキの権利はある。 :「名ばかり店長」 コンビニや牛丼屋など、夜中も商売してる小売業で、従業員に長時間労働をさせるため、名目的に管理職にする「名ばかり店長」が横行し、労働問題になっている。 :「労働審判(しんぱん)制度」、2006年 == 格差問題 == :「ジニ係数」 :「格差社会」 == 財政、税など == :「'''財政投融資'''」、「第二の予算」、「一般会計」と「特別会計」 : :「揮発油税」、「酒税」、「事業税」、 :「ふるさと納税」 == 貿易 == :GATT :牛肉とオレンジの輸入自由化 == 貿易の理論 == [[File:David ricardo.jpg|thumb|'''リカード'''(1772〜1823年) イギリスの経済学者。]] 貿易では、その国が相手の外国よりも安い値段で高品質に作れる製品を作ったほうが、両国にとって得である。また、もしもある国が2種類以上の商品を相手国よりも安く作れるとしたら、相対的により安いほうの商品の生産に集中して輸出するほうが、さらに利益をあげられる。この、相対的に安い商品の生産・輸出に特化したほうが利益をあげられるという説を、'''比較生産費説'''(ひかくせいさんひ せつ)という。 比較生産費説は、19世紀初めのイギリスの経済学者'''リカード'''(D.Rocardo)が初めて理論的に示した。このような理論が、自由貿易を主張する立場の者たちの、理論的根拠となっている。いっぽう、現実の貿易は、けっして完全な自由貿易ではなく、実際には、何らかの規制を加えている。自由貿易論に反対して、19世紀の当時、工業が発展途上であったドイツの経済学者'''リスト'''(F.List)は、自国の幼稚な産業を保護するための保護貿易が必要であると主張した。 == 未分類 == :「ビザ」(「入国許可証」) : : :国際法に強制力が「原則なし」という件 : == 紛争 == :ルワンダ虐殺の例の「教会」 : :サラエボが平和だったころ(1990年代の紛争前)の「サラエボ冬季オリンピック」(1984年) : == パレスチナ問題 == :ファタハ、パレスチナ解放機構(PLO)、 :インティファーダ :シャロン首相 :ラビン首相が暗殺された件 : : : : :「人間の安全保障」 : このほか、資料集には、第二次大戦中のイギリスの二枚舌(にまいじた)外交についての解説があるらしい。 == 環境、エコ == : : : : == 未分類 == :「メタンハイドレート」、(※ 日本文教出版がweb公開している教師用の指導書によると、まだ開発中であり実用化してないとのこと。また、教育出版の検定教科書でも、「開発が進められています」としかない。) :「iPS細胞」、※ 教育出版の公民教科書(2022年に公式webサイトで確認)の用語解説にある。あくまで研究段階であり、「研究が進められています」との記述があるが、一切実用化していますとかは書いてない。ES細胞などにも倫理問題(胚細胞を使うので)とともに言及。なお、iPS細胞は皮膚細胞から作るので、その種の問題が回避できると考えられている。公民教科書でも皮膚細胞からiPS細胞をつくることに言及。 :イギリスの防犯カメラ事情 :日本の防犯カメラ事情 :「仮想水」(virtual water<ref>高等学校英語 検定教科書『FACTBOOK English Logic and Expression I』、令和3年5月 文部科学省検定済、令和4年2月25日発行、P184 </ref>) :「フード・マイレージ」 :「農業生産法人」 :マラリア、ハマダラカ、アフリカのサハラ以南 : :トクホのマーク、「特定保健用食品」、(※ これは家庭科や保健体育などでも習う) :電気のPSEマーク(※ これは技術科でも習う)、 :おもちゃのSTマーク(※ これは家庭科でも習う)、 : :QRコード :「金融資本主義」 : :スマトラ島沖地震 : : :地下鉄サリン事件(1995年、年表中にて) :1994年の松本サリン事件。別人が犯人とうたがわれて、誤報になった件。 : :院内学級 義務教育などの教育を受ける権利は、たとえ病気で入院していても保障される。そのため、一部の病院には、教育施設のついた病院がある。「院内学級」のこと。 ;教育費の公的負担 帝国書院によると、公立学校の学費の年間の財政負担は、生徒1人あたり、 :小学生: 889,404円 :中学生: 1,033,857円 :高校生: 1,168,993円 ::(小中高とも平成18年度の金額) である。 なお、検定教科書では紹介されてないが、大学の学費は、国公立大では、年間の授業料は年間で50数万円だが、入学金が20数万円ほど掛かる。私立はもっと高い。 また(検定教科書では紹介されてないが)新人サラリーマンの年収が、おおよそ300万円前後だと言われている。 ;パソコン普及率 日本文教出版の教科書にあるグラフで(P.10)、世帯ごとのパソコンやスマホなどの機器別の普及率のグラフがあるのだが、それを見るとパソコン普及率はあいかわらず高く(2017年までのグラフだが)、2008年あたりからずっとパソコン普及率は80%前後を推移している。 2010年からスマホ普及率が急速に上昇して2010年の10%から2013年の60%に到達するのだが、別にそのあとの時代もパソコン普及率は低下していない。 ネットのデタラメ・不正確な情報(「最近の若者はパソコンを使えない」とかの類)にダマされないようにしよう。 == 資料集 == === スポーツのドラフト制度 === ある資料集では、プロ野球のドラフト制度と、「職業選択の自由」との関連を、考察させようとしているらしい。 (たしか正進社の)公民資料集で、オウム真理教問題の松本サリン事件を紹介。憲法の「身体の自由」や、メディアリテラシーの関連として紹介されているようだ。 戦前の「表現の自由」への弾圧の例として、蟹工船の作品内の文章が 伏せ字(ふせじ)にされた事の紹介。「ストライキ」などの文字が伏せ字にされた。 1988年の長崎市長銃撃事件が紹介されてるが、この解説文に犯人の特徴として「右翼」の文字がある。 「右翼」とか「左翼」とかの語彙は、じつは中学あたりで資料集で習っている可能性がある。 (教学社、正進社とも、)アメリカの近年の経済政策を紹介している。また、ヨーロッパの近年の移民問題などの動向も紹介している。 :アメリカのTPP離脱、 :メキシコとの国境に壁(まだ未達成)、 :鉄鋼・アルミに関税、 :移民制限、 などなど。 「アメリカ第一主義」や「アメリカファースト」などの用語(?)で、トランプのこれらの政策を紹介。 2018年のアメリカによる中国への関税措置。知的財産権の侵害などを理由に、アメリカは2018年、中国に関税などの処置をした。 ネット情報だが、2022年現在、中学あたりの教科書または資料集に、(TPPではなく)RCEP協定(アールセップきょうてい)についても言及しているようである(※教科書の現物はwiki編集時点では未確認)。 === ヨーロッパ情勢 === :イギリスがEUからの離脱の方針の事を紹介。2016年の国民投票でRU離脱派が勝利したことにより、イギリスでEU離脱の議論が活発化している事の紹介。 移民の受け入れ制限の方針転換<br> (いちぶの資料集では)ヨーロッパでは、移民が多くなりすぎた事により、既存の人種からの反発が高まり、移民受け入れを制限する方針になってる事を紹介している。 移民流入の制限のため、ハンガリーがルーマニアやセルビアとの国境を封鎖した事を紹介。 === 日本をとりまく国際関係 === ===== 北朝鮮および中国 ===== とうほう社の資料集「ビジュアル公民2020」によると、北朝鮮が2017年にロケット打ち上げしたりして国際問題になっていると言われてたり、中国(中間人民共和国)が南シナ海の南沙諸島を、2016年のオランダ・ハーグの常設仲裁裁判所の出した判決(中国の主張を退けた)に逆らって(中国が)軍事基地化を進めている事が問題視されている事などを紹介。 北朝鮮問題については、2018年の米朝韓の合意で、朝鮮半島の非核化の合意がされた事を紹介しつつも、しかし具体的なプロセスは進んでおらず、そして2019年には北朝鮮は再び強硬姿勢をつよめている、・・・と資料集は紹介。 南沙諸島については、中国の狙いは、南沙諸島の支配の既成事実化だろうという分析を、その資料集が紹介。また、日本の尖閣諸島も、同様の狙いで、中国に狙われているだろうと、資料集が分析を紹介。このため、日本も予断を許すべきではないと結んでいる。 :※ テレビや新聞などを読むと、取材などの都合でテレビ局は中国などには及び腰であったりするが、しかし実際の国際情勢認識は、とうほう社の資料集のように、きびしいものである。やはり勉強の手段としては、テレビではなく、教育的な書籍で勉強するに限る。 ===== 中国内 ===== 資料集では別のページだが、香港民主化デモの問題も述べている。民主活動家のアグネス・チョウさん(周・庭さん)を資料集では紹介。 資料集には、スウェーデンの環境活動家のグレタさんとか、イスラムの女性の人権問題の活動家のアフメディさんとか、黒人問題のケリスさんなどの若い女性の政治運動を紹介するページが資料集にあり、そのページで、アグネス・チョウさんも紹介している。 2019年に、香港の犯罪者の中国引渡しの条例があり、香港では激しい抗議運動が起きた。アグネス・チョウさんもその活動に関わっている。なお、べつに2019年にアグネスさんは活動を始めたわけではなく、遅くとも2014年の「雨傘運動」(あまがさ うんどう)という民主化運動にはアグネスさんは参加している。 ※ と、とうほう社の資料集はアグネスさんを紹介。 ===== 日韓 ===== 日韓問題では、徴用工問題が、とうほう社の資料集で紹介されている。(慰安婦問題は、未紹介。) 韓国の最高裁にあたる大法院のくだした新日鉄住金(企業名)への賠償命令など、資料集に記載。そして、この判決にもとづいて、韓国内で日本企業に対する差し押さえが進んでいると、資料集は言っている。 なお日本政府は、原告(徴用されたとする朝鮮人)は「徴用」ではなく「募集」に応じたものだという(日本政府の)見解である(※ 資料集が伝えている)。日本政府はこの件では、韓国側の行動には否定的である。 半導体の製造に必要なフッ化水素の輸出規制の件も、資料集は上記の徴用工問題に続けて紹介している。輸出規制といっても、許可不要で輸出できる対象から韓国を外しただけである(そう資料集に書いてある)。(※ なので、フッ化水素の輸入自体は、韓国はいまでも可能である。) しかし、韓国は日本のこの輸出規制の強化に反発し、そして日米韓の3か国で結んでいる軍事包括協定(GSOMIA、ジーショミア)の破棄を 韓国は通告した(※ と、資料集が言っている)。 ===== 日露 ===== さて、日露方面では、北方領土の返還交渉は、2020年以降も、いまだに済んでいない。 たびたび日露両国の政府どうしの返還交渉が話題になるが、しかし2019年の時点ではプーチン大統領が「北方領土を日本に引き渡す計画は無い」と発言している。(と、資料集が紹介している。) ===== 日米 ===== 日米関係については、アメリカのトランプ政権誕生のことが資料集に紹介されているが、しかし2020年の後半(資料集の編集期間はその前だろう)、米国でトランプが大統領選に敗退したので、さてwikibooksでは紹介するべきか否か?(なるべく今後の教科書本文にも応用できそうな話題を書きたいので。) 条約や協定として、経済協定として、「日米物品貿易協定」が2019年に合意された(※ 資料集でも紹介されている)。これは、アメリカがトランプ政権時にTPPから離脱しており、アメリカにとっては代わりの貿易協定のようなものと考えられる。 他のページだが資料集では、沖縄の米軍基地の、オスプレイ問題なども紹介。 === その他、資料集にある時事 === :・ヘイトスピーチ問題の件 :・2019年の「アイヌ民族支援法」。なおこれにより、アイヌ文化振興法は役割を終えた。 ※ なお2019年成立のこの法律のことを「アイヌ施策推進法」ともいう。一部のマスコミなどが「アイヌ民族支援法」とも呼んでいるので、間違いではない。※ 高校の話題だが、高校教科書の第一学習社「公共」教科書で、漫画『ゴールデンカムイ』を明治時代のアイヌ文化を描いた作品だと紹介していた(いちいち高校側で専用ページを設けるほどでもないので、中学側でまとめて紹介)。 :・某私立医大の女子受験生への差別の件 :・LGBT (※2022年現在、(資料集だけでなく)教育出版の公民の検定教科書でも、コラムでLGBTが取り上げられているらしい。(※現物は未確認) )高校の範囲だが、なお、すでに2003年の時点で'''性同一性障害特例法'''という法律が制定されており、裁判所から性同一性障害を公的に認められれば性別を変更でき、結婚などもできる(※ 高校の第一学習社の「公共」教科書で確認)。 :・足利事件(やや古いが、検索の都合上、このリストに載せておく) :・共謀罪。なお2017年に成立した組織犯罪処罰法における、「テロ等準備罪」のこと。 :・皇族の減少問題。もちろん、日本の天皇家やその親戚のこと。女性皇族の是非の議論のあることの紹介や、それにともなう皇室典範の改正の是非の議論などが紹介されている。 :・医薬品販売の規制緩和により、一般用医薬品のネット販売が2014年から原則的に解禁されてる事。なお、それ以前から、コンビニで2009年から風邪薬や鎮痛剤が販売可能になっている。 :・2018年、中国が廃プラスチックの輸入禁止。2019年、廃プラスチックの輸出を禁止するバーゼル条約改正案が採択された。 :・2019年、アメリカがパリ協定から離脱。 :・2018年、イスラエルが、イランが核開発を行っている証拠をつかんだと発表。これをうけアメリカのトランプ政権は、イラン核合意から離脱。イラン核合意は、イランが核兵器開発につながるウラン濃縮をしない代わりに、イランへの制裁を解除するという合意。つまり、イランへの制裁が強まる可能性が高い。もちろんイランは、アメリカのイラン核合意からの離脱に反発し、アメリカへの抗議が行われてた。 逆に、無い話題をあげれば、コロナ問題は、まだ、とうほう社の資料集には、なにも言及されていない。 : : : : == 脚注 == dtbiwa5bjaj7vud61m0zfaz3g1we1g2 C++/初心者むけ/クラス 0 23174 205612 203575 2022-07-21T08:06:59Z Ef3 694 /* ※ 備考 */ : <code>←</code> は継承関係を示し、アローヘッド側は継承元です。この記法は UML でも同じです。 wikitext text/x-wiki == クラスとインスタンス == クラス(''Classes'')は、オブジェクト指向ブログラミング言語の分類の一つ「クラスベースのオブジェクト指向ブログラミング言語」の主体となる概念です<ref>クラスベースのオブジェクト指向ブログラミング言語の他に、プロトタイプベースのオブジェクト指向ブログラミング言語があり Self, JavaScript, Lua が代表的です。</ref>。 C++もクラスベースのオブジェクト指向ブログラミング言語の1つです。 クラスは、データや機能をまとめて提供する手段です。 新しいクラスを定義することは、新しい型を定義することを意味し、その型の新しいインスタンスを作成することができます。 各クラスのインスタンスには、その状態を維持するためのメンバーを持つことができます。 また、クラスのインスタンスには、その状態を変更するための(クラスによって定義された)メソッドを持つことができます。 == おおまかな仕組み == === オブジェクトとメンバー === たとえば、ある車が山田くんちの車だとして、データ名を「yamadacar」としましょう。車には、ナンバープレートがあります。そのナンバープレート番号(変数名:「number」)が文字列"1234"だったとしましょう。 このとき、<code>yamadacar.number</code>という表記により、yamadacarのナンバープレート番号を表現するのが、クラスをもちいた場合の記法です。(どうやって、「クラス」の機能を利用できる状態にするかは、あとの節で説明します。) 「yamadacar」と「number」の間にある「.」は、ドット記号「.」です。 このインスタンス化元のデータ「yamadacar」は、クラスのオブジェクト名というものです。 そして、インスタンス化先のデータ「number」は、クラスのメンバーというものです。 さて、車が、3台あったとしましょう。 :1台目の車(変数名:yamadacar)のナンバープレート番号が「1234」だとしましょう。 :2台目の車(変数名:itoucar)のナンバープレート番号が「7722」だとしましょう。 :3台目の車(変数名:nakanocar)のナンバープレート番号が「8181」だとしましょう。 このような場合、<code>itoucar.number</code>という表記で、2台目の車のナンバープレート番号「7722」の事を表現できます。 このように、あるデータをもとにして(例の場合は「車」)、別の変数がインスタンス化して存在するとき(例の場合は「ナンバープレート番号」)、クラスを使うと、コード内にある、階層性のあるデータと、そのデータからインスタンス化した変数とを、階層化できます。そして、このように、クラスをもちいて、データと変数を階層化することにより、コード内容を把握しやすくなります。 そして、「yamadacar」も「itoucar」も「nakanocar」も、すべて車なので、「Car」というクラス名に所属させます。 === 手順 === :※ 前節のように、「車」で説明するので、先に前節をお読みください。 手順として、まず、クラスとメンバーとの関係を定義させるため、次のようにコードを書きます。 <syntaxhighlight lang="C++"> class Car { int number; }; </syntaxhighlight> つまり、クラス名の定義時に いっしょにメンバーが定義されます。 そして、次のコード <syntaxhighlight lang="C++"> Car yamadacar; </syntaxhighlight> のように、「クラス名 オブジェクト名」のような書式により、クラスと各オブジェクトとの関係を定義します。 このように、あらかじめ、Carというクラス名と内容(メンバー)を定義したあとで、<code>Car yamadacar;</code>と宣言することにより、yamadacarをクラスCarのオブジェクトとして定義できます。 オブジェクト定義のこのような定義の記法については、クラス名を、まるで新しい型のように解釈すると、あたかも変数の宣言と似ていることに、注目してください。このため書籍によっては、クラスについての説明で、「変数に対する型のようなもの」のような解説をしている書籍もあります。 ともかく、上記のコードのようにして、それぞれのオブジェクトをクラスに所属させる事ができます。 よって、まとめると、まず、 <syntaxhighlight lang="C++"> class Car { int number; }; int main() { Car yamadacar; } </syntaxhighlight> のように、記述する必要があります。 そして、<code>Car yamadacar;</code> 以降に、 <syntaxhighlight lang="C++"> yamadacar.number = 1234; </syntaxhighlight> と記述すれば、各オブジェクトのメンバーに、具体的な数値を代入できます。(上記のコードの例の場合は値1234を代入している。) まとめると、 <syntaxhighlight lang="C++"> class Car { int number; }; int main() { Car yamadacar; yamadacar.number = 1234; // このコードは不完全なので、この箇所でコンパイルエラーになります。 } </syntaxhighlight> のように、記述する必要があります。このように、オブジェクトの定義よりも先に、クラス名といっしょにメンバーが定義されます。 つまり、クラス機能を利用するために行う定義・宣言の順序は、 :1番目: クラス名の定義、および、クラスの構造としてメンバーを定義。 :2番目: 各オブジェクトの定義。(そのオブジェクトを、対応するクラスと関連づける方法で、オブジェクトの構造を定義する。) :3番目: 各オブジェクトのメンバーへの、数値の代入など。 という順番になります。 メンバーについて言うと、具体的な個別のデータとしてのメンバーについては、メンバーはオブジェクトからインスタンス化したものになりますが、しかし、メンバーの定義の時では、メンバーはクラスの構造として記述したものになります。 そして、オブジェクトを定義する際に、そのオブジェクトが、どのクラス名のクラスからインスタンス化されたのかを宣言することにより、オブジェクトの構造を定義します。 こうすることにより、もしもオブジェクトが何個も大量にあるときに、オブジェクトの定義の手間を、単にクラスに当てはめるだけでオブジェクトを定義できるので、オブジェクト定義の手間を簡略化できます。 === コード例 === 次に示すコードは、実際に動作するコードです。 <syntaxhighlight lang="C++"> #include <iostream> using namespace std; class Car { public: int number; double fuel; }; int main() { Car yamadacar; yamadacar.number = 1234; Car itoucar; itoucar.number = 7722; cout << "山田くんちの車の番号は" << yamadacar.number << endl; return 0; } </syntaxhighlight> 上記のコードをコンパイルして実行すると、 山田くんちの車の番号は1234 と表示します。 「public」など未紹介のキーワードについては、のちの節で後述します。とりあえず、本書を読み進めてください。 === なんのために、クラスを使うか? === 実は、節「おおまかな仕組み」で説明した仕組みは、「構造体(struct)」の仕組みと、ほぼ同じです(構造体はディフォルトのアクセス指定子が '''public''' な '''class''' です。'''class'''のディフォルトのアクセス指定子は '''private''' です)。 メンバーをprivateとした場合、クラスの外部からは、そのメンバーが存在しないものとして扱われるので、クラスの外部からは、そのクラスのそのメンバーを参照する事ができません。 クラスのメンバーは変数の他、関数をメンバーとする事もできます。 あるクラスのメンバーとなっている関数のことを「メンバー関数」といいます。メンバー関数の内容が書かれている記述場所は、クラスの宣言部の外部です。 このように、クラスの宣言の外部に、メンバー関数の内容は記述されていますが、メンバー関数は非公開設定されたメンバーにアクセスすることができます。 では、なんのために、そんな外部からのアクセスのできない非公開メンバーをわざわざ用意するのかというと、その理由は、クラス宣言内部で、外部からアクセスの可能な公開メンバーのデータを決定するときに、ほかの外部アクセス不可能な非公開メンバーのデータの内容にもとづいて、外部アクセス可能な公開メンバーのデータを決定する場合があるからです。つまり、たとえメンバーを外部アクセス不可能な非公開メンバーとして決定していても、そのクラス宣言の内部およびメンバー関数内部だけなら、その外部アクセス不可能な非公開メンバーでも参照することができます。 逆にいうと、もし、あなたが、こういう事(クラス宣言やメンバー関数の内部だけで非公開メンバーを参照をしたい場合)をする必要のない処理をしたい場合には、わざわざクラスを宣言する必要は少なくて、構造体の宣言ですみます。 構造体は、C言語にも昔から存在している機能ですが、C++においては「ディフォルトのアクセス指定子が public なクラス」と再定義されており、C++の struct は(仮想メンバー関数を含む)メンバー関数を持つことができるなどC言語とは機能的に別物です。 さて、クラス機能で、あるクラスのメンバーが、外部アクセスのできる状態であることの宣言方法は「public」で宣言します。いっぽう、あるクラスのメンバーが、外部アクセスのできない状態であることの宣言方法は「private」で宣言します。(この他にも「protected」という状態も宣言できるのだが、「継承」などの概念が必要になるので、説明を、あとの節に回し、この節では説明を省略する。) なお、われわれのいう「外部アクセス可能/不可能の設定機能」のことを、プログラミング業界の専門用語で、「カプセル化」といいます。 つまり、カプセル化したい要素がない場合、クラス機能を使わずとも「構造体」機能でも済んでしまうでしょう<ref>実際は構造体でも、setter/getterなどのaccessorを定義できるのでカプセル化が行えないわけではない。</ref>。 == 複数個のメンバーの場合 == クラスのメンバーは、複数個あっても、かまいません。 まず、前節までに作成したコードを再掲します。 <syntaxhighlight lang="C++"> class Car { int number; }; </syntaxhighlight> メンバーとは、上記のコードでは、「number」がメンバーです。 では、複数個のメンバーがある場合を考えます。 クラスのメンバーとして、さらに、ある車の燃料の量(変数名「fuel」)があったとしましょう。 そのような場合、コードは単に、 <syntaxhighlight lang="C++"> class Car { int number; double fuel; }; </syntaxhighlight> このように定義するだけです。 == クラスの中のクラスにアクセスしたい場合 == 下記のようになります。 <syntaxhighlight lang="C++"> #include <iostream> using namespace std; class Car { public: int number; double fuel; class inner { public: int test1; double test2; }; }; int main() { Car::inner yamadayear; yamadayear.test1 = 57; cout << "山田さん家のおじさんの年齢は" << yamadayear.test1 << endl; return 0; } </syntaxhighlight> 実行結果 <pre> 山田さん家のおじさんの年齢は57 </pre> 上記コードのようにクラス宣言した場合、下記のような方法ではアクセスできません。 <pre> // エラーになります。 Car yamadayear; yamadayear.inner.test1 = 57; </pre> 下記コードのような方法もあります。外側クラス内のintやdoubleにも変数が宣言されているのと同様に、内側クラスを宣言する際に変数を宣言することで、 intやdoubleと同じようにドット演算子でアクセスできます。 <syntaxhighlight lang="C++"> #include <iostream> using namespace std; class Car { public: int number; double fuel; class inner { public: int test1; double test2; } v; // 変数を追加 }; int main() { Car yamadaClass; yamadaClass.v.test1 = 45; cout << "山田さん家の奥さんの年齢は" << yamadaClass.v.test1 << endl; return 0; } </syntaxhighlight> 実行結果 <pre> 山田さん家の奥さんの年齢は45 </pre> == メンバー関数 == クラスを定義するとき、メンバーには、変数メンバーの他にも、関数をメンバーとする事もできます。 あるクラスのメンバーとなる関数のことを'''関数メンバー'''といいます。「関数メンバー」は、もちろん、関数であります。 では、「車」の例で、メンバー関数を学びましょう。まず、「車のナンバーは◯◯です。」(◯◯には、その車のナンバープレートの番号(円数名「number」)が入る。)と表示する関数を、クラスCarに追加しましょう。 <syntaxhighlight lang="C++"> class Car { int number; void kansuu(); }; </syntaxhighlight> 上記のコードで、「kansuu()」がメンバー関数です。 そして、メンバー関数の内容を定義は、クラスの定義部の外で行うことになります。 メンバー関数の内容を定義するコードの記述方法は、下記のようになります。 <syntaxhighlight lang="C++"> void Car::kansuu() { cout << "車のナンバーは" << number << "です" << endl; } </syntaxhighlight> さて、上記のコード中にもある演算子「::」は、スコープ演算子といいます。コロン「:」を2回、つづけて入力するだけです。(直接入力。) メンバー関数の書式は「クラス名::メンバー関数名()」のようになります。 さて、上記のコードの例では、クラスは1つだけでした。しかし一般に、プログラムによっては、複数個のクラスを定義するプログラムもあります。 そして、クラスが複数個あるプログラムの場合、異なるクラスにおいて、同名のメンバーを定義する事が、できます。 たとえば、あるプログラムで、クラスCarとクラスuntensyu(運転手)を定義して、両方のクラスとも、メンバーとしてnumberを使うこともできます。 また、メンバーが関数の場合(つまりメンバー関数では)、複数個の異なるクラスにある、同名のメンバー関数の内容を、まったく別々の内容にできます。 そのため、メンバー関数の内容を定義するさい、まず、どのクラスに所属するメンバー関数を定義しようとしてるかを、コードに記述する必要があります。 そのため、まず、クラス名を書いてから、直後にスコープ演算子「::」に書いて、そのうしろにメンバー関数名を書く必要があります。 == オブジェクトと名前空間 == C++では、{{code|cout}}や{{code|cin}}などのオブジェクトも、名前空間で分類されています。 たとえばオブジェクト{{code|cout}}は、正式には{{code|std::cout}}というオブジェクトです。つまり、coutはstd名前空間に所属しています。 『[[C++/はじめに]]』では説明を省略していた <code>using namespace std;</code> とは、「名前空間が処略された場合、グローバル名前空間に識別子がなかったら std 名前空間の中から識別子を探す」という意味の宣言だったのです。 {{code|std}}とは、標準ライブラリ(standard library)を意味する略語です。 {{code|cin}}も同様に、{{code|std::cin}}というオブジェクトです。つまり、cinはstd名前空間に所属しています。 スコープ演算子{{code|::}}をつかうことから分かるように、std名前空間に含まれるオブジェクトとして、{{code|cout}}や{{code|cin}}を扱っています。 書式は、 名前空間名::識別子 です。 プログラミング言語に用意されている 標準ライブラリのオブジェクトは、膨大にあるので、名前空間によって分類する必要があり、使用時には本来、その名前空間名をつける必要があるのです。 なぜなら、そうしないと、もし、自分で新しく関数を定義しようと思ったときに、名前につけようと思ってた識別子が、すでに標準ライブラリで使われている可能性があるからです。 このような工夫を、(使いたい名前が既に他の用途で使われてしまっているような事態をふせぐための工夫を)「名前の衝突をふせぐ」などと、言います。 {{コラム|using namespace std; の問題点|2= 多くのプログラムで :<syntaxhighlight lang="C++"> using namespace std; </syntaxhighlight> のように、名前空間丸ごとスコープ限定演算子なしにアクセスできるようにするコードを見受けます。 これでは、std::には数多の識別子が定義されているので、無自覚に名前の衝突を招いてしまう可能性があります。 これを回避するためには、 :<syntaxhighlight lang="C++"> using std::cout, std::endl; </syntaxhighlight> :のように識別子を限定して using 宣言するよう心がけましょう。 :: この例では、 cout と endl の2つの識別子だけがスコープ演算子なしに参照出来るようになります。 : また using 宣言にもスコープがあり、関数スコープにすることも検討の価値があります。 }} === 名前空間の定義 === 名前空間は、ユーザープログラムからも定義できます。 ;名前空間の定義:<syntaxhighlight lang="C++"> namespace NS1 { int i = 3; int f() { return 42; } } int x = NS1::i; // ⇒ 3 int y = NS1::f(); // ⇒ 42 </syntaxhighlight> 名前空間は、入れ子に出来ます。 ;入れ子名前空間の定義:<syntaxhighlight lang="C++"> namespace NS1 { namespace NS2 { int j = 9; int g() { return 108; } } } int u = NS1::NS2::j; // ⇒ 9 int v = NS1::NS2::g(); // ⇒ 108 </syntaxhighlight> C++14 から、入れ子名前空間の簡略表記が使えるようになりました。 ;入れ子名前空間の簡略表記による定義:<syntaxhighlight lang="C++"> namespace NS1::NS2 { int j = 9; int g() { return 108; } } int u = NS1::NS2::j; // ⇒ 9 int v = NS1::NS2::g(); // ⇒ 108 </syntaxhighlight> == コンストラクタとデストラクタ == === コンストラクタ === オブジェクトの作成時に、自動的に、ある関数を呼び出すことができます。 オブジェクトの定義時に自動的に呼び出される関数のことをコンストラクタといいます。 クラスのメンバー関数を定義するときに、メンバー関数名を、クラス名と同じ名称にすると、そのメンバー名の内容が、コンストラクタの内容になります。 つまり、コード <syntaxhighlight lang="C++"> class Car { int number; void kansuu(); Car(); }; </syntaxhighlight> の、メンバー関数 Car() が、コンストラクタです。 コンストラクタにアクセスする場合は、メンバー関数へのアクセスと同様にスコープ演算子「::」を使うことになります。 たとえば、上記のクラスCarのコンストラクタを定義する場合なら、 Car::Car() がクラスCarのコンストラクタの定義対象となります。 例として、クラスCarのコンストラクタの内容を、初期値としてメンバー変数に0を代入するとした場合、下記のコードのようになります。 <syntaxhighlight lang="C++"> Car::Car() : number(0) {} </syntaxhighlight> コンストラクタも関数の一種なので、コンストラクタの内容の記述方法は、関数とほぼ同様の記述ですが、しかし、戻り値(冒頭のvoidなど)がない事に注目してください。 そして、オブジェクトが生成されたときにコンストラクタが呼び出されるわけですから、つまり、 Car yamadacar; または Car itoucar; などによってyamadacarやitoucarを生成したときに、コンストラクタが自動的に呼び出されます。 == 「継承」とは == すでに存在するクラスをもとにして、新しい別のクラスを作成することが、クラスの継承です。 細かく言えば、「継承」(けいしょう、inheritance)とは、既に存在しているクラスについての定義文をもとにして、新しいクラスをつくる事を、クラスの「継承」といいます。 クラスBをもとにして、新しくクラスDをつくるとき、 <syntaxhighlight lang="C++"> class D : public B { }; </syntaxhighlight> :「クラスDをクラスBをpublic継承(公開継承)している」と読み、クラスBはクラスDの基底クラスと呼び。クラスDを派生クラスと呼びます。 さきほどのクラスの定義文の文例でも、コロン記号の前にある「class D」について、内容は「public B {}」であると説明しているわけです。 とにかく、クラスの継承の仕方は、次のようになります。 <syntaxhighlight lang="C++"> class 派生クラス名 : public 基底クラス名 { }; </syntaxhighlight> 基底クラス側でprivateにアクセス指定されていたメンバーは、派生クラスからはアクセスできません。また、privateをつけると、外部の一般の関数からも、アクセスできません。privateをつけると、main()関数からも、直接はアクセスできません。要するに、原則的に、private指定されたメンバーには、外部からはアクセスできません。 private指定されたメンバーに、main関数や他の一般の関数からアクセスしようとすると、エラーになります。 なお、クラスのアクセス指定を省略すると、private指定として扱われます。 基底クラス側でpublicにアクセス指定されていたメンバーは、派生クラスからアクセスできます。なお、他のクラスやグローバルな関数からも、publicにアクセス指定されたメンバーにはアクセスできます。 基底クラス側でprotectedというふうにアクセス指定すると、他のクラスやグローバルな関数からはアクセスできなくなりますが、しかし、派生クラスのメンバーからはアクセスできます。 つまり、 「protected」とは何かというと、自分自身のクラス以外とのアクセスについては、派生クラスのメンバーからのアクセスだけを許すためのアクセス指定こそが protected です。 なお、private, public, protected などをまとめて、アクセス指定子といいます。 === ※ 備考 === よそのプログラミング言語では、基底クラスのことを「親クラス」といい、派生クラスのことを「子クラス」という場合もあります。 ほかにも、あるプログラミング言語では、基底クラスのことを「スーパークラス」といい、派生クラスのことを「サブクラス」という場合もあります。 :{| class="wikitable" |+ 継承に関するクラスの名前 |- style="text-align:center" ! 派生元のクラス ← 派生先のクラス |- style="text-align:center" | 基底クラス ← 派生クラス |- style="text-align:center" | 親クラス ← 子クラス |- style="text-align:center" | スーパークラス ← サブクラス |- |} : <code>←</code> は継承関係を示し、アローヘッド側は継承元です。この記法は UML でも同じです。 しかし、C++言語では、「基底クラス」と「派生クラス」という言い方が使用されるのが一般的です。 === 多重継承 === 継承では、派生元のクラス(基底クラス)は、複数個であってもいい。 つまり、クラスDの派生元が、クラスBとクラスEというふうに、複数個の基底クラスがあるような継承も、可能である。 <syntaxhighlight lang="C++"> class D : public B, public class E { }; </syntaxhighlight> 上記のコードで、クラスBとクラスEが、基底クラスである。クラスDは、派生クラスである。 このように、複数個の派生元によって行われる継承のことを'''多重継承'''という。 多重継承のコードの記述では、複数個ある基底クラスはカンマ「,」で区切って、複数記述する。 * 多重継承で、異なる基底クラスに、同名のメンバーがあるとき :(※ 調査中) スコープ演算子::で、「クラス名::メンバー名」の順序で記述することにより、区別します。 == 入れ子クラス == クラスの中に、別のクラスを入れることができる。このような手法を「入れ子クラス」(いれこ クラス)という。 (コード例) <syntaxhighlight lang="C++"> #include <iostream> using namespace std; class Car { public: class inner { public: int number; double fuel; }; }; int main() { Car::inner yamadacar; yamadacar.number = 1234; Car::inner itoucar; itoucar.number = 7722; cout << "クラスの入れ子" << endl; cout << "山田くんちの車の番号は" << yamadacar.number << endl; </syntaxhighlight> 実行結果 クラスの入れ子 山田くんちの車の番号は1234 内側にあるほうのクラスのことを「内部クラス」とか「インナークラス」(inner class)という。上記のコードでは「inner」が内部クラスである。 いっぽう、外側にあるほうのクラスを「外部クラス」とか「アウタークラス」(outer class)などという。上記コードでは「Car」が外部クラスである。 「入れ子」(いれこ)のことを英語で nest ネストというので、もしネットで調べたいときは「nest class」(ネストクラス)などで調べれば良い。 * 構造体の入れ子 なお、構造体でも同様に、ある構造体のなかに、別の構造体を入れることができる(構造体はディフォルトでメンバーがpublicなクラスです)。 <syntaxhighlight lang="C++"> #include <iostream> using namespace std; struct Car { struct inner { public: int number; double fuel; }; }; int main() { Car::inner yamadacar; yamadacar.number = 1234; Car::inner itoucar; itoucar.number = 7722; cout << "構造体の入れ子" << endl; cout << "山田くんちの車の番号は" << yamadacar.number << endl; } </syntaxhighlight> 実行結果 構造体の入れ子 山田くんちの車の番号は1234 == 「ゲッター」と「セッター」 == データーメンバーをpublicにするのはカプセル化の理想・理念に反します。 そこでデーターメンバーをprivateとし、データーメンバーの値を参照するためのメンバー関数(ゲッター)とデーターメンバーを変更するためのメンバー関数(セッター)を用意し内部構造の隠蔽を図ります。 ゲッターとセッターにより内部構造の隠蔽のほか、変換や受入検査などを行うことができるようになります。 演算子オーバーロードでゲッター・セッターを実装すると、クラスを利用するコードはゲッター・セッターを使っていることすら意識しないですみます。 ;[https://paiza.io/projects/qjWH-kIVrOrgH2XGHe-ZuA?language=cpp ゲッターとセッターの例]:<syntaxhighlight lang="cpp"> #include <iostream> class TestClass { private: int priv; public: TestClass(const int i) : priv(i) {} // Default constructor TestClass(TestClass &tc) : priv(tc.priv) {} // Copy constructor const int value() { return this->priv; } // Accessor (ゲッター) void value(const int i) { this->priv = i; } // Mutator (セッター) }; int main() { TestClass x(12); // Default constructor call auto y = x; // Copy constructor call std::cout << x.value() << std::endl; // Accessor call x.value(42); // Mutator call std::cout << x.value() << std::endl; // Accessor call std::cout << y.value() << std::endl; // Accessor call } </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> 12 42 12 </syntaxhighlight> {{コラム|Accessors and Mutators| 日本語圏では、データーメンバーを参照するためのメンバー関数を'''ゲッター'''、データーメンバーを変更するためのメンバー関数を'''セッター'''と呼び総称して'''アクセサー'''と呼びます。 これに対し、英語圏ではデーターメンバーを参照するためのメンバー関数を'''Accessors'''、データーメンバーの値を変更するためのメンバー関数を'''Mutators'''と呼びます。 特に、'''アクセサー'''と'''Accessors'''を混同する可能性があるので、意思の疎通に齟齬が生じないよう気をつけましょう。 {{See also|w:en:Mutator method}} }} == 実装例 == C++に、「[[Go/メソッドとインターフェース]]」の「都市間の大圏距離を求めるメソッドを追加した例」を移植してみました。 ; [https://paiza.io/projects/jya-Q9ldO8XoBQHnOibF5w?language=cpp 実装例] : <syntaxhighlight lang="c++"> #include <cmath> #include <iostream> #include <string> class GeoCoord { double longitude, latitude; public: GeoCoord(double lng, double lat) : longitude(lng), latitude(lat) {} std::string toString() { const auto *ew = "東経"; const auto *ns = "北緯"; auto lng = this->longitude; // long はCでは予約語なので lng に auto lat = this->latitude; if (lng < 0.0) { ew = "西経"; lng = -lng; } if (lat < 0.0) { ns = "南緯"; lat = -lat; } return std::string("(") + ew + ": " + std::to_string(lng) + ", " + ns + ": " + std::to_string(lat) + ")"; } double distance(GeoCoord &other) { // C言語では円周率の値は標準では定義されていません。 const auto i = 3.1415926536 / 180; const auto R = 6371.008; return std::acos( std::sin(this->latitude * i) * std::sin(other.latitude * i) + std::cos(this->latitude * i) * std::cos(other.latitude * i) * std::cos(this->longitude * i - other.longitude * i)) * R; } }; int main(void) { struct { const char *name; GeoCoord gc; } sites[] = { {"東京駅", GeoCoord(139.7673068, 35.6809591)}, {"シドニー・オペラハウス", GeoCoord(151.215278, -33.856778)}, {"グリニッジ天文台", GeoCoord(-0.0014, 51.4778)}, }; for (auto x : sites) { std::cout << x.name << ": " << x.gc.toString() << std::endl; } for (int i = 0, len = sizeof sites / sizeof *sites; i < len; i++) { const auto j = (i + 1) % len; std::cout << sites[i].name << " - " << sites[j].name << ": " << sites[i].gc.distance(sites[j].gc) << std::endl; } }</syntaxhighlight> ; 実行結果 : <syntaxhighlight lang=text> 東京駅: (東経: 139.767307, 北緯: 35.680959) シドニー・オペラハウス: (東経: 151.215278, 南緯: 33.856778) グリニッジ天文台: (西経: 0.001400, 北緯: 51.477800) 東京駅 - シドニー・オペラハウス: 7823.27 シドニー・オペラハウス - グリニッジ天文台: 16987.3 グリニッジ天文台 - 東京駅: 9560.55 </syntaxhighlight> <!-- ※ 今後の編集作業のための予備のタグ。 ; コード例 : <syntaxhighlight lang="c++"> #include <stdio.h> </syntaxhighlight> ; 実行結果 : <syntaxhighlight lang=text> </syntaxhighlight> --> 1uae54xlojjzzbyt3x39fpy7uuryb22 205617 205612 2022-07-21T10:11:46Z Ef3 694 /* クラスとインスタンス */ ln wikitext text/x-wiki == クラスとインスタンス == クラス( ''Classes'' )は、オブジェクト指向ブログラミング言語の分類の一つ「[[オブジェクト指向プログラミング#クラスベースのオブジェクト指向|クラスベースのオブジェクト指向ブログラミング言語]]」の主要な概念の1つです<ref>クラスベースのオブジェクト指向ブログラミング言語の他に、[[オブジェクト指向プログラミング#プロトタイプベースのオブジェクト指向|プロトタイプベースのオブジェクト指向ブログラミング言語]]があり [[Self]], [[JavaScript]], [[Lua]] が代表的です。</ref>。 C++もクラスベースのオブジェクト指向ブログラミング言語の1つです。 クラスは、データーやデーターへの参照変更を含む操作をまとめる手段です。 新しいクラスを定義することは、新しい型を定義することを意味し、その型を使って、インスタンスを作成することができるようになります。 各クラスのインスタンスには、その状態を維持するためのデーター メンバーを持つことができます。 また、クラスには、そのクラスに属するインスタンスの(あるいはクラスそのものの)状態を参照および変更するためのメンバー関数を持つことができます。 == おおまかな仕組み == === オブジェクトとメンバー === たとえば、ある車が山田くんちの車だとして、データ名を「yamadacar」としましょう。車には、ナンバープレートがあります。そのナンバープレート番号(変数名:「number」)が文字列"1234"だったとしましょう。 このとき、<code>yamadacar.number</code>という表記により、yamadacarのナンバープレート番号を表現するのが、クラスをもちいた場合の記法です。(どうやって、「クラス」の機能を利用できる状態にするかは、あとの節で説明します。) 「yamadacar」と「number」の間にある「.」は、ドット記号「.」です。 このインスタンス化元のデータ「yamadacar」は、クラスのオブジェクト名というものです。 そして、インスタンス化先のデータ「number」は、クラスのメンバーというものです。 さて、車が、3台あったとしましょう。 :1台目の車(変数名:yamadacar)のナンバープレート番号が「1234」だとしましょう。 :2台目の車(変数名:itoucar)のナンバープレート番号が「7722」だとしましょう。 :3台目の車(変数名:nakanocar)のナンバープレート番号が「8181」だとしましょう。 このような場合、<code>itoucar.number</code>という表記で、2台目の車のナンバープレート番号「7722」の事を表現できます。 このように、あるデータをもとにして(例の場合は「車」)、別の変数がインスタンス化して存在するとき(例の場合は「ナンバープレート番号」)、クラスを使うと、コード内にある、階層性のあるデータと、そのデータからインスタンス化した変数とを、階層化できます。そして、このように、クラスをもちいて、データと変数を階層化することにより、コード内容を把握しやすくなります。 そして、「yamadacar」も「itoucar」も「nakanocar」も、すべて車なので、「Car」というクラス名に所属させます。 === 手順 === :※ 前節のように、「車」で説明するので、先に前節をお読みください。 手順として、まず、クラスとメンバーとの関係を定義させるため、次のようにコードを書きます。 <syntaxhighlight lang="C++"> class Car { int number; }; </syntaxhighlight> つまり、クラス名の定義時に いっしょにメンバーが定義されます。 そして、次のコード <syntaxhighlight lang="C++"> Car yamadacar; </syntaxhighlight> のように、「クラス名 オブジェクト名」のような書式により、クラスと各オブジェクトとの関係を定義します。 このように、あらかじめ、Carというクラス名と内容(メンバー)を定義したあとで、<code>Car yamadacar;</code>と宣言することにより、yamadacarをクラスCarのオブジェクトとして定義できます。 オブジェクト定義のこのような定義の記法については、クラス名を、まるで新しい型のように解釈すると、あたかも変数の宣言と似ていることに、注目してください。このため書籍によっては、クラスについての説明で、「変数に対する型のようなもの」のような解説をしている書籍もあります。 ともかく、上記のコードのようにして、それぞれのオブジェクトをクラスに所属させる事ができます。 よって、まとめると、まず、 <syntaxhighlight lang="C++"> class Car { int number; }; int main() { Car yamadacar; } </syntaxhighlight> のように、記述する必要があります。 そして、<code>Car yamadacar;</code> 以降に、 <syntaxhighlight lang="C++"> yamadacar.number = 1234; </syntaxhighlight> と記述すれば、各オブジェクトのメンバーに、具体的な数値を代入できます。(上記のコードの例の場合は値1234を代入している。) まとめると、 <syntaxhighlight lang="C++"> class Car { int number; }; int main() { Car yamadacar; yamadacar.number = 1234; // このコードは不完全なので、この箇所でコンパイルエラーになります。 } </syntaxhighlight> のように、記述する必要があります。このように、オブジェクトの定義よりも先に、クラス名といっしょにメンバーが定義されます。 つまり、クラス機能を利用するために行う定義・宣言の順序は、 :1番目: クラス名の定義、および、クラスの構造としてメンバーを定義。 :2番目: 各オブジェクトの定義。(そのオブジェクトを、対応するクラスと関連づける方法で、オブジェクトの構造を定義する。) :3番目: 各オブジェクトのメンバーへの、数値の代入など。 という順番になります。 メンバーについて言うと、具体的な個別のデータとしてのメンバーについては、メンバーはオブジェクトからインスタンス化したものになりますが、しかし、メンバーの定義の時では、メンバーはクラスの構造として記述したものになります。 そして、オブジェクトを定義する際に、そのオブジェクトが、どのクラス名のクラスからインスタンス化されたのかを宣言することにより、オブジェクトの構造を定義します。 こうすることにより、もしもオブジェクトが何個も大量にあるときに、オブジェクトの定義の手間を、単にクラスに当てはめるだけでオブジェクトを定義できるので、オブジェクト定義の手間を簡略化できます。 === コード例 === 次に示すコードは、実際に動作するコードです。 <syntaxhighlight lang="C++"> #include <iostream> using namespace std; class Car { public: int number; double fuel; }; int main() { Car yamadacar; yamadacar.number = 1234; Car itoucar; itoucar.number = 7722; cout << "山田くんちの車の番号は" << yamadacar.number << endl; return 0; } </syntaxhighlight> 上記のコードをコンパイルして実行すると、 山田くんちの車の番号は1234 と表示します。 「public」など未紹介のキーワードについては、のちの節で後述します。とりあえず、本書を読み進めてください。 === なんのために、クラスを使うか? === 実は、節「おおまかな仕組み」で説明した仕組みは、「構造体(struct)」の仕組みと、ほぼ同じです(構造体はディフォルトのアクセス指定子が '''public''' な '''class''' です。'''class'''のディフォルトのアクセス指定子は '''private''' です)。 メンバーをprivateとした場合、クラスの外部からは、そのメンバーが存在しないものとして扱われるので、クラスの外部からは、そのクラスのそのメンバーを参照する事ができません。 クラスのメンバーは変数の他、関数をメンバーとする事もできます。 あるクラスのメンバーとなっている関数のことを「メンバー関数」といいます。メンバー関数の内容が書かれている記述場所は、クラスの宣言部の外部です。 このように、クラスの宣言の外部に、メンバー関数の内容は記述されていますが、メンバー関数は非公開設定されたメンバーにアクセスすることができます。 では、なんのために、そんな外部からのアクセスのできない非公開メンバーをわざわざ用意するのかというと、その理由は、クラス宣言内部で、外部からアクセスの可能な公開メンバーのデータを決定するときに、ほかの外部アクセス不可能な非公開メンバーのデータの内容にもとづいて、外部アクセス可能な公開メンバーのデータを決定する場合があるからです。つまり、たとえメンバーを外部アクセス不可能な非公開メンバーとして決定していても、そのクラス宣言の内部およびメンバー関数内部だけなら、その外部アクセス不可能な非公開メンバーでも参照することができます。 逆にいうと、もし、あなたが、こういう事(クラス宣言やメンバー関数の内部だけで非公開メンバーを参照をしたい場合)をする必要のない処理をしたい場合には、わざわざクラスを宣言する必要は少なくて、構造体の宣言ですみます。 構造体は、C言語にも昔から存在している機能ですが、C++においては「ディフォルトのアクセス指定子が public なクラス」と再定義されており、C++の struct は(仮想メンバー関数を含む)メンバー関数を持つことができるなどC言語とは機能的に別物です。 さて、クラス機能で、あるクラスのメンバーが、外部アクセスのできる状態であることの宣言方法は「public」で宣言します。いっぽう、あるクラスのメンバーが、外部アクセスのできない状態であることの宣言方法は「private」で宣言します。(この他にも「protected」という状態も宣言できるのだが、「継承」などの概念が必要になるので、説明を、あとの節に回し、この節では説明を省略する。) なお、われわれのいう「外部アクセス可能/不可能の設定機能」のことを、プログラミング業界の専門用語で、「カプセル化」といいます。 つまり、カプセル化したい要素がない場合、クラス機能を使わずとも「構造体」機能でも済んでしまうでしょう<ref>実際は構造体でも、setter/getterなどのaccessorを定義できるのでカプセル化が行えないわけではない。</ref>。 == 複数個のメンバーの場合 == クラスのメンバーは、複数個あっても、かまいません。 まず、前節までに作成したコードを再掲します。 <syntaxhighlight lang="C++"> class Car { int number; }; </syntaxhighlight> メンバーとは、上記のコードでは、「number」がメンバーです。 では、複数個のメンバーがある場合を考えます。 クラスのメンバーとして、さらに、ある車の燃料の量(変数名「fuel」)があったとしましょう。 そのような場合、コードは単に、 <syntaxhighlight lang="C++"> class Car { int number; double fuel; }; </syntaxhighlight> このように定義するだけです。 == クラスの中のクラスにアクセスしたい場合 == 下記のようになります。 <syntaxhighlight lang="C++"> #include <iostream> using namespace std; class Car { public: int number; double fuel; class inner { public: int test1; double test2; }; }; int main() { Car::inner yamadayear; yamadayear.test1 = 57; cout << "山田さん家のおじさんの年齢は" << yamadayear.test1 << endl; return 0; } </syntaxhighlight> 実行結果 <pre> 山田さん家のおじさんの年齢は57 </pre> 上記コードのようにクラス宣言した場合、下記のような方法ではアクセスできません。 <pre> // エラーになります。 Car yamadayear; yamadayear.inner.test1 = 57; </pre> 下記コードのような方法もあります。外側クラス内のintやdoubleにも変数が宣言されているのと同様に、内側クラスを宣言する際に変数を宣言することで、 intやdoubleと同じようにドット演算子でアクセスできます。 <syntaxhighlight lang="C++"> #include <iostream> using namespace std; class Car { public: int number; double fuel; class inner { public: int test1; double test2; } v; // 変数を追加 }; int main() { Car yamadaClass; yamadaClass.v.test1 = 45; cout << "山田さん家の奥さんの年齢は" << yamadaClass.v.test1 << endl; return 0; } </syntaxhighlight> 実行結果 <pre> 山田さん家の奥さんの年齢は45 </pre> == メンバー関数 == クラスを定義するとき、メンバーには、変数メンバーの他にも、関数をメンバーとする事もできます。 あるクラスのメンバーとなる関数のことを'''関数メンバー'''といいます。「関数メンバー」は、もちろん、関数であります。 では、「車」の例で、メンバー関数を学びましょう。まず、「車のナンバーは◯◯です。」(◯◯には、その車のナンバープレートの番号(円数名「number」)が入る。)と表示する関数を、クラスCarに追加しましょう。 <syntaxhighlight lang="C++"> class Car { int number; void kansuu(); }; </syntaxhighlight> 上記のコードで、「kansuu()」がメンバー関数です。 そして、メンバー関数の内容を定義は、クラスの定義部の外で行うことになります。 メンバー関数の内容を定義するコードの記述方法は、下記のようになります。 <syntaxhighlight lang="C++"> void Car::kansuu() { cout << "車のナンバーは" << number << "です" << endl; } </syntaxhighlight> さて、上記のコード中にもある演算子「::」は、スコープ演算子といいます。コロン「:」を2回、つづけて入力するだけです。(直接入力。) メンバー関数の書式は「クラス名::メンバー関数名()」のようになります。 さて、上記のコードの例では、クラスは1つだけでした。しかし一般に、プログラムによっては、複数個のクラスを定義するプログラムもあります。 そして、クラスが複数個あるプログラムの場合、異なるクラスにおいて、同名のメンバーを定義する事が、できます。 たとえば、あるプログラムで、クラスCarとクラスuntensyu(運転手)を定義して、両方のクラスとも、メンバーとしてnumberを使うこともできます。 また、メンバーが関数の場合(つまりメンバー関数では)、複数個の異なるクラスにある、同名のメンバー関数の内容を、まったく別々の内容にできます。 そのため、メンバー関数の内容を定義するさい、まず、どのクラスに所属するメンバー関数を定義しようとしてるかを、コードに記述する必要があります。 そのため、まず、クラス名を書いてから、直後にスコープ演算子「::」に書いて、そのうしろにメンバー関数名を書く必要があります。 == オブジェクトと名前空間 == C++では、{{code|cout}}や{{code|cin}}などのオブジェクトも、名前空間で分類されています。 たとえばオブジェクト{{code|cout}}は、正式には{{code|std::cout}}というオブジェクトです。つまり、coutはstd名前空間に所属しています。 『[[C++/はじめに]]』では説明を省略していた <code>using namespace std;</code> とは、「名前空間が処略された場合、グローバル名前空間に識別子がなかったら std 名前空間の中から識別子を探す」という意味の宣言だったのです。 {{code|std}}とは、標準ライブラリ(standard library)を意味する略語です。 {{code|cin}}も同様に、{{code|std::cin}}というオブジェクトです。つまり、cinはstd名前空間に所属しています。 スコープ演算子{{code|::}}をつかうことから分かるように、std名前空間に含まれるオブジェクトとして、{{code|cout}}や{{code|cin}}を扱っています。 書式は、 名前空間名::識別子 です。 プログラミング言語に用意されている 標準ライブラリのオブジェクトは、膨大にあるので、名前空間によって分類する必要があり、使用時には本来、その名前空間名をつける必要があるのです。 なぜなら、そうしないと、もし、自分で新しく関数を定義しようと思ったときに、名前につけようと思ってた識別子が、すでに標準ライブラリで使われている可能性があるからです。 このような工夫を、(使いたい名前が既に他の用途で使われてしまっているような事態をふせぐための工夫を)「名前の衝突をふせぐ」などと、言います。 {{コラム|using namespace std; の問題点|2= 多くのプログラムで :<syntaxhighlight lang="C++"> using namespace std; </syntaxhighlight> のように、名前空間丸ごとスコープ限定演算子なしにアクセスできるようにするコードを見受けます。 これでは、std::には数多の識別子が定義されているので、無自覚に名前の衝突を招いてしまう可能性があります。 これを回避するためには、 :<syntaxhighlight lang="C++"> using std::cout, std::endl; </syntaxhighlight> :のように識別子を限定して using 宣言するよう心がけましょう。 :: この例では、 cout と endl の2つの識別子だけがスコープ演算子なしに参照出来るようになります。 : また using 宣言にもスコープがあり、関数スコープにすることも検討の価値があります。 }} === 名前空間の定義 === 名前空間は、ユーザープログラムからも定義できます。 ;名前空間の定義:<syntaxhighlight lang="C++"> namespace NS1 { int i = 3; int f() { return 42; } } int x = NS1::i; // ⇒ 3 int y = NS1::f(); // ⇒ 42 </syntaxhighlight> 名前空間は、入れ子に出来ます。 ;入れ子名前空間の定義:<syntaxhighlight lang="C++"> namespace NS1 { namespace NS2 { int j = 9; int g() { return 108; } } } int u = NS1::NS2::j; // ⇒ 9 int v = NS1::NS2::g(); // ⇒ 108 </syntaxhighlight> C++14 から、入れ子名前空間の簡略表記が使えるようになりました。 ;入れ子名前空間の簡略表記による定義:<syntaxhighlight lang="C++"> namespace NS1::NS2 { int j = 9; int g() { return 108; } } int u = NS1::NS2::j; // ⇒ 9 int v = NS1::NS2::g(); // ⇒ 108 </syntaxhighlight> == コンストラクタとデストラクタ == === コンストラクタ === オブジェクトの作成時に、自動的に、ある関数を呼び出すことができます。 オブジェクトの定義時に自動的に呼び出される関数のことをコンストラクタといいます。 クラスのメンバー関数を定義するときに、メンバー関数名を、クラス名と同じ名称にすると、そのメンバー名の内容が、コンストラクタの内容になります。 つまり、コード <syntaxhighlight lang="C++"> class Car { int number; void kansuu(); Car(); }; </syntaxhighlight> の、メンバー関数 Car() が、コンストラクタです。 コンストラクタにアクセスする場合は、メンバー関数へのアクセスと同様にスコープ演算子「::」を使うことになります。 たとえば、上記のクラスCarのコンストラクタを定義する場合なら、 Car::Car() がクラスCarのコンストラクタの定義対象となります。 例として、クラスCarのコンストラクタの内容を、初期値としてメンバー変数に0を代入するとした場合、下記のコードのようになります。 <syntaxhighlight lang="C++"> Car::Car() : number(0) {} </syntaxhighlight> コンストラクタも関数の一種なので、コンストラクタの内容の記述方法は、関数とほぼ同様の記述ですが、しかし、戻り値(冒頭のvoidなど)がない事に注目してください。 そして、オブジェクトが生成されたときにコンストラクタが呼び出されるわけですから、つまり、 Car yamadacar; または Car itoucar; などによってyamadacarやitoucarを生成したときに、コンストラクタが自動的に呼び出されます。 == 「継承」とは == すでに存在するクラスをもとにして、新しい別のクラスを作成することが、クラスの継承です。 細かく言えば、「継承」(けいしょう、inheritance)とは、既に存在しているクラスについての定義文をもとにして、新しいクラスをつくる事を、クラスの「継承」といいます。 クラスBをもとにして、新しくクラスDをつくるとき、 <syntaxhighlight lang="C++"> class D : public B { }; </syntaxhighlight> :「クラスDをクラスBをpublic継承(公開継承)している」と読み、クラスBはクラスDの基底クラスと呼び。クラスDを派生クラスと呼びます。 さきほどのクラスの定義文の文例でも、コロン記号の前にある「class D」について、内容は「public B {}」であると説明しているわけです。 とにかく、クラスの継承の仕方は、次のようになります。 <syntaxhighlight lang="C++"> class 派生クラス名 : public 基底クラス名 { }; </syntaxhighlight> 基底クラス側でprivateにアクセス指定されていたメンバーは、派生クラスからはアクセスできません。また、privateをつけると、外部の一般の関数からも、アクセスできません。privateをつけると、main()関数からも、直接はアクセスできません。要するに、原則的に、private指定されたメンバーには、外部からはアクセスできません。 private指定されたメンバーに、main関数や他の一般の関数からアクセスしようとすると、エラーになります。 なお、クラスのアクセス指定を省略すると、private指定として扱われます。 基底クラス側でpublicにアクセス指定されていたメンバーは、派生クラスからアクセスできます。なお、他のクラスやグローバルな関数からも、publicにアクセス指定されたメンバーにはアクセスできます。 基底クラス側でprotectedというふうにアクセス指定すると、他のクラスやグローバルな関数からはアクセスできなくなりますが、しかし、派生クラスのメンバーからはアクセスできます。 つまり、 「protected」とは何かというと、自分自身のクラス以外とのアクセスについては、派生クラスのメンバーからのアクセスだけを許すためのアクセス指定こそが protected です。 なお、private, public, protected などをまとめて、アクセス指定子といいます。 === ※ 備考 === よそのプログラミング言語では、基底クラスのことを「親クラス」といい、派生クラスのことを「子クラス」という場合もあります。 ほかにも、あるプログラミング言語では、基底クラスのことを「スーパークラス」といい、派生クラスのことを「サブクラス」という場合もあります。 :{| class="wikitable" |+ 継承に関するクラスの名前 |- style="text-align:center" ! 派生元のクラス ← 派生先のクラス |- style="text-align:center" | 基底クラス ← 派生クラス |- style="text-align:center" | 親クラス ← 子クラス |- style="text-align:center" | スーパークラス ← サブクラス |- |} : <code>←</code> は継承関係を示し、アローヘッド側は継承元です。この記法は UML でも同じです。 しかし、C++言語では、「基底クラス」と「派生クラス」という言い方が使用されるのが一般的です。 === 多重継承 === 継承では、派生元のクラス(基底クラス)は、複数個であってもいい。 つまり、クラスDの派生元が、クラスBとクラスEというふうに、複数個の基底クラスがあるような継承も、可能である。 <syntaxhighlight lang="C++"> class D : public B, public class E { }; </syntaxhighlight> 上記のコードで、クラスBとクラスEが、基底クラスである。クラスDは、派生クラスである。 このように、複数個の派生元によって行われる継承のことを'''多重継承'''という。 多重継承のコードの記述では、複数個ある基底クラスはカンマ「,」で区切って、複数記述する。 * 多重継承で、異なる基底クラスに、同名のメンバーがあるとき :(※ 調査中) スコープ演算子::で、「クラス名::メンバー名」の順序で記述することにより、区別します。 == 入れ子クラス == クラスの中に、別のクラスを入れることができる。このような手法を「入れ子クラス」(いれこ クラス)という。 (コード例) <syntaxhighlight lang="C++"> #include <iostream> using namespace std; class Car { public: class inner { public: int number; double fuel; }; }; int main() { Car::inner yamadacar; yamadacar.number = 1234; Car::inner itoucar; itoucar.number = 7722; cout << "クラスの入れ子" << endl; cout << "山田くんちの車の番号は" << yamadacar.number << endl; </syntaxhighlight> 実行結果 クラスの入れ子 山田くんちの車の番号は1234 内側にあるほうのクラスのことを「内部クラス」とか「インナークラス」(inner class)という。上記のコードでは「inner」が内部クラスである。 いっぽう、外側にあるほうのクラスを「外部クラス」とか「アウタークラス」(outer class)などという。上記コードでは「Car」が外部クラスである。 「入れ子」(いれこ)のことを英語で nest ネストというので、もしネットで調べたいときは「nest class」(ネストクラス)などで調べれば良い。 * 構造体の入れ子 なお、構造体でも同様に、ある構造体のなかに、別の構造体を入れることができる(構造体はディフォルトでメンバーがpublicなクラスです)。 <syntaxhighlight lang="C++"> #include <iostream> using namespace std; struct Car { struct inner { public: int number; double fuel; }; }; int main() { Car::inner yamadacar; yamadacar.number = 1234; Car::inner itoucar; itoucar.number = 7722; cout << "構造体の入れ子" << endl; cout << "山田くんちの車の番号は" << yamadacar.number << endl; } </syntaxhighlight> 実行結果 構造体の入れ子 山田くんちの車の番号は1234 == 「ゲッター」と「セッター」 == データーメンバーをpublicにするのはカプセル化の理想・理念に反します。 そこでデーターメンバーをprivateとし、データーメンバーの値を参照するためのメンバー関数(ゲッター)とデーターメンバーを変更するためのメンバー関数(セッター)を用意し内部構造の隠蔽を図ります。 ゲッターとセッターにより内部構造の隠蔽のほか、変換や受入検査などを行うことができるようになります。 演算子オーバーロードでゲッター・セッターを実装すると、クラスを利用するコードはゲッター・セッターを使っていることすら意識しないですみます。 ;[https://paiza.io/projects/qjWH-kIVrOrgH2XGHe-ZuA?language=cpp ゲッターとセッターの例]:<syntaxhighlight lang="cpp"> #include <iostream> class TestClass { private: int priv; public: TestClass(const int i) : priv(i) {} // Default constructor TestClass(TestClass &tc) : priv(tc.priv) {} // Copy constructor const int value() { return this->priv; } // Accessor (ゲッター) void value(const int i) { this->priv = i; } // Mutator (セッター) }; int main() { TestClass x(12); // Default constructor call auto y = x; // Copy constructor call std::cout << x.value() << std::endl; // Accessor call x.value(42); // Mutator call std::cout << x.value() << std::endl; // Accessor call std::cout << y.value() << std::endl; // Accessor call } </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> 12 42 12 </syntaxhighlight> {{コラム|Accessors and Mutators| 日本語圏では、データーメンバーを参照するためのメンバー関数を'''ゲッター'''、データーメンバーを変更するためのメンバー関数を'''セッター'''と呼び総称して'''アクセサー'''と呼びます。 これに対し、英語圏ではデーターメンバーを参照するためのメンバー関数を'''Accessors'''、データーメンバーの値を変更するためのメンバー関数を'''Mutators'''と呼びます。 特に、'''アクセサー'''と'''Accessors'''を混同する可能性があるので、意思の疎通に齟齬が生じないよう気をつけましょう。 {{See also|w:en:Mutator method}} }} == 実装例 == C++に、「[[Go/メソッドとインターフェース]]」の「都市間の大圏距離を求めるメソッドを追加した例」を移植してみました。 ; [https://paiza.io/projects/jya-Q9ldO8XoBQHnOibF5w?language=cpp 実装例] : <syntaxhighlight lang="c++"> #include <cmath> #include <iostream> #include <string> class GeoCoord { double longitude, latitude; public: GeoCoord(double lng, double lat) : longitude(lng), latitude(lat) {} std::string toString() { const auto *ew = "東経"; const auto *ns = "北緯"; auto lng = this->longitude; // long はCでは予約語なので lng に auto lat = this->latitude; if (lng < 0.0) { ew = "西経"; lng = -lng; } if (lat < 0.0) { ns = "南緯"; lat = -lat; } return std::string("(") + ew + ": " + std::to_string(lng) + ", " + ns + ": " + std::to_string(lat) + ")"; } double distance(GeoCoord &other) { // C言語では円周率の値は標準では定義されていません。 const auto i = 3.1415926536 / 180; const auto R = 6371.008; return std::acos( std::sin(this->latitude * i) * std::sin(other.latitude * i) + std::cos(this->latitude * i) * std::cos(other.latitude * i) * std::cos(this->longitude * i - other.longitude * i)) * R; } }; int main(void) { struct { const char *name; GeoCoord gc; } sites[] = { {"東京駅", GeoCoord(139.7673068, 35.6809591)}, {"シドニー・オペラハウス", GeoCoord(151.215278, -33.856778)}, {"グリニッジ天文台", GeoCoord(-0.0014, 51.4778)}, }; for (auto x : sites) { std::cout << x.name << ": " << x.gc.toString() << std::endl; } for (int i = 0, len = sizeof sites / sizeof *sites; i < len; i++) { const auto j = (i + 1) % len; std::cout << sites[i].name << " - " << sites[j].name << ": " << sites[i].gc.distance(sites[j].gc) << std::endl; } }</syntaxhighlight> ; 実行結果 : <syntaxhighlight lang=text> 東京駅: (東経: 139.767307, 北緯: 35.680959) シドニー・オペラハウス: (東経: 151.215278, 南緯: 33.856778) グリニッジ天文台: (西経: 0.001400, 北緯: 51.477800) 東京駅 - シドニー・オペラハウス: 7823.27 シドニー・オペラハウス - グリニッジ天文台: 16987.3 グリニッジ天文台 - 東京駅: 9560.55 </syntaxhighlight> <!-- ※ 今後の編集作業のための予備のタグ。 ; コード例 : <syntaxhighlight lang="c++"> #include <stdio.h> </syntaxhighlight> ; 実行結果 : <syntaxhighlight lang=text> </syntaxhighlight> --> h795y3lx6dakdxpb1irpci532yb2jsf C言語/ファイル入出力 0 24525 205599 204943 2022-07-21T01:41:01Z 192.51.223.106 /* fgetsとfscanfの違い */ wikitext text/x-wiki {{Nav}} == ファイルのオープン == まず、ファイルを作成したり読書きしたりするための関数を使うには、 ヘッダー<code><stdio.h></code>をインクルードする。 :<syntaxhighlight lang="C"> #include <stdio.h> int main() { FILE *fp = fopen("開きたいファイル名.拡張子", "モード"); if (fp == 0) return 1; // ここにファイルの操作内容(作成、読書きなど)を記述。 fclose(fp); } </syntaxhighlight> : ファイルに読書きなどの操作するためには、まず、そのファイルをオープンする(開く)必要がある。 : オープンされていない状態のファイルは、操作できない。 : fopenがファイル操作のためにオープンする関数で、FILE型へのポインタを返すので、変数 <var>fp</var> に保持する。 : FILE型へのポインタの型は、 :<syntaxhighlight lang="C"> FILE * </syntaxhighlight> : である。 === Visual Cで標準入出力関数などを使用する場合 === Visual Cでは、標準設定ではfopen関数などの標準入出力関数の使用が禁止されており、そのまま上記のコードをコンパイルすると、 重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態 エラーC4996’fopen’: This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. のような警告を表示し、コンパイルが完了しない。 このような禁止されている関数の使用を許可するために、<code>#pragma warning(disable:4996)</code>を加え、コンパイラの警告を無効化する(メッセージ通り fopen を fopen_s で置換えても良いが、fopen_s を用意している処理系は稀で、GCCもclangもサポートしておらず、環境を選ばずコンパイルするためには #ifdef _MSC_VER などでプリプロセッサーで条件コンパイルする方法があるが、コードの見通しが悪くなる上バッファサイズの計算のケアなどを見落としがちなので、警告を無効化することを選択した)。 ;Windowsでfopenを使う場合:<syntaxhighlight lang="C"> #include "stdafx.h" #include <stdio.h> #pragma warning(disable:4996) int main() { FILE *fp = fopen("開きたいファイル名.拡張子", "モード"); if (fp == 0) return 1; // ここにファイルの操作内容(作成、読書きなど)を記述。 fclose(fp); } </syntaxhighlight> <code>#pragma warning(disable:4996)</code> が、fopenなどの関数の使用を許可するプラグマである。これは、<code>stdafx.h</code> など一連のWindows用ヘッダのインクルードの後に指令する必要がある。 {{コラム|Visual Studio で、デバッグ セッションの終了時にコンソールが閉じてしまう場合| Visual Studio で、コンソール アプリケーションのデバッグ セッションの終了時にコンソールが閉じてしまう場合は、 : [ツール] -> [オプション] -> [デバッグ] -> [デバッグの停止時に自動的にコンソールを閉じる] を無効にします。 }} ;Windows用のファイル操作のコード例:<syntaxhighlight lang="C"> #include "stdafx.h" #include <stdio.h> #pragma warning(disable : 4996) int main() { FILE *fp1 = fopen("test1.txt", "w"); if (fp1 == NULL) { perror("ファイルを開けませんでした。\n"); return 1; } fclose(fp1); }</syntaxhighlight> <code>fopen</code> は、モードを "w" で開いた場合、もし対象のファイルが存在しないときは、その名のファイルを新規作成する。 なお、fopenのモードは、 :書き込みモードの"w"と、 :読み込みモードの"r"と、 :追記モードの"a" がある。 なお、一般にファイル操作のプログラミングでは、ファイルのオープンに失敗した場合を想定して、そのような処理を書く必要がある。 fclose は、ファイルを閉じる関数である。クローズしている最中のファイルは、プログラミングによる読書きなどの操作をできない。 読者は、ソースファイルのあるフォルダを確認してみて、"test1.txt"というファイルが作られている事を確認しよう。 {{コラム|"stdafx.h"って何?|プログラムの冒頭で<syntaxhighlight lang="C" inline>#include "stdafx.h"</syntaxhighlight> と <code>"stdafx.h"</code> なるヘッダーをインクルードしています。 これはC言語標準にはなく、Windows(Visual Studio)固有のプリコンパイルヘッダーです。stdafx は Standard Application Frameworks の略で、MFC(Microsoft Foundation Class)の使用を想定しているものでした。 VS2019からが、<code>"stdafx.h"</code> から <code>"pch.h"</code>(Pre compile header)と機能と一致した名前になりました。 いずれにしても、Windows/Visual Studio でプリコンパイルヘッダーを使う状況でしか意味がありませんし、この本で扱うサイズのプリグラムではプリコンパイルヘッダーを使うメリットはありません。}} == 読み書き == === ファイルへの書き込み === ファイルを作成したりオープンしただけでは、まだ何も読み込まれないし、何も書き込まれない。 ファイルに何かデータを書き込むには、 <code>fprintf</code> という関数を使う。 fprintf の冒頭のfは、ファイル関係であることをあらわしている。最後のfは、もともとC言語には「printf」という関数があり、(最後のfは)Format の f。 さて、windowsの設定では、ある設定の場合では <code>fopen</code> と同様に <code>fprintf</code> が初期状態では使えない場合があるので、 <syntaxhighlight lang="C"> #pragma warning(disable:4996) </syntaxhighlight> で指令しておく必要の生じる場合もある。 インクルードすべきヘッダについては、標準出力のヘッダにあるので、 <syntaxhighlight lang="C"> #include <stdio.h> </syntaxhighlight> でインクルードすれば充分である。 さて <code>fprintf</code> で書き込むデータの形式は、変数でもいいし、書き込みたいテキストを直接指定することもできる。 また、もし 変数を書き込む場合なら、変数の型は、文字列型でもいいし、数値型でもいい。 ただし、書き込まれた先のテキストファイルでは、書かれたテキストの由来が何かは、もはや不明になる。つまり、書きこまれた先のテキストファイルでは、書かれた文字列は、すべて単なるテキスト文字の集まりとして扱われる。 さて、たとえばファイルに「test」とだけ書き込みたいなら、 <code> fprintf(fp1, "test \n"); </code> というふうに入力すればいい。 何か変数をファイルに書き込みたい場合、たとえば整数型の変数だとして、変数名が「var」なら、それを書き込むには、あらかじめソースコードで <syntaxhighlight lang="C"> int var; </syntaxhighlight> のように、どこかで宣言しておく。 そのあと、プログラム中にて変数「var」に目的の値を入力させるようにしておく。 そのあと、プログラムがコード内でのファイル書き込み実行場所にて <syntaxhighlight lang="C"> fprintf(fp1, "%d \n", var); </syntaxhighlight> のようなコードを実行するように、ソースコードを記述すればいい。 ファイル書き込むのできる変数の型は、数値型も文字列型でも可能である。 次のコード例として、文字列型の変数をファイルに書き込むコード例を示す。 ;コード例 <syntaxhighlight lang="C"> #include "stdafx.h" #include <stdio.h> #pragma warning(disable:4996) int main() { FILE *fp1 = fopen("test1.txt", "w"); if (fp1 == NULL) { perror("ファイルを開けませんでした。\n"); return 1; } else { printf("ファイルをオープンしました。\n"); } char string[50]; printf("キーボードから文字列を入力してください。\n"); scanf("%s", &string); printf("入力された文字列は %s です。 \n", string); printf("これをファイルに書き込みます。 \n"); fprintf(fp1, "%s \n", string); fclose(fp1); printf("ファイルをクローズしました。\n"); } </syntaxhighlight> このようにして、ファイルへの出力が出来る。 === ファイルの読み取り === 次に、ファイルからの読み取りをする方法を学ぼう。 ファイルからの読み取りには、まずfopenの際にモードを"r"にする。(英語で、本や文章などを読むことを read (リード)という。その read リードの頭文字 r のこと。) 読み取りの際の関数には <code>fgets</code> や <code>fscanf</code> を使えばいい。 <code>fscanf</code> や <code>fgets</code>は、ファイルから1行ずつ、読み取ることができる。 なお、 <code>fscanf</code> や <code>fgets</code> の違いは、 :行末の改行を読み込むかどうか、 :空白文字(半角スペース)があると読み込みを中断するかどうか、 です。fscanfのほうが、空白文字(半角スペース)があると読み込みを中断します。 くわしくは、あとの章で説明します。 とりあえず、ファイル読み取りの具体例を調べていきましょう。 ;fscanf の例 あらかじめ、テキストファイル test1.txt に、なんらかの文字列を書いておこう。 一例として、 <pre> aaaaaaaaaaa ssssssss dddddd </pre> と書いたとする。 コード例を示す。 <syntaxhighlight lang="C"> #include "stdafx.h" #include <stdio.h> #pragma warning(disable:4996) int main() { FILE *fp1 = fopen("test1.txt", "r"); if (fp1 == NULL) { // ここを読み取りモード"r"にするのを忘れないように perror("ファイルを開けませんでした。\n"); return 1; } else { printf("ファイルをオープンしました。\n"); } char str1[150]; printf("文字列を読み取っています。\n"); fscanf(fp1, "%s", str1); printf("ファイルに書いてある文字列\n"); printf("%s\n", str1); fclose(fp1); printf("ファイルをクローズしました。\n"); } </syntaxhighlight> ;実行結果 <pre> ファイルをオープンしました。 文字列を読み取っています。 ファイルに書いてある文字列 aaaaaaaaaaa ファイルをクローズしました。 続行するには何かキーを押してください . . . </pre> このように、最初の1行(aaaaaaaaaaa)だけが読み取りされている。 2行目以降も読み取りたい場合には、その行数だけ、下記のように繰り返しfscanfを使う必要がある。 <syntaxhighlight lang="C"> #include "stdafx.h" #include <stdio.h> #pragma warning(disable:4996) int main() { FILE *fp1 = fopen("test1.txt", "r"); // ここを読み取りモード"r"にするのを忘れないように if (fp1 == NULL) { perror("ファイルを開けませんでした。\n"); return 1; } else { printf("ファイルをオープンしました。\n"); } char str1[150]; printf("文字列を読み取っています。\n"); fscanf(fp1, "%s", str1); printf("ファイル1行目に書いてある文字列\n"); printf("%s\n", str1); fscanf(fp1, "%s", str1); printf("ファイル2行目に書いてある文字列\n"); printf("%s\n", str1); fclose(fp1); printf("ファイルをクローズしました。\n"); } </syntaxhighlight> ;実行結果 <pre> ファイルをオープンしました。 文字列を読み取っています。 ファイル1行目に書いてある文字列 aaaaaaaaaaa ファイル2行目に書いてある文字列 ssssssss ファイルをクローズしました。 続行するには何かキーを押してください . . . </pre> === fgetsとfscanfの違い === <code>fscanf</code> や <code>fgets</code> の違いは、大まかには :行末の改行を読み込むかどうか、 :空白文字(半角スペース)があると読み込みを中断するかどうか、 です。fscanfのほうが、空白文字(半角スペース)があると読み込みを中断します。fgetsのほうが、改行を読み込みます。 論より証拠で、実際にコードを実行して比べてみましょう。 まず、読み込み対象のテキストファイル test2.txtとして、 <pre> rt aaaaaaaaaaa u ssssssss dddddd </pre> のように、空白文字(半角スペース)を入れてみましょう。rt と aaaaaaaaaaa のあいだに半角スペースが一文字あります。 そしてコードは、(Fedora30 の gccコンパイルで確認) fgetsのほうは <syntaxhighlight lang="C"> #include <stdio.h> int main() { FILE *fp1 = fopen("test1.txt", "r"); // ここを読み取りモード"r"にするのを忘れないように if (fp1 == NULL) { perror("ファイルを開けませんでした。\n"); return 1; } else { printf("ファイルをオープンしました。\n"); } char buffer1[150]; printf("文字列を読み取っています。\n"); fgets(buffer1,150,fp1); printf("1回目に読み取った文字列\n"); printf("%s", buffer1); fgets(buffer1,150,fp1); printf("2回目に読み取った文字列\n"); printf("%s", buffer1); fclose(fp1); printf("ファイルをクローズしました。\n"); } </syntaxhighlight> このコードでは、<code>printf </code> の%sの後ろには改行文字(<code>\n</code>)をつけていません。なぜなら、<code>fgets </code> ではファイル読み込み時に改行文字も一緒に読み込むからです。 ;実行結果 <pre> ファイルをオープンしました。 文字列を読み取っています。 1行目に書いてある文字列 rt aaaaaaaaaaa 2行目に書いてある文字列 u ssssssss ファイルをクローズしました。 </pre> です。 ---- いっぽう、fscanf のほうは <syntaxhighlight lang="C"> #include <stdio.h> int main() { FILE *fp1 = fopen("test1.txt", "r"); // ここを読み取りモード"r"にするのを忘れないように if (fp1 == NULL) { perror("ファイルを開けませんでした。\n"); return 1; } else { printf("ファイルをオープンしました。\n"); } char buffer1[150]; printf("文字列を読み取っています。\n"); fscanf(fp1, "%s", buffer1); printf("1回目に読み取った文字列\n"); printf("%s", buffer1); fscanf(fp1, "%s", buffer1); printf("2回目に読み取った文字列\n"); printf("%s", buffer1); fclose(fp1); printf("ファイルをクローズしました。\n"); } </syntaxhighlight> ;実行結果 <pre> ファイルをオープンしました。 文字列を読み取っています。 1行目に書いてある文字列 rt2行目に書いてある文字列 aaaaaaaaaaaファイルをクローズしました。 </pre> です。 このように、fcanf のほうでは、空白文字があるので、最初の1回目のfscanfでは、「rt」までしか読み込みません。 しかも改行を読み込まないので、 「rt」と「2行目に書いてある文字列」が続いて rt2行目に書いてある文字列 と表示されてしまっています。 そして、2回目の fscanf で「aaaaaaaaaaa」を読み込んでいます。 == CSVファイルの入出力 == === fscanfによる入門的方法 === CSVファイルという、カンマで区切った形式のファイルがある。 たとえば、 次のようなデータである。 ファイル名「sample.csv」 <pre> 名前,番号 山田,1 佐藤,2 </pre> なお、表計算ソフト( libreOffice の Calc など)で、表計算ファイルをCSVファイルに変換することができる。 表計算ソフトのそれぞれのセルにデータを入力したあと、表計算ファイルを「名前をつけて保存」するときに、ファイル形式を選択する欄があるので、その欄でCSV形式を選べばいい。 さて、CSVファイルをカンマで区切って一つずつ読み取りたい場合、 fscanf関数では <code>%[^ ]</code>という関数を使う。<code>%[^ ]</code>は、そのカッコの中にある文字をみつけるまで文字を読み込む。また、そのカッコ内の文字は保持しない。 たとえば <code>%[^,]</code>なら、カンマ記号(,)の手前まで文字を読み込み、カンマ記号じたいは除いて読み込む。 なので、<code>%[^,]</code>なら、結果的にカンマ文字を区切り文字として扱うことになる。 CSV読み取りファイルのプログラム例は、たとえば次のようなファイルになる。 (Fedora30 で確認) <syntaxhighlight lang="C"> #include <stdio.h> int main() { FILE *fp1 = fopen("sample.csv", "r"); if (fp1 == NULL) { // ここを読み取りモード"r"にするのを忘れないように perror("ファイルを開けませんでした。\n"); return 1; } else { printf("ファイルをオープンしました。\n"); } char str1[150]; char str2[150]; printf("文字列を読み取っています。\n"); fscanf(fp1, "%[^,],%s,%s", str1,str2); printf("str1として読み取った文字列\n"); printf("%s\n", str1); printf("str2として読み取った文字列\n"); printf("%s\n", str2); fclose(fp1); printf("ファイルをクローズしました。\n"); } </syntaxhighlight> '''実行結果''' (Fedora30 で確認)<br> <pre> ファイルをオープンしました。 文字列を読み取っています。 str1として読み取った文字列 名前 str2として読み取った文字列 番号 ファイルをクローズしました。 </pre> === fgetsによる方法 === ==== 簡単な例 ==== さきほどの章では、説明の都合上、fscanfを使ったが、じつは、fscanfでCSVファイルを作るのは、あまり実用的ではない。 なぜなら、まず空白文字(半角スペース)で読み込みを停止してしまうので、半角スペースを含む文字列の読み込みが出来無いからである。 なので、CSVの読み取りファイルをC言語で作る場合、fgets関数を作るほうが良い。 しかし、fgets には、<code>%[^,]</code> のようなカンマで読み込み中止関数をする都合いい機能が無い。 なので、いったんfgetsで、その行の全体を読み込んだ後に、<code> strtok </code> という別の関数を使うのが良い。 <code> strtok </code> 関数とは、指定した文字列の直前までを読み込み機能のある関数なので、この関数でカンマ文字まで読み込むことを関数すればいい。<code> strtok </code> では、指定した文字列じたいは読み込まない。 なお、 <code> strtok </code> 関数を使うためには <code> #include <string.h> </code> が必要である。 書式は <syntaxhighlight lang="C"> strtok(分解する文字列のある変数,"区切り文字にしたい文字") </syntaxhighlight> のようになる。 CSVファイルを読み込ませたいなら、区切り文字にしたいのはカンマ記号なので、 <syntaxhighlight lang="C"> strtok(分解する文字列のある変数,",") </syntaxhighlight> となる。 なお、<code> strtok </code> の第一引数を「NULL」にすると、前の文字の続きから読み込む。つまり <syntaxhighlight lang="C"> strtok(NULL,"区切り文字にしたい文字") </syntaxhighlight> にすると、前の文字の続きから次ぎの区切り文字まで(その行に残りの区切り文字がない場合には行末まで)を読み込む。 コードは下記のようになる。 (Fedora30 で確認) <syntaxhighlight lang="C"> #include <stdio.h> #include <string.h> int main() { FILE *fp1 = fopen("sample.csv", "r"); // ここを読み取りモード"r"にするのを忘れないように if (fp1 == NULL) { perror("ファイルを開けませんでした。\n"); return 1; } else { printf("ファイルをオープンしました。\n"); } char buffer1[150]; printf("文字列を読み取っています。\n"); fgets(buffer1,150,fp1); printf("1行目の文字列\n"); printf("%s", buffer1); char str1[150]; char str2[150]; strncpy(str1, strtok(buffer1,",") ,150); // str1 = strtok(buffer1,","); では代入できない。 strncpy(str2, strtok(NULL,",") ,150); printf("str1として読み取った文字列\n"); printf("%s", str1); printf("\n"); printf("str2として読み取った文字列\n"); printf("%s", str2); fgets(buffer1,150,fp1); printf("2行目の文字列\n"); printf("%s", buffer1); strncpy(str1, strtok(buffer1,",") ,150); strncpy(str2, strtok(NULL,",") ,150); printf("str1として読み取った文字列\n"); printf("%s", str1); printf("\n"); printf("str2として読み取った文字列\n"); printf("%s", str2); fclose(fp1); printf("ファイルをクローズしました。\n"); } </syntaxhighlight> ;実行結果 <pre> ファイルをオープンしました。 文字列を読み取っています。 1行目の文字列 名前,番号 str1として読み取った文字列 名前 str2として読み取った文字列 番号 2行目の文字列 山田,1 str1として読み取った文字列 山田 str2として読み取った文字列 1 ファイルをクローズしました。 </pre> 上記のように、たしかに、読み取った文字列を分解している。 ==== 要素数の多い場合の例 ==== さきほどの例では、背つめいの単純化のため、たったの各行あたり、要素数はたった2個だった。 しかし、実際の場合は、もっと要素数が多い。 たとえば、 <pre> 名前,番号,国語の得点,数学の得点 山田,1,80,90 佐藤,2,70,100 </pre> のように、各行あたり4個のデータを読み込む場合を考えよう。 ;コード例 <syntaxhighlight lang="C"> #include <stdio.h> #include <string.h> #pragma warning(disable:4996) int main() { FILE* fp1 = fopen("sample.csv", "r"); if (fp1 == NULL) { // ここを読み取りモード"r"にするのを忘れないように perror("ファイルを開けませんでした。\n"); return 1; } else { printf("ファイルをオープンしました。\n"); printf("\n"); } char buffer1[150]; printf("文字列を読み取っています。\n"); struct seisekihyou { char str[150]; }; struct seisekihyou row[20]; // 構造体配列の宣言 // 下記のline は読み取りたい行数 for (int line = 1; line <= 2; line = line + 1) { fgets(buffer1, 150, fp1); printf("%d行目の文字列\n",line); printf("%s", buffer1); strncpy(row[0].str, strtok(buffer1, ","), 150); // str1 = strtok(buffer1,","); では代入できない。 printf("row[%d].strとして読み取った文字列\n", 0); printf("%s\n", row[0].str); // 下記のtempは1行あたりの読み取りたい項目数 for (int temp = 1; temp <= 3; ++temp) { strncpy(row[temp].str, strtok(NULL, ","), 150); printf("row[%d].strとして読み取った文字列\n", temp); printf("%s\n", row[temp].str); } printf("\n"); } fclose(fp1); printf("ファイルをクローズしました。\n"); return 0; } </syntaxhighlight> ;実行例 <pre> ファイルをオープンしました。 文字列を読み取っています。 1行目の文字列 名前,番号,国語の得点,数学の得点 row[0].strとして読み取った文字列 名前 row[1].strとして読み取った文字列 番号 row[2].strとして読み取った文字列 国語の得点 row[3].strとして読み取った文字列 数学の得点 2行目の文字列 山田,1,80,90 row[0].strとして読み取った文字列 山田 row[1].strとして読み取った文字列 1 row[2].strとして読み取った文字列 80 row[3].strとして読み取った文字列 90 ファイルをクローズしました。 このウィンドウを閉じるには、任意のキーを押してください... </pre> ;解説 前の節では、単純化のために配列や構造体やfor文は用いなかったが、実務では用いたほうがイイだろう。 各行の最初の項目だけ <code>strncpy(row[0].str, strtok(buffer1, ","), 150);</code> のようにstrtokの第一引数を指定する必要がある。 いっぽう、<code>strncpy(row[temp].str, strtok(NULL, ","), 150);</code> のようにstrtokの第一引数がnullなら、strtokは以前の区切り文字から次の区切り文字までを抜き取るだけなので、2番目の項目からはfor文で使いまわしができる。 == if文との組み合わせ == fgets関数やstrtok関数などで読み取った文字列をもとに、if文などの条件分岐関数と組み合わせる際、標準C言語のif文では、文字列にはイコール記号<code>==</code> など算術的な記号での比較ができないです。 これはつまり、Linux標準のGCCでは、文字列の比較にイコール記号が使えないという事です。 標準C言語では、文字列どうしの比較をする際、<code> strcmp </code> という関数を使います。 strcmpについて詳しくは『[[C言語/制御文]]』をお読みください。 == 文字コード == {{Main|[[w:Microsoftコードページ932]]}} Windowsの場合、システム内部の文字コードには原則的にUnicodeを使っているのだが、しかし例外的にコマンドプロンプトではマイクロソフト独自規格の文字コードを使っている。 マイクロソフト社は、これをアメリカ標準規格のANSIと呼んでいるが<ref>マイクロソフトは、CP932を「ANSI」とは自称しておらず、[https://docs.microsoft.com/ja-jp/host-integration-server/core/ansi-oem-code-page-support-snanls-1 ANSI/OEM Code Page Support (SNANLS)]の一環として、'''ANSI/OEM - Japanese Shift-JIS'''の名称でサポートしている。この節は、この誤解に基づいて編集されていることに注意する必要がある。</ref>、実は、中身は米国の行政府の定める本物の1バイト文字のANSIでなく、マイクロソフト独自規格の自称「ANSI」である。おそらく、マイクロソフト独自規格の自称「ANSI」は、日本語などの2バイト文字の表示機能を含むので、自称「ANSI」も2バイト以上の文字であろうと考えられている。 1980年代くらいの古い、マイクロソフト日本法人などの開発したShift-JISという比較的に低バイト文字(2バイト以上の文字)の独自規格を、マイクロソフト米国法人の古い低バイト文字(1バイト以上の文字)の文字コードとすりあわせた独自規格のことをマイクロソフト社は「ANSI」と称しているようだ。 いちおう、現在ではShift-JISは日本工業規格になっているが、実際のWindowsでの文字コードの実装では、Windows用に独自にアレンジされたものを使っており、厳密には区別のためCP932という文字コード名で、技術者は呼ぶ。 アクセサリ「メモ帳」などのテキストエディタの文字コードでも、標準設定では、マイクロソフト独自規格の自称「ANSI」を使っている。 さて、上述のプログラム例で紹介したソースコードのように、特に文字コードの指定をする必要なく、日本語も表示できる。 マイクロソフト社が、そのように、コマンドプロンプトの機能を調整しているからである。 コマンドプロンプトで表示する場合、読み取るテキストファイルの文字コードは自称「ANSI」形式にしておけばいい。アクセサリ「メモ帳」の標準コードは「ANSI」(マイクロソフト自称)になっているので、特に変更する必要は無い。 もし、単に、あるテキストファイルを読み取ってコマンドプロンプトで表示するだけの場合なら、むしろUnicodeは、使ってはならない(少なくとも初心者は)。 読み取り対象のテキストファイルをUnicodeなどに変換すると、コンソール表示の際には、文字化けをしてしまう。 ただし、コマンドプロンプト以外のGUIアプリケーションの作成では(Windows API というのを使うと、GUIアプリを作れる)、文字表示の関数がANSI形式に対応しておらず Unicode 対応になっている場合もある。最終的に現代のプログラマが作るアプリケーションのほとんどはGUIアプリであるので、Windowsシステム内部の文字コードがANSIとUnicodeに不統一になっているのは、これは深刻な問題である。 ソースコード中にある文字については、コンパイラがコンパイル時に調節してくれるのが、しかしソースコード外部のテキストファイルについては、コンパイラが調整してくれないので、テキストファイルの読み取って表示などをした際に文字化けが起きることがある。 つまり、結論から言うと、GUIアプリとコンソールアプリで共通のテキストファイルを使うことは、あきらめるべきである。 ANSIコード(マイクロソフト自称)でも日本語は表示できるのだが、よそのパソコンなどに移動した場合に文字化けをする可能性がある。 なお、コンソール表示では不要だが、本来なら、自称「ANSI」コードや2バイト文字では、英語以外の文字を扱う際、 <code>setlocale(LC_ALL, "japanese");</code> のように、英語以外の文字コードとして、どこの言語を使用するのかを指定しないといけない。2バイト文字の2バイトだけでは、65536文字までしか区別できないので、文字情報だけでは世界中の文字を網羅することは不可能であり、そのため、対象の文字を限定するために、言語を指定する必要があるからである。 (なお、日本語の常用漢字は、約2000個である。なので、2バイト文字なら、言語指定があれば、十分に常用漢字を表現できる。) もっとも、Windowsのコマンドプロンプトに表示する場合、そのような言語指定なく、表示できる。 == Linux の場合 == 一例として、Fedora28でファイル入出力を実行する場合のコードと実行結果の例を下記にしめす。 テキストファイルの文字コードはUTF-8である。Fedoraの標準の文字コードのままである。テキストエディタにはGedit(ジーエディット)を用いている。GeditはFedora28で標準に付属してくるテキストエディタである。 <syntaxhighlight lang="C"> #include <stdio.h> int main() { FILE *fp1 = fopen("test1.txt", "r"); // ここを読み取りモード"r"にするのを忘れないように if (fp1 == NULL) { perror("ファイルを開けませんでした。\n"); return 1; } else { printf("ファイルをオープンしました。\n"); } char str1[150]; printf("文字列を読み取っています。\n"); fscanf(fp1, "%s", str1); printf("ファイル1行目に書いてある文字列\n"); printf("%s\n", str1); fscanf(fp1, "%s", str1); printf("ファイル2行目に書いてある文字列\n"); printf("%s\n", str1); fclose(fp1); printf("ファイルをクローズしました。\n"); return 0; } </syntaxhighlight> ;実行結果 <pre> ファイルをオープンしました。 文字列を読み取っています。 ファイル1行目に書いてある文字列 aaaaaaaaaaa ファイル2行目に書いてある文字列 ssssssss ファイルをクローズしました。 </pre> Fedora28の場合、読み取り対象のテキストファイルの文字コードを何に変えても、コマンドプロンプトで正しく表示される。 なお、Geditの変換可能な文字コードの一覧に「日本語 (CP932)」 というのがあるが、これがマイクロソフト Shift-JIS のことである(つまり マイクロソフト自称「ANSI」)。もし、マイクロソフト自称ANSIとLINUX用テキストファイルを共通化したい場合、 CP932 を選べばいい。 とはいえ、最近のWindows用テキストエディタでは(Linuxでは標準的に採用されている)UTF-8も表示できるのが一般的なので、特に文字化けなどの起きないかぎり、むりに文字コードを変える必要は無い。 == ワイド文字のファイル入出力 == === Linuxの場合 === Windowsでいう「Unicode」が、マイクロソフト社の自称にすぎず、実態は国際規格とは違う。 なので、説明の簡単のために、まず Linuxで説明する。 ;読み取りたいテキスト <pre> これはテストです。 aaaaaaaaaaa </pre> ;Linuxの場合のコード例 <syntaxhighlight lang="C">#include <stdio.h> #include <locale.h> #include <wchar.h> int main(void) { setlocale(LC_ALL, "ja_JP.UTF-8"); //ロケール(地域)を設定する。 FILE* fp1 = fopen( "test1.txt", "r, ccs = UTF-8"); // ここを読み取りモード"r"にするのを忘れないように if (fp1 == NULL) { wprintf(L"ファイルを開けませんでした。\n"); return 1; } else { wprintf(L"ファイルをオープンしました。\n"); } wchar_t str1[150]; wprintf(L"文字列を読み取っています。\n"); fwscanf(fp1, L"%s", str1); wprintf(L"ファイルに書いてある文字列\n"); wprintf(L"\n"); wprintf(L"%s\n", str1); wprintf(L"\n"); fclose(fp1); wprintf(L"ファイルをクローズしました。\n"); return 0; } </syntaxhighlight> ;実行結果 <pre> ファイルをオープンしました。 文字列を読み取っています。 ファイルに書いてある文字列 これはテストです。 ファイルをクローズしました。 </pre> なお、テキストファイルの拡張子に「.txt」とあるので、もしかしたらLinuxの種類によってはWindowsのShift-JISコードだと判断してLinuxが自動的にそのテキストファイルのエンコードをShift-JISに書き換える可能性があるので、もしも、上記のコードで実行しても文字化けなどしてるなら、再度、テキストファイルを開いて、UTF-8にエンコードしなおす事。 なお、Linuxでよく標準的に付属してくる glibc には、fopenのワイド文字バージョン( wfopen のような関数)は無い。 また、fopenで読み取るファイルに日本語を使うと、文字化けをしたり、ファイルを開くのに失敗したりする。 たとえば、「テスト1.txt」のような日本語のファイル名で作られたファイルは、上記のコードのfopenで読み取るファイル名を「テスト1.txt」に書き換えても、読み取りできない。 なお、Linuxでは、文字の変換には [[w:iconv]](アイコンブ) などのAPIが利用されている。iconv については高度すぎる話題になるので、説明を省略する。 上記コードのようにLinuxでもwprintfなどのワイド文字型の組み込み関数が使えるが、しかし、printfなどでも日本語を表示できてしまうので、Linuxではワイド文字用の組み込み関数は、実用性は乏しい。 === Windowsの場合 === Unicodeなどのテキストファイルを読み取れるように、上記のようにワイド文字型の関数を使ってコードを書いても、日本語を含むファイルは文字化けをする。(いっぽう、テキストファイル中の英数字だけ、正しく表示されたりする。) 例えば、下記のようなコードを書いても、日本語の文字は、文字化けしてしまう。 <syntaxhighlight lang="C"> // 文字化けしてしまう。 // Windowsを想定 #include <stdio.h> #include <locale.h> #pragma warning(disable:4996) int main() { _wsetlocale(LC_ALL, L""); //ロケール(地域)を設定する。 FILE* fp1 = _wfopen( L"test1.txt", L"r, ccs = UNICODE"); if (fp1 == NULL) { // ここを読み取りモード"r"にするのを忘れないように wprintf(L"ファイルを開けませんでした。\n"); perror(0); return 1; } else { wprintf(L"ファイルをオープンしました。\n"); } wchar_t str1[150]; wprintf(L"文字列を読み取っています。\n"); fwscanf(fp1, L"%s", str1); wprintf(L"ファイルに書いてある文字列\n"); wprintf(L"\n"); wprintf(L"%s\n", str1); wprintf(L"\n"); fclose(fp1); wprintf(L"ファイルをクローズしました。\n"); } </syntaxhighlight> いっぽう、テキストファイルにANSIエンコードを使い、ソースコードの文字表示にprintfなど非ワイド型の関数を使った場合では文字化けをしない。 よってWindowsでは、なるべくANSIエンコードを使うのが安全だろう。特別な理由がないかぎり、ワイド文字型を使う必要も無い。 また、このことから、Windowsの自称する「Unicode」が、実際の国際規格とは実態が違っていることが分かる。 == バイナリーファイルの読み書き == === バイナリーファイルとしての書き込み === C言語のプログラムで、バイナリーファイルの読み書きをしたい場合、 <code>fopen </code> の引数で「r」(読み込み)とか「w」(書き込み)とか編集モードの指定がありますが、それに「b」をつけます。つまり「rb」や「wb」などの引数になります。 また、書き込む関数には fwrite を使う必要があります。 いっぽう、 fprintf では、テキストファイルに自動的に変換してしまいます。 たとえば下記のようになります。 <syntaxhighlight lang="C"> //#include "stdafx.h" #include <stdio.h> #pragma warning(disable:4996) int main() { FILE *fp1 = fopen("test1.bin", "wb"); if (fp1 == NULL) { perror("ファイルを開けませんでした。\n"); return 1; } else { printf("ファイルをオープンしました。\n"); } printf("バイナリファイルに書き込んでいます。 \n"); char buf[5] = {0x42,0x4d,3,4,5}; fwrite(buf, 1, 5, fp1); fclose(fp1); printf("ファイルをクローズしました。\n"); } </syntaxhighlight> 書き込みできたか否かを確認するには、バイナリエディタ(あるいは「16進エディタ」などと言われる)で確認してください。 <code>0x42</code> などの冒頭の 0x は16進数であることを表す。バイナリーファイルの読み書きに限らず、一般にC言語で16進数をあつかう場合は、16進数である数に接頭辞 0x をつけて区別する。数値 0~9 までは0x をつけなくても十進数と同じなので省略できる。 バイナリエディタで読み込み 42 4D 03 04 05 と書き込まれていることが確認できれば成功である。 === 読み取り === バイナリファイルの読み取りには fread を使うことがある。 いきなりバイナリファイルを読み取るのは初心者には難しいので、まずテキストファイルを読み取る実験をしてみよう。 以前に作った test1.txt ファイルを読み取るとしよう。 test1.txt <pre> aaaaaaaaaaa ssssssss dddddd </pre> コード例 <syntaxhighlight lang="C"> #include <stdio.h> #pragma warning(disable:4996) int main() { FILE *fp1 = fopen("test.txt", "r"); if (fp1 == NULL) { perror("ファイルを開けませんでした。\n"); return 1; } else { printf("ファイルをオープンしました。\n"); } char str1[150]; printf("文字列を読み取っています。\n"); fread(str1, sizeof(unsigned char), sizeof(str1) / sizeof(str1[0]), fp1); printf("ファイルに書いてある文字列\n"); printf("%s\n", str1); fclose(fp1); printf("ファイルをクローズしました。\n"); } </syntaxhighlight> ;実行結果 <pre> ファイルをオープンしました。 文字列を読み取っています。 ファイルに書いてある文字列 aaaaaaaaaaa ssssssss dddddd ファイルをクローズしました。 </pre> では、バイナリーデーターを読み取ろう。 コード例 <syntaxhighlight lang="C"> #include <stdio.h> #pragma warning(disable:4996) int main() { FILE *fp1 = fopen("test1.txt", "rb"); if (fp1 == NULL) { perror("ファイルを開けませんでした。\n"); return 1; } else { printf("ファイルをオープンしました。\n"); } char str1[70]; // 表示結果を短くするために数値を微妙に小さくした printf("バイナリーデーターを読み取っています。\n"); // 「文字列」ではなくバイナリーデーター fread(str1, sizeof(char), 50, fp1); printf("ファイルに書いてあるバイナリーデーター\n"); for (int i=0 ; i < sizeof(str1) / sizeof(str1[0]); i = i+1) { printf("%02x ", str1[i]); // 最低でも2桁を表示、の意味 } fclose(fp1); printf("\nファイルをクローズしました。\n"); } </syntaxhighlight> ;実行結果 <pre> ファイルをオープンしました。 バイナリーデーターを読み取っています。 ファイルに書いてあるバイナリーデーター 61 61 61 61 61 61 61 61 61 61 61 0d 0a 73 73 73 73 73 73 73 73 0d 0a 0d 0a 64 64 64 64 64 64 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ファイルをクローズしました。 </pre> :※ ファイル作成時・保存時の文字コードの種類によっては改行文字 0d 0a などの制御文字の内容が若干違うかもしれません。 == 脚註 == <references /> [[カテゴリ:C言語]] cw7ku27vksjzp76dpvi0xxyuhwzac65 205605 205599 2022-07-21T05:19:19Z 192.51.223.106 /* 要素数の多い場合の例 */ wikitext text/x-wiki {{Nav}} == ファイルのオープン == まず、ファイルを作成したり読書きしたりするための関数を使うには、 ヘッダー<code><stdio.h></code>をインクルードする。 :<syntaxhighlight lang="C"> #include <stdio.h> int main() { FILE *fp = fopen("開きたいファイル名.拡張子", "モード"); if (fp == 0) return 1; // ここにファイルの操作内容(作成、読書きなど)を記述。 fclose(fp); } </syntaxhighlight> : ファイルに読書きなどの操作するためには、まず、そのファイルをオープンする(開く)必要がある。 : オープンされていない状態のファイルは、操作できない。 : fopenがファイル操作のためにオープンする関数で、FILE型へのポインタを返すので、変数 <var>fp</var> に保持する。 : FILE型へのポインタの型は、 :<syntaxhighlight lang="C"> FILE * </syntaxhighlight> : である。 === Visual Cで標準入出力関数などを使用する場合 === Visual Cでは、標準設定ではfopen関数などの標準入出力関数の使用が禁止されており、そのまま上記のコードをコンパイルすると、 重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態 エラーC4996’fopen’: This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. のような警告を表示し、コンパイルが完了しない。 このような禁止されている関数の使用を許可するために、<code>#pragma warning(disable:4996)</code>を加え、コンパイラの警告を無効化する(メッセージ通り fopen を fopen_s で置換えても良いが、fopen_s を用意している処理系は稀で、GCCもclangもサポートしておらず、環境を選ばずコンパイルするためには #ifdef _MSC_VER などでプリプロセッサーで条件コンパイルする方法があるが、コードの見通しが悪くなる上バッファサイズの計算のケアなどを見落としがちなので、警告を無効化することを選択した)。 ;Windowsでfopenを使う場合:<syntaxhighlight lang="C"> #include "stdafx.h" #include <stdio.h> #pragma warning(disable:4996) int main() { FILE *fp = fopen("開きたいファイル名.拡張子", "モード"); if (fp == 0) return 1; // ここにファイルの操作内容(作成、読書きなど)を記述。 fclose(fp); } </syntaxhighlight> <code>#pragma warning(disable:4996)</code> が、fopenなどの関数の使用を許可するプラグマである。これは、<code>stdafx.h</code> など一連のWindows用ヘッダのインクルードの後に指令する必要がある。 {{コラム|Visual Studio で、デバッグ セッションの終了時にコンソールが閉じてしまう場合| Visual Studio で、コンソール アプリケーションのデバッグ セッションの終了時にコンソールが閉じてしまう場合は、 : [ツール] -> [オプション] -> [デバッグ] -> [デバッグの停止時に自動的にコンソールを閉じる] を無効にします。 }} ;Windows用のファイル操作のコード例:<syntaxhighlight lang="C"> #include "stdafx.h" #include <stdio.h> #pragma warning(disable : 4996) int main() { FILE *fp1 = fopen("test1.txt", "w"); if (fp1 == NULL) { perror("ファイルを開けませんでした。\n"); return 1; } fclose(fp1); }</syntaxhighlight> <code>fopen</code> は、モードを "w" で開いた場合、もし対象のファイルが存在しないときは、その名のファイルを新規作成する。 なお、fopenのモードは、 :書き込みモードの"w"と、 :読み込みモードの"r"と、 :追記モードの"a" がある。 なお、一般にファイル操作のプログラミングでは、ファイルのオープンに失敗した場合を想定して、そのような処理を書く必要がある。 fclose は、ファイルを閉じる関数である。クローズしている最中のファイルは、プログラミングによる読書きなどの操作をできない。 読者は、ソースファイルのあるフォルダを確認してみて、"test1.txt"というファイルが作られている事を確認しよう。 {{コラム|"stdafx.h"って何?|プログラムの冒頭で<syntaxhighlight lang="C" inline>#include "stdafx.h"</syntaxhighlight> と <code>"stdafx.h"</code> なるヘッダーをインクルードしています。 これはC言語標準にはなく、Windows(Visual Studio)固有のプリコンパイルヘッダーです。stdafx は Standard Application Frameworks の略で、MFC(Microsoft Foundation Class)の使用を想定しているものでした。 VS2019からが、<code>"stdafx.h"</code> から <code>"pch.h"</code>(Pre compile header)と機能と一致した名前になりました。 いずれにしても、Windows/Visual Studio でプリコンパイルヘッダーを使う状況でしか意味がありませんし、この本で扱うサイズのプリグラムではプリコンパイルヘッダーを使うメリットはありません。}} == 読み書き == === ファイルへの書き込み === ファイルを作成したりオープンしただけでは、まだ何も読み込まれないし、何も書き込まれない。 ファイルに何かデータを書き込むには、 <code>fprintf</code> という関数を使う。 fprintf の冒頭のfは、ファイル関係であることをあらわしている。最後のfは、もともとC言語には「printf」という関数があり、(最後のfは)Format の f。 さて、windowsの設定では、ある設定の場合では <code>fopen</code> と同様に <code>fprintf</code> が初期状態では使えない場合があるので、 <syntaxhighlight lang="C"> #pragma warning(disable:4996) </syntaxhighlight> で指令しておく必要の生じる場合もある。 インクルードすべきヘッダについては、標準出力のヘッダにあるので、 <syntaxhighlight lang="C"> #include <stdio.h> </syntaxhighlight> でインクルードすれば充分である。 さて <code>fprintf</code> で書き込むデータの形式は、変数でもいいし、書き込みたいテキストを直接指定することもできる。 また、もし 変数を書き込む場合なら、変数の型は、文字列型でもいいし、数値型でもいい。 ただし、書き込まれた先のテキストファイルでは、書かれたテキストの由来が何かは、もはや不明になる。つまり、書きこまれた先のテキストファイルでは、書かれた文字列は、すべて単なるテキスト文字の集まりとして扱われる。 さて、たとえばファイルに「test」とだけ書き込みたいなら、 <code> fprintf(fp1, "test \n"); </code> というふうに入力すればいい。 何か変数をファイルに書き込みたい場合、たとえば整数型の変数だとして、変数名が「var」なら、それを書き込むには、あらかじめソースコードで <syntaxhighlight lang="C"> int var; </syntaxhighlight> のように、どこかで宣言しておく。 そのあと、プログラム中にて変数「var」に目的の値を入力させるようにしておく。 そのあと、プログラムがコード内でのファイル書き込み実行場所にて <syntaxhighlight lang="C"> fprintf(fp1, "%d \n", var); </syntaxhighlight> のようなコードを実行するように、ソースコードを記述すればいい。 ファイル書き込むのできる変数の型は、数値型も文字列型でも可能である。 次のコード例として、文字列型の変数をファイルに書き込むコード例を示す。 ;コード例 <syntaxhighlight lang="C"> #include "stdafx.h" #include <stdio.h> #pragma warning(disable:4996) int main() { FILE *fp1 = fopen("test1.txt", "w"); if (fp1 == NULL) { perror("ファイルを開けませんでした。\n"); return 1; } else { printf("ファイルをオープンしました。\n"); } char string[50]; printf("キーボードから文字列を入力してください。\n"); scanf("%s", &string); printf("入力された文字列は %s です。 \n", string); printf("これをファイルに書き込みます。 \n"); fprintf(fp1, "%s \n", string); fclose(fp1); printf("ファイルをクローズしました。\n"); } </syntaxhighlight> このようにして、ファイルへの出力が出来る。 === ファイルの読み取り === 次に、ファイルからの読み取りをする方法を学ぼう。 ファイルからの読み取りには、まずfopenの際にモードを"r"にする。(英語で、本や文章などを読むことを read (リード)という。その read リードの頭文字 r のこと。) 読み取りの際の関数には <code>fgets</code> や <code>fscanf</code> を使えばいい。 <code>fscanf</code> や <code>fgets</code>は、ファイルから1行ずつ、読み取ることができる。 なお、 <code>fscanf</code> や <code>fgets</code> の違いは、 :行末の改行を読み込むかどうか、 :空白文字(半角スペース)があると読み込みを中断するかどうか、 です。fscanfのほうが、空白文字(半角スペース)があると読み込みを中断します。 くわしくは、あとの章で説明します。 とりあえず、ファイル読み取りの具体例を調べていきましょう。 ;fscanf の例 あらかじめ、テキストファイル test1.txt に、なんらかの文字列を書いておこう。 一例として、 <pre> aaaaaaaaaaa ssssssss dddddd </pre> と書いたとする。 コード例を示す。 <syntaxhighlight lang="C"> #include "stdafx.h" #include <stdio.h> #pragma warning(disable:4996) int main() { FILE *fp1 = fopen("test1.txt", "r"); if (fp1 == NULL) { // ここを読み取りモード"r"にするのを忘れないように perror("ファイルを開けませんでした。\n"); return 1; } else { printf("ファイルをオープンしました。\n"); } char str1[150]; printf("文字列を読み取っています。\n"); fscanf(fp1, "%s", str1); printf("ファイルに書いてある文字列\n"); printf("%s\n", str1); fclose(fp1); printf("ファイルをクローズしました。\n"); } </syntaxhighlight> ;実行結果 <pre> ファイルをオープンしました。 文字列を読み取っています。 ファイルに書いてある文字列 aaaaaaaaaaa ファイルをクローズしました。 続行するには何かキーを押してください . . . </pre> このように、最初の1行(aaaaaaaaaaa)だけが読み取りされている。 2行目以降も読み取りたい場合には、その行数だけ、下記のように繰り返しfscanfを使う必要がある。 <syntaxhighlight lang="C"> #include "stdafx.h" #include <stdio.h> #pragma warning(disable:4996) int main() { FILE *fp1 = fopen("test1.txt", "r"); // ここを読み取りモード"r"にするのを忘れないように if (fp1 == NULL) { perror("ファイルを開けませんでした。\n"); return 1; } else { printf("ファイルをオープンしました。\n"); } char str1[150]; printf("文字列を読み取っています。\n"); fscanf(fp1, "%s", str1); printf("ファイル1行目に書いてある文字列\n"); printf("%s\n", str1); fscanf(fp1, "%s", str1); printf("ファイル2行目に書いてある文字列\n"); printf("%s\n", str1); fclose(fp1); printf("ファイルをクローズしました。\n"); } </syntaxhighlight> ;実行結果 <pre> ファイルをオープンしました。 文字列を読み取っています。 ファイル1行目に書いてある文字列 aaaaaaaaaaa ファイル2行目に書いてある文字列 ssssssss ファイルをクローズしました。 続行するには何かキーを押してください . . . </pre> === fgetsとfscanfの違い === <code>fscanf</code> や <code>fgets</code> の違いは、大まかには :行末の改行を読み込むかどうか、 :空白文字(半角スペース)があると読み込みを中断するかどうか、 です。fscanfのほうが、空白文字(半角スペース)があると読み込みを中断します。fgetsのほうが、改行を読み込みます。 論より証拠で、実際にコードを実行して比べてみましょう。 まず、読み込み対象のテキストファイル test2.txtとして、 <pre> rt aaaaaaaaaaa u ssssssss dddddd </pre> のように、空白文字(半角スペース)を入れてみましょう。rt と aaaaaaaaaaa のあいだに半角スペースが一文字あります。 そしてコードは、(Fedora30 の gccコンパイルで確認) fgetsのほうは <syntaxhighlight lang="C"> #include <stdio.h> int main() { FILE *fp1 = fopen("test1.txt", "r"); // ここを読み取りモード"r"にするのを忘れないように if (fp1 == NULL) { perror("ファイルを開けませんでした。\n"); return 1; } else { printf("ファイルをオープンしました。\n"); } char buffer1[150]; printf("文字列を読み取っています。\n"); fgets(buffer1,150,fp1); printf("1回目に読み取った文字列\n"); printf("%s", buffer1); fgets(buffer1,150,fp1); printf("2回目に読み取った文字列\n"); printf("%s", buffer1); fclose(fp1); printf("ファイルをクローズしました。\n"); } </syntaxhighlight> このコードでは、<code>printf </code> の%sの後ろには改行文字(<code>\n</code>)をつけていません。なぜなら、<code>fgets </code> ではファイル読み込み時に改行文字も一緒に読み込むからです。 ;実行結果 <pre> ファイルをオープンしました。 文字列を読み取っています。 1行目に書いてある文字列 rt aaaaaaaaaaa 2行目に書いてある文字列 u ssssssss ファイルをクローズしました。 </pre> です。 ---- いっぽう、fscanf のほうは <syntaxhighlight lang="C"> #include <stdio.h> int main() { FILE *fp1 = fopen("test1.txt", "r"); // ここを読み取りモード"r"にするのを忘れないように if (fp1 == NULL) { perror("ファイルを開けませんでした。\n"); return 1; } else { printf("ファイルをオープンしました。\n"); } char buffer1[150]; printf("文字列を読み取っています。\n"); fscanf(fp1, "%s", buffer1); printf("1回目に読み取った文字列\n"); printf("%s", buffer1); fscanf(fp1, "%s", buffer1); printf("2回目に読み取った文字列\n"); printf("%s", buffer1); fclose(fp1); printf("ファイルをクローズしました。\n"); } </syntaxhighlight> ;実行結果 <pre> ファイルをオープンしました。 文字列を読み取っています。 1行目に書いてある文字列 rt2行目に書いてある文字列 aaaaaaaaaaaファイルをクローズしました。 </pre> です。 このように、fcanf のほうでは、空白文字があるので、最初の1回目のfscanfでは、「rt」までしか読み込みません。 しかも改行を読み込まないので、 「rt」と「2行目に書いてある文字列」が続いて rt2行目に書いてある文字列 と表示されてしまっています。 そして、2回目の fscanf で「aaaaaaaaaaa」を読み込んでいます。 == CSVファイルの入出力 == === fscanfによる入門的方法 === CSVファイルという、カンマで区切った形式のファイルがある。 たとえば、 次のようなデータである。 ファイル名「sample.csv」 <pre> 名前,番号 山田,1 佐藤,2 </pre> なお、表計算ソフト( libreOffice の Calc など)で、表計算ファイルをCSVファイルに変換することができる。 表計算ソフトのそれぞれのセルにデータを入力したあと、表計算ファイルを「名前をつけて保存」するときに、ファイル形式を選択する欄があるので、その欄でCSV形式を選べばいい。 さて、CSVファイルをカンマで区切って一つずつ読み取りたい場合、 fscanf関数では <code>%[^ ]</code>という関数を使う。<code>%[^ ]</code>は、そのカッコの中にある文字をみつけるまで文字を読み込む。また、そのカッコ内の文字は保持しない。 たとえば <code>%[^,]</code>なら、カンマ記号(,)の手前まで文字を読み込み、カンマ記号じたいは除いて読み込む。 なので、<code>%[^,]</code>なら、結果的にカンマ文字を区切り文字として扱うことになる。 CSV読み取りファイルのプログラム例は、たとえば次のようなファイルになる。 (Fedora30 で確認) <syntaxhighlight lang="C"> #include <stdio.h> int main() { FILE *fp1 = fopen("sample.csv", "r"); if (fp1 == NULL) { // ここを読み取りモード"r"にするのを忘れないように perror("ファイルを開けませんでした。\n"); return 1; } else { printf("ファイルをオープンしました。\n"); } char str1[150]; char str2[150]; printf("文字列を読み取っています。\n"); fscanf(fp1, "%[^,],%s,%s", str1,str2); printf("str1として読み取った文字列\n"); printf("%s\n", str1); printf("str2として読み取った文字列\n"); printf("%s\n", str2); fclose(fp1); printf("ファイルをクローズしました。\n"); } </syntaxhighlight> '''実行結果''' (Fedora30 で確認)<br> <pre> ファイルをオープンしました。 文字列を読み取っています。 str1として読み取った文字列 名前 str2として読み取った文字列 番号 ファイルをクローズしました。 </pre> === fgetsによる方法 === ==== 簡単な例 ==== さきほどの章では、説明の都合上、fscanfを使ったが、じつは、fscanfでCSVファイルを作るのは、あまり実用的ではない。 なぜなら、まず空白文字(半角スペース)で読み込みを停止してしまうので、半角スペースを含む文字列の読み込みが出来無いからである。 なので、CSVの読み取りファイルをC言語で作る場合、fgets関数を作るほうが良い。 しかし、fgets には、<code>%[^,]</code> のようなカンマで読み込み中止関数をする都合いい機能が無い。 なので、いったんfgetsで、その行の全体を読み込んだ後に、<code> strtok </code> という別の関数を使うのが良い。 <code> strtok </code> 関数とは、指定した文字列の直前までを読み込み機能のある関数なので、この関数でカンマ文字まで読み込むことを関数すればいい。<code> strtok </code> では、指定した文字列じたいは読み込まない。 なお、 <code> strtok </code> 関数を使うためには <code> #include <string.h> </code> が必要である。 書式は <syntaxhighlight lang="C"> strtok(分解する文字列のある変数,"区切り文字にしたい文字") </syntaxhighlight> のようになる。 CSVファイルを読み込ませたいなら、区切り文字にしたいのはカンマ記号なので、 <syntaxhighlight lang="C"> strtok(分解する文字列のある変数,",") </syntaxhighlight> となる。 なお、<code> strtok </code> の第一引数を「NULL」にすると、前の文字の続きから読み込む。つまり <syntaxhighlight lang="C"> strtok(NULL,"区切り文字にしたい文字") </syntaxhighlight> にすると、前の文字の続きから次ぎの区切り文字まで(その行に残りの区切り文字がない場合には行末まで)を読み込む。 コードは下記のようになる。 (Fedora30 で確認) <syntaxhighlight lang="C"> #include <stdio.h> #include <string.h> int main() { FILE *fp1 = fopen("sample.csv", "r"); // ここを読み取りモード"r"にするのを忘れないように if (fp1 == NULL) { perror("ファイルを開けませんでした。\n"); return 1; } else { printf("ファイルをオープンしました。\n"); } char buffer1[150]; printf("文字列を読み取っています。\n"); fgets(buffer1,150,fp1); printf("1行目の文字列\n"); printf("%s", buffer1); char str1[150]; char str2[150]; strncpy(str1, strtok(buffer1,",") ,150); // str1 = strtok(buffer1,","); では代入できない。 strncpy(str2, strtok(NULL,",") ,150); printf("str1として読み取った文字列\n"); printf("%s", str1); printf("\n"); printf("str2として読み取った文字列\n"); printf("%s", str2); fgets(buffer1,150,fp1); printf("2行目の文字列\n"); printf("%s", buffer1); strncpy(str1, strtok(buffer1,",") ,150); strncpy(str2, strtok(NULL,",") ,150); printf("str1として読み取った文字列\n"); printf("%s", str1); printf("\n"); printf("str2として読み取った文字列\n"); printf("%s", str2); fclose(fp1); printf("ファイルをクローズしました。\n"); } </syntaxhighlight> ;実行結果 <pre> ファイルをオープンしました。 文字列を読み取っています。 1行目の文字列 名前,番号 str1として読み取った文字列 名前 str2として読み取った文字列 番号 2行目の文字列 山田,1 str1として読み取った文字列 山田 str2として読み取った文字列 1 ファイルをクローズしました。 </pre> 上記のように、たしかに、読み取った文字列を分解している。 ==== 要素数の多い場合の例 ==== さきほどの例では、説明の単純化のため、たったの各行あたり、要素数はたった2個だった。 しかし、実際の場合は、もっと要素数が多い。 たとえば、 <pre> 名前,番号,国語の得点,数学の得点 山田,1,80,90 佐藤,2,70,100 </pre> のように、各行あたり4個のデータを読み込む場合を考えよう。 ;コード例 <syntaxhighlight lang="C"> #include <stdio.h> #include <string.h> #pragma warning(disable:4996) int main() { FILE* fp1 = fopen("sample.csv", "r"); if (fp1 == NULL) { // ここを読み取りモード"r"にするのを忘れないように perror("ファイルを開けませんでした。\n"); return 1; } else { printf("ファイルをオープンしました。\n"); printf("\n"); } char buffer1[150]; printf("文字列を読み取っています。\n"); struct seisekihyou { char str[150]; }; struct seisekihyou row[20]; // 構造体配列の宣言 // 下記のline は読み取りたい行数 for (int line = 1; line <= 2; line = line + 1) { fgets(buffer1, 150, fp1); printf("%d行目の文字列\n",line); printf("%s", buffer1); strncpy(row[0].str, strtok(buffer1, ","), 150); // str1 = strtok(buffer1,","); では代入できない。 printf("row[%d].strとして読み取った文字列\n", 0); printf("%s\n", row[0].str); // 下記のtempは1行あたりの読み取りたい項目数 for (int temp = 1; temp <= 3; ++temp) { strncpy(row[temp].str, strtok(NULL, ","), 150); printf("row[%d].strとして読み取った文字列\n", temp); printf("%s\n", row[temp].str); } printf("\n"); } fclose(fp1); printf("ファイルをクローズしました。\n"); return 0; } </syntaxhighlight> ;実行例 <pre> ファイルをオープンしました。 文字列を読み取っています。 1行目の文字列 名前,番号,国語の得点,数学の得点 row[0].strとして読み取った文字列 名前 row[1].strとして読み取った文字列 番号 row[2].strとして読み取った文字列 国語の得点 row[3].strとして読み取った文字列 数学の得点 2行目の文字列 山田,1,80,90 row[0].strとして読み取った文字列 山田 row[1].strとして読み取った文字列 1 row[2].strとして読み取った文字列 80 row[3].strとして読み取った文字列 90 ファイルをクローズしました。 このウィンドウを閉じるには、任意のキーを押してください... </pre> ;解説 前の節では、単純化のために配列や構造体やfor文は用いなかったが、実務では用いたほうがイイだろう。 各行の最初の項目だけ <code>strncpy(row[0].str, strtok(buffer1, ","), 150);</code> のようにstrtokの第一引数を指定する必要がある。 いっぽう、<code>strncpy(row[temp].str, strtok(NULL, ","), 150);</code> のようにstrtokの第一引数がnullなら、strtokは以前の区切り文字から次の区切り文字までを抜き取るだけなので、2番目の項目からはfor文で使いまわしができる。 == if文との組み合わせ == fgets関数やstrtok関数などで読み取った文字列をもとに、if文などの条件分岐関数と組み合わせる際、標準C言語のif文では、文字列にはイコール記号<code>==</code> など算術的な記号での比較ができないです。 これはつまり、Linux標準のGCCでは、文字列の比較にイコール記号が使えないという事です。 標準C言語では、文字列どうしの比較をする際、<code> strcmp </code> という関数を使います。 strcmpについて詳しくは『[[C言語/制御文]]』をお読みください。 == 文字コード == {{Main|[[w:Microsoftコードページ932]]}} Windowsの場合、システム内部の文字コードには原則的にUnicodeを使っているのだが、しかし例外的にコマンドプロンプトではマイクロソフト独自規格の文字コードを使っている。 マイクロソフト社は、これをアメリカ標準規格のANSIと呼んでいるが<ref>マイクロソフトは、CP932を「ANSI」とは自称しておらず、[https://docs.microsoft.com/ja-jp/host-integration-server/core/ansi-oem-code-page-support-snanls-1 ANSI/OEM Code Page Support (SNANLS)]の一環として、'''ANSI/OEM - Japanese Shift-JIS'''の名称でサポートしている。この節は、この誤解に基づいて編集されていることに注意する必要がある。</ref>、実は、中身は米国の行政府の定める本物の1バイト文字のANSIでなく、マイクロソフト独自規格の自称「ANSI」である。おそらく、マイクロソフト独自規格の自称「ANSI」は、日本語などの2バイト文字の表示機能を含むので、自称「ANSI」も2バイト以上の文字であろうと考えられている。 1980年代くらいの古い、マイクロソフト日本法人などの開発したShift-JISという比較的に低バイト文字(2バイト以上の文字)の独自規格を、マイクロソフト米国法人の古い低バイト文字(1バイト以上の文字)の文字コードとすりあわせた独自規格のことをマイクロソフト社は「ANSI」と称しているようだ。 いちおう、現在ではShift-JISは日本工業規格になっているが、実際のWindowsでの文字コードの実装では、Windows用に独自にアレンジされたものを使っており、厳密には区別のためCP932という文字コード名で、技術者は呼ぶ。 アクセサリ「メモ帳」などのテキストエディタの文字コードでも、標準設定では、マイクロソフト独自規格の自称「ANSI」を使っている。 さて、上述のプログラム例で紹介したソースコードのように、特に文字コードの指定をする必要なく、日本語も表示できる。 マイクロソフト社が、そのように、コマンドプロンプトの機能を調整しているからである。 コマンドプロンプトで表示する場合、読み取るテキストファイルの文字コードは自称「ANSI」形式にしておけばいい。アクセサリ「メモ帳」の標準コードは「ANSI」(マイクロソフト自称)になっているので、特に変更する必要は無い。 もし、単に、あるテキストファイルを読み取ってコマンドプロンプトで表示するだけの場合なら、むしろUnicodeは、使ってはならない(少なくとも初心者は)。 読み取り対象のテキストファイルをUnicodeなどに変換すると、コンソール表示の際には、文字化けをしてしまう。 ただし、コマンドプロンプト以外のGUIアプリケーションの作成では(Windows API というのを使うと、GUIアプリを作れる)、文字表示の関数がANSI形式に対応しておらず Unicode 対応になっている場合もある。最終的に現代のプログラマが作るアプリケーションのほとんどはGUIアプリであるので、Windowsシステム内部の文字コードがANSIとUnicodeに不統一になっているのは、これは深刻な問題である。 ソースコード中にある文字については、コンパイラがコンパイル時に調節してくれるのが、しかしソースコード外部のテキストファイルについては、コンパイラが調整してくれないので、テキストファイルの読み取って表示などをした際に文字化けが起きることがある。 つまり、結論から言うと、GUIアプリとコンソールアプリで共通のテキストファイルを使うことは、あきらめるべきである。 ANSIコード(マイクロソフト自称)でも日本語は表示できるのだが、よそのパソコンなどに移動した場合に文字化けをする可能性がある。 なお、コンソール表示では不要だが、本来なら、自称「ANSI」コードや2バイト文字では、英語以外の文字を扱う際、 <code>setlocale(LC_ALL, "japanese");</code> のように、英語以外の文字コードとして、どこの言語を使用するのかを指定しないといけない。2バイト文字の2バイトだけでは、65536文字までしか区別できないので、文字情報だけでは世界中の文字を網羅することは不可能であり、そのため、対象の文字を限定するために、言語を指定する必要があるからである。 (なお、日本語の常用漢字は、約2000個である。なので、2バイト文字なら、言語指定があれば、十分に常用漢字を表現できる。) もっとも、Windowsのコマンドプロンプトに表示する場合、そのような言語指定なく、表示できる。 == Linux の場合 == 一例として、Fedora28でファイル入出力を実行する場合のコードと実行結果の例を下記にしめす。 テキストファイルの文字コードはUTF-8である。Fedoraの標準の文字コードのままである。テキストエディタにはGedit(ジーエディット)を用いている。GeditはFedora28で標準に付属してくるテキストエディタである。 <syntaxhighlight lang="C"> #include <stdio.h> int main() { FILE *fp1 = fopen("test1.txt", "r"); // ここを読み取りモード"r"にするのを忘れないように if (fp1 == NULL) { perror("ファイルを開けませんでした。\n"); return 1; } else { printf("ファイルをオープンしました。\n"); } char str1[150]; printf("文字列を読み取っています。\n"); fscanf(fp1, "%s", str1); printf("ファイル1行目に書いてある文字列\n"); printf("%s\n", str1); fscanf(fp1, "%s", str1); printf("ファイル2行目に書いてある文字列\n"); printf("%s\n", str1); fclose(fp1); printf("ファイルをクローズしました。\n"); return 0; } </syntaxhighlight> ;実行結果 <pre> ファイルをオープンしました。 文字列を読み取っています。 ファイル1行目に書いてある文字列 aaaaaaaaaaa ファイル2行目に書いてある文字列 ssssssss ファイルをクローズしました。 </pre> Fedora28の場合、読み取り対象のテキストファイルの文字コードを何に変えても、コマンドプロンプトで正しく表示される。 なお、Geditの変換可能な文字コードの一覧に「日本語 (CP932)」 というのがあるが、これがマイクロソフト Shift-JIS のことである(つまり マイクロソフト自称「ANSI」)。もし、マイクロソフト自称ANSIとLINUX用テキストファイルを共通化したい場合、 CP932 を選べばいい。 とはいえ、最近のWindows用テキストエディタでは(Linuxでは標準的に採用されている)UTF-8も表示できるのが一般的なので、特に文字化けなどの起きないかぎり、むりに文字コードを変える必要は無い。 == ワイド文字のファイル入出力 == === Linuxの場合 === Windowsでいう「Unicode」が、マイクロソフト社の自称にすぎず、実態は国際規格とは違う。 なので、説明の簡単のために、まず Linuxで説明する。 ;読み取りたいテキスト <pre> これはテストです。 aaaaaaaaaaa </pre> ;Linuxの場合のコード例 <syntaxhighlight lang="C">#include <stdio.h> #include <locale.h> #include <wchar.h> int main(void) { setlocale(LC_ALL, "ja_JP.UTF-8"); //ロケール(地域)を設定する。 FILE* fp1 = fopen( "test1.txt", "r, ccs = UTF-8"); // ここを読み取りモード"r"にするのを忘れないように if (fp1 == NULL) { wprintf(L"ファイルを開けませんでした。\n"); return 1; } else { wprintf(L"ファイルをオープンしました。\n"); } wchar_t str1[150]; wprintf(L"文字列を読み取っています。\n"); fwscanf(fp1, L"%s", str1); wprintf(L"ファイルに書いてある文字列\n"); wprintf(L"\n"); wprintf(L"%s\n", str1); wprintf(L"\n"); fclose(fp1); wprintf(L"ファイルをクローズしました。\n"); return 0; } </syntaxhighlight> ;実行結果 <pre> ファイルをオープンしました。 文字列を読み取っています。 ファイルに書いてある文字列 これはテストです。 ファイルをクローズしました。 </pre> なお、テキストファイルの拡張子に「.txt」とあるので、もしかしたらLinuxの種類によってはWindowsのShift-JISコードだと判断してLinuxが自動的にそのテキストファイルのエンコードをShift-JISに書き換える可能性があるので、もしも、上記のコードで実行しても文字化けなどしてるなら、再度、テキストファイルを開いて、UTF-8にエンコードしなおす事。 なお、Linuxでよく標準的に付属してくる glibc には、fopenのワイド文字バージョン( wfopen のような関数)は無い。 また、fopenで読み取るファイルに日本語を使うと、文字化けをしたり、ファイルを開くのに失敗したりする。 たとえば、「テスト1.txt」のような日本語のファイル名で作られたファイルは、上記のコードのfopenで読み取るファイル名を「テスト1.txt」に書き換えても、読み取りできない。 なお、Linuxでは、文字の変換には [[w:iconv]](アイコンブ) などのAPIが利用されている。iconv については高度すぎる話題になるので、説明を省略する。 上記コードのようにLinuxでもwprintfなどのワイド文字型の組み込み関数が使えるが、しかし、printfなどでも日本語を表示できてしまうので、Linuxではワイド文字用の組み込み関数は、実用性は乏しい。 === Windowsの場合 === Unicodeなどのテキストファイルを読み取れるように、上記のようにワイド文字型の関数を使ってコードを書いても、日本語を含むファイルは文字化けをする。(いっぽう、テキストファイル中の英数字だけ、正しく表示されたりする。) 例えば、下記のようなコードを書いても、日本語の文字は、文字化けしてしまう。 <syntaxhighlight lang="C"> // 文字化けしてしまう。 // Windowsを想定 #include <stdio.h> #include <locale.h> #pragma warning(disable:4996) int main() { _wsetlocale(LC_ALL, L""); //ロケール(地域)を設定する。 FILE* fp1 = _wfopen( L"test1.txt", L"r, ccs = UNICODE"); if (fp1 == NULL) { // ここを読み取りモード"r"にするのを忘れないように wprintf(L"ファイルを開けませんでした。\n"); perror(0); return 1; } else { wprintf(L"ファイルをオープンしました。\n"); } wchar_t str1[150]; wprintf(L"文字列を読み取っています。\n"); fwscanf(fp1, L"%s", str1); wprintf(L"ファイルに書いてある文字列\n"); wprintf(L"\n"); wprintf(L"%s\n", str1); wprintf(L"\n"); fclose(fp1); wprintf(L"ファイルをクローズしました。\n"); } </syntaxhighlight> いっぽう、テキストファイルにANSIエンコードを使い、ソースコードの文字表示にprintfなど非ワイド型の関数を使った場合では文字化けをしない。 よってWindowsでは、なるべくANSIエンコードを使うのが安全だろう。特別な理由がないかぎり、ワイド文字型を使う必要も無い。 また、このことから、Windowsの自称する「Unicode」が、実際の国際規格とは実態が違っていることが分かる。 == バイナリーファイルの読み書き == === バイナリーファイルとしての書き込み === C言語のプログラムで、バイナリーファイルの読み書きをしたい場合、 <code>fopen </code> の引数で「r」(読み込み)とか「w」(書き込み)とか編集モードの指定がありますが、それに「b」をつけます。つまり「rb」や「wb」などの引数になります。 また、書き込む関数には fwrite を使う必要があります。 いっぽう、 fprintf では、テキストファイルに自動的に変換してしまいます。 たとえば下記のようになります。 <syntaxhighlight lang="C"> //#include "stdafx.h" #include <stdio.h> #pragma warning(disable:4996) int main() { FILE *fp1 = fopen("test1.bin", "wb"); if (fp1 == NULL) { perror("ファイルを開けませんでした。\n"); return 1; } else { printf("ファイルをオープンしました。\n"); } printf("バイナリファイルに書き込んでいます。 \n"); char buf[5] = {0x42,0x4d,3,4,5}; fwrite(buf, 1, 5, fp1); fclose(fp1); printf("ファイルをクローズしました。\n"); } </syntaxhighlight> 書き込みできたか否かを確認するには、バイナリエディタ(あるいは「16進エディタ」などと言われる)で確認してください。 <code>0x42</code> などの冒頭の 0x は16進数であることを表す。バイナリーファイルの読み書きに限らず、一般にC言語で16進数をあつかう場合は、16進数である数に接頭辞 0x をつけて区別する。数値 0~9 までは0x をつけなくても十進数と同じなので省略できる。 バイナリエディタで読み込み 42 4D 03 04 05 と書き込まれていることが確認できれば成功である。 === 読み取り === バイナリファイルの読み取りには fread を使うことがある。 いきなりバイナリファイルを読み取るのは初心者には難しいので、まずテキストファイルを読み取る実験をしてみよう。 以前に作った test1.txt ファイルを読み取るとしよう。 test1.txt <pre> aaaaaaaaaaa ssssssss dddddd </pre> コード例 <syntaxhighlight lang="C"> #include <stdio.h> #pragma warning(disable:4996) int main() { FILE *fp1 = fopen("test.txt", "r"); if (fp1 == NULL) { perror("ファイルを開けませんでした。\n"); return 1; } else { printf("ファイルをオープンしました。\n"); } char str1[150]; printf("文字列を読み取っています。\n"); fread(str1, sizeof(unsigned char), sizeof(str1) / sizeof(str1[0]), fp1); printf("ファイルに書いてある文字列\n"); printf("%s\n", str1); fclose(fp1); printf("ファイルをクローズしました。\n"); } </syntaxhighlight> ;実行結果 <pre> ファイルをオープンしました。 文字列を読み取っています。 ファイルに書いてある文字列 aaaaaaaaaaa ssssssss dddddd ファイルをクローズしました。 </pre> では、バイナリーデーターを読み取ろう。 コード例 <syntaxhighlight lang="C"> #include <stdio.h> #pragma warning(disable:4996) int main() { FILE *fp1 = fopen("test1.txt", "rb"); if (fp1 == NULL) { perror("ファイルを開けませんでした。\n"); return 1; } else { printf("ファイルをオープンしました。\n"); } char str1[70]; // 表示結果を短くするために数値を微妙に小さくした printf("バイナリーデーターを読み取っています。\n"); // 「文字列」ではなくバイナリーデーター fread(str1, sizeof(char), 50, fp1); printf("ファイルに書いてあるバイナリーデーター\n"); for (int i=0 ; i < sizeof(str1) / sizeof(str1[0]); i = i+1) { printf("%02x ", str1[i]); // 最低でも2桁を表示、の意味 } fclose(fp1); printf("\nファイルをクローズしました。\n"); } </syntaxhighlight> ;実行結果 <pre> ファイルをオープンしました。 バイナリーデーターを読み取っています。 ファイルに書いてあるバイナリーデーター 61 61 61 61 61 61 61 61 61 61 61 0d 0a 73 73 73 73 73 73 73 73 0d 0a 0d 0a 64 64 64 64 64 64 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ファイルをクローズしました。 </pre> :※ ファイル作成時・保存時の文字コードの種類によっては改行文字 0d 0a などの制御文字の内容が若干違うかもしれません。 == 脚註 == <references /> [[カテゴリ:C言語]] 1mmmazvvgr2pidrlmv21cuezviaz4d4 高等学校 生物基礎 0 24728 205622 204720 2022-07-21T10:27:55Z Kwawe 68789 /* SECTION1 生物の多様性と共通性 */ wikitext text/x-wiki {{substub}} [[小学校・中学校・高等学校の学習]] > [[高等学校の学習]] >[[高等学校 生物基礎|生物基礎]] </small> <ref>本解説では令和4年以降の新課程啓林館の生物基礎教科書順番にそってリンクを掲載しています。</ref> == PART1 生物の特徴== === SECTION1 生物の多様性と共通性=== # [[高等学校 生物基礎/多様な生物の共通性|多様な生物の共通性]] {{進捗|00%|2022-00-00}} # [[高等学校 生物基礎/生物共通の単位(細胞)|生物共通の単位(細胞)]] {{進捗|100%|2022-07-10}} # [[高等学校 生物基礎/個体の成り立ちと多様性|個体の成り立ちと多様性]] {{進捗|100%|2022-07-21}} ## [[高等学校理科 生物基礎/細胞とエネルギー|細胞とエネルギー]] {{進捗|25%|2015-01-16}} === SECTION2 細胞とエネルギー=== == PART2 遺伝子とその働き== ## [[高等学校理科 生物基礎/遺伝情報とDNA|遺伝情報とDNA]] {{進捗|75%|2018-12-12}} ## [[高等学校理科 生物基礎/遺伝情報の分配|遺伝情報の分配]] {{進捗|75%|2018-12-12}} ## [[高等学校理科 生物基礎/遺伝情報とタンパク質の合成|遺伝情報とタンパク質の合成]](旧課程では生物IIの一部に対応 {{進捗|75%|2018-12-12}} # == PART3 生物の体内環境の維持 == ## [[高等学校理科 生物基礎/体液|体液]] ## [[高等学校理科 生物基礎/血液とその循環|血液とその循環]] ## [[高等学校理科 生物基礎/内臓と体内環境|内臓と体内環境]] ## [[高等学校理科 生物基礎/ホルモンによる体内環境の調節|ホルモンによる体内環境の調節]] {{進捗|75%|2015-01-25}} ## [[高等学校理科 生物基礎/免疫|免疫]] ## [[高等学校理科 生物基礎/神経による体内環境の調節|神経による体内環境の調節]] {{進捗|75%|2015-01-25}} == PART4 生物の多様性と生態系== === SECTION1 多様な植生と遷移=== # [[高等学校 生物基礎/植生と環境の関わり|植生と環境の関わり]]{{進捗|00%|2022-07-10}} # [[高等学校 生物基礎/様々な植生|様々な植生]]{{進捗|00%|2022-07-10}} # [[高等学校 生物基礎/植生の移り変わり|植生の移り変わり]]{{進捗|00%|2022-07-10}} === SECTION2 バイオームとその分布=== # [[高等学校 生物基礎/地球上の植生分布|地球上の植生分布]]{{進捗|00%|2022-07-10}} # [[高等学校 生物基礎/様々なバイオーム|様々なバイオーム]]{{進捗|75%|2022-07-08}} === SECTION3 生態系とその保全=== ## [[高等学校理科 生物基礎/生態系|生態系]] {{進捗|100%|2022-07-09}} == 関連科目 == # [[高等学校化学I/物質と原子]] {{進捗|75%|2017-02-07}} # [[高等学校化学I/化学結合]] {{進捗|75%|2017-02-07}} # [[高等学校化学I/炭化水素/有機化合物/有機化合物とその構造]] {{進捗|75%|2016-01-10}} [[Category:高等学校教育|生せいふつ1]] [[Category:理科教育|高せいふつ1]] [[Category:生物学|高せいふつ1]] [[category:高校理科|せいふつきそ]] amhe5kplys6m1fx9mib5w52p6zgd4wv 中学受験社会/歴史/中巻 0 26150 205601 199658 2022-07-21T02:08:35Z Artanisen 41776 /* {{Ruby|戦国|せんごく}}時代({{Ruby|安土桃山|あづちももやま}}時代) */ より良い画像= Toyotomi_Hideyoshi_c1598_Kodai-ji_Temple.png wikitext text/x-wiki {{Pathnav|メインページ|小学校・中学校・高等学校の学習|中学受験参考書|中学受験社会|中学受験社会/歴史|frame=1}} [[{{PAGENAME}}]]では、中学受験社会の歴史分野について、平安時代の終わり~江戸時代を解説します。 == 武士の世の中へ(平安時代終わり~鎌倉時代) == :(ぶしの よのなか へ) 平清盛は、藤原氏の摂関政治のように、清盛の娘の徳子(とくこ)を、天皇の高倉天皇(たかくらてんのう)の后(きさき)にして、生まれた子を安徳天皇(あんとくてんのう)にさせ、平氏が政治の実権を得ていきます。 このようにして、平氏の一族が、朝廷での重要な役職を得ていき、権力をつよめます。 清盛は、貿易で、中国大陸の国の宋(そう)と貿易をする日宋貿易(にっそうぼうえき)に、かかります。今でいう神戸にあった大輪田泊(おおわだのとまり)という港を改修します。平氏は貿易をすすめていきます。 日宋貿易により、日本には宋銭(そうせん)が多く入ってきた。 平氏の一族は栄え、 <big><big>「平氏にあらずんば 人にあらず」</big></big> (意味:平氏の一族でなければ、その者は人ではない。) とまで言われるほど、平氏が栄えた。 [[ファイル:Itsukushima Hiroshima.JPG|thumb|250px|厳島神社(いつくしま じんじゃ)。広島県。 平氏の一族は、一族の繁栄を厳島神社に願った。 国宝。世界遺産。]] 清盛は 海の神をまつっている厳島神社(いつくしまじんじゃ) を敬った(うやまった)。厳島神社は、今でいう広島県の瀬戸内海の側にある。 そして厳島神社の神を、平氏一族がまつるべき氏神(うじがみ)とした。 平氏の独裁的な政治に、他の皇族や、上皇の院、ほかの武士などからの不満が高まっていく。 ついに1180年、皇族の 以仁王(もちひとおう) は、平氏を滅ぼすように命令を下す。以仁王は後白河法皇の子である。 以仁王の命令を受け、各地で武士たちが平氏をほろぼそうと兵をあげた。 === 鎌倉時代 === 以仁王(もちひとおう)の命令を受け、各地で武士たちが平氏をほろぼそうと兵をあげた。 [[ファイル:Minamoto no Yoritomo.jpg|300px|thumb|源頼朝(みなもとの よりとも)<br>頼朝は、平治の乱(へいじのらん)で頼朝(よりとも)の父の義朝(よしとも)が平氏と戦って負けたので、小さいころに源頼朝は、伊豆(いず)に流されていた。(伊豆の場所は今でいう静岡県のあたり。) やがて成人して大人になった頼朝が、平氏への反乱をした。]] {| class="wikitable" style="float:right" |+ 源氏と平氏のたたかい ! 年 !! おもなできごと |- | 1180 || 源頼朝が伊豆で挙兵するが、石橋山(いしばしやま)の戦い で平氏にやぶれる<br>  源頼朝が富士川の戦いで平氏をやぶる |- | 1181 || 平清盛がなくなる |- | 1183 || 源義仲(みなもとのよしなか)が、倶利伽羅峠(くりからとうげ)の戦いで平氏をやぶる |- | 1184 || 源義経(みなもとの よしつね)が 一の谷(いちのたに)の戦い で平氏をやぶる |- | 1185 || 源義経が八島(やしま)の戦いで平氏をやぶる <br> 源義経が壇ノ浦(だんのうら)の戦いで平氏をやぶる <br> 平氏がほろびる |- |} * 源平(げんぺい)の戦い <span style="color:red">'''源頼朝'''</span>(みなもとの よりとも) は、関東で兵をあげた。富士川の戦いで平氏をやぶったあと、頼朝は関東の鎌倉(かまくら)に、とどまって、勢力の基盤(きばん)をかためた。 そして頼朝は、平氏に不満をもっている武士の北条氏(ほうじょうし)など関東の武士とも協力して、勢力をのばしていった。 頼朝は、自らは鎌倉にとどまり、かわりに弟の '''源義経'''(みなもとの よしつね) の兵をつかって、平氏を西へと追いつめていった。 義経(よしつね)らは義仲(よしなか)を打ちとったあと、平氏の打倒のために兵をうごかし、1184年には 一ノ谷の戦い(いちのたに の たたかい) で平氏をやぶり、つづいて1185年には 屋島の戦い(やしまのたたかい) でも義経らは平氏に勝って、ついに平氏を壇ノ浦においつめ(場所は本州の西の端の山口県の下関「しものせき」)、1185年には壇ノ浦の戦い(だんのうら の たたかい)でヨシツネらは平氏に勝ち、ついに平氏をほろぼす。 これらの源氏と平氏との一連の戦いを「源平の戦い」(げんぺいのたたかい)とか「源平合戦」(げんぺいがっせん)とかという。 [[ファイル:Minamoto no Yoshitsune.jpg|thumb|源義経(みなもとのよしつね) 小さいころは「牛若丸」(うしわかまる)と言われました。平氏との戦いで多くの手柄(てがら)をたてましたが、兄の頼朝と対立し、東北に追われて、平泉(ひらいずみ)で なくなりました。]] 義経(よしつね)は頼朝(よりとも)と対立します。 義経らは東北地方である奥州にいる奥州藤原氏(おうしゅうふじわらし)をたよって東北に逃げていたので、奥州藤原氏も頼朝により滅ぼされます。 いっぽう、平氏の滅亡後、頼朝(よりとも)が朝廷に要求(ようきゅう)したことより、新しい制度として、国ごとに守護(しゅご)が一人ずつを置かれ、荘園(しょうえん)や公領(こうりょう)には地頭(じとう)が置かれた。 守護の仕事は、現代風にいうなら、その国での軍や警察(けいさつ)の管理者である。 地頭の仕事は、荘園および公領の管理や、税である年貢(ねんぐ)の取り立てである。 頼朝は1192年に朝廷から<span style="color:red"><big>征夷大将軍</big></span>(せいい たいしょうぐん) に任命(にんめい)されます。 頼朝は鎌倉に(今でいう神奈川県の鎌倉市のあたり)、武家による政治の拠点である<big>幕府</big>(ばくふ) を開きました。この鎌倉にある幕府を <span style="color:red"><big>鎌倉幕府</big></span>(かまくら ばくふ)と言い、鎌倉に幕府があった時代を<big>鎌倉時代</big>(かまくらじだい) と言います。 1192年からを鎌倉時代とするのが一般的(いっぱんてき)です。 語呂合わせ :1192(いいくに、いい国)つくろう 鎌倉幕府(かまくらばくふ) 征夷大将軍という言葉の意味は、頼朝の時代からは武士たちの中での最高権力者(さいこうけんりょくしゃ)というような意味になってきます。 もともとの意味は、平安時代の坂上田村麻呂(さかのうえのたむらまろ)のように東北地方の蝦夷(えみし)と戦う軍での将軍(しょうぐん)という意味でした。 この鎌倉時代から、政治の権力が朝廷から幕府へと移っていき、武家政治の時代になっていきます。 ==== 鎌倉幕府のしくみ ==== 幕府の行政の仕組みは、朝廷による律令制とは ちがっています。 将軍の家来の武士のことを <big>御家人</big>(ごけにん) という。 将軍は、御家人たちの土地の権利を保証する政策をとるかわりに、御家人たちは将軍のために警備をしたり戦争の時には戦うという主従関係(しゅじゅうかんけい)が、この時代の将軍と手下たちとの主従関係である。 [[ファイル:ご恩と奉公.svg|thumb|400px|ご恩と奉公]] <big>御恩(ごおん)と奉公(ほうこう)</big> という主従関係です。 <big>御恩</big>(ごおん)とは、将軍が御家人の土地の権利を認め保証したり、手柄のあった御家人には新しく領地を与えることです。 <big>奉公</big>(ほうこう)とは、将軍や幕府のために仕事をすることで、具体的には、戦争の時には将軍のために戦うことです。<big>「いざ鎌倉」</big>(いざ かまくら)と言って、御家人は戦いが起きれば、すぐに鎌倉へと行って将軍に指示を聞き、将軍のために戦うべき、とされていました。 この主従関係は土地を仲立ち(なかだち)としています。このように土地を仲立ちとした主従関係を <big>封建制</big>(ほうけんせい) あるいは<big>封建制度</big>(ほうけんせいど) と言います。 御家人たちの屋敷(やしき)は、武家造(ぶけづくり)という作りで、屋敷のまわりに堀(ほり)があったり、塀(へい)で囲まれてたりと、戦いにそなえたつくりになっています。 「一所懸命」(いっしょけんめい)という言葉があるが、この言葉は、御家人たちが自分たちの領地を守るために命がけで戦う様子から出来た言葉である。 [[ファイル:Hojo Masako.jpg|thumb|200px|北条政子(菊池容斎 画、江戸時代)]] 頼朝の死後は、頼朝の子の頼家(よりいえ)が次の将軍になり、さらに次の将軍位は頼朝の子の実朝(さねとも)がついたが、政治の実権は、有力な御家人である北条氏の一族にありました。頼朝の妻は<big>北条政子</big>(ほうじょう まさこ)という女で、その政子の父である<big>北条時政</big>(ほうじょう ときまさ)が<big>執権</big>(しっけん)という役職につき、北条時政らが幕府の実権をにぎりました。 <div style="font-size:120%;"> <pre>         (中央)  将軍━━執権━━┳━━┳━侍所         ┃  ┣━政所         ┃  ┗━問注所         ┃         ┃         ┃    (地方) ┗━━┳━守護            ┣━地頭            ┗━六波羅探題 </pre> </div> 北条氏のように執権として政治の実権をにぎる政治のやりかたを <big>執権政治</big>(しっけん せいじ) といいます。 3代目将軍の実朝は、1219年に頼家の子である公暁(くぎょう)によって実朝は殺されます。こうして源氏の直系の将軍は3代で絶えます(たえます)。 ==== 承久(じょうきゅう)の乱 ==== 1221年、朝廷で院政を行っていた <big>後鳥羽上皇</big>(ごとばじょうこう) は政治の実権を朝廷に取り戻そうとして、北条氏を倒す命令を出しました。 北条氏の幕府軍と、朝廷の軍との戦争になり、北条氏の側が勝ちます。 後鳥羽上皇は島根県の隠岐(おき)という島(しま)に島流し(しまながし)にされ、追放されます。 この争乱を<big>承久の乱</big>(じょうきゅう の らん) といいます。 幕府は朝廷や西国を監視するため、京都に <big>六波羅探題</big>(ろくはらたんだい) を置きました。上皇側に味方した勢力の土地は取り上げられました。こうして西国でも幕府の支配は強まっていきました。 承久の乱 のあとである1232年に、執権の北条泰時(ほうじょう やすとき)らにより、武家社会の慣習をもとに新たな法律をつくり、<big>御成敗式目 </big>(ごせいばい しきもく) という法律をつくり、この式目が政治や裁判の よりどころ になった。 幕府にとっては御家人からの信頼(しんらい)が、幕府の権力の基盤(きばん)なので、御家人から信頼されるために公平な法律をつくる必要があったのだろう。 鎌倉時代は女の地位が、けっこう高かった。女でも土地の相続(ができ、また女でも地頭(じとう)になれた。 ==== 人々のくらし ==== ===== 武士のくらし ===== [[Image:Yabusame 02.jpg|thumb|left|180px|やぶさめ]] [[Image:Inu ou mono00.jpg|thumb|right|280px|犬追物]] [[Image:Kyujutsu07.jpg|thumb|right|280px|かさがけ]] 武士は、日ごろから武芸(ぶげい)に、はげんでいた。やぶさめ(流鏑馬)、かさがけ(笠懸)・犬追物(いぬおうもの)などの武芸に、はげんでいた。3つとも、馬に乗り、弓矢で的をいるものである。 :流鏑馬(やぶさめ)では、馬にのって走りながら、いくつもある板の的をつぎつぎに射る。 :かさがけでは、馬に乗りながら的をいる。 :犬追物では、犬などの動く的を射る。 この3つの武芸を 騎射三物(きしゃみつもの) という。 犬追物では、やわらかい特殊な矢を使い、犬を殺さないようにしていた。 ===== 庶民のくらし ===== 鎌倉時代の農業では鉄を用いた農具が普及し、そのため農業が発展した。 鎌倉時代には二毛作(にもうさく)が西日本で行われるようになった。稲(いね)と麦との二毛作である。秋に米を収穫し、春に麦を収穫する二毛作である。 牛や馬を用いて、牛や馬にスキをひかせて田を耕す方法も行われるようになった。 また、草を焼いた灰や木を焼いた灰( これらを草木灰(そうもくばい)という )を、肥料(ひりょう)として使うようになった。 商業や工業も発展していった。 手工業では、鉄製の農具や武具などを作る鍛冶(かじ)職人や、大工、ほかにも染め物をする職人など、いろいろな手工業の職人があらわれるようになった。 農工業の発達もあって商業も発達した。定期的に市場(いちば)をひらく定期市(ていきいち)が、寺社などの近くで、毎月3回ほど決まった日に市が開かれはじめるようになった。この毎月3回の定期市を 三斎市(さんさいいち) という。 商業には貨幣が必要なので、中国大陸から宋銭(そうせん)が多く、日本に輸入された。 ==== モンゴルとの戦い ==== ===== モンゴル帝国の拡大 ===== [[ファイル:Mongol Empire map.gif|thumb|300px|モンゴル帝国の拡大のようす。モンゴルの領土が、とても大きくなっています。]] 13世紀、モンゴル民族が'''チンギス=ハン'''によって統一され、モンゴル帝国がつくられました。チンギス=ハンが亡くなった後もその子どもや孫たちが勢力を拡大し、中国をふくむユーラシア大陸の広い地域をモンゴル帝国が支配しました。 [[ファイル:YuanEmperorAlbumKhubilaiPortrait.jpg|thumb|left|300px|フビライ=ハン]] チンギスの孫の'''フビライ=ハン'''がモンゴル帝国を治めるころ、フビライは国号を{{ruby|元|げん}}に変えました。 フビライの率いる元は、朝鮮半島を統一していた{{ruby|高麗|こうらい}}も{{ruby|服属|ふくぞく}}させました。また、中国大陸には{{ruby|南宋|なんそう}}がのこっているのでした。日本は平安時代に日宋貿易をしていたように宋との結びつきがある国です。 元は南宋を支配下におくため、宋と交流のあった国に次々と服属を求め、したがわなければ兵を送り、支配していきました。 日本にも、フビライからの服従の要求を伝える元からの使者が、たびたび来ます。執権の8代目である{{ruby|'''北条時宗'''|ほうじょうときむね}}は、元の要求を拒否しつづけます。 ===== {{ruby|元寇|げんこう}} ===== 1274年、ついに元が日本に攻め込みます。元が約3万人の軍勢で博多湾に上陸し、元と鎌倉幕府との戦争になります。 元軍は火薬を用いた新兵器(日本では「てつはう」と呼ばれた)や、毒矢、元軍の集団戦に苦戦しました。それまでの日本では、武士どうしの戦いでは一騎打ちが主流でしたが、外国の軍隊が相手では、日本の慣習は通用しません。 この1274年の元と鎌倉幕府の戦争を{{ruby|'''文永の役'''|ぶんえい の えき}}といいます。このときは元が{{ruby|壱岐|いき}}・{{ruby|対馬|つしま}}などを一時占領し、武士たちも苦戦しましたが、元軍は撤退していきました<ref>以前は暴風雨で被害を受けたからと説明されていましたが、最近の研究では日本の様子を探るための{{ruby|偵察|ていさつ}}が目的だったのではないかと言われています。</ref>。 [[ファイル:Mōko Shūrai Ekotoba.jpg|thumb|500px|文永の役において、矢が飛び交い、てつはうが炸裂する中を、モンゴル帝国連合軍へ斬り込んでいく御家人の{{ruby|竹崎季長|たけさき すえなが}}と、応戦・逃亡するモンゴル兵。画像の合戦の絵は、『{{ruby|蒙古襲来絵詞|もうこしゅうらいえことば}}』という絵巻物の一部の絵です。]] {{clear}} この戦いのあと、幕府は次の元軍の侵攻に備え、博多湾の沿岸に{{ruby|石塁|せきるい}}を築かせます。 1281年に、元の軍勢は、再び日本に襲来してきます。今度の元軍は14万人もの大軍です。 この1281年の戦争を{{ruby|'''弘安の役'''|こうあんのえき}}といいます。この弘安の役では鎌倉幕府軍も準備を整えており、激しい戦いとなりました。そして、暴風雨により元軍は大きな被害を受けて撤退しました<ref>このときの暴風雨は、のちに「{{ruby|神風|かみかぜ}}」と言われるようになりました。</ref>。 この2度の元軍の襲来をあわせて、{{ruby|'''元寇'''|げんこう}}といいます。 フビライは日本襲来を計画しましたが中国大陸南部での反乱などがあり、日本への襲来は延期になり、さらにフビライの関心が中国大陸南部の平定やベトナムの遠征へと関心が変わっていきました。そのうちフビライも死んだので、日本には3度目の襲来は行われませんでした。 御家人は元寇で多くの費用を使いました。しかし、新しい土地を得たわけではなかったため、幕府は御恩としての{{ruby|褒美|ほうび}}の土地を、じゅうぶんには用意できませんでした。このため、御家人は幕府に不満を持つようになりました。 [[ファイル:Adachi yasumori & takezaki suenaga.jpg|thumb|250px|『蒙古襲来絵詞』より鎌倉の安達泰盛邸で先駆けの功を訴える季長(右)。<br>竹崎季長も、恩賞の少なさに不満をもった御家人の一人で、幕府に自分の功績をうったえでるために、彼の元寇での活躍を記した絵巻物を手下のものにつくらせました。それが『蒙古襲来絵詞』だと言われています。]] 御家人の中には、社会の変化で生活が貧しくなり、借金をする者も出てきました。1297年に、幕府は御家人の借金を帳消しにし、金貸しから取られた土地をとりもどす{{ruby|'''徳政令'''|とくせいれい}}を出しました。このときのものを特に、{{ruby|'''永仁の徳政令'''|えいにん の とくせいれい}}といいます。これにより、御家人は一時的に助かりました。しかし、貸したお金が返ってこなくなったうえに担保<ref>お金を貸すときに預けるもの。お金が返せなければ代わりに担保が取り上げられる。</ref>の土地までうばわれたため、金貸しは御家人にお金を貸さなくなました。そのため、御家人たちの生活はかえって苦しくなっていきました。 {{clear}} === 鎌倉時代の文化 === 武士の支配する社会になったので、平安のころの貴族文化とは、ちがった文化が出てきました。 文芸では、平氏の繁栄(はんえい)から滅亡(めつぼう)までを書いた<big>『平家物語』</big>(へいけ ものがたり)のように、軍記物が人々の関心をあつまました。 [[ファイル:Biwa-Hoshi-71-Shokunin-Uta-Awase-Picture-Scroll.png|thumb|琵琶法師。]] <big>琵琶法師</big>(びわほうし)という盲目の僧の人物が、琵琶による弾き語りで各地で平家物語などを語り歩いたといいます。当時は、文字の読める人が少なかったのです。 随筆では鴨長明(かものちょうめい)による『方丈記』(ほうじょうき)や、吉田兼好(よしだけんこう)の『徒然草』(つれづれぐさ)などが出てきた。 貴族を中心とした和歌などの文化も残っていた。『新古今和歌集』(しんこきんわかしゅう)が藤原定家(ふじわらのさだいえ)により編集された。後鳥羽上皇(ごとばじょうこう)の命令により、定家が編集した和歌集が『新古今和歌集』である。 鎌倉時代の和歌集は他にもあり、3代将軍の源実朝(みなもとの さねとも)によって残された『金槐和歌集』(きんかいわかしゅう)がある。 [[ファイル:Nio guardians by Unkei in Nara.jpg|thumb|200px|left|木造金剛力士像(国宝)]] 彫刻(ちょうこく)では、<big>金剛力士像</big>(こんごうりきしぞう)が、つくられました。金剛力士像がある場所は、奈良の東大寺の南大門にあります。この金剛力士像を作った彫刻家(ちょうこくか)は<big>運慶</big>(うんけい)と<big>快慶</big>(かいけい)です。 東大寺は、平安時代からあった寺ですが、平氏に焼き払われたので、鎌倉時代のはじめごろに再建されました。 この再建のときに、中国大陸の宋の建築様式である大仏様(だいぶつよう)が取り入れられました。大仏様は天竺様(てんじくよう)ともいいます。 [[ファイル:Minamoto no Yoritomo.jpg|200px|thumb|似絵(にせえ)。源頼朝とされる人物が描かれている。]] 絵画では、'''似絵'''(にせえ)という肖像画が描かれるようになります。 {{clear}} 仏教では、武士や民衆にも分かりやすいような教えが好まれるようになり、新しい{{ruby|宗派|しゅうは}}が出てきました。その結果、民衆にも仏教が広まるようになります。 鎌倉時代の仏教の宗派には :浄土宗(じょうどしゅう) :浄土真宗(じょうどしんしゅう) :時宗(じしゅう) :日蓮宗(にちれんしゅう) :禅宗(ぜんしゅう) が、出てきます。 *浄土宗(じょうどしゅう) :{{ruby|'''法然'''|ほうねん}}がひらいた。阿弥陀如来(あみだにょらい)を信じ「{{ruby|南無阿弥陀仏|なむあみだぶつ}}」という念仏を唱えるように勧めた。 *{{ruby|浄土真宗|じょうどしんしゅう}}({{ruby|一向宗|いっこうしゅう}} ともいう) :{{ruby|'''親鸞'''|しんらん}}が、ひらいた宗。親鸞は、法然の弟子である。 :親鸞の考えによると、功徳<ref>くとく。神仏からよい報いを与えられるような、よい行い。世のため、人のためになるよい行い。</ref>を積むことができずに煩悩<ref>ぼんのう。心身にまといつき心をかきみだす、一切の妄念・欲望。</ref>にとらわれた悪人こそ阿弥陀如来の救いにふさわしいと説いきました({{ruby|'''悪人正機説'''|あくにん しょうきせつ}} ) *時宗(じしゅう) :{{ruby|'''一遍'''|いっぺん}}が開きました。「踊り念仏」と言って、彼は念仏を唱えながら踊るということをしながら、諸国を歩き、教えを広めた。 **浄土宗・浄土真宗・時宗はどれも「南無阿弥陀仏」というお念仏を唱えることを重んじたことから三つをまとめて念仏宗ともいいます。 *{{ruby|日蓮宗|にちれんしゅう}}({{ruby|法華宗|ほっけしゅう}}ともいう) :{{ruby|'''日蓮'''|にちれん}}が開きました。{{ruby|法華経|ほけきょう}}というお経の教えを重んじ、「{{ruby|南無妙法蓮華経|なむ みょうほう れんげきょう}}<ref>「法華経に{{ruby|帰依|きえ}}します」という意味。</ref>」という「題目」を唱えることが救いへの道であると説きました。 *禅宗(ぜんしゅう) :'''臨済宗'''(りんざいしゅう)と'''曹洞宗'''(そうとうしゅう)が、あります。 :座禅(ざぜん)などの修行(しゅぎょう)により心を鍛え(きたえ)、悟り(さとり)を開く宗教です。この修行の考え方が武士の風習にあっており、武士に禅宗が好まれます。 :栄西(えいさい)および道元(どうげん)という人物が、宋に渡って学んできた教えをもとにした宗派です。 :・臨済宗 ::<big>栄西</big>(えいさい) が開きます。 ・曹洞宗 ::<big>道元</big>(どうげん) が開きます。 ---- <references /> == {{Ruby|室町|むろまち}}時代 == === 鎌倉幕府の滅亡 === [[ファイル:Emperor Godaigo.jpg|thumb|300px|後醍醐天皇。]] 後醍醐天皇(ごだいごてんのう)は、幕府を倒す計画をたてるが、1324年、計画がもれて失敗する。この1324年の事件を 正中の変(せいちゅうのへん) という。 (※  正中の変は、おぼえなくて良い) 1331年に、ふたたび幕府を倒そうと計画するが、また、計画がもれて失敗する。この1331年の事件を 元弘の変(げんこうのへん) という。 (※ 元弘の変は、おぼえなくて良い)後醍醐天皇は幕府に捉えられ、隠岐(おき)に島流し(しまながし)にされた。(島根県の、隠岐の島) 天皇は島流しになったが、幕府に不満のあった各地の武士や御家人たちは、天皇に味方して各地で兵をあげはじめた。 御家人でない武士の楠木正成(くすのきまさしげ)らが、幕府軍に抵抗した。また、悪党(あくとう)<ref><当時の「悪党」という言葉は、「強いもの」という意味です。</ref>という、幕府や荘園領主に従わない武装勢力が出てき始めて、幕府に逆らう勢力が増えた。 やがて後醍醐天皇が隠岐(おき)から脱出する。 [[ファイル:Ashikaga Takauji Jōdo-ji.jpg|thumb|300px|足利尊氏の肖像画]] 1333年、幕府の御家人であった <big>足利尊氏</big>(あしかがたかうじ) は幕府を裏切り、後醍醐天皇と協力し、京都の六波羅探題(ろくはらたんだい)を攻め落とした。 同1333年、関東では 新田義貞(にったよしさだ) が鎌倉を攻め落とし、鎌倉幕府は1333年に滅びました。 === 建武の新政 === 1333年、後醍醐天皇は京都にもどり、天皇による新しい政治を始めた。この年に年号を建武にかえたので、この後醍醐天皇による1333年からの新たな政治を<big>建武の新政</big>(けんむ の しんせい) という。 しかし武士に対する恩賞が少なく、また新しい制度が貴族に大きな権力を与えるものであったので、武士からの不満が大きかった。 === 南北朝の対立 === (なんぼくちょう) 建武の新政への不満から、1335年に足利尊氏が反乱を起こし京都を占領したので、たったの2年ほどで建武の新政は終わった。後醍醐天皇は奈良の吉野(よしの) に逃げます。 いっぽう足利尊氏は、京都で別の天皇の光明天皇(こうみょう てんのう)を立てます。 こうして、天皇が2人、できてしまいました。後醍醐天皇と光明天皇との、2人の天皇です。また朝廷が京都と奈良に、別々の2個の朝廷が出来てしまいました。 尊氏の味方の側である京都の朝廷を'''北朝'''(ほくちょう) といい、いっぽう後醍醐天皇の味方である奈良の吉野(よしの)の朝廷を'''南朝'''(なんちょう) と言います。ふたつの朝廷をあわせて南北朝(なんぼくちょう)といい、この時代を<big>南北朝時代</big>(なんぼくちょう じだい)といいます。 そして1338年には、その京都の北朝の光明天皇から征夷大将軍に足利尊氏が任命されます。こうして1338年、足利尊氏は京都を拠点にして新しく幕府を開きます。この1338年の幕府は、のちに'''室町幕府'''(むろまちばくふ)と言われます。 南北朝の対立は60年ほど続きます。 各地の武士は、北朝か南朝のどちらかについて争いました。しかし、しだいに北朝の側が有利になっていきます。 === 室町幕府のしくみ === 京都の中央組織では新しく管領(かんれい)が置かれた。この管領は、侍所(さむらいどころ)・政所(まんどころ)・問注所(もんちゅうじょ)などを管理する。 管領は有力な武士であった細川(ほそかわ)氏・山名(やまな)氏・畠山(はたけやま)氏の3氏から交代で選ばれた。 この管領の細川・山名・畠山の三氏の一族たちは、<big>三管領</big>(さんかんれい)とも、よばれます。 <div style="font-size:120%;"> <pre> (中央)  将軍━━━┳━━管領━━━┳━侍所      ┃       ┣━政所      ┃       ┗━問注所      ┃      ┃      ┃ (地方) ┗━━━━━━━┳━守護━━地頭              ┗━鎌倉府 </pre> </div> 室町時代や南北朝時代では、鎌倉時代よりも、各地の武士の影響力が強くなった。 地方の管理のため、鎌倉時代から守護(しゅご)という1国ごとにおかれて兵や警備などを管理する役職があったが、この守護の影響力が強くなる。 <big>守護</big>には、1国の年貢の半分を取り立てる権利が与えられた。地頭(じとう)は、守護の支配下に置かれた。 室町時代の守護の権限には,鎌倉時代よりも大きな権限が、幕府から与えられるようになった。 その結果、守護は、その管理する国を、領地として支配し治めるようになった。このような一国を支配するようになった守護を<big>守護大名</big>(しゅごだいみょう)という。 有力な守護大名には複数の国を支配する守護大名もいた。 有力な守護大名には、細川氏(ほそかわ し)・山名(やまな)氏・大内(おおうち)氏・赤松(あかまつ)氏などがいる。 守護とは別に、鎌倉には鎌倉府(かまくらふ)が置かれ,室町幕府による関東への支配の拠点になった。 === 足利義満 === [[ファイル:Yoshimitsu Ashikaga cropped.jpg|thumb|250px|足利義満(あしかが よしみつ)。]] 1392年の3代将軍の<big>足利義満</big>(あしかが よしみつ)のときに、幕府が政治を主導する形で、南朝を説得し従わせます。 義満は彼の住居を京都の <big>室町</big>(むろまち) につくらせ、その室町の住居が <big>花の御所</big>(はなのごしょ) といわれて、ここが幕府の拠点になった。この「室町」の名が、この「室町時代」や「室町幕府」の名前の由来である。 [[ファイル:Kinkaku3402CBcropped.jpg|thumb|300px|金閣。]] 義満は <big>金閣</big>(きんかく) という建物(たてもの)を、京都の北山(きたやま)に建てさせます。 義満のころの室町時代の文化を 北山文化(きたやまぶんか) と言います。 金閣は、金箔(きんぱく)が貼られた豪華な建物です。 ==== 明との貿易 ==== :(みん との ぼうえき) * 中国大陸の明(みん)との貿易へ 日本では室町時代の頃、いっぽう中国大陸では、モンゴル民族の元(げん)にかわって、漢民族の<big>明</big>(みん)が帝国を築いていた。 中国大陸では、1368年に漢民族の朱元璋(しゅ げんしょう)という人物が反乱をひきいて、モンゴル人の帝国である元をたおし、あたらしく明(みん)という漢民族の帝国を築いていたのです。(朱元璋は、まだ、おぼえなくて良い。) 朱元璋は皇帝となりの洪武帝(こうぶてい)になります。 3代皇帝の永楽帝(えいらくてい)の1400年ごろ、中国大陸沿岸では海賊(かいぞく)による被害があり、海賊の拠点は対馬(つしま)や壱岐(いき)などの九州や瀬戸内海であった。この対馬や壱岐を拠点にした室町時代の海賊を <big>倭寇</big>(わこう) という。なお、当時の倭寇は日本人および朝鮮人から、なる。 なお、元寇により、中国大陸との正式な貿易は途絶えていたが、九州を中心に武士や商人らは元寇のあとも勝手に貿易をしていた。 明は日本に対して外交として、倭寇の取り締まりと、正式な国交を日本に求めてきた。この明からの要求におうじ、倭寇の取り締まりをするとおもに、日本から外交の使者を1401年に明へと送ります。送られた使者は、僧の祖阿(そあ)と、博多商人の肥富(こいづみ)であり、彼らが明(みん)へと外交のために行って、日本と明との外交が進みます。 日本は、明との正式な貿易を1404年に始めます。 この明との貿易では、正式な貿易船と海賊船との区別をつけるため、<big>勘合</big>(かんごう)という合い札を用いられた。 <gallery widths="200px" heights="200px"> ファイル:Kangou honjiitigou left.svg|勘合のかたほう ファイル:Kangou honjiitigou right.svg|勘合のかたほう </gallery> 縦(たて)に一行、大きく数文字の文字が書かれた札を、文字の真ん中で2枚の札に分け、日本と明とが、その分けたうちの半分の札だけをもちます。正しい貿易相手どうしだと勘合の札を2枚あわせれば、もとの文字のもどるので、相手が正式な貿易船か海賊船かが確かめられる、という仕組みです。 このように勘合をもちいたので、室町時代の日本と明との貿易のことを <big>勘合貿易</big>(かんごうぼうえき) と言います。 この貿易によって、幕府は大きな収入源(しゅうにゅうげん)になりました。 当時、明は、自分たち明に貢物をおくるという朝貢(ちょうこう)をする外国のみと、明は貿易をする方針をとっていたので、この日本と明との貿易もそうです。日本が明へ朝貢して、おかえしに明が日本に物を与えてあげるという形式の貿易です。 このため、足利義満は、明から、「日本国王」(にほんこくおう)と認められます。中国語では「王」は(中国の)「皇帝」よりも地位がひくいです。 ==== 発展的事項 中国以外との貿易 ==== :* 朝鮮半島との貿易 :日本は同じころ、朝鮮とも貿易をはじめました。勘合とよく似た仕組みの 通信府(つうしんふ) を用いられ、通信符により正式な貿易船を確認しました。朝鮮半島に近い場所である対馬(つしま)を治める宗(そう)氏を仲介として日朝貿易が行われました。朝鮮には 倭館(わかん) という館がつくられ、外交のために日本から朝鮮に送られてきた使者をもてなし、また外交交渉するための建物がつくられた。 :* 琉球王国(りゅうきゅうおうこく)との貿易 :また、当時、沖縄には 琉球王国(りゅうきゅうおうこく) があり、琉球王国が周辺の国々との貿易をおこなっていたので、日本も琉球との貿易を1415年ごろに開始した。 :琉球の貿易相手は多くて、現在でいうフィリピンなどの東南アジアにある国々とも貿易をしていた。 :琉球の貿易では、中継貿易(ちゅうけいぼうえき)といって、明や日本などの国々との貿易の仲立ちとしての貿易の商売をしていた。 === 産業の発展と社会の変化 === ==== 産業の発展 ==== [[ファイル:Tukinami huuzoku taue.jpg|thumb|400px|left|室町時代の田植えの様子。 『月次風俗図屏風』(つきなみ ふうぞく ずびょうぶ)より。]] :(さんぎょう) 二毛作が各地に広まった。西日本だけでなく東日本にも二毛作が伝わっていきます。 手工業では、業種ごとに同業者どうしの <big>座</big>(ざ) という組合(くみあい)がつくられて、座は製造や販売を独占する権利が有力な寺社などから与えられた。 室町時代は、鎌倉時代よりも、ますます商業が発達した。たとえば定期市は、鎌倉時代は月3回の 三斎市(さんさいいち) だったが、室町時代には月6回の 六斎市(ろくさいいち) になった。 室町時代の産業では、運送業(うんそうぎょう)が発達します。商業や農業・工業が発達したので、商品をはこぶ必要がふえたからです。 この時代の陸上での運送業者は、馬を使って運送をすることがおおかったので、 <big>馬借</big>(ばしゃく) と言います。牛車ではこぶ場合は 車借(しゃしゃく) と言います。 商業には貨幣(かへい)が必要です。中国大陸の貨幣が使われました。明の銅銭である明銭(みんせん)を日本に輸入して、つかっていました。この明銭とあわせて、鎌倉時代に宋から輸入してつかっていた銅銭の宋銭(そうせん)も、つかわれました。 [[Image:Eiraku-Tsuho.jpg|thumb|永楽通宝|200px]] 明銭では永楽通宝(えいらくつうほう)が有名である。 他にも、倉庫などの保管業などを行っていたり輸送の管理をしたりする <big>問丸</big>(といまる) が出来ます。これが問屋(とんや)の起源です。 高利貸し(こうりがし)で金貸しをおこなう金融業者(きんゆうぎょうしゃ)が出てきます。土倉(どそう) や 酒屋(さかや) です。土層(どそう)とは今でいう質屋(しちや)のことで、客から品物をあずかるかわりに、客にお金を貸します。酒屋は、文字どおりにお酒もつくっていましたが、金貸しも行っていました。 いろんな産業が出てきて、名前をおぼえるのが大変ですが、名前だけでなく現代の産業とも関連づけて、学んでください。 ==== 農村の自治 ==== 室町時代には、農村の自治が、前の時代よりも強くなります。この自治が強くなった理由のひとつは産業の発達とも関連しています。 色々な村で、用水路や共用地の管理など村の運営(うんえい)のしかたについて、寺社などに集まって自主的に相談しあって決めるという <big>寄合</big>(よりあい) という集まりが開かれるようになります。 このような主体的な村を<big>惣</big>(そう)または <big>惣村</big>(そうそん) という。 このような惣は、産業が発達していた近畿地方から始まり、しだいに地方へも広がっていった。 ==== 一揆(いっき) ==== 室町時代には、農民は、厳しい領主に対しては、集団で対立するようになる。 年貢が重い場合は、集団で領主に押しかけて(おしかけて)訴えでる(うったえでる)という強訴(ごうそ)をしたり、訴え(うったえ)がききいれられない場合は、全員が村から逃亡して村に人がいなくなってしまう逃散(ちょうさん)などで、対抗しました。 * 土一揆(どいっき) 農民や馬借などは、あまり裕福ではなく、これらの貧しい職業の民は、当時は 土民(どみん) と言われていた。 この土民たちが集団で実力行使にでることを 土一揆(どいっき) という。 室町時代には、貨幣による経済がすすんできたので、生活苦の農民などは借金をする必要が生じました。そのため、借金のふくらむ農民などが多くなり、たびたび借金帳消しの徳政をもとめて高利貸しなどをおそって借金の証文(しょうもん)を焼きすてる土一揆が、よくおきた。 このような一揆のきっかけが、次にいう <big>正長の土一揆</big>(しょうちょう の どいっき) である。 * <big>正長の土一揆</big>(しょうちょう の どいっき) 近江国(おうみのくに、滋賀県のこと)の貧しい馬借(ばしゃく)たち運送業者が、京都で高利貸しをしている酒屋や土倉をおそい、幕府に徳政を要求した一揆である。 当初、幕府は徳政の求めには応じなかったので、一揆の民衆は借金の証文(しょうもん)を焼き捨てたり質物をうばうなど、実力行使(じつりょくこうし)に出た。 === 応仁の乱 === :(おうにん の らん) {| class="wikitable" style="float:right" |+  応仁の乱 !   !!  細川方(東軍)  !!  山名方(西軍)  |- ! 主導者 |  細川勝元(管領)  ||  山名持豊  |- ! 将軍家<br />(将軍は義政) |  足利義視(義政の弟)  ||  日野富子 <br /> 足利義尚(義政の子)  |- |} 8代目将軍の<big>足利義政</big>(あしかが よしまさ)のころ、有力な守護大名のあいだで争いがあり、細川勝元(ほそかわかつもと)と山名持豊(やまなもちとよ)とで幕府の実権を争っていた。 これがもとで、1467年に戦争がおき、全国の守護大名たちは、細川方(ほそかわがた)の東軍(とうぐん)か、または山名方(やまながた)の西軍(せいぐん)との、東西に分かれて争うことになった。 これが <big>応仁の乱</big>(おうにん の らん) である。乱は京都を中心にしていて、11年ほど乱が続く。 このように細川や山名などの守護大名が権力を持つようになった、そもそものきっかけは、義政が、あまり政治の実務には関心を持たなかった、という事情(じじょう)がある。 なお、戦争の起きたほかの要因としては、将軍の跡継ぎ(あとつぎ)をめぐる問題がある。次の将軍の候補(こうほ)に、足利義政の弟の足利義視(あしかが よしみ)と、それに対立して義政の妻の日野富子(ひの とみこ)が子の足利義尚(あしかがよしひさ)を跡継ぎ(あとつぎ)に推した(おした)ことで、跡継ぎ争いが加わった。 義視(よしみ)は細川氏をたより、義尚(よしひさ)は山名をたよった。 さらに、これにくわえて、有力な守護大名である畠山(はたけやま)氏の一族のあいだでも、争いが起こる。 このような、細川・山名の争いを中心に、他の権力闘争(けんりょくとうそう)が応仁の乱に加わっていた。 ==== 応仁の乱の結果 ==== [[ファイル:Shinnyodō engi, vol.3 (part).jpg|thumb|left|400px|応仁(おうにん)の乱。 <big>足軽</big>(あしがる)と呼ばれる身軽な兵が活躍した。『真如堂縁起絵巻』(しんにょどう えんぎ えまき)。『真如堂縁起絵巻』は重要文化財。]] 京都は戦火で焼け野原になる。じっさいに、そのような戦火の焼け野原の光景を歌った和歌が残っている。 :なれや知る 都は野辺の夕雲雀 あがるを見ても 落つる涙は (なれやしる みやこはのべの ゆうひばり あがるをみても おつるなみだは) (※ 和歌の文は、おぼえなくてもいいですが、応仁の乱の情景を歌った大切な歌なので、知っておいて下さい。) こうして、室町幕府の勢い(いきおい)は、衰えて(おとろえて)いった。 裕福な貴族や商人などは京都から逃げ、戦火の無い地方に、貴族などは移り住むようになりました。そして、京都の文化が、地方に移り住んだものたちによって、地方へと伝わっていきました。 === 東山文化 === [[ファイル:Ginkaku-ji after being restored in 2008.jpg|thumb|200px|銀閣(東正面)]] 義政が京都の東山(ひがしやま)に '''銀閣'''<ref>銀閣には銀箔(ぎんぱく)は、はられていません。なぜ「銀閣」とよばれるのかはいろいろな説があります。</ref>(ぎんかく) を建てました。 この義政の時代のころの文化を <big>東山文化</big>(ひがしやま ぶんか) という。 * 書院造(しょいんづくり) [[ファイル:Takagike Kashihara JPN 001.jpg|thumb|400px|書院造(しょいんづくり)]] :※ 書院造の見やすい画像が無いので、ウィキペディア日本語版や外部サイトなどで書院造りの画像を見て下さい。 書院造(しょいんづくり)という、建築様式の室内の様式が出てくる。 特徴は、 :違い棚(ちがいだな)という、棚が段差になった棚がある。 :障子や、ふすま、がある。 :畳(たたみ)の床(ゆか) など。 これが、今日の和室(わしつ)の様式に、つながっていく。 代表的な例として<big>東求堂同仁斎</big>(とうぐどうどうじんさい)の部屋が、書院造の部屋で有名である。 * 水墨画 [[ファイル:SesshuToyo.jpg|left|thumb|180px|水墨画。秋冬山水図のうち秋景(東京国立博物館)]] [[ファイル:Portrait of Sesshu.jpg|thumb|220px|雪舟自画像(模本) 、重要文化財、藤田美術館]] 中国大陸から <big>水墨画</big>(すいぼくが)が日本に伝わる。<big>雪舟</big>(せっしゅう)などの水墨画の画家がでてくる。水墨画のことを墨絵(すみえ)ともいう。 べつに雪舟が始めたわけでなく、すでに義満の北山文化のころから如拙(じょせつ)や周文(しゅうぶん)らが水墨画をしていた。 * 茶の湯 書院造の部屋で、おちついた作法にしたがって茶を飲む、<big>茶の湯</big>(ちゃのゆ)が始まる。茶の湯は、今(2014年に執筆。)でも茶道(さどう)として、受け継がれている。 * 御伽草子(おとぎそうし) 御伽草子(おとぎそうし)が民衆の間で流行した。 『浦島太郎』(うらしまたろう)や『一寸法師』(いっすんぼうし)などがある。 ===戦国時代の始まり=== 地方の守護大名の勢い(いきおい)も、衰えて(おとろえて)いった。応仁の乱で、守護大名が京都に出向いて兵を指揮していたころ、国もとに残っていた家臣らが実権をにぎるというということが起きた。さらに、領地をめぐって争うことも起きた。その結果、したの身分だった者が、上の身分の勢力を倒すこともあった。このように、下の身分のものが上の身分のものを倒し、のしあがる事や、その風潮(ふうちょう)を、<big>下克上</big>(げこくじょう)という。 戦乱は地方へも広がっていき、後に<big>戦国時代</big>(せんごくじだい)とよばれる戦乱の時代に入っていきます。 戦国時代には、地方の各国の最高権力者は、大名(だいみょう)であった。戦国時代の大名を戦国大名という。戦国大名の多くは、もとは守護大名でなかった者が、下克上によって大名になっていった例が多い。大名のなかには、守護大名から、そのまま戦国大名になったものもいる。 戦国大名どうしも、領地の拡大などを目指して戦ったため、戦乱はつづき、100年ほど戦乱(せんらん)の時代が続く。 強い軍を作り、領地内をまとめるために、戦乱の時代に対応した、独自の法律を作りました。これを '''分国法'''(ぶんこくほう)といいます。 [[ファイル:Takeda Harunobu.jpg|thumb|300px|武田信玄(たけだ しんげん)。(1521〜1573) 守護大名の一族の出身。甲斐の戦国大名。]] たとえば戦国時代の大名の武田信玄(たけだしんげん)は、『甲州法度次第』(こうしゅうはっとのしだい)という分国法を1547年に作った。主な内容は次のとおりです。 :「武田信玄の許可なく同盟を結ぶことを禁止する」 :「他国に勝手に手紙を出してはならない」 他にも今川(いまがわ)氏の『今川仮名目録』(いまがわ かなもくろく)などの分国法がある。 分国法の内容は国によって違う(ちがう)が、多くの国の分国法では、勝手に他国と連絡をとることを禁止したりして、部下の裏切り(うらぎり)をふせぐための決まりや、部下どうしがあらそったばあいは両方とも罰することで領内を団結させるための決まりが多い。 部下どうしの争いを両方とも処罰することを <big>喧嘩両成敗</big>(けんか りょうせいばい) という。 大名の多くは家来を自分の城の近くに住まわせた。このため、城の近くに街が出来た。こうして <big>城下町</big>(じょうかまち) ができた。 <div style="border:1px solid #000000;"> :今川氏の分国法 ::一. 今川家の家臣(かしん)は、勝手に他国から嫁(よめ)をもらったり、あるいは婿(むこ)に取ったり、あるいは他国に嫁を出すことは、今後は禁止する。 :『今川仮名目録』(いまがわ かなもくろく) </div> <br /> <div style="border:1px solid #000000;"> :武田氏の分国法 ::一. 武田信玄の許可なく同盟を結ぶことを禁止する。 ::一. 他国に勝手に手紙や贈り物(おくりもの)を出してはならない。 などのような内容が書かれている。 ::一. 喧嘩(けんか)をしたものは、どちらが良いか悪いかに関わらず、いかなる理由でも、両方とも処罰する。ただし、相手から喧嘩を仕掛けられても、こらえた者は処罰しない。 ::一. 主君から、もらった土地は、勝手に売買してはならない。やむをえず売買する場合は理由を申し出ること。 :『甲州法度次第』(こうしゅう はっと の しだい) </div> <gallery widths="200px" heights="200px"> ファイル:Uesugi Kenshin.jpg|上杉謙信(うえすぎ けんしん)。(1530〜1578)。越後(えちご、今の新潟県)の戦国大名。武田信玄とはライバル的な関係にあり、<big>川中島の戦い</big>(かわなかじま の たたかい)で、何度も、あらそった。 ファイル:Soun Hojo portrait.jpg|北条早雲(ほうじょう そううん)。(1432〜1519) 相模(さがみ)の戦国大名。 ファイル:Saitō Dōsan.jpg|斎藤道三(さいとう どうざん)。(?〜1556)。美濃(みの、今の長野県)の戦国大名になった。もとは油売りの商人だったといわれ、下克上の代表的な人物とされています。 ファイル:Mori Motonari3.jpg|毛利元就(もうり もとなり)。(1497〜1571)。安芸(あき、今の広島県)の戦国大名。「三本の矢」(さんぼんのや)のエピソードで有名。 ファイル:Otomo Sorin.jpg|大友宗麟(おおとも そうりん)。豊後(ぶんご、今の大分県)の戦国大名。 守護大名の出身。のちに西洋との貿易のため、キリスト教徒になった。 ファイル:Shimazu Takahisa.jpg|島津 貴久(しまづ たかひさ)。 薩摩(さつま、今の鹿児島)の戦国大名。守護大名の一族の出身。 </gallery> [[ファイル:Sengoku period 1540.png|thumb|500px|1540年]] {{clear}} ---- <references /> == {{Ruby|戦国|せんごく}}時代({{Ruby|安土桃山|あづちももやま}}時代) == === 鉄砲とキリスト教の伝来 === [[ファイル:Arquebus.jpg|thumb|right|300px|種子島火縄銃(2005年日本国際博覧会|愛知万博のポルトガル館展示物)]] 戦国時代の16世紀の1543年に、九州の今でいう鹿児島県の島である種子島(たねがしま)に、ポルトガル人を乘せた中国大陸の船が流れ着く。 このとき、ポルトガル人から<big>鉄砲</big>(てっぽう)が日本に伝わる。当時の鉄砲の仕組みは、火縄銃(ひなわじゅう)という仕組みである。それまでの日本には鉄砲は知られていなく、新兵器であった。 種子島(たねがしま)の領主の種子島時尭(たねがしま ときたか)は、ポルトガル人から大金を払って鉄砲を買い入れ、部下にその仕組みと製造法を学ばせた。 時尭はヨーロッパ人の鉄砲の威力を見て感心し、即座に2000両の大金を支払い2丁の鉄砲を購入したという。 やがて日本の各地に鉄砲の情報が広がる。堺(さかい、大阪府にある)や国友(くにとも、滋賀県にある)で、大量に鉄砲が作られるようになった。 この時代のころ、ヨーロッパでは、海路での貿易が、さかんであった。なぜなら15世紀に入ってから西アジアではトルコ系のオスマン帝国が成長し、ヨーロッパは貿易ルートをオスマン帝国にさえぎられるようになっていた。このため陸路(りくろ)をさけた貿易が、さかんになった。 鉄砲の伝来は戦いの仕方を、大きく変えた。 :馬にのって戦う騎兵(きへい)の戦闘から、足軽(あしがる)などの歩兵の集団に鉄砲を持たせて戦う集団戦法に変った。 :城の城壁は、鉄砲の弾(たま)を防ぐため、強固になっていった。 :戦争の勝負が、早く決まるようになった。 また、キリスト教が日本に伝わった。 [[ファイル:Franciscus de Xabier.jpg|thumb|250px|フランシスコ・ザビエル。]] 1549年にはスペイン人の宣教師(せんきょうし)である<big>フランシスコ=ザビエル</big>が日本の鹿児島に来て、<big>キリスト教</big>を伝えた。 そのあと、他の宣教師も、次々と日本にやってきた。たとえばルイス・フロイスなどの宣教師である。 宣教師は貿易の世話もしたので、大名たちの中にはキリスト教を保護する者が、西日本に多くいた。とくに、キリスト教の信者になった大名を <big>キリシタン大名</big>(キリシタンだいみょう) という。 当時の日本では、キリスト教徒のことを <big>キリシタン</big> と呼んでいた。 === 南蛮貿易 === このようなことをきっかけに、日本とポルトガルとの貿易が始まり、やがてスペインも日本との貿易を始め、ポルトガル人・スペイン人の商船が、九州の長崎や平戸(ひらど)や、大阪の堺(さかい)の港などを訪れ、貿易をするようになった。 日本への輸入品は、中国の生糸や絹織物など、中国産の物品が中心だった。ヨーロッパの鉄砲、火薬、毛織物、時計、ガラス製品、南方の香料なども、日本に輸入され、伝えられていった。日本からの輸出品は、銀や刀剣だった。当時の日本では銀山の開発が進んでいたのでおり、世界市場に影響を与えるほどの産出量・輸出量だった。 当時の日本人がヨーロッパ人を<big>「南蛮人」</big>(なんばんじん)と読んだので、日本によるヨーロッパとの貿易を<big>南蛮貿易</big>(なんばん ぼうえき)という。 === 天下統一へ === 〜<big>織田信長・豊臣秀吉・徳川家康</big>〜<br> :(おだのぶなが・とよとみひでよし・とくがわいえやす) * 桶狭間の戦い(おけはざま の たたかい) [[ファイル:Oda-Nobunaga.jpg|250px|thumb|織田信長(おだ のぶなが)]] [[ファイル:Sengoku period 1565.png|thumb|500px|1565年]] 戦国時代には各地に大名がおり、多くの大名どうしが争っていた。1560年以降から、まず、尾張(おわり、愛知県にある)の <big>織田信長</big>(おだ のぶなが) が勢力を伸ばし始める。きっかけは、1560年に、<big>桶狭間の戦い</big>(おけはざま の たたかい)で駿河(するが)の大名である今川義元(いまがわ よしもと)の軍に尾張が攻めこまれたが、今川義元を織田らの軍が討ち取り、今川義元は死亡する。このため、今川軍は負ける。 桶狭間の戦い以降、信長は西へと勢力を伸ばしていく。1568年には、足利義昭(あしかが よしあき)を支援して京都に入り、義昭が室町幕府の第15代将軍になります。しかし、信長と足利義昭はやがて対立するようになります。そして、義昭の呼びかけに応じて、さまざまな勢力が信長と戦うようになります。最初は信長も苦しい戦いを強いられていましたが、各勢力を個別に倒していきます。そして、1573年に義昭は京都から追放され、室町幕府は滅びました。 1569年、キリスト教の宣教師のルイス・フロイスと初めて出会い、彼にキリスト教の布教を許可します。信長本人はキリスト教の信者ではなく、信長の狙いは宣教師のもたらす情報などが狙いだとか、あるいは当時に信長と敵対していた仏教勢力への対策などと、言われています。 * 長篠の戦い [[ファイル:Battle-of-Nagashino-Map-Folding-Screen-1575.png|500px|thumb|長篠の戦い。左側が織田・徳川の連合軍。右側が武田軍。]] 1575年に織田・徳川の同盟と、対する敵は、甲斐(かい)の大名の武田勝頼(たけだ かつより)らの戦争である <big>長篠の戦い</big>(ながしののたたかい) が三河(みかわ)で起きる。この戦いでは、織田・徳川らの鉄砲隊の活躍により、織田が勝ち、武田は負ける。 武田の戦法は騎馬兵による従来の戦法であった。 * 安土城(あづちじょう) 1576年、近江(おうみ、滋賀県)に城を築かせ(きずかせ)、天守(てんしゅ)を持つ '''安土城'''(あづちじょう) を築かせる。 安土城の城下町では、次に説明する楽市楽座(らくいち らくざ)などの新しい政策が行われた。 * 楽市楽座(らくいち らくざ) 商業をさかんにするため、関所(せきしょ)で通行税(つうこうぜい)をとることを廃止(はいし)した。 一般に商人は、利益をだすために、費用をあまり払いたくないので、そのため税のひくい場所で商売をしたがります。 また、各産業の同業者組合である座(ざ)の独占権を廃止し、だれでも商売が始められるようにします。このように座の独占権を廃止したことを 「楽座」(らくざ) と言います。 そして、商業を活発にするための信長による一連の規制(きせい)の撤廃(てっぱい)などの商業の振興策(しんこうさく)を、<big>楽市楽座</big>(らくいち らくざ)といいます。 ==== 本能寺の変 ==== [[ファイル:Sengoku period 1582.png|thumb|400px|1582年]] 1582年、中国地方へと勢力をひろめるため、織田軍は秀吉などに命じて、中国地方の大名の毛利と戦争をしていました。信長はこれを支援するため中国地方に向かう途中、京都の本能寺に泊まって(とまって)ました。 このとき、家臣の<big>明智光秀</big>(あけち みつひで)が反逆をして、この本能寺で信長および信長の子の織田信忠(おだ のぶただ)たちは死亡します。 この1582年の本能寺での一連の事件が<big>本能寺の変</big>(ほんのうじのへん) です。 :( 語呂合わせ:いちごパンツ(1582)の信長 本能寺(ほんのうじ)で、没す(ぼっす) ) もちろん、当時にはパンツなんてありませんので、実際には、いちごパンツなんて、はいていません。語呂合わせのためのジョークです。 === 羽柴秀吉の台頭(たいとう) === [[ファイル:Toyotomi_Hideyoshi_c1598_Kodai-ji_Temple.png|thumb|300px|豊臣秀吉。]] 信長の死を聞いた羽柴秀吉は、ただちに毛利との停戦をし、そして京都・大阪に向かい 山崎の戦い(やまざき の たたかい) で明智光秀を倒します。 その後、信長の家来だった柴田勝家と戦い、賤ヶ岳の戦い(しずがたけのたたかい)で秀吉軍は柴田軍を倒します。 このようにして、しだいに秀吉の地位は高まっていき、信長の領地を受け継いでいきます。 1583年に秀吉は、大阪にあった石山本願寺(いしやまほんがんじ)の跡地(あとち)に<big>大阪城</big>(おおさかじょう)を築かせ、この大阪城を本拠地(ほんきょち)にした。 そのあと、秀吉は各地の大名たちを平定し従えていきます。 1685年、羽柴秀吉は朝廷から <big>関白</big>(かんぱく) の称号を、もらいます。 1586年、羽柴秀吉は朝廷から<big>豊臣</big>(とよとみ)の姓(せい)をもらい、'''豊臣秀吉'''(とよとみ(の) ひでよし)と名乗る許可を得ます。 そして1590年には、秀吉に従わなかった北条(ほうじょう)氏の治める関東の小田原(おだわら)を攻め、北条氏政(ほうじょううじまさ)を滅ぼします。 同1590年、秀吉に従っていなかった東北の伊達(だて)氏など東北の大名は、秀吉にしたがい、これで'''秀吉が天下統一をなした'''。 === 秀吉の政策 === * 太閤検地(たいこうけんち) 農民から年貢を取るための土地の調査を<big>検地</big>(けんち)という。 検地は信長の時代からも行われていたが、秀吉は各地でちがっていた長さや面積などの単位を全国で統一させた。年貢をおさめる枡(ます)も全国で統一させた。マスの基準(きじゅん)は、京都で使われていた京枡(きょうます)が全国の基準の枡になった。 そして記録によって、田畑の面積や、田の収穫高である<big>石高</big>(こくだか)、その田畑を耕す農民の名前などが記録される 検地帳(けんちちょう) が作られた。 検地帳によって耕作者が、はっきりしたので、農民は田畑を持つ権利を認められたが、同時に年貢(ねんぐ)をおさめる義務をおうことになり、土地を勝手に離れる(はなれる)ことができなくなった。 また、これで、かつての荘園のように土地の権利がはっきりしない土地がなくなった。 * <big>刀狩</big>(かたながり) 1588年に農民から刀や鉄砲などの武器を没収する命令の<big>刀狩令</big>(かたながりれい)をだします。名目は大仏を京都の方広寺(ほうこうじ)に作るので材料の鉄が必要なため、という名目です。秀吉の狙いは、一揆(いっき)を防ぐため、というのが現代(2014年に記述)での一般的な考えです。 * 兵農分離 このような検地や刀狩の結果、農民と武士との中間的な立場の人間がいなくなり、農民と武士との身分のちがいが、はっきりとしました。このようなことを兵農分離(へいのう ぶんり)といいます。 *キリスト教の禁止 豊臣秀吉は、キリスト教を禁止します。 1587年にキリスト教の宣教師(せんきょうし)を日本の外へ追放(ついほう)する<big>バテレン追放令</big>(バテレンついほうれい) を出します。バテレンとは、ポルトガル語で神父を意味する パードレ padre が由来の言葉。 (※ ポルトガル語表記「padre」は、おぼえなくてよい。) しかし南蛮貿易は許可していたこともあり、取り締まりの効果は不十分だった。 秀吉は、はじめのうちは南蛮貿易を保護していたので、キリスト教の布教を許していましたが、考えを変えたわけです。では、なぜ考えを変えたのでしょうか。 一般に言われているのは、キリシタン大名の大村純正が長崎をキリスト教に寄付し、長崎がキリスト教の領地になっていることを、九州の平定の際に知った秀吉が、キリスト教は天下統一のさまたげになるだろうと考えたから、と言われています。 === 朝鮮出兵 === 国内を統一した秀吉は、つぎに、外国を征服(せいふく)しようとした。そのため、中国大陸、当時は明(みん)という国を征服しようとした。このための足がかりとして、まず朝鮮(ちょうせん)に通行の許可(きょか)や協力などをもとめたが、朝鮮に断られたため、朝鮮との戦争になり、2度にわたって朝鮮に兵をおくって戦争をした。 この戦争を日本の呼び方で、<big>朝鮮出兵</big>(ちょうせん しゅっぺい) とか <big>朝鮮侵略</big>(ちょうせん しんりゃく)と いいます。 なぜ秀吉が明への侵略戦争を考えたはじめたかについては、学者でも、まだ理由が解明されていません。仮説(かせつ)は多くありますが、学者の研究途中です。 秀吉の朝鮮出兵は2度、ありますが、最初の1回目の出兵は1592年にあり 文禄の役(ぶんろくのえき) と言い、2回目の出兵は1597年にあり 慶長の役(けいちょうのえき) と言います。 2つの出兵とも、最終的に日本は朝鮮の撃破(げきは)に失敗します。 [[image:TurtleShip1795.jpg|thumb|left|250px|『行録』などの記述をそのまま絵にしたもので、亀甲船の'''想像図'''。少なくとも18世紀以後に描かれたものであり、史料価値はほとんどない。]] 1回目の朝鮮出兵である文禄の役 では、朝鮮の各地や海上で日本軍は朝鮮軍と戦いましたが、朝鮮の軍人である李舜臣(日本語よみ :り しゅんしん、  韓国語よみ :イ スンシン)がひきいる水軍に、日本は苦戦しました。また明からの援軍が朝鮮に協力したので、日本の戦況は不利になっていきました。 朝鮮の民衆も朝鮮軍に協力したが、このため、朝鮮軍だけでなく朝鮮の民衆も戦争に巻き込まれた。 [[ファイル:Mimizuka2.jpg|thumb|240px|京都にある耳塚(鼻塚)。朝鮮出兵で切り取られた耳や鼻を供養(くよう)している。]] 2回目の出兵では、秀吉は、部下に手柄を証明させるために、敵の耳や鼻を切り取って送ってこい、という命令をだします。 このため日本に多くの朝鮮人・民国人の耳や鼻が送られてきます。 戦国時代では、手柄をしめすために敵の将の首を切り取り送るのが一般だったのです。階級の低い敵兵の場合には首ではなく鼻などを切り取っていました。 1598年に日本国内で秀吉が病死し、朝鮮出兵は終わります。 * 朝鮮出兵の結果 **日本の諸大名などからの豊臣氏への信用が弱まり、のちに、豊臣氏が没落していくキッカケの一つになる。 **朝鮮に、大きな被害を与えた。 **戦争で消耗した明(みん)の力も弱まる。 **朝鮮の陶磁器(とうき)の文化が日本に伝わる。朝鮮人の捕虜が日本に連行されたり、物品の略奪などを通して。佐賀県の有田焼(ありたやき)、鹿児島県の薩摩焼(さつまやき)、山口県の萩焼(はぎやき)など。今では、その地方の特産品の一つになっている。 **朝鮮の活字(かつじ)技術が日本に伝わる。 {| class="wikitable" style="float:right" |+ 信長・秀吉・家康の時代 | 織田信長 <br>[[ファイル:Odanobunaga face.png|150px|織田信長の顔。]]|| 豊臣秀吉 <br>[[ファイル:Toyotomi hideyoshi face.png|150px|豊臣秀吉の顔。]]|| 徳川家康 <br>[[ファイル:Tokugawa Ieyasu2 face.png|150px|徳川家康の顔。]] |- | 1534 尾張の大名の子として生まれる || 1537 尾張に農民の子として生まれる || 1542 三河の大名の子として生まれる |- | 1560 今川氏を破る || || |- | 1562 家康と連合する || || 1562 信長と連合する |- | 1573年 足利氏を京都から追い出す<br />(室町幕府をほろぼす) || || |- | style="text-align: left;" colspan="3" | 1575 '''長篠の戦い''' (信長と家康の連合軍が、武田の軍をたおす) |- | 1576 安土城を築く || || |- | 1580 石山本願寺を倒し、<br />一向一揆に勝利する || || |- | 1582 本能寺の変で明智光秀におそわれ、<br />信長は自害する || 1582 明智光秀をたおす || |- | || 1583 大阪城を築く || |- | || 1585 関白になる || |- | || 1588 '''刀狩り'''を命じる || |- | || 1590 日本を統一する || 1590 秀吉の命令で、関東に領地をうつす |- | || 1592 朝鮮をせめる || |- | || 1597 ふたたび朝鮮をせめる || |- | || 1598 病死する || |- | || || 1600 関ヶ原の戦いで勝つ |- | || || 1603 征夷大将軍になり、'''江戸幕府'''をひらく |- | || || 1615 豊臣氏をほろぼす |- | || || 1618 病死する |- |} {{clear}} === 安土・桃山文化 === 信長が生きてて影響力の強かったころの安土文化(あづち ぶんか)と言います。信長が安土城を建てさせたころの文化だからです。秀吉の時代の文化を桃山文化(ももやま ぶんか)と言います。 安土文化と桃山文化を合わせて安土桃山文化(あづちももやま ぶんか)と言います。 * 茶道(さどう) [[Image:Sen no Rikyu JPN.jpg|200px|thumb|千利休<br>(画:長谷川等伯)]] 室町時代に生まれた茶の湯は、<big>千利休</big>(せんの りきゅう)により、茶道(さどう)へと発展した。 織田信長のころから、めずらしい茶器(ちゃき)が好まれるようになった。朝鮮出兵のときに陶工を捕虜として連行した理由の一つには、このようなことがある。 * 絵画 [[Image:Kano Eitoku 002.jpg|330px|thumb|left|『唐獅子図屏風』(からじし ずびょうぶ)、狩野永徳。]] ふすま絵や屏風絵(びょうぶえ)が発達した。<big>狩野永徳</big>(かのう えいとく) や 狩野山楽(かのう さんらく) などの 狩野派(かのうは) の画家が活躍した。ふすま絵や屏風絵(びょうぶえ)を合わせて障壁画(しょうへきが)という。 狩野永徳の作品の『唐獅子図屏風』(からじし ずびょうぶ)が有名。 ほかの派の画家では、長谷川等伯(はせがわ とうはく)が有名。 {{clear}} [[ファイル:洛中洛外図左.jpg|thumb|center|700px|『洛中洛外図』(らくちゅうらくがいず)。狩野永徳の作品と、されている。]] [[ファイル:Kanō Eitoku - Rakuchū rakugai zu (Uesugi) - right screen.jpg|thumb|left|700px|この洛中洛外図には、祇園祭り(ぎおん まつり)のようすが、えがかれている。(まんなかのほうに、祇園まつりのようすが、かかれている。)]] [[ファイル:Kyoto Gion Matsuri J09 060.jpg|300px|right|thumb|現在の京都の 祇園(ぎおん)まつり]] {{clear}} * 南蛮文化 南蛮貿易により、ヨーロッパの医学・天文学・印刷技術が日本に伝わる。 食べ物のパン(pão、パアオ)やカステラ(pão de castela)、カボチャ、また、衣服のカッパ、カードのカルタ(cartas、カールタス)、食べ物のテンプラが日本に伝わる。 (※ ポルトガル語表記は、おぼえなくてよい。「pão」や「carta」などは、おぼえなくてよい。) 「カステラ」の由来は、有力な説はポルトガル語でCastelaがスペインのカスティーリャ地方のことだが、カスティーリャ地方のパンケーキという意味でカステラが日本に伝わって、日本語の「カステラ」になったという。 (※ ポルトガル語表記は、おぼえなくてよい。) * 芸能 浄瑠璃(じょうるり)と歌舞伎(かぶき) :* 浄瑠璃(じょうるり) :民衆のあいだで、三味線の音色に合わせて、人が物語をかたるのを見て楽しむ浄瑠璃(じょうるり)が流行る。この浄瑠璃は、さらに発展し、人の代わりに人形を使う人形浄瑠璃(にんぎょうじょうるり)へと発展した。 :* 歌舞伎(かぶき) :「出雲(いづも)の阿国(おくに)」という女が始めた歌舞伎踊りが人気(にんき)になる。出雲とは、今でいう島根県。 == {{Ruby|江戸|えど}}時代 == [[ファイル:Tokugawa Ieyasu2 full.JPG|thumb|300px|徳川家康]] === 江戸時代の始まり === 豊臣秀吉が死ぬと、息子の豊臣秀頼が跡を継ぎました。しかし、秀頼はまだ幼かったため、秀吉にしたがっていた大名の一人の'''徳川家康'''のいきおいが強まりました。そのため、秀吉の重臣の'''石田三成'''などとの対立が起きました。両者の対立は深まり、1600年、家康と三成の軍勢が{{ruby|関ヶ原|せきがはら}}(岐阜県)で戦いました。この戦いを'''関ケ原の戦い'''といいます。この戦いに家康が勝ち、徳川家の力はますます強くなりました。 1603年、家康は征夷大将軍に任命され、拠点としていた江戸に幕府を開きました。これが'''江戸幕府'''であり、この時から江戸時代が始まります。 1614年、 家康は大坂城へ攻め込みました(大坂冬の陣)。1615年、大坂城が攻め滅ぼされ、豊臣秀頼は自害して豊臣氏は滅亡しました(大坂夏の陣)。こうして、徳川家に対抗する勢力はなくなりました。 [[ファイル:NikkoYomeimon5005.jpg|thumb|日光東照宮の陽明門。日光東照宮は、3代将軍家光によって建造が命令され、家康をまつっている。世界文化遺産、および、国宝。]] === 江戸時代初期の政治 === ==== 武士の統制 ==== 江戸幕府では、領地の石高が1万石以上の武士を大名と呼びました。1万石に満たない武士で徳川家に直接つかえるものは、旗本と御家人に分けられました。旗本は直接将軍に会うことができ、幕府の高級官僚や武官に任ぜられました。御家人は直接将軍に会うことはできず、下級役人の職に就きました。 大名の支配する領地は{{ruby|藩|はん}}とよばれました。徳川家の親族の大名や、関ヶ原の戦いよりも前に古くから徳川に仕えていた大名は重要な地域や江戸の近くへと配置されました。いっぽう、関ヶ原の戦いのあとに徳川に仕えた大名は、中国・四国や東北など、江戸から遠いところに配置されました。 {| class="wikitable" style="float:right" |- ! 大名の種類 !! 説明 |- | 親藩 || 徳川家の親族の大名。江戸の近くや重要地点に配置されました。<br>特に尾張(愛知県西部)、紀伊(和歌山県の大半)、水戸(茨城県)は御三家とよばれ、<br>尾張と紀伊からは将軍に後継ぎがいなかった場合に、次の将軍を出す資格がありました。 |- | {{ruby|譜代|ふだい}} || 関ヶ原の戦いよりも前の古くから徳川に仕えていた大名。<br>譜代は、江戸の近くや重要地点に配置されました。<br>また、老中などの幕府の重役に就任することもできました。<br>代表的な大名は、彦根(滋賀県南部)の井伊家、酒田(山形県北西部)の酒井家など。 |- | {{ruby|外様|とざま}} || 関ヶ原の戦いのあとに徳川に仕えた大名。<br>九州や四国や東北などに多く、大きな領地をもつ大名も多い。<br>加賀(石川県)の前田家、薩摩(鹿児島県)の島津家、仙台の{{ruby|伊達|だて}}家など。 |} 1615年、大名を取り締まるための法が作られました。これを{{ruby|武家諸法度|ぶけしょはっと}}といいます。この法に違反すると、領地の没収などの厳しい処分をうけました。また、それぞれの藩の大名の本拠以外の城を全て破壊させ、大名の居城を一つにかぎらせるという命令もくだされました(一国一城令)。 {| class="wikitable" |- ! 武家諸法度(元和令抜粋・現代語訳) |- |一 武芸にひたすらはげむようにしなさい。 一 諸国の城はたとえ修理であっても幕府に報告せよ。ましてや、新しく城をつくることは厳しく禁止する。 一 幕府の許可なく結婚してはならない。 |} [[ファイル:Iemitu.jpg|thumb|徳川家光(いえみつ)]] 1635年、3代将軍の'''徳川家光'''のときには武家諸法度に、大名には一年ごとに江戸と領地に半数ずつ住まわせる'''参勤交代'''という決まりが付け加えられました。 また、江戸に大名の妻や子が住まわせられました。 幕府の目的は、大名の経済力を弱めることと、大名の妻や子を人質に取ることだろう、と今では言われています。 [[ファイル:Sankiko01.jpg|thumb|600px|none|園部藩参勤交代行列図 (1) (南丹市文化博物館蔵)]] [[ファイル:Sankiko02.jpg|thumb|600px|none|園部藩参勤交代行列図 (2) (南丹市文化博物館蔵)]] [[ファイル:Sankiko03.jpg|thumb|600px|none|園部藩参勤交代行列図 (3) (南丹市文化博物館蔵)]] 一方で、参勤交代によって道路などの設備が整い、宿場町も出来ていきました。また、江戸の文化が地方にも広がるきっかけともなりました。 ==== 朝廷などの統制 ==== 天皇や公家を取り締まるために{{ruby|'''禁中並公家諸法度'''|きんちゅうならびに くげしょはっと}}という法が作られました。また朝廷と西日本の外様大名を監視するために幕府は{{ruby|'''京都所司代'''|きょうとしょしだい}}を設置しました。 {| class="wikitable" |- ! 禁中並公家諸法度(抜粋・現代語に意訳) |- |一 天皇が修めなければならない芸能は、第一に学問である。 一 家柄が良くても能力のない人物は大臣や摂政・関白に任命してはならない。 一 元号を改める場合には、中国のものから縁起の良いものを選んで決めなさい。 一 紫衣<ref>最高位の僧侶であることを示した紫色の衣。</ref>を許された寺の住職は、以前は非常に少なかった。しかし、近年はむやみに許可されている。<br> これは寺の序列を乱し、名誉を汚すことだ。以後はその能力をよく調べて任命すべきである。 |} ==== 身分制度 ==== [[ファイル:江戸時代の人口割合.svg|thumb|200px|江戸時代の身分別の人口割合。(関山直太朗『近世日本の人口構造』より)]] 秀吉によって進められた身分の区別は江戸幕府によってより一層進みました。江戸時代には身分はほぼ固定化されました。また、身分ごとの社会的役割や仕事が定められました。 江戸時代の身分はどこに住んでいるかで決まりました。身分ごとに髪型や衣服も決められましたが、これは時代が進むごとに厳格化していきます。 また、百姓や町人は五戸前後を一まとめにして組織化されました(五人組)。五人組は税や犯罪で連帯責任を負わせて互いに監視させたほか、相互扶助の単位としました。 ===== 武士 ===== 武士は城下町の武家屋敷に住んでいました。政治と軍事は武士が行うものとされました。 また、武士だけが持つ特権として、名字(苗字)を名乗り、また、刀を身につけることが許されるという特権がありました。この苗字と帯刀の特権を合わせて、苗字帯刀といいます。 ===== 百姓 ===== 農村や漁村や山村に住む人々は百姓とよばれました。その中でも、自分の土地を持つ者を'''本百姓'''といい、土地をもたないものは'''{{ruby|水呑|みずのみ}}百姓'''と呼ばれました。本百姓は毎年、税として年貢を納めなければなりませんでした。年貢は主に収穫した米が中心でしたが木材、塩、砂糖などの特産物を年貢とする地方もありました。 有力な百姓は、村の長である{{ruby|名主|なぬし}}<ref>西日本では庄屋とよばれました。</ref>となりました。名主は年貢の徴収、法の伝達など様々な行政的な事務や地元の要望を領主に伝えるなどの仕事を行いました。 ===== 町人・その他 ===== 城下町などの都市に住む職人や商人などは町人とよばれました。彼らは店や住宅の広さなどに応じた税金を支払っていました。 他に、えた、ひにんと言われる、もっとも身分が低いとされた人々がいました。彼らは皮の加工や{{ruby|刑吏|けいり}}<ref>刑罰、特に死刑を行う人。</ref>など、当時の人々からさけられるような仕事をしなければならず、住むところや衣服も他の身分の人々以上に厳しい制限を受けていました。 === 幕府の仕組み === ==== 中央の仕組み ==== <div style="font-size:120%;"> <pre>    ┏━大老    ┃ 将軍━╋━老中━━━━┳━大目付    ┃       ┃    ┃       ┣━町奉行    ┃       ┃    ┃       ┗━勘定奉行    ┃    ┣━若年寄    ┃    ┗━寺社奉行 </pre> </div> 将軍の補佐をする'''老中'''が置かれました。ほかに老中の補佐をする若年寄がいます。老中は幕府による全国支配についての政策を担当し、若年寄は御家人と旗本を管理しました。 臨時に大老が置かれることがありました。大老の地位は老中よりも上で、江戸幕府の最高職ですが、 老中の下に、大名を取り締まる大目付、江戸の町の政治や裁判をおこなう町奉行、財政の管理をする勘定奉行があります。 このほか、神社や寺の管理を行う寺社奉行があります。 ==== 地方の管理 ==== <div style="font-size:120%;"> <pre> 将軍━┳━京都所司代    ┃    ┣━大坂城代    ┃    ┗━遠国奉行(長崎奉行など) </pre> </div> 京都に朝廷と西日本の大名を監視するための京都所司代が、大阪にも大名を監視するための大阪城代がおかれました。また、長崎など幕府が直接支配する地域には{{ruby|遠国|おんごく}}奉行が置かれ、町の政治や警察などの仕事を行いました。 === 江戸時代初期の外交 === ==== 朱印船貿易 ==== [[ファイル:Dutch-Japanese trading pass 1609.jpg|thumb|300px|right|徳川家康朱印状/オランダ国立公文書館蔵]] 徳川家康の時代のころから、東南アジア方面の国々と貿易をしていました。この貿易には、日本の船に幕府の許可を示す'''朱印状'''が必要でした。朱印状を持っている日本の船を朱印船と呼びました。この朱印船による東南アジアとの貿易を'''朱印船貿易'''といいます。キリスト教が禁止されたあとにも、朱印船貿易は続けられました。 そのため、日本人も活発に貿易を行い、さらに海外に拠点をつくるようになりました。東南アジアのルソン(今のフィリピン)やシャム(今のタイ)にはこのような日本人が集団で移り住み、日本町が出来ました。 朱印船貿易は3代将軍の徳川家光のときに終わります。 ==== オランダとの貿易と鎖国 ==== 家康はイギリスとオランダが日本と貿易することを許し、平戸(長崎県)での貿易が始まりました。そのきっかけは、1600年に豊後(大分県)に流れ着いたオランダ船に乗っていたオランダ人のヤン・ヨーステン(Jan Joosten)とイギリス人のウィリアム・アダムス(william Adams)が幕府の外交の相談役としてつかえたことでした。 スペインに遅れて貿易に参加することになったオランダやイギリスは、キリスト教の布教には関心がありませんでした。その上、オランダは日本との貿易を独占するために、スペインやポルトガルはキリスト教の布教を通じて日本を侵略しようとしている、と幕府につげていました。こうしたこともあって、1624年、幕府はスペイン船の来日を禁止しました。さらに、1639年にはポルトガル船の来航を禁止します。 一方、イギリスはオランダとの競争にやぶれ、日本をはなれました。 こうして、ヨーロッパの国のなかで日本と貿易をできる国は、オランダだけとなりました。また、明・清(今の中華人民共和国)の船も日本に来ることが認められました。 {| class="wikitable" style="float:right" |+ 鎖国への歩み | 年 || おもなできごと |- | 1612 || 幕府がキリスト教の禁止令(禁教令)を出し、幕領でのキリスト教が禁止される |- | 1613 || 禁教令を全国に拡大適用する |- | 1616 || 外国船との貿易を長崎と平戸に制限する |- | 1624 || スペイン船の来日を禁止する |- | 1635 || 日本人の海外渡航の禁止。海外にいる日本人の帰国の禁止する |- | 1637 || 島原・天草一揆が起きる |- | 1639 || ポルトガル船の来航を禁止する |- | 1641 || 平戸(長崎県)にあったオランダ人の商館を、長崎の出島に移す<br />(鎖国の完成) |- |} [[ファイル:Plattegrond van Deshima.jpg|thumb|300px|1824年、もしくは1825年に描かれた出島の鳥瞰図。扇形をしている。]] また、幕府はキリスト教の布教も禁止し、外国人の自由な移動を原則として禁止しました。 このような、江戸幕府による外国人と日本人との交流を減らしていった対外政策は、1800年ごろから鎖国と言われはじめ、明治時代から「鎖国」という用語が広がります。 オランダとの貿易は、長崎に出島とよばれた人工島で行われました。幕府は、出島にオランダ人を住まわせました。さらに、幕府は長崎のオランダ商館長に、外国のようすを幕府に報告書の提出を義務づけました。これを『'''オランダ'''{{ruby|'''風説書'''|ふうせつがき}}』といいます。 このように日本でのヨーロッパ人と日本人とのかかわりを制限していった結果、幕府が西洋についての情報と貿易の利益を独占しました。 ==== キリスト教の禁止 ==== 当初、幕府は貿易による利益の方を重んじたため、キリスト教の布教を黙認していました。しかし、キリスト教徒(キリシタン)は増加する一方でした。また、神の前での平等を説くキリスト教の教えは、身分を重んじる幕府の方針と対立する可能性がありました。そのため、幕府は1612年にキリスト教を禁止する'''禁教令'''を出します。当初は幕府が直接支配する場所だけに適用されましたが、1613年に全国に適用されるようになりました。 二代将軍・徳川秀忠の頃には、キリシタンや宣教師への取り締まりは厳しさを増していきました。そのため、ひそかにキリスト教を信仰する「隠れキリシタン」とよばれる人々が出てきました。 [[Image:Jesus on cross to step on.jpg|thumb|200px|イエス・キリストの踏み絵]] 1629年のころから、隠れキリシタンを取り締まるため、幕府は人々にキリストやマリアなどが描かれた銅板の絵(踏み絵)を踏ませ、これを拒否した者はキリシタンであるとして処罰しました。これを絵踏みといいます。 また、すべての人を寺院に所属させる制度を作りました({{ruby|宗門改|しゅうもんあらため}})。寺院は村人の宗派を証明する手続きをする義務を負いました(寺請制度)。 1637年 九州の島原半島(長崎県)や天草島(熊本県)で、キリスト教の信者や農民3万人あまりによる大規模な一揆が起きます。一揆の理由は、禁教によるキリシタンへの弾圧、および、領主による重い年貢などでした。中心人物となったのは、天草四郎(益田時貞)という少年でした。彼を中心として一揆軍は島原半島の原城にたてこもりましたが、12万人ほどの幕府軍により、一揆は鎮圧されました。この出来事を'''島原・天草一揆'''(島原の乱)といいます。 島原・天草一揆のあと、宗門改などが強化され、キリシタンの取り締まりはますます激しくなりました。 {{clear}} ==== 朝鮮との貿易 ==== 徳川家康の時代に、{{ruby|対馬藩|つしまはん}}を通して朝鮮との貿易が行われます。秀吉の時代には朝鮮出兵により貿易が中断しましたが、江戸時代に入り日本と朝鮮との国交が回復し貿易が再開します。鎖国のあいだも朝鮮との貿易は幕府に許され、貿易が続きます。 3代将軍の家光の時代からは、日本で将軍がかわるたびに、朝鮮からの使者が訪れるようになります。これを'''朝鮮通信使'''といいます。朝鮮通信使には朝鮮の学者や文化人も同行していたため、日本の学者や芸術家、さらに町人たちとも交流を深めました。 ==== 蝦夷地 ==== 江戸時代、現在の北海道は{{ruby|蝦夷地|えぞち}}とよばれており、アイヌ民族が住んでいました。 アイヌは、{{ruby|松前藩|まつまえはん}}と貿易をしていました。アイヌの人が持ってくるサケ、コンブ、ニシン、毛皮を、米や日用品などと交換していたといいます。 しかし、アイヌの人々にとって不利な割合で貿易がひんぱんに行われていました。また、アイヌの人々を奴隷のように働かせる商人もいました。これにおこったアイヌの人たちが、17世紀の中ごろ、'''シャクシャイン'''という人物を中心に反乱を起こしました。 ==== 琉球王国との交流 ==== 沖縄は{{ruby|琉球|りゅうきゅう}}王国という独立国でした。 しかし、江戸時代の初めにあたる17世紀に、琉球王国は薩摩藩によって支配されました。しかし、薩摩藩は琉球王国をほろぼさず、形式的には独立国のままとしました。そして、以前から琉球が行っていた中国との貿易をつづけさせ、その貿易の利益を薩摩藩が手に入れました。 === 産業 === ==== 農業 ==== ===== 農地の開発 ===== 幕府や藩の財政は百姓からの年貢にたよっており、財政をゆたかにするために農業を発達させる必要がありました。そのため、幕府や藩は、新田の開発に力を入れ、{{ruby|開墾|かいこん}}が進みました。こうして、全国の田畑の耕地面積が秀吉の頃の約2倍に広がりました。 一方で、江戸時代は貨幣が全国的に流通していたので、武士は年貢米を売って現金化していました。特に藩の年貢米は江戸や大阪にある蔵屋敷に運ばれ、そこで現金に変えられました。 治水工事も進み、農地には水を引く{{ruby|灌漑|かんがい}}のための用水路が各地にできました。箱根上水や玉川上水などの用水路もこの時代に完成しました。 九州の有明湾では干拓事業によって農地が広げられました。 ===== 新しい農具 ===== <gallery> Image:Japanese-hoe-biccyukuwa,katori-city,japan.JPG|thumb|180px|備中ぐわ ファイル:Japanese old threshing machine,Senba-koki,Katori-city,Japan.JPG|thumb|left|220px|千歯こき ファイル:Toumi.JPG|とうみ Image:Mizuguruma,human power waterwheel,katori-city,japan.JPG|thumb|right|140px|水車(みずぐるま)、踏み車(香取市) </gallery> また、備中ぐわ、千歯こき、とうみ(唐箕)などの農具も開発されました。 '''備中ぐわ'''は耕すための農具で、さらに深く耕せるようになりました。'''千歯こき'''は{{ruby|稲|いね}}の穂から米つぶを脱穀するための道具です。くし状の部分が鉄製で、何本もの、くし状の「こき」があるので、一度に多くの穂を脱穀できます。'''とうみ'''は風をおこして米ともみ殻やごみや割れてしまった米などに分ける道具です。 また、灌漑用の道具も開発されました。{{ruby|踏車|ふみぐるま}}や{{ruby|竜骨車|りゅうこつしゃ}}は人間が踏んで回す水車で、水を高いところにあげられるようになりました。こうして、これまでは水を引くのが難しい土地にも水を送ることが出来るようになりました。 ===== 商品作物の広がりとその背景 ===== 売ることを目的とした、綿・なたね・茶・麻・あいなどの商品作物の栽培も活発になっていきました。特に、綿の生産の発達により、民衆の服は麻から綿に変わっていくようになります。 商品作物の栽培が広がった理由の一つに、農村でも貨幣が広く使われるようになったことがあげられます。このころから、なたね油やごま油のしぼりかすやいわしを干して固めた{{ruby|干鰯|ほしか}}などが肥料に使われるようになります。これらは農村で自給できるものではなく、お金を出して買っていたことから金肥とよばれました。こうした金肥の購入に現金が必要となったのです。 また、米よりも現金化しやすいことに各藩が注目しました。当初は田を商品作物用の畑に変えることは禁止されていましたが、徐々に黙認されるようになります。やがて、財政が苦しくなると、藩は特産品でもある商品作物に注目し、藩の現金収入を増やすために積極的に栽培をすすめるようになりました。 ==== 水産業 ==== 江戸時代には大きな船の建造が禁止されていたことなどから沿岸での漁業が中心でした。一方で、麻でできた丈夫な網ができたため、大量の漁獲ができるようになります。 九十九里浜ではいわし漁が盛んに行われました。獲られたいわしは、肥料に加工されたり油を取ったりしました。 蝦夷地ではにしん漁とこんぶ漁が発達しました。にしんやこんぶはアイヌの人々が獲ったものを松前藩が米などと交換しました。 土佐(高知県)や紀伊(和歌山県)では捕鯨やかつお漁が盛んに行われました。かつおはかつお節に加工されて全国に流通しました。 瀬戸内海では塩田が発達し、製塩がさかんとなりました。 ==== 工業 ==== ===== 工業の発展 ===== 百姓は、農作業のないときに綿花や絹などの織物や商品作物を加工した商品を生産をするようになりました(家内制手工業)。 やがて、産業が活発になってくると商人が生産に必要な設備や資金などを百姓に貸し与え、百姓が自宅で生産し、出来あがった製品を商人が買い取り販売する、'''問屋制家内工業'''とよばれる仕組みが生まれていきました。 さらに、商人や大地主が、生産に必要な設備を買い入れ、多くの働く人をあつめる工場を作り、分業して効率的に生産する'''工場制手工業'''( '''マニュファクチュア''')とよばれる生産様式が発達しました。 江戸時代の初期には伊丹(兵庫県)や池田(大阪府)の酒、野田や銚子(共に千葉県)の醤油などが工場制手工業の方法によって発展しました。後に、尾張(愛知県西部地方)の綿織物、西陣(京都府)・足利(栃木県)・桐生(群馬県)の絹織物なども工場制手工業によって生産されるようになります。 * 鉱業 :鉱山の多くは、幕府が経営した。生産された金・銀・銅は貨幣の材料になったり、輸出品になった。 金山 :佐渡(さど、新潟県)の金山や、石見(いわみ、島根県)の金山がある。 銀山 :生野(いくの、兵庫県)の銀山。 銅山 :足尾(栃木県)の銅山や、別子(べっし、愛媛県)の銅山。 銅は長崎貿易の輸出品になった。 鉄 :鉄は砂鉄や、釜石(宮城県)の鉄山から。 === 商業 === 江戸時代は、商人があつかう商品の量や種類が増えた。このため、商業の仕組みが発達した。貨幣が全国的に流通するようになった。 商品の量や種類がふえ、複雑化していったので、商人も分業化するようになり、問屋や仲買(なかがい)や小売商の区別ができた。 問屋どうしの中でも分業はすすみ、さらに分業化が商品の種類ごとに進み、米をあつかう米問屋や、木綿をあつかう木綿問屋、油問屋など、専業化していった。 {{コラム|発展的事項: 分析(ぶんせき)してみよう。| :では、そもそも農民は,なぜ、貨幣を使う必要があったのだろうか? :* もしかしたら、こういう理由で貨幣が必要なのか? :おそらく、農工業などの産業の規模が大きくなり、また高度化し、もはや農村が一つの村の中で全てを生産することが、むずかしくなっていったのだろう。このため、おそらく村の外から必要な物を買い入れる必要が増えたのだろう。 :このようなことが全国各地でふえていき、したがって商人が取り扱う貨幣や仕事の漁も増え、商業の規模も大きくなったことが、商人の分業化の理由だろう。 :世間には「貨幣経済が進むと、自給自足がむずかしくなる。」という人がいますが、むしろ順序が逆で「人口がふえるなどして消費がふえ自給自足がむずかしくなったから、貨幣経済をして労働者どうしが協力しあう必要が生じた」と考えるべきでしょう。 :とは言え、貨幣がないと生活しづらい社会へと、日本では江戸時代の頃から、なっていったことは、たしかです。 :現代の日本の経済も、貨幣がないと生活しづらい世の中です。世界中の多くの国が、貨幣がないと生活しづらい社会に現代は、なっています。 :* 商業のしくみの理由を、読者は考えてみるべきです。 :商業について勉強をするときは、このように「なぜ、こういう仕組みが出来たのだろうか?」ということを考えてみてください。1分間ほど、ちょっとだけ考えるぐらいでもいいので、考えてみて下さい。 :「なんでかな?」「もしかしたら、こうかな?」と考えてみないと、せっかく用語を勉強しても、あまり記憶に残りません。 :考えてみた内容がまちがってるかもしれませんが、だとしたら気づいたときに、おぼえなおしていけばいいだけです。 ::※この説で紹介した考えも、ひょっとしたら、まちがっているかもしれません。だから、文章をそのままおぼえるのではなく、読者は自分なりに考えてみて下さい。 :*もしかしたら、こういう理由で商取引が活発になったのか? :村の外や藩の外との取引が活発ということは、前提として、村どうし・藩どうしが信用しあっているということです。つまり、日本が平和ということです。江戸時代の商業は、戦国時代とは、ちがう、というわけです。 :また、商品を輸送する物流のためには、道路や運送業が必要です。江戸時代の道路や街道などの発達の理由は、「参勤交代のため」という理由の他にも、もしかしたら商業上での商品の輸送が必要という物流上の理由もあったのかもしれません。 :なお、大量の商品を運ぶには、海上交通をつかうと、時間はかかるが安く運びやすい。このため、江戸時代は海運が発達した。 :戦国時代だと、交通が不便なところに城を気づいたりすることもありましたが、江戸時代での商売となると、交通が便利でないとこまってしまうわけです。 (発展的事項、おわり。) }} ==== 商人の種類 ==== いろんな種類の商人の職が出てきます。現代の仕事に関連づけて、おぼえてください。現代の仕事に関連づけないと、おぼえづらいでしょう。 * 蔵屋敷 江戸時代は貨幣が全国的に流通していたので、武士は年貢米を売って現金化していました。 年貢米や、年貢のかわりの特産物は、江戸や大阪にある蔵屋敷に運ばれ、商人によって売りさばかれ現金化されます。 大阪は商業がさかえ、「天下の台所と言われました。 分業化は蔵屋敷でも、されていました。仕事の種類によって、大阪では蔵元や掛屋などに分業されました。江戸では 札差などがありました。 蔵元は、売りさばきが担当の商人です。今でいう販売員です。 掛屋は、売上金の輸送や保管の仕事です。今でいう銀行の 預金業務や 振り込 のような仕事をしています。 * 両替商 両替商(りょうがえしょう)は、もともとは、金貨や銀貨や銅貨の交換を、手数料をもらって行なう仕事ですが、そのうち仕事の内容が変わり、今でいう銀行のような預金業務と貸付業務を行なうようになった。 両替商は貨幣の調達などに信用があるので、両替商どうしの帳簿上の処理で貨幣の送金の代わりとする 信用取引の仕組みが発達した。 江戸を中心に関東では金が取引の主流であり、大阪などの関西では銀が取引の主流であったので、両替が必要だった。「両」とは金貨のこと、あるいは金貨の単位である。 * 鉱山の開発 貨幣をつくるには、材料の金や銀が必要なので、幕府は鉱山を開発しました。 また、貨幣をつくる権利は幕府が独占した。 商業の発達には、交通の発達も必要である。 ==== 海上交通の発達 ==== 船は、大量の荷物を、少ない人物で運べます。しかも、一度、船に積めば、目的地までは途中で積み替えをする必要がありません。 このため、大量の商品を運ぶには、海上交通をつかうと、時間はかかるが安く運びやすい。このような理由で、海運(かいうん)が発達した。 また、船も改良され発達した。 [[ファイル:Osaka Maritime Museum Naniwamaru.jpg|thumb|菱垣廻船の復元船「浪華丸」]] {{ruby|菱垣廻船|ひがきかいせん}} :積み荷が船から落ちないように、船の両側に{{ruby|垣|かき}}がつけられ、その垣の形が{{ruby|菱型|ひしがた}}に組まれていたので、菱垣廻船という。 {{ruby|樽廻船|たるかいせん}} :酒はくさりやすいので、素早く運ぶ必要があった。そのためのスピードが早くなる工夫をされた船である。 * 航路 東回り航路 :東北地方の太平洋側から、太平洋側を通り、江戸までをむすぶ航路。 西回り航路 :日本海側の東北地方から、瀬戸内海を通り、大阪までをむすぶ航路。 ==== 陸路の交通 ==== 全国を道でつなぐため、街道が出来た。 [[ファイル:Hiroshige le pont Nihonbashi à l'aube.jpg|300px|right|thumb|江戸の日本橋の、ようす。五街道は日本橋が起点。画:歌川広重『東海道五十三次』より。]] [[ファイル:Portrait à la mémoire d'Hiroshige par Kunisada.jpg|thumb|歌川広重]] 江戸の日本橋を起点とする幹線道路としての街道が5本あるが、これを'''五街道'''という。 五街道と、そのほかの道である 脇街道 などによって、東北から山陰・山陽地方までが道でつながった。 九州や四国も、それぞれの島の内部が、道で、つながった。 五街道は、東北地方の南部の今でいう福島県から京都までしか、つながっていない。 日光へと向かう 五街道のうちの街道が日光街道である。 日光街道は、北関東の宇都宮のあたりで、ふたまたに分かれていて、宇都宮から福島の白河へと向かう奥州街道に分岐している。 (※ 宇都宮・白河など、細かな地名は、おそらく教科書の範囲外なので、学校対策では、おぼえなくてよい。) 以上の二本の街道が、五街道への北への方面である。 次に京都方面について、説明する。 京都の方面へと江戸から向かう街道は3本あるが、そのうちの2本は、じつは、途中(とちゅう)で合流(ごうりゅう)する。 五街道のうちの一つである<big>甲州道中</big>(こうしゅうどうちゅう)は、長野県の信濃(しなの)の諏訪(すわ)のあたりで、五街道のうちの別の一つである中山道(ちゅうさんどう)と合流する。 甲州道中の名前は「甲州」道中だし甲府(こうふ)を通るが、じつは長野県の信濃まで、つながっている。 五街道のうちの一つである<big>東海道</big>は、太平洋ぞいの街道であり、京都まで他の街道とは、つながっていない。東海道の経路は、今でいう神奈川県 → 静岡県 → 愛知県 → 京都 の経路である。 当時の用語で言えば、小田原(おだわら、神奈川) → 駿府(すんぷ、静岡) → 名古屋(なごや、愛知) → 京都 である。 東海道は、もっとも人々の行き来が、さかんだった。 * 関所 [[画像:Ishibe shukubanosato02s3200.jpg|thumb|280px|関所の様式の門。観光テーマパークでの復元。]] 警備上の理由から、街道には、通行者の取り調べるため通行を制限する関所が、おかれた。 関所では、通行者は、関所の役人に、通行許可証である手形を見せる必要があった。 関所では、とくに江戸に入る鉄砲と、江戸から出る女は、きびしく調べられた。鉄砲の取り調べは、反乱を恐れて、のことである。江戸から出る女は、参勤交代で人質として江戸に住まわせた女である、大名の妻が、こっそり江戸から故郷へ帰国することを恐れて、である。 「入り鉄砲に出女」と言われ、これら2つは、きびしく調べられた。 街道には、旅行者が寝泊まりするための宿場が、もうけられた。 大名や幕府の役人のとまる宿である本陣や、ふつうの武士のとまる脇本陣や、一般の旅行者が泊まる旅籠が、もうけられた。 宿場の周辺の人々には、役人などのため人手をかす負担があって、この負担を 助郷(すけごう) という。 東海道には53の宿場があり、<big>東海道五十三次</big>(とうかいどうごじゅうさんつぎ)と言われた。 街道には、通行者が場所をわかりやすいように、並木(なみき) や 道しるべ が、もうけられた。また街道の道のりの約4キロメートルごとに塚(つか)がもうけられ<big>一里塚</big>(いちりづか) が、もうけられた。一里(いちり)とは、長さの単位(たんい)であり、今でいう約4キロメートル。 * 通信の発達。飛脚(ひきゃく) 郵便物をとどけるため、人が走ったり馬をつかって運ぶ<big>飛脚</big>(ひきゃく)の仕事が発達した。 幕府が管理する飛脚を 継飛脚(つぎひきゃく) という。町人のあいだでは 町飛脚(まちひきゃく) が利用された。 ==== 都市の発達 ==== 江戸時代に商業の中心的な都市は、江戸と大阪です。 江戸 :将軍のいる江戸城の城下町なので、江戸は「将軍の おひざもと」と言われました。江戸時代なかごろの18世紀には、人口が100万人をこえる大都市になった。 大阪 :全国から年貢や特産物が集まり、商業のさかんな街である。年貢を現金化する<big>蔵屋敷</big>(くらやしき)があり、各藩の大名の蔵屋敷が大阪にあった。 その他の都市 京都 :天皇の住む皇居(こうきょ)があり、寺社も多い。伝統文化の中心地だった。西陣織(にしじんおり)や清水焼(きよみずやき)などの工芸品(こうげいひん)の産地(さんち)でもある。 4代将軍〜5代将軍のから、幕府は財政が悪化していき、財政のあまり良くない状況が、江戸時代の終わりまでずっと続きます。 江戸時代には貨幣が普及していきますが、田畑の収穫が急にふえるわけでもなく、そのくせ人口はふえるし、鉱山から採れる金銀の量もへっていきますので、今の時代から見れば財政がわるくなっても当然です。 === 幕府の政治の行き詰まりと改革 === ==== 徳川綱吉の政治 ==== 5代将軍の徳川綱吉(とくがわつなよし)は、動物を極端に保護する、<big>生類あわれみの令</big>(しょうるいあわれみのれい)を出した。 綱吉が、いぬ年の生まれで、特に犬を保護したので、犬公方(いぬ くぼう)と大衆から呼ばれて、きらわれた。 令を出した理由は、一節には、綱吉には、子がなく、僧からのすすめで、殺生を禁じたら子ができる、と僧にすすめられ、とくに犬を大切にすれば子ができるとすすめられたらしいのが、令を出した理由だと言われている。 儒学などの学問に力を入れた。湯島に孔子(こうし)をまつる聖堂(せいどう)を立てる。儒学の中でも、とくに朱子学(しゅしがく)という分野を重んじた。 前将軍のときの火事の、明暦の大火(めいれきのたいか)での費用がかさむなどが、財政悪化の理由の一つです。 金貨・銀貨にふくまれる金・銀の量をへらした貨幣を発行したが、貨幣の信用がさがり、そのため物価(ぶっか)が上がった。 * 発展的事項: 貨幣の質と、物価についての解説 現代でも、一般に、貨幣の信用が下がると、物価が上がります。 江戸時代は貨幣の信用のうらづけは、金貨や銀貨にふくまれている金・銀なので、貨幣の中の金銀のわりあいを減らせば、商人が物を売るときに今までと同じ金・銀を手に入れるには値段を上げなければ金銀の量が前と同じになりません。 なので、貨幣の質をさげると、物価が上がってしまいやすいのです。 (発展的事項、おわり。) ==== 新井白石(あらい はくせき)の改革 ==== [[ファイル:Arai Hakuseki - Japanischer Gelehrter.jpg|thumb|250px|新井白石(あらい はくせき)]] <big>新井白石</big>(あらい はくせき)は、綱吉のあとの、6代所軍の家宣(いえのぶ)に使え、7代将軍の家継(いえつぐ)に仕えた。 新井白石は、綱吉のときに質の低下した金貨・銀貨の質をもとの質にもどした。また、貿易で金銀が外国に流出していたので、長崎貿易に制限を掛けた。この白石の政治(せいじ)を、<big>正徳の治</big>(しょうとく の ち)という 綱吉の生類あわれみの令は、白石によって廃止(はいし)されます。 新井白石は儒学者(じゅがくしゃ)であった。 ==== 享保の改革 ==== [[ファイル:Tokugawa Yoshimune.jpg|thumb|250px|徳川吉宗(とくがわ よしむね)]] 8代将軍の'''徳川吉宗'''(とくがわ よしむね)のころになっても、幕府の財政は、よくありません。吉宗の理想は家康のころの政治で、吉宗は質素倹約(しっそけんやく)をすすめました。 吉宗の行った一連の改革を'''享保の改革'''(きょうほう の かいかく)と言います。 吉宗自身も倹約につとめました。 財政の悪い理由は、収入が少なく、支出が多いわけです。だったら、財政(ざいせい)改革では、何らかの方法で収入をふやして、支出をへらせばいいわけです。 質素倹約には、支出をへらす狙い(ねらい)も、あります。 では、収入を増やすには、どうすればよいでしょうか。米の収穫量の石高(こくだか)をふやせばいいわけです。年貢の米が、収入のもとなのだから、だったら米の石高を増やせばいいので、吉宗は新田(しんでん)の開発をすすめました。 年貢も、ふやしました。 商品作物の開発も、すすめて、菜種・さつまいも、さとうきび、朝鮮人参(ちょうせんにんじん)、・・・などの開発をさせました。 飢饉(ききん)にそなえ、さつまいもの栽培の研究を、青木昆陽(あおきこんよう)に命じます。 * 目安箱(めやすばこ) <big>目安箱</big>(めやすばこ)を作って、庶民や町民でも、アイデアを書いて投書(とうしょ)で幕府に意見をとどける仕組みが出来た。目安箱からの意見により、江戸に無料の病院の小石川養生所(こいしかわ ようじょうじょ)が出来た。 * 火消し(ひけし) 江戸の消防(しょうぼう)である町火消し(まちひけし)の制度を、目安箱の意見も参考にして、整備していった。 * 実学の許可(きょか) キリスト教をのぞく、産業や医学や天文学(てんもんがく)などの実学(じつがく)の洋書(ようしょ)の輸入を許可します。当時の輸入された洋書は、ヨーロッパの洋書が中国語に訳された漢訳洋書(かんやくようしょ)です。 また、オランダ語を青木昆陽(あおき こんよう)や野呂元丈(のろ げんじょう)たちに学ばせました。 * 上米の制(あげまいのせい) 大名の参勤交代をゆるくするかわりに、大名は石高1万石につき100石の割合で米をさしだす上米の制(あげまいのせい)が作られました。上米の制により、参勤交代での江戸の滞在期間は半年になった。それまでは1年の江戸滞在だった。 * 裁判の改革 公正な政治や裁判をおこなうため、<big>公事方御定目書</big>(くじがた おさだめがき)を出して、政治や裁判の基準を定めた。 このような,吉宗の行った一連の改革を<big>享保の改革</big>(きょうほうのかいかく)と言います。 改革は、ある程度の成果もありましたが、農民にとっては年貢がきびしくなったこともあり、さらに飢饉(ききん)や凶作(きょうさく)も重なって、百姓一揆(ひゃくしょう いっき) や 打ちこわし(うちこわし) が起こった。 吉宗の改革で、年貢の率を、豊作・凶作にかかわらず一定の率にする定免法(じょうめんほう)で、米の値段を安定させようとしていたので、不作のときは農民が苦しくなりました。 米の値段(ねだん)の調整(ちょうせい)につとめた吉宗は「米将軍」(こめしょうぐん)と人々から呼ばれたり、「米公方」(こめくぼう)と人々から呼ばれたりしました。 ==== 田沼意次の政治 ==== [[ファイル:Tanuma Okitsugu2.jpg|thumb|250px|田沼意次(たぬま おきつぐ)]] 10代将軍の家治(いえはる)のころ、幕府の財政が、また悪化していきます。 8代吉宗の改革で年貢は増えたのですが、そのあと、米の値段そのものが下落していったのです。こうして、10代将軍のころ、また財政が悪化したのです。 老中の<big>田沼意次</big>(たぬま おきつぐ)は、農業だけにたよる収入源だけでは無理があると考えたのか、商業を重んじた政策を取ります。 * 株仲間(かぶなかま)の許可 商人に事業独占の株仲間(かぶなかま)の結成をみとめるかわりに、株仲間から税(ぜい)を取り、収入をふやしました。 * 長崎貿易 田沼は、長崎貿易もすすめ、日本からの輸出品(ゆしゅつひん)には海産物(かいさんぶつ)や銅(どう)を輸出(ゆしゅつ)することで、日本に金銀を流入させようとします。 また、銅山の開発も行いました。 田沼の政治は、貨幣経済の進む世の中でも安定的に税収をとる工夫をしている、という財政的には合理的な政策であったが、幕府の役人のあいだに賄賂(わいろ)が横行するようになったりして、批判(ひはん)もあった。 <big>天命のききん</big>が1782年(天明2年)から1788年(天明8年)に東北地方を中心におこり、百姓一揆や打ちこわしがおこり、田沼の政治は行きづまり、田沼は失脚(しっきゃく)した。 ==== 寛政の改革 ==== [[ファイル:Matsudaira Sadanobu.jpg|thumb|350px|松平 定信(まつだいら さだのぶ)]] * 寛政の改革(かんせいの かいかく) <big>天命のききん</big>が1782年(天明2年)から1788年(天明8年)に東北地方を中心におきた。天命のききんのつづくなか、老中だった田沼意次(たぬま おきつぐ)が失脚し、新しい老中として<big>松平定信</big>(まつだいら さだのぶ)が1787年に老中になる。 定信は奥州白河(おうしゅうしらかわ、福島県)の藩主で、天命のききんのときに、素早い対策を取り、すばやく商人から米や食料を買いあげて、農民に食料をくばるという方法で、領内で飢饉(ききん)による死者を一人も出さなかったと言われる。 この功績が評価され、定信は老中になった。 このとき、将軍は徳川家斉(とくがわ いえなり)。 定信は、さまざまな改革をおこなう。松平定信の行った改革を <big>寛政の改革</big>(かんせいの かいかく) といいます。 飢饉(ききん)により、まず、食料生産をふやさないと国が危険な時代になってるので、定信は、食料生産を増やす(ふやす)政策を取る。 江戸に出稼ぎで来ていた農民を農村にかえらせるため帰農令(きのうれい)を出し、農民を農業に専念させます。また、商品作物の制限をし、なるべく米をつくらせます。 凶作でも飢饉(ききん)にならないように、米を蔵(くら)に蓄え(たくわえ)させるという<big>囲い米</big>(かこいまい)の制度を作ります。 ききんで米が不足しているということは年貢による収入も少ないということであり、幕府の財政も少なくなっています。なので、帰農令や囲い米には、財政を安定化させる役割もあります。 定信は倹約をすすめました。ききんで、余計な金をつかっている余裕がないし、そもそも年貢不足による財政難(ざいせいなん)なので、ぜいたくも出来ません。 松平定信(まつだいら さだのぶ)のこれらの改革を <big>寛政の改革</big>(かんせいの かいかく) といいます。 寛政の改革には、食料の増産(ぞうさん)のほかにも、以下のような政策もあります。 * 人足寄場(にんそくよせば) 職業訓練です。 ききんにより、農村が荒廃して江戸に人が流入したりして、江戸の町に浮浪者がふえたので、無宿舎を対象に職業訓練を行った。 * 棄捐令(きえんれい) 借金の負担がおもくなった武士をすくうための、借金帳消しの政策。つまり徳政令(とくせいれい)。当然のごとく、商人は次からは金をかさなくなるので、武士の経済問題が先送りされただけであった。 * 積み金(つみきん) :江戸では、緊急時のために、金(かね)を貯金していく積み立て(つみたて)をした。 * 寛政異学の禁(かんせいいがく の きん) :幕府の儒学を教える学校では、儒学の一派である朱子学(しゅしがく)のほかは教えられなくなった。 儒学の派(は)には、朱子学の他にも陽明学(ようめいがく)などがある。 朱子学が正式な儒学である正学(せいがく)とされ、陽明学などのほかの派の儒学は異学(いがく)とされた。 しかし、この改革では倹約を強制し、さらに学問の統制、思想の統制などを行ったり、借金帳消しをさせたため、産業や文化が停滞(ていたい)し、人々の反発がつよまり、定信は6年ほどで失脚(しっきゃく)した。 狂歌には、「白河(しらかわ)の 清き(きよき)に魚(さかな)の 住(す)みかねて もとの濁り(にごり)の 田沼(たぬま)こいしき」とも、うたわれました。 「世の中に 蚊ほど うるさき ものは(わ)なし ぶんぶ(文武)といふて 夜もねむれず」とも、うたわれました。 ---- * 発展的事項: ききんの根本的な原因 :天明の飢饉(ききん)の理由は、冷害が理由の一つですが、それだけが飢饉の理由では無いようです。よく、以下のような他の理由が考えられている。 ::・根本的な理由は、藩の財政難? ::身分が固定されてるので、政治が実情に合わなくなる。 → そのため、藩は財政難になる。 → 財政難をしのぐため、米などの食料を江戸などに売ってしまっていた。 → 農村で飢饉が発生。 :田沼の批判される商業を重んじた政策も、ほんらいの目的は幕府の財政難への対策である。 :財政難の根本的な原因は、幕府の仕組みそのものが社会に合わなくなっていたことが原因なのだが、政治家たちは、幕府の政治家であるという立場上の理由で、幕府そのものの改革には手をつけられなかった。 :江戸時代のなかばの人口は、信長たちの戦国時代よりも、信長や秀吉の安土桃山時代よりも、2倍ちかくも人口が増えている。もはや江戸時代はじめごろの仕組みでは、社会の実体に合わないのであろう。 :「商人による米の買い占めが悪い」と、ときどき言われるが、商人は売り物である米を買っただけです。べつに、米をぬすんだわけでは、ありません。商人に米を売る人が、いたわけです。現金が必要で、商人に米を売った人がいるわけです。 :商人からすれば金をだして米を買ってきたのですから、買値よりも高く米を売らないと利益が出なくなり、商人が失業(しつぎょう)してしまいます。 :・どうも貨幣経済で、農民の支出が増加して貧しくなっているらしい。 :・藩が財政難だと、現金収入をかせぐために米を江戸などの都市に売ってしまっていた。江戸などの都市では、農村よりも高い米価で米が売れるので。 :・そもそも米は熱帯性の作物であり、品種改良がされてきたとは言え、冷害に合いやすい。アワやヒエなどの雑穀は、米よりも冷害に強いが、米のほうが高く売れるので、米作にこだわった。 (発展的事項、「ききんの根本的な原因」、おわり。) ==== 天保(てんぽう)のききん ==== 将軍・家斉(いえなり)のとき。 全国的なききん。ききんで死者の大きい地域は東北や北陸だけでなく、関東や、大阪などの西日本をふくむ。 大阪は、この時代の商業の中心地である。その大阪で被害が出てるのだから、すごい飢饉(ききん)なわけである。 幕府や藩には、まずしい人を救うだけの財政的なゆとりがなかった。関東も、ききんの被害が大きく、幕府には、財政的な余裕(よゆう)がない。 幕府が、江戸での打ち壊しをふせぐため、江戸に米をあつめるため、大阪町奉行などに米を買い占めさせた。 このようなことから、幕府に対して反乱が起きる。 大阪の町奉行所の元・役人の<big>大石平八郎</big>(おおしお へいはちろう)が、町奉行に貧民の救済を申し出たが、町奉行に聞き入れられず、その上、大阪で買い占めた米を江戸に送っているという有様(ありさま)だった。 1837年 <big>大塩平八郎の乱</big>(おおしおへいはちろう の らん) ついに1837年に反乱を起こしたのが、大塩平八郎だ。商人の家を大砲でおそったりした。 乱は一日ほどで、しずめられた。 しかし、大塩の乱が世間の人々の心に与えた影響は大きい。 これから、各地で、一揆や打ち壊しが、ふえてきた。 ==== 天保の改革 ==== [[ファイル:Mizuno Tadakuni.jpg|thumb|300px|水野忠邦(みずのただくに)]] 1841年に、老中に<big>水野忠邦</big>(みずの ただくに)がつき、対策をとった。水野忠邦の政策を<big>天保の改革</big>という。手本は、松平定信の寛政の改革が、水野の手本であった。 水野の政策では、財政を立て直すため倹約令(けんやくれい)を出した。 物の値段が上がった原因を、水野は株仲間による独占が原因だろうと考え、株仲間(かぶなかま)を解散させた。 だが、物価の上がった本当の理由は、その時代に貨幣の質を下げられて発行されていたのが原因であり、このため、物価の引下げの効果は、ほとんどなく、株仲間の解散は失敗に終わった。 * 発展的事項: 政策の分析 :物価の上昇について、似たような貨幣の質の下がったことによる物価の上昇は、すでに5代将軍の綱吉の時代にもあった。 :貨幣の質を下げても、すぐには物価が上がらないから、一時的には財政が豊かになったように見える。 :天保の改革は、「改革」というと、なんとなく新しい政策をイメージしがちだが、やっていることは、すでにある吉宗の享保の改革や、松平定信の寛政の改革などに似ていて、水野の政策に目新しいことは少ない。株仲間の解散を命じたぐらいが目新しい改革である。 (発展的事項、「政策の分析」、おわり。) 天保の改革は、他にも、以下の内容がある。 ・ 農村から人が流出し、江戸に人が出てきたので、農村にかえすための<big>人返しの令</big>(ひとがえしのれい)を出した。 ・ 江戸と大阪を幕府の領地にしようとして<big>上地令</big>(あげちれい)を出したが、多くの大名などに反対され失敗した。 天保の改革は失敗に終わり、たったの2年あまりで終わり、水野忠邦は失脚し、幕府そのものも人々からの信用が下がっていった。 === 江戸時代の学問 === * 儒学(じゅがく) 徳川家康をはじめとして幕府は、幕府を保ちつづけるには儒学(じゅがく)などの道徳的な学問が必要だと考え、武士に儒学を学ばせた。 儒学では、平和に必要なのは、忠義の大切さや、子の親への忠孝の大切さなど、上下関係にもとづく忠孝や礼儀が、社会の平和に必要だと考えられていた。 このように上下関係にもとづき平和を求めるという儒学の内容が、幕府の士農工商などの身分差別の制度にも都合が良かったので、儒学が武士に学ぶべきとされる学問になった。 儒学の中でも、<big>朱子学</big>(しゅしがく)と言われる学問は、とくに上下関係による礼節を重んじていたので、幕府は朱子学こそ儒学の中でも学ぶべき学問と定めていき、朱子学が武士の学ぶべき学問とされた。 5代将軍の綱吉のころ、幕府は武士に儒学を学ばせる学校を江戸に開き、 昌平坂学問所(しょうへいざかがくもんじょ) を開いた。ほかの藩も、武士の教育のため、藩校(はんこう)を開いた。 * 教育 [[ファイル:Bungaku-Bandai no-Takara-Terakoya-School-by-Issunshi-Hanasato.png|thumb|right|寺子屋の、ようす。]] 百姓や町民などの庶民は、「読み」(日本語の読み)、「書き」(日本語の習字)、「そろばん」(算数のこと)などを<big>寺子屋</big>(てらこや)で学んだ。 当時の外国では、読み書きの出来る庶民は少なく、世界各国の中でも、日本は文字を読める人が多い国であった。 また、貸本屋(かしほんや)などの書店も、増えていった。 * 儒学以外の学問 いっぽう、ヨーロッパの政治や道徳や宗教などに関する学問は、日本の社会をまどわし日本を混乱におとしいれる危険な学問であるだろう、というふうなことが江戸幕府に考えられており、西洋の政治に関する学問の多くは禁止をされ、西洋道徳を学ぶことも禁止された。 日本の古典や歴史を学ぶことは幕府は認めていた。なので、たとえば万葉集(まんようしゅう)などの古典や、古事記(こじき)・日本書紀(にほんしょき)などの歴史を学んだり研究する者もあらわれた。 * 蘭学(らんがく) ヨーロッパの医学や農学や科学技術など、キリスト教や政治道徳に関係の無い学問を学ぶことは、江戸時代のなかばの18世紀はじめごろ、8代将軍・徳川吉宗の改革などにより、西洋の科学技術などの研究が認められていった。 当時はオランダ語を通して西洋の科学を学んでいたので、ヨーロッパから取り入れた学問のことを<big>蘭学</big>(らんがく)と言った。蘭とはオランダのことです。 吉宗は青木昆陽(あおき こんよう)にオランダ語の研究をさせた。青木昆陽はサツマイモの栽培を広めた。 * 医学書『ターヘル・アナトミア』の翻訳(ほんやく) [[画像:Kaitai shinsyo01.jpg|right|thumb|500px|『解体新書』。扉絵は底本『ターヘル・アナトミア』の扉絵とはまったく異なっている。]] [[ファイル:Ontleedkundige Tafelen replica.jpg|thumb|240px|right|『ターヘル・アナトミア』(複製)。]] 18世紀のおわりごろ、オランダの医学書が日本語へと訳(やく)された。翻訳書(ほんやくしょ)を出したのは、小浜藩(おばまはん、今でいう福井県)の医者の<big>杉田玄白</big>(すぎた げんぱく)と、中津藩(なかつはん、今でいう大分県)の医者の<big>前野良沢</big>(まえの りょうたく)の二人がかりである。 杉田たちは、オランダの医学書を見て、人体の内蔵(ないぞう)の解剖図(かいぼうず)が、とても正確に書かれていることに、おどろいた、と言われています。そして、日本の医学が、ヨーロッパよりも遅れている(おくれている)ことに、杉田たちは気づき、ヨーロッパの医学書の翻訳を決意しました。 杉田と前野の協力により、オランダ語で書かれた医学書の『ターヘル・アナトミア』(オランダ語:Ontleedkundige tafelen「オントレートクンディヘ・ターフェレン」)が日本語に訳され、翻訳版(ほんやくばん)が<big>『解体新書』</big>(かいたいしんしょ)として出されたのである。 [[Image:Sugita Genpaku.jpg|thumb|left|杉田玄白(すぎたげんぱく]] これが、西洋の本を日本語に訳した本のうち、日本では初めての本格的な翻訳書になった。 翻訳の当時は、日本語で書かれたオランダ語の辞書は無くて、たいへんに時間がかかり、オランダ医学書の「ウェインブラーウ(まゆ)は、目の上に生えている毛である。」というような一文でさえ、翻訳するのに1日かかったといいます。翻訳本の出来上がるまでには4年ほどの年月がかかった。 まだオランダ語に対応する日本語が無い言葉もあって、「神経」(しんけい)・「軟骨」(なんこつ)・「動脈」(どうみゃく)・「盲腸」(もうちょう)・「十二指腸」(じゅうにしちょう)などの言葉は、この翻訳のときに前野と杉田が考えた言葉である。 ついでに杉田と前野は、翻訳のときの苦労話などを書いた本である『蘭学事始』(らんがくことはじめ)という本を記した。 ちなみにオランダの医学書のターヘル・アナトミアそのものが、じつは、ドイツの医学書の翻訳本である。 杉田玄白らの翻訳(ほんやく)のときの苦労話が、『蘭学事始』(らんがく ことはじめ)という本に書かれている。 * 国学(こくがく) 江戸時代のなかばごろから、儒教や仏教の考えにとらわれない立場で、日本古来の古典や文化の研究をする学問が生まれてきて、このような学問を <big>国学</big>(こくがく) という。 [[画像:Motoori Norinaga.jpg|thumb|200px|本居宣長]] 賀茂真淵(かものまぶち)の弟子の<big>本居宣長</big>(もとおり のりなが)が『古事記』の研究を行い、本居宣長(もとおり のりなが)は<big>『古事記伝』</big>(こじきでん)を記し、国学を高めた。 宣長の研究は『古事記』のほかにもあって、平安時代の紫式部の『源氏物語』についても研究している。 国学の、そもそものきっかけは、もっと前の時代に、さかのぼる。 4代将軍の徳川家綱(いえつな)の時代の1650年代のころに水戸藩の藩主であった徳川光圀(とくがわ みつくに)は、日本史の研究を人々に勧め(すすめ)させた。その歴史研究にともなって、万葉集などの古典も研究された。 光圀の命令により、僧の契沖(けいちゅう)が万葉集を研究し、つぎのようなことに気づいていった。 学者たちの古典研究の結果、学者たちから、儒教や仏教の考えにとらわれない立場で、日本古来の古典や文化の研究をする学問が生まれてきて、のちに国学(こくがく) へと発展していく。 つまり、国学の発展にともない、儒学にもとづいた古典研究への疑い(うたがい)が、ふえてきた。 「 『万葉集』や『古事記』などの日本の古典の内容を研究するときに、外国の国の文化である儒教や仏教だけの道徳にもとづいて研究するのは、おかしくないか? 」 「そもそも儒学は中国という外国の学問じゃないか? 仏教だって、中国から伝わったインドの宗教だ。日本古来の宗教ではない。」 「中国の古典を研究するときに、中国の儒教の立場から考えてみるのなら、まだ分かる。」 「しかし、なぜ日本の研究で、しかも平民にまだ儒教や仏教が伝わってない時代の『万葉集』や『古事記』の研究で、儒教や仏教の考えにもとづいてばかりの研究しか、儒学者は研究しないのか? おかしくないか?」 「日本古来の伝統とは、儒学にもとづいてではなく、その古代の道徳を解き明かして、研究するべきだろう?  日本の古典文化を研究するときは、儒教にとらわれない立場で日本古来の古典や文化の研究をするべきだろうと思う。」 以上のような考えが、国学の考え方である。 万葉集の研究を命じられた契沖(けいちゅう)は万葉集を研究し『万葉代匠記』(まんようだいしょうき)を記して1690年に出来あがった。研究を命じた光圀は、のちに日本史の歴史書の『大日本史』(だいにほんし)を記した。 もっとも、国学のきっかけである徳川光国は、儒学を信望してた。また、『万葉代匠記』を表した契沖も、仏教の僧侶である。 この契沖の研究を、さらに発展させたのが、後の時代(吉宗のころ)の荷田春満(かだの あずままろ)であり、さらに荷田春満の弟子の賀茂真淵(かものまぶち)が研究を受け継いだ。 さらに、のちの時代(10代将軍家治(いえはる)のころ)に、<big>本居宣長</big>(もとおり のりなが)が『古事記』の解読(かいどく)と研究を行い、以上に述べたように国学をより発展させた。本居宣長は賀茂真淵(かものまぶち)の弟子である。 {{clear}} * 科学技術 [[ファイル:A Portrait of Kyūkei Hiraga cropped.jpg|thumb|250px|left|平賀源内(ひらがげんない)]] [[ファイル:Elekiter replica.jpg|thumb|240px|right|平賀源内作のエレキテルの複製(ふくせい)。国立科学博物館の展示。]] <big>平賀源内</big>(ひらがげんない)が発電機(はつでんき)の<big>エレキテル</big>を作った。エレキテルでの発電の仕組みは、摩擦(まさつ)によって発電する仕組みである。平賀源内は、ほかにも、寒暖計(かんだんけい)を日本で初めて作っている。 {{clear}} [[ファイル:Ino Tadataka stamp.jpg|thumb|left|伊能忠敬を描いている切手、1995年発行の切手]] * 測量(そくりょう) [[ファイル:Land-Surveyors-Edo-Period-Katsushika-Hokusai.png|thumb|400px|江戸時代の測量(そくりょう)のようす]] <big>伊能忠敬</big>(いのう ただたか)は、日本全国を地図をつくるために細かく調べる測量(そくりょう)する旅をして、正確な日本地図である『大日本沿海輿地全図』(だいにほんえんかい よちぜんず)を作った。 * 数学 江戸時代のはじめごろ、4代将軍・家綱、5代・将軍綱吉あたりのころ、<big>関孝和</big>(せき たかかず)が数学を研究しており、たとえば円周率の計算を、かなり正確に研究していた。関の数学研究は当時としては世界的にも高度な研究をしていたが、日本が鎖国をしていたので外国に伝わらなかった。 鎖国化の江戸時代での、日本の数学研究は<big>和算</big>(わさん)と言われる。 {{clear}} === 江戸時代の文化 === ==== 江戸時代の前半の文化 ==== 江戸時代の文化は、江戸時代はじめごろは大阪や京都を中心に発展した。江戸の半ば頃から文化の中心が江戸に移っていった。 ちなみに、江戸時代はじめ頃の大阪や京都を中心とした文化を [[元禄文化]](げんろくぶんか) と言う。元禄とは、この時代の元号が元禄(げんろく)なので。 * 俳句 5・7・5の口調で季節の様子を句にする<big>俳句</big>(はいく)は、<big>松尾芭蕉</big>(まつお ばしょう)によって生み出さえた。俳句は連歌が、もとになっている。 芭蕉は、 :「古池(ふるいけ)や 蛙(かわず)飛びこむ 水(みず)の音(おと)」 など多くの句を作りました。 また芭蕉は諸国を旅して、その観察した諸国の様子を<big>『奥の細道』</big>(おくの ほそみち)にまとめた。 * 絵画 [[ファイル:Beauty looking back.jpg|thumb|210px|『見返り美人図』 菱川師宣の筆。]] 絵画では、描かれる対象が町人や女性などのようすになり、それらの絵を版画(はんが)を利用して印刷する<big>浮世絵</big>(うきよえ)が、絵描きの<big>菱川師宣</big>(ひしかわ もろのぶ)によって広まりました。 絵画では浮世絵の他にも、装飾画の分野で尾形光琳(おがた こうりん)が活躍しました。 浮世絵は、貿易をとおして外国にも紹介され、ゴッホなどの西洋の画家にも影響をあたえた。 <gallery widths="500px" heights="500px"> 画像:Hiroshige Van Gogh 2.JPG|歌川広重の錦絵(左)と、ゴッホの模写(右) </gallery> <gallery widths="250px" heights="250px"> Image:Van Gogh - Portrait of Pere Tanguy 1887-8.JPG|ゴッホの作品。 人物の後ろに、浮世絵が描かれている。 </gallery> * 人形浄瑠璃 物語を、三味線などを伴奏にしてリズミカルに節をつけて、あやつり人形をうごかしながら語るという<big>人形浄瑠璃</big>(にんぎょうじょうるり)が元禄期の大阪や京都で、はやりました。 [[ファイル:Chikamatsu Monzaemon.jpg|thumb|近松門左衛門]] 人形浄瑠璃の脚本家である<big>近松門左衛門</big>(ちかまつ もんざえもん)が有名で、近松の作品には『曽根崎心中』(そねざきしんじゅう)や『国性爺合戦』(こくせんや かっせん)などがあります。 * 文芸 町人の生活をえがきた小説が好まれるようになった。町人など、庶民の様子をえがいた小説を 浮世草子(うきよぞうし) という。大阪の小説家の<big>井原西鶴</big>(いはらさいかく)が『日本永代蔵』(にほねいたいぐら)や『世間胸算用』(せけん むねさんよう)などを表した。 元禄文化のさかえた大阪は、商業のさかんな都市であり、町人の気風がつよく影響している。 ==== 江戸時代後半の文化 ==== 江戸時代の後半になると、文化は、江戸の町人が中心になった。この江戸時代後半の江戸を中心とした文化を 化生文化(かせいぶんか) という。 * 小説 作家の<big>十辺舎一九</big>(じゅぺんしゃ いっく)が東海道の旅行のようすを、おもしろおかしく書いて<big>『東海道中膝栗毛』</big>(とうかいどうちゅう ひざくりげ)を書いた。 滝沢馬琴(たきざわばきん)が『南総里見八犬伝』(なんそうさとみ はっけんでん)を書いた。 俳句は、与謝蕪村(よさ ぶそん)や小林一茶(こばやし いっさ)が発展させた。 :「雀の子(すずえのこ) そこのこ そこのけ お馬(おうま)が通る(とおる)」(小林一茶の句) * 絵画 鈴木晴信が版画の多色刷りの方法である 錦絵(にしきえ) を開発し、そのため、化生文化では浮世絵が大流行して、多くの絵描き(えかき)が出た。 喜多川歌麿(きたがわ うたまろ) :美人画(びじんが)で有名。 安藤広重(あんどう ひろしげ) :風景画で有名。 葛飾北斎(かつしか ほくさい) :風景画で有名。作品に『富嶽三十六景』(ふがく さんじゅうろっけい)など。 『富嶽三十六景』より、一部を紹介。 <gallery> ファイル:Nihonbashi bridge in Edo.jpg|『富嶽三十六景』 1. 江戸日本橋(えどにほんばし) ファイル:Lightnings below the summit.jpg|『富嶽三十六景』 32. 山下白雨(さんかはくう) ファイル:Red Fuji southern wind clear morning.jpg|『富嶽三十六景』 33. 凱風快晴(がいふうかいせい) </gallery> [[Image:Toshusai Sharaku- Otani Oniji, 1794.jpg|210px|thumb|役者絵。東洲斎写楽の筆。]] 東洲斎写楽(とうしゅうさい しゃらく) :役者絵(やくしゃえ)で有名で歌舞伎(かぶきやくしゃ)役者などを描いた。 このほか、各地の特産品や工芸品などが、江戸時代全般(ぜんぱん)を通して発展していきました。 {{clear}} === 注 === <references/> == 江戸幕府の終わり == === 外国船の出没(しゅつぼつ) === [[ファイル:Adam Kirillovich Laksman.jpg|thumb|left|200px|ロシアのラクスマン]] [[ファイル:Rezanov_np.jpg|right|thumb|200px|ロシアのレザノフ]] ロシアは勢力(せいりょく)を 千島(ちしま) や 樺太(からふと) にのばしていました。 1778年に、ロシアが蝦夷地(えぞち)の厚岸(あっけし)に来て、日本の松前藩(まつまえはん)に通商をもとめましたが、ことわられました。 寛政の改革のころの18世紀後半に、ヨーロッパやアメリカなど欧米では政治改革や産業の近代化がおこり、そのため欧米の国力が強まって、アジアへ進出してきました。このため日本の近くの海にも、欧米の船が出没しはじめます。 蘭学を学んでいた林子平(はやし しへい)は、書物の『海国兵団』(かいこくへいだん)を1791年に記し、日本は海岸をまもる必要性を人々にときましたが、幕府には世間をさわがせるものだとして林子平は処罰されてしまいます。 しかし、子平の言う通りへの状況(じょうきょう)に、このあとの時代は動いていくのです。 ロシアは、1792年に日本に貿易の通商(つうしょう)を求めるため日本に人を送り、根室(ねむろ、北海道)にロシア人の軍人(ぐんじん)の ラクスマン( ロシア語:Лаксман、英語: Laxman ) がきました。しかし、そもそも外交交渉は日本では長崎で行なうことになっているので、根室での通商の要求は、日本に断られました。日本側は、つぎの交渉では長崎で交渉するようにロシアに伝えます。 (※ レザノフやラクスマンの英語表記やロシア語表記は、小学生・中学生・高校生は、おぼえなくて良い。) 1804年にはロシア人の外交官(がいこうかん)のレザノフ( ロシア語: Резанов , 英語:Rezanov ) が日本の長崎に来て通商の要求をしますが、幕府は、ことわります。 幕府は、北方の海岸の警備(けいび)に力をいれます。また、<big>間宮林蔵</big>(まみやりんぞう)などに千島や樺太の探検を命じます。 また、<big>伊能忠敬</big>(いのうただたか)に、蝦夷地(えぞち、北海道)を測量させた。 レザノフの1804よりもさかのぼって、1796年にはイギリスが日本に来ていた。 [[ファイル:HMS Phaeton.jpg|thumb|right|240px|イギリスのフェートン号]] 1808年にはイギリスの軍艦(ぐんかん)のフェートン号が対立しているオランダ船をとらえるために長崎に侵入し、オランダ商館員を人質(ひとじち)にする事件があった。イギリス側は、薪水(しんすい、「たきぎ」と水のこと)と食料を要求し、これを得たのち、日本から退去(たいきょ)した。これを フェートン号事件(フェートンごう じけん) と言います。 1825年に<big>異国船打払令</big>(いこくせん うちはらいれい)を出した。 {{clear}} {{コラム|ヨーロッパのアジア侵略| :(※ 発展的分野です。<br>世界史(せかいし)的な内容になるので、小学校では教わらないのが、ふつうです。ですが、この節であつかう「アヘン戦争」は、中学校では確実にならうほどの、歴史的な重要事項です。読者に時間の余裕(よゆう)があったら、お読み下さい。) 日本が鎖国していたころ、ヨーロッパでは、科学技術がものすごく発達し、ヨーロッパの兵器の技術も発達していった。 19世紀のころ、産業の近代化などで国力をつけていたヨーロッパ諸国は、アジアとの貿易のしかたを変えるようになった。結論から分かりやすく言うと、ヨーロッパによるアジアへの侵略が始まっていった。 もっと、くわしく説明すると、つぎのような説明になる。 日本では戦国時代ごろだった16世紀ごろは、ヨーロッパは、貿易相手のアジアの国とは、あまり戦いをしなかった。だが、そのあと、ヨーロッパの近代化でヨーロッパの国力が強まったことで、ヨーロッパはアジアに対しても侵略的になっていく。 (アフリカや南米では、ヨーロッパは、すでに侵略的だった。) たとえば、直接、アジアと戦争をして領土を獲得して、領地で現地のアジア人を安い値段で働かせ農産物などを生産して、本国のヨーロッパに産物を輸出するようになった。 また、ヨーロッパの武力を背景に、戦争で負かしたアジア諸国の国政に干渉するようになった。 * イギリスのインド支配 1800年代のはじめごろ、イギリスはインドに進出していました。イギリスの支配は、だんだんと強まっていきます。イギリスに対する大きな反乱が、1857年には、おきました。(「セポイの乱」と言います。) ですが、イギリスは反乱を武力で平定し、そのあと、イギリスの支配をますますつよめ、インドを支配下におきました。 * イギリスのアヘン戦争(アヘンせんそう) [[ファイル:Destroying Chinese war junks, by E. Duncan (1843).jpg|thumb|300px|アヘン戦争(アヘンせんそう)で、イギリス海軍の軍艦に吹き飛ばされる清軍のジャンク船を描いた絵]] インドでの大反乱より昔になるが、1830年ごろ、イギリスはインドを中継として清国(シンこく)と貿易をしていました。 清(シン)は、この時代の中国大陸での中国の王朝です。 イギリスは、あまり輸出品が清(シン)には売れず、そのいっぽうで、清からは茶(ちゃ)などを多く輸入していました。このため、イギリスから支払いのための銀が多く流出しました。この銀の流出をいやがったイギリスが、貿易でかせごうと、支配していたインドで麻薬(まやく)のアヘンをつくり、アヘンを清にこっそりと輸出します。 このため、清には多くの麻薬中毒者(まやくちゅうどくしゃ)が出てきて、また、支払いのための銀が清から流出していきました。 清が、アヘンの輸入を取り締まり始めます。すると、イギリスは貿易の自由を口実にして、戦争を1840年にしかけました。これが<big>アヘン戦争</big>(アヘンせんそう)です。イギリスの海軍の軍艦で、清の船を破壊するなどして、清はなすすべがなくなり、戦争はイギリスの勝利でした。 戦争に負けた清は、不利な条約である 南京条約(ナンキンじょうやく) をむすばされ、多額の賠償金(ばいしょうきん)を支払わされ、また清は香港(ホンコン)をイギリスにゆずりわたすことになってしまいました。 日本にも、清の敗戦の知らせは、貿易相手のオランダなどを通して、幕府の上層部に伝わっていきました。 また、幕府のほかの民間の学者の中にも、アジアがヨーロッパに侵略されていってるという情勢(じょうせい)に気がつく者があらわれはじめてきます。 このあと、フランスなどの他のヨーロッパの国々も、イギリスのように、武力でアジアを支配するようになっていった。 }} 日本の幕府は、アヘン戦争での清(シン)の敗戦を知ったこともあり、異国船打払いの方針のままだと欧米と戦争になってしまい、日本が侵略されてしまう、と考え、1842年に異国船打払いの方針をあらため、外国船に薪(たきぎ)や水・食料を補給(ほきゅう)することをゆるしました。 === 黒船の来航 === [[ファイル:Commodore-Perry-Visit-Kanagawa-1854.jpg|thumb|300px|left|黒船来航]] [[ファイル:Matthew Calbraith Perry.jpg|thumb|300px|ペリー]] [[画像:Matthewperry.jpg|200px|thumb|日本の浮世絵に描かれたペリー。 嘉永7年(1854年)頃]] 1853年にアメリカ合衆国の4隻(よんせき)の軍艦(ぐんかん)が日本の浦賀(うらが、神奈川県の港)にあらわれ、4隻の軍艦をひきいたアメリカ人の<big>ペリー</big>(Perry)が開国を日本に求め、アメリカ大統領からの国書を幕府に、わたしました。 当時、日本に来た4隻のアメリカの船は、色が黒かったので、<big>黒船</big>(くろふね)と日本の人から言われました。 アメリカの軍艦は、蒸気船(じょうきせん)と言われるもので、石炭などを燃料とした蒸気機関によって動く最新式の船であり、船の煙突からは煙がもうもうとあがっていました。この蒸気船は、それまでのロシアやオランダの船の帆船とは違い、最新式の船でした。 ペリーは日本について事前にオランダの本などから研究していたので、日本人は権力者の命令に弱いということを知っており、わざと幕府のある江戸に近い関東の浦賀に黒船で、やってきたのです。当時の日本では、長崎が外国との外交の窓口でしたが、ペリー達はまったく長崎に行こうとはせず、幕府と直接に交渉をしようとする態度(たいど)です。 このようなアメリカの船と、ペリーの態度を見て、日本人はおどろきました。とりあえずペリーに、返事を出すまで時間がかかるので、一年後に、もう一度、日本に来てもらうように、たのみました。 黒船の来航のときの幕府の様子をからかった狂歌も歌われました。 :泰平(たいへい)の 眠り(ねむり)をさます じょうきせん たった四はい(しはい)で 夜(よる)も眠れず という狂歌です。 「じょうきせん」の意味には、蒸気船と、宇治(うじ)の高級茶の上喜撰(じょうきせん)が、ダジャレで、かけられています。 幕府は、事態(じたい)を重く考え、朝廷にも報告をして、諸国の大名にも相談をしました。相談のあいては、外様大名もふくみます。 いっぽう、アメリカが日本に開国をせまった目的は、燃料や水の補給(ほきゅう)を日本でおこなうために立ち寄りたいよいう理由が、主な目的でした。当時のアメリカは、中国大陸の清(しん)と貿易をおこなっていたり、太平洋で捕鯨(読み:「ほげい」・・・、意味:「クジラとり」のこと)を行っていたので、日本で補給が出来ると都合が良かったのです。 <br><br> そして1年後の1854年に、ペリーがふたたび、日本に来ました。1854年の交渉では、もはや幕府はアメリカの開国要求をことわりきれず、ついに日本は開国をします。 日本とアメリカとの間で条約がむすばれ、<big>日米和親条約</big>(にちべい わしんじょうやく)が結ばれ(むすばれ)ました。 「条約」とは、国とほかの国とのあいだの、国どうしの約束のことです。日本とアメリカ(米国、べいこく)とのあいだの条約なので、「日米和親条約」という名前になっているわけです。 この日米和親条約により、下田(しもだ、静岡県にある)と函館(はこだて、北海道)が開港され、アメリカ船に燃料や水・食料などを補給することが決まりました。また、下田にアメリカの領事館(りょうじかん)がおかれました。 [[ファイル:Townsend Harris.jpg|thumb|150px|left|ハリス]] [[ファイル:Ii Naosuke.jpg|thumb|right|250px|井伊直弼(いい なおすけ)]] アメリカの総領事(そうりょうじ)のハリス(Harris)は、幕府に対して、日本とアメリカとの貿易を求めた。 この日米和親条約を結ぶ前のときに、ハリスが交渉相手の日本にした説得(せっとく)の内容(ないよう)は、次のような内容です。ハリス本人の日記によると、「イギリスなどの戦争をためらわない外国から、不利な開国の要求を日本がおしつけらて、戦争をしかけられる前に、アメリカと開国の条約を結んだほうが安全である」とハリス本人の日記には書かれています。この時代、アメリカだけでなくイギリスなどのヨーロッパ諸国も蒸気機関によって、強力な海軍力を手にしていたのです。 ハリスは、次のように幕府の人を説得したと言っています。「もしヨーロッパの国が日本に戦争をしかけたら、日本は負けることになる。運よく、戦争にならなくても、ヨーロッパ諸国は軍事力でおどして、日本に不利な条約をおしつけるだろう。そうなれば、日本の民衆は、あなたたち幕府を見はなし、日本の力は弱まるだろう。しかし、わたしたちアメリカは、平和に日本と貿易しようとしている。ヨーロッパ諸国から不利な条約をおしつけられる前に、先にアメリカと日本とアメリカがおたがいに有利な条約をむすんでしまえば、ヨーロッパも日本に文句をつけられなくなる。交渉によって結ぶ条約と、戦争に負けておしつけられる条約とでは、その内容に大きな違い(ちがい)がある。どのみち、いつかは日本も開国をしないといけない。ならば、今こそ、その開国のときであろう。」というような説得を日本にしたとハリスは言っています。 すでに幕府は、オランダなどからの情報で、「清(しん)がアヘン戦争に負けて、イギリスから不利な条約を清はおしつけられている」という国際情勢を幕府も知っていました。幕府は、日本が欧米との戦争になり、日本が侵略されることを恐れていました。そのアヘン戦争のことを、ハリスも日本に言ってるわけです。 ヨーロッパの国によってアヘン戦争のような戦争を日本がしかけられてしまい、日本が不利な条約をおしつけられるよりも前に、さきにアメリカと日本とのあいだで平和な条約をむすんでしまいましょう、・・・という事です。 さらに、アメリカとの条約を1858年に幕府の大老の<big>井伊直弼</big>(いい なおすけ)は結びました。こうして、<big>日米修好通商条約</big>(にちべい しゅうこう つうしょう じょうやく)が結ばれます。しかし、この条約は朝廷の許可をとらないまま、結ばれた条約でした。 さて、また幕府は、イギリス・オランダ・ロシア・フランスとも、同様の貿易の条約を、結びました。これを、安政の五カ国条約(あんせいの ごかこくじょうやく)と言います。 幕府の井伊直弼による条約締結は、日本を欧米の侵略から守ろうとする考えのものでしたが、当時の庶民の多くは、まだ、欧米の強大な軍事力を知らず、幕府の態度は、臆病者(おくびょうもの)だと思われていました。 また、開国に反対の主張をしていた諸藩の武士たちを、幕府は弾圧していき捕らえて処刑などの処罰をしていきます。この鎖国派への弾圧を「安政の大獄」(あんせいのたいごく)と言います。 [[ファイル:Sakuradamon01s3200.jpg|250px|thumb|桜田門。]] のちの1860年、直弼は江戸城の桜田門(さくらだもん)の近くを通っていたときに、「安政の大獄」による弾圧に反対をしていた浪士(ろうし)によって、暗殺されてしまいます。この、井伊直弼が死んだ暗殺事件を「桜田門外の変」(さくらだもんがいの へん)と言います。 * 不平等条約(ふびょうどう じょうやく) 日米修好通商条約の内容は、日本にとって不利な内容で、不平等な条約でした。 :アメリカ人の治外法権(ちがい ほうけん)<br>日本国内で外国人が犯罪をおかしても、日本の法律では処罰(しょばつ)できませんでした。 この、アメリカ人など外国人が、日本の法律では処罰されないことを<big>治外法権</big>(ちがい ほうけん、英語:Extraterritoriality)と言います。<big>領事裁判権</big>(りょうじ さいばんけん)とも言います。 :日本に関税自主権(かんぜい じしゅけん)が無い。<br>日本への輸入品に、税をかける権利が、日本には、ありませんでした。輸入品にかける税を<big>関税</big>(かんぜい)と言い、国が関税を自由に決まる権利を<big>関税自主権</big>(かんぜい じしゅけん)と言います。日本には、関税自主権がありませんでした。 * 開国による経済の変化 :輸出品として、生糸(きいと)や茶が輸出されたので、それらの産業が発展しました。 :国内で品物が不足し、物価が上がりました。輸出によって、国外に品物を多く輸出し過ぎたり、買い占めなどが起こったからです。貿易をしていない米や麦の値段も上がりました。 :貿易によって、日本の金が流出しました。このため、幕府は金貨の質を下げたので、ますます物価は上がりました。 このような品不足や物価の上昇などにより、庶民のくらしは苦しくなっていきました。そのため 一揆(いっき) や 打ち壊し が起きました。 庶民だけでなく下級武士にも、開国に不満を持つ者が増えていきます。 世間から、外国を打ちはらおうとする考えが出てき始めます。このような、外国を打払いしようという考えを<big>攘夷</big>(じょうい)と言い、攘夷の主張を攘夷論(じょういろん)と言います。 攘夷論にくわわり、世間では、国学などの影響(えいきょう)もあって、朝廷や天皇を盛り上げて、敬おう(うやまおう)という、尊王論(そんのうろん)が出てきます。 尊王論と攘夷論が加わり、尊皇攘夷論(そんのうじょういろん)という、組み合わせた考えが出てきました。(のちに、尊皇攘夷論は、朝廷に許可を得ず勝手に開国した幕府への批判にかわり、やがて幕府を倒そうという運動へと変わっていきます。) 薩摩藩と長州藩は攘夷の実力行使に出ましたが、外国に負けました。 ・薩英戦争(さつえい せんそう) :1862年に関東の生麦(なまむぎ、神奈川県にある)で、薩摩藩の大名行列の前を横切ったイギリス人を薩摩藩の武士が斬り殺すという生麦事件(なまむぎ じけん)が起こりました。イギリスからの犯人の処罰要求を薩摩藩が受け入れなかったので、翌年の1863年にイギリスは薩摩藩と戦争をしました。これが薩英戦争(さつえい せんそう)です。この戦争で薩摩は負け、大きな被害を受け、薩摩はイギリスの実力を知ることになり、薩摩は攘夷論をあきらめることになりました。 戦後、薩摩では政治の方針を攘夷から切り替え、イギリスなどから制度を学んだりして、藩の強さを高める方針へと変わりました。そして薩摩藩では、下級武士であった西郷隆盛(さいごうたかもり)や大久保利通(おおくぼとしみち)らが、イギリスの援助も受けて、彼らが改革の中心になっていった。 ・長州藩(ちょうしゅうはん)の下関戦争(しものせきせんそう) [[ファイル:Choshu-Battery-Capture-Shimonoseki-1864.jpg|thumb|300px|欧米の連合艦隊の兵隊に占拠された下関の砲台]] :1863年に、下関海峡を通る外国船に、長州藩が、いきなり砲撃を始めました。翌年、外国の連合艦隊(れんごうかんたい)、アメリカ・イギリス・フランス・オランダの4カ国からなる連合軍により反撃を受け、下関の砲台を占拠され、長州は負けました。 長州は、攘夷論のマチガイに気づき、改革を進めていきます。下級武士であった高杉晋作や木戸孝允・伊藤博文らが、イギリスの援助も受けて、彼らが改革の中心になっていきます。 このようにして、薩摩や長州は、実戦から、欧米の実力を知ることに知ることになりました。単純な尊皇攘夷運動はマチガイだと気づくようになりました。まずは、軍隊の近代化が必要と考え、そのためには改革が必要であり、そのためには改革をさまたげている幕府を倒す必要があるという考えが高まりました。幕府を倒す、つまり、倒幕(とうばく)をする必要がある、という気運が薩摩や長州を中心に高まってきました。 * 薩長同盟(さっちょう どうめい) [[ファイル:Sakamoto Ryoma.jpg|thumb|200px|坂本竜馬(さかもと りょうま)]] 薩摩と長州は、過去の歴史的な関係から、両者は対立をしていました。薩摩藩も長州藩も、どちらとも近代的な軍隊を持ち幕府を倒そうとする改革を目指していたのに、両者は対立していました。 しかし、1866年に、土佐藩の<big>坂本竜馬</big>(さかもと りょうま)が両藩の仲立ちをして同盟を結ばせ、薩摩藩と長州藩との同名である<big>薩長同盟</big>(さっちょう どうめい)が1866年に結ばれました。 幕府は、薩長同盟を倒すため長州と戦争をしましたが、幕府の征伐は失敗に終わりました。 イギリスが薩摩や長州の支援をしていましたが、いっぽう、幕府はフランスの支援を受け、軍備や技術の改革をしていました。 {{clear}} * 大政奉還(たいせいほうかん) [[ファイル:Tokugawa yoshinobu.jpg|thumb|300px|徳川慶喜(とくがわ よしのぶ)]] 幕府の15代将軍・<big>徳川慶喜</big>(とくがわ よしのぶ)は、1867年に政権を朝廷にかえしました。土佐の藩主の山内豊信(やまのうち とよしげ)などが慶喜に朝廷に政権を返すことを助言しました。 この出来事のことを、つまり徳川幕府が朝廷に政権を返したことを<big>大政奉還</big>(たいせい ほうかん)と言います。 こうして、江戸幕府の約260年の時代は終わりました。 倒幕派は、幕府の再興をきらったので、政治を古来の天皇中心の政治にもどそうとして、<big>王政復古の大号令</big>(おうせいふっこの だいごうれい)を出した。 {{clear}} === 戊辰戦争(ぼしん せんそう) === [[ファイル:Boshin war.svg|thumb|400px|戊辰戦争(ぼしん せんそう)]] * 鳥羽伏見の戦い(とばふしみ の たたかい) 慶喜は、新政府から領地の一部を国に返すように命じら、また慶喜は政治への参加が認められなかった。旧幕府はこれに反発し、京都の鳥羽(とば)・伏見(ふしみ)で戦い1868年に起こし、旧幕府軍と新政府軍との戦いになった。この戦いを、鳥羽・伏見の戦い(とばふしみ の たたかい)と言う。この鳥羽伏見の戦いで幕府軍はやぶれた。 {{clear}} * 江戸城の無血開城(むけつ かいじょう) [[ファイル:Takamori Saigo.jpg|thumb|left|200px|西郷隆盛(さいごう たかもり)の想像図。エドアルド・キヨッソーネ作の版画(西郷の親戚を参考に想像で描写)]] [[ファイル:Kaishu Katsu 2.jpg|thumb|right|200px|勝海舟(かつ かいしゅう)]] 新政府軍は、鳥羽伏見の戦いで幕府軍をやぶり、西郷隆盛ひきいる新政府軍は江戸へと進み、江戸城を戦わずにして開城(かいじょう)させた。無血開城(むけつかいじょう)という。江戸城の開城の交渉では、倒幕派の西郷隆盛(さいごう たかもり)が、幕府の<big>勝海舟</big>(かつ かいしゅう)とが話し合った。 {{clear}} * 東北の平定と、北海道の平定 会津藩(あいづはん、今でいう福島県)は、江戸城の開城を不服とし、新政府軍とは対立した。また、東北の諸藩も、会津を支援した。江戸をおさえた新政府軍は北上し、会津藩の城を次々と落としていき平定していった。 [[画像:5ryokaku stereo.jpg|thumb|left|360px|五稜郭(ごりょうかく)の空中写真(1976年、国土航空写真)]] [[ファイル:Hakodate Goryokaku Panorama 1.JPG|thumb|300px|五稜郭(ごりょうかく)]] 旧幕府軍は、会津の他にもいたので、新政府軍は、さらに北上し、新政府軍は1869年に北海道の函館(はこだて)の五稜郭(ごりょうかく)にたてこもった幕府軍をやぶり、榎本武明(えのもと たけあき)らのひきいる旧幕府軍は負けをみとめ降伏(こうふく)した。この江戸の北上から五稜郭までの一連の戦争を<big>戊辰戦争</big>(ぼしんせんそう)という。 戊辰戦争が終わり、新政府軍は日本国内を平定した。 {{clear}} == 関連項目 == * 前へ戻る:[[中学受験社会/歴史/上巻]] * 次へ進む:[[中学受験社会/歴史/下巻]] {{デフォルトソート:ちゆうかくしゆけんれきし2}} [[Category:社会]] [[Category:中学受験参考書|れきし2]] {{カテゴリ準備|中学受験社会|小学校社会|ちゆうかくしゆけんれきし2|れきし2}} t1xsv4nia3jap42rys4ljyvuwq0t4x6 小学校社会/6学年/歴史編/上巻 0 28428 205602 203066 2022-07-21T02:09:36Z Artanisen 41776 /* {{Ruby|戦国|せんごく}}の世の統一 */ より良い画像= Toyotomi_Hideyoshi_c1598_Kodai-ji_Temple.png wikitext text/x-wiki {{Pathnav|メインページ|小学校・中学校・高等学校の学習|小学校の学習|小学校社会|小学校社会/6学年|小学校社会/6学年/歴史編|frame=1}}<!-- 当ページを編集される方は、学習指導要領解説社会編や検定教科書を参考に編集してください。また、小学生向けであることに留意してください。 --> このページでは、日本の歴史について、{{Ruby|安土桃山|あづちももやま}}時代までを学びましょう。{{Ruby|江戸|えど}}時代{{Ruby|以降|いこう}}についての{{ruby|下巻|げかん}}は[[小学校社会/6学年/歴史編/下巻|こちら]]です。 また、人物についてくわしく学ぶ「人物事典」は[[小学校社会/6学年/歴史編/人物事典|こちら]]です。政治や日本の世界へのかかわりについて学ぶ「政治・国際編」は[[小学校社会/6学年/政治・国際編|こちら]]です。 == はじめに == === 時代の表し方 === [[File:日本の時代の年表.png|450px|thumb|時代の流れ]] * 時代 ** 歴史学習で使う時代の表し方には、まず「時代」があります。これは、「{{ruby|奈良|なら}}時代」「{{ruby|江戸|えど}}時代」などと、大きなことがら(政治の{{Ruby|拠点|きょてん}}が移る,{{Ruby|天皇|てんのう}}が変わるなど)ごとに時代を変えていく表し方です。なお、室町時代のうち1392年までを「{{Ruby|南北朝|なんぼくちょう}}時代」、1467年{{Ruby|以降|いこう}}を「{{Ruby|戦国|せんごく}}時代」ということもあります。 * 西暦 ** {{ruby|西暦|せいれき}}は、[[w:イエス・キリスト|イエス・キリスト]]が生まれたとされる年を西暦1年として年を表す表し方です。現在は西暦{{CURRENTYEAR}}年です。 * 世紀 ** {{ruby|世紀|せいき}}とは、100年ごとに区切って年を数える単位です。西暦1年から西暦100年までが1世紀です。西暦101年から西暦200年までが2世紀です。西暦2001年から西暦2100年までを21世紀といいます。たとえば、105年は2世紀、1853年は19世紀です。 == 大昔の{{Ruby|暮|く}}らしとくにづくり == ;大昔の{{Ruby|暮|く}}らし [[File:Jomon Vessel with Flame-like Ornamentation, attributed provenance Umataka, Nagaoka-shi, Niigata, Jomon period, 3000-2000 BC - Tokyo National Museum - DSC05620.JPG|thumb|250px|縄文土器]] いまから1万5000年ほど前になると、{{ruby|氷河|ひょうが}}期が終わり、地球の気候があたたかくなりました。 そして、いまから1万2000年ほど前のころ、日本列島に住んでいる人たちは、海や川の近くに住んで、石や{{ruby|骨|ほね}}でつくった{{ruby|刃|は}}物や{{ruby|槍|やり}}や矢をつかって、シカやイノシシなどの動物を、とらえて食料にしていました。 同じころ、日本列島に住んでいた人たちは、'''{{ruby|土器|どき}}'''をつくるようになりました。その土器に縄の{{ruby|模様|もよう}}がついているので、この時代に作られた土器を {{ruby|縄文|じょうもん}}土器 といいます。 この土器は、食べ物を{{ruby|煮炊|にた}}きしたりするための、今でいう なべ のような物です。 今から約1万2000年前から約3,000年前までの時代のことを、 '''{{Ruby|縄文|じょうもん}}時代''' といいます。 [[File:Yoshinogari-iseki tateanashiki-juukyo.JPG|thumb|250px|right|弥生時代の竪穴住居の復元、{{ruby|佐賀|さが}}県{{ruby|吉野ヶ里|よしのがり}}遺跡]] 縄文時代の人の家の建物は、'''{{ruby|竪穴|たてあな}}住居''' といい地面に穴をほりさげたあとに、柱を立て、草ぶきの屋根をかけただけの住居にすんでいました。 [[File:Kasori midden preserve north.jpg|thumb|200px|加曽利貝塚、北貝{{ruby|層|そう}}断面]] 縄文時代の人の集落があったと思われる場所からは、多くの貝がらが{{ruby|発掘|はっくつ}}されています。 この貝がらが多く発掘された、集落だったと思われる場所を {{ruby|貝塚|かいづか}} といいます。貝塚からは、貝がら以外にも、動物の{{ruby|骨|ほね}}や、魚の骨などが出土することもよくあります。 なお、貝塚には、たとえば{{ruby|東京|とうきょう}}都の{{ruby|大森|おおもり}}貝塚や、{{ruby|福井|ふくい}}県の{{ruby|鳥浜|とりはま}}貝塚や、{{ruby|千葉|ちば}}県の{{ruby|加曽利|かそり}}貝塚などがあります。 なお、貝塚や石器などに限らず古い時代の物が見つかる場所のことを、 '''{{ruby|遺跡|いせき}}''' といいます。 遺跡などから出土する物によって、その時代の{{ruby|暮|く}}らしもわかります。 魚{{ruby|釣|つ}}りに必要な、「釣り{{ruby|針|ばり}}」と「もり」が、縄文時代の遺跡から出土することも多く、漁もしていたことがわかります。 なお、動物の骨は、とがらせて使うことが多く、とがらせたものを {{ruby|骨角器|こっかくき}} といいます。骨角器のようなとがった骨も出土することがあります。狩りなどで、槍の先の武器として使ったりすることが多かったものと思われます。 [[Image:JomonStatue.JPG|thumb|right|200px|土偶({{ruby|亀ヶ岡|かめがおか}}遺跡)]] 縄文の{{ruby|遺跡|いせき}}から、'''{{ruby|土偶|どぐう}}''' という、土を焼き固めた、女性のような形の人形が見つかる場合があります。 土偶は、食料が増えることや女性の安産をいのったものだと考えられています。 [[ファイル:Reconstructed Pillar Supported Structure.jpg|right|thumb|300px|六本柱建物(復元)]] {{ruby|青森|あおもり}}県の '''{{ruby|三内丸山遺跡|さんないまるやまいせき}}''' は、約5500年前から約1500年前の間の集落だったということがわかっています。 この三内丸山遺跡から、木を{{ruby|栽培|さいばい}}した{{ruby|形跡|けいせき}}が見つかっています。 つまり、すでにこの時代から農業をしていたことがわかります。 また、多くの土器や石器のあとも見つかっています。 大型の、{{ruby|掘立|ほった}}て柱も、見つかっています。掘立て柱の{{ruby|用途|ようと}}はまだ分かっていません。 ヒスイの玉や、{{ruby|黒曜石|こくようせき}}でできた{{ruby|刃|は}}物のようなものも見つかっています。 ヒスイは、この地ではとれず、新潟県の{{ruby|糸魚|いとい}}川などの他の土地でとれるので、他の{{ruby|地域|ちいき}}と交易があったのだろう、と考えられています。 この三内丸山遺跡は、縄文時代を知る遺跡として代表的な遺跡です。 {{ruby|縄文|じょうもん}}時代の次の時代は、{{ruby|弥生|やよい}}時代です。 ;{{ruby|弥生|やよい}}時代 '''~米づくりがはじまる~''' [[Image:YayoiJar.JPG|right|250px|thumb|{{ruby|弥生|やよい}}土器]] いまから2400年ぐらい前のころ、ユーラシア大陸や{{ruby|朝鮮|ちょうせん}}半島あたりの人々から、米による{{ruby|稲作|いなさく}}が、日本に伝わりました。 米作りは、まず西日本につたわり、西日本から東日本へと、米作りが広がっていき、東北地方にまで広がりました。 この時代の農具の多くは、まだ木製です。ただし、米作りとともに鉄器の技術も日本に伝わっているので、一部では鉄を用いた農具も見つかっています。 {{ruby|穂|ほ}}から米をとるときに、 {{ruby|石包丁|いしぼうちょう}} が、使われました。 * {{ruby|弥生|やよい}}土器 ** また、このころ、土器は、{{ruby|縄文|じょうもん}}土器よりも うすくて かたい '''{{ruby|弥生|やよい}}土器''' をつくるようになりました。「{{ruby|弥生|やよい}}」とは、学者が発見した場所が、{{ruby|東京|とうきょう}}の弥生町(現在の{{ruby|文京|ぶんきょう}}区)だったので、弥生の土器という意味で、「弥生土器」とよばれています。 ** 縄文土器と弥生土器の形のちがいについては、弥生時代のころには、土器をつくる技術が進歩したので、土器の形が かわったのだろう、と考えられています。 * {{ruby|高床|たかゆか}}倉庫 ** 米は、 '''{{ruby|高床|たかゆか}}倉庫''' で保管されていました。 高床倉庫が高いのは、ねずみ などの動物が入りづらくするためです。なお、風通しをよくするため、という理由も考えられます。ねずみの害を防ぐという理由の有力な{{ruby|根拠|こんきょ}}として、地面から床までの柱の、柱のてっぺんに、「かえし」がついていて、動物などが登れないように工夫した高床倉庫が見つかっています。 <gallery widths="200px" heights="200px"> Image:Takayukasikisouko.JPG|高床倉庫 妻側より(復元、{{ruby|神奈川|かながわ}}県、{{ruby|大塚|おおつか}}・{{ruby|歳勝土遺跡|さいかちどいせき}}) File:Yoshinogari-iseki takayukashiki-souko.JPG|高床倉庫(復元、{{ruby|佐賀|さが}}県{{ruby|吉野ヶ里遺跡|よしのがりいせき}}) </gallery> {{ruby|弥生|やよい}}時代の多くの住まいは、{{ruby|竪穴|たてあな}}住居です。 {{clear}} * 金属器 [[ファイル:DotakuBronzeBellLateYayoi3rdCenturyCE.jpg|thumb|銅鐸]] 大陸や{{ruby|朝鮮|ちょうせん}}半島から米作りがつたわるとともに、青銅器や鉄器などの金属器が、伝わります。そして、日本でも、弥生時代中に、金属器がつくられるようになりました。 青銅とは、銅 と すず(金属の1つ)を、とかしてまぜあわせた金属でつくられた、合金です。 青銅器には、銅{{ruby|剣|けん}}や、銅{{ruby|矛|ほこ}}、銅{{ruby|鐸|たく}}、銅{{ruby|鏡|きょう}}などが、あります。 <gallery widths="200px" heights="200px"> File:Koujindani Remains 03.JPG|銅矛とともに出土した銅鐸({{ruby|島根|しまね}}県・{{ruby|出雲|いづも}}市の{{ruby|荒神谷|こうじんだに}}遺跡)。{{ruby|古墳|こふん}}時代の遺跡。 ファイル:YayoiBronzeSpearTip1-2ndCenturyKyushu.jpg|弥生時代の銅矛(九州で出土、1~2世紀) </gallery> 青銅器は、おもに祭りに使われるようになります。 いっぽう、鉄器は、農具や武器などの実用品につかわれるようになります。 * {{ruby|登呂遺跡|とろいせき}} [[File:2004年08月25日竪02.JPG|thumb|240px|right|登呂遺跡。復元、竪穴住居。]] {{ruby|静岡|しずおか}}県にある、{{ruby|登呂遺跡|とろいせき}}からは、{{ruby|竪穴|たてあな}}住居と、{{ruby|高床|たかゆか}}倉庫が見つかっています。{{ruby|水田|すいでん}}のあともあります。 * {{ruby|吉野ケ里遺跡|よしのがりいせき}} [[File:Yoshinogari-iseki zenkei.JPG|thumb|440px|right|吉野ケ里遺跡,遠景]] {{ruby|佐賀|さが}}県にあります。 まわりを{{ruby|濠|ほり}}でかこまれた {{ruby|環壕|かんごう}}集落 です。 矢がささった{{ruby|人骨|じんこつ}}も見つかっています。これらのことから、人々のあいだで争いがあったことが予想できます。 濠の内側からは、多くの高床倉庫が見つかっています。 おそらくは、米作りによって、食料生産が増えたので人口が多くなって、 :それぞれの集落で、多くの人口を養うために米の生産量を増やす必要が生じて、 :そのため、土地や水が必要になり、 :集落どうしで、土地や水をめぐっての争いが起きたのだろうと思われています。 このような争いが、身分の差を作っていった理由の一つだとも、思われています。 この吉野ケ里遺跡は、弥生時代を知る遺跡として、代表的な遺跡です。 ;日本の統一へ * 邪馬台国 中国大陸の3世紀ごろの歴史書では、日本の3世紀ごろは、国の数が30あまりになっていることが分かりました。 そして、日本にはこれら30あまりの国をしたがえた {{ruby|邪馬台国|やまたいこく}} がありました。邪馬台国で、代表的な地位にあった人物は、'''{{ruby|卑弥呼|ひみこ}}''' という女性です。{{ruby|彼女|かのじょ}}の政治は、まじないやうらないによるものだったようです。 邪馬台国の場所は、わかっていません。 邪馬台国は、{{ruby|魏|ぎ}} に、外交の使いを送りました。 <!-- 「魏」という国名は、検定教科書に無く、範囲外だが、検定教科書どおりに「中国」というのも紛らわしいので(日本の中国・四国地方と混同の恐れあり)、本wikiでは「魏」を使う。なお、日本文教出版でこの時代を紹介し、chinaについては日本文教出版は「中国」と表記。東京書籍は他の時代だが「大陸」などで表現をゴマかす。 隋や唐について、光村は「中国(隋)」や「中国(唐)」の表記。--> [[File:King of Na gold seal.jpg|260px|thumb|left|金印。]] 57年、日本は、{{ruby|魏|ぎ}}の{{ruby|皇帝|こうてい}}から、'''金印'''などを受け取りました。 <!-- 日本文教出版『日本の歩み』検定教科書で、金印を紹介。 --> {{-}} ;{{ruby|古墳|こふん}}時代 [[画像:NintokuTomb.jpg|thumb|{{ruby|仁徳天皇陵|てんのうりょう}}と思われている{{ruby|大山|だいせん}}古墳。前方後円墳、{{ruby|大阪|おおさか}}府{{ruby|堺|さかい}}市]] 3世紀から4世紀ごろになると、王や{{ruby|豪族|ごうぞく}}をほうむる大きな墓がつくられはじめました。 このような、大きな王などをほうむった大きな墓を '''{{ruby|古墳|こふん}}'''といいます。 古墳は,特に{{ruby|近畿|きんき}}地方から{{ruby|瀬戸内海沿岸|せとないかいえんがん}}の{{ruby|地域|ちいき}}に見られます。 この、3世紀ごろから7世紀ごろの時代を '''古墳時代''' といいます。 古墳時代の文化のことを 古墳文化 といいます。 古墳には、いろいろな形のものがあります。円形に{{ruby|盛|も}}り上がった古墳を{{ruby|円墳|えんふん}}といいます。四角く盛り上がった古墳を{{ruby|方墳|ほうふん}} といいます。円墳と方墳があわさったような、かぎ{{ruby|穴|あな}}のような形の古墳を {{ruby|前方後円墳|ぜんぽうこうえんふん}} といいます。 {{ruby|大阪|おおさか}}府{{ruby|堺|さかい}}市にある {{ruby|大仙|だいせん}}(大山)古墳 は、日本で最大の面積の古墳です。 大仙古墳は、まわりが3重の{{ruby|濠|ほり}}で、かこまれています。 * 古墳の{{ruby|副葬|ふくそう}}品 [[File:KofunSoldier.jpg|thumb|left|140px|はにわ。{{ruby|武装|ぶそう}}男子立像({{ruby|群馬|ぐんま}}県{{ruby|太田|おおた}}市出土)]] [[画像:HaniwaHorse.JPG|thumb|190px|はにわ。(馬形{{ruby|埴輪|はにわ}})]] 古墳からは、鏡や玉、{{ruby|剣|つるぎ}}などの副葬品が発見されている。ほかにも、'''はにわ''' という、土を焼いて作られた人型や馬型などの置き物が発見されています。 {{clear}} ==== {{ruby|大和政権|やまとせいけん}} ==== {{ruby|奈良|なら}}県の{{ruby|大和|やまと}}地方には、大きな{{ruby|古墳|こふん}}が多く発見されています。このことからこの地方に、有力な勢力があったと考えられている。この地方の有力な{{ruby|豪族|ごうぞく}}たちの政治勢力を '''{{ruby|大和政権|やまとせいけん}}''' といいます。 この大和政権の政府を 大和{{ruby|朝廷|ちょうてい}} と言い、その最高{{ruby|権力|けんりょく}}者を {{ruby|大王|おおきみ}} といいます。 [[File:Inariyama sword.JPG|thumb|350px|right|真ん中の、{{ruby|縦|たて}}に長いものが、{{ruby|発掘|はっくつ}}された{{ruby|鉄剣|てっけん}}。]] {{ruby|埼玉|さいたま}}県の{{ruby|稲荷山|いなりやま}}古墳から見つかった{{ruby|鉄剣|てっけん}}には、「ワカタケル大王」という名が{{ruby|刻|きざ}}まれた文が発見されました。この文から、この地方の王は、ワカタケル大王に使えていたことがわかります。 {{ruby|熊本|くまもと}}県の {{ruby|江田船山|えだふなやま}}古墳 にも、一部が読めなくなっていましたが、「ワ□□□ル大王」という同じ名の刻まれた鉄刀があり、ワカタケル大王の支配する{{ruby|領域|りょういき}}が、{{ruby|関東|かんとう}}地方から{{ruby|九州|きゅうしゅう}}までの広い{{ruby|範囲|はんい}}におよんでいたことがわかります。 {{コラム|ヤマトタケルの物語| {{ruby|皇子|おうじ}}であるヤマトタケルノミコトは、{{ruby|武勇|ぶゆう}}にすぐれていました。かれは父の命令で九州に行き、{{ruby|朝廷|ちょうてい}}にしたがわない{{ruby|豪族|ごうぞく}}である クマソ をたおしました。 それから{{ruby|関東|かんとう}}に行き、広い野原で焼きうちにあってしまいましたが、きりぬけて、関東を{{ruby|征服|せいふく}}しました。 しかし、タケルは帰る{{ruby|途中|とちゅう}}で、病気で なくなりました。そして、タケルは大きな白い鳥になって、{{ruby|大和|やまと}}のほうへ飛んでいきました。 }} * {{ruby|仏教|ぶっきょう}}の伝来 また、{{ruby|仏教|ぶっきょう}}も、外国から伝わりました。538年に、{{ruby|朝鮮|ちょうせん}}半島の{{ruby|百済|くだら}}という国の王から、仏像や{{Ruby|経典|きょうてん}}が、日本の{{ruby|天皇|てんのう}}に送られました。 {{clear}} == {{ruby|天皇|てんのう}}を中心とした国づくり == ~{{ruby|聖徳太子|しょうとくたいし}}の登場~ {| class="wikitable" style="float:right" |+ {{ruby|聖徳太子|しょうとくたいし}} | 年 || 年{{ruby|齢|れい}} || {{ruby|行|おこな}}ったこと || 社会のできごと |- ! style="text-align: left;" colspan="4" | 6世紀 |- | || || || {{ruby|豪族|ごうぞく}}どうしが争う |- |574 || 1才 || 聖徳太子が生まれる || |- | || || || {{ruby|蘇我|そが}}氏が{{ruby|権力|けんりょく}}をにぎる |- |589 || || || {{ruby|隋|ずい}}が中国を統一する |- |593 || 20才 || 聖徳太子が{{ruby|摂政|せっせい}}になる || |- ! style="text-align: left;" colspan="4" |7世紀 |- |603 || 30才 || {{ruby|冠位十二階|かんいじゅうにかい}}を定める || |- |604 || 31才 || {{ruby|十七条|じゅうななじょう}}の{{ruby|憲法|けんぽう}}を定める || |- |607 || 34才 || {{ruby|小野妹子|おののいもこ}}を{{ruby|遣隋使|けんずいし}}として送る || |- |618 || || || {{ruby|隋|ずい}}がほろんで{{ruby|唐|とう}}になる |- |622 || 49才 || 聖徳太子がなくなる || |- |645 || || || {{ruby|大化|たいか}}の改新 |- |} <!-- ネットではデマで「今の検定教科書に『聖徳太子』の名前は無く、『厩戸王』になっている。」というデマがありますが、 日本文教出版、『日本の歩み 小学校の社会6上』、平成22年3月10日 検定済み版、平成25年2月10日発行、30ページ・31ページ、 東京書籍、『新しい社会6上』、27ページ、平成22年2月10日 検定済み版、平成26年1月15日 発行、27ページ、 光村書店、『社会6』、平成22年3月10日 検定版、平成26年2月5日 発行、32ページ、 などに、堂々と『聖徳太子』と書いてあります。デマに騙されないようにしましょう。 --> 日本では、6世紀ごろから、{{ruby|豪族|ごうぞく}}の{{ruby|影響力|えいきょうりょく}}が強まりました。豪族の{{ruby|反乱|はんらん}}や、豪族どうしの争いも起こり始めました。 この、豪族どうしの争いで、最終的に587年ごろ、{{ruby|蘇我馬子|そがのうまこ}}が勝ちました。 そして、女性である '''{{ruby|推古天皇|すいこてんのう}}''' による政治が行われましたが、蘇我氏の{{ruby|影響|えいきょう}}下にありました。 [[File:Prince Shotoku face2.svg|180px|thumb|聖徳太子]] '''{{ruby|聖徳太子|しょうとくたいし}}'''({{ruby|厩戸王|うまやどのおう}})は、おばの推古天皇の政治を{{ruby|補助|ほじょ}}する {{ruby|摂政|せっしょう}}という仕事につきました。 :※ なお当時、「摂政」という用語は無い。のちの時代に、幼少の天皇や女性天皇などを助ける仕事のことを「摂政」と呼ぶようになった。 聖徳太子は蘇我馬子と協力し、これらの{{ruby|改革|かいかく}}をすすめました。 聖徳太子らによる改革のひとつに、'''{{ruby|十七条|じゅうしちじょう}}の{{ruby|憲法|けんぽう}}'''の制定があります。 * 十七条の憲法 役人の心がまえを記したものです。豪族などに対して、役人としての心がまえを述べたものでしょう。 {| style="border:1px solid #777; background-color:#ffffff; width:100%; margin:0.25em 0" | style="padding:0.25em 0.5em" |'''十七条の憲法(要約)''' 1条 争いをやめ、なかよくしなさい。 2条 仏教を厚く保護しなさい。 3条 {{Ruby|天皇|てんのう}}の命令には{{ruby|従|したが}}いなさい。 5条 {{Ruby|裁判|さいばん}}は、公正に行いなさい。 12条 農民などの{{ruby|民|たみ}}から、勝手に税やみつぎ物をとってはいけません。 17条 重要なことを決めるときには、話し合いで決めなさい。 |} 聖徳太子らの行った重要な{{ruby|政策|せいさく}}には、外交政策もあります。ユーラシア大陸の一部を支配していた '''{{ruby|隋|ずい}}''' という国との外交です。 607年に、外交の使者として '''{{ruby|小野妹子|おののいもこ}}''' たちを 隋に送ります。この使者を '''{{ruby|遣隋使|けんずいし}}''' といいます。 なお、小野妹子は男だと考えられています。 外交の結果、日本は隋と国交を結びました。また、隋の文化や制度は日本よりも進んでいたので、日本は多くの文化や制度を取り入れました。 * {{ruby|冠位十二階|かんいじゅうにかい}}の制 聖徳太子らによる改革には、'''{{ruby|冠位十二階|かんいじゅうにかい}}の制'''というものもあります。これは、家がらに関係なく有能な役人を採用するための制度です。能力や手がらによって、役人に位が与えられます。位は、一代かぎりです。 役人の位を12{{ruby|段階|だんかい}}に分けたので、このような名前で{{ruby|呼|よ}}ばれます。 <!-- 東京書籍の教科書で、冠位十二階を紹介している。 --> * {{Ruby|法隆寺|ほうりゅうじ}}の{{Ruby|建立|こんりゅう}} [[ファイル:Horyu-ji08s3200.jpg|thumb|法隆寺。{{ruby|金堂|きんどう}}と{{ruby|五重塔|ごじゅうのとう}}]] [[File:Shakyamuni Triad Horyuji2.JPG|thumb|法隆寺の{{ruby|釈迦三尊像|しゃかさんぞんぞう}}(金堂)]] 聖徳太子は、607年に, 現在の{{ruby|奈良|なら}}県に{{Ruby|法隆寺|ほうりゅうじ}}を建てさせました。法隆寺は、現存する木造建築としては世界最古です。法隆寺は、1993年に世界文化{{ruby|遺産|いさん}}に登録されました。 ;さまざまな{{ruby|改革|かいかく}} 622年に、{{ruby|聖徳太子|しょうとくたいし}}が{{ruby|亡|な}}くなりました。聖徳太子の死後には、{{ruby|蘇我|そが}}氏の{{Ruby|権力|けんりょく}}が強まりました。 {{ruby|蘇我馬子|そがのうまこ}}も、626年に、なくなりました。 まず、蘇我馬子の子である{{ruby|蘇我蝦夷|そがのえみし}}の権力が強まりました。さらに、馬子の孫であり、蝦夷の子である 蘇我{{Ruby|入鹿|いるか}} の権力が強まりました。 '''645年'''に{{ruby|皇族|こうぞく}}の'''{{ruby|中大兄皇子|なかのおおえのおうじ}}'''と、{{ruby|豪族|ごうぞく}}の '''{{ruby|中臣鎌足|なかとみのかまたり}}''' との協力により、蘇我入鹿は殺害されました。蝦夷は、この事件を知り、自殺しました。 * {{Ruby|大化|たいか}}の{{Ruby|改新|かいしん}} このあと、中大兄皇子らが権力を取り、さまざまな政治{{Ruby|改革|かいかく}}を行いました。この改革を {{Ruby|大化|たいか}}の{{Ruby|改新|かいしん}} といいます。645年に元号を「大化」と定めたので、この一連の改革は大化の改新と呼ばれています。 「大化」という元号により、日本では、はじめて元号が定められました。これは、中国を手本としたものでした。 * {{Ruby|公地公民|こうちこうみん}} これまでは{{ruby|豪|ごう}}族や皇族たちが持っていた土地は、すべて朝廷のもの(朝廷が管理管理する)になりました。これを '''{{Ruby|公地公民|こうちこうみん}}''' といいます。 * {{Ruby|戸籍|こせき}}をつくる 人民の {{Ruby|戸籍|こせき}} を作り、それにもとづいて国が人々に土地を{{Ruby|与|あた}}え、仕事をさせました。 この当時の戸籍は、人民を1人ずつ、{{Ruby|公文書|こうぶんしょ}}に登録することで、住所や家族の名や年{{ruby|齢|れい}}、家の世帯主などを{{ruby|把握|はあく}}するためのものでした。 * {{Ruby|租|そ}}・{{Ruby|調|ちょう}}・{{ruby|庸|よう}} {| class="wikitable" style="float:right" |+ <span style="font-size: large;">{{ruby|一般|いっぱん}}の人々の{{ruby|負担|ふたん}}</span> ! colspan="2" | <span style="font-size: large;">種類</span> ||<span style="font-size: large;">内容</span> |- | rowspan="3" |<span style="font-size: large;"> 税 </span> |<span style="font-size: large;">{{Ruby|租|そ}}</span> |{{ruby|収穫|しゅうかく}}の約3~10%の{{ruby|稲|いね}}を{{ruby|納|おさ}}める。 |- |<span style="font-size: large;">調</span> |地方の特産物(糸、{{Ruby|絹|きぬ}}、わた、塩、<br />魚、海そう、鉄など)を納める。 |- |<span style="font-size: large;">庸</span> |都で年10日ほど働くか、布を納める。 |- | rowspan="1" |<span style="font-size: large;"> {{ruby|兵役|へいえき}} </span> |<span style="font-size: large;">{{ruby|防人|さきもり}}</span> |九州北部で兵士を3年行う。 |- |} 税の種類です。 :{{Ruby|租|そ}}とは、田の{{ruby|収穫|しゅうかく}}量の、約3~10%を、国に{{ruby|納|おさ}}める税です。 :{{Ruby|調|ちょう}}とは、地方の特産物を、国に納める税です。 :{{Ruby|庸|よう}}とは、都に出てきて年10日ほど働くか、布を納める税です このほかに、{{Ruby|防人|さきもり}}という、九州で兵士として{{ruby|警備|けいび}}を行う、{{Ruby|兵役|へいえき}}の仕事がありました。 この防人のつらさを歌った歌として、つぎのような歌が残っています。 <div style="border:1px solid #000000;">  '''さきもりの歌'''  (『{{Ruby|万葉集|まんようしゅう}}』より ) :: {{中付きルビ|3|唐|から|衣|ころも|裾|すそ}}に取りつき泣く子らを置きてそ来ぬや{{Ruby|母|おも}}なしにして ::(現代語{{Ruby|訳|やく}})唐衣のにすがって泣きつく子どもたちを、(防人に出るため)置いてきてしまったなあ。あの子たちには母もいないのに。 </div> {{clear}} * {{Ruby|大宝律令|たいほうりつりょう}} 701年に、 '''{{Ruby|大宝律令|たいほうりつりょう}}''' という、税金や都についての{{ruby|法律|ほうりつ}}が完成しました。 <!-- ※日本文教出版の教科書で、「大宝律令」という言葉が紹介されている。--> ;{{ruby|奈良|なら}}時代 [[File:Heijokyo.jpg|right|500px|平城京のイメージ図]] 710年に、都が{{ruby|奈良|なら}}の {{ruby|平城京|へいじょうきょう}} へと移りました。 この都が平城京にあった時代を '''{{ruby|奈良|なら}}時代''' といいます。 <!-- 厳密にはのちの794年に平安京に移る前に、長岡京に移っています。 --> 平城京は、{{ruby|碁盤|ごばん}}の目のように、区画が整理されています。 {{clear}} {{clear}} * 古事記と日本書紀 712年に『'''{{ruby|古事記|こじき}}'''』という{{Ruby|天皇家|てんのう}}や{{Ruby|貴族|きぞく}}などに伝わる、神話の時代をまとめた書がつくられました。 <!-- 日本文教出版の教科書で、古事記と日本書紀が紹介されている。--> 古事記には、神話の時代から{{Ruby|推古|すいこ}}天皇にいたるまでの出来事が書かれています。 また、日本の歴史書である『{{ruby|日本書紀|にほんしょき}}』が720年に完成しました。神話の時代の伝説から、7世紀末ごろの持統天皇に{{Ruby|至|いた}}るまでの国家と天皇の歴史について書いた書です。 {{clear}} === 大仏づくり === [[File:Daibutsu of Todaiji 3.jpg|thumb|right|300px|東大寺の大仏]] [[File:Emperor Shomu Face2.svg|thumb|聖武天皇]] 8世紀のなかごろ、都では病気が流行し、多くの死者が出たり、さらに、{{ruby|貴族|きぞく}}の{{Ruby|反乱|はんらん}}が起きたりしたため、世の中が混乱しました。 {{Ruby|仏教|ぶっきょう}}を信じた'''{{ruby|聖武天皇|しょうむてんのう}}'''は、仏教の力を借りて人々の不安をしずめ、社会を安定させようとしました。 まず741年に国(今でいう都道府県)ごとに {{ruby|国分寺|こくぶんじ}} を建てさせました。 都には {{ruby|東大寺|とうだいじ}}を建てさせ、そのなかに大仏を作らせました。 [[ファイル:Gyouki Face2.svg|thumb|行基]] このころ、'''{{ruby|行基|ぎょうき}}'''という{{ruby|僧|そう}}がいました。かれは、{{ruby|渡来人|とらいじん}}の子孫で、{{Ruby|民衆|みんしゅう}}のために用水の池や橋を造りながら、{{Ruby|諸国|しょこく}}をまわって教えを説いていたので、多くの人々にしたわれていました。 しかし、{{Ruby|朝廷|ちょうてい}}は、はじめは、行基の行動をとりしまりました。当時は、{{Ruby|民衆|みんしゅう}}への仏教の布教は禁止されていました。 朝廷からは、行基は{{Ruby|危険|きけん}}な人物だろうと思われていたのです。 大仏を作るのは、とても多くの労働力を必要とするので、朝廷には、人々の支持が必要でした。このため、民衆にしたわれていた僧の行基の活動を{{Ruby|認|みと}}めました。 {{-}} === {{Ruby|遣唐使|けんとうし}}と{{Ruby|鑑真|がんじん}} === 中国の{{Ruby|帝国|ていこく}}が{{Ruby|唐|とう}}に変わっても、かつての{{Ruby|遣隋使|けんずいし}}と同様に、日本から中国の唐に、外交の使者の {{Ruby|遣唐使|けんとうし}} を送りました。 遣唐使として有名な人物には、{{Ruby|阿倍仲麻呂|あべのなかまろ}} や、{{Ruby|吉備真備|きびのまきび}} などがいます。 <!--※ 安倍仲麻呂は、教育出版の教科書で、章末のコラムで名前を紹介している。また、日本文教出版の教科書で、阿倍仲麻呂や吉備真備の名前を紹介している。--> 阿倍仲麻呂は、日本に帰国するために乗った船が{{ruby|難破|なんぱ}}したため日本に帰国できず、最終的に唐の{{Ruby|皇帝|こうてい}}に仕えることになりました。 吉備真備は日本に帰れました。吉備真備は2回唐にわたり、2回とも日本に帰国できました。 * {{Ruby|鑑真|がんじん}} [[File:Jianzhen (Tōshōdai-ji, 2).jpg|thumb|鑑真]] 日本の朝廷らは、唐の有名な僧の '''{{Ruby|鑑真|がんじん}}''' に、日本でも仏教をひろめてほしいと、鑑真を日本へ招きました。これを受け、鑑真は日本へわたりましたが、5回も失敗し、6回目にようやく日本に着きました。6回目に日本についたころには、失明しました。 鑑真は、{{Ruby|奈良|なら}}に '''{{Ruby|唐招提寺|とうしょうだいじ}}''' を開き,そして多くの日本人の僧を育てました。 {{clear}} * 正倉院 [[Image:Shoso-in.jpg|thumb|300px|正倉院正倉]] [[Image:Azekura-dukuri JPN.JPG|thumb|right|230px|正倉院の宝物庫]] {{Ruby|東大寺|とうだいじ}}にある {{Ruby|正倉院|しょうそういん}} には、{{ruby|奈良|なら}}時代の美術品や、{{Ruby|聖武天皇|しょうむてんのう}}が愛用した道具などが{{Ruby|収|おさ}}められています。 ※「{{Ruby|螺鈿紫檀五絃琵|らでんしたんごげんのびわ}}」(図参照)や「{{Ruby|瑠璃杯|るりのつき}}」などの{{Ruby|宝物|ほうもつ}}も{{Ruby|保存|ほぞん}}されているのですが、画像を用意できません。外部サイトや参考書などで、画像を{{ruby|探|さが}}してください。 <gallery widths="250px"> Image:RED LACQUERED CABINET Shosoin N2.JPG|{{Ruby|赤漆文欟木御厨子|せきしつぶんかんぼくのおんずし}} Image:8Lobed Mirror Inlay Shosoin.jpg|{{Ruby|平螺鈿背八角鏡|へいらでんはいのはっかくきょう}} Image:Silver Backed Bronze Mirror Shosoin.JPG|{{Ruby|金銀山水八卦背八角鏡|きんぎんさんすいはっけはいのはっかくきょう}} Image:LADIES UNDER TREES SCREEN4th Shosoin.JPG|{{Ruby|鳥毛立女屏風|とりげりつじょのびょうぶ}}第4(部分) Image:ROCHECHI Screen Panel Shosoin NH44.JPG|{{Ruby|羊木臈纈屏風|ひつじきろうけちのびょうぶ}} Image:Silver Incense Burner Shosoin.JPG|{{Ruby|銀薫炉|ぎんのくんろ}} Image:Gold Silver Painted BOX Shosoin.JPG|{{Ruby|蘇芳地金銀絵箱蓋|すおうじきんぎんえのはこ}} </gallery> (これらはあくまで参考です。) * 万葉集 和歌をまとめた {{Ruby|万葉集|まんようしゅう}} が759年ごろから{{Ruby|編纂|へんさん}}されました。 {{Ruby|貴族|きぞく}}だけでなく、農民や{{Ruby|防人|さきもり}}など様々な身分の者が作ったと思われる和歌も{{Ruby|収録|しゅうろく}}されています。 合計で4500首の歌が収録されています。 {{clear}} == 貴族のくらしと文化 == ~{{ruby|貴族|きぞく}}がさかえた時代~ :{{Ruby|桓武天皇|かんむてんのう}}は794年に都を{{ruby|京都|きょうと}}の '''{{ruby|平安京|へいあんきょう}}''' にうつしました。 [[画像:HeiankyouMapJapanese.svg|800px]] 奈良から平安京への寺院の移転は禁止されました。 他にも、社会の変化で、もはや、{{ruby|公地公民|こうちこうみん}}による昔の政治がうまくいかなくなり、政治のしかたを改める必要もあったのだと思われます。 政治の中心地が平安京であった、約400年間の時代を '''{{Ruby|平安|へいあん}}時代''' といいます。 * {{Ruby|摂関|せっかん}}政治 9世紀の中ごろになると{{Ruby|藤原鎌足|ふじわらのかまたり}}({{ruby|中臣|なかとみの}}鎌足)の子孫の一族である '''藤原氏''' が、{{Ruby|権力|けんりょく}}を強めました。 藤原氏の一族は、代々、{{Ruby|娘|むすめ}}を{{ruby|天皇|てんのう}}の きさき(妻)にしています。 すると、藤原氏は天皇の母方の親せきということになるので、藤原一族の権力が強まる、という仕組みで、さらに権力を強めました。 [[File:Fujiwara no Michinaga Face2.svg|thumb|{{Ruby|藤原道長|ふじわらのみちなが}}]] 藤原氏は、天皇が{{Ruby|幼|おさな}}いときは、藤原氏の者が{{Ruby|摂政|せっしょう}}となり政治の{{ruby|実権|じっけん}}をにぎり、天皇が成人しても藤原氏は{{Ruby|関白|かんぱく}}という地位になり実権をにぎり、政治を行いつづける、という手法で権力を強めました。 <!-- 日本文教出版の教科書で、藤原の一族について「関白」という言葉が紹介されている。--> 道長は、次の歌をよみました。 '''「この世をば わが世とぞ思{{ruby|ふ|(う)}} {{ruby|望月|もちづき}}の 欠けたることも なしと思{{Ruby|へ|(え)}}ば」''' (この世は、望月(満月)のように欠けているものがなく、まるで{{ruby|私|わたし}}(道長)の物のようだ。) [[ファイル:Byodoin Phoenix Hall Uji 2009.jpg|300px|thumb|left|平等院鳳凰堂]] {{Ruby|道長|みちなが}}の子である {{ruby|藤原頼通|ふじわらのよりみち}} は、{{Ruby|京都|きょうと}}に '''{{Ruby|平等院鳳凰堂|びょうどういんほうおうどう}}''' を建てさせました。現在の10円玉の表面にもえがかれています。 [[ファイル:10JPY.JPG|thumb|現在の10円玉]] {{clear}} ;平安時代の文化 * {{ruby|遣唐使|けんとうし}}の中止と国風文化 {{ruby|菅原道真|すがわらのみちざね}}の進言により、894年に{{ruby|遣唐使|けんとうし}}が中止されました。 [[File:Sugawara Michizane.jpg|thumb|200px|菅原道真]] 遣唐使の廃止の理由は、すでに唐から多くのことを学んであること、ユーラシア大陸で{{Ruby|内乱|ないらん}}が多く唐が弱っていること、船の{{Ruby|遭難|そうなん}}など死の{{Ruby|危険|きけん}}が多く有能な人材の命を損ないかねないこと、{{Ruby|経済|けいざい}}的な{{Ruby|負担|ふたん}}が大きい、などです。 この遣唐使の廃止により、日本の{{中付きルビ|2|貴|き|族|ぞく}}文化では、だんだんユーラシア大陸の文化の{{ruby|影響|えいきょう}}がうすれたかわりに、{{ruby|国風文化|こくふうぶんか}}と{{ruby|呼|よ}}ばれる日本独自の貴族文化が{{Ruby|発展|はってん}}しました。 [[画像:Hiragana origin.svg|thumb|right|300px|漢字からひらがなへの変化]] * かな文字の発明 ひらがな や カタカナ などの '''かな文字''' が、平安時代に発明されました。 ひらがなは、漢字の形をくずして発明されました。カタカナは漢字の へん や つくり などの一部をもとに発明されました。 [[ファイル:Katakana origine.svg|thumb|left|300px|カタカナの由来]] {{clear}} ほかにも、歌集である'''{{Ruby|古今和歌集|こきんわかしゅう}}''' や '''{{Ruby|竹取物語|たけとりものがたり}}''' は、かな文字を用いた作品です。 * その他の文化 [[Image:Miniature Model of HigashiSanjoDono.jpg|thumb|375px|典型的な寝殿造である{{ruby|東三条殿|ひがしさんじょうどの}}の復元{{ruby|模型|もけい}}(京都}文化博物館) ---- 1. {{ruby|寝殿|しんでん}}、2. {{ruby|北対|きたのたい}}、3. {{Ruby|細殿|ほそどの}}、4. {{Ruby|東対|ひがしのたい}}、5. {{Ruby|東北対|ひがしきたのたい}}、6. {{ruby|侍所|さむらいどころ}}、7. {{ruby|渡殿|わたどの}}、8. {{Ruby|中門廊|ちゅうもんろう}}、9. {{ruby|釣殿|つりどの}}]] [[image:Abe Masahiro Portrait.png|thumb|left|150px|{{Ruby|江戸|えど}}時代の束帯]] [[File:十二単です.JPG|thumb|150px|left|十二単、京都{{Ruby|御所|ごしょ}}にて]] {{Ruby|平安|へいあん}}時代には、貴族の衣服({{Ruby|正装|せいそう}})が変わります。 男の{{ruby|貴族|きぞく}}の服は {{ruby|束帯|そくたい}} になり、女の貴族の服は {{ruby|十二単|じゅうにひとえ}} となりました。 <!-- 一部の教科書が、束帯および十二単について紹介している --> 貴族の住居の形が {{ruby|寝殿造|しんでんづくり}} になりました。 {{clear}} [[画像:Genji emaki azumaya.jpg|thumb|300px|right|大和絵『源氏物語絵巻』 <br> 源氏物語は人気作となり、絵巻物まで作られるほどになりました。この絵は、源氏物語の作品のなかの場面をえがいたものです。]] 文学の物語では『{{ruby|源氏|げんじ}}物語』という{{ruby|創作|そうさく}}の物語が、貴族である{{ruby|紫式部|むらさきしきぶ}}によって書かれました。貴族の「{{ruby|光源氏|ひかるげんじ}}」という人物を主人公にして貴族の{{ruby|恋愛|れんあい}}などを書いています。 「源氏物語{{ruby|絵巻|えまき}}」も{{ruby|描|えが}}かれました。 {{ruby|随|ずい}}筆では、貴族である{{ruby|清少納言|せいしょうなごん}}が『枕草子』を記しました。清少納言が、日常生活や自然を観察して、感想をつづったものです。 絵画には、日本の風景などを書いた {{ruby|大和絵|やまとえ}} が現れ、寝殿造の{{ruby|屋敷|やしき}}の{{ruby|屏風|びょうぶ}}や ふすま などに描かれました。さきほど紹介した源氏物語絵巻も、大和絵です。 <!-- 「大和絵」は、教育出版が紹介している --> {{clear}} == 武士の世の中へ == ;平安時代の武士たち 平安時代には、地方の{{ruby|豪族|ごうぞく}}たちが{{ruby|私有|しゆう}}地を広げていきました。 9世紀の中ごろから、豪族や有力な農民たちは、自分たちの土地や財産をまもるためには、兵力をたくわえました。一族の者や、手下の農民たちに{{ruby|武装|ぶそう}}させるようになりました。 このようにして、'''武士'''ができていきました。武士たちは、一族の かしら をリーダーとして、それぞれの一族ごとに 武士団 を結成しました。 * 平氏 [[ファイル:Taira no Kiyomori.jpg|thumb|200px|平清盛]] この時代に、{{ruby|天皇|てんのう}}の{{ruby|座|ざ}}をめぐって{{ruby|皇族|こうぞく}}どうしで{{ruby|権力|けんりょく}}争いが起きると、武士たちは、これらの戦いに加わりました。 その結果、 '''{{ruby|平清盛|たいらのきよもり}}'''の加わっていた '''{{ruby|平氏|へいし}}''' の側が勝利したので、清盛が権力をにぎっていきました。 そして1167年には、平清盛は、武士としては初めて {{ruby|太政大臣|だいじょうだいじん}} の位につきました。 平清盛は、清盛のむすめを、天皇の{{ruby|后|きさき}}(妻)にさせました。 このようにして、平氏の一族が、{{ruby|朝廷|ちょうてい}}での重要な役職を得ていき、権力を強めました。 [[File:Itsukushima Hiroshima.JPG|thumb|250px|厳島神社。平氏の一族は、一族の{{ruby|繁栄|はんえい}}を厳島神社に願った。{{ruby|国宝|こくほう}}。世界{{ruby|遺産|いさん}}。]] 清盛は 海の神をまつっている {{ruby|厳島|いつくしま}}神社 を{{ruby|敬|うやま}}いました。厳島神社は、今でいう{{ruby|広島|ひろしま}}県の{{ruby|瀬戸内海|せとないかい}}の側にあります。 そして厳島神社の神を、平氏一族がまつるべき{{ruby|氏神|うじがみ}}としました。 しかし、平氏の{{ruby|独裁|どくさい}}的な政治に、ほかの貴族やほかの武士などからの不満が高まっていきました。 それらがのちに、平氏をたおすことへとつながりました。 * {{ruby|源氏|げんじ}}と{{ruby|平氏|へいし}}の戦い ついに1180年、{{ruby|皇族|こうぞく}}は、{{ruby|平氏|へいし}}をほろぼすように命令を下しました。 [[File:Minamoto2.jpg|thumb|250px|源頼朝と伝えられる人物 :頼朝が子供のころ、{{ruby|平治|へいじ}}の{{ruby|乱|らん}}で頼朝の父の{{ruby|義朝|よしとも}}が平氏と戦って敗北したので、小さいころに源頼朝は、伊豆に流されていた。やがて成人して大人になった頼朝が、平氏への反乱をした。]] {| class="wikitable" style="float:right" |+ 源氏と平氏の戦い ! 年 !! おもなできごと |- | 1180 || 源頼朝が{{ruby|伊豆|いず}}(現在の{{ruby|静岡|しずおか}}県)で挙兵するが、{{ruby|石橋山|いしばしやま}}の戦い で平氏にやぶれる<br>  源頼朝が富士川の戦いで平氏をやぶる |- | 1181 || {{ruby|平清盛|たいらのきよもり}}がなくなる |- | 1183 || {{ruby|源義仲|みなもとのよしなか}}が、{{ruby|倶利伽羅峠|くりからとうげ}}の戦いで平氏をやぶる |- | 1184 || {{ruby|源義経|みなもとの よしつね}}が {{ruby|一ノ谷|いちのたに}}の戦い で平氏をやぶる |- | 1185 || 源義経が{{ruby|八島|やしま}}の戦いで平氏をやぶる <br> 源義経が{{ruby|壇ノ浦|だんのうら}}の戦いで平氏をやぶる <br> 平氏がほろびる |- |} {{-}} * {{ruby|源平|げんぺい}}の戦い {{ruby|源頼朝|みなもとのよりとも}} は、関東で兵をあげました。{{ruby|富士|ふじ}}川の戦いで平氏をやぶったあと、頼朝は関東の{{ruby|鎌倉|かまくら}}に、とどまって、勢力の{{ruby|基盤|きばん}}をかためました。 そして頼朝は、平氏に不満をもっている武士の{{ruby|北条氏|ほうじょうし}}など関東の武士とも協力して、勢力をのばしていきました。 頼朝は、自らは鎌倉にとどまり、代わりに弟の '''{{ruby|源義経|みなもとのよしつね}}''' の兵を借りて、平氏を西へと追いつめていきました。 1185年、{{ruby|源義経|みなもとのよしつね}}らはついに本州の西の{{ruby|端|はし}}である今の{{ruby|山口|やまぐち}}県の{{ruby|下関|しものせき}}で起こった {{Ruby|壇ノ浦|だんのうら}}の戦いで、ついに平氏をほろぼしました。 これらの源氏と平氏との一連の戦いを「{{ruby|源平|げんぺい}}の戦い」あるいは「源平合戦」といいます。 [[File:Minamoto no Yoshitsune Face2.svg|thumb|源義経]] ;{{ruby|鎌倉|かまくら}}時代 {{ruby|平氏|へいし}}の{{ruby|滅亡|めつぼう}}後、頼朝が{{ruby|朝廷|ちょうてい}}に要求したことより、新しい制度として、国ごとに守護が1人ずつ置かれ、{{ruby|荘園|しょうえん}}や公領には '''{{ruby|地頭|じとう}}''' が置かれました。 守護の{{ruby|役割|やくわり}}は、その国の軍や{{ruby|警察|けいさつ}}の管理者でした。地頭の役割は、{{ruby|荘園|しょうえん}}および公領の管理や、税である{{ruby|年貢|ねんぐ}}の取り立てでした。 頼朝は1185(1192)年に朝廷から '''{{ruby|征夷大将軍|せいいたいしょうぐん}}''' に任命されました。 頼朝は{{ruby|鎌倉|かまくら}}(現在の{{ruby|神奈川|かながわ}}県)に、武家による政治の{{ruby|拠点|きょてん}}である {{ruby|鎌倉幕府|かまくらばくふ}}を開きました。鎌倉に幕府があった時代を '''{{ruby|鎌倉|かまくら}}時代''' といいます。 この鎌倉時代から、政治の{{ruby|権力|けんりょく}}が朝廷から幕府へと移っていき、武家政治の時代となっていきました。 幕府の行政の仕組みは、朝廷による制度とは {{ruby|異|こと}}なります。 {{ruby|将軍|しょうぐん}}の家来の武士のことを '''{{ruby|御家人|ごけにん}}''' といいます。 将軍は、「'''ご{{ruby|恩|おん}}'''」と{{ruby|呼|よ}}ばれる、御家人たちの土地の{{ruby|権利|けんり}}を保証する{{ruby|政策|せいさく}}をとるかわりに、{{ruby|奉公|ほうこう}}と呼ばれる、御家人たちは将軍のために{{ruby|警備|けいび}}を行ったり、戦争の時には戦ったりするという{{ruby|主従|しゅじゅう}}関係を、 '''ご恩と奉公''' といいます。 [[File:ご恩と奉公.svg|thumb|400px|ご恩と奉公]] 「'''いざ{{ruby|鎌倉|かまくら}}'''」といって、御家人は戦いが起きれば、すぐに鎌倉へと行って将軍に指示を聞き、将軍のために戦うべき、とされていました。<!-- 東京書籍などが紹介 --> この主従関係は、土地を仲立ちとしています。 御家人たちの{{ruby|屋敷|やしき}}は、{{ruby|武家造|ぶけづくり}}という作りで、屋敷のまわりに{{ruby|堀|ほり}}があったり、{{ruby|塀|へい}}で囲まれていたりと、戦いにそなえたつくりになっています。 「{{ruby|一所懸命|いっしょけんめい}}」という言葉がありますが、これは、御家人たちが自分たちの領地を守るために命がけで戦う様子からできた言葉です。なお、これが転じて「{{ruby|一生|いっしょう}}懸命」となりました。 [[ファイル:Hojo Masako.jpg|thumb|200px|北条政子({{ruby|菊池容斎|きくちようさい}} 画、{{ruby|江戸|えど}}時代)]] 頼朝の死後は、頼朝の長男である{{ruby|頼家|よりいえ}}が次の{{ruby|将軍|しょうぐん}}となり、さらに次の将軍は頼朝の次男である{{ruby|実朝|さねとも}}となりましたが、幕府の{{ruby|実権|じっけん}}は、有力な御家人である北条氏の一族がにぎっていました。頼朝の妻は '''{{ruby|北条政子|ほうじょう まさこ}}''' で、その父である {{ruby|北条時政|ほうじょうときまさ}} が {{ruby|執権|しっけん}} という役職につき、北条時政らが幕府の実権をにぎりました。 北条氏のように、執権として政治の実権をにぎる政治の方法を {{ruby|執権|しっけん}}政治 といいます。 * {{ruby|承久|じょうきゅう}}の{{ruby|乱|らん}} 頼朝の死後、1221年に{{ruby|朝廷|ちょうてい}}は、政治の{{ruby|実権|じっけん}}を武士から取りかえそうとして、幕府をたおせという命令を出しました。 このとき、{{ruby|北条政子|ほうじょうまさこ}}は、武士たちに、「あなたたちに頼朝があたえたご{{ruby|恩|おん}}は、山よりも高く、海よりも深いものです。その恩にむくいようとするものは、力を合わせて{{ruby|敵軍|てきぐん}}をうちとり、{{ruby|幕府|ばくふ}}をまもるでしょう。」と、武士たちによびかけ、武士たちをまとめた。 この結果、北条氏の幕府軍と、朝廷の軍との戦争になり、北条氏の側が勝利しました。 そして、幕府の権力は、{{ruby|朝廷|ちょうてい}}をしのぐほどになりました。 また、幕府は、武士のための{{ruby|法律|ほうりつ}}をととのえました。 * 武士のくらし [[Image:Yabusame 02.jpg|thumb|やぶさめ]] 武士は、日ごろから [[w:流鏑馬|やぶさめ]] などの武芸にはげんでいました。「やぶさめ」とは、馬にのって走りながら、いくつもある板の的をつぎつぎに{{ruby|射|い}}る武芸のことです。 {{-}} * モンゴルとの戦い * モンゴル{{ruby|帝国|ていこく}}の{{ruby|元|もと}} 13世紀、中国をふくむユーラシア大陸の広い{{ruby|地域|ちいき}}では モンゴル民族が モンゴル{{ruby|帝国|ていこく}}を築いていました。 モンゴル帝国はユーラシア大陸を制圧すると、モンゴルの国号(国名)を {{ruby|元|げん}} に変えました。 * {{ruby|元寇|げんこう}} モンゴルは、まず{{ruby|朝鮮|ちょうせん}}をしたがえました。つづいて、日本にも、モンゴルに{{ruby|従|したが}}えと、元は使者を日本によこしました。 しかし、ときの{{ruby|執権|しっけん}}であった{{ruby|北条時宗|ほうじょうときむね}}は、これを断りました。 そして、元は、1274年と1281年の2度にわたって、軍隊とともに日本にせめこみました。 最終的には暴風雨のえいきょうにより元軍が引き上げたので日本が勝利しましたが、元との戦いでは元軍の火薬を用いた新兵器(日本では「てつはう」と{{ruby|呼|よ}}ばれた)、毒矢、元軍の集団戦に苦戦しました。 [[ファイル:Mōko Shūrai Ekotoba.jpg|thumb|700px|1274年のモンゴル軍の{{ruby|襲来|しゅうらい}}において、矢が飛びかい、てつはうが{{ruby|炸裂|さくれつ}}する中を、モンゴル軍へこうげきする御家人の {{ruby|竹崎季長|たけさきすえなが}} と、応戦・{{ruby|逃亡|とうぼう}}するモンゴル兵]] 右の合戦の絵は、{{ruby|蒙古襲来絵詞|もうこしゅうらいえことば}}という絵巻物の一部の絵です。 「蒙古」とはモンゴルのことです。 {{clear}} 1度目の戦いのあと、幕府は次のモンゴル軍がせめこんでくるのに備え、今の{{ruby|福岡|ふくおか}}県にある{{ruby|博多|はかた}}湾の{{ruby|沿岸|えんがん}}に こうげきを防ぐための{{ruby|石垣|いしがき}}である'''{{ruby|石塁|せきるい}}'''を築かせました。 1281年に、元の軍勢は、14万人もの大軍を率いてふたたび日本に おそいかかりましたが、日本が勝利しました。 この2度の元軍の{{ruby|襲来|しゅうらい}}を あわせて '''{{ruby|元寇|げんこう}}''' といいます。 御家人は元寇で多くの費用を使いましたが、幕府は ご{{ruby|恩|おん}}としてのほうびの土地を、十分に用意できなかったので、{{ruby|御家人|ごけにん}}は{{ruby|幕府|ばくふ}}に不満を持つようになりました。 * その他 {{ruby|鎌倉|かまくら}}時代には、{{ruby|彫刻|ちょうこく}}で {{ruby|金剛力士像|こんごうりきしぞう}}がつくられました。<!-- 教育出版の教科書で紹介している--> ※金剛力士像の画像が用意できないので、ここには画像をのせません。 金剛力士像は、{{ruby|奈良|なら}}県の{{ruby|東大寺|とうだいじ}}の{{ruby|南大門|なんだいもん}}にあります。 {{-}} == 今に伝わる室町文化 == [[File:Kinkaku Yoshimitsu2.svg|thumb|left|300px|金閣と足利義満]] [[File:Ginkaku yoshimasa2.svg|thumb|center|300px|銀閣と足利義政]] <!-- 検定教科書に「鹿苑寺」や「慈照寺」などの名称は無いです。「金閣」「銀閣」のみです。東京書籍『新しい社会6』、光村書店『社会6』および、日本文教出版『日本の歩み 小学生の社会6上』で確認。 --> {{-}} 1336年、今の{{ruby|京都|きょうと}}の{{Ruby|室町|むろまち}}に{{ruby|室町|むろまち}}幕府ができました。 1394年、室町幕府の3代{{ruby|将軍|しょうぐん}}である{{ruby|足利義満|あしかがよしみつ}}は、京都の{{Ruby|北山|きたやま}}に '''{{Ruby|金閣|きんかく}}''' を建てました。金閣には、金ぱくがはられています。 1482年、室町幕府の8代将軍である{{Ruby|足利義政|あしかがよしまさ}}は、京都の{{Ruby|東山|ひがしやま}}に '''{{ruby|銀閣|ぎんかく}}''' を建てました。銀閣には、銀ぱくは はられていません。 {{-}} * 生活 [[File:Tukinami huuzoku taue.jpg|thumb|400px|室町時代の田植えの様子。『{{ruby|月次風俗図屏風|つきなみふうぞくずびょうぶ}}』より]] 色々な村で、用水路や共用地の管理など村の運営のしかたについて、寺社などに集まって自主的に相談しあって決めるようにするなど、農民どうしの集まりが開かれるようになりました。 室町時代には、農民は、{{Ruby|厳|きび}}しい領主に対しては、集団で対立するようになりました。 {{ruby|年貢|ねんぐ}}が重い場合は、集団で領主におしかけてうったえでたり、全員が村から{{ruby|逃亡|とうぼう}}したりして{{ruby|対抗|たいこう}}しました。 {{-}} * 室町文化 * {{Ruby|書院造|しょいんづくり}} [[File:Takagike Kashihara JPN 001.jpg|thumb|400px|書院造]] '''{{Ruby|書院造|しょいんづくり}}'''という、和室の様式が出てきました。 特ちょうは、 * {{ruby|違|ちが}}い{{ruby|棚|だな}}という、{{ruby|段差|だんさ}}になった棚がある * {{ruby|障子|しょうじ}}やふすまがある * {{ruby|畳|たたみ}}の{{ruby|床|ゆか}}がある などです。 これが、今の和室の様式につながっています。 * 水墨画 [[ファイル:SesshuToyo.jpg|left|thumb|180px|水墨画。秋冬山水図のうち秋景(東京国立博物館)]] [[ファイル:Portrait of Sesshu.jpg|thumb|220px|雪舟]] 鎌倉時代に、中国から '''{{ruby|水墨画|すいぼくが}}''' の技法が日本に伝わりました。 はじめ日本では、水墨画は、仏教の世界をえがくためにえがかれました。 しかし、室町時代になり、{{ruby|雪舟|せっしゅう}}は、水墨画と仏教を分けて考え、仏教にとらわれずに、自然の風景などの水墨画をえがきました。 {{コラム|雪舟|雪舟は、{{ruby|幼|おさな}}いとき、今の{{ruby|岡山|おかやま}}県の{{ruby|興福寺|こうふくじ}}に{{ruby|預|あず}}けられていました。しかし雪舟はそこで{{ruby|修行|しゅぎょう}}をせず絵ばかりかいていました。そこでおこった{{ruby|和尚|おしょう}}は雪舟を柱にしばりつけました。しばらくして和尚が様子を見に行くと、雪舟の足元にねずみがいたので、追いはらおうとしましたが、ねずみは動きません。雪舟が、なみだでかいたねずみだったのです。和尚は、それ{{ruby|以降|いこう}}、絵をかくのを{{Ruby|認|みと}}めました。}} [[File:Sesshu - View of Ama-no-Hashidate.jpg|thumb|600px|雪舟の水墨画、『{{ruby|天橋立図|あまのはしだてず}}』]] {{-}} * 茶の湯 書院造の部屋で、おちついた作法にしたがって茶を飲む、'''{{ruby|茶|ちゃ}}の{{ruby|湯|ゆ}}'''が始まりました。茶の湯は、今でも{{ruby|茶道|さどう}}として、受けつがれています。 * {{Ruby|能|のう}} {{ruby|観阿弥|かんあみ}}と{{Ruby|世阿弥|ぜあみ}}の親子が、芸能のひとつである '''{{ruby|能|のう}}''' を形成しました。 {{clear}} == {{Ruby|戦国|せんごく}}の世の統一 == * {{ruby|鉄砲|てっぽう}}とキリスト教の伝来 {{-}} * {{ruby|鉄砲|てっぽう}} [[ファイル:Arquebus.jpg|thumb|right|300px|種子島{{ruby|火縄銃|ひなわじゅう}}<br>当時の鉄砲は,つつ先から火薬とたまをいれるものでした。なお,たまがとどくきょりは,100mほどだといわれています。]] 1543年に,現在の鹿児島県の島である{{ruby|種子島|たねがしま}}に,ポルトガル人を乗せた船が流れ着きました。 このとき, ポルトガル人から'''{{ruby|鉄砲|てっぽう}}'''が日本に伝わりました。それまでの日本では鉄砲は知られておらず, 日本にとっては鉄砲は新しい兵器でした。 やがて日本の各地に鉄砲の情報が広がり、大量に鉄砲が作られるようになりました。 鉄砲が日本に伝わってから少しあとのころ,キリスト教が日本に伝わりました。 [[File:Xabier face2.svg|thumb|250px|ザビエル]] 1549年にはスペイン人の{{ruby|宣教師|せんきょうし}}である'''ザビエル'''が日本の{{ruby|鹿児島|かごしま}}に来て,'''キリスト教'''を伝えました。 そのあと,他の宣教師も,次々と日本にやってきました。 宣教師は,日本とヨーロッパとのあいだの貿易の世話もしたので,大名たち(特に西日本)の中にはキリスト教を保護する者もいました。 このようなことをきっかけに,日本は,ポルトガルやスペインとの貿易を始めました。ポルトガル人・スペイン人の商船が,{{Ruby|九州|きゅうしゅう}}の{{ruby|長崎|ながさき}}や{{ruby|平戸|ひらど}}や,{{ruby|大阪|おおさか}}の{{ruby|堺|さかい}}の港などを{{ruby|訪|おとず}}れて貿易をするようになりました。 ;天下統一へ ~'''織田信長・豊臣秀吉・徳川家康'''~ * 織田信長 * 桶狭間の戦い [[File:Odanobunaga.jpg|250px|thumb|織田信長]] [[File:Sengoku period 1565.png|thumb|500px|1565年の領地の様子]] <!-- ※教育出版の教科書に書いてあります。 --> {{ruby|戦国|せんごく}}時代には各地に大名がおり,多くの大名どうしが争っていた。1560年{{ruby|以降|いこう}}から,まず,{{ruby|尾張|おわり}}(現在の愛知県の西部)の大名であった '''{{ruby|織田信長|おだのぶなが}}'''が勢力を{{ruby|拡大|かくだい}}し始めました。 1560年に,愛知県にいる織田の領地に,となりの静岡県の{{ruby|今川義元|いまがわよしもと}}がせめこみ、{{ruby|桶狭間|おけはざま}}の戦い が起こりました。 この戦いで,今川義元を織田らの軍が{{ruby|討|う}}ち取り,今川義元は{{ruby|亡|な}}くなりました。このため,今川軍は命令の{{ruby|系統|けいとう}}がくずれてしまい,敗北しました。 桶狭間の戦い以降,信長は西へと勢力を拡大しました。1568年には,{{ruby|室町幕府|むろまちばくふ}}の{{ruby|足利|あしかが}}氏の一族である{{ruby|足利義昭|あしかがよしあき}}を{{ruby|支援|しえん}}して京都に入りました。義昭はのちに,室町幕府の15代{{ruby|将軍|しょうぐん}}となりました。 1569年,信長は,キリスト教の{{ruby|宣教師|せんきょうし}}と初めて出会い,かれにキリスト教の布教を許可しました。信長本人はキリスト教の信者ではなく,信長のねらいは宣教師のもたらす情報などがねらい,あるいは当時に信長と{{ruby|敵対|てきたい}}していた仏教勢力への{{ruby|対策|たいさく}}などと,いっぱんに言われています。 1571年には, 仏教勢力である{{ruby|延暦寺|えんりゃくじ}}が織田を{{Ruby|裏|うら}}切ったことから、織田信長は,{{ruby|比叡山延暦寺|ひえいざんえんりゃくじ}} を焼き{{ruby|討|う}}ちにしました。 <!-- ※ 日本文教出版の教科書『日本のあゆみ』で,延暦寺の焼き討ちなどを紹介しています。 --> そして,1573年ごろ,室町幕府は ほろびました。 * 長篠の戦い [[File:Battle of Nagashino word2.svg|700px|thumb|長篠の戦い。左側が織田・徳川の連合軍。右側が武田軍。]] 1575年に{{ruby|三河|みかわ}}(現在の{{ruby|愛知|あいち}}県の東部)で、{{ruby|織田|おだ}}・{{ruby|徳川|とくがわ}}の{{ruby|同盟|どうめい}}と,{{ruby|甲斐|かい}}の大名の{{ruby|武田勝頼|たけだかつより}}らの戦争である '''{{ruby|長篠|ながしの}}の戦い'''が起きました。この戦いでは,織田・徳川の同盟が勝利し,武田は敗北しました。 {{-}} {{Clear}} * {{Ruby|安土城|あづちじょう}} <!-- ※ 小学の範囲内です。検定教科書に想像図や復元図などがかいてあります。 --> 1576年,織田信長は{{ruby|近江|おうみ}}(現在の{{ruby|滋賀|しが}}県)にある小高い山の上に '''{{ruby|安土城|あづちじょう}}''' を築かせました。 安土城の城下町では,自由に商売をできるようにしたので,とてももうかりました。 また,安土の城下町には,キリスト教の学校や教会も建てられました。 安土城の城下町付近では、商業をさかんにするため,関所で通行税をとることを{{ruby|廃止|はいし}}しました。 なお、このような政策を {{ruby|楽市楽座|らくいちらくざ}}といいます。 * 本能寺の変 [[File:Sengoku period 1582.png|thumb|400px|1582年の領地の様子]] {{Ruby|織田信長|おだのぶなが}}を、家臣の '''{{ruby|明智光秀|あけちみつひで}}'''が{{ruby|裏|うら}}切り,明智の軍が信長におそいかかり,この本能寺で信長は{{ruby|死亡|しぼう}}しました。 なお、この一連の事件を '''本能寺の{{Ruby|変|へん}}''' といいます。 '''信長は,天下統一をなしとげられませんでした。''' '''信長は,天下統一をしていません。''' 天下統一ならず,信長は死亡します。 {{-}} ;豊臣秀吉の{{Ruby|台頭|たいとう}} [[File:Toyotomi_Hideyoshi_c1598_Kodai-ji_Temple.png|thumb|250px|豊臣秀吉。秀吉は,もともと農民でしたが,武士になりました。そして,信長に{{Ruby|認|みと}}められ,信長の部下になりました。]] [[File:Osaka Castle Keep tower of 「A figure of camp screen of the Osaka summer」.jpg|thumb|大阪城]] 信長の死を聞いた'''{{ruby|豊臣秀吉|とよとみひでよし}}'''は,ただちに毛利との停戦をし,そして京都・大阪に向かい,{{Ruby|明智光秀|あけちみつひで}}をたおしました。 その後も,秀吉にさからう大名をつぎつぎとたおし,支配をかためていきました。 このようにして,しだいに秀吉の地位は高まっていき,信長の領地を受けついでいきました。 1583年に秀吉は,大阪城を築かせ,そこを{{Ruby|本拠地|ほんきょち}}にしました。 そのあと,秀吉は各地の大名たちを平定して{{Ruby|従|したが}}えていきました。 そして1590年には,秀吉に従わなかった{{Ruby|北条|ほうじょう}}氏の治める関東の{{Ruby|小田原|おだわら}}をせめ,{{ruby|北条氏政|ほうじょううじまさ}}をほろぼしました。 1590年,秀吉に従っていなかった東北の{{Ruby|伊達|だて}}氏など東北の大名も,秀吉に従いました。こうして、'''秀吉が天下統一をなしとげました。''' ;秀吉の政策 * {{Ruby|検地|けんち}} 農民からねんぐを取るための土地の調査を'''{{Ruby|検地|けんち}}'''といいます。 検地は信長の時代からも行われていたが,秀吉は各地でちがっていた長さや面積などの単位を全国で統一させました。 そして記録によって,田畑の面積や,田の{{Ruby|収穫高|しゅうかくだか}}である'''{{ruby|石高|こくだか}}''',その田畑を耕す農民の名前などが記録される {{Ruby|検地帳|けんちちょう}} が作られました。 検地帳によって耕作者がはっきりしたので,農民は田畑を持つ{{Ruby|権利|けんり}}を{{Ruby|認|みと}}められましたが,同時にねんぐを{{Ruby|納|おさ}}める義務を負うことになり,土地を勝手に はなれることができなくなりました。また,かつての{{Ruby|荘園|しょうえん}}のように土地の権利がはっきりしない土地がなくなりました。 * '''{{Ruby|刀狩|かたながり}}''' 1588年に、豊臣秀吉は'''{{Ruby|刀狩令|かたながりれい}}'''という、農民から刀や{{Ruby|鉄砲|てっぽう}}などの武器を{{Ruby|没収|ぼっしゅう}}する命令を出しました。 表向きの理由は,{{Ruby|京都|きょうと}}の{{Ruby|方広寺|ほうこうじ}}に大仏を作るので材料の鉄が必要であるためですが、秀吉の実際のねらいは,{{Ruby|一揆|いっき}}を防ぐためといわれています。 <div style="border:1px solid #000000;"> :'''{{Ruby|刀狩令|かたながりれい}}''' :{{Ruby|百姓|ひゃくしょう}}が刀・やり・鉄砲などの武器をもつことを禁止する。ねんぐを出ししぶり,一揆をおこすものは,{{Ruby|厳|きび}}しくばっする。 :とりあげた刀は,大仏をつくるためのくぎなどにするから,百姓は仏のめぐみで,この世だけでなく,あの世でも救われるだろう。 </div> ;朝鮮出兵 日本を統一した秀吉は,つぎに,外国を{{Ruby|征服|せいふく}}しようとしました。そのため,中国を征服しようとしました。このための足がかりとして,まず{{Ruby|朝鮮|ちょうせん}}に通行の許可や協力などをもとめたが,朝鮮に断られたため,朝鮮との戦争になり,2度にわたって朝鮮に兵を送って戦争をしました。 この戦争を,'''朝鮮出兵''' とか '''朝鮮{{Ruby|侵略|しんりゃく}}'''といいます。 秀吉の朝鮮出兵は2度あります。 最終的に日本は朝鮮・明の連合軍に敗北しました。 1598年に日本国内で秀吉が病死し,日本軍は日本にひきあげ,朝鮮出兵は終わりました。 {{-}} {{コラム|朝鮮出兵の結果|朝鮮出兵の結果として、 * 日本の{{Ruby|諸|しょ}}大名などからの豊臣氏への信用が弱まり,のちに,豊臣氏がほろしていくきっかけの一つになる。 * 朝鮮に大きな{{Ruby|被害|ひがい}}をあたえた。 * 戦争でほろんだ明の力も弱まる。 などのことが起こりました。}} ;徳川家康 [[File:Tokugawa_Ieyasu2.JPG|thumb|300px|徳川家康]] 1590年,秀吉の命令によって,家康の領地が関東に移され,{{Ruby|江戸城|えどじょう}}が家康の{{Ruby|拠点|きょてん}}となりました。家康が江戸に移る前は,{{Ruby|三河|みかわ}}(今でいう愛知県の東部)の大名でした。 豊臣秀吉が{{Ruby|亡|な}}くなると,徳川家康の勢力が強まりました。 * {{Ruby|関ヶ原|せきがはら}}の戦い [[File:Sekigaharascreen.jpg|thumb|500px|関ヶ原の戦い<br>絵の右側にいるのが徳川軍。絵の左側にいるのが豊臣軍。]] 1600年、{{Ruby|関ヶ原|せきがはら}}(今の岐阜県)で、徳川家康が率いる軍と,豊臣秀吉が率いる軍が戦いました。これを '''関ヶ原の戦い''' といいます。結果は,徳川家康が率いる軍の勝利でした。 * {{Ruby|江戸幕府|えどばくふ}} :1603年,{{Ruby|朝廷|ちょうてい}}から{{Ruby|徳川家康|とくがわいえやす}}は {{Ruby|征夷大将軍|せいいたいしょうぐん}} に任命されました。 :家康は{{Ruby|江戸|えど}}(現在の東京)に'''{{Ruby|幕府|ばくふ}}'''を開きました。これが'''江戸幕府'''であり,この時から'''江戸時代'''が始まりました。江戸時代は260年ほど続きます。 * 大阪城をせめる :1614年 家康により,{{Ruby|豊臣|とよとみ}}氏をほろぼすための戦争を始めました。 そして,この戦いに敗れた豊臣氏は,ほろぼされました。 * 江戸の工事 [[File:Edo P detail.jpg|500px|thumb|江戸城]] 江戸のまちは,江戸幕府より前は,政治の中心地になったことがなかったので,やや不便でした。 そのため家康は,日本全国の大名に資金や人手を{{Ruby|提供|ていきょう}}させて,江戸の町を広げる工事をさせました。江戸城を広げる工事も行われました。 {{-}} ;まとめ : 信長・秀吉・家康 {| class="wikitable" style="float:right" |+ {{ruby|信長|のぶなが}}・{{Ruby|秀吉|ひでよし}}・{{Ruby|家康|いえやす}}の時代 | 織田信長 <br>[[File:Odanobunaga face.png|150px|織田信長の顔。]]|| 豊臣秀吉 <br>[[File:Toyotomi hideyoshi face.png|150px|豊臣秀吉の顔。]]|| 徳川家康 <br>[[File:Tokugawa Ieyasu2 face.png|150px|徳川家康の顔。]] |- | 1534 {{Ruby|尾張|おわり}}(現在の{{Ruby|愛知|あいち}}県の西部)の大名の子として生まれる || 1537 尾張に農民の子として生まれる || 1542 三河(現在の愛知県の東部)の大名の子として生まれる |- | 1560 {{Ruby|今川|いまがわ}}氏を破る || || |- | 1562 家康と連合する || || 1562 信長と連合する |- | 1573年 {{Ruby|足利|あしかが}}氏を{{Ruby|京都|きょうと}}から追い出す<br />(室町幕府をほろぼす) || || |- | style="text-align: left;" colspan="3" | 1575 '''{{Ruby|長篠|ながしの}}の戦い'''で,信長と家康の連合軍が,武田の軍をたおす |- | 1576 {{Ruby|安土城|あづちじょう}}を築く || || |- | 1582 {{Ruby|明智光秀|あけちみつひで}}におそわれ,<br />信長は自害する({{ruby|本能寺|ほんのうじ}}の変) || <br>1582 秀吉が光秀をたおす || |- | || 1583 {{Ruby|大阪城|おおさかじょう}}を築く || |- | || 1588 '''{{Ruby|刀狩|かたながり}}'''を命じる || |- | || 1590 日本を統一する || 1590 秀吉の命令で,関東に領地をうつす |- | || 1592 {{Ruby|朝鮮|ちょうせん}}をせめる || |- | || 1597 ふたたび朝鮮をせめる || |- | || 1598 病死する || |- | || || 1600 関ヶ原の戦いで勝つ |- | || || 1603 {{Ruby|征夷大将軍|せいいたいしょうぐん}}になり,'''{{Ruby|江戸幕府|えどばくふ}}'''をひらく |- | || || 1615 豊臣氏をほろぼす |- | || || 1618 病死する |- |} {{clear}} つぎのような句があります。 '''{{Ruby|織田|おだ}}がつき {{Ruby|羽柴|はしば}}がこねし 天下もち''' '''すわりしままに 食うは{{Ruby|徳川|とくがわ}}''' 「{{Ruby|羽柴|はしば}}」とは,豊臣秀吉のことです。秀吉は,「豊臣秀吉」と名乗る前には,「羽柴秀吉」と長く名乗っていました。 「織田」とは,織田信長のことです。 「徳川」とは,徳川家康のことです。 なぜ,このような歌で説明されるようになったのか,「ヒント」をもとに自分の言葉で説明してみましょう。 ヒント:織田は「もちをついて」、つまりもちをやわらかくしています。羽柴は「もちをこね」、つまり織田がついたもちをさらにやわらかくしています。そして徳川は「すわりしままに食う」、つまりもち作りに協力していないのに、{{Ruby|優雅|ゆうが}}にもちを食べています。 {{clear}} また、かれらの性格をあらわした,つぎのような句があります。 {| class="wikitable" |+ | 織田信長 <br>[[File:Odanobunaga face.png|150px|織田信長の顔。]]|| 豊臣秀吉 <br>[[File:Toyotomi hideyoshi face.png|150px|豊臣秀吉の顔。]]|| 徳川家康 <br>[[File:Tokugawa Ieyasu2 face.png|150px|徳川家康の顔。]] |- | 鳴かぬなら <br> 殺してしまえ <br>  ホトトギス || 鳴かぬなら <br> 鳴かせてみせよう <br>  ホトトギス || 鳴かぬなら <br> 鳴くまで待とう <br>  ホトトギス |- |} 織田信長は「逆らうものは{{Ruby|排除|はいじょ}}する」という{{Ruby|姿勢|しせい}}をとり、豊臣秀吉は「逆らうものは{{Ruby|従|したが}}わせる」という姿勢をとり、徳川家康は「逆らうものは従うまで待つ」、つまりチャンスを{{Ruby|探|さぐ}}るという姿勢をとっています。 {{clear}} <!-- ここにヨーロッパから伝わった言葉の記述がありましたが、2020年度教科書では削除されているため削除しました --> 当時の日本人がヨーロッパ人を'''「{{Ruby|南蛮人|なんばんじん}}」'''と{{Ruby|呼|よ}}んだので,日本によるヨーロッパとの貿易を'''{{Ruby|南蛮貿易|なんばんぼうえき}}'''といいます。 <!-- ※ 小学教科書の章末コラムなどで,「南蛮」の用語がある。日本文教出版,教育出版など --> [[File:Namban-13.jpg|thumb|left|350px|{{Ruby|南蛮屏風|なんばんびょうぶ}}(※ 一部分)<br>南蛮貿易のようすがかかれています。日本人がえがいたものです。]] [[カテゴリ:小学校社会|6れきし1]] 3oidlo3f14q2ivpbjxprb5uh8jt7qjb オブジェクト指向プログラミング 0 33058 205589 190023 2022-07-20T17:41:07Z Ef3 694 /* 包含、継承、および委譲 */ Fix typo wikitext text/x-wiki = オブジェクト指向プログラミング = オブジェクト指向プログラミング(OOP; Object Oriented Programming)は、主要なプログラミングパラダイムの1つです。 オブジェクトは、モデル化されるべき実際のエンティティをエミュレートするためのメタファーとして使用されます。 オブジェクト指向プログラミングは、継承(''inheritance'')、凝集度(''cohesion'')、抽象化(''abstraction'')、ポリモーフィズム(''polymorphism'')、結合(''coupling'')、カプセル化(''encapsulation'')といった1960年代の技術をベースにしています。 オブジェクト指向プログラミングは、1990年代初頭に流行しはじめ、現在、オブジェクト指向をサポートするプログラミング言語は多岐にわたっています。 == オブジェクト指向プログラミング言語を使ったプログラミング = オブジェクト指向プログラミング? == オブジェクト指向プログラミング言語は、オブジェクト指向プログラミングを構文やライブラリで支援することで、より容易により木目細かなエラーチェックを行うことを実現したプログラミング言語です。 オブジェクト指向プログラミング言語を使っても、オブジェクト指向プログラミングとは言い難いプログラミングスタイル(例:プロシージャを整頓するためだけにクラスを使い互いの機能に関係がない)は可能です。 また、非オブジェクト指向プログラミング言語(例:[[C言語]])を使ったとしても、カプセル化・継承・ポリモーフィズムなどのオブジェクト指向プログラミングの特徴を持ったプログラミングは可能です(例:[[W:X Toolkit Intrinsics|X Toolkit Intrinsics]]のウィジェットを継承し、新たなルックアンドフィールを持った[[W:en:X Athena Widgets|X Athena Widgets]]や[[W:en:Motif (software)|Motif Widgets]]は実装されています)。 == 特徴 == オブジェクト指向プログラミングでは、オブジェクトを使用しますが、OOP対応を謳っている言語でも、関連する技術や構造のすべてが直接サポートされているわけではなく、(メソッドやメッセージではなく)被演算子と演算子という数式アナロジーが使われます。 以下の機能は、クラス指向やオブジェクト指向が強いとされる言語(またはOOP対応のマルチパラダイム)に共通するものであるが、特筆すべき例外もあります。 === 関連する技術や構造 === 継承(inheritance)、凝集度(cohesion)、抽象化(abstraction)、ポリモーフィズム(polymorphism)、結合(coupling)、カプセル化(encapsulation) === クラスベースとプロトタイプベース === オブジェクト指向プログラミング言語は、クラスベースとプロトタイプベースに大別されます(どちらにも分類し難い言語もあります)。 OOPをサポートする言語では、コードの再利用と拡張性のために、クラスまたはプロトタイプの形で継承を使用するのが一般的です。クラスを使用する言語は、2つの主要なコンセプトをサポートしています。 ; クラスベース : 型→ユーザー定義の型の概念の拡張である「クラス」を特徴にします。 : クラスとインスタンスは、型と変数の指し示している領域に対応します。 ; プロトタイプベース : クラスベースのクラスに相当するものはなく、既存のオブジェクトを雛形に新たなオブジェクトを生成し、新たなオブジェクトは雛形となったオブジェクトからフィールドとメソッドを引き継ぎます。 一部の言語では、クラスとオブジェクトは、traitやMix-inなどの他の概念を用いて構成することができる。 ==== クラスベースのオブジェクト指向 ==== クラスベースの言語では、あらかじめクラスが定義されており、オブジェクトはクラスに基づいてインスタンス化されます。<!-- これはインスタンス化というより継承の例 → 例えば、appleとorangeという2つのオブジェクトがFruitというクラスからインスタンス化された場合、それらは本質的に果物であり、同じように扱うことができることが保証されています。--> プロトタイプベースの言語では、オブジェクトが主な実体です。クラスも存在しません。オブジェクトのプロトタイプは、そのオブジェクトがリンクされている別のオブジェクトに過ぎません。すべてのオブジェクトは、1つのプロトタイプリンクを持っています(1つだけです)。新しいオブジェクトは、プロトタイプとして選ばれた既存のオブジェクトに基づいて作成することができます。 プロトタイプベースの言語では、本質的にインスタンス化と継承は同じメカニズムの別の角度から見た射影です。 <!-- オブジェクトfruitが存在し、appleとorangeの両方がそのプロトタイプとしてfruitを持っていれば、2つの異なるオブジェクトappleとorangeをfruitと呼ぶことができます。フルーツクラスという考え方は明示的には存在しませんが、同じプロトタイプを共有するオブジェクトの等価クラスとして存在しています。プロトタイプの属性とメソッドは、このプロトタイプによって定義された等価クラスのすべてのオブジェクトに委譲されます。オブジェクトが個別に所有する属性やメソッドは、同じ等価クラスの他のオブジェクトでは共有されない可能性があります。例えば、属性 sugar_content は、予期せず apple には存在しないかもしれません。プロトタイプを使って実装できるのは、単一継承のみです。 --> ===== オブジェクトとクラス ===== ;クラス:与えられたタイプまたはクラスのオブジェクトのデータフォーマットと利用可能な手続きの定義。データと手続き(クラスメソッドとして知られている)自体を含むこともあり、つまりクラスはフィールド(データメンバー・属性とも)とメソッド(メンバー関数とも)を含む。 ;オブジェクト :クラスのインスタンス :オブジェクトは、現実の世界にあるものに対応することがあります。例えば、グラフィックプログラムでは、"circle"、"square"、"menu "などのオブジェクトがあります。また、オンライン・ショッピング・システムでは、「ショッピング・カート」、「カスタマー」、「プロダクト」などのオブジェクトがあります。オブジェクトは、オープン・ファイルを表すオブジェクトや、ヤードポンド法からメートル法に変換するサービスを提供するオブジェクトなど、より抽象的な実体を表すこともあります。 オブジェクト指向プログラミングとは、単なるクラスやオブジェクトではなく、データフィールドやメソッドを含むオブジェクト(データ構造)を中心としたプログラミングパラダイム全体のことです。これを理解することは不可欠です。 クラスを使って、関係のない手続きをまとめて整理することは、オブジェクト指向ではありません。 各オブジェクトは、特定のクラスのインスタンスであると言われています(例えば、nameフィールドに "Mary"が設定されているオブジェクトは、Employeeクラスのインスタンスであると言えます)。オブジェクト指向プログラミングにおけるプロシージャはメソッドと呼ばれ、変数はフィールド、メンバー、アトリビュート、またはプロパティとも呼ばれます。そのため、以下のような用語があります。 ;クラス変数:クラス全体に属するもので、1つのコピーしか存在しない。 ;インスタンス変数または属性:個々のオブジェクトに属するデータで、各オブジェクトはそれぞれのコピーを持っています。 ;メンバー変数:特定のクラスで定義されているクラス変数とインスタンス変数の両方を指します。 ;クラスメソッド:クラス全体に属し、クラス変数とプロシージャコールからの入力にのみアクセスできる。 ;インスタンス・メソッド:個々のオブジェクトに属し、呼び出された特定のオブジェクトのインスタンス変数、入力、およびクラス変数にアクセスできます。 オブジェクトは、複雑な内部構造を持つ変数のようにアクセスされ、多くの言語では効果的にポインタとなり、ヒープやスタック内のメモリにある当該オブジェクトの単一インスタンスへの実際の参照として機能します。オブジェクトは、内部コードと外部コードを分離するために使用できる抽象化の層を提供する。外部のコードは、特定の入力パラメータセットで特定のインスタンスメソッドを呼び出したり、インスタンス変数を読み込んだり、インスタンス変数に書き込んだりすることで、オブジェクトを使用することができます。オブジェクトは、コンストラクタと呼ばれるクラス内の特殊なメソッドを呼び出すことで生成されます。プログラムは、実行中に同じクラスのインスタンスを多数作成し、それらが独立して動作することがあります。これは、同じ手順を異なるデータセットに対して使用するための簡単な方法である。 クラスを用いたオブジェクト指向プログラミングをクラスベース・プログラミングと呼ぶことがあるが、プロトタイプベース・プログラミングではクラスを用いないのが一般的である。そのため、オブジェクトとインスタンスの概念を定義するために、大きく異なるが類似した用語が使用されている。 ==== プロトタイプベースのオブジェクト指向 ==== 多くのオブジェクト指向プログラミング言語はクラスベースですが、殆どのウェブブラウザはJavaScriptエンジンを搭載していることから、プロトタイプベースのオブジェクト指向言語が使われ機会は多く、WikibooksのインフラストラクチャーであるMediaWikiのモジュールの記述言語のLuaもプロトタイプベースのオブジェクト指向言語です。 === 動的ディスパッチ/メッセージパッシング === メソッドの呼び出しに応じて実行する手続きコードを選択するのは、外部のコードではなく、オブジェクト管理機構の責任で、通常はオブジェクトに関連付けられたテーブルから実行時にメソッドを検索します(仮想関数テーブル)。 この機能は動的ディスパッチとして知られており、オブジェクトと、すべてのインスタンスに対して操作の実装が固定されている(静的な)抽象データ型(またはモジュール)とを区別しています。 呼び出しの可変性が、呼び出されたオブジェクトの単一の型以上に依存している場合(つまり、少なくとも1つの他のパラメータオブジェクトがメソッドの選択に関与している場合)、多重ディスパッチと言います。 メソッドの呼び出しは、メッセージパッシングとも呼ばれます。これは、メッセージ(メソッドの名前とその入力パラメータ)がディスパッチのためにオブジェクトに渡されるものとして概念化されています。 === カプセル化 === カプセル化は、オブジェクト指向プログラミングの概念の一つで、データとそのデータを操作する関数を結びつけ、外部からの干渉や誤用から両者を保護することである。データのカプセル化は、OOPの重要な概念である「データの隠蔽」につながっている。 クラスが呼び出しコードにオブジェクトの内部データへのアクセスを許可せず、メソッドを通してのみアクセスを許可している場合、これはカプセル化として知られる強力な抽象化または情報隠蔽の形態です。 一部の言語(C++やJavaなど)では、クラスがアクセス制限を明示的に行うことができます。 例えば、内部データをprivateキーワードで表し、クラス外のコードが使用することを意図したメソッドをpublicキーワードで指定します。 メソッドにはpublic、privateのほか、protected(同じクラスとそのサブクラスからのアクセスは許可するが、異なるクラスのオブジェクトからのアクセスは許可しない)のような中間レベルのデザインもあります。 他の言語(Pythonなど)では、カプセル化は慣例によってのみ強制されます(例えば、プライベートメソッドの名前はアンダースコアで始まることがあります)。 カプセル化することで、外部のコードがオブジェクトの内部動作に関与することを防ぐことができます。 これにより、コードのリファクタリングが容易になります。 例えば、クラスの作者は、外部のコードを変更することなく、そのクラスのオブジェクトが内部でどのようにデータを表現しているかを変更することができます(publicメソッドの呼び出しが同じように動作する限りにおいて)。 また、特定のデータに関連するすべてのコードを同じクラスにまとめることで、他のプログラマーが理解しやすいように整理することができます。 カプセル化は、結合度の低減(''decoupling'')を促進する技術です。 === 包含、継承、および委譲 === ;包含 :オブジェクトは、そのインスタンス変数に他のオブジェクトを含めることができますが、これを包含(オブジェクト・コンポジション)といいます。 :たとえば、Employee クラスのオブジェクトは、"first_name" や "position" といった自身のインスタンス変数に加えて、Address クラスのオブジェクトを (直接またはポインタを介して) 含むことができます。 ;継承 :オブジェクト指向プログラミングをサポートしている言語は、ほとんどの場合、継承をサポートしています。 :これにより、クラスを「~である」という関係を表す階層に配置することができます。 :例えば、Employee クラスは Person クラスを継承しています。 :親クラスで利用できるデータやメソッドは、子クラスにも同じ名前で表示されます。 :例えば、Person クラスは、"first_name" と "last_name" という変数を "make_full_name()" というメソッドで定義しています。 :これらはEmployeeクラスでも使用可能で、Employeeクラスには変数 "position "と "salary "が追加されるかもしれません。 :この手法では、同じプロシージャやデータ定義を簡単に再利用できるだけでなく、現実世界の関係を直感的に反映できる可能性があります。 :開発者は、データベースのテーブルやプログラミングのサブルーチンを利用するのではなく、ユーザーがより慣れ親しんでいるであろうオブジェクト、つまりアプリケーション・ドメインのオブジェクトを利用します。 :サブクラスは、スーパークラスで定義されたメソッドをオーバーライドできます。 :;多重継承 ::一部の言語では多重継承が可能ですが、オーバーライドの解決が複雑になる可能性があります。 ::多重継承が可能な言語では、Mix-inは単なるクラスであり、is-a-type-ofの関係を表していません。 :;MIx-in ::Mix-inは通常、複数のクラスに同じメソッドセットを追加するために使用されます。 ::例えば、UnicodeConversionMixinクラスは、共通の親を持たないFileReaderクラスとWebPageScraperクラスにインクルードすることで、unicode_to_ascii()というメソッドを提供することができます。 :;抽象クラス ::抽象クラスは、インスタンス化してオブジェクトにすることはできません。 ::抽象クラスは、インスタンス化できる他の「具象」クラスに継承するためにのみ存在します。 :Javaでは、クラスがサブクラス化されるのを防ぐためにfinalキーワードを使用することができます。 final class MyFinalClass { . . . } 継承よりも構成を重視する考え方は、継承の代わりに構成を用いてhas-a関係を実装することを提唱しています。 例えば、Employee クラスは、Person クラスを継承する代わりに、Employee オブジェクトに内部の Person オブジェクトを与えることができ、Person クラスが多くの公開属性やメソッドを持っていても、外部のコードから隠すことができます。 Goのように、継承を全くサポートしていない言語もあります。 「オープン/クローズの原則」とは、クラスや関数は「拡張に対してはオープンであるが、変更に対してはクローズであるべき」と提唱するものです。 委譲(''Delegation'')もまた、継承の代わりに使用できる言語機能の一つです === ポリモーフィズム === ポリモーフィズムの一種であるサブタイピングとは、呼び出したコードが、サポートされている階層のどのクラスを操作しているのか、親クラスなのか、子クラスなのかを問わないことです。 一方で、継承階層内のオブジェクト間では、同じ操作名でも動作が異なる場合があります。 例えば、Circle型とSquare型のオブジェクトは、Shapeという共通のクラスから派生しています。 Shapeの各型のDraw関数は、自身の描画に必要な機能を実装していますが、呼び出したコードは、描画されるShapeの特定の型には無関心でいられます。 これもまた、クラス階層の外部にあるコードを単純化し、強い関心事の分離を可能にする抽象化の一種です。 == 脚註 == <references /> 7sfk1qzuevxc61me6wdgvha9vn9yuys 205592 205589 2022-07-21T00:05:28Z Ef3 694 語尾の統一 wikitext text/x-wiki = オブジェクト指向プログラミング = オブジェクト指向プログラミング(OOP; Object Oriented Programming)は、主要なプログラミングパラダイムの1つです。 オブジェクトは、モデル化されるべき実際のエンティティをエミュレートするためのメタファーとして使用されます。 オブジェクト指向プログラミングは、継承(''inheritance'')、凝集度(''cohesion'')、抽象化(''abstraction'')、ポリモーフィズム(''polymorphism'')、結合(''coupling'')、カプセル化(''encapsulation'')といった1960年代の技術をベースにしています。 オブジェクト指向プログラミングは、1990年代初頭に流行しはじめ、現在、オブジェクト指向をサポートするプログラミング言語は多岐にわたっています。 == オブジェクト指向プログラミング言語を使ったプログラミング = オブジェクト指向プログラミング? == オブジェクト指向プログラミング言語は、オブジェクト指向プログラミングを構文やライブラリで支援することで、より容易により木目細かなエラーチェックを行うことを実現したプログラミング言語です。 オブジェクト指向プログラミング言語を使っても、オブジェクト指向プログラミングとは言い難いプログラミングスタイル(例:プロシージャを整頓するためだけにクラスを使い、機能が互いのに関係がないようなプログラミング)は可能です。 また、非オブジェクト指向プログラミング言語(例:[[C言語]])を使ったとしても、カプセル化・継承・ポリモーフィズムなどのオブジェクト指向プログラミングの特徴を持ったプログラミングは可能です(例:[[W:X Toolkit Intrinsics|X Toolkit Intrinsics]]のウィジェットを継承し、新たなルックアンドフィールを持った[[W:en:X Athena Widgets|X Athena Widgets]]や[[W:en:Motif (software)|Motif Widgets]]は実装されています)。 == 特徴 == オブジェクト指向プログラミングでは、オブジェクトを使用しますが、OOP対応を謳っている言語でも、関連する技術や構造のすべてが直接サポートされているわけではなく、(メソッドやメッセージではなく)被演算子と演算子という数式アナロジーが使われます。 以下の機能は、クラス指向やオブジェクト指向が強いとされる言語(またはOOP対応のマルチパラダイム)に共通するものであるが、特筆すべき例外もあります。 === 関連する技術や構造 === 継承(inheritance)、凝集度(cohesion)、抽象化(abstraction)、ポリモーフィズム(polymorphism)、結合(coupling)、カプセル化(encapsulation) === クラスベースとプロトタイプベース === オブジェクト指向プログラミング言語は、クラスベースとプロトタイプベースに大別されます(どちらにも分類し難い言語もあります)。 OOPをサポートする言語では、コードの再利用と拡張性のために、クラスまたはプロトタイプの形で継承を使用するのが一般的です。クラスを使用する言語は、2つの主要なコンセプトをサポートしています。 ; クラスベース : 型→ユーザー定義の型の概念の拡張である「クラス」を特徴にします。 : クラスとインスタンスは、型と変数の指し示している領域に対応します。 ; プロトタイプベース : クラスベースのクラスに相当するものはなく、既存のオブジェクトを雛形に新たなオブジェクトを生成し、新たなオブジェクトは雛形となったオブジェクトからフィールドとメソッドを引き継ぎます。 一部の言語では、クラスとオブジェクトは、traitやMix-inなどの他の概念を用いて構成することができます。 ==== クラスベースのオブジェクト指向 ==== クラスベースの言語では、あらかじめクラスが定義されており、オブジェクトはクラスに基づいてインスタンス化されます。<!-- これはインスタンス化というより継承の例 → 例えば、appleとorangeという2つのオブジェクトがFruitというクラスからインスタンス化された場合、それらは本質的に果物であり、同じように扱うことができることが保証されています。--> プロトタイプベースの言語では、オブジェクトが主な実体です。クラスも存在しません。オブジェクトのプロトタイプは、そのオブジェクトがリンクされている別のオブジェクトに過ぎません。すべてのオブジェクトは、1つのプロトタイプリンクを持っています(1つだけです)。新しいオブジェクトは、プロトタイプとして選ばれた既存のオブジェクトに基づいて作成することができます。 プロトタイプベースの言語では、本質的にインスタンス化と継承は同じメカニズムの別の角度から見た射影です。 <!-- オブジェクトfruitが存在し、appleとorangeの両方がそのプロトタイプとしてfruitを持っていれば、2つの異なるオブジェクトappleとorangeをfruitと呼ぶことができます。フルーツクラスという考え方は明示的には存在しませんが、同じプロトタイプを共有するオブジェクトの等価クラスとして存在しています。プロトタイプの属性とメソッドは、このプロトタイプによって定義された等価クラスのすべてのオブジェクトに委譲されます。オブジェクトが個別に所有する属性やメソッドは、同じ等価クラスの他のオブジェクトでは共有されない可能性があります。例えば、属性 sugar_content は、予期せず apple には存在しないかもしれません。プロトタイプを使って実装できるのは、単一継承のみです。 --> ===== オブジェクトとクラス ===== ;クラス:与えられたタイプまたはクラスのオブジェクトのデータフォーマットと利用可能な手続きの定義。データと手続き(クラスメソッドとして知られています)自体を含むこともあり、つまりクラスはフィールド(データメンバー・属性とも)とメソッド(メンバー関数とも)を含む。 ;オブジェクト :クラスのインスタンス :オブジェクトは、現実の世界にあるものに対応することがあります。例えば、グラフィックプログラムでは、"circle"、"square"、"menu "などのオブジェクトがあります。また、オンライン・ショッピング・システムでは、「ショッピング・カート」、「カスタマー」、「プロダクト」などのオブジェクトがあります。オブジェクトは、オープン・ファイルを表すオブジェクトや、ヤードポンド法からメートル法に変換するサービスを提供するオブジェクトなど、より抽象的な実体を表すこともあります。 オブジェクト指向プログラミングとは、単なるクラスやオブジェクトではなく、データフィールドやメソッドを含むオブジェクト(データ構造)を中心としたプログラミングパラダイム全体のことです。これを理解することは不可欠です。 クラスを使って、関係のない手続きをまとめて整理することは、オブジェクト指向ではありません。 各オブジェクトは、特定のクラスのインスタンスであると言われています(例えば、nameフィールドに "Mary"が設定されているオブジェクトは、Employeeクラスのインスタンスであると言えます)。オブジェクト指向プログラミングにおけるプロシージャはメソッドと呼ばれ、変数はフィールド、メンバー、アトリビュート、またはプロパティとも呼ばれます。そのため、以下のような用語があります。 ;クラス変数:クラス全体に属するもので、1つのコピーしか存在しません。 ;インスタンス変数または属性:個々のオブジェクトに属するデータで、各オブジェクトはそれぞれのコピーを持っています。 ;メンバー変数:特定のクラスで定義されているクラス変数とインスタンス変数の両方を指します。 ;クラスメソッド:クラス全体に属し、クラス変数とプロシージャコールからの入力にのみアクセスできます。 ;インスタンス・メソッド:個々のオブジェクトに属し、呼び出された特定のオブジェクトのインスタンス変数、入力、およびクラス変数にアクセスできます。 オブジェクトは、複雑な内部構造を持つ変数のようにアクセスされ、多くの言語では効果的にポインタとなり、ヒープやスタック内のメモリにある当該オブジェクトの単一インスタンスへの実際の参照として機能します。オブジェクトは、内部コードと外部コードを分離するために使用できる抽象化の層を提供します。外部のコードは、特定の入力パラメータセットで特定のインスタンスメソッドを呼び出したり、インスタンス変数を読み込んだり、インスタンス変数に書き込んだりすることで、オブジェクトを使用することができます。オブジェクトは、コンストラクタと呼ばれるクラス内の特殊なメソッドを呼び出すことで生成されます。プログラムは、実行中に同じクラスのインスタンスを多数作成し、それらが独立して動作することがあります。これは、同じ手順を異なるデータセットに対して使用するための簡単な方法です。 クラスを用いたオブジェクト指向プログラミングをクラスベース・プログラミングと呼ぶことがあるが、プロトタイプベース・プログラミングではクラスを用いないのが一般的です。そのため、オブジェクトとインスタンスの概念を定義するために、大きく異なるが類似した用語が使用されています。 ==== プロトタイプベースのオブジェクト指向 ==== 多くのオブジェクト指向プログラミング言語はクラスベースですが、殆どのウェブブラウザはJavaScriptエンジンを搭載していることから、プロトタイプベースのオブジェクト指向言語が使われ機会は多く、WikibooksのインフラストラクチャーであるMediaWikiのモジュールの記述言語のLuaもプロトタイプベースのオブジェクト指向言語です。 === 動的ディスパッチ/メッセージパッシング === メソッドの呼び出しに応じて実行する手続きコードを選択するのは、外部のコードではなく、オブジェクト管理機構の責任で、通常はオブジェクトに関連付けられたテーブルから実行時にメソッドを検索します(仮想関数テーブル)。 この機能は動的ディスパッチとして知られており、オブジェクトと、すべてのインスタンスに対して操作の実装が固定されています(静的な)抽象データ型(またはモジュール)とを区別しています。 呼び出しの可変性が、呼び出されたオブジェクトの単一の型以上に依存している場合(つまり、少なくとも1つの他のパラメータオブジェクトがメソッドの選択に関与している場合)、多重ディスパッチと言います。 メソッドの呼び出しは、メッセージパッシングとも呼ばれます。これは、メッセージ(メソッドの名前とその入力パラメータ)がディスパッチのためにオブジェクトに渡されるものとして概念化されています。 === カプセル化 === カプセル化は、オブジェクト指向プログラミングの概念の一つで、データとそのデータを操作する関数を結びつけ、外部からの干渉や誤用から両者を保護することです。データのカプセル化は、OOPの重要な概念である「データの隠蔽」につながっています。 クラスが呼び出しコードにオブジェクトの内部データへのアクセスを許可せず、メソッドを通してのみアクセスを許可している場合、これはカプセル化として知られる強力な抽象化または情報隠蔽の形態です。 一部の言語(C++やJavaなど)では、クラスがアクセス制限を明示的に行うことができます。 例えば、内部データをprivateキーワードで表し、クラス外のコードが使用することを意図したメソッドをpublicキーワードで指定します。 メソッドにはpublic、privateのほか、protected(同じクラスとそのサブクラスからのアクセスは許可するが、異なるクラスのオブジェクトからのアクセスは許可しません)のような中間レベルのデザインもあります。 他の言語(Pythonなど)では、カプセル化は慣例によってのみ強制されます(例えば、プライベートメソッドの名前はアンダースコアで始まることがあります)。 カプセル化することで、外部のコードがオブジェクトの内部動作に関与することを防ぐことができます。 これにより、コードのリファクタリングが容易になります。 例えば、クラスの作者は、外部のコードを変更することなく、そのクラスのオブジェクトが内部でどのようにデータを表現しているかを変更することができます(publicメソッドの呼び出しが同じように動作する限りにおいて)。 また、特定のデータに関連するすべてのコードを同じクラスにまとめることで、他のプログラマーが理解しやすいように整理することができます。 カプセル化は、結合度の低減(''decoupling'')を促進する技術です。 === 包含、継承、および委譲 === ;包含 :オブジェクトは、そのインスタンス変数に他のオブジェクトを含めることができますが、これを包含(オブジェクト・コンポジション)といいます。 :たとえば、Employee クラスのオブジェクトは、"first_name" や "position" といった自身のインスタンス変数に加えて、Address クラスのオブジェクトを (直接またはポインタを介して) 含むことができます。 ;継承 :オブジェクト指向プログラミングをサポートしている言語は、ほとんどの場合、継承をサポートしています。 :これにより、クラスを「~である」という関係を表す階層に配置することができます。 :例えば、Employee クラスは Person クラスを継承しています。 :親クラスで利用できるデータやメソッドは、子クラスにも同じ名前で表示されます。 :例えば、Person クラスは、"first_name" と "last_name" という変数を "make_full_name()" というメソッドで定義しています。 :これらはEmployeeクラスでも使用可能で、Employeeクラスには変数 "position "と "salary "が追加されるかもしれません。 :この手法では、同じプロシージャやデータ定義を簡単に再利用できるだけでなく、現実世界の関係を直感的に反映できる可能性があります。 :開発者は、データベースのテーブルやプログラミングのサブルーチンを利用するのではなく、ユーザーがより慣れ親しんでいるであろうオブジェクト、つまりアプリケーション・ドメインのオブジェクトを利用します。 :サブクラスは、スーパークラスで定義されたメソッドをオーバーライドできます。 :;多重継承 ::一部の言語では多重継承が可能ですが、オーバーライドの解決が複雑になる可能性があります。 ::多重継承が可能な言語では、Mix-inは単なるクラスであり、is-a-type-ofの関係を表していません。 :;MIx-in ::Mix-inは通常、複数のクラスに同じメソッドセットを追加するために使用されます。 ::例えば、UnicodeConversionMixinクラスは、共通の親を持たないFileReaderクラスとWebPageScraperクラスにインクルードすることで、unicode_to_ascii()というメソッドを提供することができます。 :;抽象クラス ::抽象クラスは、インスタンス化してオブジェクトにすることはできません。 ::抽象クラスは、インスタンス化できる他の「具象」クラスに継承するためにのみ存在します。 :Javaでは、クラスがサブクラス化されるのを防ぐためにfinalキーワードを使用することができます。 final class MyFinalClass { . . . } 継承よりも構成を重視する考え方は、継承の代わりに構成を用いてhas-a関係を実装することを提唱しています。 例えば、Employee クラスは、Person クラスを継承する代わりに、Employee オブジェクトに内部の Person オブジェクトを与えることができ、Person クラスが多くの公開属性やメソッドを持っていても、外部のコードから隠すことができます。 Goのように、継承を全くサポートしていない言語もあります。 「オープン/クローズの原則」とは、クラスや関数は「拡張に対してはオープンであるが、変更に対してはクローズであるべき」と提唱するものです。 委譲(''Delegation'')もまた、継承の代わりに使用できる言語機能の一つです === ポリモーフィズム === ポリモーフィズムの一種であるサブタイピングとは、呼び出したコードが、サポートされている階層のどのクラスを操作しているのか、親クラスなのか、子クラスなのかを問わないことです。 一方で、継承階層内のオブジェクト間では、同じ操作名でも動作が異なる場合があります。 例えば、Circle型とSquare型のオブジェクトは、Shapeという共通のクラスから派生しています。 Shapeの各型のDraw関数は、自身の描画に必要な機能を実装していますが、呼び出したコードは、描画されるShapeの特定の型には無関心でいられます。 これもまた、クラス階層の外部にあるコードを単純化し、強い関心事の分離を可能にする抽象化の一種です。 == 脚註 == <references /> qogatjcmtzni0mzy4vcyjnr5j6vnsyk 205593 205592 2022-07-21T00:15:21Z Ef3 694 /* クラスベースとプロトタイプベース */ ln wikitext text/x-wiki = オブジェクト指向プログラミング = オブジェクト指向プログラミング(OOP; Object Oriented Programming)は、主要なプログラミングパラダイムの1つです。 オブジェクトは、モデル化されるべき実際のエンティティをエミュレートするためのメタファーとして使用されます。 オブジェクト指向プログラミングは、継承(''inheritance'')、凝集度(''cohesion'')、抽象化(''abstraction'')、ポリモーフィズム(''polymorphism'')、結合(''coupling'')、カプセル化(''encapsulation'')といった1960年代の技術をベースにしています。 オブジェクト指向プログラミングは、1990年代初頭に流行しはじめ、現在、オブジェクト指向をサポートするプログラミング言語は多岐にわたっています。 == オブジェクト指向プログラミング言語を使ったプログラミング = オブジェクト指向プログラミング? == オブジェクト指向プログラミング言語は、オブジェクト指向プログラミングを構文やライブラリで支援することで、より容易により木目細かなエラーチェックを行うことを実現したプログラミング言語です。 オブジェクト指向プログラミング言語を使っても、オブジェクト指向プログラミングとは言い難いプログラミングスタイル(例:プロシージャを整頓するためだけにクラスを使い、機能が互いのに関係がないようなプログラミング)は可能です。 また、非オブジェクト指向プログラミング言語(例:[[C言語]])を使ったとしても、カプセル化・継承・ポリモーフィズムなどのオブジェクト指向プログラミングの特徴を持ったプログラミングは可能です(例:[[W:X Toolkit Intrinsics|X Toolkit Intrinsics]]のウィジェットを継承し、新たなルックアンドフィールを持った[[W:en:X Athena Widgets|X Athena Widgets]]や[[W:en:Motif (software)|Motif Widgets]]は実装されています)。 == 特徴 == オブジェクト指向プログラミングでは、オブジェクトを使用しますが、OOP対応を謳っている言語でも、関連する技術や構造のすべてが直接サポートされているわけではなく、(メソッドやメッセージではなく)被演算子と演算子という数式アナロジーが使われます。 以下の機能は、クラス指向やオブジェクト指向が強いとされる言語(またはOOP対応のマルチパラダイム)に共通するものであるが、特筆すべき例外もあります。 === 関連する技術や構造 === 継承(inheritance)、凝集度(cohesion)、抽象化(abstraction)、ポリモーフィズム(polymorphism)、結合(coupling)、カプセル化(encapsulation) === クラスベースとプロトタイプベース === オブジェクト指向プログラミング言語は、クラスベースとプロトタイプベースに大別されます(どちらにも分類し難い言語もあります)。 OOPをサポートする言語では、コードの再利用と拡張性のために、クラスまたはプロトタイプの形で継承を使用するのが一般的です。クラスを使用する言語は、2つの主要なコンセプトをサポートしています。 ; [[#クラスベースのオブジェクト指向|クラスベース]] : 型→ユーザー定義の型の概念の拡張である「クラス」を特徴にします。 : クラスとインスタンスは、型と変数の指し示している領域に対応します。 ; [[#プロトタイプベースのオブジェクト指向|プロトタイプベース]] : クラスベースのクラスに相当するものはなく、既存のオブジェクトを雛形に新たなオブジェクトを生成し、新たなオブジェクトは雛形となったオブジェクトからフィールドとメソッドを引き継ぎます。 一部の言語では、クラスとオブジェクトは、traitやMix-inなどの他の概念を用いて構成することができます。 ==== クラスベースのオブジェクト指向 ==== クラスベースの言語では、あらかじめクラスが定義されており、オブジェクトはクラスに基づいてインスタンス化されます。 ===== オブジェクトとクラス ===== ;クラス:与えられたタイプまたはクラスのオブジェクトのデータフォーマットと利用可能な手続きの定義。データと手続き(クラスメソッドとして知られています)自体を含むこともあり、つまりクラスはフィールド(データメンバー・属性とも)とメソッド(メンバー関数とも)を含む。 ;オブジェクト :クラスのインスタンス :オブジェクトは、現実の世界にあるものに対応することがあります。例えば、グラフィックプログラムでは、"circle"、"square"、"menu "などのオブジェクトがあります。また、オンライン・ショッピング・システムでは、「ショッピング・カート」、「カスタマー」、「プロダクト」などのオブジェクトがあります。オブジェクトは、オープン・ファイルを表すオブジェクトや、ヤードポンド法からメートル法に変換するサービスを提供するオブジェクトなど、より抽象的な実体を表すこともあります。 オブジェクト指向プログラミングとは、単なるクラスやオブジェクトではなく、データフィールドやメソッドを含むオブジェクト(データ構造)を中心としたプログラミングパラダイム全体のことです。これを理解することは不可欠です。 クラスを使って、関係のない手続きをまとめて整理することは、オブジェクト指向ではありません。 各オブジェクトは、特定のクラスのインスタンスであると言われています(例えば、nameフィールドに "Mary"が設定されているオブジェクトは、Employeeクラスのインスタンスであると言えます)。オブジェクト指向プログラミングにおけるプロシージャはメソッドと呼ばれ、変数はフィールド、メンバー、アトリビュート、またはプロパティとも呼ばれます。そのため、以下のような用語があります。 ;クラス変数:クラス全体に属するもので、1つのコピーしか存在しません。 ;インスタンス変数または属性:個々のオブジェクトに属するデータで、各オブジェクトはそれぞれのコピーを持っています。 ;メンバー変数:特定のクラスで定義されているクラス変数とインスタンス変数の両方を指します。 ;クラスメソッド:クラス全体に属し、クラス変数とプロシージャコールからの入力にのみアクセスできます。 ;インスタンス・メソッド:個々のオブジェクトに属し、呼び出された特定のオブジェクトのインスタンス変数、入力、およびクラス変数にアクセスできます。 オブジェクトは、複雑な内部構造を持つ変数のようにアクセスされ、多くの言語では効果的にポインタとなり、ヒープやスタック内のメモリにある当該オブジェクトの単一インスタンスへの実際の参照として機能します。オブジェクトは、内部コードと外部コードを分離するために使用できる抽象化の層を提供します。外部のコードは、特定の入力パラメータセットで特定のインスタンスメソッドを呼び出したり、インスタンス変数を読み込んだり、インスタンス変数に書き込んだりすることで、オブジェクトを使用することができます。オブジェクトは、コンストラクタと呼ばれるクラス内の特殊なメソッドを呼び出すことで生成されます。プログラムは、実行中に同じクラスのインスタンスを多数作成し、それらが独立して動作することがあります。これは、同じ手順を異なるデータセットに対して使用するための簡単な方法です。 クラスを用いたオブジェクト指向プログラミングをクラスベース・プログラミングと呼ぶことがあるが、プロトタイプベース・プログラミングではクラスを用いないのが一般的です。そのため、オブジェクトとインスタンスの概念を定義するために、大きく異なるが類似した用語が使用されています。 ==== プロトタイプベースのオブジェクト指向 ==== プロトタイプベースの言語では、オブジェクトが主な実体です。クラスも存在しません。オブジェクトのプロトタイプは、そのオブジェクトがリンクされている別のオブジェクトに過ぎません。すべてのオブジェクトは、1つのプロトタイプリンクを持っています(1つだけです)。新しいオブジェクトは、プロトタイプとして選ばれた既存のオブジェクトに基づいて作成することができます。 プロトタイプベースの言語では、本質的にインスタンス化と継承は同じメカニズムの別の角度から見た射影です。 多くのオブジェクト指向プログラミング言語はクラスベースですが、殆どのウェブブラウザはJavaScriptエンジンを搭載していることから、プロトタイプベースのオブジェクト指向言語が使われ機会は多く、WikibooksのインフラストラクチャーであるMediaWikiのモジュールの記述言語のLuaもプロトタイプベースのオブジェクト指向言語です。 === 動的ディスパッチ/メッセージパッシング === メソッドの呼び出しに応じて実行する手続きコードを選択するのは、外部のコードではなく、オブジェクト管理機構の責任で、通常はオブジェクトに関連付けられたテーブルから実行時にメソッドを検索します(仮想関数テーブル)。 この機能は動的ディスパッチとして知られており、オブジェクトと、すべてのインスタンスに対して操作の実装が固定されています(静的な)抽象データ型(またはモジュール)とを区別しています。 呼び出しの可変性が、呼び出されたオブジェクトの単一の型以上に依存している場合(つまり、少なくとも1つの他のパラメータオブジェクトがメソッドの選択に関与している場合)、多重ディスパッチと言います。 メソッドの呼び出しは、メッセージパッシングとも呼ばれます。これは、メッセージ(メソッドの名前とその入力パラメータ)がディスパッチのためにオブジェクトに渡されるものとして概念化されています。 === カプセル化 === カプセル化は、オブジェクト指向プログラミングの概念の一つで、データとそのデータを操作する関数を結びつけ、外部からの干渉や誤用から両者を保護することです。データのカプセル化は、OOPの重要な概念である「データの隠蔽」につながっています。 クラスが呼び出しコードにオブジェクトの内部データへのアクセスを許可せず、メソッドを通してのみアクセスを許可している場合、これはカプセル化として知られる強力な抽象化または情報隠蔽の形態です。 一部の言語(C++やJavaなど)では、クラスがアクセス制限を明示的に行うことができます。 例えば、内部データをprivateキーワードで表し、クラス外のコードが使用することを意図したメソッドをpublicキーワードで指定します。 メソッドにはpublic、privateのほか、protected(同じクラスとそのサブクラスからのアクセスは許可するが、異なるクラスのオブジェクトからのアクセスは許可しません)のような中間レベルのデザインもあります。 他の言語(Pythonなど)では、カプセル化は慣例によってのみ強制されます(例えば、プライベートメソッドの名前はアンダースコアで始まることがあります)。 カプセル化することで、外部のコードがオブジェクトの内部動作に関与することを防ぐことができます。 これにより、コードのリファクタリングが容易になります。 例えば、クラスの作者は、外部のコードを変更することなく、そのクラスのオブジェクトが内部でどのようにデータを表現しているかを変更することができます(publicメソッドの呼び出しが同じように動作する限りにおいて)。 また、特定のデータに関連するすべてのコードを同じクラスにまとめることで、他のプログラマーが理解しやすいように整理することができます。 カプセル化は、結合度の低減(''decoupling'')を促進する技術です。 === 包含、継承、および委譲 === ;包含 :オブジェクトは、そのインスタンス変数に他のオブジェクトを含めることができますが、これを包含(オブジェクト・コンポジション)といいます。 :たとえば、Employee クラスのオブジェクトは、"first_name" や "position" といった自身のインスタンス変数に加えて、Address クラスのオブジェクトを (直接またはポインタを介して) 含むことができます。 ;継承 :オブジェクト指向プログラミングをサポートしている言語は、ほとんどの場合、継承をサポートしています。 :これにより、クラスを「~である」という関係を表す階層に配置することができます。 :例えば、Employee クラスは Person クラスを継承しています。 :親クラスで利用できるデータやメソッドは、子クラスにも同じ名前で表示されます。 :例えば、Person クラスは、"first_name" と "last_name" という変数を "make_full_name()" というメソッドで定義しています。 :これらはEmployeeクラスでも使用可能で、Employeeクラスには変数 "position "と "salary "が追加されるかもしれません。 :この手法では、同じプロシージャやデータ定義を簡単に再利用できるだけでなく、現実世界の関係を直感的に反映できる可能性があります。 :開発者は、データベースのテーブルやプログラミングのサブルーチンを利用するのではなく、ユーザーがより慣れ親しんでいるであろうオブジェクト、つまりアプリケーション・ドメインのオブジェクトを利用します。 :サブクラスは、スーパークラスで定義されたメソッドをオーバーライドできます。 :;多重継承 ::一部の言語では多重継承が可能ですが、オーバーライドの解決が複雑になる可能性があります。 ::多重継承が可能な言語では、Mix-inは単なるクラスであり、is-a-type-ofの関係を表していません。 :;MIx-in ::Mix-inは通常、複数のクラスに同じメソッドセットを追加するために使用されます。 ::例えば、UnicodeConversionMixinクラスは、共通の親を持たないFileReaderクラスとWebPageScraperクラスにインクルードすることで、unicode_to_ascii()というメソッドを提供することができます。 :;抽象クラス ::抽象クラスは、インスタンス化してオブジェクトにすることはできません。 ::抽象クラスは、インスタンス化できる他の「具象」クラスに継承するためにのみ存在します。 :Javaでは、クラスがサブクラス化されるのを防ぐためにfinalキーワードを使用することができます。 final class MyFinalClass { . . . } 継承よりも構成を重視する考え方は、継承の代わりに構成を用いてhas-a関係を実装することを提唱しています。 例えば、Employee クラスは、Person クラスを継承する代わりに、Employee オブジェクトに内部の Person オブジェクトを与えることができ、Person クラスが多くの公開属性やメソッドを持っていても、外部のコードから隠すことができます。 Goのように、継承を全くサポートしていない言語もあります。 「オープン/クローズの原則」とは、クラスや関数は「拡張に対してはオープンであるが、変更に対してはクローズであるべき」と提唱するものです。 委譲(''Delegation'')もまた、継承の代わりに使用できる言語機能の一つです === ポリモーフィズム === ポリモーフィズムの一種であるサブタイピングとは、呼び出したコードが、サポートされている階層のどのクラスを操作しているのか、親クラスなのか、子クラスなのかを問わないことです。 一方で、継承階層内のオブジェクト間では、同じ操作名でも動作が異なる場合があります。 例えば、Circle型とSquare型のオブジェクトは、Shapeという共通のクラスから派生しています。 Shapeの各型のDraw関数は、自身の描画に必要な機能を実装していますが、呼び出したコードは、描画されるShapeの特定の型には無関心でいられます。 これもまた、クラス階層の外部にあるコードを単純化し、強い関心事の分離を可能にする抽象化の一種です。 == 脚註 == <references /> rfjv75i9gnwmghayzwdrdxqlb5m3yxf 205608 205593 2022-07-21T06:19:45Z Ef3 694 /* 包含、継承、および委譲 */ 定義リストを(リンク可能なように)節に分割。 wikitext text/x-wiki = オブジェクト指向プログラミング = オブジェクト指向プログラミング(OOP; Object Oriented Programming)は、主要なプログラミングパラダイムの1つです。 オブジェクトは、モデル化されるべき実際のエンティティをエミュレートするためのメタファーとして使用されます。 オブジェクト指向プログラミングは、継承(''inheritance'')、凝集度(''cohesion'')、抽象化(''abstraction'')、ポリモーフィズム(''polymorphism'')、結合(''coupling'')、カプセル化(''encapsulation'')といった1960年代の技術をベースにしています。 オブジェクト指向プログラミングは、1990年代初頭に流行しはじめ、現在、オブジェクト指向をサポートするプログラミング言語は多岐にわたっています。 == オブジェクト指向プログラミング言語を使ったプログラミング = オブジェクト指向プログラミング? == オブジェクト指向プログラミング言語は、オブジェクト指向プログラミングを構文やライブラリで支援することで、より容易により木目細かなエラーチェックを行うことを実現したプログラミング言語です。 オブジェクト指向プログラミング言語を使っても、オブジェクト指向プログラミングとは言い難いプログラミングスタイル(例:プロシージャを整頓するためだけにクラスを使い、機能が互いのに関係がないようなプログラミング)は可能です。 また、非オブジェクト指向プログラミング言語(例:[[C言語]])を使ったとしても、カプセル化・継承・ポリモーフィズムなどのオブジェクト指向プログラミングの特徴を持ったプログラミングは可能です(例:[[W:X Toolkit Intrinsics|X Toolkit Intrinsics]]のウィジェットを継承し、新たなルックアンドフィールを持った[[W:en:X Athena Widgets|X Athena Widgets]]や[[W:en:Motif (software)|Motif Widgets]]は実装されています)。 == 特徴 == オブジェクト指向プログラミングでは、オブジェクトを使用しますが、OOP対応を謳っている言語でも、関連する技術や構造のすべてが直接サポートされているわけではなく、(メソッドやメッセージではなく)被演算子と演算子という数式アナロジーが使われます。 以下の機能は、クラス指向やオブジェクト指向が強いとされる言語(またはOOP対応のマルチパラダイム)に共通するものであるが、特筆すべき例外もあります。 === 関連する技術や構造 === 継承(inheritance)、凝集度(cohesion)、抽象化(abstraction)、ポリモーフィズム(polymorphism)、結合(coupling)、カプセル化(encapsulation) === クラスベースとプロトタイプベース === オブジェクト指向プログラミング言語は、クラスベースとプロトタイプベースに大別されます(どちらにも分類し難い言語もあります)。 OOPをサポートする言語では、コードの再利用と拡張性のために、クラスまたはプロトタイプの形で継承を使用するのが一般的です。クラスを使用する言語は、2つの主要なコンセプトをサポートしています。 ; [[#クラスベースのオブジェクト指向|クラスベース]] : 型→ユーザー定義の型の概念の拡張である「クラス」を特徴にします。 : クラスとインスタンスは、型と変数の指し示している領域に対応します。 ; [[#プロトタイプベースのオブジェクト指向|プロトタイプベース]] : クラスベースのクラスに相当するものはなく、既存のオブジェクトを雛形に新たなオブジェクトを生成し、新たなオブジェクトは雛形となったオブジェクトからフィールドとメソッドを引き継ぎます。 一部の言語では、クラスとオブジェクトは、traitやMix-inなどの他の概念を用いて構成することができます。 ==== クラスベースのオブジェクト指向 ==== クラスベースの言語では、あらかじめクラスが定義されており、オブジェクトはクラスに基づいてインスタンス化されます。 ===== オブジェクトとクラス ===== ;クラス:与えられたタイプまたはクラスのオブジェクトのデータフォーマットと利用可能な手続きの定義。データと手続き(クラスメソッドとして知られています)自体を含むこともあり、つまりクラスはフィールド(データメンバー・属性とも)とメソッド(メンバー関数とも)を含む。 ;オブジェクト :クラスのインスタンス :オブジェクトは、現実の世界にあるものに対応することがあります。例えば、グラフィックプログラムでは、"circle"、"square"、"menu "などのオブジェクトがあります。また、オンライン・ショッピング・システムでは、「ショッピング・カート」、「カスタマー」、「プロダクト」などのオブジェクトがあります。オブジェクトは、オープン・ファイルを表すオブジェクトや、ヤードポンド法からメートル法に変換するサービスを提供するオブジェクトなど、より抽象的な実体を表すこともあります。 オブジェクト指向プログラミングとは、単なるクラスやオブジェクトではなく、データフィールドやメソッドを含むオブジェクト(データ構造)を中心としたプログラミングパラダイム全体のことです。これを理解することは不可欠です。 クラスを使って、関係のない手続きをまとめて整理することは、オブジェクト指向ではありません。 各オブジェクトは、特定のクラスのインスタンスであると言われています(例えば、nameフィールドに "Mary"が設定されているオブジェクトは、Employeeクラスのインスタンスであると言えます)。オブジェクト指向プログラミングにおけるプロシージャはメソッドと呼ばれ、変数はフィールド、メンバー、アトリビュート、またはプロパティとも呼ばれます。そのため、以下のような用語があります。 ;クラス変数:クラス全体に属するもので、1つのコピーしか存在しません。 ;インスタンス変数または属性:個々のオブジェクトに属するデータで、各オブジェクトはそれぞれのコピーを持っています。 ;メンバー変数:特定のクラスで定義されているクラス変数とインスタンス変数の両方を指します。 ;クラスメソッド:クラス全体に属し、クラス変数とプロシージャコールからの入力にのみアクセスできます。 ;インスタンス・メソッド:個々のオブジェクトに属し、呼び出された特定のオブジェクトのインスタンス変数、入力、およびクラス変数にアクセスできます。 オブジェクトは、複雑な内部構造を持つ変数のようにアクセスされ、多くの言語では効果的にポインタとなり、ヒープやスタック内のメモリにある当該オブジェクトの単一インスタンスへの実際の参照として機能します。オブジェクトは、内部コードと外部コードを分離するために使用できる抽象化の層を提供します。外部のコードは、特定の入力パラメータセットで特定のインスタンスメソッドを呼び出したり、インスタンス変数を読み込んだり、インスタンス変数に書き込んだりすることで、オブジェクトを使用することができます。オブジェクトは、コンストラクタと呼ばれるクラス内の特殊なメソッドを呼び出すことで生成されます。プログラムは、実行中に同じクラスのインスタンスを多数作成し、それらが独立して動作することがあります。これは、同じ手順を異なるデータセットに対して使用するための簡単な方法です。 クラスを用いたオブジェクト指向プログラミングをクラスベース・プログラミングと呼ぶことがあるが、プロトタイプベース・プログラミングではクラスを用いないのが一般的です。そのため、オブジェクトとインスタンスの概念を定義するために、大きく異なるが類似した用語が使用されています。 ==== プロトタイプベースのオブジェクト指向 ==== プロトタイプベースの言語では、オブジェクトが主な実体です。クラスも存在しません。オブジェクトのプロトタイプは、そのオブジェクトがリンクされている別のオブジェクトに過ぎません。すべてのオブジェクトは、1つのプロトタイプリンクを持っています(1つだけです)。新しいオブジェクトは、プロトタイプとして選ばれた既存のオブジェクトに基づいて作成することができます。 プロトタイプベースの言語では、本質的にインスタンス化と継承は同じメカニズムの別の角度から見た射影です。 多くのオブジェクト指向プログラミング言語はクラスベースですが、殆どのウェブブラウザはJavaScriptエンジンを搭載していることから、プロトタイプベースのオブジェクト指向言語が使われ機会は多く、WikibooksのインフラストラクチャーであるMediaWikiのモジュールの記述言語のLuaもプロトタイプベースのオブジェクト指向言語です。 === 動的ディスパッチ/メッセージパッシング === メソッドの呼び出しに応じて実行する手続きコードを選択するのは、外部のコードではなく、オブジェクト管理機構の責任で、通常はオブジェクトに関連付けられたテーブルから実行時にメソッドを検索します(仮想関数テーブル)。 この機能は動的ディスパッチとして知られており、オブジェクトと、すべてのインスタンスに対して操作の実装が固定されています(静的な)抽象データ型(またはモジュール)とを区別しています。 呼び出しの可変性が、呼び出されたオブジェクトの単一の型以上に依存している場合(つまり、少なくとも1つの他のパラメータオブジェクトがメソッドの選択に関与している場合)、多重ディスパッチと言います。 メソッドの呼び出しは、メッセージパッシングとも呼ばれます。これは、メッセージ(メソッドの名前とその入力パラメータ)がディスパッチのためにオブジェクトに渡されるものとして概念化されています。 === カプセル化 === カプセル化は、オブジェクト指向プログラミングの概念の一つで、データとそのデータを操作する関数を結びつけ、外部からの干渉や誤用から両者を保護することです。データのカプセル化は、OOPの重要な概念である「データの隠蔽」につながっています。 クラスが呼び出しコードにオブジェクトの内部データへのアクセスを許可せず、メソッドを通してのみアクセスを許可している場合、これはカプセル化として知られる強力な抽象化または情報隠蔽の形態です。 一部の言語(C++やJavaなど)では、クラスがアクセス制限を明示的に行うことができます。 例えば、内部データをprivateキーワードで表し、クラス外のコードが使用することを意図したメソッドをpublicキーワードで指定します。 メソッドにはpublic、privateのほか、protected(同じクラスとそのサブクラスからのアクセスは許可するが、異なるクラスのオブジェクトからのアクセスは許可しません)のような中間レベルのデザインもあります。 他の言語(Pythonなど)では、カプセル化は慣例によってのみ強制されます(例えば、プライベートメソッドの名前はアンダースコアで始まることがあります)。 カプセル化することで、外部のコードがオブジェクトの内部動作に関与することを防ぐことができます。 これにより、コードのリファクタリングが容易になります。 例えば、クラスの作者は、外部のコードを変更することなく、そのクラスのオブジェクトが内部でどのようにデータを表現しているかを変更することができます(publicメソッドの呼び出しが同じように動作する限りにおいて)。 また、特定のデータに関連するすべてのコードを同じクラスにまとめることで、他のプログラマーが理解しやすいように整理することができます。 カプセル化は、結合度の低減(''decoupling'')を促進する技術です。 === 包含、継承、および委譲 === ==== 包含 ==== オブジェクトは、そのインスタンス変数に他のオブジェクトを含めることができますが、これを包含(オブジェクト・コンポジション; ''object composition'' )といいます。 たとえば、Employee クラスのオブジェクトは、"first_name" や "position" といった自身のインスタンス変数に加えて、Address クラスのオブジェクトを (直接またはポインタを介して) 含むことができます。 === 継承 === オブジェクト指向プログラミングをサポートしている言語は、ほとんどの場合、継承をサポートしています。 これにより、クラスを「~である」という関係を表す階層に配置することができます。 例えば、Employee クラスは Person クラスを継承しています。 スーパークラス(継承元)で利用できるデーターやメソッドは、サブクラス(継承先)にも同じ名前で表示されます。 例えば、Person クラスは、"first_name" と "last_name" という変数を "make_full_name()" というメソッドで定義しています。 これらはEmployeeクラスでも使用可能で、Employeeクラスには変数 "position "と "salary "が追加されるかもしれません。 この手法では、同じプロシージャやデータ定義を簡単に再利用できるだけでなく、現実世界の関係を直感的に反映できる可能性があります。 開発者は、データベースのテーブルやプログラミングのサブルーチンを利用するのではなく、ユーザーがより慣れ親しんでいるであろうオブジェクト、つまりアプリケーション・ドメインのオブジェクトを利用します。 サブクラスは、スーパークラスで定義されたメソッドを[[#オーバーライド|オーバーライド]]できます。 === 多重継承 === 一部の言語では多重継承が可能ですが、オーバーライドの解決が複雑になる可能性があります。 多重継承が可能な言語では、[[#Mix-in|Mix-in]]は単なるクラスであり、is-a-type-ofの関係を表していません。 === Mix-in === Mix-inは通常、複数のクラスに同じメソッドセットを追加するために使用されます。 例えば、UnicodeConversionMixinクラスは、共通の親を持たないFileReaderクラスとWebPageScraperクラスにインクルードすることで、unicode_to_ascii()というメソッドを提供することができます。 === 抽象クラス === 抽象クラスは、インスタンス化してオブジェクトにすることはできません。 抽象クラスは、インスタンス化できる他の「具象」クラスに継承するためにのみ存在します。 {{See also|Java/抽象クラス|C++/クラスの定義や継承#純粋仮想関数|Crystal#抽象クラス|Scala#抽象クラス}} === Java: final class === Javaでは、クラスがサブクラス化されるのを防ぐためにfinalキーワードを使用することができます。 final class MyFinalClass { . . . } === 開放/閉鎖原則 === 「[[W:開放/閉鎖原則]]」とは、クラスや関数は「拡張に対してはオープンであるが、変更に対してはクローズであるべき」と提唱するものです。 === 委譲 === [[W:デリゲート (プログラミング)|委譲]]( ''Delegation'' )もまた、継承の代わりに使用できる言語機能の一つです === 継承よりも合成 === 継承よりも合成を重視する考え方( ''Composition over inheritance'' )は、継承の代わりに合成を用いてhas-a関係を実装することを提唱しています。 例えば、Employee クラスは、Person クラスを継承する代わりに、Employee オブジェクトに内部の Person オブジェクトを(プライベートな)メンバー変数として持つ戦略で、Person クラスが多くの公開属性やメソッドを持っていても、外部のコードから隠すことができます。 ==== Go: 継承を構文としてはサポートしない ==== [[Go]]は、継承を全くサポートしません。ただしGoは、構造体のメンバーのメンバーをメンバー名を間に狭まずに参照することができるので、実質的に包含と継承の区別がありません。この仕組は、「名前が衝突したらどうするんだ!」と批判されることがありますが、通常の継承でもメンバー名の衝突は解決しなければいけないので、問題が増えるわけではありません。 [TODO:Goのコードで説明] === ポリモーフィズム === ポリモーフィズムの一種であるサブタイピングとは、呼び出したコードが、サポートされている階層のどのクラスを操作しているのか、親クラスなのか、子クラスなのかを問わないことです。 一方で、継承階層内のオブジェクト間では、同じ操作名でも動作が異なる場合があります。 例えば、Circle型とSquare型のオブジェクトは、Shapeという共通のクラスから派生しています。 Shapeの各型のDraw関数は、自身の描画に必要な機能を実装していますが、呼び出したコードは、描画されるShapeの特定の型には無関心でいられます。 これもまた、クラス階層の外部にあるコードを単純化し、強い関心事の分離を可能にする抽象化の一種です。 == 脚註 == <references /> 6bwyt4ure3e5eiv3v5bd2p4qjc88b22 205610 205608 2022-07-21T06:44:03Z Ef3 694 /* 動的ディスパッチ/メッセージパッシング */ 推敲 wikitext text/x-wiki = オブジェクト指向プログラミング = オブジェクト指向プログラミング(OOP; Object Oriented Programming)は、主要なプログラミングパラダイムの1つです。 オブジェクトは、モデル化されるべき実際のエンティティをエミュレートするためのメタファーとして使用されます。 オブジェクト指向プログラミングは、継承(''inheritance'')、凝集度(''cohesion'')、抽象化(''abstraction'')、ポリモーフィズム(''polymorphism'')、結合(''coupling'')、カプセル化(''encapsulation'')といった1960年代の技術をベースにしています。 オブジェクト指向プログラミングは、1990年代初頭に流行しはじめ、現在、オブジェクト指向をサポートするプログラミング言語は多岐にわたっています。 == オブジェクト指向プログラミング言語を使ったプログラミング = オブジェクト指向プログラミング? == オブジェクト指向プログラミング言語は、オブジェクト指向プログラミングを構文やライブラリで支援することで、より容易により木目細かなエラーチェックを行うことを実現したプログラミング言語です。 オブジェクト指向プログラミング言語を使っても、オブジェクト指向プログラミングとは言い難いプログラミングスタイル(例:プロシージャを整頓するためだけにクラスを使い、機能が互いのに関係がないようなプログラミング)は可能です。 また、非オブジェクト指向プログラミング言語(例:[[C言語]])を使ったとしても、カプセル化・継承・ポリモーフィズムなどのオブジェクト指向プログラミングの特徴を持ったプログラミングは可能です(例:[[W:X Toolkit Intrinsics|X Toolkit Intrinsics]]のウィジェットを継承し、新たなルックアンドフィールを持った[[W:en:X Athena Widgets|X Athena Widgets]]や[[W:en:Motif (software)|Motif Widgets]]は実装されています)。 == 特徴 == オブジェクト指向プログラミングでは、オブジェクトを使用しますが、OOP対応を謳っている言語でも、関連する技術や構造のすべてが直接サポートされているわけではなく、(メソッドやメッセージではなく)被演算子と演算子という数式アナロジーが使われます。 以下の機能は、クラス指向やオブジェクト指向が強いとされる言語(またはOOP対応のマルチパラダイム)に共通するものであるが、特筆すべき例外もあります。 === 関連する技術や構造 === 継承(inheritance)、凝集度(cohesion)、抽象化(abstraction)、ポリモーフィズム(polymorphism)、結合(coupling)、カプセル化(encapsulation) === クラスベースとプロトタイプベース === オブジェクト指向プログラミング言語は、クラスベースとプロトタイプベースに大別されます(どちらにも分類し難い言語もあります)。 OOPをサポートする言語では、コードの再利用と拡張性のために、クラスまたはプロトタイプの形で継承を使用するのが一般的です。クラスを使用する言語は、2つの主要なコンセプトをサポートしています。 ; [[#クラスベースのオブジェクト指向|クラスベース]] : 型→ユーザー定義の型の概念の拡張である「クラス」を特徴にします。 : クラスとインスタンスは、型と変数の指し示している領域に対応します。 ; [[#プロトタイプベースのオブジェクト指向|プロトタイプベース]] : クラスベースのクラスに相当するものはなく、既存のオブジェクトを雛形に新たなオブジェクトを生成し、新たなオブジェクトは雛形となったオブジェクトからフィールドとメソッドを引き継ぎます。 一部の言語では、クラスとオブジェクトは、traitやMix-inなどの他の概念を用いて構成することができます。 ==== クラスベースのオブジェクト指向 ==== クラスベースの言語では、あらかじめクラスが定義されており、オブジェクトはクラスに基づいてインスタンス化されます。 ===== オブジェクトとクラス ===== ;クラス:与えられたタイプまたはクラスのオブジェクトのデータフォーマットと利用可能な手続きの定義。データと手続き(クラスメソッドとして知られています)自体を含むこともあり、つまりクラスはフィールド(データメンバー・属性とも)とメソッド(メンバー関数とも)を含む。 ;オブジェクト :クラスのインスタンス :オブジェクトは、現実の世界にあるものに対応することがあります。例えば、グラフィックプログラムでは、"circle"、"square"、"menu "などのオブジェクトがあります。また、オンライン・ショッピング・システムでは、「ショッピング・カート」、「カスタマー」、「プロダクト」などのオブジェクトがあります。オブジェクトは、オープン・ファイルを表すオブジェクトや、ヤードポンド法からメートル法に変換するサービスを提供するオブジェクトなど、より抽象的な実体を表すこともあります。 オブジェクト指向プログラミングとは、単なるクラスやオブジェクトではなく、データフィールドやメソッドを含むオブジェクト(データ構造)を中心としたプログラミングパラダイム全体のことです。これを理解することは不可欠です。 クラスを使って、関係のない手続きをまとめて整理することは、オブジェクト指向ではありません。 各オブジェクトは、特定のクラスのインスタンスであると言われています(例えば、nameフィールドに "Mary"が設定されているオブジェクトは、Employeeクラスのインスタンスであると言えます)。オブジェクト指向プログラミングにおけるプロシージャはメソッドと呼ばれ、変数はフィールド、メンバー、アトリビュート、またはプロパティとも呼ばれます。そのため、以下のような用語があります。 ;クラス変数:クラス全体に属するもので、1つのコピーしか存在しません。 ;インスタンス変数または属性:個々のオブジェクトに属するデータで、各オブジェクトはそれぞれのコピーを持っています。 ;メンバー変数:特定のクラスで定義されているクラス変数とインスタンス変数の両方を指します。 ;クラスメソッド:クラス全体に属し、クラス変数とプロシージャコールからの入力にのみアクセスできます。 ;インスタンス・メソッド:個々のオブジェクトに属し、呼び出された特定のオブジェクトのインスタンス変数、入力、およびクラス変数にアクセスできます。 オブジェクトは、複雑な内部構造を持つ変数のようにアクセスされ、多くの言語では効果的にポインタとなり、ヒープやスタック内のメモリにある当該オブジェクトの単一インスタンスへの実際の参照として機能します。オブジェクトは、内部コードと外部コードを分離するために使用できる抽象化の層を提供します。外部のコードは、特定の入力パラメータセットで特定のインスタンスメソッドを呼び出したり、インスタンス変数を読み込んだり、インスタンス変数に書き込んだりすることで、オブジェクトを使用することができます。オブジェクトは、コンストラクタと呼ばれるクラス内の特殊なメソッドを呼び出すことで生成されます。プログラムは、実行中に同じクラスのインスタンスを多数作成し、それらが独立して動作することがあります。これは、同じ手順を異なるデータセットに対して使用するための簡単な方法です。 クラスを用いたオブジェクト指向プログラミングをクラスベース・プログラミングと呼ぶことがあるが、プロトタイプベース・プログラミングではクラスを用いないのが一般的です。そのため、オブジェクトとインスタンスの概念を定義するために、大きく異なるが類似した用語が使用されています。 ==== プロトタイプベースのオブジェクト指向 ==== プロトタイプベースの言語では、オブジェクトが主な実体です。クラスも存在しません。オブジェクトのプロトタイプは、そのオブジェクトがリンクされている別のオブジェクトに過ぎません。すべてのオブジェクトは、1つのプロトタイプリンクを持っています(1つだけです)。新しいオブジェクトは、プロトタイプとして選ばれた既存のオブジェクトに基づいて作成することができます。 プロトタイプベースの言語では、本質的にインスタンス化と継承は同じメカニズムの別の角度から見た射影です。 多くのオブジェクト指向プログラミング言語はクラスベースですが、殆どのウェブブラウザはJavaScriptエンジンを搭載していることから、プロトタイプベースのオブジェクト指向言語が使われ機会は多く、WikibooksのインフラストラクチャーであるMediaWikiのモジュールの記述言語のLuaもプロトタイプベースのオブジェクト指向言語です。 === 動的ディスパッチ/メッセージパッシング === メソッドの呼出しに応じて実行する手続きコードを選択するのは、外部のコードではなく、オブジェクト管理機構の責任で、通常はオブジェクトに関連付けられたテーブルから実行時にメソッドを検索します(仮想関数テーブル)。 この機能は動的ディスパッチとして知られており、オブジェクトと、すべてのインスタンスに対して操作の実装が固定された(静的な)抽象データ型(またはモジュール)とを区別しています。 呼出しの可変性が、呼出されたオブジェクトの単一の型以上に依存している場合(つまり、少なくとも1つの他のパラメータオブジェクトがメソッドの選択に関与している場合)、多重ディスパッチと言います。 メソッドの呼出しは、メッセージパッシングとも呼ばれます。これは、メッセージ(メソッドの名前とその入力パラメータ)がディスパッチのためにオブジェクトに渡されるものとして概念化されています。 === カプセル化 === カプセル化は、オブジェクト指向プログラミングの概念の一つで、データとそのデータを操作する関数を結びつけ、外部からの干渉や誤用から両者を保護することです。データのカプセル化は、OOPの重要な概念である「データの隠蔽」につながっています。 クラスが呼び出しコードにオブジェクトの内部データへのアクセスを許可せず、メソッドを通してのみアクセスを許可している場合、これはカプセル化として知られる強力な抽象化または情報隠蔽の形態です。 一部の言語(C++やJavaなど)では、クラスがアクセス制限を明示的に行うことができます。 例えば、内部データをprivateキーワードで表し、クラス外のコードが使用することを意図したメソッドをpublicキーワードで指定します。 メソッドにはpublic、privateのほか、protected(同じクラスとそのサブクラスからのアクセスは許可するが、異なるクラスのオブジェクトからのアクセスは許可しません)のような中間レベルのデザインもあります。 他の言語(Pythonなど)では、カプセル化は慣例によってのみ強制されます(例えば、プライベートメソッドの名前はアンダースコアで始まることがあります)。 カプセル化することで、外部のコードがオブジェクトの内部動作に関与することを防ぐことができます。 これにより、コードのリファクタリングが容易になります。 例えば、クラスの作者は、外部のコードを変更することなく、そのクラスのオブジェクトが内部でどのようにデータを表現しているかを変更することができます(publicメソッドの呼び出しが同じように動作する限りにおいて)。 また、特定のデータに関連するすべてのコードを同じクラスにまとめることで、他のプログラマーが理解しやすいように整理することができます。 カプセル化は、結合度の低減(''decoupling'')を促進する技術です。 === 包含、継承、および委譲 === ==== 包含 ==== オブジェクトは、そのインスタンス変数に他のオブジェクトを含めることができますが、これを包含(オブジェクト・コンポジション; ''object composition'' )といいます。 たとえば、Employee クラスのオブジェクトは、"first_name" や "position" といった自身のインスタンス変数に加えて、Address クラスのオブジェクトを (直接またはポインタを介して) 含むことができます。 === 継承 === オブジェクト指向プログラミングをサポートしている言語は、ほとんどの場合、継承をサポートしています。 これにより、クラスを「~である」という関係を表す階層に配置することができます。 例えば、Employee クラスは Person クラスを継承しています。 スーパークラス(継承元)で利用できるデーターやメソッドは、サブクラス(継承先)にも同じ名前で表示されます。 例えば、Person クラスは、"first_name" と "last_name" という変数を "make_full_name()" というメソッドで定義しています。 これらはEmployeeクラスでも使用可能で、Employeeクラスには変数 "position "と "salary "が追加されるかもしれません。 この手法では、同じプロシージャやデータ定義を簡単に再利用できるだけでなく、現実世界の関係を直感的に反映できる可能性があります。 開発者は、データベースのテーブルやプログラミングのサブルーチンを利用するのではなく、ユーザーがより慣れ親しんでいるであろうオブジェクト、つまりアプリケーション・ドメインのオブジェクトを利用します。 サブクラスは、スーパークラスで定義されたメソッドを[[#オーバーライド|オーバーライド]]できます。 === 多重継承 === 一部の言語では多重継承が可能ですが、オーバーライドの解決が複雑になる可能性があります。 多重継承が可能な言語では、[[#Mix-in|Mix-in]]は単なるクラスであり、is-a-type-ofの関係を表していません。 === Mix-in === Mix-inは通常、複数のクラスに同じメソッドセットを追加するために使用されます。 例えば、UnicodeConversionMixinクラスは、共通の親を持たないFileReaderクラスとWebPageScraperクラスにインクルードすることで、unicode_to_ascii()というメソッドを提供することができます。 === 抽象クラス === 抽象クラスは、インスタンス化してオブジェクトにすることはできません。 抽象クラスは、インスタンス化できる他の「具象」クラスに継承するためにのみ存在します。 {{See also|Java/抽象クラス|C++/クラスの定義や継承#純粋仮想関数|Crystal#抽象クラス|Scala#抽象クラス}} === Java: final class === Javaでは、クラスがサブクラス化されるのを防ぐためにfinalキーワードを使用することができます。 final class MyFinalClass { . . . } === 開放/閉鎖原則 === 「[[W:開放/閉鎖原則]]」とは、クラスや関数は「拡張に対してはオープンであるが、変更に対してはクローズであるべき」と提唱するものです。 === 委譲 === [[W:デリゲート (プログラミング)|委譲]]( ''Delegation'' )もまた、継承の代わりに使用できる言語機能の一つです === 継承よりも合成 === 継承よりも合成を重視する考え方( ''Composition over inheritance'' )は、継承の代わりに合成を用いてhas-a関係を実装することを提唱しています。 例えば、Employee クラスは、Person クラスを継承する代わりに、Employee オブジェクトに内部の Person オブジェクトを(プライベートな)メンバー変数として持つ戦略で、Person クラスが多くの公開属性やメソッドを持っていても、外部のコードから隠すことができます。 ==== Go: 継承を構文としてはサポートしない ==== [[Go]]は、継承を全くサポートしません。ただしGoは、構造体のメンバーのメンバーをメンバー名を間に狭まずに参照することができるので、実質的に包含と継承の区別がありません。この仕組は、「名前が衝突したらどうするんだ!」と批判されることがありますが、通常の継承でもメンバー名の衝突は解決しなければいけないので、問題が増えるわけではありません。 [TODO:Goのコードで説明] === ポリモーフィズム === ポリモーフィズムの一種であるサブタイピングとは、呼び出したコードが、サポートされている階層のどのクラスを操作しているのか、親クラスなのか、子クラスなのかを問わないことです。 一方で、継承階層内のオブジェクト間では、同じ操作名でも動作が異なる場合があります。 例えば、Circle型とSquare型のオブジェクトは、Shapeという共通のクラスから派生しています。 Shapeの各型のDraw関数は、自身の描画に必要な機能を実装していますが、呼び出したコードは、描画されるShapeの特定の型には無関心でいられます。 これもまた、クラス階層の外部にあるコードを単純化し、強い関心事の分離を可能にする抽象化の一種です。 == 脚註 == <references /> lr45nn01s55yfc0bnwsuoul2n78tis5 205611 205610 2022-07-21T07:48:15Z Ef3 694 /*メタクラス*/クラスベース継承において、(インスタンスとしての)クラスもまたオブジェクトとして扱おうとした時、クラスの属するクラス(=メタクラス)が仮定されます。 では、メタクラスの属するクラスは?・・・メタクラス自身もメタクラスのインスタンスです。 ここで「有向無サイクルグラフ」の仮定が壊れます。 メタクラスの位置づけは言語によって様々で、初期のSmalltalk(Smalltalk-76)では、Classという単一のクラスがメタクラスでしたが、Smalltalk(Smalltalk-80)では、すべてのクラスに独自のメタクラスがあり、それぞれのメタクラスは単一のMetaclass classのインスタンスです(メタのメタのメタ…の無限の連鎖は避けている)。少し想像すると判るように、メタクラスの操作は概念上のシフトが必要で、微妙で煩雑なものとなりがちです(パラドクスと言ってもいい)。 このような複雑さを解決するために、「クラスなんてなかった、インスタンスはインスタンスの複製によって生成して、複製を新たに修飾し目的を達成する」というアプローチが生まれました。 wikitext text/x-wiki = オブジェクト指向プログラミング = オブジェクト指向プログラミング(OOP; Object Oriented Programming)は、主要なプログラミングパラダイムの1つです。 オブジェクトは、モデル化されるべき実際のエンティティをエミュレートするためのメタファーとして使用されます。 オブジェクト指向プログラミングは、継承(''inheritance'')、凝集度(''cohesion'')、抽象化(''abstraction'')、ポリモーフィズム(''polymorphism'')、結合(''coupling'')、カプセル化(''encapsulation'')といった1960年代の技術をベースにしています。 オブジェクト指向プログラミングは、1990年代初頭に流行しはじめ、現在、オブジェクト指向をサポートするプログラミング言語は多岐にわたっています。 == オブジェクト指向プログラミング言語を使ったプログラミング = オブジェクト指向プログラミング? == オブジェクト指向プログラミング言語は、オブジェクト指向プログラミングを構文やライブラリで支援することで、より容易により木目細かなエラーチェックを行うことを実現したプログラミング言語です。 オブジェクト指向プログラミング言語を使っても、オブジェクト指向プログラミングとは言い難いプログラミングスタイル(例:プロシージャを整頓するためだけにクラスを使い、機能が互いのに関係がないようなプログラミング)は可能です。 また、非オブジェクト指向プログラミング言語(例:[[C言語]])を使ったとしても、カプセル化・継承・ポリモーフィズムなどのオブジェクト指向プログラミングの特徴を持ったプログラミングは可能です(例:[[W:X Toolkit Intrinsics|X Toolkit Intrinsics]]のウィジェットを継承し、新たなルックアンドフィールを持った[[W:en:X Athena Widgets|X Athena Widgets]]や[[W:en:Motif (software)|Motif Widgets]]は実装されています)。 == 特徴 == オブジェクト指向プログラミングでは、オブジェクトを使用しますが、OOP対応を謳っている言語でも、関連する技術や構造のすべてが直接サポートされているわけではなく、(メソッドやメッセージではなく)被演算子と演算子という数式アナロジーが使われます。 以下の機能は、クラス指向やオブジェクト指向が強いとされる言語(またはOOP対応のマルチパラダイム)に共通するものであるが、特筆すべき例外もあります。 === 関連する技術や構造 === 継承(inheritance)、凝集度(cohesion)、抽象化(abstraction)、ポリモーフィズム(polymorphism)、結合(coupling)、カプセル化(encapsulation) === クラスベースとプロトタイプベース === オブジェクト指向プログラミング言語は、クラスベースとプロトタイプベースに大別されます(どちらにも分類し難い言語もあります)。 OOPをサポートする言語では、コードの再利用と拡張性のために、クラスまたはプロトタイプの形で継承を使用するのが一般的です。クラスを使用する言語は、2つの主要なコンセプトをサポートしています。 ; [[#クラスベースのオブジェクト指向|クラスベース]] : 型→ユーザー定義の型の概念の拡張である「クラス」を特徴にします。 : クラスとインスタンスは、型と変数の指し示している領域に対応します。 ; [[#プロトタイプベースのオブジェクト指向|プロトタイプベース]] : クラスベースのクラスに相当するものはなく、既存のオブジェクトを雛形に新たなオブジェクトを生成し、新たなオブジェクトは雛形となったオブジェクトからフィールドとメソッドを引き継ぎます。 一部の言語では、クラスとオブジェクトは、traitやMix-inなどの他の概念を用いて構成することができます。 ==== クラスベースのオブジェクト指向 ==== クラスベースの言語では、あらかじめクラスが定義されており、オブジェクトはクラスに基づいてインスタンス化されます。 ===== オブジェクトとクラス ===== ;クラス:与えられたタイプまたはクラスのオブジェクトのデータフォーマットと利用可能な手続きの定義。データと手続き(クラスメソッドとして知られています)自体を含むこともあり、つまりクラスはフィールド(データメンバー・属性とも)とメソッド(メンバー関数とも)を含む。 ;オブジェクト :クラスのインスタンス :オブジェクトは、現実の世界にあるものに対応することがあります。例えば、グラフィックプログラムでは、"circle"、"square"、"menu "などのオブジェクトがあります。また、オンライン・ショッピング・システムでは、「ショッピング・カート」、「カスタマー」、「プロダクト」などのオブジェクトがあります。オブジェクトは、オープン・ファイルを表すオブジェクトや、ヤードポンド法からメートル法に変換するサービスを提供するオブジェクトなど、より抽象的な実体を表すこともあります。 オブジェクト指向プログラミングとは、単なるクラスやオブジェクトではなく、データフィールドやメソッドを含むオブジェクト(データ構造)を中心としたプログラミングパラダイム全体のことです。これを理解することは不可欠です。 クラスを使って、関係のない手続きをまとめて整理することは、オブジェクト指向ではありません。 各オブジェクトは、特定のクラスのインスタンスであると言われています(例えば、nameフィールドに "Mary"が設定されているオブジェクトは、Employeeクラスのインスタンスであると言えます)。オブジェクト指向プログラミングにおけるプロシージャはメソッドと呼ばれ、変数はフィールド、メンバー、アトリビュート、またはプロパティとも呼ばれます。そのため、以下のような用語があります。 ;クラス変数:クラス全体に属するもので、1つのコピーしか存在しません。 ;インスタンス変数または属性:個々のオブジェクトに属するデータで、各オブジェクトはそれぞれのコピーを持っています。 ;メンバー変数:特定のクラスで定義されているクラス変数とインスタンス変数の両方を指します。 ;クラスメソッド:クラス全体に属し、クラス変数とプロシージャコールからの入力にのみアクセスできます。 ;インスタンス・メソッド:個々のオブジェクトに属し、呼び出された特定のオブジェクトのインスタンス変数、入力、およびクラス変数にアクセスできます。 オブジェクトは、複雑な内部構造を持つ変数のようにアクセスされ、多くの言語では効果的にポインタとなり、ヒープやスタック内のメモリにある当該オブジェクトの単一インスタンスへの実際の参照として機能します。オブジェクトは、内部コードと外部コードを分離するために使用できる抽象化の層を提供します。外部のコードは、特定の入力パラメータセットで特定のインスタンスメソッドを呼び出したり、インスタンス変数を読み込んだり、インスタンス変数に書き込んだりすることで、オブジェクトを使用することができます。オブジェクトは、コンストラクタと呼ばれるクラス内の特殊なメソッドを呼び出すことで生成されます。プログラムは、実行中に同じクラスのインスタンスを多数作成し、それらが独立して動作することがあります。これは、同じ手順を異なるデータセットに対して使用するための簡単な方法です。 クラスを用いたオブジェクト指向プログラミングをクラスベース・プログラミングと呼ぶことがあるが、プロトタイプベース・プログラミングではクラスを用いないのが一般的です。そのため、オブジェクトとインスタンスの概念を定義するために、大きく異なるが類似した用語が使用されています。 ==== プロトタイプベースのオブジェクト指向 ==== プロトタイプベースの言語では、オブジェクトが主な実体です。クラスも存在しません。オブジェクトのプロトタイプは、そのオブジェクトがリンクされている別のオブジェクトに過ぎません。すべてのオブジェクトは、1つのプロトタイプリンクを持っています(1つだけです)。新しいオブジェクトは、プロトタイプとして選ばれた既存のオブジェクトに基づいて作成することができます。 プロトタイプベースの言語では、本質的にインスタンス化と継承は同じメカニズムの別の角度から見た射影です。 多くのオブジェクト指向プログラミング言語はクラスベースですが、殆どのウェブブラウザはJavaScriptエンジンを搭載していることから、プロトタイプベースのオブジェクト指向言語が使われ機会は多く、WikibooksのインフラストラクチャーであるMediaWikiのモジュールの記述言語のLuaもプロトタイプベースのオブジェクト指向言語です。 === 動的ディスパッチ/メッセージパッシング === メソッドの呼出しに応じて実行する手続きコードを選択するのは、外部のコードではなく、オブジェクト管理機構の責任で、通常はオブジェクトに関連付けられたテーブルから実行時にメソッドを検索します(仮想関数テーブル)。 この機能は動的ディスパッチとして知られており、オブジェクトと、すべてのインスタンスに対して操作の実装が固定された(静的な)抽象データ型(またはモジュール)とを区別しています。 呼出しの可変性が、呼出されたオブジェクトの単一の型以上に依存している場合(つまり、少なくとも1つの他のパラメータオブジェクトがメソッドの選択に関与している場合)、多重ディスパッチと言います。 メソッドの呼出しは、メッセージパッシングとも呼ばれます。これは、メッセージ(メソッドの名前とその入力パラメータ)がディスパッチのためにオブジェクトに渡されるものとして概念化されています。 === カプセル化 === カプセル化は、オブジェクト指向プログラミングの概念の一つで、データとそのデータを操作する関数を結びつけ、外部からの干渉や誤用から両者を保護することです。データのカプセル化は、OOPの重要な概念である「データの隠蔽」につながっています。 クラスが呼び出しコードにオブジェクトの内部データへのアクセスを許可せず、メソッドを通してのみアクセスを許可している場合、これはカプセル化として知られる強力な抽象化または情報隠蔽の形態です。 一部の言語(C++やJavaなど)では、クラスがアクセス制限を明示的に行うことができます。 例えば、内部データをprivateキーワードで表し、クラス外のコードが使用することを意図したメソッドをpublicキーワードで指定します。 メソッドにはpublic、privateのほか、protected(同じクラスとそのサブクラスからのアクセスは許可するが、異なるクラスのオブジェクトからのアクセスは許可しません)のような中間レベルのデザインもあります。 他の言語(Pythonなど)では、カプセル化は慣例によってのみ強制されます(例えば、プライベートメソッドの名前はアンダースコアで始まることがあります)。 カプセル化することで、外部のコードがオブジェクトの内部動作に関与することを防ぐことができます。 これにより、コードのリファクタリングが容易になります。 例えば、クラスの作者は、外部のコードを変更することなく、そのクラスのオブジェクトが内部でどのようにデータを表現しているかを変更することができます(publicメソッドの呼び出しが同じように動作する限りにおいて)。 また、特定のデータに関連するすべてのコードを同じクラスにまとめることで、他のプログラマーが理解しやすいように整理することができます。 カプセル化は、結合度の低減(''decoupling'')を促進する技術です。 === 包含、継承、および委譲 === ==== 包含 ==== オブジェクトは、そのインスタンス変数に他のオブジェクトを含めることができますが、これを包含(オブジェクト・コンポジション; ''object composition'' )といいます。 たとえば、Employee クラスのオブジェクトは、"first_name" や "position" といった自身のインスタンス変数に加えて、Address クラスのオブジェクトを (直接またはポインタを介して) 含むことができます。 === 継承 === オブジェクト指向プログラミングにおいて、あるオブジェクトやクラスを別のクラス(クラスベース継承)やオブジェクト(プロトタイプベース継承)をベースにして、同様の実装を保持する仕組みのことを「継承」といいます。 ==== クラスベース継承 ==== クラスベース継承では、スーパークラスと呼ばっる既存のクラスから新しいクラス(サブクラス)を派生させ、クラスの階層を形成します。継承によって生成されたオブジェクト(派生オブジェクト)は、スーパークラス(あるいはプロトタイプ)のコンストラクタ、デストラクタ、オーバーロード演算子、フレンド関数を除き、親オブジェクトのすべてのプロパティと動作を獲得します。 サブクラスは、スーパークラスで定義されたメソッドを[[#オーバーライド|オーバーライド]]もできます。 継承によって、プログラマは既存のクラスの上にクラスを作成し、同じ振る舞いを維持しながら新しい実装を指定し(インターフェースの実現)、コードを再利用し、パブリッククラスやインターフェースによって元のソフトウェアを独自に拡張することができます。継承によるクラスの関係は、有向無サイクルグラフを生み出します。 ===== スーパークラス ===== スーパークラスは、クラスベース継承における継承元となるクラス。 ===== サブクラス ===== サブクラスは、クラスベース継承における継承先となるクラス。 ===== メタクラス ===== クラスベース継承において、(インスタンスとしての)クラスもまたオブジェクトとして扱おうとした時、クラスの属するクラス(=メタクラス)が仮定されます。 では、メタクラスの属するクラスは?・・・メタクラス自身もメタクラスのインスタンスです。 ここで「有向無サイクルグラフ」の仮定が壊れます。 メタクラスの位置づけは言語によって様々で、メタクラスを持たない<!--自称-->オブジェクト指向言語もあります。 初期のSmalltalk(Smalltalk-76)では、Classという単一のクラスがメタクラスでしたが、Smalltalk(Smalltalk-80)では、すべてのクラスに独自のメタクラスがあり、それぞれのメタクラスは単一のMetaclass classのインスタンスです(メタのメタのメタ…の無限の連鎖は避けている)。少し想像すると判るように、メタクラスの操作は概念上のシフトが必要で、微妙で煩雑なものとなりがちです(パラドクスと言ってもいい)。 このような複雑さを解決するために、「クラスなんてなかった、インスタンスはインスタンスの複製によって生成して、複製を新たに修飾し目的を達成する」というアプローチが生まれました。これが、[[#プロトタイプベースのオブジェクト指向|プロトタイプベースのオブジェクト指向]]/[[#プロトタイプベース継承|プロトタイプベース継承]]です(プロトタイプベースはインスタンスベースとも呼ばれます)。 ==== プロトタイプベース継承 ==== プロトタイプベース継承では、プロトタイプと呼ばれる既存のオブジェクトを複製し新しいオブジェクトを派生させ、プロトタイプの階層を形成します。複製されたオブジェクト(派生オブジェクト)は、プロトタイプへの参照を持ち、それを通じてプロトタイプのすべてのプロパティ(データプロパティと関数プロパティ)を獲得します。 派生オブジェクトは、プロトタイプで定義されたプロパティを[[#オーバーライド|オーバーライド]]もできます。 継承によって、プログラマは既存のオブジェクトから新しいオブジェクトを生成し、同じ振る舞いを維持しながら新しい実装を指定し(インターフェースの実現)、コードを再利用し、パブリックオブジェクトやインターフェースによって元のソフトウェアを独自に拡張することができます。継承によるオブジェクトの関係は、有向無サイクルグラフを生み出します。 ===== プロトタイプ ===== プロトタイプは、プロトタイプベース継承における継承元となるオブジェクト。 ===== 派生オブジェクト ===== 派生オブジェクトは、プロトタイプベース継承における継承先となるオブジェクト。 派生オブジェクトも、プロトタイプになることができるので、ことさら派生を強調せず、単にオブジェクトと称されます。 ===== プロトタイプ チェーン ===== すべてのオブジェクトは、プロトタイプへの参照を保持しており、プロトタイプもまたオブジェクトなので、プロトタイプは単方向リストになります。プロトタイプを手繰ることによる単方向リストを、プロトタイプ チェーン( ''prototype chain'' )と呼びます。プロトタイプ チェインを遡ると、自分自身をプロトタイプにする特別なオブジェクトに行き着きます。このオブジェクトが始祖のオブジェクトで、JavaScriptでは Object、Lua では Table です。 オブジェクトのプロパティを参照する時、まずオブジェクト自身のスロットにプロパティ キーが無いかしら調べ、あればプロパティ 値を返します。なかった時は、1つプロトタイプ チェインを遡り、探しみつかればその値を返します。始祖のオブジェクトまで遡っても見つからなければ「存在しないプロパティの参照」とします。 プロパティの[[#オーバーライド|オーバーライド]]の実装は、このようにプロトタイプ チェーンによって実現しています。 === 多重継承 === 一部の言語では多重継承が可能ですが、オーバーライドの解決が複雑になる可能性があります。 多重継承が可能な言語では、[[#Mix-in|Mix-in]]は単なるクラスであり、is-a-type-ofの関係を表していません。 === Mix-in === Mix-inは通常、複数のクラスに同じメソッドセットを追加するために使用されます。 例えば、UnicodeConversionMixinクラスは、共通の親を持たないFileReaderクラスとWebPageScraperクラスにインクルードすることで、unicode_to_ascii()というメソッドを提供することができます。 === 抽象クラス === 抽象クラスは、インスタンス化してオブジェクトにすることはできません。 抽象クラスは、インスタンス化できる他の「具象」クラスに継承するためにのみ存在します。 {{See also|Java/抽象クラス|C++/クラスの定義や継承#純粋仮想関数|Crystal#抽象クラス|Scala#抽象クラス}} === Java: final class === Javaでは、クラスがサブクラス化されるのを防ぐためにfinalキーワードを使用することができます。 final class MyFinalClass { . . . } === 開放/閉鎖原則 === 「[[W:開放/閉鎖原則]]」とは、クラスや関数は「拡張に対してはオープンであるが、変更に対してはクローズであるべき」と提唱するものです。 === 委譲 === [[W:デリゲート (プログラミング)|委譲]]( ''Delegation'' )もまた、継承の代わりに使用できる言語機能の一つです === 継承よりも合成 === 継承よりも合成を重視する考え方( ''Composition over inheritance'' )は、継承の代わりに合成を用いてhas-a関係を実装することを提唱しています。 例えば、Employee クラスは、Person クラスを継承する代わりに、Employee オブジェクトに内部の Person オブジェクトを(プライベートな)メンバー変数として持つ戦略で、Person クラスが多くの公開属性やメソッドを持っていても、外部のコードから隠すことができます。 ==== Go: 継承を構文としてはサポートしない ==== [[Go]]は、継承を全くサポートしません。ただしGoは、構造体のメンバーのメンバーをメンバー名を間に狭まずに参照することができるので、実質的に包含と継承の区別がありません。この仕組は、「名前が衝突したらどうするんだ!」と批判されることがありますが、通常の継承でもメンバー名の衝突は解決しなければいけないので、問題が増えるわけではありません。 [TODO:Goのコードで説明] === ポリモーフィズム === ポリモーフィズムの一種であるサブタイピングとは、呼び出したコードが、サポートされている階層のどのクラスを操作しているのか、スーパークラスなのか、サブクラスなのかを問わないことです。 一方で、継承階層内のオブジェクト間では、同じ操作名でも動作が異なる場合があります。 例えば、Circle型とSquare型のオブジェクトは、Shapeという共通のクラスから派生しています。 Shapeの各型のDraw関数は、自身の描画に必要な機能を実装していますが、呼び出したコードは、描画されるShapeの特定の型には無関心でいられます。 これもまた、クラス階層の外部にあるコードを単純化し、強い関心事の分離を可能にする抽象化の一種です。 == 脚註 == <references /> kkjaajkpe46lquz9cvdjcdhkfjkpn48 利用者:Mugenpman 2 33858 205587 203340 2022-07-20T16:33:57Z Mugenpman 65532 wikitext text/x-wiki {{#babel:ja|en-2}} ウィキペディアでの活動がメインです。 [[Wikijunior:言葉]]の執筆を頑張ります。 h96pdzk7qma3mcaz6kcasp1kwplcyio Scala 0 34689 205609 204885 2022-07-21T06:25:51Z Ef3 694 /* トレイト */ Fix typo wikitext text/x-wiki {{Pathnav|メインページ|工学|情報技術|プログラミング|frame=1}} {{Wikipedia}} 本書は、[[w:Scala|Scala]]のチュートリアルです。 Scalaは、[[W:汎用プログラミング言語|汎用プログラミング言語]]の1つで、[[W:関数型プログラミング|関数型プログラミング言語]]と[[W:オブジェクト指向プログラミング|オブジェクト指向プログラミング言語]]のハイブリッドです。 <!-- イントロ長すぎ! 「はじめに」か「コラム」する構成を検討中 --> Scalaのソースコードは、[[W:Javaバイトコード|Javaバイトコード]]にコンパイルされ、[[W:Java仮想マシン|Java仮想マシン]](JVM)上で実行することができます。 Scalaは、[[Java]] との相互運用性を提供しており、どちらの言語で書かれたライブラリもScalaやJavaのコードで直接参照できます。 Scalaは、Javaと同じくオブジェクト指向で、[[C言語]]に近いカーリーブラケット構文<ref>カーリーブラケットとは波括弧 <code>{}</code> のことで、コードブロックやデータブロックの表現に使われます。</ref>を持ちます。 Scala 3以降、ブロックの構造にオフサイドルール(インデント)を使用するオプションもあり、その使用が推奨されています。 Scalaは、Javaとは異なり関数型プログラミング言語([[Lisp]]・[[Scheme]]・[[OCaml]]・[[Standard ML]]・[[Haskell]] など)の多くの特徴を持っており、カリー化・イミュータブル性・遅延評価・パターンマッチが含まれます。 また、代数的データ型・共分散と共変量・高次演算子(ただしパラメトリック多相性は除く)や匿名型もサポートする先進の型システムも備えています。 その他、JavaにないScalaの特徴として、演算子オーバーロード・オプションのパラメータ・名前付きパラメータ・Raw文字列があります。 逆に、ScalaにないJavaの特徴として、チェック付き例外があり、これについての議論は続いています。 Scalaという名前は、''scalable''と''language''の合成語で、ユーザーの要求に合わせて成長するように設計されていることを意味しています。 <!-- ベクトル・スカラー のスカラーは scalar です。英語では vector/ヴェクター・scalar/スケーラー に近い発音です。 --> __TOC__ == はじめに == === Hello, World! === 他の多くのチュートリアルがそうであるように、私たちもまずはScalaの世界にあいさつすることから始めましょう。 ''hello.scala''というファイルを作り(Scalaではソースファイルに''.scala''という拡張子を付けることが通例となっています)、次のように書いて保存して下さい。 ;[https://paiza.io/projects/QNLS9UYljt6PgoAzPZPWbA?language=scala hello.scala]:<syntaxhighlight lang=Scala> object Main extends App{ println("Hello world!") } </syntaxhighlight> == 環境 == * オンライン開発実行環境 * Javaとscalaのインストールとバージョン確認 == コメント == Scalaのコメントの構文は2つあります *// から行末までがコメントになります // 一行コメント * /* から */ までがコメントなります(他の多くのプログラミング言語と違いネスト(入れ子)に出来ます) /* 複数行にまたがることが出来るコメント /* ネスト1 /* ネスト2 */ */ */ == ; の自動挿入 == Scalaでは、JavaScriptやGoの様に ; が自動挿入されます。 ❌ var x = 1 + 2 + 3 ⭕ var x = 1 + 2 + 3 == 変数と型とリテラル == Scalaは、関数型プログラミング言語ですが、純粋関数言語ではないので変数があります。 === 変数の宣言と初期化と参照 === Scalaで変数を使うためには、宣言が必要です。 ==== val:イミュータブル変数宣言 ==== ;[https://paiza.io/projects/cQSDnyoWVrZZ1niEXur3xw?language=scala コード例]:<syntaxhighlight lang=Scala> // val i: Int = 0 // !!! error: expected class or object definition !!! object Main extends App { val i: Int = 123 // i = 0 // !!! error: reassignment to val !!! println(i) } </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> 123 </syntaxhighlight> : 1行目は、Object の定義の外で宣言しようとしても失敗する例です。 :: Scala には、グローバル変数はありません。 :: // から行末まではコメントになります。 : object Main の中で、Int型の変数 i を宣言し、123 で初期化しています。 : val で宣言した i に 0 を代入しようとしていますがエラーになります。 :: val で宣言した変数に、代入する事は出来ません。この様な変数を'''イミュータブル'''な変数と言います。 : <code>println(i)</code> の様に、変数の値は変数名(この場合は <var>i</var>)を使って参照できます。 ==== var:ミュータブル変数宣言 ==== ;[https://paiza.io/projects/m7W0SR6MfF9i4obsqJz4rg?language=scala コード例]:<syntaxhighlight lang=Scala> // var i: Int = 0 // !!! error: expected class or object definition !!! object Main extends App { var i: Int = 123 i = 0 println(i) } </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> 0 </syntaxhighlight> : 1行目は、Object の定義の外で宣言しようとしても失敗する例です。 :: ミュータブルであっても、グローバル変数は作れません。 : object Main の中で、Int型の変数 i を宣言し、123 で初期化しています。 : var で宣言した i には 0 を代入する事ができます。この様な変数を'''ミュータブル'''な変数と言います。 ==== 変数宣言に関する詳細 ==== ===== 未初期化はコンパイルエラー ===== ;[https://paiza.io/projects/j8TR9XpQJgHf-649jReSDA?language=scala コード例(コンパイルエラー)]:<syntaxhighlight lang=Scala highlight=2 line> object Main extends App { var i: Int println(i) } </syntaxhighlight> ;コンパイル結果:<syntaxhighlight lang=text> 1 error Main.scala:2: error: only traits and abstract classes can have declared but undefined members (Note that variables need to be initialized to be defined) var i: Int ^ </syntaxhighlight> ===== _ を使ったディフォルト値を使った初期化 ===== ;[https://paiza.io/projects/db05Fc4iWgF226hG5uAd6Q?language=scala コード例]:<syntaxhighlight lang=Scala highlight="2,4,6,8" line> object Main extends App { var i: Int = _ println(i) var f: Boolean = _ println(f) var s: String = _ println(s) var m: Map[String, Int] = _ println(m) } </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> 0 false null null </syntaxhighlight> : 識別子 <code>_</code> を初期化に使うと、その型のディフォルト値で初期化されます。 :: 数値は 0、Boolean は false、他は null がディフォルト値となります。 :: [[Go]] のゼロ値と似ていますが、明示的に _ で初期化するところが違います。 ===== 同じ式による複数の変数の初期化 ===== ;[https://paiza.io/projects/8kUN8FqfxdoL9YDlB37_dg?language=scala コード例]:<syntaxhighlight lang=Scala highlight="2,5,8-9" line> object Main extends App { val i, j, k = 42 println(i, j, k) val u, v, w = new Array(5) println(u, v, w) var n: Int = 0 val x, y, z = { n += 1 ; n } println(x, y, z) } </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> (42,42,42) ([Ljava.lang.Object;@7c16905e,[Ljava.lang.Object;@2a2d45ba,[Ljava.lang.Object;@2a5ca609) (1,2,3) </syntaxhighlight> : 複数の変数を、一度に宣言し同じ'''式'''<ref>値ではなく式です。</ref>で初期化することが出来ます。 : <code>val i, j, k = 42</code> で <var>k<var> だけではなく <var>j<var> も <var>i<var> も初期化されます。 : 初期化の式は、リテラルである必要はなく、初期化される宣言毎に評価されます。 :: <code>val u, v, w = new Array(5)</code> の <code>new Array(5)</code> は、3回評価され、その都度新しいインスタンスが生成されます。 :: <code>val x, y, z = { n += 1 ; n }</code> の <code>{ n += 1 ; n }</code> は、3回評価され、その都度インクリメントされるので、[[C言語]]の列挙型 enum と同じ機能が実現できます。どちらかと言うと [[Go]]の <code>iota</code> ですね。 ::: <code>{ n += 1 }</code> ではなく <code>{ n += 1 ; n }</code> なのは、 <code>n += 1</code> の値は <var>n</var> ではなく <code>()</code> だからです。 ::: このため、Scala では <code>x = y = 42</code> とは出来ず(x に () が入ってしまう)、<code>(x, y) = (42, 42)</code> のようにします。 ===== パターンマッチ ===== 変数宣言にもパターンマッチングが使えます。 val (x, y) = ( 178, 901 ) val v @ (a, a) = ( 42, 78 ) val m @ Array(n0, n1, _*) = Array(2,3,5,7,11) ===== lazy val:遅延評価 ===== ;[https://paiza.io/projects/tO047BQjIHxY37OsapSNdg?language=scala コード例]:<syntaxhighlight lang=Scala highlight="4-6,8" line> object Main extends App { var a = 3 var b = 4 lazy val c = { println("!"); a * b } a = 0 println(c) a = 100 println(c) } </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> ! 0 0 </syntaxhighlight> : <code>lazy val</code> で宣言された変数は、はじめて参照された6行目で評価 :: この時に参照されるのは、5行目で更新された <var>a</var> の値が参照されるので、クロージャではありません。 :: 8行目で再び、<var>c</var> を参照すると、7行目での <var>a</var> の変更は反映されません。一度、評価されたら値は変わりません。 '''lazy var''' は出来ません。 ---- {{コラム|val? var? どちらを使うべき?|2= 変数を宣言するとき「valで宣言するか var で宣言すべきか?」、 言い換えると、「変数をイミュータブルにすべきか?」と言う質問になります。 関数プログラミングの観点からは、そもそも変数(=副作用)は邪道なのですが、 あえて変数を使うのであれば、まず val(イミュータブル)で宣言し、代入が行われるようなら var(ミュータブル)に変更するという基本戦略が考えられます。 幸いScalaは、イミュータブルな変数とミュータブルな変数に使える名前(変数名)の規則は同じで、参照するときも追加の記号は必要ありません。 }} === 型推論 === 先の例では、変数を型を指定して宣言していました。 Scalaには、型推論機構があるので、初期値が与えられる変数宣言では初期値から変数の型が推論され型名を明示する必要はなくなります。 ;型推論:<syntaxhighlight lang=Scala> object Main extends App { val i = 123 var j = 12 println(i) println(j) } </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> 123 12 </syntaxhighlight> === 数値のリテラル表現 === Javaの数値はオブジェクトではなくプリミティブ型ですが、Scalaでは数値もオブジェクトです。 また型名にも違いがあるので、対照表にしてみました。 :{| class="wikitable" |+ JavaとScaleの型の対照表 ! Javaでの型 || Scalaでの型 || サイズ || リテラル表現 |- | char || Char || 2バイト || 'A', '漢' |- | byte || Byte || 1バイト || -128:Byte |- | short || Short || 2バイト || 123:Short |- | int || Int || 4バイト || 1234567890, -2147483648 |- | long || Long || 8バイト || 123L, -9223372036854775808L |- | float || Float || 4バイト || 3.1415926536f |- | double || Double || 8バイト || 3.1415926536 |- | boolean || Boolean || 1バイト || true, false |} == ブロック == Scalaでは、カーリーブラケット構文を使ってブロックを表します。 ブロックの最後の式の値が、ブロックの値になります。 ;ブロックとブロックの値:<syntaxhighlight lang=Scala line> object Main extends { val x = { val (a, b) = (1, 2) println("Hello!") a + b } println(x) } </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> Hello! 3 </syntaxhighlight> : <code>val (a, b) = (1, 2)</code>は、タプルを使った変数の宣言です。 : これらの変数のスコープはブロック末の '}' までで、それ以降は参照できません(ブロックスコープ)。 == 関数 == Scalaでは、「0個以上のパラメータを受取ることの出来る式」を関数と呼びます。 他の言語では、アロー関数やラムダ式と呼ばれる概念です。 ;関数:<syntaxhighlight lang=Scala line> object Main extends App { val add = (x: Int, y: Int) => x + y val msg = () => "hello!" println(add(1, 2)) println(add(1999, 1)) println(msg()) println(((a: Int,b: Int)=>a*b)(9, 11)) } </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> 3 2000 hello! 99 </syntaxhighlight> : 関数には名前がないので、変数に一旦に束縛し変数(変数名)を使って呼出します。 : 8行目では、変数を介さず定義したその場で実行しています(無名関数の即時実行)。 === 無名関数のアンダースコアを使った簡略表記 === ;[https://paiza.io/projects/h5Hh9tmcCbXIuXc-PpZx-A?language=scala コード例]:<syntaxhighlight lang=Scala highlight="3,5"line> object Main extends App { println((0 to 4).map(x => x * 3)) println((0 to 4).map(_ * 3)) println((0 to 4).reduce((x, y) => x + y)) println((0 to 4).reduce(_ + _)) println((0 to 4).map(x => x * x)) // 参照が二回以上ある場合は明示的に名前をつける } </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> Vector(0, 3, 6, 9, 12) Vector(0, 3, 6, 9, 12) 10 10 Vector(0, 1, 4, 9, 16) </syntaxhighlight> ===== パイプラインスタイル ===== パイプラインスタイルは、JavaScriptなどでよく使うメソッドチェインですが、イテレータメソッドが演算子の様に見える書き方です。 [[#For と Range と if|for と Range と if]]の例をパイプラインスタイルで置換えてみます。 ;例:<syntaxhighlight lang=Scala highlight=0 line> object Main extends App { // for (i <- 0 to 10 if i % 2 != 0) println(i) (0 to 10) filter { _ % 2 != 0 } foreach { println(_) } } </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> 1 3 5 7 9 </syntaxhighlight> 関数合成ではないので、<code>(0 to 10) filter { _ % 2 != 0 }</code> が先に評価され、そのオブジェクトに <code> .foreach({ println(_) })</code> が提供されるので、場合によっては要素数の多いコレクション・オブジェクトが中間結果として生成されるので注意してください。<!--関数合成を紹介しよう!--> == メソッド == メソッドは、コードを再利用する仕組みで、関数と似ていますが、両者は別個のものです。 メソッドはclass、object、trait内でキーワードdefを使って定義します。 ;メソッド:<syntaxhighlight lang=Scala line> object Main extends App { def add(x: Int, y: Int): Int = x + y def msg: String = "hello!" println(add(1, 2)) println(add(1999, 1)) println(msg) } </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> 3 2000 hello! </syntaxhighlight> : これだけ観ると、構文はともかく関数とメソッドの差は大きく感じられません。 : 強いていうと、空の引数リストは定義も呼出しも () を付けないところが違います。 これまで、頻繁に使ってきた <code>println()</code> も、Predefオブジェクトのメソッドで、Predefオブジェクトは暗黙に import されるので特別な準備なく使えました。 === 遅延評価パラメータ === Scalaでは、メソッドや関数の引数は値渡しですが、遅延評価にすることが出来ます。 これによって、制御構造を関数定義する道が開きます。 ;[https://paiza.io/projects/TUhXbh6yml2ScepcpNMGoA?language=scala メソッド]:<syntaxhighlight lang=Scala line> object Main extends App { def f1(x: Boolean, t: Unit, f: Unit) = if (x) t else f f1(true, println("True"), println("False")) def f2(x: Boolean, t: => Unit, f: => Unit) = if (x) t else f f2(true, println("真"), println("偽")) } </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> True False 真 </syntaxhighlight> == メインメソッド == メインメソッドは、プログラムのエントリーポイントです。 == 制御構造 == Scalaも、多くのプログラミング言語と同じく、「逐次」「分岐」「反復」の 3 種類の制御構造を持ちます。 Scalaの制御構造は、全て値を持ちます。この事は、Scalaの If'''式''' は、[[C言語]]の三項演算子と等価であることを示します。 === Scala 3 の新構文 === Scala 3 では、括弧<code>()</code> を使わない新しい構文が追加されました。 新構文の登場で、'''旧構文が使えなくなることはない'''ので、Scala 2の為に書かれたプログラムが使えなくなるような事はありません<ref>2から3へのアップデートと言うと、python2とpython3の非互換性の悲劇を思い起こす方も多いと思いますが、Scaleでは原則的に下位互換性があります。</ref>。 {| |+ 旧・新構文の対応 |- !Scala 2!!Scala3 |- |style="width:45%"|<syntaxhighlight lang=Scala line> object Main extends App { val x = 0 val xs = 0 to 4 val ys = 0 to 5 if (x < 0) "負" else if (x == 0) "零" else (x > 0) "正" else "何" if (x < 0) -x else x while (x >= 0) print(x, " ") for (x <- xs if x > 0) yield x * x for ( x <- xs; y <- ys ) println(x + y) } </syntaxhighlight> |style="width:45%"|<syntaxhighlight lang=Scala line> object Main extends App { val x = 0 val xs = 0 to 4 val ys = 0 to 5 if x < 0 then "負" else if x == 0 then "零" else x > 0 then "正" else "何" if x < 0 then -x else x while x >= 0 do print(x, " ") for x <- xs if x > 0 yield x * x for x <- xs; y <- ys do println(x + y) } </syntaxhighlight> |} === 分岐 === ==== if ==== if式は、条件式に基づいて分岐し分岐先の式を評価します。 if式の値は、分岐先の式の値です。 ;構文:<syntaxhighlight lang=ebnf> if-expr := if '(' 条件式 ')' 式1 [ else 式2 ] </syntaxhighlight> : 条件式は、Boolean 型でなければいけません。 : <code>else 式2</code>の部分はオプショナルで、省略され条件式が false であった場合、if式はUnit 型の値 <code>()</code> 単位ユニットが式の値となります(要素個数ゼロのタプルです)。 : elseif elsif のたぐいはないので、<code>else if (条件式2) 式3</code> と続けます。 ;[https://paiza.io/projects/y8p_q50uEL2IE71JfNrxNw?language=scala if式の例]:<syntaxhighlight lang=Scala line> object Main extends App { val i = 0 if (i == 0) println("zero") else println("non zero") println({ if (i == 0) "Zero" else "Non zero" }) println({ if (i != 0) "NON ZERO" }) } </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> zero Zero () </syntaxhighlight> ==== match ==== C言語のswicth文は、式と一致するリテラルのラベルへの多方向GOTO文ですが、Scalaのmatch式はパターンマッチングに基づいています。 ;構文:<syntaxhighlight lang=ebnf> match-expr := 式 match ’{’ ( パターン => 式 )+ ’}’ </syntaxhighlight> : 式の値に、合致するパターンはないか上から順に走査し、合致したパターン対応する式が評価され、この値がmatch式の値となります。 : 式に対して、パターンがどれも合致しないとコンパイル時のフロー解析の結果わかった場合、コンパイルエラーになります。 : このため、全てにマッチするパターン _ が最後に置かれることが常となります。 :: ただし式が、Boolean や enum の場合は、網羅チェックを台無しにするので _ を使うべきではありません。 ;[https://paiza.io/projects/kMzZMXaBj2rARbop3Lcn0A?language=scala match式の例]:<syntaxhighlight lang=Scala line> object Main extends App { val n = 10 n match { case 1 => println("壱") case 2 => println("弐") case 3 => println("参") case _ => println("多数") } println({ n match { case 1 => "一" case 2 => "二" case 3 => "三" case _ => "膨大" } }) println({ n match { case 1 => "一" case 2 => "二" case 3 => "三" // case _ => "膨大" // ここをコメントにしてしまうと、網羅性がほころびコンパイルエラーになる } }) } </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> 多数 膨大 膨大 </syntaxhighlight> === 反復 === ==== while ==== while式は、条件式が true の間、式を評価しつづけます。 while式の値は、評価した式の値です。 ;構文:<syntaxhighlight lang=ebnf> while-expr := while '(' 条件式 ')' 式 </syntaxhighlight> : 条件式は、Boolean 型でなければいけません。 ;[https://paiza.io/projects/A8RXe7wm4tuqv_N-EaeiuQ?language=scala while式の例]:<syntaxhighlight lang=Scala highlight="4-7" line> object Main extends App { var i = 0 while (i < 5) { println(i) i += 1 } println(s"last = $i") } </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> 1 2 3 4 last = 5 </syntaxhighlight> : Scalaには、<code>変数 ++</code> の様なインクリメント演算子はなく、<code>変数 += 1</code> の構文を使います。 :: これは、Scala の整数はイミュータブルなためで、同じ理由で [[Ruby]] にもインクリメント演算子はありません。 :: また、<code>変数 += 1</code> は、<code>変数 = 変数 + 1</code>の構文糖です。 :: さらに、<code>変数 + 1</code> は、<code>変数 .+(1)</code>の構文糖です。 ::: 加算に限らず、Scalaの演算子は、メソッドの構文糖です。 : <var>i</var> のスコープは、object Main なのでループを抜けても値を参照出来ます。 : <code>s"last = $i"</code> は、加工文字列リテラル(''processed string literal'') で、文字列の中で変数の値を参照できます。 ==== do - while ==== Scala 3 で、do - while は'''廃止'''になりました。 while の条件式に繰返し部分と続行条件を書き、ループ本体は空にすることで do - while を模倣できます。 ;[https://paiza.io/projects/iluJn2pkYxfJwzHWflWPpw?language=scala do - while の模倣]:<syntaxhighlight lang=Scala highlight="4-8" line> object Main extends App { var i = 10 while ({ println(i) i += 1 i < 5 }) {} println(s"last = $i") } </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> 10 last = 11 </syntaxhighlight> ==== for ==== Scalaのfor式は、ジェネレータに対してイテレーションを行います。 ;構文:<syntaxhighlight lang=ebnf> for-expr := for '(' ジェネレータ ')' 式 </syntaxhighlight> ===== for と Range ===== ;[https://paiza.io/projects/eWKe2_2XTuJQPh2NzkZNTA?language=scala for式とRangeクラスの例]:<syntaxhighlight lang=Scala highlight=0 line> object Main extends App { println(0 to 4) for (i <- 0 to 4) println("to: " + i) println(0 until 4) for (i <- 0 until 4) println("until: " + i) } </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> Range 0 to 4 to: 0 to: 1 to: 2 to: 3 to: 4 Range 0 until 4 until: 0 until: 1 until: 2 until: 3 class scala.collection.immutable.Range$Inclusive </syntaxhighlight> : <code>0 to 4</code> や <code>0 until 4</code> は、Rangeクラスのオブジェクトで範囲を表します。 : <code>0 to 4</code> や <code>0 until 4</code> は、Rangeクラスのリテラル、、ではなく <code>to</code> と <code>until</code> は演算子で : <code>0.to(4)</code> や <code>0.until(4)</code> と言うメソッドの演算子表記<!--Need to verify if terminology is appropriate-->です。 ===== for と Range と if ===== ジェネレータの中に、if を使うことが出来ます。[[Python]]のジェネレータと似た表現です。 ;[https://paiza.io/projects/tpIREeZXCqIKIaE81eFfcA?language=scala for式とRangeクラスとif式の例]:<syntaxhighlight lang=Scala highlight=0 line> object Main extends App { for (i <- 0 to 10 if i % 2 != 0) println(i) } </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> 1 3 5 7 9 </syntaxhighlight> ===== 二重ループ ===== 2つのジェネレーターを <code>;</code> で区切ると多重ループを構成出来ます。 ;[https://paiza.io/projects/MUXX893zSMN8DDftVS6lBQ?language=scala 二重ループ]:<syntaxhighlight lang=Scala highlight=0 line> object Main extends App { for ( i <- 0 to 2; j <- 0 to 3 ) { println((i, j)) } } </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> (0,0) (0,1) (0,2) (0,3) (1,0) (1,1) (1,2) (1,3) (2,0) (2,1) (2,2) (2,3) </syntaxhighlight> ===== 値を返す for ===== for式と <code>yeild</code> の組合せでfor式は値を返すことが出来ます。 ;[https://paiza.io/projects/qqgyaWk2Of2jfOsj35RGug?language=scala 値を返す for]:<syntaxhighlight lang=Scala highlight=0 line> object Main extends App { println(for (i <- 0 to 4) yield i.toString) } </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> Vector(0, 1, 2, 3, 4) </syntaxhighlight> === 脱出 === ==== return ==== ブロックからの脱出には、return を使います。 break や continue はありません。 == 例外処理 == ScalaにはJavaのthrows節がありません<ref>[[Java]]の場合は、例外を発生させる可能性のあるメソッドは、throws節で発生させる例外の種類をすべて宣言する必要があります。 ただし、RuntimeException(RuntimeExceptionの派生クラス)の場合は、throws節で明示的に記述する必要はありません。</ref>。 すべての例外はメソッドの外側に投げることができます。 ;例外処理:<syntaxhighlight lang=Scala highlight=4 line> object Main extends App { try { val n = 1 n / 0 println("return!") } catch { case e: Exception => { println("Exception caught.") println(e.getMessage) println(e.getStackTrace) } } finally { println("done!") } } </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> Exception caught. / by zero [Ljava.lang.StackTraceElement;@35a74ae9 done! </syntaxhighlight> : finally 節の式は、例外の有無に関係なく実行されます。 :: try 節や catch 節 で exit() すると、流石に finally 節は実行されません。 == クラス == Scalaは、関数型プログラミング言語であると同時に、オブジェクト指向プログラミング言語です。 より厳密に言うと、(プロトタイプベースではなく)クラスベースのオブジェクト指向プログラミング言語です。 クラス(''class'')は、オブジェクトを作る雛形で、クラスから new 演算子を使ってオブジェクトを作ることをインスタンス化、出来たオブジェクトの事をインスタンスと呼びます。 === クラス定義とインスタンス化とメソッド === ;[https://paiza.io/projects/41inK-Tl-w-FIjRvurIs3Q?language=scala コード例]:<syntaxhighlight lang=Scala highlight="2-5" line> object Main extends App { class Hello(val s: String = "world") { override def toString: String = s"Hello $s!" def print: Unit = println(s) } val hello1 = new Hello() println(hello1) hello1.print val hello2 = new Hello("my friend") println(hello2) print(s""" Hello.getClass() === ${Hello.getClass()} hello1 === ${hello1} hello2.s = ${hello2.s} """) } </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> Hello world! world Hello my friend! Hello.getClass() === class Main$Hello$ hello1 === Hello world! hello2.s = my friend </syntaxhighlight> : [[Ruby#クラス]]の例を、Scala に移植しました。 : 冒頭4行がクラス定義です。 : クラス定義に、他のオブジェクト指向言語ならコンストラクタに渡すような引数が渡されています。 : メンバーを公開するケースなら、この様に宣言的な引数リストを使うとメンバー定義と暗黙の初期値を与えられます。 : toString は、オブジェクトを文字列化するメソッドで、Objectの同名のメソッドをオーバーライドしています。 : print は、このクラスに独自なメソッドで、println() の値 == () == Unit を戻値型としています。 === 少しまとまったサイズのクラス === [[Ruby#ユーザー定義クラス]]の都市間の大圏距離を求めるメソッドを追加した例を、Scalaに移植。 ;[https://paiza.io/projects/U0m9xY_SSy4X-MLnplj-0A?language=scala ユーザー定義クラス]:<syntaxhighlight lang=Scala line> object Main extends App { class GeoCoord(val longitude: Double = 0.0, val latitude: Double = 0.0) { override def toString: String = { var (ew, ns) = ("東経", "北緯") var (long, lat) = (longitude, latitude) if (long < 0.0) { ew = "西経" long = -long } if (lat < 0.0) { ns = "南緯" lat = -lat } s"(${ew}: ${long}, ${ns}: ${lat})" } def distance(other: GeoCoord): Double = { val i = Math.PI / 180 val r = 6371.008 Math.acos( Math.sin(this.latitude * i) * Math.sin(other.latitude * i) + Math.cos(this.latitude * i) * Math.cos(other.latitude * i) * Math.cos(this.longitude * i - other.longitude * i) ) * r } } val Sites = Map( "東京駅" -> new GeoCoord(139.7673068, 35.6809591), "シドニー・オペラハウス" -> new GeoCoord(151.215278, -33.856778), "グリニッジ天文台" -> new GeoCoord(-0.0014, 51.4778) ) Sites.foreach { case (k, v) => println(s"${k}: ${v}") } val keys = Sites.map { case (k, v) => k }.toList val len = keys.size for (i <- 0 until len) { val (ksi, ksx) = (keys(i), keys((i + 1) % len)) println(s"${ksi} - ${ksx}: ${Sites(ksi).distance(Sites(ksx))} [km]") } } </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> 東京駅: (東経: 139.7673068, 北緯: 35.6809591) シドニー・オペラハウス: (東経: 151.215278, 南緯: 33.856778) グリニッジ天文台: (西経: 0.0014, 北緯: 51.4778) 東京駅 - シドニー・オペラハウス: 7823.269299386704 [km] シドニー・オペラハウス - グリニッジ天文台: 16987.2708377249 [km] グリニッジ天文台 - 東京駅: 9560.546566490015 [km] </syntaxhighlight> == ケースクラス == ;[https://paiza.io/projects/R2pOOT-Yp-xk-BURc_P9Xw?language=scala コード例]:<syntaxhighlight lang=Scala highlight="2,29-31" line> object Main extends App { case class GeoCoord(longitude: Double = 0.0, latitude: Double = 0.0) { override def toString: String = { var (ew, ns) = ("東経", "北緯") var (long, lat) = (longitude, latitude) if (long < 0.0) { ew = "西経" long = -long } if (lat < 0.0) { ns = "南緯" lat = -lat } s"(${ew}: ${long}, ${ns}: ${lat})" } def distance(other: GeoCoord): Double = { val i = Math.PI / 180 val r = 6371.008 Math.acos( Math.sin(this.latitude * i) * Math.sin(other.latitude * i) + Math.cos(this.latitude * i) * Math.cos(other.latitude * i) * Math.cos(this.longitude * i - other.longitude * i) ) * r } } val Sites = Map( "東京駅" -> GeoCoord(139.7673068, 35.6809591), "シドニー・オペラハウス" -> GeoCoord(151.215278, -33.856778), "グリニッジ天文台" -> GeoCoord(-0.0014, 51.4778) ) Sites.foreach { case (k, v) => println(s"${k}: ${v}") } val keys = Sites.map { case (k, v) => k }.toList val len = keys.size for (i <- 0 until len) { val (ksi, ksx) = (keys(i), keys((i + 1) % len)) println(s"${ksi} - ${ksx}: ${Sites(ksi).distance(Sites(ksx))} [km]") } } </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> 東京駅: (東経: 139.7673068, 北緯: 35.6809591) シドニー・オペラハウス: (東経: 151.215278, 南緯: 33.856778) グリニッジ天文台: (西経: 0.0014, 北緯: 51.4778) 東京駅 - シドニー・オペラハウス: 7823.269299386704 [km] シドニー・オペラハウス - グリニッジ天文台: 16987.2708377249 [km] グリニッジ天文台 - 東京駅: 9560.546566490015 [km] </syntaxhighlight> : コンストラクタ引数に val がなくても、自動的にフィールドが宣言されます。 :: var なフィールドを希望する場合は、var を明示します。 : インスタンス化する時、new は必要ありません。 :: コンパニオンオブジェクトが自動的に生えてきます。 == シングルトン・オブジェクト == object は、たった1つのインスタンスを持つクラス(=シングルトン)です。 これは、lazy valのように、参照されたときに(遅延して)生成されます。 object は、トップレベルの値としてはシングルトンであり、 クラスのメンバやローカルな値としては、lazy val と全く同じ振る舞いをします。 === シングルトン・オブジェクトの定義 === シングルトン・オブジェクトは値です。シングルトン・オブジェクトの定義はクラスのように見えますが、object というキーワードを使用します。 シンプルなシングルトン object Simple == トレイト == トレイト('''trait''')は、[[Java]]の[[Java/インターフェース|インターフェース]]と[[Java/抽象クラス|抽象クラス]]の中間的な存在です。 実装を持ったインターフェースで、コンストラクタのパラメータを持つことができませんが、[[オブジェクト指向プログラミング#Mix-in|ミックスイン]]( ''mix-in'' )することが出来ます。 * 抽象クラスと同様に、トレイトは具象メンバを持つことができますが、インスタンス化することはできません。 * インターフェイスと同様に、クラスは複数のトレイトのメンバを継承することができます。 * クラスはトレイトで拡張することができます。<syntaxhighlight lang=Scala> class C extends Trait1 { ... } </syntaxhighlight> * クラスや他の特徴を継承することができます。<syntaxhighlight lang=Scala> trait T1 extends Class1 { ... } trait T2 extends Trait1 { ... } </syntaxhighlight> * クラス、オブジェクト、トレイトはトレイトの中で混在することができます。<syntaxhighlight lang=Scala> class C extends Trait1 with Trait2 with Trait3 { ... } val obj = new Class1() with Trait1 with Trait2 with Trait3 { ... } </syntaxhighlight> == 脚註 == <references /> == 参考文献 == * {{Cite web |url=https://www.scala-lang.org/files/archive/spec/2.13/ |title=Scala Language Specification <nowiki>|</nowiki> Scala 2.13 |publisher= École Polytechnique Fédérale, Lausanne (EPFL) Lausanne, Switzerland |date=2022/06/10 |accessdate=2022/06/24 }} * {{Cite web |url=https://docs.scala-lang.org/scala3/reference/ |title=Scala 3 Reference |publisher= École Polytechnique Fédérale, Lausanne (EPFL) Lausanne, Switzerland |date=2022/06/01 |accessdate=2022/06/24 }} == 外部リンク == * [https://www.scala-lang.org/ The Scala Programming Language] ** [https://docs.scala-lang.org/ja/ ドキュメント|Scala Documentation] {{スタブ}} [[Category:Scala|*]] [[Category:プログラミング言語]] {{NDC|007.64}} frm8tlii6wqjlxanrd1qr3m9kit5i24 Crystal 0 35227 205591 205571 2022-07-20T22:44:30Z Ef3 694 /* 繰返し */ Fix inner ln wikitext text/x-wiki {{Pathnav|メインページ|工学|情報技術|プログラミング|frame=1}} {{Wikipedia|Crystal (プログラミング言語)}} 本書は、[[w:Crystal (プログラミング言語)|Crystal]]のチュートリアルです。 '''Crystal'''は、Ary Borenszweig、Juan Wajnerman、Brian Cardiffと300人以上の貢献者によって設計・開発された[汎用オブジェクト指向プログラミング言語です<ref>{{Cite web |url=https://github.com/crystal-lang/crystal/graphs/contributors |title=Contributors |accessdate=2022-07-18 |website=github.com }}</ref>。[[Crystal]] にヒントを得た構文を持ち、静的型チェックを備えた [[コンパイル型言語]]ですが、変数やメソッドの引数の型は一般には不要です。型は高度なグローバル[[型推論]]アルゴリズムによって解決される。<ref>{{Cite web |url=http://crystal-lang.org/2013/09/23/type-inference-part-1.html |title=Type inference part 1 |last=Brian J. |first=Cardiff |date=2013-09-09 |accessdate=2022-07-18 |website=crystal-lang.org }}</ref>Crystalは[[Apache License]]バージョン2.0のもと、FOSSとしてリリースされています。 __TOC__ == Hello, World! == 他の多くのチュートリアルがそうであるように、 私たちもまずはCrystalの世界にあいさつすることから始めましょう。 ''hello.cr''というファイルを作り(Crystalのソースファイルの拡張子は''.cr'' です)、次のように書いて保存して下さい。 ;hello.cr:<syntaxhighlight lang=Crystal> puts 'Hello, World!' </syntaxhighlight> ;コマンドラインでの操作:<syntaxhighlight lang="console"> % cat hello.cr puts 'Hello, World!' % crystal hello.cr In hello.cr:1:6 1 | puts 'Hello, World!' ^ Error: unterminated char literal, use double quotes for strings % sed -i -e "s@'@Q@g" -e 's@Q@"@g' hello.cr % cat hello.cr puts "Hello, World!" % crystal hello.cr Hello, World! </syntaxhighlight> この1行のスクリプトは、メソッド<code>puts</code> に文字リテラル<code>"Hello, World!"</code>を渡し呼出しています。 このプログラムは、[[Ruby#Hello, World!]]と同じですが、Crystalでは文字列リテラルは <code>"…"</code> で囲うのでそれだけ変更しました。 [TODO: コマンドラインツール crystal の解説。 crystal ファイル名 は crystal run ファイル名 の短縮形で、インタープリタ的な実行…ではなく、内部ビルドツールでコンパイル・実行を行う] == Ruby との違い == Crystalは、Rubyに触発された構文を持つものの、Rubyとの互換性をゴールに定めては'''いません'''。 このため、細部を見ると仕様に差異があり、Rubyのソースコードをcrystalに掛けるても前節の 'Hello World' の様にコンパイルに失敗することがあります。 また、コンパイルできても実行結果に違いが出ることがあります。 ここでは、Ruby との違いについて実際のコードと双方の結果を比較することで、差異についての理解を深めていきます。 === 整数型の特性 === ;大きな整数:<syntaxhighlight lang=Crystal> p 2 ** 999 p (2 ** 999).class </syntaxhighlight> ;rubyの実行結果:<syntaxhighlight lang="console"> 5357543035931336604742125245300009052807024058527668037218751941851755255624680612465991894078479290637973364587765734125935726428461570217992288787349287401967283887412115492710537302531185570938977091076523237491790970633699383779582771973038531457285598238843271083830214915826312193418602834034688 Integer </syntaxhighlight> ;crystalの実行結果:<syntaxhighlight lang="console"> Unhandled exception: Arithmetic overflow (OverflowError) from /usr/local/share/crystal/share/crystal/src/int.cr:295:9 in '**' from pow.cr:1:1 in '__crystal_main' from /usr/local/share/crystal/share/crystal/src/crystal/main.cr:115:5 in 'main_user_code' from /usr/local/share/crystal/share/crystal/src/crystal/main.cr:101:7 in 'main' from /usr/local/share/crystal/share/crystal/src/crystal/main.cr:127:3 in 'main' from /usr/local/lib64/libc.so.6 in '__libc_start_main' from /usr/local/.cache/crystal/crystal-run-pow.tmp in '_start' from ??? </syntaxhighlight> : Ruby の整数は、桁あふれが起こると自動的に多倍長整数に型変換されるので、継ぎ目なしに大きな数を扱うアルゴルズムが使えます。 : Crystal の整数は、固定長です(大きさについては[[#リテラルと型|後述]])。なので大きな答えになる式を評価すると桁あふれが生じます。桁あふれが生じますが、C言語のように寡黙に処理を続けるのではなく、実行時に例外(OverflowError)が上がるので、例外を捕捉し然るべき処置を施すことが可能です。 ==== BigInt ==== <code>big</code> を <code>require</code> すると <code>BigInt</code> が使えるようになります。 ;BigInt:<syntaxhighlight lang=Crystal> require "big" p BigInt.new(2) ** 999 p (BigInt.new(2) ** 999).class </syntaxhighlight> ;実行結果:<syntaxhighlight lang="console"> 5357543035931336604742125245300009052807024058527668037218751941851755255624680612465991894078479290637973364587765734125935726428461570217992288787349287401967283887412115492710537302531185570938977091076523237491790970633699383779582771973038531457285598238843271083830214915826312193418602834034688 BigInt </syntaxhighlight> : BigIntはプリミティブではなので、リテラル表現はありません。また、 ::<syntaxhighlight lang=Crystal> n : BigInt = 2 </syntaxhighlight> ::<syntaxhighlight lang=console> Error: type must be BigInt, not Int32 </syntaxhighlight> :: のように型アノテーションすることも出来ません。 === リテラルと型 === ;様々なリテラルと型:<syntaxhighlight lang=Crystal> [nil, false, true, 42, 2.73, 'Q', "string", [1,2,3], {a:1, b:2}].each{|x| p [x, x.class] } </syntaxhighlight> ;rubyの実行結果:<syntaxhighlight lang="console"> [nil, NilClass] [false, FalseClass] [true, TrueClass] [42, Integer] [2.73, Float] ["Q", String] ["string", String] [[1, 2, 3], Array] [{:a=>1, :b=>2}, Hash] </syntaxhighlight> ;crystalの実行結果:<syntaxhighlight lang="console"> [nil, Nil] [false, Bool] [true, Bool] [42, Int32] [2.73, Float64] ['Q', Char] ["string", String] [[1, 2, 3], Array(Int32)] [{a: 1, b: 2}, NamedTuple(a: Int32, b: Int32)] </syntaxhighlight> : Crystal の整数は Int32、浮動小数点数は Float64 です。 ;サイズを指定した数リテラル:<syntaxhighlight lang=Crystal> [1_i64, 2_u32, 3_u64, 4_i32, 5_i16, 6_u8, 7_i128, 8_u128, 3.14_f32, 1.44_f64].each{|x| p [x, x.class] } </syntaxhighlight> ;ruby:Rubyでは、サーフィックスの付いた数値リテラルは無効 ;crystalの実行結果:<syntaxhighlight lang="console"> [1, Int64] [2, UInt32] [3, UInt64] [4, Int32] [5, Int16] [6, UInt8] [7, Int128] [8, UInt128] [3.14, Float32] [1.44, Float64] </syntaxhighlight> : Crystal では、数値リテラルに _ で始まるサーフィックスを付け { i:符号付き整数, u:符号なし整数, f:浮動小数点数 } と { 8,16,32,64,128 } のビット幅の組合せです<ref>[https://crystal-lang.org/reference/1.5/syntax_and_semantics/literals/ Literals]</ref>。 === for式がない === Crystal には、Ruby にはある for式がありません。 ;Rubyのfor式の構文:<syntaxhighlight lang="ruby"> for 変数 in コレクション 文 end </syntaxhighlight> :コレクションは Range, Array, Hash など内部構造を持つオブジェクトです。 :for式は、最後に評価した値を返すので、for'''式'''です。 ;for式のeachメソッドによる置換え:<syntaxhighlight lang="ruby"> for x in [ 2, 3, 5, 7, 11 ] do p x end # ↓ [ 2, 3, 5, 7, 11 ].each do | x | p x end </syntaxhighlight> : の様にコレクションの each メソッドで置換え可能なので、Rubyからの移植でも小規模な書換えで済みます<ref>[https://github.com/crystal-lang/crystal/issues/830 "For" Loop support #830]</ref>(後述のマクロで実装できないかと思いましたが、いまのところ無理のようです)。 また loop 式もありませんが while true; … end で間に合います。Ruby では while 式の条件の次に do が置けますが、Crystal では置けません。 === eval()がない === Crystal には eval() はありません。 Crystalはコンパイル型言語ですので、無理もないことです。 もし、Crystal で eval() を実装しようとすると、Common Lisp の様にインタープリターを丸ごとランタイムに含む必要があります。 これはリーズナブルな選択ではありません。 Crystal では、eval() が必要なケースに(限定的ですが)マクロを使うことが出来る可能性があります。 === マクロ === Crystalには、Rubyにはないマクロがあります<ref>[https://crystal-lang.org/reference/1.5/syntax_and_semantics/macros/ Macros - Crystal]</ref>。Rubyは実行時にすべてのオブジェクトにアクセス出来て、メソッド生やし放題なのでマクロは必要ありませんが、Crystalはコンパイル時に型やメソッドを確定する必要があり、特にメソッドジェネレターとしてのマクロにニーズがあります。また、テンプレート言語的なマクロなので、環境変数による条件分岐や、コンテナを渡し繰返し処理する構文もあります(面白いことにマクロには for 文があり、反対にマクロの中では、eachメソッドは使えません)。マクロには <code><nowiki>{{</nowiki>attr.id}}</code> の様にASTへのアクセス手順が用意されており、半ば言語を拡張するようなアプローチを取ることも出来ます。 [TODO:ASTについての解説;コラム向き?] ;マクロを使ったattr_accessorのイミュレーション:<syntaxhighlight lang=crystal> class Point def initialize(@x : Int32, @y : Int32) end # macro定義 macro attr_accessor(*attrs) {% for attr in attrs %} def {{attr.id}}() @{{attr.id}} end def {{attr.id}}=(var) @{{attr.id}} = var end {% end %} end # macro呼出し attr_accessor :x, :y end pt = Point.new(20, 30) p [pt.x, pt.y] t = pt.x pt.x = pt.y pt.y = t p [pt.x, pt.y] </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> [20, 30] [30, 20] </syntaxhighlight> : Ruby には、attr_accessor と言う「クラスのメンバーのアクセサーを自動生成するメソッド」がありますが、Crystalにはないようなので、マクロで実装しました。 :: attr_accessor :name からは ::<syntaxhighlight lang=ruby> def name() @name end def name=(val) @name = val end </syntaxhighlight>相当のコードが生成されます。 [TODO:マクロの機能と構文の説明 *の付いた引数、 <nowiki>{{</nowiki>引数}}、{% … %} 構文] ==== マクロ p! ==== メソッド p は、与えられた「式」の inspaect() の返す値を puts しますが、マクロ p! は、それに先んじて(評価前の)「式」を表示します<ref>[https://crystal-lang.org/api/1.5.0/Crystal/Macros.html#p%21%28%2Aexpressions%29%3ANop-instance-method def p!(*expressions) : Nop]</ref>。 ;p!の例:<syntaxhighlight lang=crystal> x, y = true, false p! x,y,x && y, x || y, x ^ y, !x, x != y, x == y ary = [ 1, 2, 3 ] p! ary p! ary.map(&. << 1) p! ary.map(&.to_f) </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> x # => true y # => false x && y # => false x || y # => true x ^ y # => true !x # => false x != y # => true x == y # => false ary # => [1, 2, 3] ary.map(&.<<(1)) # => [2, 4, 6] ary.map(&.to_f) # => [1.0, 2.0, 3.0] </syntaxhighlight> ===== 入れ子のp! ===== マクロ p! は入れ子に出来ます。また、一旦ASTに変換してから再度ソースコードに変換するので、等価な別の構文に変換されることがあります。 ;入れ子のp!:<syntaxhighlight lang=crystal> p! ( 100.times{|i| p! i break i if i > 12 } ) </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> (100.times do |i| p!(i) if i > 12 break i end end) # => i # => 0 i # => 1 i # => 2 i # => 3 i # => 4 i # => 5 i # => 6 i # => 7 i # => 8 i # => 9 i # => 10 i # => 11 i # => 12 i # => 13 13 </syntaxhighlight> === クラス === ==== シンプルなクラス ==== ;シンプルなクラス:<syntaxhighlight lang=crystal highlight="2" line> class Hello def initialize(@name : String = "World") end def greeting puts "Hello #{@name}!" end end hello = Hello.new() hello.greeting universe = Hello.new("Universe") universe.greeting </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> Hello World! Hello Universe! </syntaxhighlight> :;初期化メソッド :: <syntaxhighlight lang=crystal line start=4> def initialize(@name : String = "World") end </syntaxhighlight> ::Rubyであれば :: <syntaxhighlight lang=ruby line start=4> def initialize(name = "World") @name = name end </syntaxhighlight> ::とするところですが、Crystalでは、型アノテーション <code> : String</code> を使い、引数の型を限定しました。 ::また、(@ 付きの)アトリビュート名を仮引数にすると、そのままアトリビュート(a.k.a. インスタンス変数)に仮引数が代入されます。 ::これは、C++のコンストラクターのメンバー初期化リストと同じアイディアですが、Crystalではインスタンス変数に @ が前置されるので、仮引数に @ が出現すればインスタンス変数の初期値だと自明で、聡明な選択です。 ==== 都市間の大圏距離 ==== [[Ruby#ユーザー定義クラス]]の都市間の大圏距離を求めるメソッドを追加した例を、Crystalに移植しました。 ;都市間の大圏距離:<syntaxhighlight lang=crystal highlight=”2,7,12” line> class GeoCoord getter :longitude, :latitude def initialize(@longitude : Float64, @latitude : Float64) end def to_s(io) ew, ns = "東経", "北緯" long, lat = @longitude, @latitude ew, long = "西経", -long if long < 0.0 ns, lat = "南緯", -lat if lat < 0.0 io << "(#{ew}: #{long}, #{ns}: #{lat})" end # https://github.com/crystal-lang/crystal/issues/259 def distance(other) i, r = Math::PI / 180, 6371.008 Math.acos(Math.sin(@latitude*i) * Math.sin(other.latitude * i) + Math.cos(@latitude*i) * Math.cos(other.latitude * i) * Math.cos(@longitude * i - other.longitude * i)) * r end end # メソッドの先頭を大文字に出来ないのでクラス名のメソッドは作ることが出来ない # def GeoCoord(lng : Float64, lat : Float64) # GeoCoord.new(lng, lat) # end Sites = { "東京駅": GeoCoord.new(139.7673068, 35.6809591), "シドニー・オペラハウス": GeoCoord.new(151.215278, -33.856778), "グリニッジ天文台": GeoCoord.new(-0.0014, 51.4778), } Sites.each { |name, gc| puts "#{name}: #{gc}" } keys, len = Sites.keys, Sites.size keys.each_with_index { |x, i| y = keys[(i + 1) % len] puts "#{x} - #{y}: #{Sites[x].distance(Sites[y])} [km]" } </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> 東京駅: (東経: 139.7673068, 北緯: 35.6809591) シドニー・オペラハウス: (東経: 151.215278, 南緯: 33.856778) グリニッジ天文台: (西経: 0.0014, 北緯: 51.4778) 東京駅 - シドニー・オペラハウス: 7823.269299386704 [km] シドニー・オペラハウス - グリニッジ天文台: 16987.2708377249 [km] グリニッジ天文台 - 東京駅: 9560.546566490015 [km] </syntaxhighlight> :Crystal には、<syntaxhighlight lang=ruby inline> attr_accessor </syntaxhighlight> はありませんが、標準ライブラリーのマクロに <syntaxhighlight lang=crystal inline> getter </syntaxhighlight>があるので :: <syntaxhighlight lang=crystal line start=2> getter :longitude, :latitude </syntaxhighlight> ::としました。 ::将来、<syntaxhighlight lang=ruby inline> attr_accessor </syntaxhighlight> が実装される可能性はありますが、姉妹品の<syntaxhighlight lang=crystal inline> setter </syntaxhighlight> との併用が下位互換性を考えると確実です。 : to_s は、Ruby ならば :: <syntaxhighlight lang=ruby line start=7> def to_s() </syntaxhighlight> :: <syntaxhighlight lang=ruby line start=12> io << "(#{ew}: #{long}, #{ns}: #{lat})" </syntaxhighlight> :: ですが、Crystalでは追加の引数 <var>io</var> が必要で :: <syntaxhighlight lang=ruby line start=7> def to_s(io) </syntaxhighlight> :: <syntaxhighlight lang=ruby line start=12> io << "(#{ew}: #{long}, #{ns}: #{lat})" </syntaxhighlight> : Ruby にはクラス名と同じ名前のメソッドで .new を呼出す文化があるのですが、Crystalはメソッドの先頭を大文字に出来ないので、これは見送りました。 ==== 包含と継承 ==== [[JavaScript/クラス#包含と継承]]を、Rubyに移植した[[Ruby#包含と継承]]を、Crystalに移植しました。 ;包含と継承:<syntaxhighlight lang=crystal line> class Point def initialize(@x = 0, @y = 0) end def inspect(io) io << "x:#{@x}, y:#{@y}" end def move(dx = 0, dy = 0) @x, @y = @x + dx, @y + dy self end end class Shape def initialize(x = 0, y = 0) @location = Point.new(x, y) end def inspect(io) @location.inspect(io) end def move(x, y) @location.move(x, y) self end end class Rectangle < Shape def initialize(x = 0, y = 0, @width = 0, @height = 0) super(x, y) end def inspect(io) super(io) io << ", width:#{@width}, height:#{@height}" end end rct = Rectangle.new(12, 32, 100, 50) p! rct, rct.is_a?( Rectangle ), rct.is_a?( Shape ), rct.is_a?( Point ), rct.move(11, 21) </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> rct # => x:12, y:32, width:100, height:50 rct.is_a?(Rectangle) # => true rct.is_a?(Shape) # => true rct.is_a?(Point) # => false rct.move(11, 21) # => x:23, y:53, width:100, height:50 </syntaxhighlight> == 制御構造 == '''[[w:制御構造|制御構造]]'''(せいぎょこうぞう、''control flow'')とは、「順次」「分岐」「反復」という基本的な処理のことを言います。 {{コラム|Crystalの真理値|2= 制御構造は「条件式」が真であるか偽であるかによって分岐や反復の振る舞いが変わります。 では「条件式」が真・偽はどの様に決まるのでしょう? Crystalでは <code>false</code> あるいは <code>nil</code> であると偽、それ以外が真です。 なので <code>0</code> も <code>[]</code>(空のArray) も <code>{}</code>(空のNamedTuple)も真です。 }} === 条件分岐 === Crystalの条件分岐には、[[#if|if]], [[#until|until]] と [[#case|case]]の3つの構文があります。 ==== if ==== '''[[w:if|if]]'''は条件式によって実行・否を切り替える構造構文で、評価した式の値を返すので条件演算子でもあります。 ;ifの例:<syntaxhighlight lang=crystal line> a = 0.0 / 0.0 if a < 0 puts "minus" elsif a > 0 puts "plus" elsif a == 0 puts "zero" else puts a end p! ( if a < 0 "minus" elsif a > 0 "plus" elsif a == 0 "zero" else a end ) </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> NaN (if a < 0 "minus" else if a > 0 "plus" else if a == 0 "zero" else a end end end) # => NaN </syntaxhighlight> :; elsif節:ifは、オプショナルな elsif 節を設け、条件式が偽であった時に別の条件に合致した処理を実行させることが出来ます。 :; else節:ifは、オプショナルな else 節を設け、条件式が偽であった時に処理を実行させることが出来ます。 : ifは値を返すので、メソッドの実引数に使うことが出来ますし、代入演算の右辺にも使えます。 ==== 後置のif ==== Crystalには、RubyやPerlのような後置のifがあります。 ;後置のifの例:<syntaxhighlight lang=crystal> n = 0 puts "nは0" if n == 0 puts "nは1" if n == 1 </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> nは0 </syntaxhighlight> ==== unless==== '''unless'''(アンレス)は条件式によって実行・否を切り替える構造構文ですが、ifとは条件式に対する挙動が逆です。 ;unless文の例:<syntaxhighlight lang=crystal line> a = 0.0 / 0.0 unless a == 0 puts "Non-zero" else puts a end </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> Non-zero </syntaxhighlight> :; else節 : unless文は、オプショナルな else 節を設け、条件式が真であった時に処理を実行させることが出来ます。 ::また、unless文は elsif 節は持てません。 ==== 後置のunless ==== Crystalには、RubyやPerlのような後置のunlessがあります。 ;後置のunlessの例:<syntaxhighlight lang=crystal> n = 0 puts "nは0" unless n == 0 puts "nは1" unless n == 1 </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> nは1ではない </syntaxhighlight> ==== case ==== caseは、複数の条件式によって処理を降る分ける用途の為に用意されています。 ;caseの例:<syntaxhighlight lang=crystal line> n = 2 case n when 1 puts "one" when 2 puts "two" when 3 puts "three" else puts "other" end p! ( case n when 1 "one" when 2 "two" when 3 "three" else "other" end ) </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> two (case n when 1 "one" when 2 "two" when 3 "three" else "other" end) # => "two"</syntaxhighlight> :C言語系のswitch文に慣れた人はbreakがないことに気がつくと思います。Crystalのcaseはfall throughしませんし、fall throughさせる方法もありません。 ===== when節が定数でなく式を受付けます ===== [[#if|if]]を使ったコードをcaseに書き換えてみましょう。 ;case の式の省略:<syntaxhighlight lang=crystal line> a = 0.0 / 0.0 case when a < 0 puts "minus" when a > 0 puts "plus" when a == 0 puts "zero" else puts a end p! ( case true when a < 0 "minus" when a > 0 "plus" when a == 0 "zero" else a end ) </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> NaN (case true when a < 0 "minus" when a > 0 "plus" when a == 0 "zero" else a end) # => NaN </syntaxhighlight> このコードは when 節の式の値とcaseの式を <code>===</code> で比較し、最初に一致した when に対応する式が実行される事を利用しています。 ===== 型による分岐 ===== when 節が式ではなく型であった場合、caseの式を <code>is_a?</code> で評価し、最初に一致した when に対応する式が実行されます。 ;型による分岐:<syntaxhighlight lang=crystal line> p! 0.class, 0.is_a?(Object), 0.is_a?(Int32), 0.is_a?(Number), 0.is_a?(String) case 0 when String puts "String" when Number puts "Number" when Int32 puts "Int32" when Object puts "Object" else puts "Unknown" end </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> 0.class # => Int32 0.is_a?(Object) # => true 0.is_a?(Int32) # => true 0.is_a?(Number) # => true 0.is_a?(String) # => false Number </syntaxhighlight> 暗黙のオブジェクト構文を使うと :<syntaxhighlight lang=crystal line> case 0 when .is_a?(String) puts "String" when .is_a?(Number) puts "Number" when .is_a(Int32) puts "Int32" when .is_a(Object) puts "Object" else puts "Unknown" end </syntaxhighlight> :と書くことが出来ます。 :: メソッドは、.is_a? に限定しないので、 .odd? .even? .include? など Bool を返すメソッドなら何でも使えます。 when に対応する式は、1つのことが珍しくないので、その場合は省略可能な then を補うと、1行で書けます。 :<syntaxhighlight lang=crystal line> case 0 when String then puts "String" when Number then puts "Number" when Int32 then puts "Int32" when Object then puts "Object" else puts "Unknown" end </syntaxhighlight> [TODO:タプルとダミー識別子 _ ] ===== 網羅性の検査 ===== when の代わりに in を使用すると、exhaustive case 式が作成されます。exhaustive case では、必要な in 条件を省略するとコンパイル時にエラーとなります。排他的論理和では、when 節と else 節を含むことはできません。 コンパイラは、以下の in 条件をサポートしています。 :<syntaxhighlight lang=crystal line> case 0 when String then puts "String" when Number then puts "Number" when Int32 then puts "Int32" when Object then puts "Object" else puts "Unknown" end </syntaxhighlight> caseの式がユニオンの場合、各要素型を条件として使用することができる。 ;組合型チェック:<syntaxhighlight lang=crystal line> var : ( Bool | Int32 | Float64 )? var = 3.14 p! ( case var in Bool then var ? 1 : 0 in Int32 then var in Float64 then var.to_i end ) </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> (case var in Bool var ? 1 : 0 in Int32 var in Float64 var.to_i end) # => 3 </syntaxhighlight> [TODO:case in は enum にも使える] [TODO:短絡評価 && || ] === 繰返し === Crystalには、他のプログラミング言語のような[[#繰返し構文|繰返し構文]]と、[[#イテレーターメソッド|イテレーターメソッド]]があります。 ==== 繰返し構文 ==== Crystalの繰返し構文には、while と untilの2つがあります<ref>for も do-while も loop もありません。</ref>。 ===== while ===== while(ホワイル)は条件が'''真'''である間、式を実行しつづけます。 ;構文:<syntaxhighlight lang=crystal> while 条件式 式1 式2 : 式n end </syntaxhighlight> : Rubyと違い、条件式の後ろに <code>do</code> をつけることは出来ません。 ;while文のコード例:<syntaxhighlight lang=crystal line> i = 0 p! ( while i < 10 p! i i += 1 break i if i > 5 end ) </syntaxhighlight> : 2行目の <code>i < 5</code>が真の間、次の2行を繰返します。 : 4行目の <code>i += 1</code> は <code>i = i + 1</code> の構文糖 ;実行結果:<syntaxhighlight lang="text"> (while i < 10 p!(i) i = i + 1 if i > 5 break i end end)# => i # => 0 i # => 1 i # => 2 i # => 3 i # => 4 i # => 5 6 </syntaxhighlight> ===== until ===== until(アンティル)は条件が'''偽'''である間、式を実行しつづけます。whileとは条件に対する挙動が逆です。 ;構文:<syntaxhighlight lang=crystal> until 条件式 [ do ] 文1 文2 : 文n end </syntaxhighlight> : <code>do</code> は省略できます。 ;untilのコード例:<syntaxhighlight lang=crystal line> i = 0 until i == 3 puts i i += 1 end </syntaxhighlight> : 2行目の <code>i == 3</code>が偽の間、次の2行を繰返します。 ;実行結果:<syntaxhighlight lang="text"> 0 1 2 </syntaxhighlight> ===== for ===== Crystalにはforがありませんが、コレクションのイテレーションメソッドを使うことで繰返しを簡素に実現出来ます。 ==== Rangeオブジェクト ==== Rangeオブジェクトは、整数の区間を表し範囲演算子 <code>開始 ... 終了</code> で生成します。 ;コード:<syntaxhighlight lang=crystal> rng = 1..3 puts rng.class rng.each do | n | puts "#{n}番"; end </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> Range(Int32, Int32) 1番 2番 3番 </syntaxhighlight> ==== Arrayオブジェクト ==== Arrayオブジェクトは、任意の Crystal オブジェクトを要素として持つことができます。 配列式<code>[要素1, 要素2, … 要素n]</code> で生成します。 ;コード:<syntaxhighlight lang=crystal> animals = ["ネコ", "金魚", "ハムスター"] puts animals.class animals.each do | animal | puts "動物 #{animal}" end </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> Array(String) 動物 ネコ 動物 金魚 動物 ハムスター </syntaxhighlight> ==== NamedTupleオブジェクト ==== NamedTupleオブジェクトは、任意の Crystal オブジェクトをキーに、任意の Crystal オブジェクトを値に持つことができる連想配列です。 NamedTuple式<code>{キー1 => 値1, キー2 => 値2, キーn => 値n}</code> で生成します。 また、キーが Symbol の場合 NamedTuple式<code>{キー1: 値1, キー2: 値2, キーn: 値n}</code> で生成することが出来ます。 ;コード:<syntaxhighlight lang=crystal> animals = {cat: "ネコ", gold_fish: "金魚", hamster: "ハムスター"} puts animals.class animals.each do | en, animal | puts "動物 #{en}: #{animal}" end </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> NamedTuple(cat: String, gold_fish: String, hamster: String) 動物 cat: ネコ 動物 gold_fish: 金魚 動物 hamster: ハムスター </syntaxhighlight> このように、Crystalではforがなくてもコレクションのメソッドで同様の処理を実現できます。 ===== loop ===== loop、ありません。 while true で代用します。 ;loopの代用コード例:<syntaxhighlight lang=crystal line> i = 1 while true puts "0b%b" % i i <<= 1 break if i > 2**8 end </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> 0b1 0b10 0b100 0b1000 0b10000 0b100000 0b1000000 0b10000000 0b100000000 </syntaxhighlight> :5行目の、<code>break if i > 2**8</code>でループを脱出するようにしています。この様に break や return あるいは例外が上がらないとループは永久に終わりません。 :このコードは、Crystalにはない do-while文を模倣する例にもなっています。 ==== イテレーターメソッド ==== ===== Integer#times ===== Integer#timesは与えられたブロックをオブジェクトの示す整数値回くりかえします。 :コード<syntaxhighlight lang=crystal> 3.times{ puts "Hello, world!" } </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> Hello, world! Hello, world! Hello, world! </syntaxhighlight> ;繰返したい処理が2行以上ある場合:<syntaxhighlight lang=crystal> 3.times { puts "Hello" puts "World" puts "" } </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> Hello World Hello World Hello World </syntaxhighlight> ;ループ変数を使た例:<syntaxhighlight lang=crystal> 3.times do |i| puts "#{i}の倍は#{2 * i}" end </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> 0の倍は0 1の倍は2 2の倍は4 </syntaxhighlight> ;ブロックを伴わないtimesメソッド:<syntaxhighlight lang=crystal> iter = 3.times puts iter.class puts iter.next # 0 puts iter.next # 1 puts iter.next # 2 # puts iter.next # `next': StopIteration: iteration reached an end </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> Int::TimesIterator(Int32) 0 1 2 </syntaxhighlight> : Integer#times にブロックを渡さないと、Int::TimesIterator([T])オブジェクトが返ります。 : Int::TimesIterator([T])オブジェクトは外部イテレーターと呼ばれnextメソッドで反復を行えます。 == 脚註 == <references /> == 外部リンク == * [https://crystal-lang.org/ The Crystal Programming Language] {{---}} 公式サイト ** [https://crystal-lang.org/api/1.5.0/ Crystal 1.5.0 リファレンス] ** [https://play.crystal-lang.org/#/cr Compile & run code in Crystal] {{---}} playground [[Category:Crystal|*]] [[Category:プログラミング言語]] {{NDC|007.64}} mwkrpqtrcjlbvfu6ox9r13xc7nrh09j 205606 205591 2022-07-21T05:25:05Z Ef3 694 /* 抽象クラス */ [[Java/抽象クラス]]を、Crystalに移植しました。crystal tool format wikitext text/x-wiki {{Pathnav|メインページ|工学|情報技術|プログラミング|frame=1}} {{Wikipedia|Crystal (プログラミング言語)}} 本書は、[[w:Crystal (プログラミング言語)|Crystal]]のチュートリアルです。 '''Crystal'''は、Ary Borenszweig、Juan Wajnerman、Brian Cardiffと300人以上の貢献者によって設計・開発された[汎用オブジェクト指向プログラミング言語です<ref>{{Cite web |url=https://github.com/crystal-lang/crystal/graphs/contributors |title=Contributors |accessdate=2022-07-18 |website=github.com }}</ref>。[[Crystal]] にヒントを得た構文を持ち、静的型チェックを備えた [[コンパイル型言語]]ですが、変数やメソッドの引数の型は一般には不要です。型は高度なグローバル[[型推論]]アルゴリズムによって解決される。<ref>{{Cite web |url=http://crystal-lang.org/2013/09/23/type-inference-part-1.html |title=Type inference part 1 |last=Brian J. |first=Cardiff |date=2013-09-09 |accessdate=2022-07-18 |website=crystal-lang.org }}</ref>Crystalは[[Apache License]]バージョン2.0のもと、FOSSとしてリリースされています。 __TOC__ == Hello, World! == 他の多くのチュートリアルがそうであるように、 私たちもまずはCrystalの世界にあいさつすることから始めましょう。 ''hello.cr''というファイルを作り(Crystalのソースファイルの拡張子は''.cr'' です)、次のように書いて保存して下さい。 ;hello.cr:<syntaxhighlight lang=Crystal> puts 'Hello, World!' </syntaxhighlight> ;コマンドラインでの操作:<syntaxhighlight lang="console"> % cat hello.cr puts 'Hello, World!' % crystal hello.cr In hello.cr:1:6 1 | puts 'Hello, World!' ^ Error: unterminated char literal, use double quotes for strings % sed -i -e "s@'@Q@g" -e 's@Q@"@g' hello.cr % cat hello.cr puts "Hello, World!" % crystal hello.cr Hello, World! </syntaxhighlight> この1行のスクリプトは、メソッド<code>puts</code> に文字リテラル<code>"Hello, World!"</code>を渡し呼出しています。 このプログラムは、[[Ruby#Hello, World!]]と同じですが、Crystalでは文字列リテラルは <code>"…"</code> で囲うのでそれだけ変更しました。 [TODO: コマンドラインツール crystal の解説。 crystal ファイル名 は crystal run ファイル名 の短縮形で、インタープリタ的な実行…ではなく、内部ビルドツールでコンパイル・実行を行う] == Ruby との違い == Crystalは、Rubyに触発された構文を持つものの、Rubyとの互換性をゴールに定めては'''いません'''。 このため、細部を見ると仕様に差異があり、Rubyのソースコードをcrystalに掛けるても前節の 'Hello World' の様にコンパイルに失敗することがあります。 また、コンパイルできても実行結果に違いが出ることがあります。 ここでは、Ruby との違いについて実際のコードと双方の結果を比較することで、差異についての理解を深めていきます。 === 整数型の特性 === ;大きな整数:<syntaxhighlight lang=Crystal> p 2 ** 999 p (2 ** 999).class </syntaxhighlight> ;rubyの実行結果:<syntaxhighlight lang="console"> 5357543035931336604742125245300009052807024058527668037218751941851755255624680612465991894078479290637973364587765734125935726428461570217992288787349287401967283887412115492710537302531185570938977091076523237491790970633699383779582771973038531457285598238843271083830214915826312193418602834034688 Integer </syntaxhighlight> ;crystalの実行結果:<syntaxhighlight lang="console"> Unhandled exception: Arithmetic overflow (OverflowError) from /usr/local/share/crystal/share/crystal/src/int.cr:295:9 in '**' from pow.cr:1:1 in '__crystal_main' from /usr/local/share/crystal/share/crystal/src/crystal/main.cr:115:5 in 'main_user_code' from /usr/local/share/crystal/share/crystal/src/crystal/main.cr:101:7 in 'main' from /usr/local/share/crystal/share/crystal/src/crystal/main.cr:127:3 in 'main' from /usr/local/lib64/libc.so.6 in '__libc_start_main' from /usr/local/.cache/crystal/crystal-run-pow.tmp in '_start' from ??? </syntaxhighlight> : Ruby の整数は、桁あふれが起こると自動的に多倍長整数に型変換されるので、継ぎ目なしに大きな数を扱うアルゴルズムが使えます。 : Crystal の整数は、固定長です(大きさについては[[#リテラルと型|後述]])。なので大きな答えになる式を評価すると桁あふれが生じます。桁あふれが生じますが、C言語のように寡黙に処理を続けるのではなく、実行時に例外(OverflowError)が上がるので、例外を捕捉し然るべき処置を施すことが可能です。 ==== BigInt ==== <code>big</code> を <code>require</code> すると <code>BigInt</code> が使えるようになります。 ;BigInt:<syntaxhighlight lang=Crystal> require "big" p BigInt.new(2) ** 999 p (BigInt.new(2) ** 999).class </syntaxhighlight> ;実行結果:<syntaxhighlight lang="console"> 5357543035931336604742125245300009052807024058527668037218751941851755255624680612465991894078479290637973364587765734125935726428461570217992288787349287401967283887412115492710537302531185570938977091076523237491790970633699383779582771973038531457285598238843271083830214915826312193418602834034688 BigInt </syntaxhighlight> : BigIntはプリミティブではなので、リテラル表現はありません。また、 ::<syntaxhighlight lang=Crystal> n : BigInt = 2 </syntaxhighlight> ::<syntaxhighlight lang=console> Error: type must be BigInt, not Int32 </syntaxhighlight> :: のように型アノテーションすることも出来ません。 === リテラルと型 === ;様々なリテラルと型:<syntaxhighlight lang=Crystal> [nil, false, true, 42, 2.73, 'Q', "string", [1,2,3], {a:1, b:2}].each{|x| p [x, x.class] } </syntaxhighlight> ;rubyの実行結果:<syntaxhighlight lang="console"> [nil, NilClass] [false, FalseClass] [true, TrueClass] [42, Integer] [2.73, Float] ["Q", String] ["string", String] [[1, 2, 3], Array] [{:a=>1, :b=>2}, Hash] </syntaxhighlight> ;crystalの実行結果:<syntaxhighlight lang="console"> [nil, Nil] [false, Bool] [true, Bool] [42, Int32] [2.73, Float64] ['Q', Char] ["string", String] [[1, 2, 3], Array(Int32)] [{a: 1, b: 2}, NamedTuple(a: Int32, b: Int32)] </syntaxhighlight> : Crystal の整数は Int32、浮動小数点数は Float64 です。 ;サイズを指定した数リテラル:<syntaxhighlight lang=Crystal> [1_i64, 2_u32, 3_u64, 4_i32, 5_i16, 6_u8, 7_i128, 8_u128, 3.14_f32, 1.44_f64].each{|x| p [x, x.class] } </syntaxhighlight> ;ruby:Rubyでは、サーフィックスの付いた数値リテラルは無効 ;crystalの実行結果:<syntaxhighlight lang="console"> [1, Int64] [2, UInt32] [3, UInt64] [4, Int32] [5, Int16] [6, UInt8] [7, Int128] [8, UInt128] [3.14, Float32] [1.44, Float64] </syntaxhighlight> : Crystal では、数値リテラルに _ で始まるサーフィックスを付け { i:符号付き整数, u:符号なし整数, f:浮動小数点数 } と { 8,16,32,64,128 } のビット幅の組合せです<ref>[https://crystal-lang.org/reference/1.5/syntax_and_semantics/literals/ Literals]</ref>。 === for式がない === Crystal には、Ruby にはある for式がありません。 ;Rubyのfor式の構文:<syntaxhighlight lang="ruby"> for 変数 in コレクション 文 end </syntaxhighlight> :コレクションは Range, Array, Hash など内部構造を持つオブジェクトです。 :for式は、最後に評価した値を返すので、for'''式'''です。 ;for式のeachメソッドによる置換え:<syntaxhighlight lang="ruby"> for x in [ 2, 3, 5, 7, 11 ] do p x end # ↓ [ 2, 3, 5, 7, 11 ].each do | x | p x end </syntaxhighlight> : の様にコレクションの each メソッドで置換え可能なので、Rubyからの移植でも小規模な書換えで済みます<ref>[https://github.com/crystal-lang/crystal/issues/830 "For" Loop support #830]</ref>(後述のマクロで実装できないかと思いましたが、いまのところ無理のようです)。 また loop 式もありませんが while true; … end で間に合います。Ruby では while 式の条件の次に do が置けますが、Crystal では置けません。 === eval()がない === Crystal には eval() はありません。 Crystalはコンパイル型言語ですので、無理もないことです。 もし、Crystal で eval() を実装しようとすると、Common Lisp の様にインタープリターを丸ごとランタイムに含む必要があります。 これはリーズナブルな選択ではありません。 Crystal では、eval() が必要なケースに(限定的ですが)マクロを使うことが出来る可能性があります。 === マクロ === Crystalには、Rubyにはないマクロがあります<ref>[https://crystal-lang.org/reference/1.5/syntax_and_semantics/macros/ Macros - Crystal]</ref>。Rubyは実行時にすべてのオブジェクトにアクセス出来て、メソッド生やし放題なのでマクロは必要ありませんが、Crystalはコンパイル時に型やメソッドを確定する必要があり、特にメソッドジェネレターとしてのマクロにニーズがあります。また、テンプレート言語的なマクロなので、環境変数による条件分岐や、コンテナを渡し繰返し処理する構文もあります(面白いことにマクロには for 文があり、反対にマクロの中では、eachメソッドは使えません)。マクロには <code><nowiki>{{</nowiki>attr.id}}</code> の様にASTへのアクセス手順が用意されており、半ば言語を拡張するようなアプローチを取ることも出来ます。 [TODO:ASTについての解説;コラム向き?] ;マクロを使ったattr_accessorのイミュレーション:<syntaxhighlight lang=crystal> class Point def initialize(@x : Int32, @y : Int32) end # macro定義 macro attr_accessor(*attrs) {% for attr in attrs %} def {{attr.id}}() @{{attr.id}} end def {{attr.id}}=(var) @{{attr.id}} = var end {% end %} end # macro呼出し attr_accessor :x, :y end pt = Point.new(20, 30) p [pt.x, pt.y] t = pt.x pt.x = pt.y pt.y = t p [pt.x, pt.y] </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> [20, 30] [30, 20] </syntaxhighlight> : Ruby には、attr_accessor と言う「クラスのメンバーのアクセサーを自動生成するメソッド」がありますが、Crystalにはないようなので、マクロで実装しました。 :: attr_accessor :name からは ::<syntaxhighlight lang=ruby> def name() @name end def name=(val) @name = val end </syntaxhighlight>相当のコードが生成されます。 [TODO:マクロの機能と構文の説明 *の付いた引数、 <nowiki>{{</nowiki>引数}}、{% … %} 構文] ==== マクロ p! ==== メソッド p は、与えられた「式」の inspaect() の返す値を puts しますが、マクロ p! は、それに先んじて(評価前の)「式」を表示します<ref>[https://crystal-lang.org/api/1.5.0/Crystal/Macros.html#p%21%28%2Aexpressions%29%3ANop-instance-method def p!(*expressions) : Nop]</ref>。 ;p!の例:<syntaxhighlight lang=crystal> x, y = true, false p! x,y,x && y, x || y, x ^ y, !x, x != y, x == y ary = [ 1, 2, 3 ] p! ary p! ary.map(&. << 1) p! ary.map(&.to_f) </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> x # => true y # => false x && y # => false x || y # => true x ^ y # => true !x # => false x != y # => true x == y # => false ary # => [1, 2, 3] ary.map(&.<<(1)) # => [2, 4, 6] ary.map(&.to_f) # => [1.0, 2.0, 3.0] </syntaxhighlight> ===== 入れ子のp! ===== マクロ p! は入れ子に出来ます。また、一旦ASTに変換してから再度ソースコードに変換するので、等価な別の構文に変換されることがあります。 ;入れ子のp!:<syntaxhighlight lang=crystal> p! ( 100.times{|i| p! i break i if i > 12 } ) </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> (100.times do |i| p!(i) if i > 12 break i end end) # => i # => 0 i # => 1 i # => 2 i # => 3 i # => 4 i # => 5 i # => 6 i # => 7 i # => 8 i # => 9 i # => 10 i # => 11 i # => 12 i # => 13 13 </syntaxhighlight> === クラス === ==== シンプルなクラス ==== ;シンプルなクラス:<syntaxhighlight lang=crystal highlight="2" line> class Hello def initialize(@name : String = "World") end def greeting puts "Hello #{@name}!" end end hello = Hello.new() hello.greeting universe = Hello.new("Universe") universe.greeting </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> Hello World! Hello Universe! </syntaxhighlight> :;初期化メソッド :: <syntaxhighlight lang=crystal line start=4> def initialize(@name : String = "World") end </syntaxhighlight> ::Rubyであれば :: <syntaxhighlight lang=ruby line start=4> def initialize(name = "World") @name = name end </syntaxhighlight> ::とするところですが、Crystalでは、型アノテーション <code> : String</code> を使い、引数の型を限定しました。 ::また、(@ 付きの)アトリビュート名を仮引数にすると、そのままアトリビュート(a.k.a. インスタンス変数)に仮引数が代入されます。 ::これは、C++のコンストラクターのメンバー初期化リストと同じアイディアですが、Crystalではインスタンス変数に @ が前置されるので、仮引数に @ が出現すればインスタンス変数の初期値だと自明で、聡明な選択です。 ==== 都市間の大圏距離 ==== [[Ruby#ユーザー定義クラス]]の都市間の大圏距離を求めるメソッドを追加した例を、Crystalに移植しました。 ;都市間の大圏距離:<syntaxhighlight lang=crystal highlight=”2,7,12” line> class GeoCoord getter :longitude, :latitude def initialize(@longitude : Float64, @latitude : Float64) end def to_s(io) ew, ns = "東経", "北緯" long, lat = @longitude, @latitude ew, long = "西経", -long if long < 0.0 ns, lat = "南緯", -lat if lat < 0.0 io << "(#{ew}: #{long}, #{ns}: #{lat})" end # https://github.com/crystal-lang/crystal/issues/259 def distance(other) i, r = Math::PI / 180, 6371.008 Math.acos(Math.sin(@latitude*i) * Math.sin(other.latitude * i) + Math.cos(@latitude*i) * Math.cos(other.latitude * i) * Math.cos(@longitude * i - other.longitude * i)) * r end end # メソッドの先頭を大文字に出来ないのでクラス名のメソッドは作ることが出来ない # def GeoCoord(lng : Float64, lat : Float64) # GeoCoord.new(lng, lat) # end Sites = { "東京駅": GeoCoord.new(139.7673068, 35.6809591), "シドニー・オペラハウス": GeoCoord.new(151.215278, -33.856778), "グリニッジ天文台": GeoCoord.new(-0.0014, 51.4778), } Sites.each { |name, gc| puts "#{name}: #{gc}" } keys, len = Sites.keys, Sites.size keys.each_with_index { |x, i| y = keys[(i + 1) % len] puts "#{x} - #{y}: #{Sites[x].distance(Sites[y])} [km]" } </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> 東京駅: (東経: 139.7673068, 北緯: 35.6809591) シドニー・オペラハウス: (東経: 151.215278, 南緯: 33.856778) グリニッジ天文台: (西経: 0.0014, 北緯: 51.4778) 東京駅 - シドニー・オペラハウス: 7823.269299386704 [km] シドニー・オペラハウス - グリニッジ天文台: 16987.2708377249 [km] グリニッジ天文台 - 東京駅: 9560.546566490015 [km] </syntaxhighlight> :Crystal には、<syntaxhighlight lang=ruby inline> attr_accessor </syntaxhighlight> はありませんが、標準ライブラリーのマクロに <syntaxhighlight lang=crystal inline> getter </syntaxhighlight>があるので :: <syntaxhighlight lang=crystal line start=2> getter :longitude, :latitude </syntaxhighlight> ::としました。 ::将来、<syntaxhighlight lang=ruby inline> attr_accessor </syntaxhighlight> が実装される可能性はありますが、姉妹品の<syntaxhighlight lang=crystal inline> setter </syntaxhighlight> との併用が下位互換性を考えると確実です。 : to_s は、Ruby ならば :: <syntaxhighlight lang=ruby line start=7> def to_s() </syntaxhighlight> :: <syntaxhighlight lang=ruby line start=12> io << "(#{ew}: #{long}, #{ns}: #{lat})" </syntaxhighlight> :: ですが、Crystalでは追加の引数 <var>io</var> が必要で :: <syntaxhighlight lang=ruby line start=7> def to_s(io) </syntaxhighlight> :: <syntaxhighlight lang=ruby line start=12> io << "(#{ew}: #{long}, #{ns}: #{lat})" </syntaxhighlight> : Ruby にはクラス名と同じ名前のメソッドで .new を呼出す文化があるのですが、Crystalはメソッドの先頭を大文字に出来ないので、これは見送りました。 ==== 包含と継承 ==== [[JavaScript/クラス#包含と継承]]を、Rubyに移植した[[Ruby#包含と継承]]を、Crystalに移植しました。 ;包含と継承の例:<syntaxhighlight lang=crystal line> class Point def initialize(@x = 0, @y = 0) end def inspect(io) io << "x:#{@x}, y:#{@y}" end def move(dx = 0, dy = 0) @x, @y = @x + dx, @y + dy self end end class Shape def initialize(x = 0, y = 0) @location = Point.new(x, y) end def inspect(io) @location.inspect(io) end def move(x, y) @location.move(x, y) self end end class Rectangle < Shape def initialize(x = 0, y = 0, @width = 0, @height = 0) super(x, y) end def inspect(io) super(io) io << ", width:#{@width}, height:#{@height}" end end rct = Rectangle.new(12, 32, 100, 50) p! rct, rct.is_a?(Rectangle), rct.is_a?(Shape), rct.is_a?(Point), rct.move(11, 21) (END)</syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> rct # => x:12, y:32, width:100, height:50 rct.is_a?(Rectangle) # => true rct.is_a?(Shape) # => true rct.is_a?(Point) # => false rct.move(11, 21) # => x:23, y:53, width:100, height:50 </syntaxhighlight> ;crystal tool hierarchy:<syntaxhighlight lang=console> % crystal tool hierarchy inclusion-and-inheritance.cr -e Shape - class Object (4 bytes) | +- class Reference (4 bytes) | +- class Shape (16 bytes) . @location : Point (8 bytes) | +- class Rectangle (24 bytes) @width : Int32 (4 bytes) @height : Int32 (4 bytes) </syntaxhighlight> : crystal の tool hierarchy サブコマンドで、クラスの継承関係がわかります。 ==== 抽象クラス ==== [[Java/抽象クラス]]を、Crystalに移植しました。 ;抽象クラスの宣言:<syntaxhighlight lang=Java> abstract class クラス名 # end </syntaxhighlight> : このクラス名は、 .new でインスタンス化出来ません。 :: Error: can't instantiate abstract class クラス名 : となります。 :インスタンス化することは出来ませんが、抽象クラスを別のクラスが継承する事は出来ます。 :また、抽象クラスを <code>super()</code> を使うことでメソッドを呼び出せるので、抽象メソッドではないメソッド(具象メソッド)を持つことも、インスタンス変数も持つことも出来ます。 :'''抽象クラスの例'''では、Shapeのinitializeメソッドが抽象クラスの具象メソッドとなっています。 ;抽象メソッドの宣言:<syntaxhighlight lang=Java> abstract def メソッド名 </syntaxhighlight> : 派生先のクラスで、「メソッド名」を定義(def)し忘れると :: Error: abstract `def クラス名#メソッド名()` must be implemented by クラス名 : となります ;抽象クラスの例:<syntaxhighlight lang=crystal line> abstract class Shape def initialize(@x = 0.0, @y = 0.0) end abstract def to_s(io) abstract def area end class Square < Shape def initialize(x, y, @wh = 0.0) super(x, y) end def to_s(io) io << "Square(#{@x}, #{@y}, #{@wh})" end def area @wh * @wh end end abstract class Shape def initialize(@x = 0.0, @y = 0.0) end abstract def to_s(io) abstract def area end class Square < Shape def initialize(x, y, @wh = 0.0) super(x, y) end def to_s(io) io << "Square(#{@x}, #{@y}, #{@wh})" end def area @wh * @wh end end class Recrangle < Shape def initialize(x, y, @w = 0.0, @h = 0.0) super(x, y) end def to_s(io) io << "Rectanle(#{@x}, #{@y}, #{@w}, #{@h})" end def area @w * @h end end class Circle < Shape def initialize(x, y, @r = 0.0) super(x, y) end def to_s(io) io << "Circle(#{@x}, #{@y}, #{@r})" end def area 3.1425926536 * @r * @r end end shapes = [ Square.new(5.0, 10.0, 15.0), Recrangle.new(13.0, 23.0, 20.0, 10.0), Circle.new(3.0, 2.0, 20.0), ] of Shape shapes.each do |shape| puts("#{shape}: #{shape.area}") end </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> Square(5.0, 10.0, 15.0): 225.0 Rectanle(13.0, 23.0, 20.0, 10.0): 200.0 Circle(3.0, 2.0, 20.0): 1257.03706144 </syntaxhighlight> ;crystal tool hierarchy:<syntaxhighlight lang=console> % crystal tool hierarchy abstract.cr -e Shape - class Object (4 bytes) | +- class Reference (4 bytes) | +- class Shape (24 bytes) . @x : Float64 (8 bytes) . @y : Float64 (8 bytes) | +- class Circle (32 bytes) | @r : Float64 (8 bytes) | +- class Recrangle (40 bytes) | @w : Float64 (8 bytes) | @h : Float64 (8 bytes) | +- class Square (32 bytes) @wh : Float64 (8 bytes) </syntaxhighlight> : crystal の tool hierarchy サブコマンドで、クラスの継承関係がわかります。 : 「包含と継承の例」と比べると、ShapeとRectangleが同じ階層にあることがわかると思います。 [TODO:virtual class::いい例がない] == 制御構造 == '''[[w:制御構造|制御構造]]'''(せいぎょこうぞう、''control flow'')とは、「順次」「分岐」「反復」という基本的な処理のことを言います。 {{コラム|Crystalの真理値|2= 制御構造は「条件式」が真であるか偽であるかによって分岐や反復の振る舞いが変わります。 では「条件式」が真・偽はどの様に決まるのでしょう? Crystalでは <code>false</code> あるいは <code>nil</code> であると偽、それ以外が真です。 なので <code>0</code> も <code>[]</code>(空のArray) も <code>{}</code>(空のNamedTuple)も真です。 }} === 条件分岐 === Crystalの条件分岐には、[[#if|if]], [[#until|until]] と [[#case|case]]の3つの構文があります。 ==== if ==== '''[[w:if|if]]'''は条件式によって実行・否を切り替える構造構文で、評価した式の値を返すので条件演算子でもあります。 ;ifの例:<syntaxhighlight lang=crystal line> a = 0.0 / 0.0 if a < 0 puts "minus" elsif a > 0 puts "plus" elsif a == 0 puts "zero" else puts a end p! ( if a < 0 "minus" elsif a > 0 "plus" elsif a == 0 "zero" else a end ) </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> NaN (if a < 0 "minus" else if a > 0 "plus" else if a == 0 "zero" else a end end end) # => NaN </syntaxhighlight> :; elsif節:ifは、オプショナルな elsif 節を設け、条件式が偽であった時に別の条件に合致した処理を実行させることが出来ます。 :; else節:ifは、オプショナルな else 節を設け、条件式が偽であった時に処理を実行させることが出来ます。 : ifは値を返すので、メソッドの実引数に使うことが出来ますし、代入演算の右辺にも使えます。 ==== 後置のif ==== Crystalには、RubyやPerlのような後置のifがあります。 ;後置のifの例:<syntaxhighlight lang=crystal> n = 0 puts "nは0" if n == 0 puts "nは1" if n == 1 </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> nは0 </syntaxhighlight> ==== unless==== '''unless'''(アンレス)は条件式によって実行・否を切り替える構造構文ですが、ifとは条件式に対する挙動が逆です。 ;unless文の例:<syntaxhighlight lang=crystal line> a = 0.0 / 0.0 unless a == 0 puts "Non-zero" else puts a end </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> Non-zero </syntaxhighlight> :; else節 : unless文は、オプショナルな else 節を設け、条件式が真であった時に処理を実行させることが出来ます。 ::また、unless文は elsif 節は持てません。 ==== 後置のunless ==== Crystalには、RubyやPerlのような後置のunlessがあります。 ;後置のunlessの例:<syntaxhighlight lang=crystal> n = 0 puts "nは0" unless n == 0 puts "nは1" unless n == 1 </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> nは1ではない </syntaxhighlight> ==== case ==== caseは、複数の条件式によって処理を降る分ける用途の為に用意されています。 ;caseの例:<syntaxhighlight lang=crystal line> n = 2 case n when 1 puts "one" when 2 puts "two" when 3 puts "three" else puts "other" end p! ( case n when 1 "one" when 2 "two" when 3 "three" else "other" end ) </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> two (case n when 1 "one" when 2 "two" when 3 "three" else "other" end) # => "two"</syntaxhighlight> :C言語系のswitch文に慣れた人はbreakがないことに気がつくと思います。Crystalのcaseはfall throughしませんし、fall throughさせる方法もありません。 ===== when節が定数でなく式を受付けます ===== [[#if|if]]を使ったコードをcaseに書き換えてみましょう。 ;case の式の省略:<syntaxhighlight lang=crystal line> a = 0.0 / 0.0 case when a < 0 puts "minus" when a > 0 puts "plus" when a == 0 puts "zero" else puts a end p! ( case true when a < 0 "minus" when a > 0 "plus" when a == 0 "zero" else a end ) </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> NaN (case true when a < 0 "minus" when a > 0 "plus" when a == 0 "zero" else a end) # => NaN </syntaxhighlight> このコードは when 節の式の値とcaseの式を <code>===</code> で比較し、最初に一致した when に対応する式が実行される事を利用しています。 ===== 型による分岐 ===== when 節が式ではなく型であった場合、caseの式を <code>is_a?</code> で評価し、最初に一致した when に対応する式が実行されます。 ;型による分岐:<syntaxhighlight lang=crystal line> p! 0.class, 0.is_a?(Object), 0.is_a?(Int32), 0.is_a?(Number), 0.is_a?(String) case 0 when String puts "String" when Number puts "Number" when Int32 puts "Int32" when Object puts "Object" else puts "Unknown" end </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> 0.class # => Int32 0.is_a?(Object) # => true 0.is_a?(Int32) # => true 0.is_a?(Number) # => true 0.is_a?(String) # => false Number </syntaxhighlight> 暗黙のオブジェクト構文を使うと :<syntaxhighlight lang=crystal line> case 0 when .is_a?(String) puts "String" when .is_a?(Number) puts "Number" when .is_a(Int32) puts "Int32" when .is_a(Object) puts "Object" else puts "Unknown" end </syntaxhighlight> :と書くことが出来ます。 :: メソッドは、.is_a? に限定しないので、 .odd? .even? .include? など Bool を返すメソッドなら何でも使えます。 when に対応する式は、1つのことが珍しくないので、その場合は省略可能な then を補うと、1行で書けます。 :<syntaxhighlight lang=crystal line> case 0 when String then puts "String" when Number then puts "Number" when Int32 then puts "Int32" when Object then puts "Object" else puts "Unknown" end </syntaxhighlight> [TODO:タプルとダミー識別子 _ ] ===== 網羅性の検査 ===== when の代わりに in を使用すると、exhaustive case 式が作成されます。exhaustive case では、必要な in 条件を省略するとコンパイル時にエラーとなります。排他的論理和では、when 節と else 節を含むことはできません。 コンパイラは、以下の in 条件をサポートしています。 :<syntaxhighlight lang=crystal line> case 0 when String then puts "String" when Number then puts "Number" when Int32 then puts "Int32" when Object then puts "Object" else puts "Unknown" end </syntaxhighlight> caseの式がユニオンの場合、各要素型を条件として使用することができる。 ;組合型チェック:<syntaxhighlight lang=crystal line> var : ( Bool | Int32 | Float64 )? var = 3.14 p! ( case var in Bool then var ? 1 : 0 in Int32 then var in Float64 then var.to_i end ) </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> (case var in Bool var ? 1 : 0 in Int32 var in Float64 var.to_i end) # => 3 </syntaxhighlight> [TODO:case in は enum にも使える] [TODO:短絡評価 && || ] === 繰返し === Crystalには、他のプログラミング言語のような[[#繰返し構文|繰返し構文]]と、[[#イテレーターメソッド|イテレーターメソッド]]があります。 ==== 繰返し構文 ==== Crystalの繰返し構文には、while と untilの2つがあります<ref>for も do-while も loop もありません。</ref>。 ===== while ===== while(ホワイル)は条件が'''真'''である間、式を実行しつづけます。 ;構文:<syntaxhighlight lang=crystal> while 条件式 式1 式2 : 式n end </syntaxhighlight> : Rubyと違い、条件式の後ろに <code>do</code> をつけることは出来ません。 ;while文のコード例:<syntaxhighlight lang=crystal line> i = 0 p! ( while i < 10 p! i i += 1 break i if i > 5 end ) </syntaxhighlight> : 2行目の <code>i < 5</code>が真の間、次の2行を繰返します。 : 4行目の <code>i += 1</code> は <code>i = i + 1</code> の構文糖 ;実行結果:<syntaxhighlight lang="text"> (while i < 10 p!(i) i = i + 1 if i > 5 break i end end)# => i # => 0 i # => 1 i # => 2 i # => 3 i # => 4 i # => 5 6 </syntaxhighlight> ===== until ===== until(アンティル)は条件が'''偽'''である間、式を実行しつづけます。whileとは条件に対する挙動が逆です。 ;構文:<syntaxhighlight lang=crystal> until 条件式 [ do ] 文1 文2 : 文n end </syntaxhighlight> : <code>do</code> は省略できます。 ;untilのコード例:<syntaxhighlight lang=crystal line> i = 0 until i == 3 puts i i += 1 end </syntaxhighlight> : 2行目の <code>i == 3</code>が偽の間、次の2行を繰返します。 ;実行結果:<syntaxhighlight lang="text"> 0 1 2 </syntaxhighlight> ===== for ===== Crystalにはforがありませんが、コレクションのイテレーションメソッドを使うことで繰返しを簡素に実現出来ます。 ==== Rangeオブジェクト ==== Rangeオブジェクトは、整数の区間を表し範囲演算子 <code>開始 ... 終了</code> で生成します。 ;コード:<syntaxhighlight lang=crystal> rng = 1..3 puts rng.class rng.each do | n | puts "#{n}番"; end </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> Range(Int32, Int32) 1番 2番 3番 </syntaxhighlight> ==== Arrayオブジェクト ==== Arrayオブジェクトは、任意の Crystal オブジェクトを要素として持つことができます。 配列式<code>[要素1, 要素2, … 要素n]</code> で生成します。 ;コード:<syntaxhighlight lang=crystal> animals = ["ネコ", "金魚", "ハムスター"] puts animals.class animals.each do | animal | puts "動物 #{animal}" end </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> Array(String) 動物 ネコ 動物 金魚 動物 ハムスター </syntaxhighlight> ==== NamedTupleオブジェクト ==== NamedTupleオブジェクトは、任意の Crystal オブジェクトをキーに、任意の Crystal オブジェクトを値に持つことができる連想配列です。 NamedTuple式<code>{キー1 => 値1, キー2 => 値2, キーn => 値n}</code> で生成します。 また、キーが Symbol の場合 NamedTuple式<code>{キー1: 値1, キー2: 値2, キーn: 値n}</code> で生成することが出来ます。 ;コード:<syntaxhighlight lang=crystal> animals = {cat: "ネコ", gold_fish: "金魚", hamster: "ハムスター"} puts animals.class animals.each do | en, animal | puts "動物 #{en}: #{animal}" end </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> NamedTuple(cat: String, gold_fish: String, hamster: String) 動物 cat: ネコ 動物 gold_fish: 金魚 動物 hamster: ハムスター </syntaxhighlight> このように、Crystalではforがなくてもコレクションのメソッドで同様の処理を実現できます。 ===== loop ===== loop、ありません。 while true で代用します。 ;loopの代用コード例:<syntaxhighlight lang=crystal line> i = 1 while true puts "0b%b" % i i <<= 1 break if i > 2**8 end </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> 0b1 0b10 0b100 0b1000 0b10000 0b100000 0b1000000 0b10000000 0b100000000 </syntaxhighlight> :5行目の、<code>break if i > 2**8</code>でループを脱出するようにしています。この様に break や return あるいは例外が上がらないとループは永久に終わりません。 :このコードは、Crystalにはない do-while文を模倣する例にもなっています。 ==== イテレーターメソッド ==== ===== Integer#times ===== Integer#timesは与えられたブロックをオブジェクトの示す整数値回くりかえします。 :コード<syntaxhighlight lang=crystal> 3.times{ puts "Hello, world!" } </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> Hello, world! Hello, world! Hello, world! </syntaxhighlight> ;繰返したい処理が2行以上ある場合:<syntaxhighlight lang=crystal> 3.times { puts "Hello" puts "World" puts "" } </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> Hello World Hello World Hello World </syntaxhighlight> ;ループ変数を使た例:<syntaxhighlight lang=crystal> 3.times do |i| puts "#{i}の倍は#{2 * i}" end </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> 0の倍は0 1の倍は2 2の倍は4 </syntaxhighlight> ;ブロックを伴わないtimesメソッド:<syntaxhighlight lang=crystal> iter = 3.times puts iter.class puts iter.next # 0 puts iter.next # 1 puts iter.next # 2 # puts iter.next # `next': StopIteration: iteration reached an end </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> Int::TimesIterator(Int32) 0 1 2 </syntaxhighlight> : Integer#times にブロックを渡さないと、Int::TimesIterator([T])オブジェクトが返ります。 : Int::TimesIterator([T])オブジェクトは外部イテレーターと呼ばれnextメソッドで反復を行えます。 == 脚註 == <references /> == 外部リンク == * [https://crystal-lang.org/ The Crystal Programming Language] {{---}} 公式サイト ** [https://crystal-lang.org/api/1.5.0/ Crystal 1.5.0 リファレンス] ** [https://play.crystal-lang.org/#/cr Compile & run code in Crystal] {{---}} playground [[Category:Crystal|*]] [[Category:プログラミング言語]] {{NDC|007.64}} ge7cwxyva086xvun21tpe8qjojbwhtm 205607 205606 2022-07-21T05:30:46Z Ef3 694 /* 都市間の大圏距離 */ cleanup wikitext text/x-wiki {{Pathnav|メインページ|工学|情報技術|プログラミング|frame=1}} {{Wikipedia|Crystal (プログラミング言語)}} 本書は、[[w:Crystal (プログラミング言語)|Crystal]]のチュートリアルです。 '''Crystal'''は、Ary Borenszweig、Juan Wajnerman、Brian Cardiffと300人以上の貢献者によって設計・開発された[汎用オブジェクト指向プログラミング言語です<ref>{{Cite web |url=https://github.com/crystal-lang/crystal/graphs/contributors |title=Contributors |accessdate=2022-07-18 |website=github.com }}</ref>。[[Crystal]] にヒントを得た構文を持ち、静的型チェックを備えた [[コンパイル型言語]]ですが、変数やメソッドの引数の型は一般には不要です。型は高度なグローバル[[型推論]]アルゴリズムによって解決される。<ref>{{Cite web |url=http://crystal-lang.org/2013/09/23/type-inference-part-1.html |title=Type inference part 1 |last=Brian J. |first=Cardiff |date=2013-09-09 |accessdate=2022-07-18 |website=crystal-lang.org }}</ref>Crystalは[[Apache License]]バージョン2.0のもと、FOSSとしてリリースされています。 __TOC__ == Hello, World! == 他の多くのチュートリアルがそうであるように、 私たちもまずはCrystalの世界にあいさつすることから始めましょう。 ''hello.cr''というファイルを作り(Crystalのソースファイルの拡張子は''.cr'' です)、次のように書いて保存して下さい。 ;hello.cr:<syntaxhighlight lang=Crystal> puts 'Hello, World!' </syntaxhighlight> ;コマンドラインでの操作:<syntaxhighlight lang="console"> % cat hello.cr puts 'Hello, World!' % crystal hello.cr In hello.cr:1:6 1 | puts 'Hello, World!' ^ Error: unterminated char literal, use double quotes for strings % sed -i -e "s@'@Q@g" -e 's@Q@"@g' hello.cr % cat hello.cr puts "Hello, World!" % crystal hello.cr Hello, World! </syntaxhighlight> この1行のスクリプトは、メソッド<code>puts</code> に文字リテラル<code>"Hello, World!"</code>を渡し呼出しています。 このプログラムは、[[Ruby#Hello, World!]]と同じですが、Crystalでは文字列リテラルは <code>"…"</code> で囲うのでそれだけ変更しました。 [TODO: コマンドラインツール crystal の解説。 crystal ファイル名 は crystal run ファイル名 の短縮形で、インタープリタ的な実行…ではなく、内部ビルドツールでコンパイル・実行を行う] == Ruby との違い == Crystalは、Rubyに触発された構文を持つものの、Rubyとの互換性をゴールに定めては'''いません'''。 このため、細部を見ると仕様に差異があり、Rubyのソースコードをcrystalに掛けるても前節の 'Hello World' の様にコンパイルに失敗することがあります。 また、コンパイルできても実行結果に違いが出ることがあります。 ここでは、Ruby との違いについて実際のコードと双方の結果を比較することで、差異についての理解を深めていきます。 === 整数型の特性 === ;大きな整数:<syntaxhighlight lang=Crystal> p 2 ** 999 p (2 ** 999).class </syntaxhighlight> ;rubyの実行結果:<syntaxhighlight lang="console"> 5357543035931336604742125245300009052807024058527668037218751941851755255624680612465991894078479290637973364587765734125935726428461570217992288787349287401967283887412115492710537302531185570938977091076523237491790970633699383779582771973038531457285598238843271083830214915826312193418602834034688 Integer </syntaxhighlight> ;crystalの実行結果:<syntaxhighlight lang="console"> Unhandled exception: Arithmetic overflow (OverflowError) from /usr/local/share/crystal/share/crystal/src/int.cr:295:9 in '**' from pow.cr:1:1 in '__crystal_main' from /usr/local/share/crystal/share/crystal/src/crystal/main.cr:115:5 in 'main_user_code' from /usr/local/share/crystal/share/crystal/src/crystal/main.cr:101:7 in 'main' from /usr/local/share/crystal/share/crystal/src/crystal/main.cr:127:3 in 'main' from /usr/local/lib64/libc.so.6 in '__libc_start_main' from /usr/local/.cache/crystal/crystal-run-pow.tmp in '_start' from ??? </syntaxhighlight> : Ruby の整数は、桁あふれが起こると自動的に多倍長整数に型変換されるので、継ぎ目なしに大きな数を扱うアルゴルズムが使えます。 : Crystal の整数は、固定長です(大きさについては[[#リテラルと型|後述]])。なので大きな答えになる式を評価すると桁あふれが生じます。桁あふれが生じますが、C言語のように寡黙に処理を続けるのではなく、実行時に例外(OverflowError)が上がるので、例外を捕捉し然るべき処置を施すことが可能です。 ==== BigInt ==== <code>big</code> を <code>require</code> すると <code>BigInt</code> が使えるようになります。 ;BigInt:<syntaxhighlight lang=Crystal> require "big" p BigInt.new(2) ** 999 p (BigInt.new(2) ** 999).class </syntaxhighlight> ;実行結果:<syntaxhighlight lang="console"> 5357543035931336604742125245300009052807024058527668037218751941851755255624680612465991894078479290637973364587765734125935726428461570217992288787349287401967283887412115492710537302531185570938977091076523237491790970633699383779582771973038531457285598238843271083830214915826312193418602834034688 BigInt </syntaxhighlight> : BigIntはプリミティブではなので、リテラル表現はありません。また、 ::<syntaxhighlight lang=Crystal> n : BigInt = 2 </syntaxhighlight> ::<syntaxhighlight lang=console> Error: type must be BigInt, not Int32 </syntaxhighlight> :: のように型アノテーションすることも出来ません。 === リテラルと型 === ;様々なリテラルと型:<syntaxhighlight lang=Crystal> [nil, false, true, 42, 2.73, 'Q', "string", [1,2,3], {a:1, b:2}].each{|x| p [x, x.class] } </syntaxhighlight> ;rubyの実行結果:<syntaxhighlight lang="console"> [nil, NilClass] [false, FalseClass] [true, TrueClass] [42, Integer] [2.73, Float] ["Q", String] ["string", String] [[1, 2, 3], Array] [{:a=>1, :b=>2}, Hash] </syntaxhighlight> ;crystalの実行結果:<syntaxhighlight lang="console"> [nil, Nil] [false, Bool] [true, Bool] [42, Int32] [2.73, Float64] ['Q', Char] ["string", String] [[1, 2, 3], Array(Int32)] [{a: 1, b: 2}, NamedTuple(a: Int32, b: Int32)] </syntaxhighlight> : Crystal の整数は Int32、浮動小数点数は Float64 です。 ;サイズを指定した数リテラル:<syntaxhighlight lang=Crystal> [1_i64, 2_u32, 3_u64, 4_i32, 5_i16, 6_u8, 7_i128, 8_u128, 3.14_f32, 1.44_f64].each{|x| p [x, x.class] } </syntaxhighlight> ;ruby:Rubyでは、サーフィックスの付いた数値リテラルは無効 ;crystalの実行結果:<syntaxhighlight lang="console"> [1, Int64] [2, UInt32] [3, UInt64] [4, Int32] [5, Int16] [6, UInt8] [7, Int128] [8, UInt128] [3.14, Float32] [1.44, Float64] </syntaxhighlight> : Crystal では、数値リテラルに _ で始まるサーフィックスを付け { i:符号付き整数, u:符号なし整数, f:浮動小数点数 } と { 8,16,32,64,128 } のビット幅の組合せです<ref>[https://crystal-lang.org/reference/1.5/syntax_and_semantics/literals/ Literals]</ref>。 === for式がない === Crystal には、Ruby にはある for式がありません。 ;Rubyのfor式の構文:<syntaxhighlight lang="ruby"> for 変数 in コレクション 文 end </syntaxhighlight> :コレクションは Range, Array, Hash など内部構造を持つオブジェクトです。 :for式は、最後に評価した値を返すので、for'''式'''です。 ;for式のeachメソッドによる置換え:<syntaxhighlight lang="ruby"> for x in [ 2, 3, 5, 7, 11 ] do p x end # ↓ [ 2, 3, 5, 7, 11 ].each do | x | p x end </syntaxhighlight> : の様にコレクションの each メソッドで置換え可能なので、Rubyからの移植でも小規模な書換えで済みます<ref>[https://github.com/crystal-lang/crystal/issues/830 "For" Loop support #830]</ref>(後述のマクロで実装できないかと思いましたが、いまのところ無理のようです)。 また loop 式もありませんが while true; … end で間に合います。Ruby では while 式の条件の次に do が置けますが、Crystal では置けません。 === eval()がない === Crystal には eval() はありません。 Crystalはコンパイル型言語ですので、無理もないことです。 もし、Crystal で eval() を実装しようとすると、Common Lisp の様にインタープリターを丸ごとランタイムに含む必要があります。 これはリーズナブルな選択ではありません。 Crystal では、eval() が必要なケースに(限定的ですが)マクロを使うことが出来る可能性があります。 === マクロ === Crystalには、Rubyにはないマクロがあります<ref>[https://crystal-lang.org/reference/1.5/syntax_and_semantics/macros/ Macros - Crystal]</ref>。Rubyは実行時にすべてのオブジェクトにアクセス出来て、メソッド生やし放題なのでマクロは必要ありませんが、Crystalはコンパイル時に型やメソッドを確定する必要があり、特にメソッドジェネレターとしてのマクロにニーズがあります。また、テンプレート言語的なマクロなので、環境変数による条件分岐や、コンテナを渡し繰返し処理する構文もあります(面白いことにマクロには for 文があり、反対にマクロの中では、eachメソッドは使えません)。マクロには <code><nowiki>{{</nowiki>attr.id}}</code> の様にASTへのアクセス手順が用意されており、半ば言語を拡張するようなアプローチを取ることも出来ます。 [TODO:ASTについての解説;コラム向き?] ;マクロを使ったattr_accessorのイミュレーション:<syntaxhighlight lang=crystal> class Point def initialize(@x : Int32, @y : Int32) end # macro定義 macro attr_accessor(*attrs) {% for attr in attrs %} def {{attr.id}}() @{{attr.id}} end def {{attr.id}}=(var) @{{attr.id}} = var end {% end %} end # macro呼出し attr_accessor :x, :y end pt = Point.new(20, 30) p [pt.x, pt.y] t = pt.x pt.x = pt.y pt.y = t p [pt.x, pt.y] </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> [20, 30] [30, 20] </syntaxhighlight> : Ruby には、attr_accessor と言う「クラスのメンバーのアクセサーを自動生成するメソッド」がありますが、Crystalにはないようなので、マクロで実装しました。 :: attr_accessor :name からは ::<syntaxhighlight lang=ruby> def name() @name end def name=(val) @name = val end </syntaxhighlight>相当のコードが生成されます。 [TODO:マクロの機能と構文の説明 *の付いた引数、 <nowiki>{{</nowiki>引数}}、{% … %} 構文] ==== マクロ p! ==== メソッド p は、与えられた「式」の inspaect() の返す値を puts しますが、マクロ p! は、それに先んじて(評価前の)「式」を表示します<ref>[https://crystal-lang.org/api/1.5.0/Crystal/Macros.html#p%21%28%2Aexpressions%29%3ANop-instance-method def p!(*expressions) : Nop]</ref>。 ;p!の例:<syntaxhighlight lang=crystal> x, y = true, false p! x,y,x && y, x || y, x ^ y, !x, x != y, x == y ary = [ 1, 2, 3 ] p! ary p! ary.map(&. << 1) p! ary.map(&.to_f) </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> x # => true y # => false x && y # => false x || y # => true x ^ y # => true !x # => false x != y # => true x == y # => false ary # => [1, 2, 3] ary.map(&.<<(1)) # => [2, 4, 6] ary.map(&.to_f) # => [1.0, 2.0, 3.0] </syntaxhighlight> ===== 入れ子のp! ===== マクロ p! は入れ子に出来ます。また、一旦ASTに変換してから再度ソースコードに変換するので、等価な別の構文に変換されることがあります。 ;入れ子のp!:<syntaxhighlight lang=crystal> p! ( 100.times{|i| p! i break i if i > 12 } ) </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> (100.times do |i| p!(i) if i > 12 break i end end) # => i # => 0 i # => 1 i # => 2 i # => 3 i # => 4 i # => 5 i # => 6 i # => 7 i # => 8 i # => 9 i # => 10 i # => 11 i # => 12 i # => 13 13 </syntaxhighlight> === クラス === ==== シンプルなクラス ==== ;シンプルなクラス:<syntaxhighlight lang=crystal highlight="2" line> class Hello def initialize(@name : String = "World") end def greeting puts "Hello #{@name}!" end end hello = Hello.new() hello.greeting universe = Hello.new("Universe") universe.greeting </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> Hello World! Hello Universe! </syntaxhighlight> :;初期化メソッド :: <syntaxhighlight lang=crystal line start=4> def initialize(@name : String = "World") end </syntaxhighlight> ::Rubyであれば :: <syntaxhighlight lang=ruby line start=4> def initialize(name = "World") @name = name end </syntaxhighlight> ::とするところですが、Crystalでは、型アノテーション <code> : String</code> を使い、引数の型を限定しました。 ::また、(@ 付きの)アトリビュート名を仮引数にすると、そのままアトリビュート(a.k.a. インスタンス変数)に仮引数が代入されます。 ::これは、C++のコンストラクターのメンバー初期化リストと同じアイディアですが、Crystalではインスタンス変数に @ が前置されるので、仮引数に @ が出現すればインスタンス変数の初期値だと自明で、聡明な選択です。 ==== 都市間の大圏距離 ==== [[Ruby#ユーザー定義クラス]]の都市間の大圏距離を求めるメソッドを追加した例を、Crystalに移植しました。 ;都市間の大圏距離:<syntaxhighlight lang=crystal highlight=”2,7,12” line> class GeoCoord getter :longitude, :latitude def initialize(@longitude : Float64, @latitude : Float64) end def to_s(io) ew, ns = "東経", "北緯" long, lat = @longitude, @latitude ew, long = "西経", -long if long < 0.0 ns, lat = "南緯", -lat if lat < 0.0 io << "(#{ew}: #{long}, #{ns}: #{lat})" end # https://github.com/crystal-lang/crystal/issues/259 def distance(other) i, r = Math::PI / 180, 6371.008 Math.acos(Math.sin(@latitude*i) * Math.sin(other.latitude * i) + Math.cos(@latitude*i) * Math.cos(other.latitude * i) * Math.cos(@longitude * i - other.longitude * i)) * r end end # メソッドの先頭を大文字に出来ないのでクラス名のメソッドは作ることが出来ない # def GeoCoord(lng : Float64, lat : Float64) # GeoCoord.new(lng, lat) # end Sites = { "東京駅": GeoCoord.new(139.7673068, 35.6809591), "シドニー・オペラハウス": GeoCoord.new(151.215278, -33.856778), "グリニッジ天文台": GeoCoord.new(-0.0014, 51.4778), } Sites.each { |name, gc| puts "#{name}: #{gc}" } puts "" keys, len = Sites.keys, Sites.size keys.each_with_index { |x, i| y = keys[(i + 1) % len] puts "#{x} ⇔ #{y}: #{Sites[x].distance(Sites[y])} [km]" } </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> 東京駅: (東経: 139.7673068, 北緯: 35.6809591) シドニー・オペラハウス: (東経: 151.215278, 南緯: 33.856778) グリニッジ天文台: (西経: 0.0014, 北緯: 51.4778) 東京駅 ⇔ シドニー・オペラハウス: 7823.269299386704 [km] シドニー・オペラハウス ⇔ グリニッジ天文台: 16987.2708377249 [km] グリニッジ天文台 ⇔ 東京駅: 9560.546566490015 [km] </syntaxhighlight> :Crystal には、<syntaxhighlight lang=ruby inline> attr_accessor </syntaxhighlight> はありませんが、標準ライブラリーのマクロに <syntaxhighlight lang=crystal inline> getter </syntaxhighlight>があるので :: <syntaxhighlight lang=crystal line start=2> getter :longitude, :latitude </syntaxhighlight> ::としました。 ::将来、<syntaxhighlight lang=ruby inline> attr_accessor </syntaxhighlight> が実装される可能性はありますが、姉妹品の<syntaxhighlight lang=crystal inline> setter </syntaxhighlight> との併用が下位互換性を考えると確実です。 : to_s は、Ruby ならば :: <syntaxhighlight lang=ruby line start=7> def to_s() </syntaxhighlight> :: <syntaxhighlight lang=ruby line start=12> "(#{ew}: #{long}, #{ns}: #{lat})" </syntaxhighlight> :: ですが、Crystalでは追加の引数 <var>io</var> が必要で :: <syntaxhighlight lang=ruby line start=7> def to_s(io) </syntaxhighlight> :: <syntaxhighlight lang=ruby line start=12> io << "(#{ew}: #{long}, #{ns}: #{lat})" </syntaxhighlight> : Ruby にはクラス名と同じ名前のメソッドで .new を呼出す文化があるのですが、Crystalはメソッドの先頭を大文字に出来ないので、これは見送りました。 ==== 包含と継承 ==== [[JavaScript/クラス#包含と継承]]を、Rubyに移植した[[Ruby#包含と継承]]を、Crystalに移植しました。 ;包含と継承の例:<syntaxhighlight lang=crystal line> class Point def initialize(@x = 0, @y = 0) end def inspect(io) io << "x:#{@x}, y:#{@y}" end def move(dx = 0, dy = 0) @x, @y = @x + dx, @y + dy self end end class Shape def initialize(x = 0, y = 0) @location = Point.new(x, y) end def inspect(io) @location.inspect(io) end def move(x, y) @location.move(x, y) self end end class Rectangle < Shape def initialize(x = 0, y = 0, @width = 0, @height = 0) super(x, y) end def inspect(io) super(io) io << ", width:#{@width}, height:#{@height}" end end rct = Rectangle.new(12, 32, 100, 50) p! rct, rct.is_a?(Rectangle), rct.is_a?(Shape), rct.is_a?(Point), rct.move(11, 21) (END)</syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> rct # => x:12, y:32, width:100, height:50 rct.is_a?(Rectangle) # => true rct.is_a?(Shape) # => true rct.is_a?(Point) # => false rct.move(11, 21) # => x:23, y:53, width:100, height:50 </syntaxhighlight> ;crystal tool hierarchy:<syntaxhighlight lang=console> % crystal tool hierarchy inclusion-and-inheritance.cr -e Shape - class Object (4 bytes) | +- class Reference (4 bytes) | +- class Shape (16 bytes) . @location : Point (8 bytes) | +- class Rectangle (24 bytes) @width : Int32 (4 bytes) @height : Int32 (4 bytes) </syntaxhighlight> : crystal の tool hierarchy サブコマンドで、クラスの継承関係がわかります。 ==== 抽象クラス ==== [[Java/抽象クラス]]を、Crystalに移植しました。 ;抽象クラスの宣言:<syntaxhighlight lang=Java> abstract class クラス名 # end </syntaxhighlight> : このクラス名は、 .new でインスタンス化出来ません。 :: Error: can't instantiate abstract class クラス名 : となります。 :インスタンス化することは出来ませんが、抽象クラスを別のクラスが継承する事は出来ます。 :また、抽象クラスを <code>super()</code> を使うことでメソッドを呼び出せるので、抽象メソッドではないメソッド(具象メソッド)を持つことも、インスタンス変数も持つことも出来ます。 :'''抽象クラスの例'''では、Shapeのinitializeメソッドが抽象クラスの具象メソッドとなっています。 ;抽象メソッドの宣言:<syntaxhighlight lang=Java> abstract def メソッド名 </syntaxhighlight> : 派生先のクラスで、「メソッド名」を定義(def)し忘れると :: Error: abstract `def クラス名#メソッド名()` must be implemented by クラス名 : となります ;抽象クラスの例:<syntaxhighlight lang=crystal line> abstract class Shape def initialize(@x = 0.0, @y = 0.0) end abstract def to_s(io) abstract def area end class Square < Shape def initialize(x, y, @wh = 0.0) super(x, y) end def to_s(io) io << "Square(#{@x}, #{@y}, #{@wh})" end def area @wh * @wh end end abstract class Shape def initialize(@x = 0.0, @y = 0.0) end abstract def to_s(io) abstract def area end class Square < Shape def initialize(x, y, @wh = 0.0) super(x, y) end def to_s(io) io << "Square(#{@x}, #{@y}, #{@wh})" end def area @wh * @wh end end class Recrangle < Shape def initialize(x, y, @w = 0.0, @h = 0.0) super(x, y) end def to_s(io) io << "Rectanle(#{@x}, #{@y}, #{@w}, #{@h})" end def area @w * @h end end class Circle < Shape def initialize(x, y, @r = 0.0) super(x, y) end def to_s(io) io << "Circle(#{@x}, #{@y}, #{@r})" end def area 3.1425926536 * @r * @r end end shapes = [ Square.new(5.0, 10.0, 15.0), Recrangle.new(13.0, 23.0, 20.0, 10.0), Circle.new(3.0, 2.0, 20.0), ] of Shape shapes.each do |shape| puts("#{shape}: #{shape.area}") end </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text> Square(5.0, 10.0, 15.0): 225.0 Rectanle(13.0, 23.0, 20.0, 10.0): 200.0 Circle(3.0, 2.0, 20.0): 1257.03706144 </syntaxhighlight> ;crystal tool hierarchy:<syntaxhighlight lang=console> % crystal tool hierarchy abstract.cr -e Shape - class Object (4 bytes) | +- class Reference (4 bytes) | +- class Shape (24 bytes) . @x : Float64 (8 bytes) . @y : Float64 (8 bytes) | +- class Circle (32 bytes) | @r : Float64 (8 bytes) | +- class Recrangle (40 bytes) | @w : Float64 (8 bytes) | @h : Float64 (8 bytes) | +- class Square (32 bytes) @wh : Float64 (8 bytes) </syntaxhighlight> : crystal の tool hierarchy サブコマンドで、クラスの継承関係がわかります。 : 「包含と継承の例」と比べると、ShapeとRectangleが同じ階層にあることがわかると思います。 [TODO:virtual class::いい例がない] == 制御構造 == '''[[w:制御構造|制御構造]]'''(せいぎょこうぞう、''control flow'')とは、「順次」「分岐」「反復」という基本的な処理のことを言います。 {{コラム|Crystalの真理値|2= 制御構造は「条件式」が真であるか偽であるかによって分岐や反復の振る舞いが変わります。 では「条件式」が真・偽はどの様に決まるのでしょう? Crystalでは <code>false</code> あるいは <code>nil</code> であると偽、それ以外が真です。 なので <code>0</code> も <code>[]</code>(空のArray) も <code>{}</code>(空のNamedTuple)も真です。 }} === 条件分岐 === Crystalの条件分岐には、[[#if|if]], [[#until|until]] と [[#case|case]]の3つの構文があります。 ==== if ==== '''[[w:if|if]]'''は条件式によって実行・否を切り替える構造構文で、評価した式の値を返すので条件演算子でもあります。 ;ifの例:<syntaxhighlight lang=crystal line> a = 0.0 / 0.0 if a < 0 puts "minus" elsif a > 0 puts "plus" elsif a == 0 puts "zero" else puts a end p! ( if a < 0 "minus" elsif a > 0 "plus" elsif a == 0 "zero" else a end ) </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> NaN (if a < 0 "minus" else if a > 0 "plus" else if a == 0 "zero" else a end end end) # => NaN </syntaxhighlight> :; elsif節:ifは、オプショナルな elsif 節を設け、条件式が偽であった時に別の条件に合致した処理を実行させることが出来ます。 :; else節:ifは、オプショナルな else 節を設け、条件式が偽であった時に処理を実行させることが出来ます。 : ifは値を返すので、メソッドの実引数に使うことが出来ますし、代入演算の右辺にも使えます。 ==== 後置のif ==== Crystalには、RubyやPerlのような後置のifがあります。 ;後置のifの例:<syntaxhighlight lang=crystal> n = 0 puts "nは0" if n == 0 puts "nは1" if n == 1 </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> nは0 </syntaxhighlight> ==== unless==== '''unless'''(アンレス)は条件式によって実行・否を切り替える構造構文ですが、ifとは条件式に対する挙動が逆です。 ;unless文の例:<syntaxhighlight lang=crystal line> a = 0.0 / 0.0 unless a == 0 puts "Non-zero" else puts a end </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> Non-zero </syntaxhighlight> :; else節 : unless文は、オプショナルな else 節を設け、条件式が真であった時に処理を実行させることが出来ます。 ::また、unless文は elsif 節は持てません。 ==== 後置のunless ==== Crystalには、RubyやPerlのような後置のunlessがあります。 ;後置のunlessの例:<syntaxhighlight lang=crystal> n = 0 puts "nは0" unless n == 0 puts "nは1" unless n == 1 </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> nは1ではない </syntaxhighlight> ==== case ==== caseは、複数の条件式によって処理を降る分ける用途の為に用意されています。 ;caseの例:<syntaxhighlight lang=crystal line> n = 2 case n when 1 puts "one" when 2 puts "two" when 3 puts "three" else puts "other" end p! ( case n when 1 "one" when 2 "two" when 3 "three" else "other" end ) </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> two (case n when 1 "one" when 2 "two" when 3 "three" else "other" end) # => "two"</syntaxhighlight> :C言語系のswitch文に慣れた人はbreakがないことに気がつくと思います。Crystalのcaseはfall throughしませんし、fall throughさせる方法もありません。 ===== when節が定数でなく式を受付けます ===== [[#if|if]]を使ったコードをcaseに書き換えてみましょう。 ;case の式の省略:<syntaxhighlight lang=crystal line> a = 0.0 / 0.0 case when a < 0 puts "minus" when a > 0 puts "plus" when a == 0 puts "zero" else puts a end p! ( case true when a < 0 "minus" when a > 0 "plus" when a == 0 "zero" else a end ) </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> NaN (case true when a < 0 "minus" when a > 0 "plus" when a == 0 "zero" else a end) # => NaN </syntaxhighlight> このコードは when 節の式の値とcaseの式を <code>===</code> で比較し、最初に一致した when に対応する式が実行される事を利用しています。 ===== 型による分岐 ===== when 節が式ではなく型であった場合、caseの式を <code>is_a?</code> で評価し、最初に一致した when に対応する式が実行されます。 ;型による分岐:<syntaxhighlight lang=crystal line> p! 0.class, 0.is_a?(Object), 0.is_a?(Int32), 0.is_a?(Number), 0.is_a?(String) case 0 when String puts "String" when Number puts "Number" when Int32 puts "Int32" when Object puts "Object" else puts "Unknown" end </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> 0.class # => Int32 0.is_a?(Object) # => true 0.is_a?(Int32) # => true 0.is_a?(Number) # => true 0.is_a?(String) # => false Number </syntaxhighlight> 暗黙のオブジェクト構文を使うと :<syntaxhighlight lang=crystal line> case 0 when .is_a?(String) puts "String" when .is_a?(Number) puts "Number" when .is_a(Int32) puts "Int32" when .is_a(Object) puts "Object" else puts "Unknown" end </syntaxhighlight> :と書くことが出来ます。 :: メソッドは、.is_a? に限定しないので、 .odd? .even? .include? など Bool を返すメソッドなら何でも使えます。 when に対応する式は、1つのことが珍しくないので、その場合は省略可能な then を補うと、1行で書けます。 :<syntaxhighlight lang=crystal line> case 0 when String then puts "String" when Number then puts "Number" when Int32 then puts "Int32" when Object then puts "Object" else puts "Unknown" end </syntaxhighlight> [TODO:タプルとダミー識別子 _ ] ===== 網羅性の検査 ===== when の代わりに in を使用すると、exhaustive case 式が作成されます。exhaustive case では、必要な in 条件を省略するとコンパイル時にエラーとなります。排他的論理和では、when 節と else 節を含むことはできません。 コンパイラは、以下の in 条件をサポートしています。 :<syntaxhighlight lang=crystal line> case 0 when String then puts "String" when Number then puts "Number" when Int32 then puts "Int32" when Object then puts "Object" else puts "Unknown" end </syntaxhighlight> caseの式がユニオンの場合、各要素型を条件として使用することができる。 ;組合型チェック:<syntaxhighlight lang=crystal line> var : ( Bool | Int32 | Float64 )? var = 3.14 p! ( case var in Bool then var ? 1 : 0 in Int32 then var in Float64 then var.to_i end ) </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> (case var in Bool var ? 1 : 0 in Int32 var in Float64 var.to_i end) # => 3 </syntaxhighlight> [TODO:case in は enum にも使える] [TODO:短絡評価 && || ] === 繰返し === Crystalには、他のプログラミング言語のような[[#繰返し構文|繰返し構文]]と、[[#イテレーターメソッド|イテレーターメソッド]]があります。 ==== 繰返し構文 ==== Crystalの繰返し構文には、while と untilの2つがあります<ref>for も do-while も loop もありません。</ref>。 ===== while ===== while(ホワイル)は条件が'''真'''である間、式を実行しつづけます。 ;構文:<syntaxhighlight lang=crystal> while 条件式 式1 式2 : 式n end </syntaxhighlight> : Rubyと違い、条件式の後ろに <code>do</code> をつけることは出来ません。 ;while文のコード例:<syntaxhighlight lang=crystal line> i = 0 p! ( while i < 10 p! i i += 1 break i if i > 5 end ) </syntaxhighlight> : 2行目の <code>i < 5</code>が真の間、次の2行を繰返します。 : 4行目の <code>i += 1</code> は <code>i = i + 1</code> の構文糖 ;実行結果:<syntaxhighlight lang="text"> (while i < 10 p!(i) i = i + 1 if i > 5 break i end end)# => i # => 0 i # => 1 i # => 2 i # => 3 i # => 4 i # => 5 6 </syntaxhighlight> ===== until ===== until(アンティル)は条件が'''偽'''である間、式を実行しつづけます。whileとは条件に対する挙動が逆です。 ;構文:<syntaxhighlight lang=crystal> until 条件式 [ do ] 文1 文2 : 文n end </syntaxhighlight> : <code>do</code> は省略できます。 ;untilのコード例:<syntaxhighlight lang=crystal line> i = 0 until i == 3 puts i i += 1 end </syntaxhighlight> : 2行目の <code>i == 3</code>が偽の間、次の2行を繰返します。 ;実行結果:<syntaxhighlight lang="text"> 0 1 2 </syntaxhighlight> ===== for ===== Crystalにはforがありませんが、コレクションのイテレーションメソッドを使うことで繰返しを簡素に実現出来ます。 ==== Rangeオブジェクト ==== Rangeオブジェクトは、整数の区間を表し範囲演算子 <code>開始 ... 終了</code> で生成します。 ;コード:<syntaxhighlight lang=crystal> rng = 1..3 puts rng.class rng.each do | n | puts "#{n}番"; end </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> Range(Int32, Int32) 1番 2番 3番 </syntaxhighlight> ==== Arrayオブジェクト ==== Arrayオブジェクトは、任意の Crystal オブジェクトを要素として持つことができます。 配列式<code>[要素1, 要素2, … 要素n]</code> で生成します。 ;コード:<syntaxhighlight lang=crystal> animals = ["ネコ", "金魚", "ハムスター"] puts animals.class animals.each do | animal | puts "動物 #{animal}" end </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> Array(String) 動物 ネコ 動物 金魚 動物 ハムスター </syntaxhighlight> ==== NamedTupleオブジェクト ==== NamedTupleオブジェクトは、任意の Crystal オブジェクトをキーに、任意の Crystal オブジェクトを値に持つことができる連想配列です。 NamedTuple式<code>{キー1 => 値1, キー2 => 値2, キーn => 値n}</code> で生成します。 また、キーが Symbol の場合 NamedTuple式<code>{キー1: 値1, キー2: 値2, キーn: 値n}</code> で生成することが出来ます。 ;コード:<syntaxhighlight lang=crystal> animals = {cat: "ネコ", gold_fish: "金魚", hamster: "ハムスター"} puts animals.class animals.each do | en, animal | puts "動物 #{en}: #{animal}" end </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> NamedTuple(cat: String, gold_fish: String, hamster: String) 動物 cat: ネコ 動物 gold_fish: 金魚 動物 hamster: ハムスター </syntaxhighlight> このように、Crystalではforがなくてもコレクションのメソッドで同様の処理を実現できます。 ===== loop ===== loop、ありません。 while true で代用します。 ;loopの代用コード例:<syntaxhighlight lang=crystal line> i = 1 while true puts "0b%b" % i i <<= 1 break if i > 2**8 end </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> 0b1 0b10 0b100 0b1000 0b10000 0b100000 0b1000000 0b10000000 0b100000000 </syntaxhighlight> :5行目の、<code>break if i > 2**8</code>でループを脱出するようにしています。この様に break や return あるいは例外が上がらないとループは永久に終わりません。 :このコードは、Crystalにはない do-while文を模倣する例にもなっています。 ==== イテレーターメソッド ==== ===== Integer#times ===== Integer#timesは与えられたブロックをオブジェクトの示す整数値回くりかえします。 :コード<syntaxhighlight lang=crystal> 3.times{ puts "Hello, world!" } </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> Hello, world! Hello, world! Hello, world! </syntaxhighlight> ;繰返したい処理が2行以上ある場合:<syntaxhighlight lang=crystal> 3.times { puts "Hello" puts "World" puts "" } </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> Hello World Hello World Hello World </syntaxhighlight> ;ループ変数を使た例:<syntaxhighlight lang=crystal> 3.times do |i| puts "#{i}の倍は#{2 * i}" end </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> 0の倍は0 1の倍は2 2の倍は4 </syntaxhighlight> ;ブロックを伴わないtimesメソッド:<syntaxhighlight lang=crystal> iter = 3.times puts iter.class puts iter.next # 0 puts iter.next # 1 puts iter.next # 2 # puts iter.next # `next': StopIteration: iteration reached an end </syntaxhighlight> ;実行結果:<syntaxhighlight lang="text"> Int::TimesIterator(Int32) 0 1 2 </syntaxhighlight> : Integer#times にブロックを渡さないと、Int::TimesIterator([T])オブジェクトが返ります。 : Int::TimesIterator([T])オブジェクトは外部イテレーターと呼ばれnextメソッドで反復を行えます。 == 脚註 == <references /> == 外部リンク == * [https://crystal-lang.org/ The Crystal Programming Language] {{---}} 公式サイト ** [https://crystal-lang.org/api/1.5.0/ Crystal 1.5.0 リファレンス] ** [https://play.crystal-lang.org/#/cr Compile & run code in Crystal] {{---}} playground [[Category:Crystal|*]] [[Category:プログラミング言語]] {{NDC|007.64}} 24udhktifbun6lc18bck2sund2bq7bk Wikibooks:GUS2Wiki 4 35248 205590 205540 2022-07-20T20:36:34Z Alexis Jazz 56315 Updating gadget usage statistics from [[Special:GadgetUsage]] ([[phab:T121049]]) wikitext text/x-wiki {{#ifexist:Project:GUS2Wiki/top|{{/top}}|This page provides a historical record of [[Special:GadgetUsage]] through its page history. To get the data in CSV format, see wikitext. To customize this message or add categories, create [[/top]].}} 以下のデータは 2022-07-20T07:57:58Z に最終更新されたキャッシュです。 {| class="sortable wikitable" ! ガジェット !! data-sort-type="number" | 利用者の数 !! data-sort-type="number" | 活動中の利用者 |- |Navigation popups || 79 || 2 |- |wikEd || 42 || 1 |} * [[特別:GadgetUsage]] * [[w:en:Wikipedia:GUS2Wiki/Script|GUS2Wiki]] <!-- data in CSV format: Navigation popups,79,2 wikEd,42,1 --> 3muiank5fbgwkmy7j4ilruhocd8knty 高等学校 生物基礎/個体の成り立ちと多様性 0 35253 205620 2022-07-21T10:25:49Z Kwawe 68789 ページの作成:「本節では、単細胞生物と多細胞生物の用語の意味と代表的な動物名を押さえましょう。 == 単細胞生物と多細胞生物 == [[w:アメーバ|アメーバ]]、[[w:ミドリムシ|ミドリムシ]]、[[w:ゾウリムシ|ゾウリムシ]]など、個体が単一の細胞からできている生物は'''単細胞生物'''(unicellular organism)と呼ばれます。 例えばゾウリムシは、一つの細胞で、繊毛を使って泳…」 wikitext text/x-wiki 本節では、単細胞生物と多細胞生物の用語の意味と代表的な動物名を押さえましょう。 == 単細胞生物と多細胞生物 == [[w:アメーバ|アメーバ]]、[[w:ミドリムシ|ミドリムシ]]、[[w:ゾウリムシ|ゾウリムシ]]など、個体が単一の細胞からできている生物は'''単細胞生物'''(unicellular organism)と呼ばれます。 例えばゾウリムシは、一つの細胞で、繊毛を使って泳いだり、細胞口を使って食べたり、食胞を使って消化したりしています。 単細胞生物に対して、形や働きの異なる多くの細胞からなる生物は'''多細胞生物'''(multicellular organism)と呼ばれます。多細胞生物において、[[w:藻類|藻類]]や[[w:腔腸動物|腔腸動物]]は、[[w:種子植物|種子植物]]や[[w:脊椎動物|脊椎動物]]に比べると簡単な構造を持っています。 例えば[[w:ヒドラ|ヒドラ]]は、8種類約10万個の細胞からなる多細胞生物で、刺細胞で攻撃したり、腺細胞で消化液を分泌したり、消化細胞で消化を行ったりしています。 kzj4lxdc7ik8ynuw4qi2md4vx0p93t7 205621 205620 2022-07-21T10:27:19Z Kwawe 68789 wikitext text/x-wiki [[小学校・中学校・高等学校の学習]] > [[高等学校の学習]] >[[高等学校 生物基礎|生物基礎]] >[[高等学校 生物基礎/個体の成り立ちと多様性|個体の成り立ちと多様性]] 本節では、単細胞生物と多細胞生物の用語の意味と代表的な動物名を押さえましょう。 == 単細胞生物と多細胞生物 == [[w:アメーバ|アメーバ]]、[[w:ミドリムシ|ミドリムシ]]、[[w:ゾウリムシ|ゾウリムシ]]など、個体が単一の細胞からできている生物は'''単細胞生物'''(unicellular organism)と呼ばれます。 例えばゾウリムシは、一つの細胞で、繊毛を使って泳いだり、細胞口を使って食べたり、食胞を使って消化したりしています。 単細胞生物に対して、形や働きの異なる多くの細胞からなる生物は'''多細胞生物'''(multicellular organism)と呼ばれます。多細胞生物において、[[w:藻類|藻類]]や[[w:腔腸動物|腔腸動物]]は、[[w:種子植物|種子植物]]や[[w:脊椎動物|脊椎動物]]に比べると簡単な構造を持っています。 例えば[[w:ヒドラ|ヒドラ]]は、8種類約10万個の細胞からなる多細胞生物で、刺細胞で攻撃したり、腺細胞で消化液を分泌したり、消化細胞で消化を行ったりしています。 ef4qa7qs1jv3y9h6aotqssk1vuil7q8