奇特なブログ

「殊勝に値する行いや心掛け」を意味する、奇特な人になる為のブログです

PHPのコーディングにおけるベストプラクティスを考える:empty関数

PHPのコーディングにおけるベストプラクティスを考える準備記事 - 奇特なブログ


さて、今回は上記の記事の「第一弾」です。
しばらくは、「微妙な関数シリーズ」になると思います。
で、やっぱり最初は、この企画を考えるきっかけになった「empty関数(厳密には関数ではないとの事ですが)」かなと。
これまでも、「散々苦しめられました」しね。


まずは、関数のマニュアルを見てみましょう。

PHP: empty - Manual


つまり、empty() は本質的に !isset($var) || $var == false と同じことを簡潔に記述しているだけです。

この辺が引っかかるんですよね、「 == 」と2個になっている所が。
だから、動きにも納得はいくんですけど、そこがどうなんだ?と。


例2 文字列のオフセットに対する empty()
PHP 5.4 以降では、文字列内でのオフセット指定を渡したときの empty() の挙動が変わりました。

長い(原文は短いですが)ので引用はしませんが、
上記の例2のソースと、5.4からの実行結果を見てみて下さいよ。
分からんでもないですが、この法則覚えていられますか?っていう(苦笑)

基本的に、「trueになる値が多過ぎて、覚えていられない」というのが、
問題としてあると思っているんですよね。
だから、issetなんかは、まあアレも例外的な値としてnull値がありますけど、
それだけではあるので、まだマシかと。


あと、業務であるあると思われるのが、
ソースを「書いている時」と「読んでいる時(特に、他人の)」に、
それぞれあるかなと思いまして。

書いている時なら、
上記の「trueになる値」が多く、
ケアレスミスをちょくちょくしてしまったり、
あるいは、テストミスで「想定していない値が、分岐を通ってしまった」とか。
後者の方がヤバいでしょうけど。
「 ==(イコール2個) 」でも、似た様な話はちょいちょいありますが、その辺も似てますね。
「なんとなく、値が入ってなくて空なら処理してほしい」って時に、empty()を使う気もしますが、
その「なんとなく」っていうのが、危ないんじゃないですかねっていう。

逆に、読んでいる時なら、
その変数が型指定されていれば、若干マシですが、
「どんな型の、どんな値が入っているか」が分かりにくいと思いますね。
「empty($value)」って見た時に、その辺が分かんないじゃないですか。
だから、部分抜粋ですけど、以下の様なコードなら、
「あ、int型だな」って分かるから、少し読みやすくなるんじゃないかと。
でも、こういうコード見たことないですし、
あと、それでもわざわざemptyを使う必然性は、感じない様にも思いますし。
大体、関数定義から近いから分かるだけって気もしますし。

function test(int $value)
{
  if (empty($value))
  {
  }
}


この関数に限らず基本的な話として思うのは、
「出来るだけ、読みやすく(リーダブルに)、簡単にシンプルに済ませた方が良い」と。
でも、emptyは、「書くのが楽」っていうのが使われる原因じゃないかと思っていますが、
その場は楽でも、その後の動作確認やら、他人がそのソースを読んだ時の読みやすさやら考えるとっていう。
後者は、「コメントを書く」なんかにも、言えると思うんですけどね。


じゃあ、どうすれば良いのかということで、
以下に改善案(検証用も含んでいます)のソースを書いてみました。
一部(文字列だけは、少々面倒か?)除くと、別に面倒でもないと思うんですけどね。


あと、GitHub
https://github.com/kitoku-magic/other/blob/master/php_coding_best_practice/empty.php
にも上がってますが、同じソースです。

<?php

// PHP7.4.15にて検証

class foo
{
}

