著者アーカイブ takahashi

takahashi 著者:takahashi

ソースからビルドしたApacheで、service statusが確認できないときの対処法

セットアップ中のサーバーで稼働状況を確認するために

sudo service httpd status

をした際、下記のようなエラーが発生しました。

<html>
                                   Not Found

   The requested URL /server-status was not found on this server.
     __________________________________________________________________


    Apache/2.2.34 (Unix) Server at localhost Port 80

殆どパッケージ版のApacheしか触ったことないので、見慣れない表示に、一瞬びっくりしてしまいましたが、なんとか心を落ち着けて解決方法を検索。
こちらのサイトで、解決策を見つけました。

VirtualHost設定 apache2サーバでのserver-status参照設定 – Check!Site

どうやら、/server-status というディレクトリの表示結果を見て稼働状況を判断しているということで、
http(s)://ドメイン名/server-status
にアクセスされたときに、ページを返すように設定すればエラーも解消するとのこと。

自分の場合、httpd.confに次の設定を追記

<VirtualHost *:80>
  ServerName localhost
  DocumentRoot "/usr/local/apache2/localhost"
 
  <Location /server-status>
    SetHandler server-status
    Order deny,allow
    Deny from all
    Allow from localhost
  </Location>
</VirtualHost>

あとは適当な内容のhtmlファイルを作成し、

/usr/local/apache2/localhost

へ配置しました。

この状態で、再度statusコマンドを打ってみます。

                       Apache Server Status for localhost

   Server Version: Apache/2.2.34 (Unix) DAV/2 PHP/5.3.3
   Server Built: Jul 27 2017 11:48:48
     __________________________________________________________________

   Current Time: Thursday, 26-Apr-2018 13:39:55 JST
   Restart Time: Thursday, 26-Apr-2018 13:39:14 JST
   Parent Server Generation: 12
   Server uptime: 41 seconds
   1 requests currently being processed, 7 idle workers

_W______........................................................
................................................................
................................................................
................................................................

   Scoreboard Key:
   "_" Waiting for Connection, "S" Starting up, "R" Reading Request,
   "W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup,
   "C" Closing connection, "L" Logging, "G" Gracefully finishing,
   "I" Idle cleanup of worker, "." Open slot with no current process

ばっちり、チェック結果が出るようになりました。

お困りの方の参考になりましたら幸いです。

takahashi 著者:takahashi

MySQLで日本語が文字化けしてしまうときの対処方法

MySQLを使って良くやらかすミスの一つとして、文字コードの設定ミスがあります。
MySQLの場合、デフォルトのまま利用すると、テーブルやdbが意図していない文字コード(例えばlatin1)になってしまうことがあります。

この状態でselectなどで日本語を取り出そうとすると文字化けしてしまい、”??????”のような文字列に置き換わってしまいます。

使っているMySQLのデフォルトの文字コードを確認するには、SQL文を

show variables like 'character%';

とします。すると

mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

のような形で確認することができます。
上の表示を見ていただくとわかるように、”character_set_connection”がlatin1になっていると日本語部分が文字化けしてしまい、where構文で日本語をフィルタしてもヒットしなくなってしまいます。

mysqlをパッケージからインストールした際、大抵/etc/my.cnfという名前でmysqlの設定ファイルが作成されているかと思います。
この設定ファイルに対して、次の4行を追加します。

[mysqld]
character-set-server=utf8

[client]
default-character-set=utf8

この設定を追加後、再度mysqlの文字コード設定を確認してみます。

mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

すべてutf8に変更されていることが確認できるかと思います。
この状態でselectすれば、日本語が文字化けせずに表示され、またwhere構文で日本語を検索しても、ちゃんとヒットするようになります。

サーバー側の設定を変更できなかったり、変更しても文字化けが治らない場合も、様々な方法があるようですので、お困りの方は確認してみてください。
MySQL のテーブルの文字コードを utf8 に変更する – UCWD-Studio – @matsuoka_UCWDjp ‘s Private Projects.

takahashi 著者:takahashi

[不具合]Android版Google Chrome 66で画像選択しようとするとクラッシュするバグが発生

