浅野直樹の学習日記

この画面は、簡易表示です

未分類

『初めてのJavaScript(第3版 )』非公式練習問題解答例

『初めてのJavaScript(第3版 )』非公式練習問題 – 浅野直樹の学習日記で作った『初めてのJavaScript(第3版 )』非公式練習問題の解答例です。自分で学習しながら作ったものなので不備があるかもしれません。

 

2章

練習問題

ex02-08-1のjsファイルを次のように書き加えます。


$(document).ready(function() {
  'use strict';
  paper.install(window);
  paper.setup(document.getElementById('mainCanvas'));

  let tool = new Tool();

  tool.onMouseDown = function(event) {
    let c = Shape.Circle(event.point.x, event.point.y, 80);
    c.fillColor = 'blue';
    let text = new PointText(event.point.x, event.point.y);
    text.justification = 'center';
    text.fillColor = 'yellow';
    text.fontSize = 20;
    text.content = 'hello world';

  };
});

 

3章

練習問題1

次のようなjsファイルを作ります。


const date = new Date();
let message1 = "今日は" + date.getFullYear() + "年" + (date.getMonth()+1) + "月" + date.getDate() + "日です。\n"
date.setDate(date.getDate()+20);
let message2 = "20日後は" + date.getFullYear() + "年" + (date.getMonth()+1) + "月" + date.getDate() + "日です。\n"
console.log(message1, message2);

 

練習問題2

次のようなjsファイルを作ります。


const b4 = [
  { 名前: "ルビー", 硬度: 9 },
  { 名前: "ダイヤ", 硬度: 10 },
  { 名前: "トパーズ", 硬度: 8 },
];
b4[99] = { 名前: "象牙", 硬度: 2.5 };
let message = b4[b4.length - 1].名前 +"の硬度は" + b4[b4.length - 1].硬度 +"です。";
console.log(message);

 

4章

練習問題

次のように、challengeという変数を新たに作り、whileにとどまる条件を変えて、手持ち資金が0になれば再挑戦するようにします。


'use strict';
function rand(m, n) {
  return m + Math.floor((n - m + 1)*Math.random());
}

function randFace() {
  return ["crown", "anchor", "heart", "spade", "club", "diamond"]
  [rand(0, 5)];
}

let funds = 50;
let round = 0;
let challenge = 1;

while(funds < 100) { 
  round++;
  console.log(`第${round}ラウンド: `);
  console.log(`  手持ち資金: ${funds}`);
  let bets = { crown: 0, anchor: 0, heart: 0,
               spade: 0, club: 0, diamond: 0 };
  let totalBet = rand(1, funds);
  if(totalBet === 7) {
    totalBet = funds;
    bets.heart = totalBet;
  } else { 
    let remaining = totalBet;
    do {
      let bet = rand(1, remaining);
      let face = randFace();
      bets[face] = bets[face] + bet;
      remaining = remaining - bet;
    } while(remaining > 0)
  }
  funds = funds - totalBet;
  console.log(`  賭け金: ${totalBet}(` +
         Object.keys(bets).map(face => `${face}: ${bets[face]}`).join(', ') +
         ")");

  const hand = [];
  for(let roll = 0; roll < 3; roll++) {
    hand.push(randFace());
  }
  console.log(`  出目: ${hand.join(', ')}`);

  let winnings = 0;
  for(let die=0; die < hand.length; die++) { let face = hand[die]; if(bets[face] > 0) winnings = winnings + bets[face];
  }
  funds = funds + winnings;
  console.log(`  払戻金: ${winnings}`);
  if (funds <= 0) {
    funds = 50;
    round = 0;
    challenge++;
  }
}

console.log(`  残金: ${funds}`);

console.log(challenge + "回目の挑戦で意気揚々と船に戻りました。");

 

5章

練習問題

例えば以下のようにします。


const nums = [ 3, 5, 15, 7, 5 ];
let n, i=0, j=0;
while(i<nums.length && (n = nums[i++]) % 2 ) {
  console.log(`奇数を発見:${n}`);
  j++;
}
if (i !== j) {
  console.log(`偶数を発見:${n}`);
}
console.log(`未チェックの数字の個数:${nums.length-i}`);

 

6章

練習問題

例えば次のようなjsファイルを作ります。


const asano = { 名前: "浅野" };

function update(birthYear, occupation, address) {
   this.誕生年 = birthYear;
   this.職業 = occupation;
   this.居住地 = address;
}

console.log(asano);

update.call(asano, 1982, "塾講師", "京都府");
update.apply(asano, [1982, "塾講師", "京都府"]); // この行のapplyか上の行のcallのどちらか1つでよい。
console.log(asano);

