「引数」を含む日記 RSS

はてなキーワード: 引数とは

2018-12-06

anond:20181206180248

そういう関数がある、ということだけ覚えておく

関数名や引数は毎回ググる

2018-11-10

増田プログラマー養成講座 その20 SQLデータの削除

前回は、SQLデータ更新をやりました。

今回は、SQLデータの削除をやりましょう。

 

メッセージの削除

基本は、同じなので前回やった更新処理をちょっと変えれば削除もすぐできます

 

投稿されたメッセージを削除する機能を、Webページに付けてみよう。

 

削除ページにジャンプするリンク

前々回作ったメッセージの一覧の中に、削除ページにジャンプするリンクも入れておいた。

<td><a href="welcome/delete/<?php echo $item['id']; ?>">削除</a></td>

という1行が削除ページにジャンプするためのリンクになる。

ブラウザーHTMLソースを見ると、ここが以下のようなHTMLに書き換わってる。

<td><a href="welcome/delete/2">削除</a></td>

これは「メッセージID番号が2のメッセージ」を削除対象にして、削除ページにジャンプする。

 

Controllerの改造

ユーザーが「http://localhost/waf/welcome/delete/2」というURLで、削除ページにアクセスしたら、コントローラーで「2」を受け取って使いたい。

CodeIgniterでは、URL文字列を解析して、使うことができる。

以下のようにコントローラーを改造してみよう。

 

// 削除画面

public function delete($id = '')

{

 echo "ID=".$id;

 $this->load->view('chat_delete');

}

 

Controllerの改造の解説

delete()メソッド引数で、URL中の「2」の部分を受け取れる。

これは前回の編集ページ(更新の処理)と同じ。

「$id = $this->uri->segment(3);」でも受け取れる。

 

Viewの改造

削除ページでは、確認する質問を入れてみよう。

ユーザーに「本当に削除しますか?」みたいな注意喚起をしておきたい。

 

ファイルの内容を以下のように編集する。

<?php defined('BASEPATH') or exit('No direct script access allowed');?>

<!DOCTYPE html>

<html>

 <head>

  <meta charset="utf-8">

  <title>増田チャット</title>

  <base href="<?php echo base_url(); ?>">

 </head>

 <body>

  <h1>増田チャット</h1>

  <h2>削除</h2>

  <p>以下のメッセージを削除しますか?</p>

  <form action="welcome/delete" method="post" accept-charset="utf-8">

   <?php if (isset($talk)): ?>

   <p style="background-color:lightpink"><?php echo $talk['message']; ?></p>

   <input type="hidden" name="id" value="<?php echo $talk['id']; ?>">

   <input type="hidden" name="action" value="delete">

   <?php else: ?>

   <p>※該当するメッセージがありません。(または削除済です。)</p>

   <?php endif;?>

   <button>削除する</button>

  </form>

  <p><a href="welcome/index">戻る</a></p>

 </body>

</html>

 

Viewの改造の解説

<p style="background-color:lightpink"><?php echo $talk['message']; ?></p>

削除するメッセージを色付きで強調して、ユーザー確認してもらう。

 

<input type="hidden" name="id" value="<?php echo $talk['id']; ?>">

コントローラー削除対象メッセージID番号を送るため、inputタグの「type="hidden"」でメッセージID番号を仕込んでおく。

 

Controllerの改造

ファイルの内容を以下のように編集する。

// 削除画面

public function delete($id = '')

{

 $id = $id ? $id : $this->input->post('id');

 $action = $this->input->post('action');

 if ($action == 'delete') {

  $this->chat_model->delete_message($id);

 }

 $data['talk'] = $this->chat_model->read_message_by_id($id);

 $this->load->view('chat_delete', $data);

}

 

Controllerの改造の解説

やってることは、前回のデータ更新場合とほぼ同じ。

$this->chat_model->delete_message($id);

で、モデルに用意したデータ削除用メソッドを呼び出しているだけ。

次は、モデルdelete_message()メソッドを用意しよう。

 

Modelの改造

ファイルの内容を以下のように編集する。

// Delete

public function delete_message($id = 0)

{

 $sql = "DELETE FROM talk WHERE id = ?";

 $param = array($id);

 $this->db->query($sql, $param);

 return $this->db->affected_rows();

}

 

Modelの改造の解説

SQLの「DELETE」を使えば、指定したレコード(1件分のデータ)を削除できる。

DELETE FROM talk WHERE id = ?」で、talkテーブルmessageid指定して削除している。

 

データを削除した後の挙動は、メッセージID番号がなくなるので、削除ページに表示できるメッセージデータがなくなる。

(例)id=2のデータを削除したら、SQLで「SELECT * FROM talk WHERE id = 2」を取得しても、空のデータデータがない状態

その場合は、

<p>※該当するメッセージがありません。(または削除済です。)</p>

と表示させてる。

 

まとめ

以上で、SQLの「DELETE」を使ったデータの削除ができた。

長々と説明したが、今回の大事な点は、SQLの「DELETE」の使い方だ。

 

以上で、MVCフレームワークを使ったOOPの使い方とSQLの使い方を見てきた。

SQLSQLだけで説明したほうが良かったね!MVCフレームワーク説明SQL説明が混在すると要点が分かりづらくなる?)

ちょっと失敗だったかも。m(__)m)

 

次回は、データベースの設計について学んでみよう。

 


anond:20181015215004 未経験からプログラマーなんだが全然からない

anond:20181016015826 増田プログラマー養成講座 その1 パソコンの用意

anond:20181016164341 増田プログラマー養成講座 その2 プログラムデータ+処理、プログラム言語の種類