本日、弊社サービスを利用しているお客様から、Android版Google Chromeを使って画像をアップロードしようとした際にエラーが発生するという問い合わせが入りました。
自分たちの環境でも試したところ、Android 6.0の端末で下記のようなエラーが出ることを確認しました。

Chromeの検証ツールではconsoleに特にエラー出力が出力されていなかったため、adb logcat コマンドでOSのログを取得。

04-26 18:58:29.812  1726  2925 I ActivityManager: Start proc 26320:com.android.chrome:decoder_service/u0i881 for service com.android.chrome/org.chromium.chrome.browser.photo_picker.DecoderService
04-26 18:58:29.885 18544 18544 W cr_Autocomplete: stopping autocomplete.
04-26 18:58:29.867 26332 26332 W com.android.chrome:decoder_service: type=1400 audit(0.0:215608): avc: denied { search } for comm=XXXXXXXXXXXXXXXXXXXXXXX name="com.android.chrome" dev="mmcblk0p43" ino=318469 scontext=u:r:isolated_app:s0:c512,c768 tcontext=u:object_r:app_data_file:s0:c512,c768 tclass=dir permissive=0 ppid=680 pcomm="main" pgid=26320 pgcomm="decoder_service"
04-26 18:58:29.867 26332 26332 W com.android.chrome:decoder_service: type=1400 audit(0.0:215609): avc: denied { search } for comm=XXXXXXXXXXXXXXXXXXXXXXX name="com.android.chrome" dev="mmcblk0p43" ino=318469 scontext=u:r:isolated_app:s0:c512,c768 tcontext=u:object_r:app_data_file:s0:c512,c768 tclass=dir permissive=0 ppid=680 pcomm="main" pgid=26320 pgcomm="decoder_service"
04-26 18:58:29.867 26332 26332 W com.android.chrome:decoder_service: type=1400 audit(0.0:215610): avc: denied { search } for comm=XXXXXXXXXXXXXXXXXXXXXXX name="com.android.chrome" dev="mmcblk0p43" ino=318469 scontext=u:r:isolated_app:s0:c512,c768 tcontext=u:object_r:app_data_file:s0:c512,c768 tclass=dir permissive=0 ppid=680 pcomm="main" pgid=26320 pgcomm="decoder_service"
04-26 18:58:29.887 26320 26332 W FileUtils: Failed to chmod(/data/user/0/com.android.chrome/app_chrome): android.system.ErrnoException: chmod failed: EACCES (Permission denied)
04-26 18:58:29.887 26320 26320 I cr_LibraryLoader: Using linker: LegacyLinker
04-26 18:58:29.888 26320 26332 W FileUtils: Failed to chmod(/data/user/0/com.android.chrome/app_textures): android.system.ErrnoException: chmod failed: EACCES (Permission denied)
04-26 18:58:29.888 26320 26332 W ContextImpl: Unable to create files subdir /data/user/0/com.android.chrome/cache
04-26 18:58:29.877 26332 26332 W com.android.chrome:decoder_service: type=1400 audit(0.0:215611): avc: denied { search } for comm=XXXXXXXXXXXXXXXXXXXXXXX name="com.android.chrome" dev="mmcblk0p43" ino=318469 scontext=u:r:isolated_app:s0:c512,c768 tcontext=u:object_r:app_data_file:s0:c512,c768 tclass=dir permissive=0 ppid=680 pcomm="main" pgid=26320 pgcomm="decoder_service"
04-26 18:58:29.877 26332 26332 W com.android.chrome:decoder_service: type=1400 audit(0.0:215612): avc: denied { search } for comm=XXXXXXXXXXXXXXXXXXXXXXX name="com.android.chrome" dev="mmcblk0p43" ino=318469 scontext=u:r:isolated_app:s0:c512,c768 tcontext=u:object_r:app_data_file:s0:c512,c768 tclass=dir permissive=0 ppid=680 pcomm="main" pgid=26320 pgcomm="decoder_service"
04-26 18:58:29.877 26332 26332 W com.android.chrome:decoder_service: type=1400 audit(0.0:215613): avc: denied { search } for comm=XXXXXXXXXXXXXXXXXXXXXXX name="com.android.chrome" dev="mmcblk0p43" ino=318469 scontext=u:r:isolated_app:s0:c512,c768 tcontext=u:object_r:app_data_file:s0:c512,c768 tclass=dir permissive=0 ppid=680 pcomm="main" pgid=26320 pgcomm="decoder_service"
04-26 18:58:29.877 26332 26332 W com.android.chrome:decoder_service: type=1400 audit(0.0:215614): avc: denied { search } for comm=XXXXXXXXXXXXXXXXXXXXXXX name="com.android.chrome" dev="mmcblk0p43" ino=318469 scontext=u:r:isolated_app:s0:c512,c768 tcontext=u:object_r:app_data_file:s0:c512,c768 tclass=dir permissive=0 ppid=680 pcomm="main" pgid=26320 pgcomm="decoder_service"
04-26 18:58:29.877 26332 26332 W com.android.chrome:decoder_service: type=1400 audit(0.0:215615): avc: denied { search } for comm=XXXXXXXXXXXXXXXXXXXXXXX name="com.android.chrome" dev="mmcblk0p43" ino=318469 scontext=u:r:isolated_app:s0:c512,c768 tcontext=u:object_r:app_data_file:s0:c512,c768 tclass=dir permissive=0 ppid=680 pcomm="main" pgid=26320 pgcomm="decoder_service"
04-26 18:58:29.877 26332 26332 W com.android.chrome:decoder_service: type=1400 audit(0.0:215616): avc: denied { search } for comm=XXXXXXXXXXXXXXXXXXXXXXX name="com.android.chrome" dev="mmcblk0p43" ino=318469 scontext=u:r:isolated_app:s0:c512,c768 tcontext=u:object_r:app_data_file:s0:c512,c768 tclass=dir permissive=0 ppid=680 pcomm="main" pgid=26320 pgcomm="decoder_service"
04-26 18:58:29.912 26320 26320 D AndroidRuntime: Shutting down VM
04-26 18:58:29.912 26320 26320 E AndroidRuntime: FATAL EXCEPTION: main
04-26 18:58:29.912 26320 26320 E AndroidRuntime: Process: com.android.chrome:decoder_service, PID: 26320
04-26 18:58:29.912 26320 26320 E AndroidRuntime: java.lang.RuntimeException: Unable to create service org.chromium.chrome.browser.photo_picker.DecoderService: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean org.chromium.base.CommandLine.hasSwitch(java.lang.String)' on a null object reference
04-26 18:58:29.912 26320 26320 E AndroidRuntime:        at android.app.ActivityThread.handleCreateService(ActivityThread.java:2944)
04-26 18:58:29.912 26320 26320 E AndroidRuntime:        at android.app.ActivityThread.access$1900(ActivityThread.java:154)
04-26 18:58:29.912 26320 26320 E AndroidRuntime:        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1474)
04-26 18:58:29.912 26320 26320 E AndroidRuntime:        at android.os.Handler.dispatchMessage(Handler.java:102)
04-26 18:58:29.912 26320 26320 E AndroidRuntime:        at android.os.Looper.loop(Looper.java:224)
04-26 18:58:29.912 26320 26320 E AndroidRuntime:        at android.app.ActivityThread.main(ActivityThread.java:5526)
04-26 18:58:29.912 26320 26320 E AndroidRuntime:        at java.lang.reflect.Method.invoke(Native Method)
04-26 18:58:29.912 26320 26320 E AndroidRuntime:        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
04-26 18:58:29.912 26320 26320 E AndroidRuntime:        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
04-26 18:58:29.912 26320 26320 E AndroidRuntime: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean org.chromium.base.CommandLine.hasSwitch(java.lang.String)' on a null object reference
04-26 18:58:29.912 26320 26320 E AndroidRuntime:        at org.chromium.base.SysUtils.isLowEndDevice(SysUtils.java:35)
04-26 18:58:29.912 26320 26320 E AndroidRuntime:        at org.chromium.base.library_loader.LegacyLinker.ensureInitializedLocked(LegacyLinker.java:11)
04-26 18:58:29.912 26320 26320 E AndroidRuntime:        at org.chromium.base.library_loader.LegacyLinker.prepareLibraryLoad(LegacyLinker.java:25)
04-26 18:58:29.912 26320 26320 E AndroidRuntime:        at org.chromium.base.library_loader.LibraryLoader.loadAlreadyLocked(LibraryLoader.java:62)
04-26 18:58:29.912 26320 26320 E AndroidRuntime:        at org.chromium.base.library_loader.LibraryLoader.ensureInitialized(LibraryLoader.java:17)
04-26 18:58:29.912 26320 26320 E AndroidRuntime:        at org.chromium.chrome.browser.photo_picker.DecoderService.onCreate(DecoderService.java:4)
04-26 18:58:29.912 26320 26320 E AndroidRuntime:        at android.app.ActivityThread.handleCreateService(ActivityThread.java:2934)
04-26 18:58:29.912 26320 26320 E AndroidRuntime:        ... 8 more
04-26 18:58:29.914  1726  2547 D ActivityManager: New dropbox entry: com.android.chrome:decoder_service, system_app_crash, XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX

