5000164 is here
My writing is my life.
No results for undefined
Powered byAlgolia
TEDの感想(サイモン シネック: 優れたリーダーはどうやって行動を促すか)

動画について

私が今回見た動画はこちらです。

ゴールデンサークルについて

このゴールデンサークルという考え方は非常にわかりやすい。

シンプルでいて強力だ。

人は「なぜ」に動かされる。

ではどうして「なぜ」に動かされるのか。

それは自らの信じることを行動で示すため。

世界を変えたい、という思いを信じ、私も世界を変えたいと信じている、という自分を示すために行動する。

まとめ

行動は自分のために行うもの。

他人のために行うものではない。

自分の思いを伝えたければ「なぜ」から始めること。

その「なぜ」に共感してくれれば動いてくれる人もいる。

おまけ

ゴールデンサークルをCSSで実装したので載せておきますね。

See the Pen ゴールデンサークル by SUGAWARA Hiroshi (@5000164) on CodePen
CSS Nite in SENDAI, Vol.7 「変化するWebデザイン 〜既成概念を打ち破るWeb制作のあり方を考える」に参加しました

CSS Nite in SENDAIについて

Web制作関係者のためのセミナー、それの仙台版です。

詳しくは下記を。

CSS Nite in SENDAI, Vol.7 | CSS Nite in SENDAI

CSS Nite in SENDAI, Vol.7に参加しました

開催されたのが10月19日(土)なのでだいぶ間が空いてしまいました。

セミナーの内容ではなく、セミナーから感じたことを書いていきます。

安心感をもらいました

セミナーに参加するのは久しぶりでした。

このしばらく参加していなかった間に、自分でも気づかないうちに、現在の自分に対する不安が大きくなっていたようです。

私の考えは合っているのか、方向性は間違っていないのか。

もちろん答えがあるわけでもないのですが、周りに同感できる人がいないというのが事実でした。

1人でHTMLやCSS、JavaScriptを勉強して、このタグは意味合い的にこのようにマークアップするべき、ここはCSSで表現できるので画像リソースを削減する、JavaScriptは今後もっと重要になるはずだから勉強しないと、とやり続ける。

1人で。

それに思ったよりも疲れていたみたいです。

でも、今回のセミナーに参加して1番良かったことは、これでいいんだと自分で思えたことです。

Webをよりよくする

私が大事に思っていることは、Webをよりよくする、ということです。

Webは情報発信という面で長けています。

その手段としてのHTMLでありCSSでありJavaScriptです。

大事なのはコンテンツです。

どんどん新しい技術に挑戦するのは、より効率よくするため。

自分が何かを伝えたいと思った瞬間に、すぐに伝えられるようにするため。

懇親会には参加する

セミナーの後の懇親会でもいろいろな方と話ができて非常にためになりました。

懇親会は苦手なんですけど、終わってみると絶対参加して良かったと思います。

私もWebの可能性を引き出したいです。

まとめ

やっぱり勉強会には積極的に参加するべき。

コンテンツを横に2つ並べた時に片方だけコンテンツ幅がウィンドウ幅に追従するようにする

デモ

文章では説明しづらいので、なんだかよくわからないタイトルになってしまいました。

まずは実際に見てもらった方が早いと思います。

See the Pen qxgIF by SUGAWARA Hiroshi (@5000164) on CodePen

  ここではデモのために、ウィンドウの幅ではなくdivの幅を変更するようにしています。

divの幅を変更してみると、左側のテーブルの幅は変わらずに右側の文章の幅だけが変わっているのが確認できます。

実装方法

cssはこのようになっています。(関係のないプロパティは省略しています。)

div {
  position: relative;
}
table {
  position: absolute;
  top: 0;
  left: 0;
  width: 250px;
}
p {
  margin: 0 0 0 250px;  
}
  非常に簡単です。

まず、tableをposition: absolute;で固定することを考えます。
そのために親要素にposition: relative;を指定します。
これでtableの位置が固定されるので、あとは右側のコンテンツにmarginを指定してtableと重ならないようにします。
これだけです。

複雑に考える必要はなかった

  最初に右側のコンテンツだけウィンドウサイズに応じて幅を変更させようとした時は、もっと複雑に考えていました。

左側のコンテンツにmin-widthを指定して、左右のコンテンツにwidthでそれぞれ%を指定しようとしたのですが、これは%で指定すると幅が大きく変わった時にレイアウトが崩れるので断念。
次はJavaScriptでウィンドウサイズのイベントを取得して動的にwidthを変更するしかないかと思ったのですが、なるべくシンプルにいってJavaScriptは使いたくなかったので保留。
他にいい方法がないかと考えていた時にこの方法を思いつきました。
試しに実装してみたら期待通りの動きをしてくれたのでこの方法に決定。
シンプルに書けるのはいいものです。

まとめ

この方法は応用が利きそうです。

HTMLとCSSとJavaScriptで空白と改行を削除するWebアプリを作ったので詳細説明します

概要

半角スペース、全角スペース、タブ、改行を削除できます。

機能

改行削除

改行を削除して出力領域に書き出し。
ショートカットキーはCtrl + Enter。
書き出したらテキストは全選択の状態なのでそのままコピー可。

空白削除

半角スペース、全角スペース、タブを削除して編集領域に上書き。
ショートカットキーはShift + Enter。
空白の削除前に戻したい場合はCtrl + Alt + Z。

空白改行削除

半角スペース、全角スペース、タブ、改行を削除して出力領域に書き出し。
ショートカットキーはCtrl + Shift + Enter。

補助機能

TabキーでTab文字の挿入。
Shift + Tabで行頭のTab文字を削除。
範囲を選択して削除した場合は選択範囲に対して処理の実行。
範囲を選択してTab、Shift + Tabを押した場合には選択行に対して実行。