const updateAsano1982 = update.bind(asano, 1982);
updateAsano1982("プログラマー", "東京都");
console.log(asano);

 

7章

練習問題

オブジェクトのプロパティを書き換えた場合にはスコープから外れても値が元に戻りません(6.3を参照)。


function update(birthYear, occupation, address) {
   this.誕生年 = birthYear;
   this.職業 = occupation;
   this.居住地 = address;
}

{ /* 外側のブロックの始まり */
  let asano = { 名前: "浅野", 誕生年: 1982, 職業: "塾講師", 居住地: "京都府"};
  console.log(asano); 
  { /* 内側のブロックの始まり */
    update.call(asano, 1982, "塾講師", "東京都");
    console.log(asano);
  } /* 内側のブロックの終わり */
  console.log(asano);
} /* 外側のブロックの終わり */
console.log(typeof asano);

 

8章

練習問題1

以下のようにします。


let arr = [{ name: "Suzanne" }, { name: "Jim" },
	     { name: "Trevor" }, { name: "Amanda" }];
arr.sort((a, b) => a.name > b.name);  // nameでソート
arr.sort((a, b) => a.name.length > b.name.length); //文字数でソート
console.log(arr);

 

練習問題2

以下のようにします。


function 記号表現に変換する(カード) {
  const マーク名_絵文字
	  = { 'ハート': '♡', 'クローバー': '♧', 'ダイア': '♢', 'スペード': '♤' };
  const 数字からAJQK = { 1: 'A', 11: 'J', 12: 'Q', 13: 'K' };
  for(let i=2; i<=10; i++) 数字からAJQK[i] = i;
  return マーク名_絵文字[カード.マーク]+数字からAJQK[カード.数字];
}


const カードの束 = [];
for(let マーク of ['ハート', 'クローバー', 'ダイア', 'スペード']) // 全カードを生成
   for(let 数字=1; 数字<=13; 数字++) カードの束.push({ マーク, 数字}); 

let 選択されたカード_記号表現 
    = カードの束.filter(カード => カード.マーク === 'スペード' && (カード.数字 >= 10 || カード.数字 === 1)).map(記号表現に変換する);
console.log(選択されたカード_記号表現);

練習問題3

次のようにします。


const words = ["Beachball", "Rodeo", "Angel",
	       "Aardvark", "Xylophone", "November", "Chocolate",
	       "Papaya", "Uniform", "Joker", "Clover", "Bali"];
const longWords = words.filter(word => word.length > 6);
let result = longWords.join(' ');
console.log(result);

const 単語リスト
	= ["ビーチボール", "ルービックキューブ", "ブタペスト", "トロッコ",
	   "コンゴ", "ゴースト", "トーラス", "スマート", "トンガ",
	   "ガラパゴス", "ストリート", "トーマス", "ストレッチ",
	   "チベット", "トキ", "キツツキ", "キリン"];
const 長い単語 = 単語リスト.filter(単語 => 単語.length >= 5);
let 結果 = 長い単語.join(' ');
console.log(結果);

 

9章

練習問題

例えば以下のようにします。


class Vehicle { 
  constructor() {
    this.passengers = [];
    console.log("Vehicleが生成された");
  }
  addPassenger(p) { 
    this.passengers.push(p);
    console.log(`${p}が${this.constructor.name}に乗り込み、今${this.passengers.length}人乗っています。`);
  }
}

class Car extends Vehicle { 
  constructor() {
    super();
    this.capacity = 5; 
    console.log("Carが生成された");
  }
  addPassenger(p) {
    Vehicle.prototype.addPassenger.call(this, p);
    if (this.capacity - this.passengers.length < 0) {
      console.log('定員オーバーです');
      return;
    }
    console.log(`あと${this.capacity - this.passengers.length}人です`);
  }
}

const v = new Vehicle();
v.addPassenger("太郎");
v.addPassenger("花子");

const c = new Car();
c.addPassenger("景子");
c.addPassenger("ミドリ");
c.addPassenger("一郎");
c.addPassenger("二郎");
c.addPassenger("三郎");
c.addPassenger("四郎");
c.addPassenger("五郎");

 

10章

練習問題

次のようにします。


const u1 = { name: '和洋' };
const u2 = { name: '花子' };
const u3 = { name: '涼子' };
const u4 = { name: '哲人' };

const userRoles = new Map();

const rolesU1 = new Set();
rolesU1.add("ユーザー");
userRoles.set(u1, rolesU1);

const rolesU2 = new Set();
rolesU2.add("管理者");
userRoles.set(u2, rolesU2);

