A Day In The Boy's Life -95ページ目

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

CKEditor は、高機能でありながらもカスタマイズも可能で、ブログの書き込み画面のようなボタンによる編集を容易に実現できるWYSIWYGエディタです。

デモページ も同サイト内に公開されています。


WYSIWYGエディタは、数々公開されていたりしますがあまりにも多機能すぎるとアプリに適用した際に、ユーザーが使いこなせなかったり、複雑すぎるところからサポートが返って面倒になったりもします。

なので、提供される機能からさらに一部を公開したり、アプリの画面要件に沿ってうまく組み込めたり出来るものが無いかを探しているときに見つけました。


しかも日本語に対応してくれていますので、ボタンの説明(alt属性)がちゃんと日本語で表示されます。

また、フォーム要素(テキストボックスやラジオボタン、チェックボックスなど)を埋め込む機能もあるため、カスタマイズ次第ではCMSのアプリを作ることも可能かもしれません。


ライセンスは、オープンソースライセンスで利用するものに関して(個人や社内で利用する場合など)はフリーで利用可能、コマーシャルライセンスで利用する場合(CKEditorをネットに公開しているページや製品に組み込む場合など)は、別途ライセンス料を支払わなければなりません。



CKEditorのインストールと設置


インストール方法は、ソースをダウンロード後にドキュメントルートの適当な場所に展開するだけで利用可能です。

サンプル用のスクリプトが(_samples/)に格納されているので、まずはそちらにアクセスしてみるのがよいかと思います。


- /ckeditor/_samples/index.html
A Day In The Boy's Life-CKEditor-1


実際にアプリを動かす環境では、上記の_samplesディレクトリやインストール方法が記載されたファイル(INSTALL.html)、ライセンスに関するファイル(LICENSE.html)、チェンジログに関するファイル(CHANGES.html)などは削除しておきましょう。


サンプルのスクリプトをベースにして、CKEditorを組み込んでみます。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Replace Textareas by Class Name - CKEditor Sample</title>
    <meta content="text/html; charset=utf-8" http-equiv="content-type" />
    <script type="text/javascript" src="/ckeditor/ckeditor.js"></script>
</head>
<body>
  <h1>CKEditor Sample</h1>
<div id="alerts">
<noscript>
  <p>
    <strong>CKEditor requires JavaScript to run</strong>. In a browser with no JavaScript
    support, like yours, you should still see the contents (HTML data) and you should
    be able to edit it normally, without a rich editor interface.
  </p>
</noscript>
</div>
<form action="posteddata.php" method="post">
  <p>
    <textarea class="ckeditor" cols="80" id="editor1" name="editor1" rows="10"></textarea>
  </p>
  <p>
    <input type="submit" value="Submit" />
  </p>
</form>
</body>
</html>


この状態で見てみると、こんな感じに表示されます。


- 初期画面のイメージ
A Day In The Boy&#39;s Life-CKEditor-2



CKEditorをカスタマイズする - 不要なボタンの削除 -


カスタマイズ用に、インストール後のディレクトリにはconfig.jsというファイルが含まれているのですが、ここで記載した内容はckeditorを利用する全てのアプリケーションに適用されるので、個別に利用するHTMLファイルごとに設定を追加して行くやり方を取ります。


まずは、あまりに機能が多いとユーザーも返ってわかりづらいため、多機能なボタンを減らすカスタマイズをして見ます。

ckeditor.jsを読み込んでいるすぐ下に、下記のようにscriptタグで表示したいボタン名を指定します。

下記は、フルバージョンで利用したい場合です


<script type="text/javascript" src="/ckeditor/ckeditor.js"></script>
<script type="text/javascript">
CKEDITOR.config.toolbar = [
['Source','-','Save','NewPage','Preview','-','Templates']
,['Cut','Copy','Paste','PasteText','PasteFromWord','-','Print','SpellChecker']
,['Undo','Redo','-','Find','Replace','-','SelectAll','RemoveFormat']
,['Form','Checkbox','Radio','TextField','Textarea','Select','Button','ImageButton','HiddenField']
,'/'
,['Bold','Italic','Underline','Strike','-','Subscript','Superscript']
,['NumberedList','BulletedList','-','Outdent','Indent','Blockquote']
,['JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock']
,['Link','Unlink','Anchor']
,['Image','Flash','Table','HorizontalRule','Smiley','SpecialChar','PageBreak']
,'/'
,['Styles','Format','Font','FontSize']
,['TextColor','BGColor']
,['ShowBlocks']
];
</script>