実装解説

それではHTMLとCSSとJavaScriptについて各部分の詳細を説明します。

実装解説:HTML

メインの部分はこんな感じです。

<header>
  <div class="button_wrapper">
    <div class="button"><label><input type="checkbox" id="space_delete_flg"><div id="space_button">空白</div></label></div>
    <div class="button"><label><input type="checkbox" id="newline_delete_flg" checked><div id="newline_button">改行</div></label></div>
    <div id="delete_button" class="button">削除</div>
  </div>
  <a href="http://5000164.jp/2013-11-space_delete/" target="_blank"><div id="info">i</div></a>
</header>
<div id="input_wrapper">
  <div id="input_area">
    <textarea id="input"></textarea>
    <div id="input_background"></div>
  </div>
</div>
<div id="output_area">
  <input type="text" id="result" readonly></input>
</div>

タグ構造は非常にシンプルです。
今回はtextareaに入力した内容に合わせて背景色を変えるという処理を行っているので、textareaとdivタグを重ねています。
ただ、contenteditableを使えば1つのタグだけでいけるのかもしれません。
textareaとdivタグを重ねる手法だと、常に内容を同期させる必要があるので処理が重くなる可能性があります。
ちょっとした入力内容から大丈夫かも知れませんが、次に同じようなことをしたくなったらcontenteditableでやります。

実装解説:CSS

今回のCSSでは、編集領域をウィンドウサイズに合わせる、空白などの見えない文字を可視化する、ボタンを押した時にテキストが動く、というところがメインです。

編集領域をウィンドウサイズに合わせる

まずは編集領域をウィンドウサイズに合わせる部分から。
重要になるのはこのへんです。

html, body {
  width: 100%;
  height: 100%;
  margin: 0;
  padding: 0;
  background: hsl(0, 0%, 15%);
}
#input_wrapper {
  box-sizing: border-box;
  width: 100%;
  min-width: 640px;
  height: 100%;
  margin: 0;
  padding: 30px 0 20px;
  background: hsl(0, 0%, 15%);
}

あんまり見なれないheight: 100%;が重要になります。
私は初めて使った気がします。
height: 100%;を使うためには、htmlとbodyにheight: 100%;を指定する必要があります。
これ重要です。
あとはコンテンツ部分にもheight: 100%;を指定して、paddingで上下の余白を調整してあげれば、コンテンツの高さを自動でウィンドウサイズに合わせることができます。

空白などの見えない文字を可視化する

まずはtextareaとdivタグがずれないようにちゃんとスタイルを合わせます。

#input_area {
  position: relative;
  box-sizing: border-box;
  width: 100%;
  min-width: 640px;
  height: 100%;
  margin: 0;
  padding: 0;
}
#input {
  z-index: 2;
  display: block;
  position: absolute;
  top: 0;
  left: 0;
  box-sizing: border-box;
  width: 100%;
  min-width: 610px;
  height: 100%;
  margin: 0;
  padding: 0 15px;
  resize: none;
  word-break: break-all;
  word-wrap: break-word;
  white-space: pre-wrap;
  font-family: sans-serif;
  font-size: 18px;
  line-height: 30px;
  color: hsl(0, 0%, 85%);
  background: transparent;
  border: none;
  outline: none;
}
#input_background {
  z-index: 1;
  position: absolute;
  top: 0;
  left: 0;
  overflow-y: auto;
  box-sizing: border-box;
  width: 100%;
  min-width: 610px;
  height: 100%;
  margin: 0;
  padding: 0 15px;
  word-break: break-all;
  word-wrap: break-word;
  white-space: pre-wrap;
  font-family: sans-serif;
  font-size: 18px;
  line-height: 30px;
  color: transparent;
}

ここではまず、親要素にposition: relative;を指定して、子要素にposition: absolute;のtop: 0;left: 0;で位置を合わせ、文字のスタイルなどを一致させます。
そしてtextareaをbackground: transparent;とすることで後ろのdivタグが見えるようになります。
divタグにはcolor: transparent;と指定してテキストが見えないようにします。
これで表示する位置を合わせたら、次は実際に表示させます。

#input_background > pre {
  display: inline;
  margin: 0;
  white-space: pre-wrap;
  font-family: sans-serif;
  font-size: 18px;
  line-height: 30px;
}
#input_background > pre:after {
  content: "";
  display: block;
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  font-family: sans-serif;
  font-size: 10px;
  line-height: 30px;
  color: hsl(0, 0%, 40%);
  text-align: center;
}
#input_background > pre.space {
  position: relative;
  background: hsl(0, 0%, 20%);
}
#input_background > pre.space:after {
  content: "・";
}
#input_background > pre.em_space {
  position: relative;
  background: hsl(0, 0%, 20%);
}
#input_background > pre.em_space:after {
  content: "□";
  font-size: 18px;
}
#input_background > pre.tab {
  position: relative;
  background: hsl(0, 0%, 20%);
}
#input_background > pre.tab:after {
  content: "→";
  text-align: left;
}
#input_background > pre.crlf {
  position: relative;
  background: hsl(0, 0%, 20%);
}
#input_background > pre.crlf:after {
  content: "←↓";
}
#input_background > pre.cr {
  position: relative;
  background: hsl(0, 0%, 20%);
}
#input_background > pre.cr:after {
  content: "←";
}
#input_background > pre.lf {
  position: relative;
  background: hsl(0, 0%, 20%);
}
#input_background > pre.lf:after {
  content: "↓";
}

