「Action」を含む日記 RSS

はてなキーワード: Actionとは

2018-11-13

Wikipediaの「銀ブラ」をたどる

メモとして残しておく。

を見ると、2016年10月26日 (水) に、

大正時代から俗語で、東京銀座慶応大学学生ブラジルコーヒーを飲んでいたこから銀ブラ」とも表記する。

が登場する。(編集者は 58.94.44.58 URLhttps://ja.wikipedia.org/w/index.php?title=%E9%8A%80%E3%81%B6%E3%82%89&oldid=61684408 )

その日のうちに元に戻され一旦終結するが、 2017年7月8日 (土) に以下の記述修正されている。

銀ぶら(ぎんぶら)は、大正時代から俗語で、東京銀座に在るカフェーパウリスタブラジルコーヒーを飲むことである。「銀座の街をぶらぶら歩くこと」という説が広く普及しているが、これは誤りである

(編集者は 210.150.76.152 URLhttps://ja.wikipedia.org/w/index.php?title=%E9%8A%80%E3%81%B6%E3%82%89&oldid=64708059 )

2018-11-12

BTSに対するSWC非難声明邦訳)――これはSWCによる「全面降伏要求」だ

邦訳適当なので適当かもしれない

---

November 11, 2018

2018年1111

The Simon Wiesenthal Center denounced BTS, an internationally popular Korean band whose live performance on Japan TV was cancelled.

先日日本テレビ局ライブパフォーマンスの予定を取り消された、韓国国際的人気バンドBTSを、サイモン・ヴィーゼンタール・センター非難する。

“Wearing a T-shirt in Japan mocking the victims of the Nagasaki A-bomb, is just the latest incident of this band mocking the past,” charged Rabbi Abraham Cooper. Associate Dean and Director of Global Social Action of the Simon Wiesenthal Center, a leading Jewish Human Rights NGO.

サイモン・ヴィーゼンタール・センター副部長であり、グローバルソーシャルアクション部門であるラビアブラハム・クーパー師は、「長崎原爆による犠牲者嘲笑するようなTシャツを着用したということは、過去嘲笑するこのバンドが起こした、最新の事例であるに過ぎない」と批判した。

Members of the band posed for a photo shoot wearing hats with the Nazi SS Death Head logo. The SS was a key component of the Nazi mass murder of 6 million Jews during the WWII Holocaust. “Flags appearing on stage at their concert were eerily similar to the Nazi Swastika. It goes without saying that this group, which was invited to speak at the UN, owes the people of Japan and the victims of the Nazism an apology.”

たこバンドメンバーは、ナチ親衛隊の髑髏をあしらった帽子かぶり写真ポーズを収めている。ナチ親衛隊は600万人のユダヤ人第二次大戦中のホロコースト殺害した中心組織だ。「彼らのコンサートで見られた旗はナチハーケンクロイツ酷似している。国連演説にも招かれるようなグループが、日本の人々、またナチズムの犠牲者に対し謝罪の責務を負うのは言うまでもない」

“But that is not enough. It is clear that those designing and promoting this group’s career are too comfortable with denigrating the memory of the past. The result is that on young generations in Korea and around the world are more likely to identify bigotry and intolerance as beingcool’ and help erase the lessons of history. The management of this group, not only the front performers, should publicly apologize,” Rabbi Cooper added.

さらラビクーパー師は、「それだけではない。このグループを作り、運営している人々が、過去について中傷することに無頓着すぎるのは明らかだ。その結果、韓国や、世界若者たちが、偏見不寛容をカッコイものと考えるようになり、歴史の教訓を忘れることを助長することになる。先頭でパフォーマンスをしている彼らだけでなく、グループ運営している人々も、公式謝罪すべきだ」と付け加えた。

---

まり報道されていない部分への個人的感想

この2点はかなり気になる――なぜなら日本人でも知らない「長崎広島キノコ雲の違い」を明らかにして非難していること、Mocking the victimsという表現を使って「被爆者侮辱している」とSWC認識していることを明らかにしていることから、決して「ナチの方は謝るけど、原爆部分は言いがかり」というメッセージを受け入れないという姿勢が伝わるからだ。はっきり言ってこのメッセージナチ部分がかすむほどに反核的に読み取れる。謝罪すべき対象については「日本の人々(被爆者)とナチズムの犠牲者」と「日本の人々」を最初に置く念のいりようだ――これはそういう流儀なのかもしれないが。

SWCがこのようなリリースを出すのは驚きに値する。「原爆終戦を促し無駄犠牲を防いだ」という史観にさえ抵触しかねないからだ。原爆を開発した科学者ユダヤ人が多く含まれいたことも鑑みると、このようなメッセージが出たことは極めて興味深い。少なくとも巷間マスコミはてなブックマーク等で言われるように「SWCが出てきちゃったよ、やれやれ」とかいった話ではなさそうなのである原爆開発に積極的に加担したユダヤ人代表するような団体が、「広島」と「長崎」を明示的に分けて「嘲笑した」と非難していることについて、多少の考えをいたして欲しい。

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 増田プログラマー養成講座 コンテンツ一覧

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

前回は、Webアプリの完成見本を先に見てみました。

今回は、Webアプリを作る途中の過程を見て、作る雰囲気を一緒に味わってみましょう。

 

フレームワーク使用ルール=「設定より規約」=手抜きをする仕組み

最近フレームワークは、「設定より規約」(CoC、convention over configuration)という発想で作られている。

フレームワーク規約使用ルール)に従うと、プログラマー作業量が減って、楽ができる。

 

設定より規約(convention over configuration)とは、開発者の決定すべきことを減少させ、単純にするが柔軟性は失わせないというソフトウェア設計パラダイム

使用しているツール実装した規約開発者の望む動作と一致していれば、設定ファイルを書く必要もない。実装規約と望みの動作が違っている場合必要動作を設定しなければならない。

 

最近フレームワークは「設定より規約アプローチ採用しているものが多い。

例えば、Ruby on Rails、Kohana、Grails、GrokZend FrameworkCakePHPSymfony などがある。

 

CodeIgniter使用ルール

CodeIgniter使用ルールは、マニュアルチュートリアル確認できる。

↑このページの「アプリケーションフローチャート」を見てみよう。

 

  1. 一番左の「index.php」が、Webアプリ入口になっている。(エントリーポイントフロントコントローラーパターン等ともいう)
  2. から2番目の上段「Routing」で、URLに応じて、仕事の振り分け先を決定する。(ディスパッチ、マッピングルーティング等ともいう)
  3. から4番目の「Application Controller」で、具体的な処理の指示を出す。
    1. Application Controllerは、「Model」に必要データを用意させる。
    2. Application Controllerは、「View」に表示用の画面を作らせる。
    3. Application Controllerが、index.phpに表示用の画面を渡す。
  4. 表示用の画面(最終的な処理の結果)を受け取った「index.php」は、ユーザーブラウザー)に画面を渡す。

 

 


 