詳しいことはわかりませんが、どうやら/data/user/0/com.android.chrome/app_texturesに対してchmod(読み書き権限の変更)をしようとして権限不足によりシステムから拒否されてchrome本体が落ちているようです。

問題が発生しているAndroid版Chromeのバージョンは 66.0.3359.126 で、この記事を書いた時点での最新版となっています。


なお、Android 7.0 で同じバージョンのChromeで画像アップロードした際は、問題なく画像選択可能でした。

Chromeアプリ本体の不具合ということであれば、自分以外にも不具合の報告が上がっているはず…ということで調べてみたところ、すでに数件の報告がネット上に上がっていました。

今回の場合、ほぼ間違いなくChromeアプリ本体の不具合のため、Googleがアップデートで不具合修正をするまで待つしかありません。
それまでの間、Android向けの別のブラウザアプリを利用することで、不具合を回避することができます。

自分たちの環境で確認した限りでは、Firefoxを用いると問題なくアップロード可能でした。

また、報告では、Chromeを端末出荷時にインストールされていたバージョンに戻すことで、再度画像アップロードが可能となる報告もありました。

自分の環境でも試したところ、確かに画像アップロードが可能となっていることを確認。
自分の環境の場合、バージョンダウン後のChromeのバージョンは 56.0.2924.87 となっていました。