ここではJavaScriptで該当の文字をpreタグで囲い、該当の文字ごとにクラス名が付けられる、という前提でのスタイルです。
例えば、pre.spaceがあったら、背景を変えて「・」を表示させるようにしています。
実際にpreタグの中に「・」を入れてしまうとtextareaとdivタグで内容が一致しなくなってしまうので、擬似要素を使って表示しています。

ボタンを押した時にテキストが動く

ここでは私がかねてから実装してみたかった、バウンスするようなアニメーションを適用しています。
例として空白ボタンを見てみます。

header input[type=checkbox]:checked + #space_button {
  background: hsl(0, 0%, 5%);
  border: 1px solid hsl(0, 0%, 4%);
  box-shadow: 0 1px 0 0 hsl(0, 0%, 13%);
  text-indent: -.1em;
  letter-spacing: -.1em;
  -webkit-animation: space_button 500ms ease 0 1 normal;
}

擬似要素が:checkedの時にだけアニメーションを指定することで、空白ボタンがチェックされたらアニメーションするようにしています。
実際のアニメーションの動作はこうなっています。

@-webkit-keyframes space_button {
  0% {
    text-indent: 1em;
    letter-spacing: 1em;
  }
  10% {
    text-indent: .9em;
    letter-spacing: .9em;
  }
  20% {
    text-indent: .7em;
    letter-spacing: .7em;
  }
  30% {
    text-indent: .4em;
    letter-spacing: .4em;
  }
  40% {
    text-indent: -.1em;
    letter-spacing: -.1em;
  }
  50% {
    text-indent: .3em;
    letter-spacing: .3em;
  }
  60% {
    text-indent: -.1em;
    letter-spacing: -.1em;
  }
  70% {
    text-indent: .1em;
    letter-spacing: .1em;
  }
  80% {
    text-indent: -.1em;
    letter-spacing: -.1em;
  }
  90% {
    text-indent: 0em;
    letter-spacing: 0em;
  }
  100% {
    text-indent: -.1em;
    letter-spacing: -.1em;
  }
}

このように、ここではtext-indentとletter-spacingを使うことで文字の間隔を変えています。
あとは10%ごとに跳ね返ってるように見えるように間隔を調整すれば完了です。
空白を消してるぞ!っというような動きができたので個人的には非常に満足しています。

実装解説:JavaScript

JavaScriptの解説ですね。
おおまかに分けると、入力内容の同期、空白や改行の削除処理、Tabの処理、となっています。
また、今回はライブラリとしてjQueryを使用しています。

入力内容の同期

特定の文字に色をつけるために、textareaとdivの内容を同期します。
その際に、特定の文字をマークアップしたり、入力内容のエスケープを行います。

// ~中略~
$(function() {
  // ~中略~
  // 入力された値を常に監視する
  $("#input").bind('keydown keyup keypress change focus click', function() {
    inputWatch($("#input").val());
  });
  
  // スクロールを同期する
  $("#input").bind('keydown keyup keypress change scroll', function() {
    $("#input_background").scrollTop($("#input").scrollTop());
  });
  // ~中略~
});



// 入力内容を監視
function inputWatch(inputText) {
  inputText = escapeHtml(inputText);
  
  // 入力された文字列を可視化する
  inputText = inputText.replace(/ /g, "<pre class=\"space\"> </pre>"); // 半角スペース
  inputText = inputText.replace(/ /g, "<pre class=\"em_space\"> </pre>"); // 全角スペース
  inputText = inputText.replace(/\t/g, "<pre class=\"tab\">   </pre>"); // タブ
  inputText = inputText.replace(/\r\n/g, "<pre class=\"crlf\"></pre><br>"); // CRLF
  inputText = inputText.replace(/\r/g, "<pre class=\"cr\"></pre><br>"); // CR
  inputText = inputText.replace(/\n/g, "<pre class=\"lf\"></pre><br>"); // LF
    
  // div要素の最後が<br>だとheightに反映されないようなので空白を最後に追加する
  inputText += " ";
  
  // 入力内容と背景用の内容を同期させる
  $("#input_background").html(inputText);
}