const rolesU3 = new Set();
rolesU3.add("ユーザー");
rolesU3.add("管理者");
userRoles.set(u3, rolesU3);

const rolesU4 = new Set();
userRoles.set(u4, rolesU4);

for (let [u, r] of userRoles.entries()) {
  let allRoles = [];
  for (let value of r.values()) {
    allRoles.push(value);
  }
  console.log(`${u.name}: ${allRoles}`);
}

11章

練習問題

次のようにします。


const email = "jane@doe.com;

function validateEmail(email) {
  return email.match(/@/) ? 
    email :
    new Error(`無効なメールアドレスです:${email}`);
}

try {
  const validatedEmail = validateEmail(email);
  console.log(validatedEmail);
  if(validatedEmail instanceof Error) {
    console.error(validatedEmail.message);
  } else {
   console.log(`正しい形式のアドレス:${validatedEmail}`);
  }
} catch(err) {
  console.error(`エラー:${err.message}`);
} finally {
  console.log("この行はいつも実行される");
}

 

12章

練習問題

次のようにします。


function* interrogate() { 
  const name = yield "お名前は?";
  if (!name) {
    return "お名前がないので終了します。";
  }
  const color = yield "お好きな色は何ですか?";
  return `${name}さんの好きな色は${color}だそうですよ。`;
}
const it = interrogate();
console.log(it.next());
console.log(it.next('')); 
console.log(it.next('緑'));
console.log(it.next()); 

 

13章

練習問題1

これは色がとばされます。


setInterval(function() { 
   document.querySelector('.rainbow')
      .style['background-color'] = getNextRainbowColor();
}, 500); 

setInterval(function() { 
   getNextRainbowColor();
}, 800); 

const getNextRainbowColor = (function() {
  const colors = ['red', 'orange', 'yellow', 'green', 'blue', 'indigo', 'violet'];
  let colorIndex = -1;
  return function() {
    if(++colorIndex >= colors.length) colorIndex = 0;
    return colors[colorIndex];
  };
})();

 

これは色がとばされません。


const rainbowIterator = getRainbowIterator();
setInterval(function() {
  document.querySelector('.rainbow')
    .style['background-color'] = rainbowIterator.next().value;
}, 500);

setInterval(function() {
  getRainbowIterator();
}, 800);

function getRainbowIterator() {
  const colors = ['red', 'orange', 'yellow', 'green', 'blue', 'indigo', 'violet'];
  let colorIndex = -1;
  return {
    next() {
      if(++colorIndex >= colors.length) colorIndex = 0;
      console.log("in iterator: "+colors[colorIndex])
      return { value: colors[colorIndex], done: false };
    }
  };
}

 

練習問題2

例えば次のようにします。


function fibonacci(m, n) {
  console.log(n);
  if (n > 10000) {
    return;
  }
  o = n;
  p = m + n;
  fibonacci(o, p);
}

fibonacci(1, 1);

 

13章

練習問題

例えば次のようにします。


function countdown(seconds) {
  const timeoutIds = [];
  for(let i=seconds; i>=0; i--) {
    timeoutIds.push(setTimeout(function() {
      if(i===13) {
        timeoutIds.forEach(clearTimeout);
	  const err = new Error(`${i}という数は不吉過ぎます`);
        console.error(err);
        return;
      }
     if(i>0) console.log(i + '...');
     else {
      console.log("GO!");
      launch(10000);
      }
     }, (seconds-i)*1000))
   }
}

function launch(period) {
  const timeoutId = setTimeout(function() {
    const err = new Error('時間切れです。');
    console.error(err);
  }, 4000);
  if(Math.random() < 0.5)
  return;
  console.log("発射!");
  setTimeout(function() {
    console.log("周回軌道に乗った!");
    clearTimeout(timeoutId);
  }, 2*1000); 
}

countdown(3);

15章

練習問題

moment.jsを使って次のようにします。


const d = moment.tz([2018, 1, 21, 15, 00], 'Europe/London');
console.log(d.format("YYYY年M月D日HH:mm") + "にロンドンを出発しました。")
d.add(13, 'hours');
d.tz('Asia/Tokyo');
console.log(d.format("YYYY年M月D日HH:mm") + "に東京に到着しました。")

16章

練習問題

次のようにします。配列は0からスタートすることに注意してください。htmlファイルで<script src="https://cdnjs.cloudflare.com/ajax/libs/numeral.js/2.0.6/numeral.min.js"></script>としてNumeral.jsを読み込んでください。