try
{
  // empty()に渡した結果、結果がtrueになるのは以下の値
  // false
  // 0
  // +0
  // 00
  // 0.0
  // +0.0
  // 00.0
  // array()
  // null
  // '0'
  // ''
  // 未定義の変数

  // 検証用の値を全て含んだ配列
  $empty_values = [
    // bool
    true,
    false,

    // int
    PHP_INT_MIN - 1,
    PHP_INT_MIN,
    -1,
    0,
    1,
    +0,
    +1,
    PHP_INT_MAX,
    PHP_INT_MAX + 1,
    00,
    01,

    // float
    // PHP_FLOAT_MINは、正の値の中での最小値なので0になる
    PHP_FLOAT_MIN - 0.1,
    PHP_FLOAT_MIN,
    (-1 * PHP_FLOAT_MAX) - 0.1,
    (-1 * PHP_FLOAT_MAX),
    -1.1,
    -1.0,
    -0.1,
    0.0,
    0.1,
    1.0,
    1.1,
    +0.0,
    +0.1,
    +1.0,
    +1.1,
    PHP_FLOAT_MAX,
    PHP_FLOAT_MAX + 0.1,
    00.0,
    01.0,
    INF,
    NAN,

    // array
    [],
    array(),
    array(null),

    // object
    new foo(),

    // null
    null,
    NULL,

    // string
    'true',
    'false',
    '-1',
    '0',
    '1',
    '0',
    '1',
    '+0',
    '+1',
    '-1.1',
    '-1.0',
    '-0.1',
    '0.0',
    '0.1',
    '1.0',
    '1.1',
    '+0.0',
    '+0.1',
    '+1.0',
    '+1.1',
    '[]',
    'array()',
    'array(null)',
    'new foo()',
    "fopen('/tmp/test', 'x')",
    'null',
    'NULL',
    '',
    '00',
    '01',
    '.0',
    '.1',
    '0.',
    '1.',
    // PHP_INT_MIN - 1
    '-9223372036854775809',
    // PHP_INT_MIN
    '-9223372036854775808',
    // PHP_INT_MAX
    '9223372036854775807',
    // PHP_INT_MAX + 1
    '9223372036854775808',
    // (-1 * PHP_FLOAT_MAX) - 1
    '-179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858369',
    // (-1 * PHP_FLOAT_MAX)
    '-179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368',
    // PHP_FLOAT_MAX
    '179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368',
    // PHP_FLOAT_MAX + 1
    '179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858369',
    '1 ',
    ' 1',
    ' 1 ',
    '1 ',
    "1\t",
    '0 ',
    ' 0',
    ' 0 ',
    '0 ',
    "0\t",
  ];

  echo "--------------------改善前--------------------\n";

  // empty関数での判定結果を出力
  foreach ($empty_values as $empty_value)
  {
    echo var_export($empty_value, true) . ' is ' . var_export(empty($empty_value), true) . "\n";
  }

  // 以下2つは、var_exportで出力出来ないので別枠
  echo 'リソース型 is ' . var_export(empty(fopen('/tmp/test', 'x')), true) . "\n";
  unlink('/tmp/test');

  echo '存在しない変数 is ' . var_export(empty($not_exist), true) . "\n";

  echo "--------------------改善後--------------------\n";

  // 以下からが改善案(結果は、上記と全く同じ)
  foreach ($empty_values as $empty_value)
  {
    // bool
    if (is_bool($empty_value) === true)
    {
      echo var_export($empty_value, true) . ' is ' . var_export($empty_value === false, true) . "\n";
    }
    // int
    else if (is_int($empty_value) === true)
    {
      echo var_export($empty_value, true) . ' is ' . var_export($empty_value === 0, true) . "\n";
    }
    // float
    else if (is_float($empty_value) === true)
    {
      echo var_export($empty_value, true) . ' is ' . var_export($empty_value === 0.0, true) . "\n";
    }
    // array
    else if (is_array($empty_value) === true)
    {
      echo var_export($empty_value, true) . ' is ' . var_export(count($empty_value) === 0, true) . "\n";
    }
    // object
    else if (is_object($empty_value) === true)
    {
      echo var_export($empty_value, true) . ' is ' . var_export($empty_value === null, true) . "\n";
    }
    // null
    else if (is_null($empty_value) === true)
    {
      echo var_export($empty_value, true) . ' is ' . var_export($empty_value === null, true) . "\n";
    }
    // string
    else if (is_string($empty_value) === true)
    {
      echo var_export($empty_value, true) . ' is ' . var_export($empty_value === '' || $empty_value === '0', true) . "\n";
    }
  }

  // fopenの失敗時の戻り値がfalseの為(なので、リソース型を扱う関数によって違う)
  echo 'リソース型 is ' . var_export(fopen('/tmp/test', 'x') === false, true) . "\n";

  echo '存在しない変数 is ' . var_export(isset($not_exist) === false, true) . "\n";

  echo "--------------------「is_null」の速度調査--------------------\n";

  // おまけ:「is_null」と「=== null」での比較調査(一千万件で以下なので、正直誤差レベルかと)
  ini_set('memory_limit', -1);
  $null_values = array_fill(0, 10000000, null);
  $start = microtime(true);
  foreach ($null_values as $null_value)
  {
    if (is_null($null_value) === true)
    {
    }
  }
  // time: 0.24362707138062(上記の、「 === true」を省略すると、time: 0.17196798324585)
  echo 'time: ' . (microtime(true) - $start) . "\n";

  echo "--------------------「 === null」の速度調査--------------------\n";

  $start = microtime(true);
  foreach ($null_values as $null_value)
  {
    if ($null_value === null)
    {
    }
  }
  // time: 0.19953608512878
  echo 'time: ' . (microtime(true) - $start) . "\n";

  while (count($empty_values) <= 10000000)
  {
    $empty_values = array_merge($empty_values, $empty_values);
  }

  echo "--------------------「empty」の速度調査--------------------\n";

  // empty関数での判定時間
  $start = microtime(true);
  foreach ($empty_values as $empty_value)
  {
    if (empty($empty_value) === true)
    {
    }
  }
  // time: 0.382817029953(速度は優位の模様)
  // 百万件だと、0.048418045043945
  echo 'time: ' . (microtime(true) - $start) . "\n";

  echo "--------------------「改善案」の速度調査--------------------\n";

  $start = microtime(true);
  foreach ($empty_values as $empty_value)
  {
    // bool
    if (is_bool($empty_value) === true)
    {
      if ($empty_value === false)
      {
      }
    }
    // int
    else if (is_int($empty_value) === true)
    {
      if ($empty_value === 0)
      {
      }
    }
    // float
    else if (is_float($empty_value) === true)
    {
      if ($empty_value === 0.0)
      {
      }
    }
    // array
    else if (is_array($empty_value) === true)
    {
      if (count($empty_value) === 0)
      {
      }
    }
    // object
    else if (is_object($empty_value) === true)
    {
      if ($empty_value === null)
      {
      }
    }
    // null
    else if (is_null($empty_value) === true)
    {
      if ($empty_value === null)
      {
      }
    }
    // string
    else if (is_string($empty_value) === true)
    {
      if ($empty_value === '' || $empty_value === '0')
      {
      }
    }
  }
  // time: 1.4359290599823(型チェックもしているから当然か)
  // 百万件だと、0.18049216270447
  echo 'time: ' . (microtime(true) - $start) . "\n";

  echo "--------------------「改善案(1回のif文)」の速度調査--------------------\n";

  $start = microtime(true);
  foreach ($empty_values as $empty_value)
  {
    if (
      ($empty_value === false) ||
      ($empty_value === 0) ||
      ($empty_value === 0.0) ||
      (is_array($empty_value) === true && count($empty_value) === 0) ||
      ($empty_value === null) ||
      ($empty_value === '') ||
      ($empty_value === '0')
    )
    {
    }
  }
  // time: 2.0437140464783(判定回数が多くなるので当然か)
  // 百万件だと、0.24031591415405
  echo 'time: ' . (microtime(true) - $start) . "\n";
}
finally
{
  unlink('/tmp/test');
}