なんとなくわかると思いますが、ボタンの識別子が羅列しているので、ここから表示したいものを残して不要なものを削除していきます。

[]のブロックまたは「-」を入れると、同じボタンを囲む枠内に表示され、「/」を入れるとその位置でボタンの枠がページ内で折り返す仕様になります。


今回消すのは、


・ ソースの表示(Source)

・ 保存(Save)

・ 新しいページ(NewPage)

・ プレビュー(Preview)

・ テンプレート(Templates)

・ ワード文章から貼り付け(PasteFromWord)

・ 印刷(Print)

・ スペルチェック(SpellChecker)

・ 検索(Find)

・ 置換(Replace)

・ フォーム(Form)

・ チェックボックス(Checkbox)

・ ラジオボタン(Radio)

・ テキストボックス(TextField)

・ テキストエリア(Textarea)

・ 選択フィールド(Select)

・ ボタン(Button)

・ 画像ボタン(ImageButton)

・ 不可視フィールド(HiddenField)

・ ブロック引用(Blockquote)

・ アンカー挿入/編集(Anchor)

・ Flash挿入(Flash)
・ 絵文字(Smiley)

・ 改ページ挿入(PageBreak)

・ スタイル(Styles)

・ フォント(Font)

随分と消しますが、ブログの入力フォームのようなアプリを作りたい場合は、不要かなと。

保存やプレビューはCKEditorの機能を使わなくても代替は作れると思いますし。


編集後のソースは、下記のようになります。


<script type="text/javascript">
CKEDITOR.config.toolbar = [
['Cut','Copy','Paste','PasteText']
,['Undo','Redo','-','SelectAll','RemoveFormat']
,['Bold','Italic','Underline','Strike','-','Subscript','Superscript']
,['NumberedList','BulletedList','-','Outdent','Indent']
,['JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock']
,['Link','Unlink']
,['Image','Table','HorizontalRule','SpecialChar']
,'/'
,['Format','FontSize']
,['TextColor','BGColor']
,['ShowBlocks']
];
</script>

上記のスクリプトを組み込むと、下記のように画面が随分とシンプルになります。


- ボタンをなくしてシンプルにカスタマイズ
A Day In The Boy&#39;s Life-CKEditor-3



CKEditorをカスタマイズする - テキストエリアの名前、リサイズ、高さ・幅の設定 -


テキストエリアの名前(name属性)とidは自由に設定可能です。

ただし、クラス名は「ckeditor」としておく必要があります。


<textarea class="ckeditor" cols="80" id="blog" name="blog" rows="10"></textarea>


デフォルトだと、テキストエリアは画面の大きさに合わせて伸縮し、またその中でユーザーが自由にリサイズできるようになっています。

これを禁止するには、ボタンの削除のときと同様に独自のscript内に下記のように定義しておきます。


<script type="text/javascript">
// テキストエリアのリサイズ不許可
CKEDITOR.config.resize_enabled = false;
</script>

テキストエリアのリサイズを禁止した場合、一定の幅や高さに設定しておきたい場合もあると思いますが、下記のように設定することで対応できます。


<script type="text/javascript">
// テキストエリアの幅
CKEDITOR.config.width  = '800px';
// テキストエリアの高さ
CKEDITOR.config.height = '300px';
</script>


また、リサイズを許可しておく場合、テキストエリアの最小の幅・高さ、最大の幅・高さを設定することも可能です。


<script type="text/javascript">
// 幅の最大値
CKEDITOR.config.resize_maxWidth  = 800;
// 幅の最小値
CKEDITOR.config.resize_minWidth  = 200;
// 高さの最大値
CKEDITOR.config.resize_maxHeight = 300;
// 高さの最小値
CKEDITOR.config.resize_minHeight = 200;
</script>


その他、CKEditorには細かなカスタマイズが可能です。

詳細は、ドキュメントページ に記載されています。



CKEditorを組み込んだアプリケーションを作ってみる


これだけ高機能なエディタ機能を搭載しているので、簡単なブログシステムであれば構築可能です。

ここでは、入力フォームにCKEditorを組み込み、それを保存(今回はサーバー上のファイルに)する簡単なアプリケーション(PHP)を作ってみます。