// HTML用に文字列をエスケープする
function escapeHtml(string) {
  // エスケープ対象は「&」「<」「>」「"」「'」
  string = string.replace(/&/g, "&amp;");
  string = string.replace(/</g, "&lt;");
  string = string.replace(/>/g, "&gt;");
  string = string.replace(/\"/g, "&quot;");
  string = string.replace(/\'/g, "&#39;");
  
  return string;
}

内容を同期する時は、内容が変更しそうなイベントをすべてバインドして、同期処理を走らせます。

空白や改行の削除処理

空白や改行は正規表現で削除しています。

// 改行削除
function newlineDelete() {
  var posStart = $("#input").get(0).selectionStart;
  var posEnd = $("#input").get(0).selectionEnd;
  var inputStr = $("#input").val();
  
  // 範囲選択をしていない場合
  if(posStart === posEnd) {
    // 改行をすべて削除
    $("#result").val(inputStr.replace(/[\n\r]/g, ""));
  }
  // 範囲選択をしている場合
  else {
    var selStr = inputStr.substring(posStart, posEnd);
    // 改行をすべて削除
    $("#result").val(selStr.replace(/[\n\r]/g, ""));
  }
  
  $("#result").focus();
}



// 空白削除
function spaceDelete() {
  var posStart = $("#input").get(0).selectionStart;
  var posEnd = $("#input").get(0).selectionEnd;
  var inputStr = $("#input").val();
  // 内容をバックアップ
  backupStr = $("#input").val();
  backupPos = posStart;
  
  // 範囲選択をしていない場合
  if(posStart === posEnd) {
    // 空白をすべて削除
    $("#input").val(inputStr.replace(/[  \t]/g, ""));
    // キャレットの位置から前にある空白の数だけキャレットの位置を前に移動する
    var moveCount = (inputStr.substring(0, posStart).match(/[  \t]/g) == null) ? 0 : inputStr.substring(0, posStart).match(/[  \t]/g).length;
    var pos = posStart - moveCount;
    $("#input").get(0).setSelectionRange(pos, pos);
  }
  // 範囲選択をしている場合
  else {
    var selStr = inputStr.substring(posStart, posEnd);
    // 空白をすべて削除
    $("#input").val(inputStr.substring(0, posStart) + selStr.replace(/[  \t]/g, "") + inputStr.substring(posEnd, inputStr.length));
    $("#input").get(0).setSelectionRange(posStart, posStart);
  }
}



// 空白改行削除
function spaceNewlineDelete() {
  var posStart = $("#input").get(0).selectionStart;
  var posEnd = $("#input").get(0).selectionEnd;
  var inputStr = $("#input").val();
  
  // 範囲選択をしていない場合
  if(posStart === posEnd) {
  // 空白改行をすべて削除
    $("#result").val(inputStr.replace(/[  \n\r\t]/g, ""));
  }
  // 範囲選択をしている場合
  else {
    var selStr = inputStr.substring(posStart, posEnd);
    // 改行をすべて削除
    $("#result").val(selStr.replace(/[  \n\r\t]/g, ""));
  }
  
  $("#result").focus();
}

範囲選択をしていない場合は非常にシンプルなのですが、範囲を選択している時は選択範囲にのみ処理を実行させるようにすると処理が複雑になります。
範囲選択をしている時は、選択範囲の始点と終点を取得し、それを基に処理を行います。

Tabの処理

ここが1番大変でした。
ここに1番時間がかかりました。
とりあえずソースはこんな感じです。

// タブを入力
function insertTab() {
  var posStart = $("#input").get(0).selectionStart;
  var posEnd = $("#input").get(0).selectionEnd;
  var inputStr = $("#input").val();
  
  // 範囲選択をしていない場合
  if(posStart === posEnd) {
    // カーソルの位置にタブを追加
    $("#input").val(inputStr.substring(0,posStart) + "\t" + inputStr.substring(posStart, inputStr.length));
    // カーソルの位置をタブの後ろに移動させる
    $("#input").get(0).setSelectionRange(posStart + 1, posStart + 1);
  }
  // 範囲選択をしている場合
  else {
    var beforeSelStr = inputStr.substring(0, posStart);
    var selStr = inputStr.substring(posStart, posEnd);
    var afterSelStr = inputStr.substring(posEnd, inputStr.length);
    
    // 選択範囲始点の行頭にタブを追加
    beforeSelStrSplit = beforeSelStr.split(/\n|\r|\r\n/g);
    beforeSelStrSplit[beforeSelStrSplit.length - 1] = "\t" + beforeSelStrSplit[beforeSelStrSplit.length - 1];
    // 選択範囲の行頭にタブを追加
    selStr = selStr.replace(/[\n\r]/g, "\n\t");
    // 分割した文字列を結合
    $("#input").val(beforeSelStrSplit.join("\n") + selStr + afterSelStr);
    // カーソルの選択範囲を維持する
    $("#input").get(0).setSelectionRange(posStart + 1, posEnd + ((selStr.match(/[\n\r]/g) == null) ? 0 : selStr.match(/[\n\r]/g).length) + 1);
  }
}



// 行頭のタブを削除
function deleteTab() {
  var posStart = $("#input").get(0).selectionStart;
  var posEnd = $("#input").get(0).selectionEnd;
  var inputStr = $("#input").val();
  
  // 範囲選択をしていない場合
  if(posStart === posEnd) {
    var beforeSelStr = inputStr.substring(0, posStart);
    var afterSelStr = inputStr.substring(posStart, inputStr.length);
    
    // キャレットの行を取得
    beforeSelStrSplit = beforeSelStr.split(/\n|\r|\r\n/g);
    afterSelStrSplit = afterSelStr.split(/\n|\r|\r\n/g);
    var beforeSelLineStr = beforeSelStrSplit[beforeSelStrSplit.length - 1];
    var targetStr = beforeSelLineStr + afterSelStrSplit[0];
    afterSelStrSplit[0] = "";
    // 行頭のタブを削除
    beforeSelStrSplit[beforeSelStrSplit.length - 1] = targetStr.replace(/^\t/, "");
    // 分割した文字列を結合
    $("#input").val(beforeSelStrSplit.join("\n") + afterSelStrSplit.join("\n"));
    // カーソルの位置を維持する
    var moveCount = (beforeSelLineStr.match(/^\t/) == null) ? 0 : 1;
    $("#input").get(0).setSelectionRange(posStart - moveCount, posStart - moveCount);
  }
  // 範囲選択をしている場合
  else {
    var beforeSelStr = inputStr.substring(0, posStart);
    var selStr = inputStr.substring(posStart, posEnd);
    var afterSelStr = inputStr.substring(posEnd, inputStr.length);
    
    // 対象となる行を取得
    beforeSelStrSplit = beforeSelStr.split(/\n|\r|\r\n/g);
    selStrSplit = selStr.split(/\n|\r|\r\n/g);
    afterSelStrSplit = afterSelStr.split(/\n|\r|\r\n/g);
    var beforeSelLineStr = beforeSelStrSplit[beforeSelStrSplit.length - 1];
    var afterSelLineStr = selStrSplit[selStrSplit.length - 1];
    var targetStr = beforeSelLineStr + selStr + afterSelStrSplit[0];
    beforeSelStrSplit[beforeSelStrSplit.length - 1] = "";
    afterSelStrSplit[0] = "";
    // 行頭のタブを削除
    selStr = targetStr.replace(/^\t/, "").replace(/\n\t|\r\t|\r\n\t/g, "\n");
    // 分割した文字列を結合
    $("#input").val(beforeSelStrSplit.join("\n") + selStr + afterSelStrSplit.join("\n"));
    // カーソルの位置を維持する
    var moveCountStart = (beforeSelLineStr.match(/^\t/) == null) ? 0 : 1;
    var moveCountEnd = (afterSelLineStr.match(/^\t/) == null) ? 0 : 1;
    moveCountEnd += (targetStr.match(/\n\t|\r\t|\r\n\t/g) == null) ? 0 : targetStr.match(/\n\t|\r\t|\r\n\t/g).length;
    $("#input").get(0).setSelectionRange(posStart - moveCountStart, posEnd - moveCountEnd);
  }
}

はい、ご覧のとおり複雑なことになってます。
なぜかといいますと、textareaからは行頭というものを取得できないためです。
改行記号を含んだ文字列として扱われます。
なので、Shift + Tabをした場合や範囲選択をしている場合は、行頭を判別する処理が必要になります。
また、Tab文字を入れたり消したりしますので、キャレットの位置がずれてしまいます。
なので、変動した文字数を数えて、それに合わせてキャレットを移動させてあげています。
ここらへんの処理がcontenteditableを使うと簡潔に書けそうな感じでした。(ブラウザは制限されるかも知れませんが。)

まとめ

現時点でこのWebアプリはver.4です。
ver.3では、Sfhit + Tab以外のキーボードからひと通りの処理に対応、空白文字可視化、などを行って制作時間は7時間くらい。
ver.4では、Shift + Tab対応、範囲選択の処理に対応、デザイン変更、などを行って制作時間は12時間くらい。
補助機能の実装に1番時間がかかってしまった。
今までの合計製作時間は26時間くらいですね。
非常に楽しく実装できて、とても勉強になって、一時期非常に役に立ったので、とても有意義でした。

参考にさせていただいたサイト

おれおれVOCALOIDランキング(2013.11.21)

イントロまたしても久しぶりのランキングです。

最近とてもハマった曲があったのでご紹介したくての更新。

というわけで自信を持っておすすめできるおれおれVOCALOIDランキングベスト3の発表です。

3位:CLONE DANCER/GUMI/フルオキセチン

[nicodo display=”player” width=”640″ height=”360″]sm21732003[/nicodo]

お経っぽいというコメントを見て、なるほどと納得しました。

このVOCALOIDならではといった曲調がかっこいいです。

GUMIの声とテンポのいい音がまたいい感じに気持ちいい。

2位:weathering patchwork/IA/クイナ

[nicodo display=”player” width=”640″ height=”360″]sm22072139[/nicodo]

これはジャズっぽいんですかね。

ジャズィーなんですかね。

雰囲気がおしゃれです。

特に歌詞のリズム感がかっこいい。

1位:死なない魔法/GUMI/みやけ

[nicodo display=”player” width=”640″ height=”360″]sm21673452[/nicodo]

この曲が最近ドハマりしててすごいたくさん聴いてます。

初めて聴いた時はそこまでじゃなかったんですが、聴くたびにどんどん好きになっていきました。

この曲だけずっと1曲リピートして聴くことも多いです。

なにがこんなにハマらせるんですかね。

とりあえず演奏はすごい好きです。

メロディーもすごい好きです。

かっこいいです。

おしゃれです。

聴いてて気持ちいいです。

このみやけさんの曲は他にも、ネバーシャークの汽笛吹き男、マインドスプラッター、誓いの号令、とかかっこいいです。

マインドスプラッターでみやけさんを知って以来チェックしてます。

これからも期待しています。

まとめ

今回のランキングの動画はどれも再生数が1000前後といった感じなので、少しでも多くの人に聴いてもらえれば、私と同じように何かを感じる人もいるはずだと思います。

このような作品を作ってくださっているクリエイターの皆様に感謝です。

以下、現時点のマイリスト

[nicodo]sm21130318[/nicodo][nicodo]sm21673452[/nicodo][nicodo]sm21598771[/nicodo][nicodo]sm22072139[/nicodo][nicodo]sm11698267[/nicodo][nicodo]sm21685597[/nicodo][nicodo]sm21443197[/nicodo][nicodo]sm21732003[/nicodo][nicodo]sm21468365[/nicodo][nicodo]sm21464889[/nicodo][nicodo]nm11371011[/nicodo][nicodo]sm21438326[/nicodo][nicodo]sm20624241[/nicodo][nicodo]sm15187219[/nicodo][nicodo]sm18623327[/nicodo][nicodo]sm18131841[/nicodo][nicodo]nm8325511[/nicodo][nicodo]sm20620231[/nicodo][nicodo]sm20504992[/nicodo][nicodo]sm20443568[/nicodo][nicodo]sm20271398[/nicodo][nicodo]sm13779513[/nicodo][nicodo]sm19251235[/nicodo][nicodo]sm16802960[/nicodo][nicodo]sm16482252[/nicodo][nicodo]sm16483227[/nicodo][nicodo]nm6971638[/nicodo][nicodo]sm13292706[/nicodo][nicodo]nm16012790[/nicodo][nicodo]sm12071713[/nicodo][nicodo]sm15307196[/nicodo][nicodo]sm14476037[/nicodo]

気が利くデザイン(Pocket)

Pocketについて

Pocketという後で読むサービスがあります。

iPadでこのPocketのアプリを利用してた時に、気が利くなと思ったデザインがあります。

Pocketの目的

Pocketというアプリを利用するときの目的は「読むこと」です。

そのために読みやすさが求められます。

Pocketを利用している時の行動

Pocketで記事を開くと、ヘッダーがあって、本文があります。

本文を読み進めて、最後まで読み終わると、ヘッダーの既読ボタンを押します。

読みやすさのためのデザイン

Pocketで記事を読んでいて、記事を最後まで読み終わって既読ボタンを押そうとおもった時に、既読ボタンが表示されていることに気づきました。

記事を読んでいる時は全然気が付かなかったのに、でも既読ボタンを押したいなと思った時には表示されていました。

改めて見てみたところ、記事を読み始めるとヘッダーが非表示になり、記事を読み終わるとヘッダーが表示されるというデザインでした。

表示と非表示のされ方も、なるべく意識を阻害しないようなフェードインとフェードアウトで、全然気になりません。

「読んだー、既読にしよう」とおもった時に、スッと出てくる既読ボタン。

「ほほう、これは気が利くじゃないか」と思いました。

まとめ

これみよがしなアニメーションではなく、なるべく邪魔しないように、スッと消えてスッと出てくるヘッダーに好感が持てました。

空白と改行を削除するツールを作った

作ったものの概要

半角スペース、全角スペース、タブ、改行を削除します。

作成にいたる経緯

パソコンに何もアプリケーションをインストールしてはいけない環境。
文章を少しだけ修正する作業。
修正した文章は改行と空白を削除しなければならない。
という状況がつらかったから作った。

Webアプリという選択肢

アプリケーションはインストールできないけど、Webアプリならインストール不要。
なのでいい感じにWebで使えるツールを探す。
改行を削除するツールはたくさん見つかったが、使いづらい。
見つけたものは「改行を削除」するだけのツールのみ。
必要な作業は「文章を編集」して「改行を削除」すること。
出来上がってる文章をペーストして、改行を削除して、削除結果をコピーするという前提で作られているので、ちょっとした修正がやりづらい。

だから少しだけ編集もしやすいツールを作った

少しだけ編集しやすくするにあたって重視したことは下記の3つです。

  • 編集領域は広め
  • ショートカットで削除処理が実行可能
  • 削除処理をしたらそのままCtrl+Cしたい

作ってみた Ver.1

というわけで作ってみた。
編集領域はちょっと広め。
なによりも編集部分のフォントサイズと行間の設定を自分好みにした。
自分のために作っただけあって他のツールよりも使いやすい。
でも使ってると編集領域が物足りないと感じた。
フォントサイズは大きめにしてるのでもっと編集領域を広げたい。
そしてもっとエディタ感を出したい。

作ってみた Ver.2

というわけで作ってみた。
とってもエディタエディタさせました。
ウィンドウサイズを変更しても編集領域が追従します。
Pure CSSで実現。
動作対象はもちろんモダンブラウザです。
機能を満たしながらも編集領域は最大限確保できたかなと思います。
とりあえず満足。
ちょっとだけ編集する用なのでTabキーとか使えないです。
あとは行番号の表示とかにも興味あったけど、とりあえずこれで一段落。

改行と空白を削除してる部分の処理内容

JavaScriptで実装しています。
jQueryを使用。

$(function() {
  
  // Ctrl + Enterを押した場合に空白削除処理実行
  $("#input").keydown(function(event) {
    if(event.ctrlKey === true && event.which === 13) {
      spaceDelete();
    }
  });
  
  // ボタンをクリックした場合も空白削除処理実行
  $("#run").click(function() {
    spaceDelete();
  });
  
  // 空白削除処理実行後に内容を全選択する
  $("#result").focus(function() {
    $(this).select();
  });
});
  
// 空白削除処理
function spaceDelete() {
  
  // 入力文字列取得
  var inputText = $("#input").val();
  var resultText = "";
  
  // 空白文字をすべて削除
  resultText = inputText.replace(/\s/g, "");
  
  // 空白文字を削除した文字列を出力
  $("#result").val(resultText);
  
  // 出力内容にフォーカス
  $("#result").focus();
}

処理内容はこれだけです。
正規表現で文字列を置換しています。
正規表現の\sは全角スペースに一致しないと思ったら一致するんですね。

まとめ

Ver.1の製作時間は2時間くらい。
Ver.2の製作時間は5時間くらい。
CSSだけで編集領域をウィンドウに合わせるのに時間がかかった。
自分なりには結構使いやすく作れたので満足です。

アニメの感想(ダンガンロンパ 希望の学園と絶望の高校生 The Animation)

ネタバレ注意

物語の核心に触れる記述があります。

ネタバレが嫌いな人は閲覧注意。

アニメを見ようと思ったきっかけ

最近はアニメを見ていないのに、なにがきっかけでダンガンロンパを見ようと思ったのか。

まずは、単語を知るところから。

【初音ミク】Party Junkie【クソビッチ化】 - ニコニコ動画:GINZA

この動画のコメントで「絵がダンガンロンパに似てる」というコメントが流れて、ダンガンロンパという単語を知りました。

(動画の絵はダンガンロンパの絵の人とは違ったみたいだけれども。)

次に、興味を持つところ。

暴力街

Web漫画をいろいろと読んでいた時期に、このトップ画を見て「ダンガンロンパというのは面白いゲームらしい」ということを知りました。

最後に、アニメを見ようと決めたところ。

論破の快感『ダンガンロンパ』: わたしが知らないスゴ本は、きっとあなたが読んでいる

ツイッターやらでチラホラ単語を見かけるようになっていた時に、この記事を読んで「アニメを見よう」と思ったのでした。

各話の感想

まずは全体の感想の前に、毎週見終わった後に書いていたメモ書き程度の感想を書いていきます。

1話感想

監督がAngel Beats!の人と一緒だった。

声優に知っている人がいる。

・シンジくん

・カヲルくん(てかAngel Beats!にも出てたのか。)

・ドラえもん

・ガハラさん、ほむほむ

・神原、岩沢

・澪ちゃん

などなど。

目が覚めていきなりみんなで素直に団体行動する流れに違和感がある。

突然置かれた状況ならもっと反発があるはず。

家族の身になんかあったことを装うだけじゃ殺人を行う動機付けが弱いと思う。

もっと必要なのは動機じゃなくて殺人を犯しやすい環境では。

2話感想

OPは好き。

EDはニコニコクオリティな気がする。

大和田くんが死体に服をかけていた。

優しい。

3話感想

犯人推理の部分が簡単すぎた。

証拠隠滅の方法がいろいろとおかしい。

というかいろいろと変。

最初だから流れに慣れさせるためかな。

学級裁判で苗木が犯人じゃない証拠が弱すぎる。

桑田くんは「ダイイングメッセージ」という単語を聞き取れなかったのに、「状況証拠からの推測」って言っちゃうあたりに違和感を感じる。

キャラクターの意識が統一できてない感じ。

顔面がアップになっていってリズムが速くなっていくのはおもしろかった。

人格崩壊の描き方が中途半端。

千本ノックが千本ノックじゃない。

霧切さんがアドバイスくれすぎ。

最後のエスパーだからってのはどこの伏線なんだろう。

4話感想

希望ヶ峰学園の学園長のお知らせがよくわからない。

腐川さんが言ってた意味がわからない。

5話感想

全世界へのお仕置きという言葉が気になった。

動画が配信されている?

学級裁判の犯人が土壇場でわかって危なっかしい。

殺人に理由付けして不可抗力のような印象をもたせすぎ。

超高校級の~~という肩書きは変わることがあるのか。

6話感想

霧切さんはどこにいったんだろう。

山田の発言とAlter EGOの写真とEDの写真でなにかあるらしいことが匂わされている。

人数が少なくなってきて作品としてはおもしろくなってきた。

Alter EGOってのはまた都合のいいものがでてきたものだ。

7話感想

霧切さんがハイスペックすぎて怪しいけどそう思わせるのが演出の狙いかも。

ここから出てはいけないというメモはわざと見せた気がする。

もしかして学園の外の世界はすでに滅んでいるとかだろうか。

8話感想

大神さんが黒幕の関係者だったならもっと話を聞くべきだったはず。

大神さんにはけっこー期待してただけに残念。

そして大神さんが肉弾戦で負けるわけがないと思うから自殺とかじゃないかな。

霧切さんは記憶喪失なのかな。

使えるパソコンがあってネットワークに接続できるなら最初からすればよかったんじゃ。

最初の方で霧切さんがネットワークにつながってないみたいなこと言ってた気がするのは気のせいかな。

そして密室殺人の現場に入るときに部屋のドアを破って入ったのは新しく追加された校則に違反してるんじゃ。

最初から気になってたけど死んだ人が増えてく写真に最初から写ってる苗木はなぜなんだろう。

9話感想

Alter EGOがなんか残してるだろうから気になる。

超高校級の絶望ってかっこいい。

10話感想

超高校級の絶望があれで終わるわけがないよな。

テレビで公開されてるってのはなにかを隠すためのカモフラージュだと思う。

11話

初めて面白いと思った。

苗木くんが覚醒してかっこいい。

黒幕の強硬手段があからさますぎる。

生きて入ったのは高校生の16人のみ。

黒幕はあの中にいる?

黒幕があの中にいなかったから霧切さんは誰かを犯人に仕立て上げるしかなくなったんじゃないのか。

12話

苗木くんがかっこいい。

そばかすには気付いたけど、死体の再利用は気付かなかった。

言われてみれば江ノ島 盾子だけ殺される理由が違ってるかも。

次回で最終回だと思うけどどんな風に締めるのか楽しみ。

13話

超高校級の希望ってかっこいいな。

希望を打ち込む演出はかっこよかった。

江ノ島 盾子が考えてた成功ってのはどんな形だったのかな。

結局計画の全貌は見えなかった。

世界の終わりについてもわからなかった。

感想まとめ

思っていたほどは面白くなかった。

ゲームが面白いという話を聞いて、監督がABの人だと聞いて、声優が豪華だということを聞いて、すごく期待して見始めただけに残念。

最後まで見てもあんまりスッキリはしなかった。

視聴者に推理をさせる気がない展開の速さ。

学級裁判の演出もゲームの演出らしきもので、アニメには合ってないように思える。

途中の展開も、殺人と学級裁判の繰り返しでやや単調。

特に大きなどんでん返しもなく。

トリックも推理も簡単なものだし。

学級裁判が見せ場なんだろうから、もっと学級裁判の割り合いが多くても良かったかも。

犯人がすぐに自白し過ぎだと思う。

苗木くんがクロに決まったところと、苗木くんが希望を打ち込むところが面白かったです。

大神さんがとられてた人質ってのは他の生徒のことだったのかな。

江ノ島 盾子はその気になれば全員すぐに殺せたはずだし。

アニメを通して得たもの

原作のゲームへの興味。

それは違うよ!

小説の感想(暦物語/西尾維新)

※ネタバレ注意

感想

物語シリーズの14作目「暦物語」。

予定になかった一作ということもあり、今までの作品とは毛色が違うなと感じた。

こよみストーン

石の話。

阿良々木くん忘れちゃだめだよ。

そして羽川さんはやっぱりすごい。

こよみフラワー

花の話。

事故を悼む花で事故が起こるのはなんとも物悲しい。

こよみサンド

土の話。

羽川さんまじすごい。

こよみウォーター

水の話。

父親が見ていた水の相手が、子供の姿だったのか、それとも最初から大人の姿だったのかが気になる。

こよみウインド

噂の話。

このあたりから物語の次へ繋げる感じがでてきた。

そして貝木が素直に阿良々木くんに教えてくれるわけがないと思っていたら、案の定カツアゲされていた。

こよみツリー

木の話。

木に気付かなかったというのがなんとも不思議。

話の中では気付いてた人もいたという流れだったが、それだったら誰かが一言声をあげれば終わりだったのではないのだろうか。

ましてやアクが強そうな道場生たちなのだから、鼻も高くなりそうなものなのだが。

こよみティー

部活の話。

月火ちゃんは茶道部員たちに騙されてくれたに一票。

こよみマウンテン

神社の話。

扇ちゃんは急に変わったなー。

こよみトーラス

ドーナッツの話。

忍は自分がドーナッツを食べるためではなく、阿良々木くんにドーナッツを食べさせるためにあえて隠したのだろうか。

こよみシード

探しものの話。

果たしてこの斧乃木ちゃんの行動は自由意志に従ったものなのだろうか。

こよみナッシング

けんかの話。

ここででてきた拳銃はいつかの布石にならないかなあ。

こよみデッド

死ぬ話。

そして待望の八九寺が。

全体

みんなかわいい。

今回は怪異を感じさせつつも、怪異は関係ない、という話だった。

たしかに今までの話で怪異が当たり前になりすぎているという感じはあったので、そうではないと思わせてくれた。

まとめ

シリーズが長く続いてることもあって、けっこー話を忘れている。

完結したらまた最初から読みなおそう。

DV のことを調べたので簡単にまとめた

DV

調べるきっかけ

DV のことを調べるきっかけになったのはこの記事を読んだからでした。

おおかみこどもの雨と雪に興味があって読んだ記事の最後に、以下の記事がリンクされていました。

その日の夜は「ママと一緒に寝たい」と言って眠りにつき、それが最後の言葉になったという。

ふざけんなよ。
なんだっていうんだよ。
なんでこんな悲しいことが起きるんだよ。

DV のことをあんまり知らないことに気付いた

そういえば、 DV というものについて知らない、ということに気付いた。
暴力を振るったら DV ?という程度の知識。
なんで暴力を振るってしまうのか、といったことなどはわからない。
ということで調べた。
以下に個人的な見解をまとめます。

DV とは

DV とは、親しい関係の人に対する暴力のこと。
暴力には

  • 身体的暴力
  • 心理的暴力
  • 性的暴力
  • 経済的暴力
  • 社会的暴力

がある。

なぜ暴力を振るうのか

目的は、相手を失わないため。
暴力による恐怖で相手を支配することが目的。
相手を好きにしたい、という目的を達成するために、数ある選択肢の中から、暴力を振るう、という手段を選択している。

DV をしているか、受けているのか確認する

DV のチェックリストがありましたので、リンクを貼っておきます。
なお、このチェックリストは女性が被害者で男性が加害者という前提になっています。

どこからが DV なのか

DV にもいろいろあります。
とてもひどいものや、比較的軽度なもの。
比較的軽度なものの場合、「もっとひどい人もいるから大丈夫」と思ってしまいがちです。
しかし、大事なのはひどい DV か軽い DV か、ということではありません。
DV を受けていることがつらいかどうか、ということです。
もっとひどい DV を受けている人がいるからといって、あなたが DV を我慢する理由にはなりません。
つらいのであれば、それはない方が幸せになれるはずです。
また、これは憶測なのですが、暴力によって困ったら DV になるのではないでしょうか。

DV をしている場合

まずは、自分が DV をしているということを認識することが第一歩になります。
そして、その上で暴力ではない手段を身につける必要があると思います。
そのために専門機関に相談しましょう。

DV を受けている場合

まずは、自分が DV を受けていると認識する必要があります。
自分で DV だと認められなくて、暴力を肯定してしまうと被害が広がってしまいます。
少しでもおかしいと感じたら、自分の状態を確認して、なによりも自分の身の安全を確保することが最優先になります。
そして、専門機関に相談しましょう。
DV は非常に複雑で難しい問題です。
当事者間や知識のない人では解決するのは難しいでしょう。
なるべく早く専門機関に相談することで被害を最小に抑えることができます。
DV には暴力のサイクルといって抜け出せない仕組みがあります。
時間が経てば経つほど、暴力は悪化し、期間も短くなり、抜け出しづらくなります。
どのような決断をするにしろ、なるべく早めに行動することで被害を抑えることができます。

DV の相談を受けた場合

まずは、話を聞きましょう。
そして、専門機関に相談することをすすめましょう。
相談を受けた際にやってはいけない行動として

  • 別れろと言う
  • 加害者に注意する
  • 被害者や加害者の家族に知らせる

などがあります。
最後に、自分の労力の限界を自分で認識しましょう。
自分が頑張れば被害者を救える、というものではありません。
また、どんな結果になろうとも被害者の意思を尊重しましょう。

専門機関専門機関とは

DV の相談にのってくれる機関のことです。
女性センターや民間のものなどがあります。
ネットで「DV 相談 (地名)」で検索すればでてくると思います。
例えば私が住んでいる仙台市ならこれ。

まとめ

DV をつらいと感じたら、逃げよう。
逃げられない時は、専門機関に相談しよう。
被害が悪化する前のなるべく早い段階で行動しよう。
まずは少しでもおかしいなと思ったら相談してみて、その結果 DV じゃないですよって言われたとしても、それはとても大事なこと。

参考情報