// 参考:上記の全ての結果
/*
true is false
false is true
-9.223372036854776E+18 is false
-9223372036854775807-1 is false
-1 is false
0 is true
1 is false
0 is true
1 is false
9223372036854775807 is false
9.223372036854776E+18 is false
0 is true
1 is false
-0.1 is false
2.2250738585072014E-308 is false
-1.7976931348623157E+308 is false
-1.7976931348623157E+308 is false
-1.1 is false
-1.0 is false
-0.1 is false
0.0 is true
0.1 is false
1.0 is false
1.1 is false
0.0 is true
0.1 is false
1.0 is false
1.1 is false
1.7976931348623157E+308 is false
1.7976931348623157E+308 is false
0.0 is true
1.0 is false
INF is false
NAN is false
array (
) is true
array (
) is true
array (
  0 => NULL,
) is false
foo::__set_state(array(
)) is false
NULL is true
NULL is true
'true' is false
'false' is false
'-1' is false
'0' is true
'1' is false
'0' is false
'1' is false
'+0' is false
'+1' is false
'-1.1' is false
'-1.0' is false
'-0.1' is false
'0.0' is false
'0.1' is false
'1.0' is false
'1.1' is false
'+0.0' is false
'+0.1' is false
'+1.0' is false
'+1.1' is false
'[]' is false
'array()' is false
'array(null)' is false
'new foo()' is false
'fopen(\'/tmp/test\', \'x\')' is false
'null' is false
'NULL' is false
'' is true
'00' is false
'01' is false
'.0' is false
'.1' is false
'0.' is false
'1.' is false
'-9223372036854775809' is false
'-9223372036854775808' is false
'9223372036854775807' is false
'9223372036854775808' is false
'-179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858369' is false
'-179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368' is false
'179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368' is false
'179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858369' is false
'1 ' is false
' 1' is false
' 1 ' is false
'1 ' is false
'1	' is false
'0 ' is false
' 0' is false
' 0 ' is false
'0 ' is false
'0	' is false
リソース型 is false
存在しない変数 is true
*/


ちょっとビックリしたのが、
「empty(0.0)」はtrueで、
「empty('0.0')」はfalseなんですね(苦笑)
上記もマニュアルの方の内容も含めて、覚えていられます?(苦笑)
こういうのは、ガ〜っとコードを書いている時に、
混乱の元にしかならないと思うんですけどね。


で、改善案について、書くのって別に大変じゃないと思うんですけど、どうなんですかね?
さっきも書いたように、文字列だけは若干面倒と思いますけど、
ユーティリティ的に、別に関数を作って(str_empty()とか?)、それを呼べば良いんじゃないかとも思いますし。


「サッと書けて、楽だから(推測ですが)」って理由で、使われているのかもしれないですけど、
上記に書いた様な問題があると思いますので、今回取り上げました。


あと、もっと良い書き方がある等ありましたら、教えて頂けるとありがたいですね。

PHPのコーディングにおけるベストプラクティスを考える準備記事

もう、PHPの仕事は色々な顧客としてきています(10〜15顧客ぐらい?)が、
まあ、案件(正確には、書いた人)によってコードも色々ですし、
で、ルールも色々(PSRが多いといえば多いですが、守られていたりそうじゃなかったり)ですし、
混迷を極めている感があるなと(苦笑)


で、自分としても、「そういえば一回も考えた事が無いな」と思い、
それで、ちょっと考えてみようかなと思いまして。


ただ、まあ勿論PSR(PHPコーディング規約)もありますけど、
「微妙な関数」ってあるじゃないですか。
あれを、結構業務のコードで見るわけですよね。
なので、勿論書き方的なものも考えていきたいわけですが、
まずは、関数をレビューしていきたいなと。