anond:20181016180059 増田プログラマー養成講座 その3 構造プログラミングの基本(順次、反復、分岐

anond:20181016193144 増田プログラマー養成講座 その4 子ども向け教材「Scratch」で構造プログラミング練習

anond:20181017161003 増田プログラマー養成講座 その5 オブジェクトとは何か?

anond:20181017191404 増田プログラマー養成講座 その6 OOPの種類、PHPの準備

anond:20181019181549 増田プログラマー養成講座 その7 OOPの仕組み(前半)

anond:20181020230044 増田プログラマー養成講座 その8 OOPの仕組み(後半)

anond:20181022232327 増田プログラマー養成講座 その9 MVCフレームワークを使ってみよう

anond:20181023184616 増田プログラマー養成講座 その10 OOP参考書

anond:20181024214133 増田プログラマー養成講座 その11 データベースを使ってみよう

anond:20181026145516 増田プログラマー養成講座 その12 データベースの参考書

anond:20181028152656 増田プログラマー養成講座 その13 SQL文法

anond:20181031014212 増田プログラマー養成講座 その14 Webアプリの試作品作成

anond:20181101225335 増田プログラマー養成講座 その15 Webアプリの完成見本

anond:20181101230220 増田プログラマー養成講座 その16 Webアプリの完成見本(続き)

anond:20181104161900 増田プログラマー養成講座 その17 Webアプリの骨組み

anond:20181104233013 増田プログラマー養成講座 その18 SQLデータの追加と取得

anond:20181110120715 増田プログラマー養成講座 その19 SQLデータ更新

anond:20181110182445 増田プログラマー養成講座 その20 SQLデータの削除 ←★今ここ★

anond:20181111205255 増田プログラマー養成講座 その21 データベース設計 (1)要件定義

anond:20181024214737 増田プログラマー養成講座 コンテンツ一覧

増田プログラマー養成講座 その19 SQLデータ更新

前回は、Webアプリの骨組み(スケルトン)に、SQLデータの追加と取得をやりました。

今回は、SQLデータ更新をやりましょう。

 

メッセージ更新

 

編集ページにジャンプするリンク

前回作ったメッセージ一覧に、[編集]のリンクも入れておいた。

<td><a href="welcome/update/<?php echo $item['id']; ?>">編集</a></td>

という1行の部分。

[編集]をクリックすると、編集用ページにジャンプする。

ブラウザーHTMLソースを見ると、以下のようなHTMLになってるはず。

<td><a href="welcome/update/2">編集</a></td>

これは「メッセージID番号が2」を対象にして、編集ページにジャンプすることを意味する。

 

Controllerの改造

編集用ページのコントローラーを作ろう。

「http://localhost/waf/welcome/update/2」というURL編集ページにアクセスしたら、メッセージID番号の「2」を受け取れるようにしたい。

URL文字列を処理して「2」を取り出せるようにしよう。

 

// 更新画面

public function update($id = '')

{

 echo "ID=".$id;

 $this->load->view('chat_update');

}

 

CodeIgniterでは、URLから文字列を取り出す方法がいくつか用意されている。

  1. 「update($id = '')」のようにメソッド引数「$id」を用意すれば、「2」の部分を取り出せる。
  2. 引数を使う以外の方法も用意されていて、「$id = $this->uri->segment(3);」のように書けば、「2」の部分を取り出せる。

// 更新画面

public function update()

{

 $id = $this->uri->segment(3);

 echo "<hr> ID=".$id;

 $this->load->view('chat_update');

}

 

Controllerの改造の解説

CodeIgniterで、URL文字列から特定部分の文字列を取り出す方法を見ておこう。

 

例えば、「http://localhost/waf/welcome/update/aaa/bbb/ccc」というURLアクセスしたときCodeIgniterではURL中の「aaa」「bbb」「ccc」という部分は、以下のようにして取り出せる。

$seg1 = $this->uri->segment(1); // → 1番目のURL文字列:「welcome」=コントローラークラス

$seg2 = $this->uri->segment(2); // → 2番目のURL文字列:「update」=クラスの中のメソッド

$seg3 = $this->uri->segment(3); // → 3番目のURL文字列:「aaa」の部分

$seg4 = $this->uri->segment(4); // → 4番目のURL文字列:「bbb」の部分

$seg5 = $this->uri->segment(5); // → 5番目のURL文字列:「ccc」の部分

URLを「/」で区切って、base_url(http://localhost/waf/)の次から順番に、1番目のURL文字列、2番目のURL文字列、3番目のURL文字列、…とsegment()メソッドで順番を指定すれば取得できる。

 

Modelの改造

データベースでメッセージID指定して、メッセージを取り出す機能を用意しよう。

 

ファイルに以下のメソッドを追加する。

// Read by Id

public function read_message_by_id($id = 0)

{

 $sql = "SELECT * FROM talk WHERE id = ?";

 $param = array($id);

 $query = $this->db->query($sql, $param);

 return $query->row_array();

}

 

Modelの改造の解説

SQLの「WHERE」句で、絞り込む条件を指定できる。

 

SELECT * FROM talk WHERE id = ?

「WHERE id = 2」とすれば、メッセージID番号が2のメッセージデータが「talkテーブルから取り出せる。

もし該当するデータがなければ、返されるデータは空になる。(データが返ってこない。)

 

CodeIgniterの「row_array()」は、1件分のデータ配列の形にして返すメソッドだ。

 

Viewの改造

ファイルの内容を以下のように編集する。

<?php defined('BASEPATH') or exit('No direct script access allowed');?>

<!DOCTYPE html>

<html>

 <head>

  <meta charset="utf-8">

  <title>増田チャット</title>

  <base href="<?php echo base_url(); ?>">

 </head>

 <body>

  <h1>増田チャット</h1>

  <h2>編集</h2>

  <p>メッセージを変更して「更新する」ボタンを押してください。</p>

  <form action="welcome/update" method="post" accept-charset="utf-8">

   <label>メッセージ</label>

   <?php if (isset($talk)): ?>

   <input type="text" name="message" value="<?php echo $talk['message']; ?>">

   <input type="hidden" name="id" value="<?php echo $talk['id']; ?>">

   <input type="hidden" name="action" value="update">

   <?php else: ?>

   <p>※該当するメッセージがありません。</p>

   <?php endif;?>

   <button>更新する</button>

  </form>

  <p><a href="welcome/index">戻る</a></p>

 </body>

</html>

 

Viewの改造の解説

データベースから取り出した1件分のメッセージを表示する部分を追加した。

<input type="text" name="message" value="<?php echo $talk['message']; ?>">

の「<?php echo $talk['message']; ?>」という部分だ。

これで変更したいメッセージの本文を表示できる。

 

あと、編集したメッセージWebサーバーに送信できるように、Formタグ送信ボタン(「更新する」の部分)も追加した。

このときメッセージID番号も送信できるように、

<input type="hidden" name="id" value="<?php echo $talk['id']; ?>">

という1行も仕込んである

 

Controllerの改造

ファイルの内容を以下のように編集する。

// 更新画面

public function update($id = '')

{

 $id = $id ? $id : $this->input->post('id'); // id -> segment or post

 $action = $this->input->post('action');

 if ($action == 'update') {

  $message = $this->input->post('message');

  $this->chat_model->update_message($id, $message);

 }

 $data['talk'] = $this->chat_model->read_message_by_id($id);

 $this->load->view('chat_update', $data);

}

 

Controllerの改造の解説

メッセージID番号を指定して、データベースから取り出し、Viewに渡すデータを用意している。

$data['talk'] = $this->chat_model->read_message_by_id($id);

 

ユーザーメッセージ編集をしてWebサーバーに送信したら、データ更新する指示を出す部分も追加した。

$action = $this->input->post('action');

if ($action == 'update') {

 $message = $this->input->post('message');

 $this->chat_model->update_message($id, $message);

}

モデルにupdate_message()メソッドを用意して、$idと$messageを渡せば、該当データ更新するようにしたい。

次は、モデルでupdate_message()メソッドを用意しよう。

 

Modelの改造

ファイルの内容を以下のように編集する。

// Update

public function update_message($id = 0, $message = '')

{

 $sql = "UPDATE talk SET message = ? WHERE id = ?";

 $param = array($message, $id);

 $this->db->query($sql, $param);

 return $this->db->affected_rows();

}

 

Modelの改造の解説

SQLの「UPDATE」を使えば、指定したレコード(1件分のデータ)を更新できる。

「UPDATE talk SET message = ? WHERE id = ?」で、talkテーブルmessageid指定して更新している。

 

CodeIgniterの「affected_rows()」メソッドは、更新した行数を返す。=成功なら1行、失敗なら0行となる。

 

補足

コントローラーの「$id = $id ? $id : $this->input->post('id');」という行は、$idの受け取り方が2パターンあるので、それに対応している。

編集ページの表示で、1回目の表示と、2回目以降の表示で、$idの受け渡し方が変わっている。

  • 1回目:URLに埋め込まれID番号をupdate($id = '')の引数$idで受け取っている。($this->uri->segment(3)で受け取るのと同じ)
  • 2回目以降:Formタグで送られてきた$idを$this->input->post('id')で受け取っている。

URLに埋め込む方法上記の1回目のような方法)は、ユーザー勝手に値をいじれるので、基本的には使わない方が良い。

 

まとめ

以上で、SQLの「UPDATE」を使った、データ更新ができた。

長々と説明したが、今回の大事な点は、SQLの「UPDATE」の使い方だ。

CodeIgniterの使い方や、Webサイトの作り方(FormタグなどのHTML知識)は、オマケ程度に見ておいて欲しい。

 

次回は、データを削除するSQLDELETE」の使い方を見てみよう。

 


anond:20181015215004 未経験からプログラマーなんだが全然からない

anond:20181016015826 増田プログラマー養成講座 その1 パソコンの用意

anond:20181016164341 増田プログラマー養成講座 その2 プログラムデータ+処理、プログラム言語の種類

anond:20181016180059 増田プログラマー養成講座 その3 構造プログラミングの基本(順次、反復、分岐

anond:20181016193144 増田プログラマー養成講座 その4 子ども向け教材「Scratch」で構造プログラミング練習

anond:20181017161003 増田プログラマー養成講座 その5 オブジェクトとは何か?

anond:20181017191404 増田プログラマー養成講座 その6 OOPの種類、PHPの準備

anond:20181019181549 増田プログラマー養成講座 その7 OOPの仕組み(前半)

anond:20181020230044 増田プログラマー養成講座 その8 OOPの仕組み(後半)

anond:20181022232327 増田プログラマー養成講座 その9 MVCフレームワークを使ってみよう

anond:20181023184616 増田プログラマー養成講座 その10 OOP参考書

anond:20181024214133 増田プログラマー養成講座 その11 データベースを使ってみよう

anond:20181026145516 増田プログラマー養成講座 その12 データベースの参考書

anond:20181028152656 増田プログラマー養成講座 その13 SQL文法

anond:20181031014212 増田プログラマー養成講座 その14 Webアプリの試作品作成

anond:20181101225335 増田プログラマー養成講座 その15 Webアプリの完成見本

anond:20181101230220 増田プログラマー養成講座 その16 Webアプリの完成見本(続き)

anond:20181104161900 増田プログラマー養成講座 その17 Webアプリの骨組み

anond:20181104233013 増田プログラマー養成講座 その18 SQLデータの追加と取得

anond:20181110120715 増田プログラマー養成講座 その19 SQLデータ更新 ←★今ここ★

anond:20181110182445 増田プログラマー養成講座 その20 SQLデータの削除

anond:20181024214737 増田プログラマー養成講座 コンテンツ一覧

2018-11-04

増田プログラマー養成講座 その18 SQLデータの追加と取得

前回は、Webアプリの骨組み(スケルトン)までを作って、製作過程を見てみました。

今回は、データベースCRUD操作を行なって、チャットメッセージを追加/取得/変更/削除する機能実装してみましょう。

 

Visual Studio Codeの準備

Webアプリを作るときに、「Visual Studio Code」というIDE統合開発環境)を使ってみましょう。PHP用の各種プラグイン(「PHP IntelliSense」「PHP Debug」など)を入れておけば、便利に使える。

 

メッセージの追加

  1. ViewHTMLのFormタグを使って、メッセージ入力送信できるようにする。
  2. Controller:Viewから送信したデータを受け取れるようにする。
  3. Model:Controllerが受け取ったデータデータベースに保存する。

という機能実装してみよう。

 

Viewの改造

ファイルの内容を以下のように編集する。

<?php defined('BASEPATH') OR exit('No direct script access allowed'); ?>

<!DOCTYPE html>

<html>

 <head>

  <meta charset="utf-8">

  <title>増田チャット</title>

  <base href="<?php echo base_url(); ?>">

 </head>

 <body>

  <h1>増田チャット</h1>

  <h2>新規投稿</h2>

  <form action="welcome/index" method="post" accept-charset="utf-8">

   <label>メッセージ</label>

   <input type="text" name="message">

   <input type="hidden" name="action" value="add">

   <button>投稿する</button>

  </form>

 </body>

</html>

 

Viewの改造の解説

本当はセキュリティーを考慮して、入力値の検査バリデーション)とか、もっといろいろな仕込みが必要だが、ここでは練習なので省略します。

 

