まだプログラマーですが何か?

プログラマーネタ中心。たまに作成したウェブサービス関連の話も https://twitter.com/dotnsf

2018/04

JavaScript 製オープンソース Web フレームワークである AngularJS は、リッチなフロントエンドを簡単に作ることができて便利です。実は業務でも使っています(個人的にはまあ色々言いたいこともあるけどw)。 一方で、AngularJS やマテリアルデザインである Angular Material は特に日本語での情報があまり多くなく、標準以外の機能を使おうとすると色々苦労することがあります。その辺りを補足する目的もあって、調べたことのメモを公開します。


AngularJS を使うことで普通に作っても見栄えがよくなりますが、サブモジュールである Datepicker を使うと、日付データの入力に便利な UI を簡単に配置できます(↓こんなやつです):
2018040301


この Datepicker を使う方法も簡単で、JavaScript コード側で @angular/material/datepicker をインポートしておいて、
import {MatDatepickerModule} from '@angular/material/datepicker';

その上で以下のような HTML を記述するだけです:
  :
  :

<mat-form-field>
  <input matInput [matDatepicker]="picker" placeholder="Choose a date">
  <mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle>
  <mat-datepicker #picker></mat-datepicker>
</mat-form-field>

  :
  :

すると上記画像のように <input> フィールドそのものに CSS が適用され、カレンダーアイコンをクリックして日付選択ができるようになる、というスグレモノです。モバイルブラウザのタッチイベントにも対応していたりするなど、機能的にも優秀です。日付選択は HTML5 の type="date" を使う方法もありますが、まだ主要ブラウザの実装もまちまちで、対応されていてもちと使いにくさを感じることもあるため、現時点での代用品としてはかなりの需要があると思っています。


一方で、この Datepicker にも問題点はあります。標準機能をそのまま使うと、選択した日付は日本ではあまり馴染みのない M/d/yyyy フォーマットで画面に表示されることです:
2018040302


この表示部分だけでもなんとか日本式の yyyy/M/d フォーマットにできないだろうか・・と調べた結果が以下の方法です。いくつかの対応手段がありそうですが、簡単なのは「日本ロケール(ja-JP)を指定する」以下のやり方でした。

HTML はそのままで、JavaScript を以下のように書き換えます:
//. 赤の2行を追加インポート
import {MatDatepickerModule} from '@angular/material/datepicker';
import {MAT_MOMENT_DATE_FORMATS, MomentDateAdapter} from '@angular/material-moment-adapter';
import {DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE} from '@angular/material/core';

  :
  :

@Component({
  selector: 'datepicker-locale-example',
  templateUrl: 'datepicker-locale-example.html',
  styleUrls: ['datepicker-locale-example.css'],
  providers: [
    //. 'ja-JP' ロケールを指定
    {provide: MAT_DATE_LOCALE, useValue: 'ja-JP'},

    //. MomentDateAdapter と MAT_MOMENT_DATE_FORMATS をインポート
    {provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE]},
    {provide: MAT_DATE_FORMATS, useValue: MAT_MOMENT_DATE_FORMATS},
  ],
})

  :
  :

export class DatepickerLocaleExample {
  //. クラスのコンストラクタに DateAdapter を渡す
  constructor(private adapter: DateAdapter) {}
}

この変更を加えて上で同じ HTML を参照すると、日付は日本ロケールで表示されるようになります:
2018040303



めでたしめでたし。


(参考)
https://material.angular.io/components/datepicker/overview

この「まだプログラマーですが何か?」ブログは 2013 年から定期的に更新しています。扱う内容はオープンソースネタだったり、Kali Linux だったり、LAMP だったり、IBM Cloud だったり、ノーツだったり・・・と色々ですが、ページ毎に月間アクセスランキングを見た場合の月間一位は常にトップページ(http://dotnsf.blog.jp/)でした。が、昨月はその月間アクセスランキングに初めて異変が起こりました:
20180403


これまで5年近く月間アクセス数では常に1位だったトップページが3位となり、個別ページが1位と2位になったのでした。びっくり!

ちなみに1位のページがこちら:
クロスドメイン問題と Access-Control-Allow-Origin ヘッダ

そして2位のページがこちらです:
Linux の cp コマンドで強制上書き


2位のページは 2014 年の記事で、実は月間1位になったことこそなかったものの、平均的にアクセス数が高い状態をキープしている記事でした。内容は Linux の cp コマンドを実行した時のコピー先に同名のファイルが存在していると必ず「上書きしますか?」と確認してくれるのですが、複数のファイルをまとめて上書きする時にいちいち返事するのは不便なので、なんとかする方法を紹介しています。結構この問題で困っている人が多いようで、ずっと一定以上のアクセスを記録している記事でしたが、3月はトップページ参照回数をも上回るアクセスを記録しました。

そして1位のページは 2016 年の記事なので、こちらも特別に目新しい内容ではないのですが、AJAX を使った時などによく問題になるクロスドメイン問題と、この問題をサーバー側の設定(が可能な場合)で解決する方法について紹介したものです。どういった背景があるのか分からないのですが、2月下旬くらいからこの記事のアクセス数が急激に増え、3月通算では1位となったようです。


このページのトップヘ