そこで、以下には「特に取り扱い注意」と思われる関数やメソッドの一覧を、
準備として書いておきます。
出典は、勿論以下の公式です。

PHP: 関数・メソッド - Manual

あと今回は、あくまで準備なので、
以下に書いている関数は、
「関数名をパッと見て、自分が気になった関数」程度ですので、
取り上げない関数も出てくると思います。
あと、当たり前ですが、全ての関数を知っているわけじゃない(むしろ、殆ど知らないですね)ので、
業務で出てくる頻度が多い関数が多いかも。
あと、どの関数にも言えることですが、
「使う前には、最低限公式のマニュアルを読む」はマストだと思いますね。


とりあえず、以下が目に付きました。
思ったよりも、多いですね・・・


addslashes
array_flip
array_push
array_rand
array_search
array_slice
array_splice
basename
chmod
ctype_alnum
ctype_alpha
ctype_digit
date
debug_backtrace
die
each
empty
ereg
escapeshellcmd
eval(まず使わないと思うが)
exec・shell_exec・passthru・system
extract
fgetcsv
file_exists
file_get_contents
in_array
is_numeric
mail
mb_check_encoding
mb_detect_encoding
mb_ereg
mb_split
md5
mime_content_type
mkdir
mt_rand
mysqli_result::fetch_all
mysqli_result::fetch_array
mysql_*
ord
pathinfo
PDOStatement::fetchAll
pg_fetch_all
pg_fetch_array
preg_*
rand
readfile
rmdir
sha1
shuffle
sort(他のソート系の関数も)
split
stat
strcmp
strip_tags
strpos
strtotime
str_getcsv
uniqid

ファッションに全く興味が無い人程、気付きにくい話

この緊急事態で且つ、
テレワークとかで外出する事も少ない時期に書いてもねぇって話もありますが、
最近、昔書いた記事を取り上げたりする事も時々あるので、気にせずに書くことにします(笑)
去年のマスクのデザインを見た時に確信しましたけど、
「人は絶対に、他人と違う恰好をしたがる」と思いましたので、
何時なのかは分かりませんが、またファッションに注目する日々も訪れるでしょうと。


まず、タイトルについて、
基本的に、どの読み物でもそうだと思うんですが、
「興味が有る"から"読む」じゃないかと思うんですね。
でも、この記事はそうじゃない、むしろ真逆だと。
これ、この話に限らず厄介ですよね・・・なので、結構「タイトルの付け方」が大切じゃないかと。
で、どういうタイトルが良いんだろ?と、
以下の候補の様に、結構迷いましたね。

1.「ファッションに興味が有る人は、読まなくて良い話」
2.「ファッションに興味が無い人以外は、読まなくて良い話」
3.「ファッションに興味が無い人が、忘れている話」

・・・2が一番ストレートで良かった気もしますけど、
「キャッチコピー」って難しいなと思いましたね。


閑話休題


そろそろ本題に入りたいと思いますが、
今回の、読者のターゲット層の大体の目安は、以下に全て該当する様な人ですね。

1.ファッション関係のショップ(やエリア)に入るのは、多くても年5回以下
2.服などを買う時でも、特に色々見る事なく、すぐに買う(滞在時間が長くても1時間以下)
3.ZOZOTOWNの存在を知らない(か、殆ど見ない)

僕は、最近になって興味が出てきたわけですが、
興味が無かった時期は、年1~2回(年によっては0回)だったりもしたので、
1は、もっと少なくてもおかしくないですけどね。


それでは、いってみましょう。
あと、季節柄「冬物ネタ」が多くなっています。
だから、夏になったら、夏バージョンも書くかもしれないですね。
あと、僕は「男」なので、その点も考慮を。


1.予想以上に、色々な服が存在するという事


↑で「滞在時間が短い」と書きましたが、
それが原因で、「色々な服があるのを知らない」というのがありまして。
これ、書店(特に大型)でもあるんですけど、
「特定のジャンルしか見ないので、"え?こんな服もあるの?"っていうのに気付けない」んだと思いますね。
いや~こんなに色々な服があったとはね、それが何よりの驚きでしたね。
で、以下の、色々な服(勿論、これだけじゃないですが)も、これが前提になっているので、
先に書いておこうと。


2.胡坐(あぐら)状態でも、履いていて楽なズボン


要は、「ワーキングパンツ」とか「チノパン(最近、定義が曖昧になっている感がありますが)」とか、
あの辺のボトムスですね。
で、それで十分?じゃあ、用はないかもしれないですね。
例えば、これは「見た目はジーンズだが、ジャージの様な素材」という、「ジャージーズ」という商品ですね。
カラーや形(以下はスキニー)は、他にも色々ありますので、一例ですが。

edwin-mall.jp

いや、これは、とにかく「触ったり、試着しないと分かりにくい」と思いますね。
一応、素材が「綿58%、ポリエステル40%、ポリウレタン2%」と綿の割合が低いので、
ジーンズなのに変(普通は、ほぼ綿でしょ)」だったりはするとは思うんですけど、
興味が無い人が、知っている確率は当然低い(僕も、最近知った)でしょうし。

いや、これはちょっとビックリしましたね。
エドウィンなので直営店以外だと、ライトオンやジーンズメイトにはありますね。