それでは、CodeIgniterプログラマーが用意する部分のM(Model)とV(View)とC(Application Controller)を、骨組みから作ってみよう。

事前準備として、前々回と前回のWebアプリ完成見本を用意するところまでやっておこう。

 

スケルトンとは?

スケルトン(skeleton, 骨格)とは動物人間の骨格。

コンピュータプログラムコードの骨格部分。プログラムコード作成では、初期段階でスケルトン作成し、その後で詳細部分を肉付けしていく。

 

 

 

Application Controllerの骨組み

まずは、MVCのCの骨組みを作ろう。

Controllerは、ユーザーからリクエストを受け付けて、ModelViewに指示を出す監督です。

 

上記フォルダの中に「Welcome.php」というファイルを作る。(デフォルトであるはずなので、それを使ってOK

 

CodeIgniterルールで、Application Controllerを置く場所は「application/controllers」というフォルダになっている。

CodeIgniterルールで、一番最初に呼び出されるApplication Controllerは「Welcome.php」というファイルになっている。

→これは「C:\xampp\htdocs\waf\application\config\routes.php」という設定ファイルで決められている。

$route['default_controller'] = 'welcome'; // 別の名前にすれば変えられる。

 

「Welcome.php」の中身を以下にように変更する。

<?php

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

 

class Welcome extends CI_Controller

{

 // 初期画面

 public function index()

 {

  echo "Here is index()";

 }

 // 更新画面

 public function update()

 {

  echo "Here is update()";

 }

 // 削除画面

 public function delete()

 {

  echo "Here is delete()";

 }

}

これがチャットApplication Controllerとして動作する最小限の内容=骨格だ。

 

継承

class Welcome extends CI_Controller

という行に注目してみよう。

CodeIgniterで用意されてる「CI_Controller」クラス継承して、プログラマーが「Welcome」クラスを作ってる。

継承によって、フレームワークが用意してる様々な機能をWelcomeクラス内で使えるようになる。

 

URLリクエスト)とControllerの対応マッピング)のルール

「Welcome」クラスの中に、「index()」「update()」「delete()」という3つのメソッドを用意した。

CodeIgniterURLは、Action Controllerのクラス名やメソッド名とひもづけられている。

今回作るWebアプリだと、

「http://localhost/waf/クラス名/メソッド名」

という対応関係になっている。

(例)

http://localhost/waf/        →Welcomeクラスindex()メソッドが呼び出される。

http://localhost/waf/welcome/index  →Welcomeクラスindex()メソッドが呼び出される。

http://localhost/waf/welcome/update →Welcomeクラスのupdate()メソッドが呼び出される。

http://localhost/waf/welcome/delete →Welcomeクラスdelete()メソッドが呼び出される。

 

 

 

Viewの骨組み

次にMVCのVの骨組みを作ろう。

ビューは、表示する画面の部分です。HTMLWebページの構造を書きます

 

 

welcome_index.php編集

以下の内容にして保存する。

<?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>

 </body>

</html>

 

chat_update.php編集

以下の内容にして保存する。

<?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>

 </body>

</html>

 

chat_delete.php編集

以下の内容にして保存する。

<?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>

 </body>

</html>

 

Viewファイルの追加に合わせて、Controllerも一部変更します。

 

Welcome.php編集

<?php

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

 

class Welcome extends CI_Controller

{

 public function __construct()

 {

  parent::__construct();

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

 }

 

 // 初期画面

 public function index()

 {

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

 }

 

 // 更新画面

 public function update()

 {

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

 }

 

 // 削除画面

 public function delete()

 {

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

 }

}

 

(変更点の説明

コンストラクターの追加

コンストラクター「__construct()」は、クラスからインスタンスが作られるとき自動的に実行されるメソッドだ。コンストラクターは、初期化最初にやっておくべき下準備を書いておく。

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

CodeIgniterには、リンクの表示を補助する「URLヘルパー」という機能が用意されている。

上記のように書くとURLヘルパーを呼び出して、使えるようになる。

Viewファイルの以下の行でURLヘルパーを使っている。=「base_url()」という関数URLヘルパーの1つ。

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

 

ビュー読み込みメソッドの追加

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

というメソッドによって、Viewファイルの「welcome_index.php」を呼び出し、画面を出力します。

 

これでMVCのCとVの骨組みができた。

今の段階でWebブラウザーで各ページを表示させると、各Viewファイルの中身が表示される。

 

 

 

Modelの骨組み

次にMVCのMの骨組みを作ろう。

モデルは、具体的な処理内容(ロジック)を書いて、データを読み書きする部分です。

データベースを操作するSQL文もモデルに書きます

 

上記フォルダの中に「Chat_model.php」というファイルを作り、以下の内容にして保存する。

<?php

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

 

class Chat_model extends CI_Model

{

 public function __construct()

 {

  parent::__construct();

  $this->load->database();

 }

}

 

CodeIgniterで用意されてる「CI_Modelクラス継承して、プログラマーが「Chat_modelクラスを作ってる。

「Chat_modelクラスコンストラクターには、以下のように書いている。

$this->load->database();

これは、データベースを使用する準備だ。

 

Modelの追加に合わせて、さらにControllerも一部変更します。

 

Welcome.php編集

<?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');

 }

 

 // 初期画面

 public function index()

 {

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

 }

 

 // 更新画面

 public function update()

 {

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

 }

 

 // 削除画面

 public function delete()

 {

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

 }

}

 

コンストラクター

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

と書いて、「Chat_model」というモデルを読み込むようにした。

これで、モデルに用意するいろんな機能コントローラーで使えるようになる。

 

 

 

以上で、MVCの骨組み(スケルトン)だけを作成するプロセスを見ていきました。

まだ中身はスカスカで、何も機能がついてませんね。

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

 


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:20181024214737 増田プログラマー養成講座 コンテンツ一覧

2018-11-01

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

前回は、Webアプリモックアップ(ハリボテ)を作るところまでやりました。

今回は、Webアプリ機能実装してみましょう!

 

学習の狙い

データベースを使ったWebアプリを作って、データベースの基本操作CRUDの4つ)を練習してみよう!

CRUD
  1. Create 追加
  2. Read  取得
  3. Update 更新
  4. Delete 削除

 

説明の順番について

どういう順番で説明したら分かりやすいか検討してみた。

  1. まず先に、Webアプリの完成見本を提示します。
  2. 続いて、作る過程説明しながら、各プログラム意味説明してみます

 

作業の流れ

