カテゴリーアーカイブ 言語

takahashi 著者:takahashi

JDKの無料配布はJava 10が最後となり、11以降は有償化される模様

“30億のデバイスで走るJava”という宣伝ができるぐらい、今やITの世界で欠かせなくなったJava。
そんな Javaですが、いままで開発ツールのOracleJDKは無料で公開されており、だれでも利用することができました。

ところがこのOracleJDK、少し前にJava11から有償化されることが決まりました。

Oracleが無償でJDKを提供するのは「Java 10」が最後、Java 11以降はOSSコミュニティでのサポートに – スラド

Java 11からは、現在のようにOracle公式サイトからダウンロードできる形ではなくなり、有償契約した人のみ入手することができるようになります。

その代わり、オープンソース版であるOpenJDKに対し、現OracleJDKが備えている機能と同等のものが公式に導入されることになっているようで、機能面ではOracleJDKとOpenJDKは同等になるため、OpenJDKを使用すれば今後も無料で使い続けられるようです。

ではOracleJDKとOpenJDKの大きな違いは何かというと、Oracle公式によるサポート、さらにはサポート期間の違いのようです。

OpenJDKのサポート期限は次のリリースまで、となっていますが、OracleJDKについては3年ごとにリリースから8年間サポートされるLTS版が出されるようです。

Oracle Javaの無償配布終了で何が起こるのか? – セカイノカタチ

“Oracle JDK有償化”と聞くと、「なんてこった…」と一瞬思ってしまいますが、ふたを開けてみたところ、かなりユーザーにとってメリットとなる変更のようですね。

  • この記事いいね! (0)
著者:杉浦

読みやすいソースコード

 この記事を読むよりリーダブルコードを読んだ方がよほど良いと思います。Amazonで売っている電子版は見つかりませんでした。リーダブルコードはQiitaの記事でよく引用されたり技術書ランキング | テック・ブック・ランク”、5万部売れたり(技術書にしては多いです)でよく読まれています。
 O’Reilly Japan – リーダブルコード
 コードの記述は想定外の動作を起こさず、正しく動作する記述であることが最も重要視され、次いで理解しやすさ、時々実行速度が優先されます。実行速度が三番手なのは雑なコードでも要求に対して十分高速な時が少なからずあるからです。理解しやすいコードはそのコードを読む、未来の自分、共同開発者、ユーザの助けになります。未来の自分と書くと語弊がありますが、この未来というのはわりと短期です。一月もすれば読まない部分のコードの記憶は怪しくなります。
 理解しやすいコードに必要な条件に誤解が起きないというものがあります。誤解が起きない書き方というのは、接続詞である演算子や括弧を少なくして多重コードを避ける、変数名や関数名の意味を一意に決まる限定的な言葉にする、などの書き方です。
 読みにくい多重コードは三項演算子、関数呼び出しが特にそうです。

hoge = a?b?c:d:e
hoge = a?b?c:d?e:f:g?h:i
hoge = a(b(c,d(e()),f(g(h(),i))))

 二重だけでもちょっと躊躇います。下二つはもう大惨事です。
 変数名の意味を一意にすることの効果は、コードの理解に必要な文章量を少なくする効果でもあります。良い命名がされたコードはコードの一部を読むのみでプログラムが分かります。悪い命名というのは例えば、次のような命名です。

results = Database.all_objects.filter("year <= 2011") 