あと、以下はアウトレットで買ったので今はもう売っていない?(公式では見つからず)かもですが、
もう少しフォーマル(同じデザインのジャケットもある)で、似たような素材のタイプですね。

https://store.united-arrows.co.jp/shop/glr/news/2019/07/max40offmens.html

ただ、上記と全く同じ商品は、ユナイテッドアローズのアウトレットにあるかもしれないですけど、
似た様な新作は出ているかもしれないといった所でしょうか。

あと・・・キリがないのでここまでですが、
他のブランドでも、多分そんなに珍しくないんでしょうね。
ただ、その中でも、現時点では上記2つ(特に、ジャージーズの方)が特に楽という印象でしたね。

あと、これは、在宅にはピッタリじゃないかと思いましたね。


3.アウター・インナー兼用のダウンジャケット


お~、こういうのもあるんですねって感じでしたね。
コロンビアは、これを買ったのはゼビオでしたが、
多分他にも一杯置いてますよね。

Amazon | (コロンビア) Columbia クローバーデイル インターチェンジ ジャケット 3WAY WE1489 | コート・ジャケット 通販

この「黒のインナージャケット」ですが、
これだけ着ても、「予想以上に暖かった(氷点下にならなければ大丈夫では?)」ですし、
首都圏だとオーバースペック気味で、稀にしか用が無いかもしれないですが、
勿論、インナーにする事も出来ると。
あと、真冬じゃないけど雨の日だと、場合によってはアウター「だけ」もありかなと思いますね。

これは、他のブランドにもあるか(あると予想してますが)分かりませんが、
結構使い勝手が良いかと思いましたね(だから買ったんですが)。


4.裏起毛の激暖タイツ


タイツは、以前から時々買ってはいたんですが、
裏起毛が、どうやらポイントの様で、これはビックリでしたね。
この辺は、しむむら・ドンキ(以下の商品はこっち)にありましたね。

item.rakuten.co.jp

ここまでいくと、まるで女性の様で、ちょっとやり過ぎ感があるかもですが、
個人的に、「乾燥肌」なので、
寒いのが、人一倍ダメなんですよ。
だから、こういうのが良いと。

他にもあるので、ここまで暖かいのは不要な場合でも、
もし知らないならちょっと見てみてもとは思いますね。


5.長袖のインナーシャツ


実は、長袖のインナーシャツは、どうも苦手だったんですよね(苦笑)
というか、基本的に服を着こむというのが、苦手(上記の乾燥肌と矛盾してますが)というか。
なので、少なくとも10年以上は着ていなかったんですが、
当然、半袖よりも暖かいですね(笑)
最初は、やっぱり違和感がありましたが、もう慣れました。

これは、特にどの商品がってわけじゃないのですが、
普通に1000~3000円台で売っているので、ちょっと気にして見てはどうかと。

でも、いくら興味無いとはいえ、ここは流石に該当者がいない気もしますけどね(苦笑)


6.ボクサーパンツの素材を気にする


特に冬限定ってわけじゃないんですが、
ボクサーパンツの素材について、

(1)「ポリエステルの割合が高いもの」
(2)「綿の割合が高いもの」
(3)「その他(ナイロン)の割合が高いもの」

とあり、これまでは(1)しか持っていなかった(大体安い)んですよね。
でも、(2)と(3)の、特に(3)はの履き心地がねぇ・・・
特に、暖かいわけではないと思いますが、とにかく「快適」の一言に尽きますね。

これも、沢山ありますし、
あと、似た商品が多いので以下じゃないかもしれませんが、
例えば、以下の様なナイロンの割合が高いやつですね。
店頭だと、ドンキにありましたね。

ボクサーパンツ(前とじ)(メンズ) | インナー・肌着・下着通販のGUNZE(グンゼ)【公式通販】グンゼストア

手元には、「ナイロン92%」のBODY WILDもあり、
とにかく快適としか言いようがない履き心地で、流石はグンゼとしか。

見ての通り、若干値段が高め(これまでは、1枚500円とかばかりでしたので)ですが、
下着にお金をかけるという習慣が無かった身としては、かなり衝撃でしたね。


7.セーターやカーディガンが意外と良い


これも、上記の長袖のインナーシャツと同じで、
どうも苦手だったんですが、
これは、ちょっと見直しましたね(特にカーディガンは、人生初だったので)。
単純に、これまでは冬でも、生地がペラペラのシャツ1枚を着ていたので、暖かいなと(苦笑)
一体、何をやっていたのか(苦笑)

で、どちらも、普通に色々な所に置いているので、一つだけにしますが、
以下(もっと生地が厚目な気もするので、違うかも)も、アウトレットで買ったので、
公式だともう売ってないかもですが、「とにかく暖かい」ので良かったですね。

Amazon | green label relaxing(メンズ) グリーンレーベルリラクシング カーディガン メンズ ベージュ_1004 L 【中古】 | カーディガン 通販

あと、この2つは、どちらも「洗濯不可がある?(まだ、見たことないけど)」かもなので、
「洗濯表示に特に注意」じゃないですかね。


8.冬のランニングとウインドブレーカー


これは、冬に外で運動する人だけでしょうけど、
ジャージ1枚だけだと寒いんですよね。
かといって、厚いジャンパーを着ると暑いわけで。