Controllerの改造

 

ファイルの内容を以下のように編集する。

<?php

defined('BASEPATH') or exit('No direct script access allowed');

 

class Welcome extends CI_Controller

{

 public function __construct()

 {

  parent::__construct();

  $this->load->model('chat_model');

  $this->load->helper('url');

  $this->output->enable_profiler(true); // for debug

 }

 

 // 初期画面

 public function index()

 {

  $action = $this->input->post('action');

  if ($action == 'add') {

   $message = $this->input->post('message');

   $this->chat_model->create_message($message);

  }

  $this->load->view('welcome_index');

 }

 

 // 更新画面

 public function update()

 {

  $this->load->view('chat_update');

 }

 

 // 削除画面

 public function delete()

 {

  $this->load->view('chat_delete');

 }

}

 

Controllerの改造の解説

 

Modelの改造

ここでやっとSQL文の登場だ!!!

SQL説明たかったのに(SQLとは本質的関係がない)Webアプリ説明が延々と続いた。(説明方法を変えた方がいいねw)

データベースデータを保存(追加)するSQLコマンド「INSERT」を使ってみよう!

 

ファイルの内容を以下のように編集する。

<?php

defined('BASEPATH') or exit('No direct script access allowed');

 

class Chat_model extends CI_Model

{

 public function __construct()

 {

  parent::__construct();

  $this->load->database();

 }

 

 // Create

 public function create_message($message = '')

 {

  $sql = "INSERT INTO talk SET create_at = ? , message = ?";

  $param = array(date('Y-m-d H:i:s'), $message);

  $this->db->query($sql, $param);

  return $this->db->insert_id();

 }

}

 

Modelの改造の解説

 

以上、メッセージの追加を実現するために、MVCの各パーツを用意した。これでメッセージの追加だけができるようになった。

これだけではメッセージの取得=表示がまだできないので、次はデータベースからメッセージデータを取得して、Webページに表示できるように改造しよう。

 

メッセージの取得

SQLの「SELECT」を使えば、データベースからデータを取り出せる。

メッセージデータを取り出して、Webページの表示で使おう。

 

Modelの改造

ファイルの内容を以下のように編集する。

<?php

defined('BASEPATH') or exit('No direct script access allowed');

 

class Chat_model extends CI_Model

{

 public function __construct()

 {

  parent::__construct();

  $this->load->database();

 }

 

 // Create

 public function create_message($message = '')

 {

  $sql = "INSERT INTO talk SET create_at = ? , message = ?";

  $param = array(date('Y-m-d H:i:s'), $message);

  $this->db->query($sql, $param);

  return $this->db->insert_id();

 }

 

 // Read All

 public function read_message()

 {

  $sql = "SELECT * FROM talk";

  $query = $this->db->query($sql);

  return $query->result_array();

 }

}

 