const revenues = [{"北海道":2434886692}, {"青森県":694217643}, {"岩手県":1129941686}, {"宮城県":1383490525}, {"秋田県":605089076}, {"山形県":580851300}, {"福島県":2096640231}, {"茨城県":1087054495}, {"栃木県":763338596}, {"群馬県":736096433}, {"埼玉県":1722075796}, {"千葉県":1659525591}, {"東京都":7122485322}, {"神奈川県":2032743502}, {"新潟県":1055947285}, {"富山県":508721490}, {"石川県":567888708}, {"福井県":450596001}, {"山梨県":465327187}, {"長野県":819099327}, {"岐阜県":773302893}, {"静岡県":1152621919}, {"愛知県":2263393575}, {"三重県":700154974}, {"滋賀県":509495460}, {"京都府":899170238}, {"大阪府":2776964207}, {"兵庫県":1962884485}, {"奈良県":493578569}, {"和歌山県":541231559}, {"鳥取県":358191520}, {"島根県":505631628}, {"岡山県":685819845}, {"広島県":923347710}, {"山口県":640430917}, {"徳島県":478647031}, {"香川県":448601297}, {"愛媛県":622066841}, {"高知県":453349565}, {"福岡県":1693270092}, {"佐賀県":435430115}, {"長崎県":695693042}, {"熊本県":1018938275}, {"大分県":572602476}, {"宮崎県":565437227}, {"鹿児島県":789070662}, {"沖縄県":747747470}]

let rand = 1 + Math.floor(47*Math.random());
for (key in revenues[rand-1]) {
  console.log(`2016年の${key}の歳入は${numeral(revenues[rand-1][key]).format('0,0')}円です。`);
}

 

17章

練習問題

次のようにします。


const text = "Visit oreilly.com today!";
const link = text.replace(/([a-z0-9]+(?:\.com|\.org|\.edu))/ig, '<a href="$1">$1</a>');
console.log(link);

 

18章

練習問題

例えば次のようにします。


document.querySelector('button').addEventListener('click', ChangeAndAddText);
function ChangeAndAddText(evt) {
  evt.preventDefault();
  const text1 = document.getElementById("text1").value;
  const originalp = document.querySelector('p');
  originalp.textContent = text1;
  originalp.classList.add('red');  
  const text2 = document.getElementById("text2").value;
  const p = document.createElement('p'); 
  p.textContent = text2;
  document.querySelector('body').appendChild(p);
}

 

19章

練習問題

例えば次のようにします。


$(function() {
$('button').click(ChangeAndAddText);
function ChangeAndAddText(evt) {
  evt.preventDefault();
  const text1 = $('#text1').val();
  $('p').eq(0).text(text1).addClass('red');
  const text2 = $('#text2').val();
  const p = $('

‘); p.text(text2); $(‘body’).append(p); } })

20章

練習問題

例えば次のようにします。


const fs = require('fs');
const path = require('path');

fs.readFile(path.join(__dirname, 'hello.txt'),
	    { encoding: 'utf8' }, function(err, data) {
  if(err) return console.error('エラー:ファイルから読み込めません。');
  message = data.replace(/Node/g, 'Node.js');
  fs.writeFile(path.join(__dirname, 'hello2.txt'),
            message + '文字列を置換しました。',  function(err) {
    if(err) return console.log('エラー:ファイルに書き込めません。');
  });
});

 

21章

練習問題

例えば次のようにします。


const COLOR = Symbol();
class Triangle {  
  constructor(a, b, c) {
    this.a = a;
    this.b = b;
    this.c = c;
  }
  get perimeter() {
    return this.a + this.b + this.c;
  }
  get area() {
    const a = this.a;
    const b = this.b;
    const c = this.c;
    return Math.sqrt((a+b+c)*(-a+b+c)*(a-b+c)*(a+b-c))/4;
  }
  set color(value) {
    this[COLOR] = value;
  }
  get color() {
    return this[COLOR];
  }
}
const t = new Triangle(3, 4, 5);
t.color = 'red';
console.log(`外周の長さ: ${t.perimeter}`);
console.log(`面積: ${t.area}`);
console.log(`色: ${t.color}`);

 

 

 

 



『初めてのJavaScript(第3版 )』非公式練習問題

『初めてのJavaScript(第3版 )』でJavaScriptを学習しています。

 


初めてのJavaScript 第3版 ―ES2015以降の最新ウェブ開発


作 者: Ethan Brown

出版社: オライリージャパン

発売日: 2017-01-20

 

ただ読むだけだと理解が曖昧なままに通り過ぎてしまいそうだったので、練習問題を勝手に作って自分で解きながら学習しました。せっかくなので公開して共有します。

 