そこで、ウインドブレーカーと言うことで、
以下の、ネイビー×オレンジレッド色を買ってみたんですが、
寒くも暑くもなく丁度良かったですね。

webshop.montbell.jp

あと、モンベルの店舗に行くと分かると思うんですが、
ウインドブレーカー「だけ」でも、種類が多過ぎますね。
上記より、もっと生地の薄い商品とか、
もっと生地が厚い商品とか、色々あり過ぎて結構迷いました。
なので、逆に言えば、どれか気に入るのはあるのでは?とは思いますね。


9.コートやダウンジャケットって、こんなに安かったっけ?


ちょっと余談気味ですが、
コートやダウンで「1万円以下」って、昔からありましたっけ?
単純に、そこにも驚きましたね。
以下の、僕が買ったのはカーキー色ですが、7,499円って・・・

www2.hm.com

あと、ワークマン(ワークマン女子には、メンズもあるんですね(笑))に至っては、ダウンが5千円切ってましたし。
で、上記に限らず、基本的に最近は「服があり得ない程安い」と。
なんか、10年前ぐらいに、千円を切るジーンズというのもあった様ですが、
でも、興味が全く無いと、そんな事は知らないと。
いや、世間では話題だったのかもしれないですが、普通に知りませんでしたしね。

でも、服というのは、寒暖の為にも存在するわけですし。
でも、寒い状態では、仕事もままならないと思うわけで。
なので、暖房器具で、勿論カバーするわけですが、
でも、在宅勤務だと、電気代などがかかるわけで。
だから、場合によっては、節約の為に服を買わない方が、下手するとマイナスでは?と。
・・・まぁでも、流石にそれは、かなり極端な人だけですかね。

ただ、服を買わないという点については、安易な考えのミニマリズムが、どうも引っかかるんですけどね。
あれは、「服を買い過ぎて着ない服だらけになった人が、必要なものだけを買う為にする」なら良いと思うんですが、
「節約目的でする」するものじゃないんじゃないかなと。
目的の設定に疑問を感じたりはしますね。


話を戻しますが、
なので、極端にファッションに興味がない人でも、
服については、少しは気にした方が、良いと思いますけどね。
「寒暖さ(暖房で軽減は出来るわけですが)」と「快適さ」が、
仕事のどれくらい影響するか?って事だとは思うんですけど、
そんなに侮れないと思いますけどね。
あと、値段も、前述の通りなので、そこが問題になるケースは少ないんじゃないかと。


最後に、まとめですが、
質についてだと何処に拘るかで、どれか一つなら「下着」じゃないかと思いますね。
比較的値段が安いですし、あと何よりも「肌に直接触れる」ので、
「最も実感がしやすい」んじゃないかと。
今回は、機能性の話が多いので。
なので、まだ買ってないですが、今後は3000円ぐらいの、
高級ブランド物のボクサーパンツも計画中です(笑)
他は・・・とにかく価格がピンキリとしか言いようがないですからね。


で、これで終わりですが、もしファッションに興味が有ってここまで読んだ方がいた場合は、
ね?当たり前の話ばかりでしたよね?
「興味はあっても、意外な視点の話があった」ぐらいですかね、せいぜい。
それもない様なレベルの話じゃないかと思ってますけど。

で、本来のターゲットの、興味が無い方はどうでしたでしょうか。
「興味は無いけど、これぐらいは流石に知ってる」なら、どうしようもないわけですが、
何かタメになったなら、幸いです。

ファッションについては、今回が第一弾だったわけですが、
今後も、月1回ぐらいの頻度で書けたら良いかなぁって感じですね。

2020年の振り返りと2021年の目標

今年こそ、本当にどうなるかって感じでしたが、
何とか、この記事を書くことが出来ましたね。

まずは、振り返りから。


1.本業

サイクル的に、元々注意な年だったわけですが、
そこにコロナも来て更にって感じでしたね。

現状は、何とか落ち着いているので、
最悪のシナリオは避けられましたけど。


2.音楽

年の途中で散々書いてきましたので、特になしですね。


3.ギャンブル

途中で少し書いたりしてましたけど、一旦中止ですね。

というのも、他の趣味などと比較して気付いたんですけど、
これ、「当事者として今、やってない」ので、
どうも、やる気が上がらないんですよね。
なので、やる時が来ることがあればって感じですね。

本とかも、面白そうではあるんですけど、
でも、それだけじゃ、特に火は付かないんですよね(笑)


4.この場所に行けブログ

コロナとの相性がねぇ・・・に尽きますね(苦笑)
でも、似たような話の「ぶらり途中下車の旅」は放送してますので、
どこかのタイミングではね。

あと、「とんかつ」とか「温泉」とか単品じゃなくて、
「新宿エリア」とか、エリア単位にしようと思いましたね。
よっぽど良い所(か珍しい)なら、ピンポイントで単独の場所でも良いですけど、
そこそこの確率で「ハズレ(当たりではない)」も引いているので。


5.ファッション

本当に、まさか・・・としか言いようがないですね。
ただ、よくよく考えると、これ音楽との関連がありますね。
振り返ってみると「ラノベ→ゲーム→アニメ→ゲーム音楽→音楽→ファッション」の様な大体の流れがあった様ですし(笑)