確認画面や登録完了画面などは面倒なので今回は省略。

1ファイルのみで動作するようにしています。


<?php

// タイトルと本文を保存するファイルのパス
$title_file_path    = "/path/to/title.txt";
$contents_file_path = "/path/to/contents.txt";

if (!empty($_POST['action']) && $_POST['action'] === "put") {
    if ($_POST['contents'] !== "" && $_POST['title'] !== "") {
        $fp = fopen($title_file_path, "w");
        fwrite($fp, htmlspecialchars($_POST['title']));
        fclose($fp);
        $fp = fopen($contents_file_path, "w");
        fwrite($fp, htmlspecialchars($_POST['contents']));
        fclose($fp);
    } else {
        echo "Error!";
        exit;
    }
}

// タイトル用ファイルがあれば内容を取得
if (file_exists($title_file_path)) {
    $title = file_get_contents($title_file_path);
} else {
    $title = "";
}

// 本文用ファイルがあれば内容を取得
if (file_exists($contents_file_path)) {
    $contents = file_get_contents($contents_file_path);
} else {
    $contents = "";
}

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Replace Textareas by Class Name - CKEditor Sample</title>
    <meta content="text/html; charset=utf-8" http-equiv="content-type" />
    <script type="text/javascript" src="/ckeditor/ckeditor.js"></script>
    <script type="text/javascript">
CKEDITOR.config.toolbar = [
['Cut','Copy','Paste','PasteText']
,['Undo','Redo','-','SelectAll','RemoveFormat']
,['Bold','Italic','Underline','Strike','-','Subscript','Superscript']
,['NumberedList','BulletedList','-','Outdent','Indent']
,['Link','Unlink']
,'/'
,['JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock']
,['Image','Table','HorizontalRule','SpecialChar']
,['Format','FontSize']
,['TextColor','BGColor']
,['ShowBlocks']
];
// テキストエリアの幅
CKEDITOR.config.width  = '600px';
// テキストエリアの高さ
CKEDITOR.config.height = '300px';
// テキストエリアのリサイズ不許可
CKEDITOR.config.resize_enabled = false;
    </script>
</head>
<body>
    <h1>
        My Blog System
    </h1>
<div id="alerts">
<noscript>
  <p>
    <strong>CKEditor requires JavaScript to run</strong>. In a browser with no JavaScript
    support, like yours, you should still see the contents (HTML data) and you should
    be able to edit it normally, without a rich editor interface.
  </p>
</noscript>
</div>
<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="post">
  <p>
  <input type="text" name="title" value="<?php echo $title; ?>" size="95" />
  </p>
  <p>
    <textarea class="ckeditor" cols="80" id="contents" name="contents" rows="10"><?php echo $contents; ?></textarea>
  </p>
  <p>
    <input type="submit" value="Submit" />
<input type="hidden" name="action" value="put" /> </p> </form> </body> </html>

データは、HTMLタグがそのまま送られてくるため、フォームデータのHTMLタグをエスケープして保存、対象ファイルがあったら読み込んで、それをテキストボックスとテキストエリアにセットすると言うだけのものです。


- 表示イメージ


A Day In The Boy&#39;s Life-CKEditor-4


手軽に入力フォームに組み込むことが出来るため、BBSやブログやCMSなどなど色々なシステムに組み込めると思います。





わたしが新入社員の時に学んだこと @ タイム・コンサルタントの日誌から


凄く納得してしまった。

自分の最初の3年と言うのは、何も無い環境から始まったりしました。

先輩もいない、システムも無い、ノウハウも無かったりする状況。

ちょうど社内の情報システム部の立ち上げ期に入社したため、いたのは上司と数人の同僚だけ。

ここから社内で必要な情報システムの構築に携わることができたわけですが、今の時代ではあまり味わえない環境と言うものがそこにあったりして、非効率ながら貴重な経験をしたな、って今では思ってたりします。



何も無い環境から作る贅沢


今の時代、会社に勤めだせばすでにある程度の情報システムやら社内インフラというものは整備されていたりします。

それを一から自分たちで作ると言うことは、かなり贅沢なことなんだなと思ったりします。

自分たちが思い描くシステムを設計でき、機器を調達でき、構築が出来たりするわけです。


すでにシステムが存在している場合、そのリプレイスを担当することになったとしても、その前システムの制約を受けることもあるでしょう。