本書に収録されている例題のほうは初めてのJavaScript 第3版 —— ES2015以降の最新ウェブ開発 — 例題のダウンロードと実行 — マーリンアームズ株式会社からダウンロードすることができます。

 

2章

練習問題

ユーザーがクリックすると、半径が80で色が青の円の中に”hello world”と黄色の文字が書かれた図形が表示されるようにしてください。

 

3章

練習問題1

「今日の日付は2018年7月19日です。
20日後の日付は2018年8月8日です。」

のように今日の日付を表示して、次の行に20日後の日付がコンソールに表示されるようにしてください(月をまたいでも正しく表示されるでしょうか)。

 

練習問題2

ex03-13-2のb4の配列の100番目に硬度が2.5の象牙を付け加えてください。そしてその配列にアクセスして、コンソールに「象牙の硬度は2.5です」表示してください。

 

4章

練習問題

ex04-01-1を改造して、意気揚々と船に戻ることになるまで繰り返すようにしてください。余裕があれば4.2.9 switch文で紹介されているような縁起担ぎも組み込んでみてください。

 

5章

練習問題

ex05-13-1を改造して、最初の偶数を発見するまで配列内の数字をチェックするようにしてください。配列として[ 3, 5, 15, 7, 5]を与えると以下のように表示されます。与える配列を適当に変えて正しく動作するか確かめてください。

奇数を発見:3
奇数を発見:5
奇数を発見:15
奇数を発見:7
奇数を発見:5
未チェックの数字の個数:0

 

6章

練習問題

ex06-08のシリーズを参考にして、生年、職業、居住地をアップデートする関数を作成し、その関数を用いて(callとapplyの両方で)あなた自身についての情報をアップデートしてください。次に、bindで生年を固定してアップデートしてください。

 

7章

練習問題

最初にあなたの名前、生年、職業、居住地をオブジェクトで作成してください。それからex07-05-2のように二重のスコープを作り、内側のスコープで6章の練習問題で作った関数を使い居住地をアップデートしてください。内側のスコープから外れると値が元に戻っているでしょうか。

 

8章

練習問題1

ex08-02-9を改造して、文字数の少ない順(文字数が同じ場合はアルファベット順)にソートしてください。

 

練習問題2

ex08-04-4を改造して、スペードのロイヤルストレートフラッシュ(スペードの10, 11, 12, 13, A)を作ってください。

 

練習問題3

ex08-05-5をfilterとjoinを使って書き換えてみてください。

 

9章

練習問題

例えば車の定員を5人にして、ex09-02-8に定員オーバーでエラーになる部分を付け加えてください。新しい人が乗るたびに現在乗っている人数や、あと何人乗れるかが表示されるとなおよいです。

 

10章

練習問題

本章の例題ファイルを活用して、ユーザー1の和洋は「ユーザー」、ユーザー2の花子は「管理者」、ユーザー3の涼子は「ユーザー、管理者」、ユーザー4の哲人は役割なしになるように設定してください。

 

11章

練習問題

本章の例題ファイルを組み合わせて、メールアドレスを検証し、エラーが発生してもしなくても「この行はいつも実行される」と表示してください。

 

12章

練習問題

ex12-02-2を改造して、名前を聞かれた際に空白を入れると好きな色を聞かれる前に終了するようにしてください。

 

13章

練習問題1

ex13-03-4でインターバルの秒数が異なる2つの関数の中でgetNextRainbowColor関数を呼び出して、色の順番がとばされることを確認してください。ex13-03-5で同じようにしても色の順番がとばされないことを確認してください。

 

練習問題2

再帰関数を使ってフィボナッチ数列を求めてください。10000を超えたら終了するようにしてください。

 

14章

練習問題

ロケット発射プログラムの完成版(ex14-03-8)を、プロミスを使わずに実装してみてください。

 

15章

練習問題

2018年2月21日15:00にロンドンを出発した飛行機が、13時間かかって東京に到着しました。東京の現地時刻では何月何日の何時に到着したかを表示してください(正解は2月22日13;00です)。

 

16章

練習問題

以下に示す2016年の都道府県別歳入総額のデータを用いて、1〜47の疑似乱数を発生させ、その数字に該当する都道府県と歳入総額を表示してください(1.北海道、2.青森県、…、46.鹿児島県、47.沖縄県)。Numeral.jsを使ってカンマを入れるとより親切です。