で、前回のダイジェストにも少し書いてますが、
ネタは結構ありそうなので、5年ぐらい続くかもしれないですね。

ネタの中で最も興味があるのは・・・やっぱり「コーディネート」ですかね。
服じゃないだろと思いますが、「ノンデザイナーズ・デザインブック」も、まだ読んでませんでしたし(笑)
一つだけ決めているルールとしては、「黒い服は、出来るだけ着ない」ですね。
方向性として、「清潔」「さわやか」「明るい」方面を志向してますので(笑)
どこかのタイミングで、黒も取り入れるとは思うんですが、一回禁止にしようと。

あとは、インスタグラムも始めた方が良いのかなと、少し(笑)


振り返りはここまでで、以下からは目標です。

ただ、今年からは、目標というより「したいこと」を書いておくことにします。
いや、目標が大事じゃないって事は勿論ないんですけど、
これまでの達成率を考えると(苦笑)

あと、音楽やファッションの様に、
偶然ハマった様な事もあるので、それ待ちでも良いでしょうし。

サーバの更新みたく、「期限が決まっている」事については、
ちゃんとやっているので、
「それを、何時迄にやらなかったら、どうなるか」を整理して、
優先順位を付けていけば良いのかなと。
ここが明確じゃないから、ズルズル延びるのでは?と思いましたので。
以下の記事にも、同じ様な話書きましたけどね。

kitoku-magic.hatenablog.com

で、全部書くのは大変そうなので、随時追記する形にします。
来年以降もありますし。

■本業
DDDなども参考に、より良い設計指針を考えたい
vimの強化期間を設けて、爆速で操作したい
SQLのJOINをする・しないの基準を考えたい
パスワードなしの認証(ログインも)について考えたい

■本業以外
御殿場プレミアム・アウトレットに行きたい
新宿の伊勢丹に行きたい
銀座エリアでファッションを見たい
原宿・表参道・青山通りでファッションを見たい
アメ横に行きたい
高田馬場(とんかつ激戦区?)に行きたい
馬車道(とんかつ激戦区?)に行きたい
秋葉原(とんかつ激戦区でもある?)に行きたい
豚組 しゃぶ庵(六本木)に行きたい
マザー牧場に行きたい
ゴーカートに乗りたい
ザ・リッツ・カールトンホテルに泊まりたい
オーロラを見たい

なんじゃこりゃって感じですね(笑)
「原宿・表参道・青山通り」は、どこで知ったかも覚えてませんけど、
「それぞれの原宿」という曲から取ってきています(笑)

パッと思い付いたのだけ書きましたので、
今後は、思い出したら追記していくことにします。

それでは、今年はここまでです。

来年もよろしくお願いします。

2020年9月12日から2020年11月27日のダイジェスト

前回もそうでしたが、
今回もお題目が少なめなので、
ダイジェストは今回で一旦終わりにします。
Twitterなどの方に、また書き始めましたしね。


1.コロナ対策と、空気清浄・加湿器?

いや、なんか対策に良いという話があって、
それが原因でバカ売れしているという話がありましたので。
・・・対策に良いのかは分からないですが、
ただ、加湿器はどっちにしてもあった方が良いか・・・


2.色々なWi-Fi

これまでは、WiMax2のルーターを使っていたわけですが、
これが、「そこまで必要ない(オーバースペック気味)」状況になってきたので。

(1)スマホ(以外もだが)を無線Lanルーターに繋ぐ

以下リンクにありますが、
いや、何故か気付かなかったので(苦笑)

データ通信量を節約!スマホをWi-Fiにつないで快適&賢いスマホライフ | マイポケットStyle


(2)スマホテザリング

↑の(1)が、不安定になったとかの時に、これが良いんじゃないかと。
申し込みの時間帯によっては、即日利用可能みたいですし。

(3)Wi-Fiレンタル

レンタルがあったというのは・・・これも、最速で翌日利用可能と速いですね。
引っ越し用途なんかは、これが良いかも。


3.極論が、よく目に付く昨今

いや、以下の前半とか仮定も含まれてますけど、まさに極論かなと思いますし。

日本を滅ぼすものがあるとしたら…? 「LGBTが広まれば」に対する漫画に、共感の声 – grape [グレイプ]

で、極論といえば、以下の記事を思い出しましたね。

たまにはぱるメロ以外のことでも(何 その5:正論と極論 | なんとなくぱるメロな話

極論って、
「ある事についての本質を導き出すには有効」だとは思うんですが、
「間違ってないけど、あんまり使えない論」という感じなので、
実際の決断なんかには、参考程度にという印象なんですよね。


4. コンピューターサイエンスの学習は、職業エンジニアになることを阻害する

これは、自宅で料理や掃除をするにあたって、
自分でも出来るけど、もっと良いものを求めるので、
「外食」や「ハウスクリーニング」を使うという話じゃないですかね。
だから、以下の様な順序になるんじゃないかと。

一般の人(非エンジニア)

コンピュータサイエンスを知らない)エンジニア

コンピュータサイエンスを知っている)エンジニア

コンピュータサイエンスの有無は、
知らないと出来なさそうな事を頼もうとしているかどうか?で、
分ける(ハッキリは分かれないでしょうけど)として。


