無料の独自ドメインでお金をかけずに常時SSL環境を整える
こんにちは、たけぼーです。
今日は、お金を一切かけずに常時SSL環境の構築を目指してみましょう。
SSLとは
SSLとは、webを暗号化しながら通信を行う技術で、URLの先頭がhttps://~で始まります。
例えば、Amazonなんかのショッピングサイトやgoogleなど、様々なサイトで活躍する技術です。
これによって、個人情報とかパスワードとか、誰かに盗まれる危険性が低くなるわけです。
google chromeでは、入力フォームがあるページがSSLに対応していなければ、『保護されていません』と表示するようになり、少し話題になりましたよね。
特に、Googleは常時SSLを推奨していて、SSL対応のページはSEOで有利になると言われています。
ここまで良いことずくめだと、SSLって、暗号化されて安全だし、Googleからの評価もあがるなら、みんなやればいいじゃん!って思いません??
しかし、みんながすぐにはできない理由があるんです。
それは、お金の問題。
利用するサービス
まず、今回お世話になりますサービスをご紹介します。
Let's Encrypt
今回の主人公はこちら。その名もLet's Encryptです。
これは、先ほど書いたとおりめちゃくちゃ高いSSL証明書を無料で発行してくれるすばらしいサービスです。
無料ですよ、無料!
Let's Encrypt の概要 - Let's Encrypt 総合ポータル
無料といっても、怪しいサービスではありません。体験版などでもありません。
こちらは、認証作業を完全に自動化することで運営されているもので、Firefoxでおなじみのmozillaなど、有名な団体が開発に携わっています。
自動で認証できるから費用も無料にできる、ということですね。
このサービスを使えば、簡単にSSL証明書が手に入ります。
本来、サーバーにて直接証明書の取得作業をするのですが、今回はWeb上で済ませるために、SSLBOXを通じて取得します。
FunHosting
次に利用するサービスはこちら。FunHostingです。
こちらは、今回レンタルサーバーとして利用します。
なぜ、こちらが選ばれたかと言いますと、無料でレンタルできて、SSLも利用させてくれるからです。
普通、無料のレンタルサーバーではSSLに非対応であったり、はたまた有料プランに入らないと使えなかったりと、なかなか良い条件のところがありません。
FunHostingならその心配は必要ありません。無料プランでも何の問題もなくSSL通信が可能です。太っ腹!
実は、byethost系のレンタルサーバーならどこでもいいのですが、その中でも今回は日本語表記されているこちらのサービスを利用します。
Freenom
こちらはご存じの方も多いはず。無料で独自ドメインが取得できる、Freenomです。
http://www.freenom.com/ja/index.html?lang=ja
.tl .ml .gaなど、5種類の独自ドメインが無料で取得できます。
SSL環境の構築
さて、サービスの紹介も終わったところで、本題に入りましょう。
ここからは、順序だてて説明してまいります。
①freenomで独自ドメインを取得する
まず始めに、独自ドメインの取得を行います。
ここで注意があります。この後FunHostingで登録していくわけですが、.tkのドメインは受け付けてくれません。おそらく、.tkは良くも悪くも有名で、スパムなんかに使われることも多いため、規制されているのだと思います。
.ml等のほか4種類は大丈夫ですので、この中から選ぶようにしましょう。
取得の手順は、こちらを参考にしてください。
ネームサーバーは、次に登録するFunHostingのものを先に登録しておきます。
ネームサーバーはns1.fun-hosting.tkとns2.fun-hosting.tkです。
②FunHostingに登録
つぎに、レンタルサーバーの契約へと参りましょう。
FunHostingのトップページ一番下にあります、新規会員登録にて必要事項を入力し、登録するをクリックします。
セキュリティコードで、0かoか分からないものがありますが、この場合は0を入力すればいいようです。私はここで何度かつまずきました。
確認ページにて確定を行うと、仮登録が完了します。
入力したメールアドレスに、URLが送付されますので、そちらをクリックして登録を確定します。
確定後は、アカウント名などか記されたメールが届きます。こちらは大切に保管しましょう。
③FunHostingに独自ドメインを登録
メールに書かれている管理画面URLより、会員ページにログインします。
ログイン後は、Addon domainsより独自ドメインを追加します。すでにネームサーバーの設定は終えていますから、new domain nameにドメイン名を入力すればおしまいです。
FunHostingのネームサーバーに登録されるまではかかり時間がかかるため、このまま放置しておきます。この間にファイルのアップロードなんかを済ませておいてもいいかもしれません。
ブラウザにて無事URLにアクセスできるようになれば、次へ進みましょう。
④レンタルサーバーのIPアドレスを確認
レンタルサーバーのIPアドレスを確認します。
本来このような手順は必要ないのですが、今回はこの作業が必須です。
なぜなら、この後FunHostingのネームサーバーからfreenomのネームサーバーへ変更しなければならないからです。
この理由はSSL証明書の発行あたりで説明しますね。今はとりあえずIPの確認を行います。
方法は簡単で、pingにて確認を行います。
Windowsの方はコマンドプロンプト、macやlinuxの方はターミナルからpingコマンドを実行します。
例えば、ping (あなたのURL)と打てばよいでしょう。
Webからpingを実行することもできます。
これにてIPアドレスが確認できますので、この値をメモしておきましょう。
⑤freenomにてネームサーバーを変更
さて、freenomに戻り設定を行います。
ログインし、会員ページのmy domainを選択します。
自分が取得したドメインが一覧で表示されますので、今回使用しているドメインのmanage domainを選択して、ドメインの管理画面へ移ります。
移動したらメニューの中にはmanagement toolsの項目の中に、nameserverがありますので、そちらを選択。
use custom nameserversが選択されていると思いますが、これをuse default nameserversに切り替えます。
これで、ネームサーバーの切り替えができました。
⑥DNSのレコードを編集
ネームサーバーを切り替えただけでは、サーバーにつながらなくなってしまいます。そこで、ネームサーバーの設定を行います。
メニューのmanage freenom DNSを選択すると、設定する項目が現れます。
ここで、先ほどのメモが役立ちます。
プルダウンからAを選択し、一番最後の欄にメモしたIPを入力します。
また最初の欄にwww、プルダウンからA、最後にメモしたIPを入力し、二つを登録します。
上の画像を参考にしてください。
入力したら、save changesを選択して確定します。
これで、ブラウザにてURLにアクセスできるようになりました。少し時間がかかりますので、アクセスできるようになりましたら、次に進みましょう。
⑦SSL証明書の取得
では、今回のメインであるSSLへの対応を行いましょう。
先ほど紹介しましたSSLBOXによって証明書を取得します。
こちらを参考に、会員登録を済ませてドメイン所有者確認の手前まで行って下さい。
無料のSSL証明書「Let's Encrypt」を取得できるSSL BOXの利用方法
今回は、ドメイン所有者の確認にて、DNS認証を行います。
普通はWeb認証でいいのですが、FunHostingでは何度やってもうまくいかなかったので、DNS認証を行います。
先ほど、わざわざFreenomのDNSに切り替えたのは、このDNS認証を行うためです。
これを行うためには、TXTレコードが設定できる必要がありますが、FunHostingでは設定できません。
ですから、FreenomのDNSに切り替えたわけです。
FreenomのDNSにてTXTレコードを設定するために、先ほど利用したFreenomの『Manage freenom DNS』画面を表示してください。
ここで、最初の欄に_ACME-CHALLENGE、プルダウンからTXT、最後の欄にSSLBOXに表示されている『内容』を記入します。
『Save changes』を選択したら、変更が反映されるまで5分程度待ってから、SSLBOXの『DNS認証』を選択して、『所有者確認開始』を選択します。
DNSレコードが反映されているかは、bashまたはコマンドプロンプトで、
nslookup type=TXT acme-challenge.(あなたのドメイン名)
にて、『内容』と同じものが表示されるかで確認を行うことができます。
変更後すぐに所有者確認をおこなうと、確認に失敗してしまいます。失敗した際は、TXTレコードの『内容』を変更し、再度認証を行います。
確認ができたら、SSL証明書が発行されます。この画面を表示させたまま、つぎの手順に移りましょう。
⑧FunHostingにSSL証明書を登録
FunHostingの管理画面にログインしましょう。メニューの中に、『SSL/TLS』の項目がありますので、これを選択します。
SSL通信をしようとしているドメインの『Configure』を選択すると、証明書(文字列)を送信するページが表示されます。
『Private Key』にSSLBOXの『秘密鍵』を、『CSR』にSSLBOXの『中間証明書』を入力し、Upload Keyを選択します。
変更が反映されれば、次に『Certificate』にSSLBOXの『CERT(SSL証明書)』を入力し、『Upload Certificate』を選択して、変更を反映させます。
これで、SSL通信の設定は完了です。https://~でURLにアクセスすれば、ちゃんと通信できると思います。
エラーで有効なSSL証明書でないと表示される場合があります、証明書はサーバーに反映されるまで時間がかかるようで、タイミング次第では、サーバーに元から備わっているSSL証明書もどき(オレオレ証明書)が送信されるため、エラーが表示されるようです。
この場合は、少し待ってから再度アクセスしてください。
⑨常にSSLで通信されるようにする
最後に、http://~でアクセスしたとき、自動的にhttps://~でアクセスされるようにします。
FTPでサーバーにアクセスして、ドメインのルートフォルダ(ドメイン名-htdocsの中)に.htaccessという名前でファイルを作成し、以下の通り記述します。
RewriteEngine On RewriteCond %{HTTP:X-Forwarded-Proto} !=https RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
標準的な書き方と異なりますが、これ以外の書き方だとリダイレクトループが発生して大変なことになりました。
まとめ
かなり長くなりましたね。いかがでしたでしょうか。
この方法で、SSL通信が可能です。私も無事設定ができました。
しかし、この方法ではなぜかネームサーバーの調子が悪く、接続できない時が多々ありました。
調査を進めると、FunHosting標準のネームサーバーを使用していないと不安定になるようです。詳しい原因はわかりませんが、DNS認証が終われば、FunHostingのネームサーバーに変更する方がいいでしょう。数か月ごとに認証しなければなりませんから、少々手間ですが…。
Let's Encryptは素晴らしいサービスですが、個人向けのサービスだと思います。企業でLet's Encryptを使っているところはあまり見かけませんし、信用度としてどうなんだ、という意見もあります。
顧客のデータを扱うようなサイトでは、有料のSSL証明書を購入した方がいいのかもしれません。
ということで、今回はSSLについて書きました。
では、また。
無料のHTMLテンプレートサイト『freehtml5』が素晴らしい
こんにちは、たけぼーです。
皆さん、テンプレート使ってますか?
テンプレートって便利ですよね。楽してきれいなホームページが作れるし、作成に時間がかからない。
特に私のような、HTMLやCSSには疎い、なんて人にはもってこいじゃないでしょうか。
HTMLなんかをゴリゴリ書ける人には必要ないかもしれませんが、やっぱり楽して作れるって素晴らしいですよ!
ということで、今回は無料で使えるテンプレートを集めたfreehtml5.coを紹介します。
おしゃれなテンプレートサイト - freehtml5.co
こちらが、freehtml5.coです。海外サイトです。
ご覧ください、このおしゃれさ。
ここで公開されているテンプレートは本当にデザインが綺麗でおしゃれなものがたくさんあります。
ホームページ全体はもちろん、ログインフォームなどのパーツもテンプレートとして公開されています。
デザイナーではない私たちは、機能は作れるけど見た目がなぁ、なんてことになりがちですよね?(私だけなのかも)
しかし!これを使えば、いとも簡単に美しいページが作れちゃいます!
使用上の注意
これらの無料テンプレートのライセンスは、Creative Commons 3.0です。
https://creativecommons.org/licenses/by/3.0/deed.ja
よって、必ず著作権表示が必要です。
プレミアムプランに加入すればこれを消すことができるようです。
まとめ
いかがでしたでしょうか。手間をかけずに見た目を良くしてくれるテンプレートを、是非ご活用ください!
無料のレンタルサーバーを作ってみる
こんにちは、たけぼーです。
今回はなんと、無料のレンタルサーバーサービスを作ってみようと思います!
完全に試験的なものなので、実用的かは分かりませんが、やってみようと思います。
とはいっても私お金がありませんので、自前でサーバーを建てるような余裕はございません。
いやいや、それじゃだめじゃん。なに言ってるの馬鹿なの?
そうなんですよ、普通ならお金をかけないと不可能ですよね。
しかし!
この世には素晴らしいサービスが存在します。
それは、レンタルサーバーの再販サービスです。
ん?どういうことですか?なにを言ってるんですか?
という声が聞こえそうですが、この再販サービスを使えば、無料でレンタルサーバーが構築できます。
では、今回はその仕組みを紹介しましょう。
再販とは
再販って、なんでしょうか?
文字通りこれは、再び販売することで、英語ではresellといいます。
では、レンタルサーバーの再販とはどういうものなのでしょうか?
レンタルサーバーの再販とは、レンタルサーバーを再びレンタルする、ということです。
では、具体的なシステムを見てみましょう。
大元となるレンタルサーバー会社は、私のような再販者に対して、レンタルサーバーを貸してくれます。ここまでは、普通のレンタルサーバーと同じですね。
しかし、ここからが一味違います。
ここからは、再販用の契約をresellerプランと表現することにします。
レンタルサーバーのresellerプランでは、この借りたレンタルサーバーをさらに細かく分割して、他の人に貸すシステムまで提供してくれます。
分かりやすくするために、図で描いてみました。
要するに、レンタルサーバーのサービスを始めるにはサーバーが必ず必要なわけで、それを貸してくれるのがresellerプランなわけです。
無料のresellerプランなんてあるの?
ここで疑問が浮かぶでしょう。
不特定多数にレンタルサーバーを貸すのに、それ用のサーバーを無料で貸してくれるところなんであるの?
そうですよね。レンタルサーバーのサービスを始められるので私にはメリットがありますが、サーバーを貸す側としてはメリットが薄い気がします。
しかし!この世には無料のresellerプランの存在するサービスがあります。
その名も、byethost
このbyethostは、レンタルサーバーサービスを展開する海外企業です。この企業は、無料でresellerプランを提供してくれる太っ腹で有名(?)です。普通のいわゆるレンタルサーバー事業もやっているので、よかったら試してみてください。
実は、byethostの再販系レンタルサーバーはとてもたくさんあります。
byethost系のレンタルサーバーをまとめたものがありました。しかし、これはほんの一部で、海外のレンタルサーバーの半数以上はbyethostの再販だと思われます。
byethostのresellerプランの特徴は、
- 無料でサーバーのレンタルサービスが作れる
- google等のadを入れることで収入を得ることができる
- ユーザー数は無制限で、貸し出すサーバーの容量などは自分で決めることができる
といったところでしょう。無料で使えて、さらに広告収入を狙える、なんてすごすぎです。
何で無料なの?
ではなぜ無料なのでしょうか。
byethostのホームページを読む限り、byethost側の利益がなかなか見つからない。
はっきりと書かれてもいませんし。
でも、メリットのない奉仕活動のようなことをするとは思えません。
そこで、よく読むとひとつの予測が立ちました。それは、有料プランへの勧誘活動の可能性です。
よく見ると、resellerプランで提供された無料サーバーの契約者がbyethostのレンタルサーバー有料プランに加入すれば、resellerに対して報酬が支払われるようです。
つまり、この無料resellerプランは大きな新規顧客獲得事業の一環だと思われます。
なるほど、そう考えると無料でもつじつまが合う気がします。
ということで、詐欺まがいの恐ろしいサービスではないようですね。
まとめ
今回byethostのresellerプランを使えば、無料でレンタルサーバー事業を開始できそうです。
海外では実際に再販を利用するところが多くあることを考えれば、比較的安全なようにも思えます。
ということで、今回は再販サービスについてまとめました。おそらくあまり役に立たないと思います(笑)
ではまた。
.tkのgoogle的評価を考察する
お久しぶりです、たけぼーです。
今日は、無料の独自ドメインとして有名な.tkドメインについてです。
.tkの詳しい内容はこちら
.tkの取得などは、昔書きましたのでそちらを。
さて今日のテーマは、この無料独自ドメインがどれだけ効力を持っているか、と言うことについてです。ここでの効力とは、googleからの評価に関するものです。
先に結論を言いますと、スパム対策はちゃんとしているけど、.tkのドメインではgoogleの評価を上げる効力は弱い、ということです。
つまり、googleからの評価は厳しいのです。
私が.tkから.comに変えてみたら
まず、私の経験談をひとつ。
私はいくつか管理しているホームページがあります。その中の一つは、.tkで運用されています。これは、管理を任されたときに、できるだけお金をかけないで運用していくという要望をかなえるため、選んだ独自ドメインです。
このホームページは外部に情報を発信するためのホームページで、かつurl直打ちではなくGoogle検索での流入を狙うページでした。
まあ、これは本来ウェブページとして当然のスタンスですよね。
しかしこのホームページ、一切検索に引っかからない。1日たっても1ヶ月たっても1年たっても、まったく。
私も、SEO対策をたくさん施しました。SEO的効果がある、と見れば試してみましたが、全く変化なし。
ターゲットとなる検索キーワードは、一般的なものではなく固有名詞に近いもので、本来ならすぐに検索されるはずです。競合相手もほとんどありません。
そのときの現象として、
- googleでヒットすることは全くない
- ランキングを調べると、圏外
- googleのwebマスターツールには登録済み
- クロールエラーなし。ちゃんとインデックスされてる
- site:(自分のURL)ではちゃんと検索される
これは、完全におかしい。さすがにこれだけ検索に引っかからないと、なにか私の技術不足以外の原因を疑いたくなる。
心当たりは独自ドメインの.tkです。そういえば、無料独自ドメインはスパム認定されたりする、なんて書いてあった気がして、検索してみました。
しかし、.tkでもちゃんと検索されるページも存在する。
さらに、.tkドメインは他の.com等ドメインと同等に扱われる、という情報まである。
しかし、もう.tkのせいとしか考えられない。
そんなとき、突然ホームページに金をかけていい宣言が出たので、有料ドメインを取得する事を提案したところ、OKが出ました。
そこで早速.comドメインを取得し、サイト移転の設定をして、googleに登録してみました。
すると、なんと1日もたたずに検索にヒットするようになったのです!
.tkについて考える
この経験から、やはり.tkはgoogle的に評価が低いのかなと思います。
おそらく、スタート時におけるgoogleの評価が他のドメインより低いのでは?という気がします。確証はないですけど、そんな気がします。
つまり、被リンクも多くコンテンツも充実しているようなサイトなら検索されるけども、かなりコンテンツで評価をあげないといけない、という感じではないでしょうか。
海外の掲示板には、.tkのドメインをとることはseoとして自殺行為だ、とまで書かれているものが存在するため、評価が厳しいという私の予想は当たっている気がします。
そのため、被リンクを得にくいサイト(小規模なサイトやブログ)では、.tkなどの無料独自ドメインではなく、ちゃんとお金を払ったものがいいのかな、と思います。サイトが出来立ての頃って、内容とか充実させるのが大変ですから、サクッと検索されるようになった方がいいですよね。
最後に
ここでちゃんと言っておきますが、.tkは無料であることだけでも十分素晴らしいサービスです。私的な利用をする(どこかに広めるためでない)ページならこれで十分なのかな、と思います。私もよく利用させてもらってます。
自分が.tkについて調べてた時にこういうこと知ってればな、と思いましたので、誰かの参考になれば幸いです。
最後に、ここに書いてある内容は筆者の予測がかなり含まれています。それが本当である確証はありませんので、あくまで参考として読んでください。
ではまた。
WordPressのプラグイン「Elementor」がすごすぎる
こんにちは、たけぼーです。
前回に引き続き、WordPressネタです。
管理中のWordPressサイトを3月中にリニューアルしなければならず、最近こればっかりに私の時間がとられてしまっている今日この頃で、せっかくやるんだったらブログに残しておこう、というしょぼい理由でWordPressネタが続いています。すいません…
誰もが思う理想
WordPressって、webの知識がない人でも簡単にホームページができることが特徴です。
私が作成中のページも、基本的にはwebの知識が一切ない人がバンバンページを増やしていく予定なので、WordPressはぴったりです。
しかし、WordPressの標準機能では、やはりhtmlやcssを駆使して作るような複雑なレイアウトを実現することは難しく、プラグインを多用しなければならなかったりします。
ここでみんなが思います(たぶん)。簡単にグレードの高いページが作れないか、と。
ここで登場、魔法の秘密道具。
タッタタタッタッ、タッタタタッタッ、タッタタタッタッターーー。
「エレメンターー」
Elementorという強者登場
すいません、ドラえもん風になってしまいました。いつかやってみたかったんです(笑)
では本題へ。Elementorというプラグインが今回の主役です。
Elementorは、無料のWordPressプラグインで、公式ディレクトリでダウンロードできます。
elementor.com
このElementorは、マウス操作で簡単にホームページをパーツを組み合わせて作り上げることができる、画期的なプラグインです。
ホームページビルダーのような機能を実現してくれます。
こちらの紹介ムービーをご覧ください。
Elementor - The Fastest, Free Live Page Builder For WordPress
このプラグインのいいところは、簡単にブロック分けしたリ、アイコン付きのボタンを配置したり、スライドショーや動画を配置したりといったような、美しいホームページ作りを手助けする機能が満載なところです。
さらに、各要素にcssのclass名を個別に設定することができ、style.cssによるデザインのカスタムも可能です。個人的には、この機能が一番好きです。
これを使えば、インスピレーションで簡単にページを作ることができるので、私のようなwebが専門でない人でも、Wordを操作するようにホームページを作成することができます。
まだまだいいところはたくさんあります。
ぜひ、ご利用ください!
ではまた。
WordPressの無料テーマ「Cronus」が使いやすい
こんにちは、たけぼーです。
ご無沙汰していて申し訳ないです…
今日はWordPressネタです。
スタイリッシュなテーマを探す
私が管理を任されているWordPressのホームページがあるのですが、ドメインを変更することになりまして。
じゃあ、いっその事ホームページ一新しちゃえ!的軽い気持ちでレイアウト変更を始めました。
BizVektorから変更
以前はかの有名なBizVektorを使い、ホームページを構築していました。
BizVektorは大変優れたテーマなのですが、スタイリッシュさに欠けると言いますか、現在主流な透明感のあるホームページに憧れていたため、新たなテーマを探しました。
国産のテーマが良かったのですが、どこか スタイリッシュさに欠ける気がしました。
思い切って海外に手を出す
しょうがないので、国産じゃなく海外製のテーマに手を出そう!と思い検索していると、いいのがたくさんでてくるんですよ!
ほんとに素晴らしいものばかりで、これは使える!と思いました。
しかし、海外製のテーマはホームページに分けて書くような、例えば会社概要や活動内容などといった内容を、トップページにまとめて書くというスタイルが主流のようで、すべての内容が1ページに収まるようなつくりとなっていました。
これでもいいのですが、日本ではYahooのようにいろんな情報がブロックでいっぺんにまとまったようなページが人気ですから、今回もそれに見習いたいものです。
こんな条件を加味して探したところ、とてもいいものが出てきました!その名もCronus。
海外製テーマ "Cronus"
Cronusはmythemesさんが開発した無料のWordPressテーマです。
https://ja.wordpress.org/themes/cronus/ja.wordpress.org
このCronusは、Tempoというまた別のテーマの子テーマという形で作られています。
ですから、インストールするテーマは、CronusとTempoのふたつです。
Cronusだけだとエラーが出ますので、ご注意ください。
私が気に入った良いところ
このテーマで私が気に入っているところは、主張しすぎない・スタイリッシュ過ぎない、というところです。
スタイリッシュなものを求めていたくせに、どういうことなんだ、とお思いだと思います。
これは、私が管理するページが利益を求めるようなページではなく、あまり派手である必要がないからです。
かといって、今風なホームページにしたい。この派手ではなく今風であるという微妙なバランスを実現したのが、このテーマでした。
また、ほかのテーマの中には、トップページの内容ががちがちに決められていて、逆に使いにくいものも見られましたが、このテーマはそのようなことはなく、自由にカスタマイズできるため、主張が激しくなく使いやすいです。
ちょっと困る悪いところ
このテーマ自体が子テーマとなっているため、functions.phpに書き込んだりするような直接的なカスタマイズは、Cronusのファイル自体に行わなければなりません。
子テーマの子テーマは作成できないため、Cronusが更新されると変更点が消えてしまいます。
ですから、テーマの更新にはご注意ください。
ということで、今日はCronusという素晴らしいテーマをご紹介しました。
ということで、今日はこのあたりで。
ではまた。
BigDecimalで誤差が出てしまった話
こんにちは、たけぼーです。
今日はJavaで正確な数値計算を行うための、BigDecimalについてです。
Androidのプログラミングをしていたら、誤差のない計算が必要になる時がありますよね。
例えば、電卓なんかを作るなら誤差が出たら大変です。
誤差が出る原因は、値をfloat,double型として計算するからです。
どうも、10進数を2進数に直して計算すると、正確に2進数に変換できないということが原因だそうです。
こんなときは、BigDecimal型という特殊な型を使って計算を行えばよいのです。
BigDecimalは、誤差を生じさせないように計算することを目的としたものだそうです。
私もBigDecimalで計算すればいいや、と思って使ったのですが・・・
まだ誤差が出る!!
おいおい、なんなんだこれは。誤差が出ないって言ったから使ったのに・・・
16×0.03(=0.48が正解)を小数点以下第2位まで切り捨て計算したところ、堂々と0.47と表示しやがる。
なんなんだ君は、という気分ですが。
どう調べても、BigDecimalでは絶対に誤差は出ません!と書いてあるので、どこが間違いなのかわかりませんでしたが、やっと解決策を見つけました。
では、解決策へ参りましょう。
BigDecimalで誤差が出ないようにする
原因は、どのようにBigDecimalの生成のときにdouble型が混ざっていたからです。
元のソースは以下のとおり。
//これでは結果が0.47となる double a = 0.03; double b = 16; ・・・ BigDecimal db_a = new BigDecimal(a); BigDecimal db_b = new BigDecimal(b); BigDecimal db_c = a.multiply(b).setScale(2,RoundingMode.FLOOR); double ans = db_c.doubleValue();
ここでの失敗の原因は
BigDecimal db_a = new BigDecimal(a);
ここです、悪の根源は。
この生成部分でカッコ内にdouble型のデータを渡していることです。
double型自体が元から誤差を含んでいるものなので、このままでは誤差が受け継がれてしまうようです。
誤差が出ないためには以下のように変更すれば良いのです。
//これで結果は0.48となる //double から Stringに変更 String a = 0.03; String b = 16; ・・・ //String型で渡される BigDecimal db_a = new BigDecimal(a); BigDecimal db_b = new BigDecimal(b); BigDecimal db_c = a.multiply(b).setScale(2,RoundingMode.FLOOR); double ans = db_c.doubleValue();
a,bをString型に変更することで、BigDecimalの生成時には文字列として渡されるので、誤差は出なくなります。
実際に計算すると、ちゃんと正確な値が出ました。
ということで、今日はここまで。
ではまた。