Modelの改造の解説

 

これでデータベースからデータを取り出すSQLメソッドモデルに用意できた。

 

Controllerの改造

 

ファイルの内容を以下のように編集する。

<?php

defined('BASEPATH') or exit('No direct script access allowed');

 

class Welcome extends CI_Controller

{

 public function __construct()

 {

  parent::__construct();

  $this->load->model('chat_model');

  $this->load->helper('url');

  // $this->output->enable_profiler(true); // for debug

 }

 

 // 初期画面

 public function index()

 {

  $action = $this->input->post('action');

  if ($action == 'add') {

   $message = $this->input->post('message');

   $this->chat_model->create_message($message);

  }

  $data['talk'] = $this->chat_model->read_message();

  $this->load->view('welcome_index', $data);

 }

 

 // 更新画面

 public function update()

 {

  $this->load->view('chat_update');

 }

 

 // 削除画面

 public function delete()

 {

  $this->load->view('chat_delete');

 }

}

 

Controllerの改造の解説

これは全部CodeIgniterで用意されている機能なので、マニュアルを読めば使い方が分かるようになってます

 

Viewの改造

ファイルの内容を以下のように編集する。

<?php defined('BASEPATH') OR exit('No direct script access allowed'); ?>

<!DOCTYPE html>

<html>

 <head>

  <meta charset="utf-8">

  <title>増田チャット</title>

  <base href="<?php echo base_url(); ?>">

 </head>

 <body>

  <h1>増田チャット</h1>

  <h2>新規投稿</h2>

  <form action="welcome/index" method="post" accept-charset="utf-8">

   <label>メッセージ</label>

   <input type="text" name="message">

   <input type="hidden" name="action" value="add">

   <button>投稿する</button>

  </form>

  <h2>投稿一覧</h2>

  <table border="1" cellpadding="5" cellspacing="0" bordercolor="#CCCCFF">

   <tr>

    <th>No.</th>

    <th>投稿日時</th>

    <th>メッセージ</th>

    <th>編集</th>

    <th>削除</th>

   </tr>

   <?php if(isset($talk)): ?>

   <?php foreach($talk as $item): ?>

   <tr>

    <td><?php echo $item['id']; ?></td>

    <td><?php echo $item['create_at']; ?></td>

    <td><?php echo $item['message']; ?></td>

    <td><a href="welcome/update/<?php echo $item['id']; ?>">編集</a></td>

    <td><a href="welcome/delete/<?php echo $item['id']; ?>">削除</a></td>

   </tr>

   <?php endforeach; ?>

   <?php endif; ?>

  </table>

 </body>

</html>

 

Viewの改造の解説

 

説明文が300行を超えてしまった!これ以上は増田で表示できない。)次回はメッセージの変更をやってみよう。

 


anond:20181104161900 増田プログラマー養成講座 その17 Webアプリの骨組み

anond:20181104233013 増田プログラマー養成講座 その18 SQLデータの追加と取得 ←★今ここ★

anond:20181110120715 増田プログラマー養成講座 その19 SQLデータ更新

anond:20181024214737 増田プログラマー養成講座 コンテンツ一覧

2018-10-17

増田プログラマー養成講座 その5 オブジェクトとは何か?

今回は、手続プログラミングの後半となる「オブジェクト指向プログラミング」(OOP)について学ぼう。

OOPは内容が多いので数回に分けて説明してみます。(説明が下手だったらフォローお願いしますw)

 

オブジェクトとは何か?

オブジェクトobject)はオブジェクト指向プログラミングにおいて、プログラム上の手続きの対象抽象化する概念である

 

オブジェクト指向プログラミングパラダイムでは、関連するデータを束ね、代入、演算手続き(関数メソッドなど)を介した受け渡しといった操作対象にでき、またメッセージ受け手になれる実体オブジェクトと呼ぶ。

多くの場合オブジェクトは他のオブジェクトを要素として格納することができ、複雑なデータ構造表現できる。

 

Wikipedia説明は分かりづらいね。(初心者だったときの私が読んだら意味理解できないと思う)

 

増田プログラマー養成講座 その2 https://anond.hatelabo.jp/20181016164341説明した「プログラム構成要素」を思い出して下さい。

プログラムは、

  1. データ
  2. 「処理」

の2つから成り立っている。

プログラミング歴史は、この「データ」と「処理」をどうやって使いやすくするか?の試行錯誤になってる。

 

Java入門書にも、データ構造について説明があっただろ?

 

構造体の発展=オブジェクト

複数データをまとめて入れておく箱は便利な道具なので、だいたいどのプログラミング言語でも用意されている。

この講座では、複数データをまとめて入れる箱を「構造体」と呼ぶことにしよう。

 

構造体の各箱には、普通データ」を入れておくんだけど、データだけじゃなくて「処理」も入れておけると便利だ。

データ」も「処理」も保管できるように拡張した構造体に、「オブジェクト」という名前を付けた。

オブジェクトとは、言い方を変えれば、「データ」に「処理」をくっ付けたものなんだ。

 

このWebページ最初の方に「図: オブジェクトフィールド(データ)とメソッドを一つにまとめたもの」という説明図があるだろ?

この図で、オブジェクトの中に、いくつか箱があるけど、

なんだ。

オブジェクトそれ自体特別ものじゃなくて、ただの箱でしかない。データ構造一種であることが分かっただろうか?

今の段階では、難しく考えなくていい。

ややこしくなるのはこの後だ。オブジェクトを使うときに「なんでそんな使い方するの?」という段階になってからだ。(気を緩めないように、ちょっと脅しておこうw)

 

クロージャ

が「オブジェクト」なら、その反対に、

もあるんじゃないか?と思ったそこのキミ。正解!

「処理」に「データ」をくっ付けた仕組みもあって、「クロージャー」と呼ばれてる。

 

クロージャ(closure)、関数閉包はプログラミング言語における関数オブジェクト一種

いくつかの言語ではラムダ式無名関数で実現している。

引数以外の変数を実行時の環境ではなく、自身定義された環境(静的スコープ)において解決することを特徴とする。

関数とそれを評価する環境ペアであるともいえる。

オブジェクトインスタンス変数とは、オブジェクトインスタンスではなく関数の呼び出しに束縛されているという点で異なる。

この説明文読んで、クロージャーの仕組みがスパッと理解できる初心者っていねーだろ?(いたらビビるw)

Wikipedia説明は「何言ってるか分かんない」状態だけど、サンプルを動作させてみれば、仕組みは簡単に分かります

 

第1級オブジェクト

ここまでの説明で、「プログラミング言語は、機能自由拡張できる」と分かっただろう。

から、「データ」と「処理」の扱い方を工夫する歴史の中で、「オブジェクト」という仕組みを閃いちゃった奴がいたんだねw

 

オブジェクトの特徴をもう一度振り返ってみよう。

普段は「データ」をぶち込んでおく箱の集合体に、処理も入れられるように改造しちゃったのが「オブジェクト」だったね?

…ってことは、処理とデータ水と油みたいに別々のものじゃなくて、実は処理もデータと同じように扱えるものだってことになるよね?

そうなんです!

実は「データ」と「処理」は全然別なものじゃなくて、同じようなものとして(扱おうと思えば)扱えるんです!