const revenues = [{"北海道":2434886692}, {"青森県":694217643}, {"岩手県":1129941686}, {"宮城県":1383490525}, {"秋田県":605089076}, {"山形県":580851300}, {"福島県":2096640231}, {"茨城県":1087054495}, {"栃木県":763338596}, {"群馬県":736096433}, {"埼玉県":1722075796}, {"千葉県":1659525591}, {"東京都":7122485322}, {"神奈川県":2032743502}, {"新潟県":1055947285}, {"富山県":508721490}, {"石川県":567888708}, {"福井県":450596001}, {"山梨県":465327187}, {"長野県":819099327}, {"岐阜県":773302893}, {"静岡県":1152621919}, {"愛知県":2263393575}, {"三重県":700154974}, {"滋賀県":509495460}, {"京都府":899170238}, {"大阪府":2776964207}, {"兵庫県":1962884485}, {"奈良県":493578569}, {"和歌山県":541231559}, {"鳥取県":358191520}, {"島根県":505631628}, {"岡山県":685819845}, {"広島県":923347710}, {"山口県":640430917}, {"徳島県":478647031}, {"香川県":448601297}, {"愛媛県":622066841}, {"高知県":453349565}, {"福岡県":1693270092}, {"佐賀県":435430115}, {"長崎県":695693042}, {"熊本県":1018938275}, {"大分県":572602476}, {"宮崎県":565437227}, {"鹿児島県":789070662}, {"沖縄県":747747470}]

 

17章

練習問題

ex17-12-1のlist1を改造して、マッチしたURLにそのURLへのリンクを貼るhtmlタグをつけるようにしてください。「oreilly.com」を「<a href=”oreilly.com”>oreilly.com</a>」にするということです。

 

18章

練習問題

段落が1つ、1行テキストボックスが2つ、buttonが1つある以下のようなhtmlファイルを作ってください。ボタンをクリックすると、1つ目の1行テキストボックスに入力された内容で既存の段落を書き替えて赤い文字で表示し、2つ目の1行テキストボックスに入力された内容を新しい段落でボタンの下に追記するようにしてください。


<html>
<head>
<meta charset="utf-8">
<title>ex18</title>
<link rel="stylesheet" href="ex18.css">
</head>
<body>
<p>(既存の段落)テキストエリアに文字を入力してボタンをクリックすると、ボタンの下に新しい段落が付け加えられ、この段落の内容が書き替えられます。</p>
<form>
<p>ここに書いた内容で上の既存の段落が書き替えられます。</p>
<input type="text" id="text1">
<p>ここに書いた内容がボタンの下に付け加えられます。</p>
<input type="text" id="text2">
<br />
<br />
<button>文字を入力してからこのボタンを押してください</button>
</form>
<script src="ex18.js"></script>
</body>
</html>

 

ex18.css

.red {
color: red;
}

 

19章

練習問題

18章の練習問題と同じ内容をjqueryを使って実現してください。

 

20章

練習問題

ex20-05-1で作成された「hello.txt」を読み込んで、文字列の「Node」を「Node.js」に置換し、「文字列を置換しました。」と書き加えて、「hello2.txt」という名前のファイルに出力してください。

 

21章

練習問題

ex21-01-3などを参考にして、3辺の長さを渡して三角形のオブジェクトを作り、色のセット、色と外周と面積のゲットをできるようにしてください。なお、三角形の面積は、ヘロンの公式より、3辺の長さをa, b, cとすると、$\frac{\sqrt{(a+b+c)(-a+b+c)(a-b+c)(a+b-c)}}{4}$で求めることができます。

 



平成30(2018)年司法試験予備試験論文再現答案民事訴訟法

以下民事訴訟法についてはその条数のみを示す。

[設問1]
第1 通常共同訴訟(38条)
 Y及びZに対する請求は、どちらも特定の日時に特定物である本件絵画の売買契約に基づく残代金の請求であり、実際に行為した自然人も共通している。よって、訴訟の目的である義務が数人について共通であるので、その数人は共同訴訟人として訴えられることができる。

第2 同時審判(41条)
 Y及びZに対する請求は、一方が成立すれば他方が成立しないので、法律上併存し得ない関係にある。よって、原告Xが申出があれば、弁論及び裁判は、分離しないでしなければならない(41条1項)。法律上併存し得ないということを詳しく説明すると、本件売買契約がYを本人として成立するか、Yを代理人Zを本人として成立するかのどちらか一つであるということである。

第3 それぞれの手段の比較
 Xとしては、両負けを防ぐために、同時審判の申出をすべきである。

[設問2]
第1 訴訟告知の効力
 訴訟告知を受けた者が参加しなかった場合においても、補助参加をすることができた時に参加したものとみなされ(53条4項)、いわゆる参加的効力が発生する。参加的効力(46条1項)は、敗訴責任の分担という趣旨から、既判力(114条)とは異なり、判決の理由にも及ぶ。本件において、仮にZがXに補助参加をして、Yを被告とする訴訟で買主がZであるという理由で請求が棄却されたとしたら、後訴においてZは買主が自分ではないと主張することはできない。つまり、Xは、後訴で、Yを被告とする訴訟の判決の効力を用いることが可能である。