この results には何が含まれているだろうか?

  • 「year <= 2011」のオブジェクト
  • 「year <= 2011」ではないオブジェクト
  • Dustin Boswell (著), Trevor Foucher (著), 須藤 功平 (解説), 角 征典 (翻訳). リーダブルコード (P.30).
     このような場合、言葉の意味を考えるなり調べるなりしてより限定的な言葉を選ぶことで解決します。調べる時は類語や色々な人のコード中に頻出する名前を調べるといいです。この例の場合はfilterの代わりにselectやexcludeが推奨されます。

    • この記事いいね! (0)
    著者:杉浦

    javascriptの比較演算子==、!=と===、!===

    ==、!=と===、!===は曖昧な比較と厳密な比較です。==、!=と===、!===を使い分ける事で以前書いた暗黙の型変換に悩まされない比較を行うことができます。
     javascriptは暗黙の型変換を行う言語です。暗黙の型変換とは、黙って値の型(文字列、整数、真偽値等)を変える、という動作です。この暗黙の型変換は便利な一方で予期せぬ挙動を引き起こすことがあります。例えば、次の関数を考えます。この関数が行いたいことは、引数の値を+1して返す、ということです。

    (inc = function(v){
    	return v+1;
    })();
    

     この関数は次の結果を引き起こします。

    a=inc(2);
    //aは3
    a=inc("2");
    //aは"21"
    

     javascriptは親切にも文字列型である引数に合わせて、数値として扱いたい1を文字列型に変換してくれました。この様に暗黙的な型変換をして欲しくない時があります。if文では次の様なコードが例に挙げられます。

    (hoge = function(msg){
    	if(msg == ""){
    		//msgが空なら返す
    		return;
    	}
    	//msgを使ったして欲しい処理
    })();
    

     javascriptは数値0を文字列””に暗黙的に変換します。そのためmsgに格納されている値が数値0の場合、動作はifの中に入り込み、msgを使ったして欲しい処理を行わずにhoge(msg)を抜け出すものになります。==、!=は比較の際に暗黙的な型変換を行う比較演算子なのに対し===、!==は比較の際に型変換をさせない比較演算子です。これを用いて次の様に記述した場合、msgに格納されている値が数値0であってもif文の中に入り込まずに、msgを使ったして欲しい処理を行います。

    (hoge = function(msg){
    	if(msg === ""){
    		//msgが空なら返す
    		return;
    	}
    	//msgを使ったして欲しい処理
    })();
    

     

    • この記事いいね! (0)
    村上 著者:村上

    【JavaScript】IEでの「’)’がありません」エラーの原因と対処法

    後輩のコードを見ていて発見した Internet Explorer 固有のバグです。
    今回遭遇するまで、こんな現象が起きることを知らなかったので、備忘録も兼ねています。

    で、コードはこちら。

    function checkStr( message = "" ){
        if( message != "" ){
            // 処理
        }
    }
    

    一見何の問題もなさそうですし、Google Chrome や Microsoft Edge では問題なく動作しました。
    が、どうしてもIEではダメで、「‘)’がありません」というエラーが表示されました。

     

    で、対処法ですが、そもそもの原因は関数の引数にデフォルト値を指定したことが原因のようでした。
    IEではJavaScriptの関数での引数のデフォルト値の設定には対応していないようですね。
    そのため、引数の「message = “”」を 単に「message」に修正すれば問題なく動作しました。

    修正後のコードは下記のとおりです。

    function checkStr( message ){
        if( message != "" ){
            // 処理
        }
    }
    

    1行目の関数の引数のデフォルト値を指定しないように修正しました。

     

    以上、IEでの関数エラーの対処法でした。
    最初はエラー文を鵜呑みにしてカッコの数があっているかを確認していましたが、原因は全く違いましたね。
    たまにこういった見当はずれのエラー文があったりするので、デバッグ作業は難しいです。
    今回は思い付きで関数の引数を消してみたら解決したので良かったですね。
    同じことでお悩みの方は、是非参考にしてください。

    • この記事いいね! (0)
    著者:杉浦

    呼び出し側を気にしない引数、デフォルト引数

     関数には引数がつきものです。ソースコード中のある関数を変更する際、関数中の引数を増やしたくなる時があります。しかしながら、単純な関数の引数部分の変更は関数の呼び出し側の変更も引き起こします。関数がどこで呼び出されているのか探すのは手間です。良い命名がされているならば複数ファイル中の文字列検索でどうにかなりますが、その様でないコードは少なくないです。目的が機能の追加であり、既存部分の機能が変わらないとなればなおさらやりたくないものです。そのような時に、この呼び出し側を気にしない引数であるデフォルト引数が役に立ちます。
     デフォルト引数の書き方は次です。

    void makecoffee(type = 'black'){/*処理*/}

    大体の言語は同じように引数欄に”引数名=引数のデフォルト値”と設定できます。デフォルト引数の動作は、呼び出された時に引数が足りない場合は引数に設定されたデフォルト値が代入されて動く、引数が足りている場合は呼び出し側の値が代入されて動く、といった具合です。これで引数が足りないという構文エラーを回避して、僅かな書き換えで引数を追加できます。余談ですがjavaはこのデフォルト引数機能がありません。私の触れた周りでは関数の追加で解決していることが多かったです。次の様に引数の数が異なる呼び出し用関数を追加するわけですね。

    void makecoffee(){makecoffee('black')}//0個の引数で呼び出される関数makecoffee()。固定された値を引数にしてmakecoffee(type)を呼び出す。
    void makecoffee(type){/*処理*/}//1個の引数で呼び出される関数makecoffee(type)。
    

     javaの様な同じ関数名を許容する言語の場合、この引数の異なる関数の追加は特に自然な感じで作れます。

    • この記事いいね! (0)
    村上 著者:村上

    【PHP】文字列を全角←→半角に変換するmb_convert_kana()関数

    覚えておくと意外と便利なので、備忘録としてまとめ。
    PHPで全角を半角に、もしくはその逆を行う方法です。

    今回使う関数は、mb_convert_kana()です。
    参考にさせていただいたページはこちら。

    PHP関数 – 半角 ⇔ 全角 変換 – mb_convert_kana() – PHP入門のカルマ
    https://webkaru.net/php/function-mb-convert-kana/

     

    使い方はこちら。

    $result = mb_convert_kana([変換したい文字列], [変換方法]);
    

    上記のように指定します。
    なお、変換方法は省略が可能で、省略した場合は、KV(=「半角カタカナ」を「全角カタカナ」にし、濁点付きの文字を一文字に変換)になります。
    変換方法の一覧は下記のとおりです。

     

    オプション 変換内容
    r 「全角」英字を「半角」に変換
    R 「半角」英字を「全角」に変換
    n 「全角」数字を「半角」に変換
    N 「半角」数字を「全角」に変換
    a 「全角」英数字を「半角」に変換
    A 「半角」英数字を「全角」に変換
    s 「全角」スペースを「半角」に変換
    S 「半角」スペースを「全角」に変換
    k 「全角カタカナ」を「半角カタカナ」に変換
    K 「半角カタカナ」を「全角カタカナ」に変換
    h 「全角ひらがな」を「半角カタカナ」に変換
    H 「半角カタカナ」を「全角ひらがな」に変換
    c 「全角カタカナ」を「全角ひらがな」に変換
    C 「全角ひらがな」を「全角カタカナ」に変換
    V 濁点付きの文字を一文字に変換。K、Hと共に使用

    よく使いそうなのは、「as」かな?
    このオプションでは、英数字とスペースを半角にします。
    なお、オプションは複数指定できます。

     

    以上、文字列を全角←→半角に変換する方法でした。
    全角が入力されては困る項目などでは、少なくとも「askh」あたりを指定しておけば、ある程度は対応できるかと思います。
    是非、ご活用ください。

    • この記事いいね! (0)
    著者:杉浦

    javascriptの一時的な関数、即時関数

     javascriptには即時関数という機能があります。

    即時関数 (IIFE; Immediately Invoked Function Expressions) は、関数がブラウザーのコンパイラーに読み込まれた直後に呼び出される関数です。IIFE は、関数宣言の末尾に追加の括弧 “()” があるかどうかで識別できます。

     Function (関数) – 用語集 | MDNより引用。
     書き方は

    (function(){/*処理本文*/}(引数));
    (function(){/*処理本文*/})(引数);
    

    です。どちらでも問題ありません。即時関数と名付けられていますが、動作からは一時的な関数とも言えます。即時関数は

  • 関数のインスタンスを作る
  • その関数を実行する
  • その関数を捨てる(ステートメントの実行を終了したあとはもう参照しないので)
  • Bear Bibeault; John Resig. JavaScript Ninjaの極意 (Kindle の位置No.2730-2732). . Kindle 版. より引用。
    ということを行います。
     即時関数が用いられる主な目的はスコープの制御です。スコープは変数名の参照範囲のことです。変数名ごとにスコープが定められており、スコープの範囲内ならば変数を呼び出し、書き換えることができ、範囲外ならば呼び出せず、書き換えられないといった具合です。
     即時関数内で宣言された変数は宣言された即時関数内のみがスコープになります。このため、あるコードを即時変数として記述したならば既存のコードの変数名を考慮することなくそのコードを既存のコードに継ぎ足せます。特に即時関数に出番があるのは、任意のページに好き勝手スクリプトを追加する目的であるブックマークレットや変数名の衝突が容易に予想できる圧縮される予定のコードなんかです。

    • この記事いいね! (0)
    takahashi 著者:takahashi

    FuelPHP初期設定時に”It is not safe to rely on the system’s timezone settings.”エラーが出た時の対処法

    先日、自分用にFuelPHPのテスト環境を作成していた時のこと。
    ファイルやウェブサーバー周りの設定が終わって、テストでFuelPHPを動作させたところ…

    Fuel\Core\PhpErrorException [ Error ]:
    date_default_timezone_get(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone.
    

    初めて見るエラー(汗
    前回別の環境でセットアップした時はこんなエラーは出たことがなく、原因がわからなかったのでちょっと焦りました。

    困っていろいろ調べていたら、こちらのサイトを発見。

    [PHP]php.iniのtimezoneを設定する – Qiita

    どうやら、PHP自身にデフォルトタイムゾーンを指定しないとダメ見たいです。

    今回はCentOS7を使っていたので、php.iniは
    /etc/php.ini
    にありました。

    php.ini内の

    [date]セクションの部分に、赤枠のように記入します。

    date.timezone = "Asia/Tokyo"
    

    これでphp.iniを保存し、Apacheを再起動。

    再度実行してみると

    無事スタートページが表示されました。

    • この記事いいね! (0)
    著者:杉浦

    CSSの適用優先度

     CSSはHTMLに装飾を付ける仕組みで、主にその詳細度から適用の優先順位が決まります。要素名、クラス、ID、HTML中の直書きと適用される範囲が狭く詳細になるほど優先されます。定義はSelectors Level 3でされていますが、ご存知、ないのですか?CSSの優先順位の説明が大変分かりやすかったです。
     次の図は”ご存知、ないのですか?CSSの優先順位”からの引用です。


     図の様に指定方法の種類別総和が優先度になっています。この優先度の特徴として、IDの様なより詳細な種類の指定方法が用いられていた場合、どれだけクラスの様なより詳細でない種類の指定方法を重ね掛けても優先度で上回れないという点があります。優先度が同値の場合、後から読み込まれた方が優先されます。
     生のCSSではこの優先度を表記してくれません。人間がこの優先度を理解しながらCSSを読み解くのは難しいです。Specificity Calculatorは優先度計算ページです。下図の様に、CSSコードを書きこめば優先度を出力してくれます。計算機を増やしたいならば、Duplicateボタンで複製しましょう。

    • この記事いいね! (0)
    村上 著者:村上

    【PHP】正規表現をチェックできる「正規表現チェッカーPHP: preg_match() / JavaScript: match()」【JavaScript】

    今回は、正規表現を扱うときによく利用するサイトを紹介。
    といっても、知ってる人も多いかと思います。

    正規表現チェッカー PHP: preg_match() / JavaScript: match()
    http://okumocchi.jp/php/re.php

    正規表現が正しいかどうかをチェックしてくれるサイトです。
    他にもいくつかありますが、私はもっぱらこのサイトを使っています。
    検索結果の一番上に来ることが多いので、それも理由の一つですね。

     

    サイトはこのようなレイアウトです。

    上のテキストボックスにチェックしたい正規表現を入力し、下のテキストエリアにチェックしたい文字列を入力して、チェック!のボタンを押します。
    すると、結果が下のエリアに表示されます。
    検索結果の配列まで表示されるので、特に重宝しましたね。

    また、下にリファレンスが載っているので、それを見ながら正規表現を組み立てることができます。
    最近はよく使うものについては覚えられるようになってきましたが…最初のころはチンプンカンプンだったので、これにかなり助けられました…。
    郵便番号やメールアドレスをチェックするためのサンプルもいくつか掲載しており、これにも非常に助けられました。

    そして、このサイトでは、PHPだけでなく、JavaScriptでの結果も同時に確認できます。
    まあ、結果はPHPとほぼ同じですが…。

     

    以上、PHPやJavaScriptの正規表現をチェックする方法でした。
    正規表現って苦手な方も多そうですし、私もその一人でしたが…覚えるとかなり便利なので、こういったサイトを活用して頑張りましょう

    • この記事いいね! (0)