それで、このデータとして扱えるような「処理」に名前を付けてあげて、「第1級関数」とか「第1級オブジェクト」と呼んでます

(「第1級データ」という呼び名が使われてないのは、データデータとして扱えるのは当然なので、わざわざ第1級データという呼び名を付ける必要がないから)

 

第一オブジェクトファーストクラスオブジェクト、first-class object)は、あるプログラミング言語において、たとえば生成、代入、演算、(引数戻り値としての)受け渡しといったその言語における基本的操作制限なしに使用できる対象のことである

ここで「オブジェクト」とは広く対象物・客体を意味し、必ずしもオブジェクト指向プログラミングにおけるオブジェクト意味しない。第一オブジェクトは「第一データ型に属す」という。

言語によって異なるが、第一オブジェクトは概ね次のような性質もつ

上記説明文の中で「制限なしに使用できる」って部分が重要

 

第一関数(first-class function、ファーストクラスファンクション)とは、関数第一オブジェクトとして扱うことのできるプログラミング言語性質、またはそのような関数のことである

その場合その関数は、型のある言語では function typeなどと呼ばれる型を持ち、またその値は関数オブジェクトなどになる。

具体的にはプログラムの実行時に生成され、データ構造に含めることができ、他の関数引数として渡したり、戻り値として返したりすることのできる関数をいう。

上記説明文の中で「データ構造に含めることができ、」って部分が重要

 

フリーパスでどこでも入れちゃうVIPみたいだからファーストクラス(第1級)と称されてるんだね?

ドラえもんの「オールマイティーパス」を持ってる奴みたいなのが、「第一オブジェクト」「第一関数」ってわけ。

ドラえもんオールマイティーパスは、どこでも入れる通行証です。

これを係員に見せるだけで、どんな交通機関でも無賃乗車できて、どんな有料施設でも無料入場できます

通常なら入ることの許されない立ち入り禁止区域でさえ入れます

 

 

オブジェクトまとめ

 

混乱するようなら、上記説明で、クロージャー以降の話はとりあえず無視してください。

 

参考

オブジェクト説明をどうしようか?と考えるとき、参考にしたページも紹介しておきます

 

 

次回、オブジェクトの使い方=オブジェクト指向プログラミングについて学びましょう。

 


anond:20181015215004 未経験からプログラマーなんだが全然からない

anond:20181016015826 増田プログラマー養成講座 その1 パソコンの用意

anond:20181016164341 増田プログラマー養成講座 その2 プログラムデータ+処理、プログラム言語の種類

anond:20181016180059 増田プログラマー養成講座 その3 構造プログラミングの基本(順次、反復、分岐

anond:20181016193144 増田プログラマー養成講座 その4 子ども向け教材「Scratch」で構造プログラミング練習

anond:20181017161003 増田プログラマー養成講座 その5 オブジェクトとは何か? ←★今ここ★

anond:20181017191404 増田プログラマー養成講座 その6 OOPの種類、PHPの準備

anond:20181019181549 増田プログラマー養成講座 その7 OOPの仕組み(前半)

anond:20181020230044 増田プログラマー養成講座 その8 OOPの仕組み(後半)

anond:20181022232327 増田プログラマー養成講座 その9 MVCフレームワークを使ってみよう

anond:20181023184616 増田プログラマー養成講座 その10 OOP参考書

anond:20181024214737 増田プログラマー養成講座 コンテンツ一覧

2018-10-16

anond:20181016143024

いやそれはちょっと違う。

日本語Windowsで見た時は游ゴシックが表示に使われるが、Windowsがほっそい游ゴシックキレイに表示できるレンダリング性能を持ってないせい。

4Kモニタとかなら気にならんだろうが、FHDとかのモニタ使ってるならMacTypeを入れると大分マシになる。

 

というか多少検索能力に自信のあるWindows使いならみんなMacType使え。

blogとかのスクショでギッザギザメイリオとか見ると無様すぎて泣けてくるようになる。

MacTypeと、githubにあるbeta2パッチを導入し、

noMeiryoUIシステムフォントを全部IPA Pゴシック(10pt以上)に変更し、

UEFIでセキュアブート無効にした上でMacTypeレジストリモード運用するといい。

Chromeショートカットには引数で--disable-directwrite-for-uiを入れ、

Chromeの設定でフォントカスタマイズからデフォルトフォントIPA PゴないしP明に変え、

Stylusスタイルシート弄ってメイリオやMSPゴなどをIPA系に置き換えてしまえ。ここで游ゴも置き換えてもいい。細すぎるし。

タスクバースタートパネル、UWPアプリなどにはMacTypeフォント置換は効かないが、これでだいたいフォント描画への不満はなくなる。

ただあらゆるトラブル元凶になる可能性があるアプリなんで何か起きた時は真っ先にオフにすること。メジャーアプデ時も事前にオフにすること。

2018-09-17

anond:20180917230706

資格自分について回るものなのだから会社つべこべ言われたところで自分の考えを貫いたら?

一応、ひと昔前のオラクルマスターなんかは、DBといえばオラクル、と客も洗脳されてて、人売りIT企業では社員に是非取らせたい資格だったな。10年も前にゴールドデノミ前はプラチナ)を取ったけど、SQLコマンドライン引数がどうとか、今ならネットですぐ見つかるような、今となっては無意味な設問多数。

2018-09-14

「開発現場で役立たせるための設計原則パターン」への反論

開発現場で役立たせるための設計原則パターン

https://nekogata.hatenablog.com/entry/2018/09/10/163206

この記事はてブで大絶賛されてるが、個人的にはセンス無いなーと感じたので言語化してみる。

Notificationクラスが不親切。

Notificationクラスそもそも単一責任原則に反してない

開放閉鎖原則勘違いしてる

Notificationクラスと何のクラスが密結合なのか説明されてない

  • 『それ以前の問題というか「本来バラバラに書かれるべきものが、すべてここに書かれてて密結合しちゃってる」とみることができるかと思います。』?
  • 密結合というのであれば、コメント通知を変更した時にNotificationクラスとCommentクラスの両方に変更が生じてしまうことを示すべき

オブザーバーパターンが出てくる意味が分からない

今回の仕様を図で書くと

コメント→→→コメント通知

スター→→→スター通知

あしあと→→→あしあと通知

みたいな感じになるとする。

すると、今回スライド問題視しているのは矢印の右側の通知の部分が1クラス共通化されている点。

しかし、オブザーバーパターンの出番は図の矢印の部分が絡まり合って処理が複雑になってしまった場合

今回は1つのイベントから複数リアクションが発生することは想定しないので

オブザーバー不要なのは当然。選択肢に出てくるほうがおかしい。

そもそも問題認識(通知部分が問題)と解決策(矢印部分を解決)がズレてるから話がおかしな方向にいってる。

Notificationクラスサブクラスを作ろう、ならまだ分かる。

人間の可読性が考慮されてない

まとめ。

かに設計言語化するのは大事だが、言語化というのは「それっぽいことは幾らでも言える」危険性がある。そもそもプログラミングというのは芸術であり文学なんだからセンス無いのに言語化を頑張っても「一見それっぽく聞こえるけど間違ってる説明しか出てこない。

2018-08-04

コミュニケーション能力()とは