先輩エンジニアがいる場合、上流工程などは先輩が担当して、新人の自分たちは設計されたシステムを黙々と構築していく担当と言う場合が多いでしょう。

与えられた権限と言うものは最小限にとどめられ、自分たちが作るシステムへの裁量権と言うはほぼ無いに等しいのではないでしょうか。


入社したときに「何も無い状態」というものが今ではほとんど無いわけです。

ITというものが企業にとって切っても切れない関係になっている以上、これは当たり前の状況かもしれません。

業務のためのマニュアルが存在し、何のために作っていくか、どのような仕組みで動いているか、何故やらなければならないのか、というコアにある部分をすっ飛ばされて知識だけが積み込まれていったりもします


教育の効率化を考えればこそなのかもしれませんが、上辺だけのノウハウを伝えていって、その根幹にある思想や背景などは共有されもしなかったりします。

それって業務を遂行するだけであればあまり必要の無いものかもしれません。

ですが、それをすっ飛ばして開発や運用を新入社員たちに任せるうえで、どうにもその構築や運用を自分たちが行っているという感覚や愛着がもてなかったりもします。

何せ自分たちが作っている、動かしていると言う感覚がないわけですから、淡々と目の前にある業務をこなしていけばいいんだな、ってことしか思えなかったりもするわけです。


もちろん何も無い環境と言うのは、いいことばかりでもありません。

自分たちで全てのことを作業しなくてはなりませんし、ある程度の責任を自分たちで負ってやっていかなくてはなりませんし、言い訳するにしても言い逃れできる環境でもありません。

ただ、だからこそ自分たちで作り上げている感覚や喜びと言うものを強く得られたんだろうなとも思います。



非効率なやり方から学んだこと


何も無いところから作り上げるのは非効率なやり方でもあります。

各企業には長年積み上げてきたノウハウがあり、熟年のエンジニアには豊富な経験からベストプラクティスを知っていたりもします。

そういうのに頼ることができず、自分たちの限られた知識の中で試行錯誤しなくてはなりません。


自分もまた開発の経験など、大学でほんの少し学んだぐらいでシステムを作れと言われても、ググったり(当日はかなり情報が少なかったですが)書籍に頼ったりもする日々でした。

失敗したり、何度も作り直すことで何がよい方法かというのを経験の中から学ぶことができました。

今思えば、開発技法やプロセスと言うもは、常に5年遅れぐらいのことをやってたんだと思います。

ただ、先人たちが失敗して技を磨き上げて言ったように、自分たちも遅れながらもそのプロセスをたどっていけたことは、失敗の経験を通して何がよいか、何がダメなのかを理解しながら進むことができ、今ではよかったと感じています。


教育する上では、その非効率っていうものは排除する傾向にあります。

一日でも早く業務を覚えさせて、現場を任せるようにしたいと言う思いが教育する担当者にもあるでしょうから、そんな歴史的背景やプロセスをたどらせることは時間が取れないでしょう。

失敗から学ぶことは多いわけですけど、成功法しか教わらないわけです。

なので、失敗に遭遇したときにどう成功にリカバリすることができるのかその対処すればよいのかがわからなかったり。

昔、研修で「飢えてる人に出会ったら魚をあげるんじゃなくて、魚の釣り方を教えなさい」って言われたことがありましたが、プロセスを理解した方が応用が利くんだなって思います。


ある程度社会人歴をこなした人に考え方を一から教えても、前の経験が邪魔をしたりもします。

自分の中である程度その方法で成功したりすると、独自の考え方が頭に根付いたりします

考え方を180度変えるというのは至難です。


自分はあまり論理的な思考と言うものを最初に学ぶことはできませんでした。

ただ、非効率なやり方をしてたからこそ、常によりよい方法は何かを考える癖がつきましたし、とりあえず何でもやってみようと言う行動力が身につきましたし、自分たちで何でもすることへの抵抗感がなくなったりしました


そしてその中で、エンジニアとしてシステムを作る楽しさを知り、作ったものが使われる喜びを知り、作ったものから得られる感謝を感じることができました。

愚直でもその最初に得た経験を元に今も働いていたりしています。





Twitterに限った話じゃなくて、ブログとかも相互読者登録お願いしますみたいな依頼がきたりもするんですが、そういうものって個人的にあまり関心が無かったりします。

