font-family で游ゴシックを設定する

font-family で游ゴシックを設定しても Windows の Chrome で見るとかすれて見える問題の対処。

@font-face {
  font-family: 'My Yu Gothic';
  font-weight: normal;
  src: local('Yu Gothic Medium');
}

@font-face {
  font-family: 'My Yu Gothic';
  font-weight: bold;
  src: local('Yu Gothic Bold');
}

body {
  font-family: 'YuGothic'         /* Mac */
             , 'My Yu Gothic'     /* Win Chrome以外 */
             , 'Yu Gothic Medium' /* Win Chrome */
             , sans-serif;
}

body * {
  font-family: inherit;
}

.bold {
  font-weight: bold;
}

Windows の Chrome だと @font-face を使っても src: local('Yu Gothic Bold'); のような太さによる細かい指定が無視されてしまうみたいですが、

  • Chrome では Yu Gothic Medium を太字にしてもそれほど見づらくならない
  • @font-face は Chrome 以外なら Medium や Bold が使える

ということを踏まえて、考えてみました。

游ゴシックフォントデモ

全称セレクタは Safari 用に入れてます。

Ubuntu 18.04 (Bionic Beaver) に MySQL をインストールする

aptmysql-server をインストールします。

$ sudo apt update
$ sudo apt install mysql-server

インストールが終わると自動的に MySQL サーバーが起動するようです。

$ service mysql status
● mysql.service - MySQL Community Server
   Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: en
   Active: active (running) since Sun 2019-03-17 07:36:24 UTC; 19s ago
 Main PID: 19007 (mysqld)
    Tasks: 27 (limit: 1152)
   CGroup: /system.slice/mysql.service
           └─19007 /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pi

ところが root でログインしようとしてもできません。

$ mysql -uroot
ERROR 1698 (28000): Access denied for user 'root'@'localhost'

これは root の認証方法がデフォルトで auth_socket に設定されているためです。
auth_socket についての詳細は https://dev.mysql.com/doc/refman/5.7/en/socket-pluggable-authentication.html で確認できます。

簡単に説明すると、認証方法が auth_socket に設定されている場合は以下のいずれかに一致する時のみログインすることができます。

  • mysql コマンドで指定したユーザ名が、Ubuntu にログイン中のユーザ名と等しい(今回は root
  • mysql.user テーブルにある、 mysql コマンドで指定したユーザ名の行の authentication_string 列の値が Ubuntu にログイン中のユーザ名と等しい

つまり Ubuntu 上で root ユーザになってからログインすればよいということなので、sudo を使ってログインします。

$ sudo mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.25-0ubuntu0.18.04.2 (Ubuntu)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

ログインできました。

mysql.user テーブルを確認すると確かに auth_socket になっています。

mysql> select User, plugin, authentication_string from mysql.user;
+------------------+-----------------------+-------------------------------------------+
| User             | plugin                | authentication_string                     |
+------------------+-----------------------+-------------------------------------------+
| root             | auth_socket           |                                           |
| mysql.session    | mysql_native_password | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.sys        | mysql_native_password | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| debian-sys-maint | mysql_native_password | *D7714B61633694B96C8A02C2486C20B8ADBEFE53 |
+------------------+-----------------------+-------------------------------------------+
4 rows in set (0.00 sec)

新しく作成したユーザの認証方法はデフォルトで mysql_native_password になるようです。

mysql> CREATE USER newuser IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.00 sec)

mysql> select User, plugin, authentication_string from mysql.user;
+------------------+-----------------------+-------------------------------------------+
| User             | plugin                | authentication_string                     |
+------------------+-----------------------+-------------------------------------------+
| root             | auth_socket           |                                           |
| mysql.session    | mysql_native_password | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.sys        | mysql_native_password | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| debian-sys-maint | mysql_native_password | *D7714B61633694B96C8A02C2486C20B8ADBEFE53 |
| newuser          | mysql_native_password | *2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19 |
+------------------+-----------------------+-------------------------------------------+
5 rows in set (0.00 sec)

root の認証方法を変更する

root の 認証方法を auth_socket から変えたい場合は ALTER USER 文を使います。

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
Query OK, 0 rows affected (0.00 sec)

変更できました。

mysql> select User, plugin, authentication_string from mysql.user;
+------------------+-----------------------+-------------------------------------------+
| User             | plugin                | authentication_string                     |
+------------------+-----------------------+-------------------------------------------+
| root             | mysql_native_password | *2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19 |
| mysql.session    | mysql_native_password | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.sys        | mysql_native_password | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| debian-sys-maint | mysql_native_password | *D7714B61633694B96C8A02C2486C20B8ADBEFE53 |
| newuser          | mysql_native_password | *2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19 |
+------------------+-----------------------+-------------------------------------------+
5 rows in set (0.00 sec)

配列から任意の数の組み合わせをすべて求める

配列 [1,2,3,4,5] からいずれか 2 つ(重複なし)を取得する時の例。

(function() {
  var base = [1,2,3,4,5];
  var num = 2;

  var combi = get_combi(base, num);
  console.log(combi);
})();

function get_combi(base, num, ary = [], idx = 0) {
  var result = [];
  for (var i = idx; i <= base.length - num; i++) {
    var newary = ary.concat(base[i]);
    if (num > 1) {
      var r = get_combi(base, num-1, newary, i+1);
      Array.prototype.push.apply(result, r);
    } else {
      result.push(newary);
    }
  }
  return result;
}

簡単にできるかと思ったら意外と難しくて2日間頭を悩ませました。
組み合わせの数が膨大になるとメモリがクラッシュするっぽいので改善の余地ありです。
いやー、再帰は頭が死ぬのであまり使いたくないですね。