Windows10の新フォント「UDデジタル教科書体」をブラウザで使ってみる

ちょっと前の話だけど、Windows 10 Fall Creators Updateでフォントが追加された。

forest.watch.impress.co.jp

で、UDデジタル教科書体 NK-Rをブラウザのデフォルトのフォントにしてみた。 ちなみに使っているのはSurface Pro 4で解像度は2736 x 1824、スケーリングは200%。ブラウザはFirefox Developer Editionです。

f:id:iakio:20180206190717p:plain

長いドキュメントを読むときはなかなか良いと思う。

f:id:iakio:20180206192633p:plain

あと書くときも良い。なんというか、ちょっと違った気分になる。

他のフォントと混ざったとき、最初は違和感があったけどだんだん気にならなくなってきた。

f:id:iakio:20180206190749p:plain

2017年はこんな年でした

あと適当に動画貼っておきます。 www.nicovideo.jp

もっと前はこんな年でした

PostgreSQL勉強会@札幌で発表してきました

SQLを実行したときに、PostgreSQLはどのようにデータにアクセスしているのか」というタイトルで発表してきました。

jpug-ezo.connpass.com

ほとんどデモだけなので、発表資料はありません。

データベースって、ただ単にデータを読んだり書いたりするだけのものなのに、それを何十年も作り続けている人たちがいて、 PostgreSQLに関して言えば毎年メジャーバージョンアップをしてるわけです。

その裏側にはものすごくいろいろな工夫があって、自分はそれをソースコードを読んで、頭の中で動きを想像して面白いなーって思うんだけど、 データベースが動くところが目に見えれば、もっと面白いんじゃないかなあ、という感じの発表でした。

autovacuumが動いてほしいときにはなかなか動かなくて、余計な時に動くという古典的なコントみたいな展開も手伝って、 予想以上に楽しんでもらえたように思います(ポカーンだったらどうしようと思ってました)。

最後にFILLFACTORを設定しないテーブルと設定したテーブルの比較をしたのですが、 懇親会で @kkkida_twtr さんに、FILLFACTOR設定した方ではHOTが効いてインデックスが更新されていなかったはずということを教えてもらって、 めっちゃその説明すればよかった!と思いました。

当日の様子は#jpugezoで多少感じられるかもしれません。

#jpugezo - Twitter Search

2016年はこんな年でした

取りあえず今年一番言いたいことは、これ本当にいい話なのでみんな見てほしいということです。 今年というかここ数年で一番のスライド。

speakerdeck.com

あと適当に動画貼っておきます。

www.nicovideo.jp

www.nicovideo.jp

もっと前はこんな年でした

「基本からしっかり学ぶ Symfony2 入門」メモ(3)

「基本からしっかり学ぶ Symfony2 入門」を買った。

基本からしっかり学ぶ Symfony2入門

基本からしっかり学ぶ Symfony2入門

基本からしっかり学ぶ Symfony2入門:書籍案内|技術評論社

hidenorigoto/symfony2-book: 基本からしっかり学ぶSymfony2入門 サポートサイト

Writer::createFromStringの引数について

前回、Write::createFromString('', '')の引数は2つだったと書いたけど、その意味を見ていなかった。第二引数はv7.0では改行コードだったが、v8.0では削除され引数は1つになったようだ。

8-3 独自のサービスの定義

debug:containerでエラーとなった。

> php.exe C:\Users\ishida\PhpstormProjects\classic-symfony\bin\console debug:container app.inquiry_csv_builder


  [Symfony\Component\DependencyInjection\Exception\InvalidArgumentException]
  The file "C:\Users\ishida\PhpstormProjects\classic-symfony\src\AppBundle\De
  pendencyInjection/../Resources/config\services.yml" does not contain valid
  YAML.



  [Symfony\Component\Yaml\Exception\ParseException]
  The reserved indicator "@" cannot start a plain scalar; you need to quote t
  he scalar at line 7 (near "arguments: [%csv_encoding%, @app.inquiry_reposit
  ory]").

'@app.inquiry_repository'とシングルクォートで囲む必要があった。

8-4 独自の設定値の定義

この本の山場であり、Symfonyの最大の特徴ではないかと思う。

MemberjoinedDate@var \DateTimeとなっているがstringなのでは?

prototypeがわからない。

    members:
        山田: {part: トランペット, joinedDate: "2010-10-01"}
        田中: {part: バイオリン, joinedDate: "2008-04-10"}

同じようなものを繰り返す時に使うということか。

例えばこれを

    members:
        - {name: 山田, part: トランペット, joinedDate: "2010-10-01"}
        - {name: 田中, part: バイオリン, joinedDate: "2008-04-10"}

と書くこともできるのだろうか。

できた。

https://github.com/iakio/classic-symfony/commit/d9f4e70820c180996ec9b8704290f450e5893d73

でも一意な識別子がある場合は元の書き方の方が良さそうだ。

「基本からしっかり学ぶ Symfony2 入門」メモ(2)

「基本からしっかり学ぶ Symfony2 入門」を買った。

基本からしっかり学ぶ Symfony2入門