具体的になんだろと思ってきたが、どうも下記のことを指しているのではないかと気づいた。

  • どんな形式のinputでも入力可能。それに対して不満を言わない。たとえinputがなかったとしても。
  • どんな形式のoutputでも出力可能。それに対して不満を言わない。たとえoutputの形式指定がなかったとしても。
  • それに必要ものはすべて自主的に入手すべし。

Object型の可変長の引数を受け取り、相手が求めている型(それがどんなものかは不明)で返却する関数を作ってください、それに必要リソース自分で確保してなと言われてるようなものでこれは不可能なのでは?と思ってる。

Nullpoは甘え。

2018-07-30

anond:20180730125012

『AオブジェクトのBメソッドを〜』

って書いておきながら、引数で持ってくるのかnewするのかは書かないって、片手落ちじゃん

ロジック実装に任せるっていうなら、設計DBまでかもしくは、外部インタフェース仕様ぐらいまでにして、内部で使うクラスメソッド実装側に任せろよ

正直よく分からない

C言語プログラミングの基礎を学び、今はJavaベースシステム設計し、プログラマ実装をお願いする立場

それで、プログラマとのコミュニケーションに苦心している。


まず、完成した設計を渡すと高確率質問とともに突っ返されるのだが、その時の質問が、ほぼいつも

「『AオブジェクトのBメソッドを〜』とありますが、そのAオブジェクトはどっから引っ張ってくるんですか?それともnewするんですか?

なのが閉口する。

俺は業務の詳細を俯瞰し、処理のフローチャートに落とすのが仕事なんだけど、そんなトコまで書かないといけないのかよ?

なんでインスタンスだnewだのって話になるんだよこっちはJava専門家じゃねーんだよ。ぶっちゃけそんな低レベルな話は知らねーよ。

てか、それ考えんのは実装仕事じゃねーの?

コード書くのが俺の仕事じゃねーのに、なんでコード書きがするべき仕事押し付けられるんだ。


まあそんな事を言っても仕方ないので、「引数で持ってくる」と直して実装させるじゃん?

すると、今度は別の実装チームから

その修正仕様変更になるので許可取ってください。てか、ビルドエラーになるのでやめてくれ

と言われ、ますます訳のわからん展開になる。


そして、それもこれも、全て設計のせいになるので納得が行かない。

普通に考えたらプログラマの怠慢じゃねーのって思うんだけど。

2018-07-08

anond:20180322223107から3ヶ月以上経ったので途中経過を報告する

結論から言うと、一定の成果はあった。

ペースは週2回、1回1〜2時間くらい。

この3ヶ月で勉強したことを列挙する。

Excel
Word
PowerPoint

PowerPointはよく分からないのであんまり教えてない、てかアニメーションとか要る?

その他

メートルミリメートルの換算ができなかったので。

換算一問一答とか、今使われてるのはSI単位が多いけど例外もあるよ、とか、トレーサビリティってのがあって世界中の計測器は〜、とか。

アメリカどーこだ?てやったら中国差したので。

緯度と経度とか、大陸名前とか、国当てクイズとか、大航海時代とか、メルカトル図法とか。

現状Hello Worldだけ。

ファイルシステムの使い方とか、巷でよくあるメモリを机上にたとえたり補助記憶本棚にたとえるやつとか、Windowsタスクマネージャーの起動方法見方トラブル対処法とか。

射出成形とかプレス機とかNC旋盤とかファクトリーオートメーションとか。

Google動画検索にはお世話になりっぱなし。

結果

成果物として、毎日つけているOneDrive上のExcel家計簿がある。

普段スマホで日付と金額と勘定科目?を入力してもらって、別シートにsumifs関数で期間と勘定科目の一致した金額を集計する。

大したものじゃないけど、自分で作ったから仕組みを全部理解しているというのが大きい。地方ならこれを提出するだけでも仕事もらえるんじゃないか。言い過ぎか。

この勉強が早速功を奏したかは分からないけど、今月の頭に某中堅製造業契約社員になれることが決まった。

優秀なら学歴関係なく正社員になれるとのことで、本人のやる気があれば今の勉強を続けていこうと思っている。

たぶんしばらくは反復練習に充てることになるかな。

俺も勉強しなきゃ…

2018-07-07

Haskell を書いてるわけではないんだけど Haskellメモ化したい関数ってどうするんだろう

OOP言語で書いてて

 

 

という条件なので、キャッシュを取って、キャッシュになければ計算して返すクラスを作った

純粋関数型でこれをやろうとするとモナドになったりして面倒臭そう

 

しかしながら

 

  1. メモ化は単なる最適化なので無限計算リソースがあれば不要。IOと違い、副作用自体を扱いたいわけではない。最適化の結果として副作用になるだけ。
  2. コンパイラに任せて低レイヤー隠蔽できるならその方がよい。上層レイヤー関数を書く人間が直接扱うようなものではない。
  3. メモ化できるのは参照透過性ゆえなのでむしろ関数純粋性が保証されてる Haskell とかの方が標準の言語機能として当然のごとく提供できるのでは。

 

と思ったのですがどうなんでしょう。

2018-06-28

Excel絶対参照を使って九九の表を作れと言われたら」ブコメ読んだ

Excel絶対参照を使って九九の表を作れと言われたら

https://www.watto.nagoya/entry/2018/06/28/003000

ブコメレベル低くて、しいたけさんがかわいそうなので応用例を書いておく。

別に九九に使わなくても二つのパラメータなど)引数もつ関数の値を表示したい場合はいつでも使える。

例えば正規分布標準偏差を変えて(平均は例えば0で固定して)値を得たりグラフを書きたい場合、1行目に標準偏差を入れて、1列目にxの値を並べておけば、

どのセルにも「=NORM.DIST($A:$A,0,$1:$1,FALSE)」と入力すればよい。

この記法メリットはどのセルも完全に同じ数式が入力されている点で、ミスが生じづらいこと。

2018-06-24

プログラミングのコツ(初歩)

「一つの関数には最小限の役割だけ与える」

「一つの関数は長くても20行以内に収める」

「できるだけ引数で受け取った値を戻り値に返すように書く」


これ、学校とかで教えておいてほしいコツだった

これ知った後、自分みたいなアホでも割と大規模なプログラム簡単に、

全容を把握しつつ読みやすい内容でかつ増築やすくなった

たぶんあらゆるプログラムに通じる基本的ことなんだろう

その割に過去読んだ教本では触れられてなかった気がする

心掛けるだけでだいぶ躓きにくくなるだろうからぜひ基本の知識として最初らへんに教えておいてほしい

2018-06-02

GetHoge(dbConnection, key), GetFuga(dbConnection, key, key2)

という関数があったとき

dbConnection引数を渡さずにその場でDB接続する版の関数 GetHoge(key), GetFuga(key, key2)

を作りたい

DataTable GetHoge(key) {

var c = CreateDbConnection);

return GetHoge(c, key);

}

DataTable GetFuga(key, key2) {

var c = CreateDbConnection);

return GetFuga(c, key, key2);

}

これでは関数の数だけ同じものを作らねばならないので煩雑である

もっと巧く書く方法はないか

ES2015であれば、

function OpenConnectionAndRun(runFunc, ...args) {

var c = CreateDbConnection);

return runFunc(c, ...args);

}

という関数を1つ用意すればそれで済む。