5. IT業界に教える文化は無いよ。だってネットにノウハウが転がっているもの。 - Togetter

特に教えない方について、
以下みたく、分けられると思うので、
その辺のポリシーを、ある程度明確にすれば良いんじゃないですかね。

(1)本当に、何にも教えない
(2)ググり方は教える
(3)Web上の記事や、本のタイトルは教える
(4)途中までは教えるが、途中からは教えない


6.Amazonで「入手困難な食料品」を買う

ライフスタイルなんでしょうけど、
Amazonは本かCD・DVDで8割以上占めているので、
食料品という発想が無かったですね。

https://www.amazon.co.jp/dp/B088KKCPC5

↑は、一時期スーパーやコンビニにあったんですが、
最近見かけないなと思いまして。

https://www.amazon.co.jp/dp/B07PG3STCB
https://www.amazon.co.jp/dp/B012VTSQVW

↑2つは、探せばあるけど、
少し手に入りにくい感じですね。

そして、もっとも驚いたのが・・・

https://www.amazon.co.jp/dp/B003GYRNLQ

おお・・・北海道に行かなければ買えないという希少性を手放したんですね。
といっても、レビューを見ると、それで良いのではとも思いましたけど。
希少性は・・・そういう商品を、また作れば良いと思いますしね。

で、ダークモカ白い恋人を、これを書きながら食べていますが・・・幸せですね(笑)
あと、↑のWi-Fiもそうですけど、
これも「何故、気付かなかった」ですね。


7.ギャンブル

・・・今回もまた延期なんですが、
以前にリンクを張った本に加えて、
以下の本の内容が、僕がイメージしていた内容と似ている気がしますね。

確率思考の戦略論 USJでも実証された数学マーケティングの力 | 森岡 毅, 今西 聖貴 |本 | 通販 | Amazon

なので、上記の本などを読んで、感想があったらそれを書いて終了かなと。
といっても、それを読めていないわけですが(苦笑)

あと、これはギャンブルというか競馬ですが、
明日11/29のジャパンカップは・・・「20年に一度レベルの大一番」じゃないですかね。
「無敗の三冠馬対決」だけでも凄いのに、そこにアーモンドアイも加わってますからね。
アーモンドアイは今回で引退だけどどうか?
今年の直近2戦(安田記念天皇賞秋)で思いましたが、ちょっと衰えているとは思いますね。
ただ、絶対能力の違いで、それでも勝つかもですけど。


8.音楽

前回、米津さんをガッツリ書いて「完全燃焼」した感じですね。
ネタは山程あれど、「全然書く気がしない」(笑)
いや、相変わらず曲は聞いてはいますけど、しばらくは書く気ないですね。
書く気ないのは、↓の影響もありそうですけど。
・・・来年に、今聞いているglobeについて総括を書くかもですね、短めの文章量で終わるかもしれませんけど。


9.ファッション

振り返ってみると、2016年ぐらいから「ちょっとした予兆」ぐらいはあったんでしょうけど、
去年ぐらいから本格的に火が付き始めて、
今年の、特に下半期辺りから、完全に火が付いた感じですね。
といっても、「僕がファッションにハマるなんて有り得ない」と思っていただけに、
本人が、一番驚いているんですけどね(笑)
何故か?・・・色々あるので物凄く複雑ですが、
2年ほど前に、服装(サンダルが原因?)が原因で、仕事の受注に悪影響を及ぼしたのが、一つありますね。
一部の方は、トラウマレベルでイメージされる?いわゆる、スーツ族とはまた違うタイプで。

軽く200行ぐらい書けそうですが、
今回は初回ということで、予定しているコンテンツ候補(まだまだ増えそうですが)を箇条書きで書いておくだけにします。

・服の寿命と買い替えタイミングについて
・トップスについて
・ボトムスについて
・アウターについて
ファストファッションと、どう付き合う?
・(特に高級)ブランドと、どう付き合う?
・洗濯について
・洗剤について
・洗濯ネットについて
・洗濯の干し方について
・靴について
・靴のメンテナンスについて
・ベルトについて
・マフラーについて
・ハンガーについて
・腕時計について
・アウトレットについて
・全体的なコーディネートについて
【追記】
・各ブランドの接客の特徴について


といっても、「洗剤」だけ少し書いておきましょうか。
・・・これが「普通」なのかどうか分かりませんけど、
今の所は、以下の洗剤を用途に応じて使い分けていますね。
・・・柔軟剤も、買った方が良いかな(笑)

(1)白物で且つデリケートじゃない服は、部屋干しトップ

https://www.amazon.co.jp/dp/B06WCZ9RFS

(2)白物以外で且つデリケートじゃない服は、フレグランスニュービーズ

https://www.amazon.co.jp/dp/B07BDMV525

(3)デリケートな服は、エマール

https://www.amazon.co.jp/dp/B086LVRPB1

(4)白物で、中々取れない汚れを取りたい時は、オキシクリーン(色々な用途に使える様ですけど)で、つけ置き洗い

https://www.amazon.co.jp/dp/B001Q7FU9M


とりあえず、今回はここまでで、
次回以降は、単独の記事として、一つずつ書いていくと思います。