第2 訴訟告知の効力がZに及ぶかどうか
 しかしそれではZにとってあまりにも酷である。というのも、例えば錯誤(民法95条)などの理由でYにとってもZにとっても売買契約がそもそも無効だと主張する場合には、ZはXではなくむしろYに補助参加するだろう。本件に即しても、ZはYが代表取締役を務める株式会社であり、Xに補助参加することは期待できない。このように、補助参加することが期待できない場合は、「参加することができた時」には当たらないと解すべきである。以上より、Xは、後訴で、Yを被告とする訴訟の判決の効力を用いることは不可能である。

[設問3]
 裁判所は口頭弁論の分離を命じることができる(152条1項)が、民事訴訟が公正かつ迅速に行われるように努めなければならない(2条)。
 公正ということに関しては、実体法上Yへの請求とZへの請求はどちらか一方だけが成立するのだから、弁論を分離することで、そのどちらも認められない、あるいは両方とも認められるというのは不公正である。こうしたことを防ぐために同時審判の制度が設けられたのである。[設問1]で記述したように、訴え提起前にYが売買契約成立を否認する理由がわかっていたら同時審判の申出をしていたのだから、弁論を分離すべきではない。
 迅速ということに関しても、Yへの請求とZへの請求で証拠が共通であり、関係する自然人も共通であるため、弁論を併合したままであっても訴訟が複雑になって遅延するおそれはない。かえって弁論を分離したほうが、Yの予定の都合なので、遅延していまいかねない。よって迅速な裁判という観点からも、弁論を分離すべきではない。

以上

 

 



平成30(2018)年司法試験予備試験論文再現答案商法(会社法)

以下会社法についてはその条数のみを示す。

[設問1]
 株主Dからの問題文4の請求の根拠は、303条1項の株主提案権である。そこでDがその要件を満たすかどうかを検討する。
 甲社は取締役会設置会社である。よって、株主提案権は、総株主の議決権の100分の1以上の議決権又は300個以上の議決権を6か月前から引き続き有する株主に限られる。甲社は100株で1単元なので、300個だと30000株になるので、Dはその要件は満たさない。「個」と「単元」は同じ意味である。Dは平成24年から甲社株式を有していたので、期間要件は満たしている。
 総株主の議決権の数を計算するためには、平成29年6月1日に発行され、丙社が有している20万株がそこに含まれるかを考えなければならない。結論から言うと、甲社の基準日は毎年3月31日と定められているので、本件株主総会に関しては、丙社が有している20万株は含まれない。基準日が定められるのは、画一的に取り扱って、議決権について明確で一律に決めることができるようにするためである。しかも、本件のように平成29年4月10日の時点ではDの上記4の請求が株主提案権の要件を満たしていたのに、同年6月1日に株式が発行されると満たさなくなるというのでは、不安定になってしまう。
 改めてDの持株要件を検討すると、総株主の議決権は1万個(100万株)なので、その100分の1は100個(10000株)になる。Dが有している議決権は100個(10000株)なので、持株要件を満たす。
 以上より、Dは、本件株主総会に上記4の議題を提案することができる。「議題」とは「一定の事項」のことであり、「議案」とは、「株主総会の目的である事項につき議案」のことである。
 Dは、上記4の請求を平成29年4月10日に行っており、本件株主総会は同年6月29日開催なので、8週間前に請求をするという要件も満たしている。
 そして、以上と同じ要件を満たせば、議案の要領を株主に通知すること(株主総会招集通知に記載すること)を請求することができる(305条1項)。
 以上より、株主Dから上記4の請求を受けた甲社が本件株主総会の招集通知に上記4の議題及び議案の要領を記載しなかったことは、不当である。

[設問2]
第1 Bの甲社に対する会社法上の損害賠償責任の有無
 本件賃貸借契約が利益相反取引(356条1項2号)に該当するかどうかを検討する。
 「のために」というのは「の名義で」と解せないわけではないが、利益相反取引の実質を考慮して、「の計算で」と解すべきである。丁社はBが全部の持分を有しているので、その利益はBに帰属する。よって、甲社の取締役Bは、自己のために、株式会社甲と取引をしているので、利益相反取引に該当する。
 そして、その取引により、甲社には相場と実際の価格の差である150万円×12か月=1800万円の損害が発生している。用地を確保する必要があり、適当な土地を見付けることができない状況にあったとしても、相場を基準として考えるべきである。以上より、Bは、1800万円の損害賠償責任を負う(423条3項1号、423条1項)。この責任は、任務を怠ったことが当該取締役又は執行役の責めに帰することができない事由によるものであることをもって免れることができない(428条1項)。