関数型言語でもカリー化や部分適用を使って似た感じのコードが書けると思う。

C#ではそういった方法はないのか?

2018-05-25

低能先生の消し方を考える

anond:20180523222112 参考

増田から低能先生を消したい場合はuBlockのマイフィルター

anond.hatelabo.jp##div.section:has-text(低能)

という設定を書き加えれば大体望み通りの結果が得られるわけだが、このhas-text()は引数として正規表現をうけとることができるらしい。

低能先生より複雑な安倍bot対応するためにもきっちり低能先生にだけマッチする正規表現を考えてみたいところである

低能先生投稿を一通り見たところ「は」「が」を付けて主語として使う場合と、「の」や「に」を付けて主語述語を修飾する場合と、文末に1単語だけ置く場合があるようだ。場合によっては「w」「w」付与される。

anond.hatelabo.jp##div.section:has-text(/低能[はがのにww]/)

anond.hatelabo.jp##div.section:has-text(/低能$/m)

1行目で「はがのにww」と続く場合を、2行目で行末に書かれた場合マッチさせて消そうと思ったのだけど、2行目の行末の場合機能してくれない。

uBlock Origin取説では正規表現解説AdBlock Plusのページに飛ばされ、AdBlock PlusからMozillaリンクが張られている。https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Regular_Expressions おそらくuBlockの正規表現MozillaJavaScript準拠なのだろう。なのだろうけれどJavaScriptの改行にマッチしそうな特殊文字を一通り試したがどれも使えない。試しにuBlockのマニュアルページで

github.com##p:has-text(/ed.$/m)

を設定してみたところ、ちゃんと「ed.」で終わる行だけ消してくれた。ということは日本語から駄目なのだろうか?

JavaScriptに詳しい増田がいらっしゃったらアドバイスください。

2018-05-23

働く才能がないのでもう人生ダメかもしれない

・私について

20代後半 プログラマ

SES会社所属現在現場は2ヶ月目

資格 応用情報技術者

・悩み事

私は人並みの速度で作業することが、困難ということを確信しつつある。

今まで、数年経てば慣れてできるようになると自分に言い聞かせてきた。

しかし、たとえば、テストデータを作るのに工数に対して約2倍かかってしまうのだ。

作業のものは独力で遂行可能な内容だ。

1.基本設計と詳細設計インプットとする。

2.1をもとに画面遷移を網羅する引数テーブルデータ、想定結果、画面表示項目の表示をテスト仕様書記載する。

だが、「あのテストデータをどこと整合性合わせるんだっけ」「よくよく見たらテストパターンとして成立していなかった」という事象が発生する。

普通の人はうまくできているようなので、

私には普通の人に備わっているほどの記憶力が備わっていないのだと思う。

から不器用で、手を動かすアルバイトをしていたときに遅くて叱られていた覚えがある。

私は現代社会で働くことがやはりできないのかもしれない。

2018-05-15

捕鯨に関して

捕鯨ってインターネットではタブー視されているのかわからないけれど行きつけのクジラフグを出す料理屋が反捕鯨運動あおりを受けて潰れたので、捕鯨に関して考える材料になればと思い日記を書きます

そもそも日本が何で捕鯨でこんなにたたかれているかというと第二次世界国内物資が足りず、油もとれる肉もとれるクジラバカスカとっていたからで…そのあと戦勝国アメリカの言うことも聞いて漁獲引数個体(親は捕ってはならない、とか)は守り続けていたということを念頭に置いておいてほしい。はてな文法とかわからんから読みにくくてごめん。


主なエビデンス水産庁の出している調査捕鯨データです(http://www.jfa.maff.go.jp/j/whale/pdf/140513japanese.pdf)

調査捕鯨データ全然とれとらんやんけ!!やはり調査捕鯨無駄!!と憤る人、国もいますが、調査捕鯨によって得られたデータにより作成された論文拒否する媒体もあるので興味を持った方は論文を探す前に水産庁をディグったほうが良いです



Q.クジラ絶滅に瀕しているから捕っちゃダメ


A.そもそも資源量に関して「クジラ」っって大きなくくりで話している時点でおっ、こいつは面倒くさい奴だ、と思うのですが…

だってトキ絶滅に瀕している」とはいうけど「トリは絶滅に瀕している」って言わないじゃないですか

それは置いておいてクジラの多くの種類は豊富であったり過去の乱獲から数を増やし続けています

最近調査捕鯨採集されているみんな大好きミンククジラなんかは常に高水準で資源は安定しているし、ザトウクジラなんか増えすぎて南極ミンククジラの生息域を脅かしていたりしています

IWC国際捕鯨委員会)の科学委員会1992年資源安全捕獲計算方式(RMP)を算出しているのだけれど、国際捕鯨委員会会議では政治的理由がハバを聞かせていて、「絶対捕鯨を阻止するべきである」という反対国の意見に押し切られて採択はされていないです。



Q.だってクジラ特別な生き物じゃん


A.なぜなら彼は特別存在なら仕方がないですが、賢い云々で言うとクジラより脳が大きい動物もいます

例えばイルカネズミ一種銀河ヒッチハイクガイドでは地球でが人間が3番目、イルカが2番目、ネズミが1番目に賢い生き物であるとされていたのですがあながち間違いではないのかも)。

また、マッコウクジラハーレムを作るだとかの社会構成を作る点に関しても同様にクジラより複雑な社会構成動物もいます

その地域での「神」としての特別な生き物という観点で考えるならば(ゴールデンカムイを見ればわかる通り)、異なる文化が集えばすべての生き物が「神」になる可能性があります

一番簡単なのが牛でしょうか。(どうでもいい余談ですけれど捕鯨日新丸がハラル認証されたので日本流通している鯨肉イスラム圏の人間でも口にすることができます

他に例を挙げるならば日本で神の使いとされている鹿は西欧ではスポーツハンティングとされ毎年ミリオン単位の鹿がスポーツとしての狩りで殺されています

西欧文化では鹿の狩猟管理釣り場ニジマスを釣る感覚と何ら変わらないと考えられます

(クジラは頭がよくて、歌を歌ってコミュニケーションして、親子で行動して、ハーレムを作って、絶滅に瀕していて…という複数クジラの特徴をかけ合わせ、人々の頭の中で考えられている理想クジラ象をスーパーホエールと呼びます。そんなクジラ、いません)



Q.捕鯨残酷


A.捕鯨は今の方法簡単に言うと銛ミサイル)が即死率が高く効率が良いとみなされ採択をされています

動物の命をいただく行為なのでもちろんもっとも苦しまずに屠殺する方法がとられていますし、改善もされています

参考までにですが牛はノッキングガンで気絶させ、その間に血を抜いて絶命させます人間勝手に肉を食べているわけですからエゴは介在しますよね。