ざっくりと、以下のような流れで作っていきます

  1. XAMPPを起動する。(参考 anond:20181017191404 増田プログラマー養成講座 その6 OOPの種類、PHPの準備)
  2. CodeIgniterインストールする。(参考 anond:20181022232327 増田プログラマー養成講座 その9 MVCフレームワークを使ってみよう)
  3. phpMyAdminでデータベース操作する。(参考 anond:20181024214133 増田プログラマー養成講座 その11 データベースを使ってみよう)
  4. ApacheWebサーバーソフト)の設定を変更する。(今回説明
  5. Visual Studio Code等のツールプログラムを書く。(次回説明
  6. ブラウザー動作確認する。

 

XAMPPを起動させる

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

講座その6を参考にして、XAMPPを起動させて、ApacheMySQLスタートして下さい。

 

CodeIgniterインストールする。

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

講座その9を参考にして、XAMPPの中にCodeIgniterインストールしておきます

 

phpMyAdminでデータベース操作する。

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

講座その11を参考にして、MySQLWebアプリ用のデータベーステーブル作成しておきます

 

データベースの設定

講座その11で、データベース練習で「chat」というデータベースを作ってみました。

そのときmessage」というテーブル作りましたが、今回Webアプリで使うテーブルとして新たに「talk」というテーブル作成します。

(補足:前に作ったテーブルmessage」の中に、テーブル名と同じ「message」という名前カラム(列)を作ってました。これでも問題ないんだけど、プログラムを書くときテーブル名とカラム名を混同しないようにしたいので、念のため作り変えときましょう。)

 

talkテーブル新規作成する

SQLで「talk」というテーブルを作る場合、以下のようなSQL文になります

CREATE TABLE `talk` (

 `id` int(11) NOT NULL,

 `create_at` datetime NOT NULL,

 `update_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

 `message` text NOT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

このSQL文をphpMyAdminで実行すれば「talkテーブルを作れます

  1. phpMyAdminを開く。
  2. データベース「chat」を開く。(前に作った「messageテーブルは使わないので削除してもOK
  3. phpMyAdmin画面の上部メニューの「SQL」をクリックする。
  4. データベース chat 上でクエリを実行する:」の空欄に上記SQL文をコピーして実行すれば、「talk」というテーブルができる。

 

これでデータベースの準備ができました。

 

Apacheの設定

CodeIgniterで使う「URL」の表示方法ちょっと変更しておきたいので、ApacheWebサーバーソフト)の設定を変更しておきます

(「URL」=情報がどこにあるのかを示すインターネット上の住所)

Apacheの「mod_rewrite」という仕組みによって、URLの扱い方を変更します。)

 

(例)

変更前: http://localhost/waf/index.php/welcome/

変更後: http://localhost/waf/welcome/

というように、URLの中にある「/index.php」という文字列を表示させない設定にします。

 

Apache設定ファイル.htaccess

Apacheの設定は「.htaccess」という名前設定ファイルを用意して変更します。

 

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ index.php/$1 [L]

 

.htaccess」の書き方を理解するには、「正規表現」という仕組みの知識必要です。

まだ「正規表現」を勉強してない段階では、とりあえずコピペして使って下さい。

 

Webアプリ完成見本

CodeIgniterで、

を行ないます

 

CodeIgniter設定ファイルconfig.php」の編集

config.php」をIDEやエディターで開いて、以下のように変更する。

$config['base_url'] = 'http://localhost/waf/';

$config['index_page'] = '';

 

最初は、

$config['index_page'] = 'index.php';

になってるけど、「index.php」を削除して、「''」(空)にしておく。

 

CodeIgniterデータベース設定ファイル「databese.php」の編集

「databese.php」をIDEやエディターで開いて、以下のように変更する。

$db['default'] = array(

 'dsn' => '',

 'hostname' => 'localhost',

 'username' => 'root',

 'password' => '',

 'database' => 'chat',

 'dbdriver' => 'mysqli',

(※上記のように、MySQLのusernamepasswordは「root」(管理者)のデフォルト設定を使ってます。)

 

Controllerの作成

上記フォルダの中に「Welcome.php」というファイルを作って、内容を以下のようにします。

<?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($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);

 }

 

 // 削除画面

 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);

 }

}

 

View作成

上記フォルダの中に「welcome_index.php」「chat_update.php」「chat_delete.php」という3つのファイルを作って、内容を以下のようにします。

 

Viewファイル「welcome_index.php」の中身

<?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ファイル「chat_update.php」の中身

<?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ファイル「chat_delete.php」の中身

<?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>

 

Model作成

上記フォルダの中に「Chat_model.php」というファイルを作って、内容を以下のようにします。

<?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();

 }

 

 // 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();

 }

 

 // 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();

 }

 

 // 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();

 }

}

 

この続きは、

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

へ続きます

2018-08-09

xyzzy 使いに 50 の質問

01. ハンドルネームは?

  増田

02. ご職業、年齢はいくつですか?

  なんでも屋さん、アラサー

03. xyzzyについて何かwebサイトを持っていますか?

  持っていません

04. 現在使用中の xyzzyバージョンは何ですか?

 0.2.2.253

05. xyzzy 使用暦はどれくらいですか?

  15年くらい

06. xyzzy を使うようになったきっかけは何ですか?

  昔のことすぎて忘れましたが、学校UNIX 演習で Emacs を使っていたので、Windows でも使おうと思っていて見つけたんだと思います

07. xyzzy 以外に使っているテキストエディタはありますか?

  Atom, McEditor

08. xyzzy を使う前に Emacs 系のテキストエディタを使ったことはありますか?

  はい

09. xyzzy を主に何に利用していますか?

  プログラムを書いたり設定ファイルをいじったり、テキストに関することならだいたい

10. xyzzy が関連付けされているファイルタイプは何ですか?

  txt, md, log, ini, bat, html, xml, css, less, scss, sass, styl, js, coffee, pl, php, py, rb, java, sqlかにもあるかも

11. xyzzy他人に勧めたことはありますか? また、結果はどうでしたか?

  使い始めた当時同級生が何人か使っていました

12. xyzzyフリーじゃなかったとしたらいくら位の値段になると思いますか?

  今なら3000円くらいなら買う

13. xyzzy を何と呼んでいますか?

  じじー

14. xyzzy の好きな点・嫌いな点はどこですか?

  好きな点:動作をほぼ自在カスタマイズできる点

  嫌いな点:動作カスタマイズするとき不自由なところがある点

15. パソコンを立ち上げている時間の内、xyzzy をどのくらい使っていますか?

  業務ときは3割くらい?

16. キーバインドWindows風ですか? Emacs風ですか? オリジナルですか?

  Emacs

17. .xyzzyに書く派ですか? .siteinitに書く派ですか?

  必要に応じてそれぞれに

18. 拡張Lispバイトコンパイルしますか?

  してます

19. セレクションリージョン、どちらを多く使いますか?

  リージョン

20. xyzzy を使っていて挫折したことはありますか?

  はじめのころ五目並べになかなか勝てなくて挫折しました

21. xyzzy の使い方をどうやって学びましたか?

  実際にさわりながら。LispGoogle 先生さまさま

22. xyzzy を使うにあたって一番苦労したことは何ですか?

  xyzzy 自体Lisp APIマニュアル化されていないところ

23. xyzzy を使って目からウロコだった機能は何ですか?

  Buffer Menu

24. 今の xyzzy に望むことはありますか? またそれは何ですか?

  矩形機能に影響が出そうだけどプロポーショナルフォントへの対応と、絵文字など最近 Unicode に追加された文字への対応

25. Lisp はある程度読み書きできますか?

  xyzzy自分の使いやすいようにできる程度には

26. Lisp のほかに読み書きできるプログラム言語はありますか?

  JavaScript, ES 2016, Coffee Script, Action Script 3, C, C++のごく一部, Objective-C, Rust, Swift, Perl, PHP, Python, Ruby, bash, xyzzy lisp

27. 自分で作った 拡張Lisp を公開していますか?

  GitHubGist にあるので探してください

28. 拡張Lisp で導入しているものは何ですか? (多い方は代表的ものをお答えください)

  clickable-uri, jscript-mode, markdown-mode など

29. これは外せない! という 拡張Lisp はありますか? またそれは何ですか?

  いろいろやるので今ある拡張機能がないと無理

30. NetInstaller を利用していますか?

  はい

31. 拡張DLL を導入していますか? またそれは何ですか?

  popup-dododo のための Cairo とか?

32. ドキュメント(info,reference等) は使っていますか? また、それは何ですか?

  使っていません。自分で改造してキーワードを全部 Web検索するようにしています

33. ネット関係拡張Lisp(www-mode,kamail等)を使っていますか?

  xyttr

34. アウトライン系のLispは使っていますか? またそれは何ですか?

  使っていません

35. メモ系(changelog-memo,howm等)Lispは使っていますか? またそれは何ですか?

  使っていません

36. xyzzy五目並べはやったことがありますか? また、結果はどうでしたか?

  今なら結構勝てます

37. キーボードマクロは使いますか?

  たまに。テキストの整形処理なら正規表現ゴリゴリやるほうが多いです

38. 辞書機能は使いますか?

  使っていません。国語英和・和英、英英辞典iPhoneアプリを使います

39. xyzzy のファイラは使いますか?

  毎日仕事に欠かせません。便利にカスタマイズしすぎてむしろファイラだけのために新しく xyzzy 自体を起動することもあります

40. フレームは使いますか?

  あまり使いません。新しく(Windows における)ウィンドウ

41. セッションは使いますか?

  使っていません

42. メーリングリストには参加していますか? また、メール送信したことはありますか?

  ありません

43. 2chxyzzy 関連スレッド書き込みしたことはありますか? また、その頻度はどのらいですか?

  大昔にどうしてもわからないことがあって書き込んだ記憶があります

44. xyzzywikiに書き込みしたことはありますか? また、その頻度はどのくらいですか?

  拡張機能実装に関してちょろっと書き込んだ記憶があります

45. xyzzyメニューは表示していますか?

  たまにほしくなるので表示しています

46. xyzzyツールバーは表示していますか?

  隠しています

47. xyzzyファンクションバーは表示していますか?

  表示していません

48. xyzzyバッファバーは表示していますか?

  表示していません

49. 色、フォントなどは変更していますか? またそれは何ですか?

  色は暗い背景色ハイライトカラーはできるだけ色相を離したパステルカラーです。

  フォントConsolas に源新ゴシック Regular を組み合わせています

50. 最後に、一言お願いします。

  まだまだ xyzzy は不滅です

2018-07-25

anond:20180725160741

こういうブコメがあった。

バカロレアの哲学問題に比べれば、日本は青少年を子供扱い。 - ko2inte8cuのコメント / はてなブックマーク

フランス(って書いてないけど、「バカロレア哲学問題」って言ってるから、それが毎年話題になるフランスのことだと思う)の文系バカロレア「bac-L」は、「誰でも受かる」ことで有名です。確かに問題のものは難しいかも知れないが、採点基準はとても甘いのでしょう。そう言う意味では確かに大人なのかも知れないけどね。比較に出すのはどうかなぁ。

フランスから帰国後しばらく経つ私であるが、久々に調べてみよ、と思った。

今年のbac-L哲学問題は以下の通りだったようです。翻訳は私訳です。ますだにフランス語が堪能な人がいるとは思うけどそんなに多くはないとは思うけど、ファクトとの対照という意味で、原文併記しておきます

(参照:BAC 2018 SÉRIE L SUJET ET CORRIGÉ PHILOSOPHIE

  1. 文化は我々をより人間的にするか?(La culture nous rend-elle plus humain?)
  2. 我々は真実を諦めることができるか?(Peut-on renoncer à la vérité?)
  3. 次の文章説明せよ(Expliquer le texte suivant)

Souvent nous ne savons pas ce que nous souhaitons ou ce que nous craignons. Nous pouvons caresser un souhait pendant des années entières, sans nous l’avouer, sans même en prendre clairement conscience; c’est que l’intellect n’en doit rien savoir, c’est qu’une révélation nous sembledangereuse pour notre amour-propre, pour la bonne opinion que nous tenons à avoir de nous-mêmes; mais quand ce souhait vient à se réaliser, notre propre joie nous apprend, non sans nous causer une certaine confusion, que nous appelions cet événement de tous nos vœux; tel est le cas de la mort d’un procheparentdont nous héritons.

Et quantà ce que nous craignons, nous ne le savons souvent pas, parceque nous n’avons pas le courage d’en prendre clairement conscience. Souvent même nous nous trompons entièrement sur le motif véritable de notre action ou de notre abstention, jusqu’à ce qu’un hasard nous dévoile le mystère. Nous apprenons alors que nous nous étions mépris sur le motif véritable, que nous n’osions pas nous l’avouer, parcequ’il ne répondait nullement à la bonne opinion que nous avons de nous-mêmes. Ainsi, nous nous abstenons d’une certaine action, pour des raisons purement morales à notre avis;mais après coup nous apprenons que la peur seule nous retenait, puisque, une fois tout danger disparu, nous commettons cette action.

SCHOPENHAUER, Le monde comme volonet comme représentation,1818.

3問目は長くて訳すの大変なのでご容赦ください。ショーペンハウエルみたいです。日本センター試験ショーペンハウエル文章のものが出るか、と言うと、出ることもあるかも知れませんが、まあ出ても4択問題だと思うので、確かに問題は難しいですね。

さて、確かにある意味難しい、難しいが、しかしこの試験は誰でも受かる。つまりちょっとウケ狙いなところがあることが否めません。多分これは「太陽は西から昇るか東から昇るか」と言う試験にしたとしても、おそらく受験者の点数分布は変わらないと考えられます。どうせ誰でも受かると言う状況下にある場合問題文そのもの難易度意味があるのかどうか不定になる、と言うある意味哲学的問いかけなのかも知れん。。。

いずれにせよそう言う試験な訳で、フランス人は誰もがこう言うレベルにある、と言うのはちょっと。そうは思えません。比較に出すのはちょっと間違いだと思います

ところでフランスではバカロレアセンター試験みたいなもので、一般大学はこれ以外に試験はありません。しかし一部のエリート希望の人は、準備学級を2年こなした上で、グランゼコール受験します。グランゼコール哲学は、本気で解くことを要求されます。こう言うとき問題難易度について論じる意味が出てくるのだと考えれます

グランゼコールの一つ、高等師範学校2015年入学試験は「説明せよ(Expliquer)」。この一問だけで、試験時間は6時間だったとのこと。

まあ、なんと言うか、ここまでくるとねぇ。

2018-07-14

痴漢についての日本人女性へのインタビュー動画が興味深い

What Japanese Girls Think of Chikan (molesting girls on trains)

https://m.youtube.com/watch?v=3yP0iGVNZmw

この動画が中々興味深い。

まず、インタビューを受けた女性のうち多くが、痴漢にあったことがあると言っている。

電車が揺れたからかなと思って距離を置いたら追いかけられた」という話も。

痴漢被害の多さに対して、コメ欄英語ばかりなのだが、ショックを受けた風の外国人コメントが集まっている。

Robzilla_92

Damn, it's really sad and heartbreaking to hear how many of them said yes to being molested...

更に、「痴漢はされた方にも悪いところがある。服装とか…」と答える女性もいた。(「スカート全降ろしの子痴漢されたので服装関係ない」と言ってる女子高生らもいたが)

それにショックを受ける外国人も多いようだ。

The comments that were the most shocking was that they would actually take part of the blame for the situation happening. Incredible

254

訳:「一番ショッキングだったコメントは、痴漢にあう方にも責任があるというコメント。信じられない」

Some Random Edgy Guy

Interesting, most women seem to think it's partly their fault, which is worrying. Maybe they're just too considerate and not wanting to give definitive judgement, but if someone molests then he (or she) is on the offensive, taking action and clearly to be blamed. It doesn't matter how short the skirt is or sth like that, if you grope - you're to blame.

2 か月前(編集済み)

18

訳:「興味深いことに多くの女性痴漢被害について自分にも非があると考えているのが心配だ。(略)スカートがどれほど短いかなんて関係ない、痴漢は悪であり、非難されるべきだ」


Taj Parker

It’s very depressing seeing the ratios. It should’ve been 100% the gropers fault. There’s things that i love about japan but the way they treat women brain washing them into thinking this is somehow their fault is unfathomable.

2 か月前

115

訳:100%非があるのは加害者側だ。日本について私が愛することは沢山あるが、女性痴漢被害者にも非があると考えるように洗脳されているのは恐ろしい。

更に、痴漢を捕まえたり訴えたりはしなかった、と皆答えている。

手続き煩雑から」「周りも見て見ぬ振りで助けてくれない」「現行犯じゃないと逮捕されないから」という答えに問題が詰まっているように思う。

Justin

Culture shock. Very passive attitudes toward sexual harassment.

2 か月前

24

訳:「彼女達の、セクシャルハラスメントに対する受容的な態度にカルチャーショックを受けた」

この動画インタビューを受けていた中には失礼ながらいわゆる美人とは言えない人もいた。

海外コメントは皆真剣に受け止めた内容だったが、日本人の反応は「自意識過剰だブス!」「冤罪が専用車両が」ばかりであろうことを考えると恥ずかしくなる。

案の定一つだけ冤罪がどうのというコメントあったけど、日本人の美少女アイコンオタクだったし。

2018-06-24

差別に関する利用規約を調べてみた

大雑把なまとめ

差別」や「ヘイト」などの表現が出てこないのは モバゲーNAVERniconicoYahoo!JAPAN ※すべて「他者権利侵害禁止」などの記載のみ

差別」の具体例が出てこないのは AbemaTVLivedoor小説家になろう

差別」の具体例が一番多いのが Facebookはてな11種 ☆はてな優秀!えらい!

ユニーク差別の具体例

Facebookの「移民ステータス」(移民の滞留資格のことでいいのかな?)

はてなの「収入

YouTubeの「従軍経験

メジャーサイト利用規約から差別に関する部分のみ抜粋ドメインアルファベット順)

対象にしたサイトはてなによく上がってきてコメント機能などがあるサイトをできるだけ網羅したつもりです。

URLがいっぱいあると投稿できないみたいなのでh抜きで書いてます

AbemaTV

ttps://abema.tv/about/terms

第8条(禁止事項)

(5)当社または第三者を不当に差別しまたは誹謗中傷する行為、当社または本サービス名誉・信用を毀損する行為

Ameba

ttp://helps.ameba.jp/rules/post_104.html

第13条(禁止事項)

4.本条第1項に定める禁止事項とは以下に定めるとおりとします。

(2) 他の会員や利用者、当社、その他第三者中傷したり、名誉を傷つけたりするもの権利侵害するもの

人種民族性別信条社会的身分居住地身体的特徴、病歴、教育財産等による差別につながる表現・内容の送信

Facebook

ttps://www.facebook.com/communitystandards/objectionable_content/

12. ヘイトスピーチ

Facebookが考えるヘイトスピーチとは、人種民族国籍信仰性的指向性別ジェンダー、性同一性、重度の病気や障がいなど、保護特性と呼ばれるもの理由に人々を直接攻撃することです。Facebookでは、移民ステータスに関する保護提供しています

GREE

ttps://pid.gree.net/?action=term_generic&amp;page=terms_pc

9. 禁止行為について

(1) 反社会的行為

i. 民族人種性別・年齢等等による差別につながる表現掲載行為

はてな

ttp://www.hatena.ne.jp/rule/rule

第6条(禁止事項)

2. ユーザーは、本サービスを利用するに際し、以下のような社会的不適切行為を行ってはなりません。

b. 人種民族信条性別社会的身分居住場所身体的特徴、病歴、教育財産及び収入等を根拠にする差別表現行為

Livedoor

ttp://www.livedoor.com/rules/

1.4 禁止行為

1.4.1 禁止事由

3.他者差別もしくは誹謗中傷し、他者名誉もしくは信用を毀損侮辱し、もしくは業務妨害する行為、または、そのおそれのある行為

モバゲー

ttp://www.mbga.jp/www/kiyaku.html

第5条 モバゲー会員記述情報について

1.~前略~モバゲー会員は以下の情報記述することはできません。

d. 特許権実用新案権意匠権商標権著作権肖像権その他の他人権利侵害するもの

NAVER

ttps://help.naver.jp/rules/

第3条(禁止事項)

(2) 公の秩序または善良の風俗を害するおそれのある行為(過度に暴力的表現露骨性的表現、その他反社会的な内容を含み他人不快感を与える表現投稿掲載、公開、送信する行為などを含みます。)。

(3) 当社または第三者権利著作権商標権特許権等の知的財産権名誉権、プライバシー権、その他法令上または契約上の権利を広く含みます。)を侵害する行為

niconico

ttp://ex.nicovideo.jp/base/guideline

3.コンテンツによる表現の自由は無制限ではありません

他者権利侵害する行為

例)

他者名誉社会的信用、評判、プライバシー侵害する内容

他者基本的人権著作権等の知的財産権、その他の権利侵害する内容

note

ttps://note.mu/terms

8.禁止事項

差別につながる民族宗教人種性別・年齢等に関するもの

小説家になろう

ttps://syosetu.com/site/rule/

第14条 禁止事項

3. 当グループもしくは他者を不当に差別もしくは誹謗中傷し、他者への不当な差別助長し、又はその名誉もしくは信用を毀損する行為

Togetter

ttps://togetter.com/info/terms

第6条 禁止行為について

4. トゥギャッター若しくは第三者を不当に差別若しくは誹謗中傷し、又はトゥギャッター若しくは第三者の信用若しくは名誉プライバシー権パブリシティ権肖像権若しくはその他一切の権利侵害する行為若しくは侵害するおそれのある行為

7. 国籍民族人種社会的身分性別思想、信教、又は年齢等に関する差別的な表現一般ユーザーが感じ得る行為

Twitter

ttps://help.twitter.com/ja/rules-and-policies/twitter-rules

攻撃的な行為ヘイト行為

ヘイト行為: 人種民族出身地信仰している宗教性的指向性別、性同一性、年齢、障碍、深刻な疾患を理由とした他者への暴力行為脅迫嫌がらせ助長する投稿を禁じます

Yahoo! JAPAN

ttps://about.yahoo.co.jp/docs/info/terms/chapter1.html

第1章 総則

7. サービス利用にあたっての順守事項

(2) 社会規範公序良俗に反するものや、他人権利侵害し、または他人迷惑となるようなものを、投稿掲載、開示、提供または送信(以下これらを総称して「投稿など」といいます)したりする行為

YouTube

ttps://support.google.com/youtube/answer/2801939?hl=ja

悪意のある表現とは、次のような特性に基づいて個人集団に対する暴力助長したり差別扇動したりするようなコンテンツを指します。

人種または民族出自

宗教

身体障がい

性別

・年齢

従軍経験

性的指向性 / 性同一性

2018-06-05

メルカリのデパコスのやつ

↓これな

http://b.hatena.ne.jp/entry/s/note.mu/marketing/n/n4e8afefe647d

想像力ないやつ多すぎて笑った。

特に公式通販してるし他のECでもあるから」って当たり前のように指摘してるやつが大量の☆ついてたけどさ、

そもそも公式通販してる」って発想まで行きつかないユーザーが多いかメルカリあんなデパコス売れてるんじゃないの?

あの記事本質メルカリユーザー世界の狭さを表してると思うんだ。

彼女らのインタビューを見てみればわかるけど、出てきている情報調達手段が「YouTuber」「twitter」「LIPS」「メルカリしかないんだぜ。

おそらく他の通販があるという考えを脳みそシャットダウンしているか思考停止してんだよ。

地元にはデパートが無い。という負の感情が「通販で買える」という考えを遮っている気がする。

消費者心理プロセスに「AIDMA」ってあるだろ。今は電通が「AISAS (注意・関心・検索・購入・共有)」として提唱してるやつな。

俺はこの記事を読んで、今はもう「AISAS」の時代じゃないって思ったね。

・Attention(注意)

・Interest(関心)

この時点で一旦思考停止するやつが多いんだよ。

からこの後に

・Given(与えられる)

が付いて、その後

・Search(検索

Action(行動、購入)

Share(共有)

が続く。つまり「AIGSAS」になってんだ。

他者から情報や知恵を与えられない限り動くことの出来ない奴が増えてるって怖くないか

これが日本だけなのか世界で起きてることなのかわからないが、日本だけで起きてんなら義務教育期間の教え方が悪いんだろうよ。

Siriかにオススメのディナーをとか言ってるやついるけど自分で調べろよって思うね。あれも与えられた情報に従って行動してるやつじゃん。

脳みそ停止してるやつら多くて怖くて震えるわ

2018-05-26

By Lick Watermelon May 25, 2018 588 米国驚愕法案下院を通過した。その名も「国民死刑制度」だ。これは相次ぐ銃犯罪への対抗策として提出された一連の法案の一部で、この法案国民は誰でも任意相手死刑にできるという衝撃の内容だ。法案を提出した野党連合代表ロバートエリクソン議員は「アメリカ潜在的世界中の銃犯罪の温床になってきました。国民銃社会を脱却するときに来ています。銃に代わって国民を守るのがこの法案です」と語る。同制度では各州政府に設置される投票箱にアメリカ人の氏名・年齢・住所・職業などを記入して投函すると、アイデンティティ確認された人物を無条件に死刑にできる。在職中のアメリカ大統領および議会議員など任期中の執行猶予されるというが、例外は一切認められていない。エリクソン議員によれば「現在では読み書きができれば銃を手に入れ、任意人物を射殺することができますが、実際には銃撃によって国民が半減するには至っていません。この制度でも同様の難しさであらゆる人物排除できますが、相互の信頼と隣人愛が正しく機能していれば乱用される事例は起こらないはずです」とのこと。また、執行事務処理などを経て早くて1週間程度を要すると見積もられている。

全文→https://www.nytimes.com/2018/05/25/us/politics/banks-gun-sales-republicans.html?rref=collection%2Fsectioncollection%2Fpolitics&action=click&contentCollection=politics&region=stream&module=stream_unit&version=latest&contentPlacement=3&pgtype=sectionfront

2018-04-19

ELECTRICAL COMMUNICATION

引き裂かれてる IMAGINATION

誰にも 邪魔させない

Sparkしてる ROCK ACTION

打ち砕け MEDITATION

狂った現実(いま)を焼き捨てたい

2018-02-25

さらPDCA時代はOODA

OODAループは「観察(Observation)・情勢判断(Orientation)・意思決定(Decision)・行動(Action)」の4段階からなる。

最初の観察では五感を駆使して現実をあるがままに直観し、暗黙知的に知覚する。

最新の脳科学でも知覚的な情報ほとんど身体が吸収し、脳はそこからしみ出る一部の情報認識していることが判明している。

次の情勢判断では、過去経験自身資質、身についた文化など自らが蓄積してきた暗黙知と新たに知覚した情報をもとに判断する。

そして、対応策を意思決定し、行動に移す。

OODAループ対照的なのがPDCAサイクルだ。「計画(Plan)・実行(Do)・評価(Check)・改善Action)」のプロセスのうち、計画(P)はOODAループ意思決定(D)に相当する。

富士フイルムホールディングス古森重隆会長は、PDCAサイクル見直し、See-Think-Plan-Do(STPD)というサイクルに改良したが、この前段階にあたる「See-Think(観察・判断)」の重要性を訴えているほどだ。

2018-02-07

はてなブックマークタグを一括置換するiMacrosのコード(無保証)

何で一括置換機能消えたん……

VERSION BUILD=1001 RECORDER=CR
SET !REPLAYSPEED MEDIUM
SET !ERRORIGNORE YES
URL GOTO=http://b.hatena.ne.jp/username/OKIKAE/
TAG POS=1 TYPE=A ATTR=CLASS:js-keyboard-entry-page-openable
TAG POS=1 TYPE=IMG ATTR=ALT:ブックマーク編集
TAG POS=2 TYPE=LI ATTR=TXT:OKIKAE
TAG POS=1 TYPE=LI ATTR=TXT:オキカエ
TAG POS=1 TYPE=INPUT:SUBMIT FORM=ACTION:/my/bookmark ATTR=*
WAIT SECONDS=20

ユーザ名usernameで使用してる「OKIKAE」タグを「オキカエ」に一括置換する場合Chrome版で実行済み。最後20秒待ってるのは、置換後に一覧ページへ反映されるのが遅れる為。

ただ自分でやった時(当然ユーザ名・タグは別の名前)に、2013年11月頃の分で一向に置換されないままループしたりで安定しない。

2017-10-19

黒澤ルビィちゃんが好きだ

私はルビィちゃんの歌声が一番素敵だと思った

Landing action Yeah!!のソロをぜひ聴いてほしい

とてもかっこいいよ

見た目や普段の声とのギャップハートをぐっと掴まれ

 

正直、ルビィちゃんを人気ないいじりして良いという空気があるから

便乗していじってる奴もすごい居ると思う……

2017-09-08

PDCAサイクルいまいちからない。

Plan・Do・Checkはいいとして、Action改善活動をすることだからActionには「改善計画改善の実行→改善効果の計測」を含む。

サイクルしているのは実際にはPDCで、Aは何かレイヤーが違う。

「2週目以降のPDCの組」がAになるような。

イメージとしてはこんな感じ。

P→D→C→A→A→A→...

A=(P→D→C)

2017-08-01

教育委員会対応

7月28日

松本ビアフェス」開けず 市教委が内規改正、「自粛」を要請

http://www.shinmai.co.jp/news/nagano/20170728/KT170727FTI090017000.php


7月31日

市の担当者取材に対し、「自粛要請したつもりはなかったが説明不足だった点は反省しなければいけない」としています

http://sbc21.co.jp/news/index.cgi?page=seventop&date=20170731&id=0309974&action=details


8月1日

松本市教委側 落ち度認める ビアフェス自粛要請

http://www.shinmai.co.jp/news/nagano/20170801/KT170731FTI090030000.php

教育委員会対応は良いと思う。

ただ今日記事にある、

内規は「飲酒全般」の自粛を求めたのではなく、騒いだり観光客の妨げになったりする行為問題視し、

という部分が、これまで行われたビアフェス内で泥酔して騒ぐ輩がいたからなのか、

それともただ単に品格の建前なのか、どっちだろう。

2017-07-24

責任」という言葉が嫌い

使われ方が曖昧すぎるんだよ

 

責任(せきにん、英: responsibility/liability)とは、元々は何かに対して応答すること、応答する状態意味しており、ある人の行為が本人が自由に選べる状態であり、これから起きるであろうことあるいはすでに起きたこと の原因が行為者にあると考えられる場合に、そのある人は、その行為自体行為の結果に関して、法的な責任がある、または道徳的責任がある、とされる。 何かが起きた時、それに対して応答、対処する義務の事。

 

上記はwikipediaから

曖昧って言ったけど、言葉のものはそこまで曖昧じゃない

 

「Aに対してBする責任がある」と言うと

「Aに何らかの不備が生じた、あるいは生じる可能性があるときに、Bしなければならない」って意味

 

プログラムで考えると分かりやす

責任という言葉には引数が2つある。責任対象(Reason)と、行為(Action)だ。

 

だけど世間の「責任」の使われ方はどうだ?

Actionが抜け落ちている。酷いときにはReasonも抜け落ちている。

何をしてほしいのかまるでわからない、何に対して責任あるかも曖昧

ただただ避難するためだけに「責任」という言葉を使い

はいだって「結局何をしてほしいんですか?」と聞く羽目になる

 

そんなシーンは世の中至る所で見かける

言葉も満足に使えないバカがやたら「責任」を使いたがる

もっと別の言葉に置き換わってもらえないだろうか

ReasonActionを述べないと使えないような語に。

2017-05-25

[]一応マニュアルのとこ

http://anond.hatelabo.jp/20170524171732

id:yosukegatzさん

FAQはあくまFAQだからね。手続き正当性をなぜFAQでみているのか、どの部分を持って手続き問題がある、とツイート主がおっしゃってるのかわかりませんが、マニュアルにちゃんと書いてあって、ふつうに執り行われてる手続きであるとは思いますよ。そもそも国連特別報告者はあくまで準司法quasi-judicialで、問題提起大事だって書いてあるし、これが初動なわけだから、内容が不適切だとおっしゃるなら質問にちゃんと答えりゃいいんですよ。とりあえずツイート主が言ってることは根拠がないですよ。むしろ人権侵害がある国にこそ公開でやることで回答する動機づけをしてるのは明らかだし。

国際機関を含む多国間交渉の場は利害も考え方もまちまちだから手続き大事で、そこを外すと何も進まなくなる。日本政府問題を指摘しつつも誠実に対応する(ことが求められる)が、他の国(人権侵害のひどい国)なら「回答する前に書簡政府攻撃に使われた」として回答拒否の口実にしてくるはず。

これは実例に照らして真反対。緊急性や重大性が低く、相手がちゃんと回答してくる可能性が高い場合にこそconfidentialにしている。

今回の書簡基本的には「質問」であり、当該政府からの回答に加え、別途行ったその他の調査内容と合わせて検討し、国連人権理事会報告書を提出するのが特別ラポルトゥールへの委託内容。その報告書はまだ単なる個人作成文書であるがこの時点で公開されて議論対象となる。書簡公開はルール違反

これも事実誤認ルール違反じゃない。ちゃんと書いたように,マニュアルに認められている。

送られた書簡とそれに対する受け取った回答の文章は、受任者が対応した報告書作成するときまで機密にするか、受任者が、特定の状況によって、それ以前に行動が必要であると決定する。

37. The text of all communications sent and responses received thereon is confidential until such time as they are published in relevant reports of mandateholders or mandate-holders determine that the specific circumstances require action to be taken before that time.

プレスリリースを即座にすることも認められている。

重大な懸念や、政府書簡に対して本質的な回答が出来ない状態が続く場合などの適切な状況では、受任者は個人で、あるいは他の受任者(特別報告者、作業部会など)プレスリリースプレスカンファレンス、その他の公的意見表明などを行う場合がある。

一般的に言って、受任者は政府との対話の中で、プレスリリースなどのプレス向けの声明を発出する前にそのことを明らかにするべきである。受任者が、書簡の中で、プレスリリース等をすぐにおこなう意向を示したい時は、書簡の中にそのような意向記載することが出来る。受任者は、懸念された国からの応答に対しても公平に明らかにするべきである

49. In appropriate situations, including those of grave concern or in which a Government has repeatedly failed to provide a substantive response to communications, a Special Procedure mandate-holder may issue a press statement, other public statement or hold a press conference, either individually or jointly with other mandate-holders.

50. In general, mandate holders should engage in a dialogue with the Government through the communications procedure before resorting to a press release or other public statement. When a mandate holder sends a communication with the intention of issuing a press release shortly thereafter, such intention could be indicated to the Government in the communication. Mandate holders should indicate fairly the responses provided by concerned States.

とされているように、初動が一方的に公開であることは別に認められているし、反論公平性は、反論文を同じ場所に掲示することで保とうという意思が見える。

また前に書いたように、イギリスのSnooper's charterについては、就任直後にガーディアンインタビューでいきなり問題提起しており、不必要テロ危険性をマスコミ翼賛的に報道している状態に苦言を呈しているけど別にイギリスは「反論の機会もなしにメディアでしゃべるなんて!」とも批判もしてない。(なぜインタビューされたかというと、このケナタッチ氏の就任は、アメリカメルケルとかを盗聴してたことが明らかになったのちだったので、親アメリカ派のエストニア候補が反対されたという経緯でヨーロッパではその就任が注目されていた。)そしてイギリス政府は、ガーディアン政府見解を送り、ガーディアンもそれを掲載した。ただそれだけの話なんだよ。

 当然指摘は一方的になされるので、誤認があるなら反論すればいいだけなんだよね。我が国対応が際立ってみっともないだけ。

とりあえずツイート主はFAQじゃなくってマニュアルを読んだ方がいい。

2017-05-02

マストドンAPI

マストドンリポジトリ

ttps://github.com/tootsuite/mastodon

マストドンAPIリファレンスAPI実装済みのライブラリ(サードティ)の紹介

ttps://github.com/tootsuite/documentation/blob/master/Using-the-API/API.md

マストドンAPIに関するドキュメントが置いてあるディレクトリ(色々ある)

ttps://github.com/tootsuite/documentation/tree/master/Using-the-API

マストドンアプリ認証にdoorkeeperを使ってるので認証APIはこっちを参照する必要がある

ttps://github.com/doorkeeper-gem/doorkeeper/wiki

マストドンドキュメントで紹介されてるAPI実装済みのライブラリ(サードティ)を使うのが一番ってっとり早い

以上

=====

わざわざ自前でAPIを叩くコードを書く

step1

アプリマストドンサーバー登録する

ttps://github.com/tootsuite/documentation/blob/master/Using-the-API/API.md#apps

POST /api/v1/apps

必要データをPOSTするだけ、難しくない

アプリ登録をわざわざコーディングする場合ライブラリとして作って提供する場合くらい(?)

(アプリ複数インスタンス対応させる場合はやはりコード書くしかないけど)

(登録したIDを自前サーバーで持って同一アプリで共有するとか?)

別にhtmlフォーム作って送信するだけでも登録できる

(ローカルhtmlファイル作ってブラウザ表示して必要入力してsubmit送信するだけ簡単)

<form name="regsterapp" method="POST" action="http://SERVERNAME/api/v1/apps">

<input name="client_name" type="text" value="">

<input name="redirect_uris" type="text" value="urn:ietf:wg:oauth:2.0:oob">

<input name="scopes" type="text" value="read write follow">

<input name="website" type="text" value="">

<input type="submit"></form>

step2

ユーザに対してのアプリ認証

doorkeeperについて知る必要がある

ttps://github.com/tootsuite/documentation/blob/master/Using-the-API/Testing-with-cURL.md

このページに書いてあるgrant_type=password認証法ではread権限しか貰えないぽい

grant_type=authorization_codeで認証する必要がある、これ読めば早い

ttps://github.com/doorkeeper-gem/doorkeeper/wiki/Authorization-Code-Flow

GET /oauth/authorize

必要パラメータ(※1)つけたリンクアプリ認証したいユーザに踏んでもらい許可を押してもらった上でそこで表示されるコード(RETURNED_CODE)を使う必要がある

(自前サーバーなどでリダイレクトで受け取ることもできるけど)

その表示されたコード(RETURNED_CODE)を使って次のAPIを叩くと認証完了する(アクセストークンをゲットできる)

POST /oauth/token

これもただのPOSTになるのでそんなに難しくない

さっきのアプリ登録みたいにhtmlとかで簡易にもできるけどアプリ秘密キーを使うので公開はダメでしょうな

※1

ttp://SEVERNAME/oauth/authorize?client_id=YOUR_CLIENT_ID&amp;redirect_uri=urn:ietf:wg:oauth:2.0:oob&amp;response_type=code&amp;scope=read+write+follow

scopeというパラメータで取得したい権限指定する必要がある

step3

認証終わってアクセストークンをゲットしたらもうAPI使えるので

ttps://github.com/tootsuite/documentation/blob/master/Using-the-API/Testing-with-cURL.md

これの2番目に書いてあるようにHTTPのヘッダに Authorization: Bearer ACCESS_TOKEN を加えてから

APIの叩けばよい

toot(トゥート)はAPIドキュメントではstatusという表現になってる

ttps://github.com/tootsuite/documentation/blob/master/Using-the-API/API.md#statuses

POST /api/v1/statuses

がtootするためのAPI

2017-04-01

[]AAR

After Action Report の略で、ゲームプレイレポートあるいはプレイ動画のこと。

特に Paradox Interactive 社製のゲームプレイレポートを指してそう言われることが多い。

2017-03-16

PPAP:

I have a Plan.

I have a Action.

ummm oh

PDCA!

I have a Plan.

I have a Market Perspective.

ummm oh

4P!

We have a PDCA.

We have a 4P.

ummm oh

Plan-Plan-Action-Plan!

Plan-Plan-Action-Plan!

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