基本からしっかり学ぶ Symfony2入門

基本からしっかり学ぶ Symfony2入門:書籍案内|技術評論社

hidenorigoto/symfony2-book: 基本からしっかり学ぶSymfony2入門 サポートサイト

6-2 管理者用画面の実装

「お問い合わせエンティティへの管理フィールドの追加」で、 Inquiryprocess_statusprocess_memoを追加するところでエラーとなった。

> php.exe C:\Users\ishida\PhpstormProjects\classic-symfony\bin\console doctrine:schema:update --force
Updating database schema...

  [Doctrine\DBAL\Exception\NotNullConstraintViolationException]
  An exception occurred while executing 'ALTER TABLE inquiry ADD process_stat
  us VARCHAR(20) NOT NULL':
  SQLSTATE[23502]: Not null violation: 7 ERROR:  列"process_status"にはNULL値
  があります



  [Doctrine\DBAL\Driver\PDOException]
  SQLSTATE[23502]: Not null violation: 7 ERROR:  列"process_status"にはNULL値
  があります



  [PDOException]
  SQLSTATE[23502]: Not null violation: 7 ERROR:  列"process_status"にはNULL値
  があります


doctrine:schema:update [--complete] [--dump-sql] [-f|--force] [--em [EM]] [-h|--help] [-q|--quiet] [-v|vv|vvv|--verbose] [-V|--version] [--ansi] [--no-ansi] [-n|--no-interaction] [-e|--env ENV] [--no-debug] [--] <command>


Process finished with exit code 1 at 21:06:39.
Execution time: 858 ms.

process_status, process_memoはNOT NULLだが、この時点で既にレコードが挿入されていたため。

それぞれデフォルト値を指定することにした。

     * @ORM\Column(name="process_status", type="string", length=20, options={"default":"0"})
...
     * @ORM\Column(name="process_memo", type="text", options={"default":""})

7-1 データフィクスチャ

app/consoleの実行にPhpStormのCommand Line Tool Supportを使っていたのだが、doctrine/doctrine-fixtures-bundleをインストールして新しいコマンドを追加したときは、コマンド一覧のリロードが必要となる。

f:id:iakio:20160220213631p:plain

7-2 CSVダウンロード機能の作成

何故Write::createFromString(",")と引数にカンマを渡しているのだろうと疑問に思っていたのだけれど、サンプルコードを見て意味が分かった。これはダブルクォートじゃなくてシングルクォート2つだった。

つまり、

  • Write::createFromString(",")と、カンマを渡しているように見えたが
  • Write::createFromString('', '')と、空文字を2つ渡していた

買ったのはKindle版。紙の本では見ていない。

7-4 APIの作成

この本は全体的にSymfony以外の部分については、よく言えばシンプルに書いてある。Concertの設計がdate:datetime:timeというのはなかなか大胆。

「ちょっとした確認用にテストコマンドを用意しておくと便利」はとても良いアドバイスだと思う。

「基本からしっかり学ぶ Symfony2 入門」メモ(1)

「基本からしっかり学ぶ Symfony2 入門」を買った。

基本からしっかり学ぶ Symfony2入門

基本からしっかり学ぶ Symfony2入門

基本からしっかり学ぶ Symfony2入門:書籍案内|技術評論社

hidenorigoto/symfony2-book: 基本からしっかり学ぶSymfony2入門 サポートサイト

環境について

本書での確認環境は、

とのことだが、そのままやってもつまらないので

を使っている。

4-2 フォームの基本

$this->createFormBuilder()->add('name', 'text')は第二引数にクラス名を渡して->add('name', TextType::class)と書くようになったようだ。

choiceの時の引数が変わったようだ。

            ->add('type', ChoiceType::class, [
                'choices' => [
                    '公演について' => 0,
                    'その他' => 1
                ],

4-3 メール通知機能の作成

app/config/parameters.ymlapp/config/parameters.yml.distの違いは?

Gmailを使うのであれば、2段階認証を無効にした開発用メールアドレスを用意するという方法の他に、アプリケーションパスワードを設定しても良さそうだ。

5-4 BlogArticleの作成

レコードの追加時にエラーが発生した。

INSERT INTO blog_article(title, target_date, content) VALUES
  ('本年もよろしくお願い致します', '2015-1-3', '');
[2016-01-25 20:56:06] [23502] ERROR: 列"id"内のNULL値はNOT NULL制約違反です
  詳細: 失敗した行は(null, 本年もよろしくお願い致します, 2015-01-03, )を含みます

blog_articleテーブル定義で、id列にDEFAULT値が設定されていなかった。Doctrine ORMでは、@GeneratedValueのstrategyにAUTO、SEQUENCE、IDENTITYといったものがあり、PostgreSQLを使う場合はAUTOだとこうなる模様。

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/basic-mapping.html#identifier-generation-strategies

SEQUENCEにしても良さそうだけど、とりあえずデータの投入方法を以下のようにしてお茶を濁した。

INSERT INTO blog_article(id, title, target_date, content) VALUES
  (nextval('blog_article_id_seq'), '本年もよろしくお願い致します', '2015-1-3', '');