Q.捕鯨法律禁止されている(商業捕鯨モラトリアム


A.商業捕鯨モラトリアムとは国際捕鯨取締条約によって商業捕鯨猶予期間が設けられてたことを指します。

よく引き合いにされるのが1983年に発行されたこの附表第10項(e)で


この10規定にかかわらず、あらゆる資源についての商業目的のための鯨の捕獲頭数は、1986年の鯨体処理場による捕鯨の解禁期及び1985年から1986年までの母船による捕鯨の解禁期において並びにそれ以降の解禁期において零とする。この(e) の規定は、最良の科学的助言に基づいて検討されるものとし、委員会は、遅くとも1990年までに、同規定の鯨資源に与える影響につき包括的評価を行うとともに(e)の規定修正及び他の捕獲頭数の設定につき検討する。


と記されています

この項の前半を読むと「商業目的捕鯨数はゼロにする」と読み取れますが後半をでは「遅くとも1990年までにはクジラに対して資源評価を行って、捕獲頭数を検討する」と書かれています

日本はこの後半の資源評価を行うために現在調査捕鯨を行っているわけです。調査捕鯨に関しては同条約8条で定められています


1.この条約規定にかかわらず、締約政府は、同政府適当と認める数の制限及び他の条件に従って自国民のいずれかが科学研究のために鯨を捕獲し、殺し、及び処理することを認可する特別許可書をこれに与えることができる。また、この条の規定による鯨の捕獲殺害及び処理は、この条約適用から除外する。各締約政府は、その与えたすべての前記の認可を直ちに委員会に報告しなければならない。各締約政府は、その与えた前記の特別許可書をいつでも取り消すことができる。

2.前記の特別許可書に基いて捕獲した鯨は、実行可能な限り加工し、また、取得金は、許可を与えた政府の発給した指令書に従って処分しなければならない。

3.各締約政府は、この条の第l項及び第4条に従って行われた研究調査の結果を含めて鯨及び捕鯨について同政府が入手しうる科学資料を、委員会指定する団体に、実行可能な限り、且つ、l年をこえない期間ごとに送付しなければならない。

4.母船及び鯨体処理場の作業に関連する生物学資料継続的収集及び分析捕鯨業の健全建設的な運営に不可欠であることを認め、締約政府は、この資料を得るために実行可能なすべての措置を執るものとする。

未だに調査捕鯨なのはこのモラトリアムが続いているからですね。1990年にはちゃん漁獲量が決まるはずだったのに。おかしいな。



言いたいことは言えたのですっきりしました。またなんかあったら追記します。


シーシェパード妨害活動を行っている船が総何トンなのか調べましたが出てこず…単純に長さは50~60mくらいなんで総トン数200~400トンの船でしょうかね?

対する日新丸は全長約130m、総トン数8030トン。第〇勇新丸などの目視調査船は総トン数700トンです。

人間をこのような狂気の行動に駆り立てるクジラという動物、とんだカリスマ動物ですね。

とりあえずクジラ資源なのか、守るべき生き物なのか、そこらへんはっきりさせたほうがよさそうです。

これだけ書いていたらクジラ食べたくなったのでスーパーで買って帰りますガツが好きなんだよなぁ。酢味噌でさ。

2018-04-17

Quick Tutorial for Pyramidをやってみる

PyramidPython向けWebフレームワーク

Quick Tutorial for Pyramid公式チュートリアル

https://docs.pylonsproject.org/projects/pyramid/en/latest/quick_tutorial/index.html

Prelude: Quick Project Startup with Cookiecutters

$ $VENV/bin/cookiecutter gh:Pylons/pyramid-cookiecutter-starter --checkout 1.9-branch

として、プロンプトの問いに答えるとサンプル的なアプリができる。

ghはgithubか。

引数指定できるテンプレートhttps://github.com/Pylons?q=pyramid-cookiecutter

sqlalchemyを使うものは分かるけど、zodbって何?

アプリは以下のようにして起動する。

$ env/bin/pserve development.ini --reload

このpserveというPythonモジュールアプリ動かしたりする。

01: Single-File Web Applications

超単純なPyramidアプリを作って、WSGIイメージをつかむ。

app.py を書き写して動かしたらHello Worldが動いた。

Analysisの項:
2. Lines 12-14. Use Pyramid's configurator in a context manager to connect view code to a particular URL route.

viewURLの紐付けはconfig.add_routeしてconfig.add_viewする。add_viewしてからadd_routeしても大丈夫だった。

3. Lines 6-8. Implement the view code that generates the response.

viewにはrequestが渡される。requestに色々入ってそう。

4. Lines 15-17. Publish a WSGI app using an HTTP server.

waitressは知らないけど、serveでHTTPサーバ作ってWSGIアプリを公開できるのかな?

Extra creditの項:
1. Why do we do this:
print('Incoming request')

...instead of:

print 'Incoming request'

Python3だから

2. What happens if you return a string of HTML? A sequence of integers?

Inernal Server Errorになった。アプリのほうではValueErrorresponseを返すようにと怒られていた。text/plainとか返すには何かしないとダメっぽい。

3. Put something invalid, such as print xyz, in the view function. Kill your python app.py with ctrl-C and restart, then reload your browser. See the exception in the console?

print(xyz)してみろ、ということかな。1と同じくInernal Server Errorになって、コンソールにはNameErrorが出た。

4. The GI in WSGI stands for "Gateway Interface". What web standard is this modelled after?

CGIかな?

2018-04-10

anond:20180410165141

引数禁止。全部グローバル変数で渡せ」

えー、グローバル変数変わるタイミング分かりづれー

サブルーチンを使うとあちこちに飛んでわかりにくい。同じ処理をするときコピペでそれぞれの場所に同じコードを書きなさい」

むかーし、「ふんどしプログラム」って呼ばれてたやつか。

サブルーチン無しのメインだらだら書くやつ。

プロジェクトで開発した事無い奴らなのか?

それともそのプロジェクトで失敗して変に原点回帰しようとしてるのか?

何れにしても悲惨現場だな。

anond:20180409181511

サブルーチンに値を引数で渡してたら「引数禁止。全部グローバル変数で渡せ」とか、「サブルーチンを使うとあちこちに飛んでわかりにくい。同じ処理をするときコピペでそれぞれの場所に同じコードを書きなさい」とか言われたことがあるわ。

そこまでひどくなくてもレヴューを受けると「うわ、こいつレベル低っ」「この人Excelばっかりでコードいたことないんだろうな」みたいな人ばっかり。

レビュー機能してる現場に遭遇したことない。

2018-04-03

anond:20180403111540

よく考えたらそうだな。

構造体はそのまま引数にする利用が一般的

クラスインスタンスポインタを渡す利用が一般的

なんでそこでは差がつくが、構造体のポインタ渡すなら確かに結果は変わらんな。

anond:20180403111253

メソッド構造体を引数として渡せば言ってるとおり「超でかいint」となって

速度にかなりの影響を与えるはずだが… 違ったっけ?

anond:20180403105350

考え方としては「構造体は超でっかいサイズのint」クラスは「常にint」

で、速度が必要な処理で構造体そのもの引数としてやり取りしようとすると超でっかいintであるが故にメモリ読み込み/書き込み時間を取られる。

逆にクラス(のインスタンス)はint(メモリアドレス)のみをやり取りするので比較して高速になる。

逆に、インスタンスアドレスしかやり取りしないので、メソッド呼び出し時にはインスタンスの内部変数がそのままになってしまう。

これはメリットのように見えるがそうでない場合もあるので、

一般には座標計算等の最初から計算し直す系のデータについてはクラスではなく構造体で管理するパターンの方が多い。

アーカイブ ヘルプ
ログイン ユーザー登録
ようこそ ゲスト さん