JavaScript の String.prototype.split() の第二引数 limit は、ほかの言語と意味が違う

JavaScript の split メソッドを使ったら「あれ?」となったのでメモ。

一般的な spilt メソッド

Java, C#, Ruby, Perlsplit メソッドは、第二引数に limit を指定できます。 これを指定すると分割回数が制限されます。
(下記の例だと、文字列を2つに分割しています)

Java
"aaa,bbb,ccc".split(",", 2)
// ==> String[2] { "aaa", "bbb,ccc" }
C#
"aaa,bbb,ccc".Split(new char[]{','}, 2)
// ==> String[2]{ "aaa", "bbb,ccc" }
Ruby
"aaa,bbb,ccc".split(",", 2)
# ==> ["aaa", "bbb,ccc"]
Perl
split(/,/, "aaa,bbb,ccc", 2)
# ==> ("aaa", "bbb,ccc")

JavaScript の spilt メソッド

JavaScriptsplit メソッドも、第二引数に limit を指定できます。 ただ、ほかの言語と意味が違っていて、これを指定すると戻り値の要素数が制限されます。
(下記の例だと、文字列を分割して最初の2つを返しています)

JavaScript
"aaa,bbb,ccc".split(",", 2)
// ==> Array [ "aaa", "bbb" ]

MDN には「見つかった分割結果の数の制限を指定する整数です。」と書かれています。
パッと読んだ感じほかの言語と同じかなっと思ったんですが、よく考えると違ったという…。

お気を付けください!

意地でも IE を使わずに Firefox をダウンロードする方法

新しい Windows 7 の PC を使おうとしたら Internet Explorer (IE) しか入っていませんでした。
しかし、私は IE が嫌いなので、Firefox を使いたいです。

そこで、Firefox ダウンロードしようと思い…、そこで気づきました。
Windows 7Firefox を使おうとしたら、まず最初に IE を起動しなくてはいけません。

しかし、私 は I E が 大 嫌 い で す。

そこで、Windows の機能だけで Firefox をダウンロードする方法を編み出してみました。

IE を使わずに Firefox をダウンロードする

  1. 「ファイル名を指定して実行」を開く
  2. 「参照」ボタンをクリック
  3. ファイル名欄に https://mzl.la/2inJu0a と入力1して、「開く」ボタンをクリック
    f:id:chiheisen:20190220011642p:plain
  4. 「ファイル名を指定して実行」の名前欄に C:\Users\… で始まるパスが入っているので、その前後に文字を付け加えます。
    cmd /c move "(入力されたパス)" "(移動先のパス)\Firefox.exe"
    f:id:chiheisen:20190220011717p:plain
  5. 「OK」ボタンをクリック

これで、Firefox をインストールできるようになりました!! f:id:chiheisen:20190220011719p:plain

なにやってるの?

ファイルを開くダイアログには「URLからファイルをダウンロードして開く」という機能があります。それを使って、インストーラをダウンロードしました。
ただ、そのままだとファイルに拡張子がつかないので実行できません。
そこで、最後にファイルを移動しつつ拡張子を付けています。

これで、IE を使わずに済みますね!2

豆知識

https://bit.ly/firefox へアクセスすると IE のページに飛びます。


  1. https://download.mozilla.org/?product=firefox-latest&os=win&lang=ja への短縮URL

  2. Windows 10 なら、curl が使えるのでもっと簡単に Firefox をダウンロードできます。