Chromeのバージョンダウンは、アプリを一度無効化し、再度有効化することで可能です。

Androidアプリを削除(アンインストール)/無効化/非表示にする方法 – モバレコ

takahashi 著者:takahashi

VMWareでファイルをロックできませんでした エラーが出た時の解決策

最近、VMWareを使用して仮想の開発環境を使って動作テストをしているのですが、先日下のようなエラーがでて突如起動しなくなってしまいました…


by 宇宙仮面の研究室

もしかして、仮想ディスクか壊れた!?!?とかなり焦りました。

とりあえず原因を調べていたところ、下記のサイトを発見

vmware の Virtual Machine がファイルをロックできずに起動できない場合の対処方法 – 宇宙仮面の研究室

どうやら、何らかの原因でロックファイルが不正な状態で残ってしまうと、起動ができなくなってしまうようです。
自分の環境も確認知ってみると、

バッチリ残ってしまっていました。
こちらの2つのファイルを消したところ、再度起動できるようになりました。

仮想ディスクの破損じゃなくてよかった…(;´∀`)

同じ症状でお困りの方は、是非一度確認してみで下さい。

takahashi 著者:takahashi

撮影したときにどの場所にピントが合っていたのかが分かるLightroomプラグイン

自分は趣味でよく写真撮影をしています。
愛用しているカメラは一眼レフで、かなり細かい調整も可能な機種ではあるのですが、最近どうもうまくピントが合わない症状に悩んでいます。

ピントのずれはPCの画面のような大きな画面を見たときにはじめてわかるので、その場でピントのずれを確認できない場合があります。今回、カメラ側の故障なのか、それとも単に自分が下手なだけなのかを判別するために、何が原因でピントがずれてしまったのかを後から調べられる方法を探していました。

運よく、Adobe Lightroom向けのプラグインで後からピント調節の情報を確認できるプラグインを見つけたので紹介したいと思います。

Show Focus Popints Plugin というプラグインです。

例えば、こちらの写真

一見するとバッチリピントが合っているように見えますが、よく見ると…

結構ボケてしまっていました。
一体どこにピントがおうとんねん!!!ということで調べて見ます。

ライブラリを表示した状態で、プルダウンメニューから プラグインエクストラ->Show Focus Points
で確認してみます。

んんんんんんんん???
なにやら全体にピントがあっているという謎判定。

こういう時は右側にあるFocus informationを見てみます。

Focus modeのところにバッチリ”Manual Focus”と書かれています。
ハイ、これは完全に自分の調節ミスでした…

ということで、おかしいのはカメラ側なのか、自分の操作ミスなのかも後でもわかりますし、ここはオートフォーカスの方がよかったなーとか、もっとピント確認するように癖をつけようとか、反省会をすることもできるので非常に便利です。

ちなみに、万が一カメラ側の問題が疑われた場合も、オートフォーカスの際のピントの微調整ができる機能や機器があるようですので、修理に出さなくても、これらのものを活用すれば自分で修正も可能なようです。

自分で出来る!カメラのピントを微調整する方法。[AFマイクロアジャストメント] – studio9

USB DOCKで18-35mm F1.8 DC HSMのピント調整をやってみる – 酔人日月抄

ここ最近の写真を調べたところ、カメラではなくて、どうも自分の調整が甘かった写真が多かったことがわかってきました。
…もっと上手に撮れるように練習したいと思います。

takahashi 著者:takahashi

自宅サーバーを始めるときに最低限気を付けたい3つのこと

最近、自分の周りで、自宅サーバーを始める方が増えてきました。

自分も自宅サーバーを稼働させているのですが、今回はサーバーについて今まで勉強してきた中で、始めるにあたって最低限気を付けたいことをまとめてみました。

  • OSやファームウェアのアップデートは可能な限りこまめに行う

LinuxやWindows、サーバーを構築するにあたって、必ず何かしらのOSをセットアップするかと思います。
このOS、人間が作っているためどうしても何かしらのバグが出てくる可能性があります。

このバグですが、場合によっては権限のない利用者に対して管理者の許可なくサーバーを操作する手段を与えてしまう”脆弱性”になる可能性があります。

大抵の場合、これらの脆弱性は、開発元が定期的に修正したものを配信しており、それを受信・適用する”アップデート”機能が必ず備わっていると思います。

普段使っている、使うときにしか電源を入れない”クライアントPC”は通常直接インターネット上に公開されていない上に、ネットワーク上にその存在があるかどうかも調べなければ外部からは分からないので、アップデートをさぼっていてもすぐにやられる可能性はまだ低いですが、サーバーの場合はインターネットからいつでもアクセスできる状態である上、その存在もネット上に一般公開されているため、だれでも簡単に接続できます。したがって、脆弱性が見つかったら直ちにパッチをあてないと侵入されてしまう危険性が出てくるのです。

ただ、実際のところ、パッチを適用する際にOSの再起動が必要になることも少なくありません。
実際に運用する際は、アップデートの有無を定期的に確認するようにし、もし再起動の必要のない更新がある場合はすぐに適用、もし再起動が必要なものについてはあらかじめメンテナンス日時を決めておき、利用者に通知したうえで適用するようにするといいと思います。

OS以外にも、使用しているネットワーク機器(ルーターなど)や、仮想環境で使っている場合はホストマシンのOSやハイパーバイザーのアップデートなども併せて確認しておきましょう。

  • メールの不正中継対策を行う

自宅のサーバーでメールサーバー(SMTP)を建てる場合、特に注意しないといけないのはメールの不正中継対策です。
例えば、自分のサーバーでSMTPサービス(postfixやsendmailなど)を立ち上げ、外部からアクセスできるような状態にしている場合、SMTPサーバーから認証なしにメールを送信できるようにしていると非常に危険です。

スパムメール業者などは、使用しているメールサーバーから大量に迷惑メールを送信している関係上、各メールサービスプロバイダからブロックされやすい為、常にブロックされていない新たなメールサーバーを探している可能性があります。

もし不正中継対策をしていないSMTPサーバーを公開してしまうと、こういった業者に、迷惑メールやウイルスメールなどの送信に使われてしまう可能性があります。

もし上記のようになってしまった場合、たとえ自分が送ったわけではないことが証明できたとしても、社会的信用を失ったり、場合によってはその責任を求められる可能性が出てきます。

パソコンが「踏み台にされる」という表現を目にすることがあります。踏み台にされると何が起きるのか、またどんな対策をすればいいのか教えてください。 – マルウェア情報局

対策として、自分のSMTPサーバーを認証なく利用できないように設定しておくと、不正中継を防ぐことができます。

【図解】初心者にも分かるメールの仕組み(SMTP、POP、IMAPの違い) – SEの道標

また、自分のサーバーが不正中継されない設定になっているかテストができるサイトがあります。

第三者不正中継チェックサイトメモ 2017 – 優技録

  • 火事に注意

こちらは技術的な話からは離れるのですが、自宅で24時間PCを動かしていると、サーバーマシンが壊れた際に火事になるリスクがあるようです。

ノートPCをサーバーにして大惨事になった話 – VPS比較メモ

危険なのはノートPC、UPSなどのバッテリーを積んだ機器を使って稼働させている場合。

特にノートPCは持ち運びできるようにするために筐体を小さくすることに重点を置いて設計されており、長時間動作させることはあまり想定されていないようです。
そのため、サーバーのような24時間稼働させるような使い方をすると熱がこもり、バッテリーの爆発や中にたまったほこりなどに引火して火事になってしまうことがあるようです。

一方、デスクトップPCの方も火事になることはあまりないようですが、電源周りがショートして中で火花が飛ぶ、といったことが起こる可能性はあるようです。

自作PCからの出火が原因で火事になる確立はどのくらいでしょうか?- Yahoo!知恵袋

こちらもやはり、定期的なメンテナンスを設けて、ほこりの除去などの定期的な手入れをした方がよさそうです。
また、監視ツールなどを使ってハードウェアの状態を常に監視しておくことも有効かもしれません。

  • 最後に

自宅サーバーの稼働には確かにリスクがあります。
それ故に「VPSなどを使えば事足りるし、安くて安全だし、自宅にサーバーを置くべきではない」という論調も目立ちます。

しかし、実際のところは、ガッツリサーバーを利用したい場合はVPSはかなり高くつきます(例えば、1TBのストレージを使おうと思ったら、自鯖ならHDDを追加すれば済みますが、VPSやクラウドの場合は月額でだいたい1万弱かかります)し、ハード構成やネットワークも含めて、一から自分で設計・構築ができるのはかなり魅力だと思います。

また、データはすべて自分が管理しているマシンの中に納まっているので、業者の不手際による情報流出や情報の不正利用のリスクを防ぐことができます。

ちなみに、有名なITニュースサイト Gigazine は、自分たちの発信する情報に対して圧力がかかっても公開が停止させられることがないように、という理由で、敢えてオンプレミスで運用している、という例もあります。

海外にディザスタリカバリを複数箇所設置 – Gigazine

自宅サーバーとクラウド(VPS)、どちらが優れているのかはそのままオンプレミスかクラウドか、の議論に発展していくわけですが、個人的にはこの議論はナンセンスだと思っています。

クラウドもオンプレミスも一長一短があり、どの形態が適しているのかは自分がどういったサービスを建てたいのかで決まってくるからです。そしてその選択肢として、クラウド(VPS)も自宅サーバー(オンプレミス)いずれもなり得えるということです。

また、どちらを選んだとしても、ネット上に自分の環境を公開することはリスクを伴います。そのリスクに対してどう対応していくか、考えていくのも勉強の一つだと思います。

普段何気なく利用しているWebサイトやWebサービスですが、その裏側がどうなっているのかを知ることはとても面白いです。

自分が構築したインフラやコンテンツが、インターネットを通じて全世界の人に見てもらえることの楽しさを、ぜひ多くの方が体験出来たら素敵だな、と思っています。

takahashi 著者:takahashi

XperiaのBluetoothで音が途切れる・聞こえなくなる不具合を治す方法

自分はメインのスマートフォンとしてXperia Z5 を使用しています。
SONYが製造・販売するスマートフォン、Xperiaシリーズは当初からかなり人気があり、一時期自分の周りのほとんどの人が、iPhoneかXperiaのどちらかを持っている状態になりました。

そんなXperiaですが、使っていて気づいたのがBluetooth周りの不具合。
自分の使っているZ5では、Bluetoothで音楽を聴いていると頻繁に音途切れが発生する問題が起きていました。
見ている限り端末の高負荷時に起きているような印象だったので、きっとそれが原因だと考えていたのですが、Z5より前に使っていたAQUOS PHONE 303SHでは負荷がかかってもBluetoothが途切れることはかなりまれだったので、変だな、とは思っていました。

最近かなり途切れ具合が酷くなっていたので、ネットで対策方法を調べていたらこんな記事が。

Xperia Z5でBluetoothイヤフォンが音飛び、途切れる、音が出ない場合などの改善・対処方法 – スマホ評価・不具合ニュース

どうやらこれ、どうもバグだったようで…
Androidの標準機能からペアリングすると不具合が発生するので、SONY独自のファームウェアに含まれる”Throw”からペアリングすることで安定するようになるとのこと。

まず、ホーム画面内のドロワーから、”設定”を開きます。

中から”機器接続”を選択

“Throw” をタップします。

Throwについて をタップ

はじめにをタップします。

今セットアップをしようとしている機器の種類を選択

Bluetoothを選択します。

機器を追加 をタップ

この状態になったら、Bluetooth機器の方をペアリングモードにすると、Xperia側に機器が表示されるので、そこをタップすると設定完了です。

この方法でペアリングしなおしてから、音飛びや音が再生されない不具合は今のところ解消しています。
Xperiaは他のAndroid端末と比較して、かなり幅広い機器と接続できるのがとてもいいのですが、その反面Bluetooth周りに弱点が出てしまったような形です。

今後改善されることを願います。

takahashi 著者:takahashi

スマートフォンで本格的な緊急地震速報が受信できるアプリ “Signal Now Mobile”

先日からちょくちょく南海トラフ自身の話題がTwitterなどで上がっていました。

もし南海トラフ地震が起きた際の静岡県内の被害は甚大で、想定死者数は10万人を超えると予測されています。

南海トラフ地震の被害想定 – 朝日新聞

地震が起きた際、生存率を少しでも上げる方法として、情報をいかに早くキャッチして、適切な行動をとれるか、というのも助かる要因の一つになるのではないかと思います。

自分の場合、詳細な緊急地震速報を受け取るために、自宅のPCにSignal Now Xというアプリをインストールしてあります。
このSignal Now X 緊急地震速報を受信すると、警報音とともに、あと何秒で津波が到達するかを教えてくれる、高度なアプリとなっています。

ただしこのアプリ、Windowsにしか対応しておらず、PC向けなので持ち出せないというデメリットがありました。

そんな中、同じシリーズでスマートフォン版があったことを先日知りました。
SignalNow MObile = Google Playストア

その名前もSignalNowMobileです。

月額100円の有料とはなりますが。SignalNowXで取得できるような、あと何秒後で地震が到達するか、まで教えてくれます。

キャリア標準の緊急地震速報も強力ですが、秒数が表示されるアプリは今のところこちらだけな気がします。

巨大な地震も、普段から準備しておくことで少しでもリスクを減らすことができるはず。
備えあれば憂いなし、ですし、今のうちから準備をしておきたいですね。

takahashi 著者:takahashi

IEで使えない”Object.assign”を補完するPolyfillなjsライブラリ”object-assign.js”

会社で構築していたプログラムのデバッグをしていたところ、IEで動作しないファンクションを発見してしまいました…

Object.assign() – MDN Web Docs
この関数は

一つ以上の ソース オブジェクトから、直接所有で (own) 列挙可能な (enumerable) すべてのプロパティの値を、ターゲット オブジェクトへコピーします。

という機能を持っているのですが、この関数がInternet Explorerで対応していなくて、プログラムがIEで動かない状況が発生してました。

IEで対応していない、といわれるとかなり焦ってしまいますが、よく使われている関数については、大抵の場合代替えとなる関数を誰かが公開していることが多いです。
今回の Object.assign() については、こちらのサイトでPolyfillなライブラリが公開されていました。

spiralx/object-assign.js – Gist

今回は、このGistのコードを使わせていただきました。

使い方は簡単。
Object.assign()を使用しているページで、一緒にobject-assign.jsを読み込むだけ。
“assign”という名前で使えるようにしてくれているので、コード内で記述したファンクションを書き換える必要がないのは非常にありがたいです。

今回のように、新しいブラウザでしか対応していない関数をほぼ同じ機能を持つ同じ名前の自作関数として定義してしまうことで、使えるようにしてしまう手法のことを”Polifill”と呼ぶそうです。

反対に、その関数でやりたかったことを別の関数で代替えすることを”Ponyfill”と呼ぶそうです。

PolyfillとPonyfill – Qiita

それぞれの違いや、メリット/デメリットについては、上記の記事が非常に分かりやすいです。

html5によって、各ブラウザ間の動作はそこそこ統一されてきている印象はありますが、まだまだ完全な互換性があるとはいいがたく、依然としてWebプログラムのデバッグをするために、主要なブラウザで一通り動作確認をする必要があるのが現状です。

特に酷いのがビューの部分。ブラウザによって大分解釈が違うようで、Chromeは意図通りに動いても、SafariやIEだとめちゃくちゃに崩れている…なんてことも結構あり、油断できません。

正直HTML5の意味…とか思ってしまうけど、統一するのもなかなか一筋縄ではいかないのでしょう。
HTML5はまだ改善の途上ですし、今後に期待したいです。

とりあえず、せめてモダンなブラウザとの互換性がかなり微妙なIEがデファクトスタンダードな風潮だけは抜けてほしいなーと思いますね…

takahashi 著者:takahashi

FuelPHPでNotice例外の表示を消す方法

FuelPHPはデフォルトで、すべてのPHPエラーを表示するように設計されています。

FuelPHP は、古い手続き型の関数からの(例外でなない)PHP エラーに遭遇した場合、デフォルトの PHP の振る舞いを変更します。 FuelPHP は、致命的でない PHP エラーに遭遇した場合、処理を継続せず、これらのすべてのエラーに対し PhpErrorException をスローします。 すると、以前は無視していたような E_NOTICE といったエラーもすべて解決することを求められます。 非プログラマが作成したビューファイル中の構文エラーといった、PHP のエラーを捕らえることも同時に可能になります。

つまり、PHP上で作法通り(例えば空の変数を参照しない、など)プログラムしていないとNoticeエラーでバシバシ怒られます。
綺麗なプログラムを描きたい場合は非常に有用です(し、可能な限り修正すべきです)が、既成のライブラリを用いたり、開発期間が短かかったり、などといった場合はNoticeエラーが表示されるのは非常に困ることがあります。

そういう場合にNoticeエラーを無効化する方法を紹介します。

自分の知る限り、無効化する方法は2通りあります。

一つ目は、.htaccessでPHPのNoticeエラーを無効化する方法です。
fuelの場合、ドキュメントルート/public/.htaccess に次の設定を加えることで設定できます。

php_value "error_reporting" "E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR"

この一行を、.htaccessの末尾に追加すれば設定完了です。
もう一つの方法は、fuelPHPの設定ファイル fuel/app/config/config.php に設定を記述することでnoticeを無効化できます。

アプリケーション設定 – FuelPHP

FuelPHPは”規定より設定”という思想で開発されており、かなり自由にコーディングすることができます。
最低限のルールの土台はfuel、それ以降の細かい部分は自分で作りこむことができるのがfuelの魅力ですね。

フレームワーク何を使うか悩んでいる方は是非一度試してみてはいかがでしょうか。