理由は、自分の興味やつながりは個人が決めることであって誰からも強要されたくないこと、相互フォローしないと登録してくれないっていう自分本位の考えが見え隠れする点、双方につながらないと意味をなさないという考え方が自分と合わないってところがあります。



相互フォローの強要力


Twitterの場合は、フォローするなどつながらないことには始まらないサービスではあるので、日々誰かにフォローされ、アンフォローされたりすることを繰り返したりします。

少し前まではフォロワー数が減ったり、「Twitterってフォロワー減るよりリスト減る方が凹むんだけど 」に書いたように自分への興味と言うものが他人から薄れていくことを目の当たりにすると凹んだりもしていましたが、個人個人考えも違いますし自分の発言の全てがその人にとって役立つものでもないと言うのは十分承知してたりします。


なので相互フォロー(読者登録)お願いします、みたいなことって言ったこと無いですし、とてもいえないなと思うわけです。

このブログでは技術系のネタを中心にIT関連の話題を中心に書いてたりしますので、そういうのに興味がなかったり、仕事で使わなければ全く面白くないと思います。

私自身も個人のメモついでにそういった人向けに何か役立てばいいなと思ってるわけなので、それ以外の人に俺のブログを見ろ!みたいなこと言って、例え読者登録されたとしても、きちんと読んでくれなかったり意味がわからないだろうなと思います。

書いてるからには意味を理解して欲しいですし、読んで役立ったと思ってほしかったりします。

ただ、それって書き手が強要することではなく、その個人が決めればいいことだと思うわけです。


もう少し幅広い層に受けたければ、ブログの趣旨を変更してもっと日常のネタやTipsを公開していけば、色んなジャンルの人とつながれるだろうなと思うのですが、個人的にこのブログはそういったIT系のネタを中心とする場として個人的に位置づけていたりします。

Twitterではもう少し個を出すようにしているので、特に同じ職種の人とかじゃなくともつながれればいいなとは思ってます。

なので、つながりとして決して様々なジャンルの人とつながりたくないと思っているわけではなくて、その場の特性を考えて敢えてそうしていると言う人もいるのではないか、と思ったりします。



相互につながる意味ってあるのか


Twitterでフォローしてもフォローを返されることを最初から望んでるわけでもありませんし、そういったことを相手に強要したくないな、と言うところもあります。

フォローするかどうかは、その人が個人的に興味を持てばすればいいし、無ければそのまま一方通行の関係性でいいと思うわけです。

何故なら私自身が勝手に興味を持っていて、その人から情報を得ようとしているわけで、それを得られればいいと思ってますし、フォロー関係になくともTwitterではやり取りができますからね。


自分としては、その人から何らかの有益な情報を得られているからフォローしているわけで、それだけでメリットを得ていたりもします。

もちろん仲良くなれば、それ以上に大きなメリットを得られるかもしれません。

しかし、それに向けて自分への関心を強要することって、その人にとっても大きな関心やメリットを与える必要がありますし、それって相手が決めればいいことだと個人的に思います。

さっきも書いたように、それは場が決めている場合もありますから、その関心が双方にあるって言うことは結構稀な気もしてます。


ネットってつながることの面白さってありますけど、それって決して双方向ってわけじゃありません。

一方通行のつながりであったとしても、その自分の興味を示すつながりだけで十分に意味が出てきます。

双方向のつながりだけを強制して作ったとしても、結局その道はあるものの、決してそこは使われない道なわけです。

それって意味のある関係なのかな、って思うわけです。



まとめ


結局、その人をこちらに向けなくても、誰かはあなたへ興味を持つ人はいて、そういう人と上手く付き合っていけばよいのではないかと思ったりしています。

みんな仲良く、みんなでつながろうというのは無理なんだし、それを強要する権利って誰にも無いのでは、と思ったりするわけです。


恋人同士の関係と同じで、ネットでも両想いになれる確率って高くないと思うんです。

ただ、片想いであったとしても、その存在や得られる情報からその人の存在意義ってあるわけですよね。

そもそも、人一人が付き合える人数って限界があるわけなので手広く関係を求めるより、各々の興味や関心のジャンルごとに両想いの人を見つけ出すってことの方が互いによい関係を築けるのではないか、って思うわけです。


そしてそれって決して強制力から見つけ出せるものではないのではないか、って思います。