第2 Bが負う損害賠償の責任額
 Bは甲社と責任限定契約を締結しているので、その責任額が1200万円に限られるようにも思われる(425条1項1号ハ、426条1項、427条1項)。Bは甲社の社外取締役だからである。しかし、425条から427条は、本件の責任には適用されないので(428条2項)、Bは1800万円全額の責任を負う。

以上



平成30(2018)年司法試験予備試験論文再現答案民法

以下民法についてはその条数のみを示す。

[設問1]
第1 ①の請求根拠
 AはCと雇用関係にある。雇用なのか請負なのかは契約の名称にとらわれず、被雇用者が雇用者の指揮監とく下にあるかどうかで判断する。雇用(623条)の本質は命を受けて労働に従事することにあり、請負(632条)の本質は方法は自由であってもよく仕事の完成にあるからである。本件において、Cは、Aに対し、重機や器具等を提供し、作業の場所、内容及び具体的方法について指示を与えていたので、AはCの指揮監とく下にあり、雇用だと言える。
 雇用契約には、付随義務として、雇用者が被雇用者の安全に配慮する義務が認められる。その安全配慮義務は、本件で具体的に言うと、このような事故を防ぐための命綱や安全ネットを用意したりすることである。Cはその義務を果たしていなかった。そのせいでAに損害が生じたので、債務不履行(415条)により、Cは、Aに生じた損害を賠償する責任を負う。
 損害賠償の範囲は、通常損害(416条1項)と予見可能な特別損害(416条2項)である。これは債権なので、消滅時効は10年である(167条1項)。消滅時効の起算点は、平成26年2月1日である。

第2 ②の請求根拠
 BにはAの撤去作業が終了しないうちに、本件家屋の1階壁面を重機で破壊し始めたという過失がある。Aの身体は法律上保護される利益である。Bの過失とAの損害との間には、社会通念上相当な因果関係がある。よって、Bは、Aに対し、その損害を賠償する責任を負う。
 先述したように、BとCは雇用関係にある。仮にそれが認められなくても、少なくとも、Cは使用者に代わって事業を監督する者である。先に述べたBの過失によるAの損害は、本件家屋の解体という事業の執行についてのものだといえる。「事業の執行につき」とは外形的に事業の執行であればよく、本件では問題なく認められるからである。以上より、Cは、使用者責任により、Aの損害を賠償する責任を負う(715条1項、2項)。Cは、命綱や安全ネットを用意するなどしていればAの損害を防ぐことができたと考えられるので、同条但書には該当しない。
 不法行為の賠償範囲は、416条が類推適用されると解されている。消滅時効は、被害者又はその法定代理人が損害及び加害者を知った時から3年である(724条)。

第3 Aにとっての有利・不利
 平成26年2月1日から3年後の平成29年5月1日が経過しているので、消滅時効の観点からは、被害者であるAが損害及び加害者を知った時は平成26年2月1日ではなく同年10月1日だと主張できないことはないかもしれないが、①の請求のほうが有利である。また、立証責任の観点からも、②の請求ではBの過失を立証しなければならないので、やはり①の請求のほうが有利である。

[設問2]
第1 ㋐について
 夫婦は、その協議で、離婚をすることができる(736条)。離婚に関して本件と関係するような要件は他に存在しない。そして協議離婚の際には、財産分与を請求することができる(768条1項)。夫婦には同居義務があるが(752条)、逆に夫婦でない者たちが同居してはいけないという決まりはない。このように、身分行為は当事者の意思を最大限尊重すべきなので、離婚は認められる。

第2 ㋑について
 財産分与は、身分行為であると同時に、財産行為でもある。よって、一定の場合には詐害行為取消権(424条1項、2項)の対象となる。その一定の場合というのは、財産分与に仮託して、不相応な財産を分与する場合である。本件土地は婚姻前からのCの特有財産であった。本件建物は婚姻後にCとFとの協力の下に建築したものである。特段の事情のない限り、夫婦の寄与は半々であると解すべきである。財産分与は離婚後の生活保障という意味合いもあるが、本件では離婚前後を通じて生活状況は変わっていないので、それを考慮する必要はない。
 債務者Cは、債権者Aを害することを知って、本件財産分与をした。転得者FもAを害することを知っていた。以上より、Aは、Cが行った財産分与を、本件土地の全部と本件建物の半分の範囲で、取り消すことを裁判所に請求することができる。

以上

 




top