JJUG CCC 2018 Fall( #jjug_ccc ) - セッション資料の一覧

JJUG CCC 2018 Fall に行ってきました!

今回、興味のあるディープな JVM の話とかアーキテクチャ設計をたくさん聞けて、個人的にはとてもテンションが上がりました!
「Deep dive into instanceof」のように、HotSpot VM の深い話を知れたり。仕事で役に立つわけではないですが、完全に趣味として、こういう話を聞けるのはとても好きで楽しいです。
一方で、アーキテクチャ系の話もいろいろ聞けて、こちらは仕事で生かせそうです。最近、うまく設計できなくて四苦八苦していたことが続いていたのですが、その解決に向けてのヒントになりました。

この幅広さとバランスが JJUG CCC のいいところだと思います!


さて、最後にいつものを。

今回、残念ながら満席だったり時間がかぶってしまって参加できなかったセッションもあったので、あとで読むために現時点で発表者の方が公開されている資料一覧をまとめしました。*1
(あとで JJUG CCC 2018 Fall のページにもリンクが載るかもしれませんが、とりあえず自分の方で調べました)
追記:JJUGGitHub ページで公式な資料一覧が公開されました!
jjug-ccc/slides-articles-2018Fall: JJUG CCC 2018 Fall 登壇資料まとめ

10:00-10:45

11:00-11:45

12:00-12:45(ランチセッション)

13:30-14:15

14:30-15:15

17:45-18:30

*1:発表者のお名前は敬称略とさせていただきました。

Arrays.asList(T... a) は、なぜ add や remove ができないのか?

Arrays.asList(T... a) というメソッドについてググると、「このメソッドで返ってくる List は、addremove ができないので注意しましょう」ということが良く書かれています。
でも、「なぜできないのか?」という点については書かれていないことが多いので、理由を説明します。


一言でまとめると「配列を List として扱えるようにラップするためのものだから」です。
(「変換するもの」ではないです)

そもそも、どう使うもの?

配列を List として扱いたいときに使います。


例えば、シャッフルするのに Collections.shuffle​(List list) という引数に List を取るメソッドはあるのですが、引数に配列を取るメソッドがありません。
そういうときに、 Collections.shuffle(Arrays.asList(a)) という風にラップすることで、引数に配列を渡せるようになります。


Arrays.asList(T... a) で返ってくるリストは元になった配列と連動しているので、この List の要素を書き換えれば配列の要素も書き換わります。

String[] array = new String[] {
    "aaa", "bbb", "ccc", "ddd", "eee"
};

// 配列を List にラップしてシャッフルする
Collections.shuffle(Arrays.asList(array));

// 元の配列が、ちゃんとシャッフルされている
// => [ccc, eee, ddd, bbb, aaa]
System.out.println(Arrays.toString(array));


Arrays.asList(T... a) が返すリストクラスの実装を見てみると、配列をラップしているだけなのがよく分かると思います。 ((この ArrayListjava.util.ArrayList とは別のクラスです。))

private static class ArrayList<E> extends AbstractList<E>
    implements RandomAccess, java.io.Serializable
{
    private final E[] a;

    ArrayList(E[] array) {
        a = Objects.requireNonNull(array);
    }

    @Override
    public int size() {
        return a.length;
    }

    @Override
    public E get(int index) {
        return a[index];
    }

なぜ add や remove ができないのか?

もし addremove を実装しようとすると、元になった配列の長さを変える必要があります。
しかし、Java では配列の長さを変えられません。


そのため、setget のような配列の中身に対して操作するメソッドは実装されていますが、addremove のような配列自体を変更する必要のあるメソッドは実装されていないのです。((正確には List インタフェースは addremove を実装する必要があるので、メソッドはあるけど UnsupportedOperationException をスローするという処理になっています)))

まとめ

明日の Java アドベントカレンダー、担当は null さんです。
誰か!書いて!!!


追記:
@opengl-8080 さんが書いてくださいました!
Doma2 でログ出力を制御する - Qiita

ジオシティーズのデータを保存する方法

2019年3月末で、ジオシティーズが閉鎖されることが決まりました。


これはつまり、過去のいろんな歴史的サイトも消えてしまうということ。
そうなる前に、ジオシティーズのデータを保存して置く方法をまとめました。

サイト全体をローカルに保存する

まず、Wget for Windows をインストールします。
その上で、スタートメニューから「コマンドプロンプト」を起動して、以下のコマンドを実行します。

"C:\Program Files (x86)\GnuWin32\bin\wget" --convert-links --mirror <トップページのURL>

これで、ページや画像、Java Script などが全部ダウンロードされます。
もし対象のページが更新されたときは、再度このコマンドを実行すれば差分だけダウンロードされます。


CSS で指定されている画像(背景とか)はダウンロードできないという弱点がありますが、おおむね実用には耐えられると思います。

Internet Archive に保存する

インターネット上に永久保存したい場合は、Internet Archive (Wayback Machine) へ。
https://archive.org/web/

  • "Save Page Now" のところに URL を入れる
  • "SAVE PAGE" をクリック

SavePageNow.png

今後、このサイトを見たくなったときは、URLで検索すれば見れるようになります。

注意点

ファイルをダウンロードすること、およびダウンロードしたファイルを個人で楽しむことは、法律上問題ありません。
著作権法第30条で、私的利用のための複製は認められているためです。


しかし、著作権者の許可無くインターネット上に再公開することは著作権法違反に当たります。
それは行わないようにしてください。


この記事は、違法行為を助長する意図はありません。

Java のリリース日とEOLのまとめ

図にまとめてみました。
こうしてみると、サポート期間5〜6年って結構長いなーと思います。


Release Date End-of-life Final Public Release
Java 1.3 2000年5月8日 2006年12月 Java 1.3.1 Update 20
Java 1.4 2002年2月6日 2008年10月 Java 1.4.2 Update 19
Java 5 2004年9月30日 2009年10月 Java 5 Update 22
Java 6 2006年12月11日 2013年4月 Java 6 Update 45
Java 7 2011年7月28日 2015年4月 Java 7 Update 80
Java 8 2014年3月18日 2019年1月 -
Java 9 2017年9月21日 2018年3月 Java 9.0.4
Java 10 2018年3月20日 2018年9月 -

ちなみに、上記の End-of-life は無償サポートの場合です。


有償サポートを契約すると、さらに延長してサポートを受けられます。
これについての詳細は、Oracle Java SE サポート・ロードマップ を参照。

JJUG CCC 2018 Spring ( #jjug_ccc ) - セッション資料の一覧

JJUG CCC 2018 Spring に行ってきました!


実は、仕事では最近 Java から離れているのですが*1、それでも CCC (クロスコミュニティカンファレンス)と銘打ってるだけあってやっぱり参考になる話がいろいろありました。
特に、同じ業界の方も登壇されていて、自社とは違うアプローチの仕方をしているというのは刺激になりました。
なにかひとつでも、仕事で取り入れられたらなと思っています!


あと、懇親会のオフ会みたいな雰囲気も個人的にJJUG に参加する大きな理由の一つです。
いつも Twitter でフォローしている方とリアルにお会いできる貴重な場でした。お声がけしてくださったみなさんありがとうございました。*2
また次の JJUG CCC と Twitter 上でお会いしましょう!


さて、最後にいつものを。

今回、残念ながら満席だったり時間がかぶってしまって参加できなかったセッションもあったので、あとで読むために現時点で発表者の方が公開されている資料一覧をまとめしました。*3
(あとで JJUG CCC 2018 Spring のページにもリンクが載るかもしれませんが、とりあえず自分の方で調べました)
追記:JJUGGitHub ページで公式な資料一覧が公開されました!
jjug-ccc/slides-articles-2018Spring: JJUG CCC 2018 Spring 登壇資料まとめ

13:30-14:15

15:45-16:30

17:45-18:30

*1:Java は趣味状態

*2:…と書いている割には、人見知りが激しくて積極的に話しかけられていないジレンマ(泣)

*3:発表者のお名前は敬称略とさせていただきました。