ソフラボの技術ブログ

仕事で使ったプログラミング、サーバー周りで役に立つこと、Webサービス開発に必要な技術情報、モバイル情報を書いてます。わかりやすく見やすくをモットーにしています。

C#/VBでフォームを1つしか表示させないようにする

フォームを1つしか表示させないようにする方法を調べていると、次のサイトに説明がありました。

フォームが一つしか表示されないようにする: .NET Tips: C#, VB.NET

フォームを静的プロパティ、シングルトンを使って保持する

静的プロパティ、シングルトンを使うと実現はできますが、フォーム毎にそのコードを書く必要があり、メンテナンス性が低下します。

シングルトンを使った場合、フォームを閉じる処理でフォームを閉じるのではなく、フォームを隠す必要があるようです。

閉じる処理が、本来とは別の処理になってしまうので良くないですね。

VBの「My.Forms」を使う

VBに特化しているのでC#で使うことができません。
VBだけで使うのならありですが、汎用的に使えるに越したことはないので、この方法は使えません。

新しい方法「Application.OpenForms」を使う

メンテナンス性が良く、言語に依存しない形を探した所、Application.OpenFormsが有力だったのでそれで実装してみました。

Application.OpenFormsは、インスタンス化されているフォームを取得することができます。

コード説明

Application.OpenFormsを使用して表示させたいフォームがインスタンス化されているかを判断します。

インスタンス化されていればそのまま表示し、なければ新規でインスタンス化しフォームを表示させます。

フォームをForm.Hideで隠していたとしても、インスタンスとしてまだ存在しており、Application.OpenFormsで取得できるので、そのままフォームを表示させます。

C#

public static void ShowOnlyOneForm(Type formType)
{
    Form openForm = Application.OpenForms[formType.Name];
    if (openForm == null)
    {
        Form form = (Form)Activator.CreateInstance(formType);
        form.Show();
    }
    else
        openForm.Show();
}

VB

Public Shared Sub ShowOnlyOneForm(formType As Type)

    Dim openForm As Form = Application.OpenForms(formType.Name)
    If openForm Is Nothing Then
        DirectCast(Activator.CreateInstance(formType), Form).Show()
    Else
        openForm.Show()
    End If

End Sub

はてなブログのソースコード色付けで代表的な表記のまとめ

はてなブログで記事を書いている時、時々ソースコードの色付けで何を指定するのかわからなくなります。
忘れないために代表的な言語をまとめてみました。


公式サイトのヘルプがリニューアルされたようで、以前より探しやすくなっています。help.hatenablog.com


基本的には言語の名称そのままでいけそうです。

Web関連

言語 表記
CSS css
HTML html
Javascript javascript
JSP jsp

データーベース

言語 表記
SQL sql
PLSQL plsql

その他

言語 表記
XML xml
YAML yaml
シェル sh
Zシェル zsh


公式サイト見る限り何に使うのか不明なものがたくさんあります。
使える表記だけでなく、この表記はこの言語と対応表が欲しいところですね。

CentOSにPhantomJSとCasperJSをインストールする

以前、CentOSに最新のPhantomJSをインストールしようとするとエラーが発生するという記事を書きました。shinsuke789.hatenablog.jp


その後、さらに調べてみると古いバージョンのバイナリが配布されていることがわかり、これをインストールすると問題なく使用できたので、その時の手順を紹介します。

環境

OS CentOS 6.4
PhantomJS 1.9.8
CasperJS 1.1.0-beta3

手順

PhantomJS

1.PhantomJSのBitbucketよりバイナリファイルをダウンロードします。そのままwgetすると長いURLになってしまうので、別名で保存します。

# 保存先に移動する
cd /usr/local/src

# バイナリをダウンロードする
wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-1.9.8-linux-x86_64.tar.bz2 -O phantomjs-1.9.8-linux-x86_64.tar.bz2

# 解凍する
tar jxvf phantomjs-1.9.8-linux-x86_64.tar.bz2

# 解凍後のディレクトリ名を変更する
mv phantomjs-1.9.8-linux-x86_64 phantomjs

# 移動する
cd phantomjs


2.「/usr/local/bin」にシンボリックリンクを作成します。

# phantomjsディレクトリで実行する(/usr/local/src/phantomjs)
ln -sf `pwd`/bin/phantomjs /usr/local/bin/phantomjs


3.インストールバージョンを確認します。

# 「/usr/local/src/phantomjs/bin」で実行する
phantomjs --version
1.9.8


パスの設定は行わず、そのままCasperJSのインストールを行います。

CasperJS

1.公式サイトのインストール手順(git)に従ってインストールを行います。

# gitがなければインストールする
yum install git

# gitより取得する(作業ディレクトリ:/usr/local/src)
git clone git://github.com/n1k0/casperjs.git

# ディレクトリに移動する
cd casperjs

# 「/usr/local/bin」にシンボリックリンクを作成する
ln -sf `pwd`/bin/casperjs /usr/local/bin/casperjs


2.インストールバージョンの確認を行います。

casperjs --version
1.1.0-beta3


この時点でPhantomJS、CasperJSともパスが通っているので、追加の設定は不要です。

サンプルプログラムの実行

1.Googleサイトのタイトルを取得する簡単なサンプルプログラム「test.js」をviエディタ等で作成します。

test.js

var casper = require('casper').create();

casper.start('http://www.google.co.jp/', function() {
    this.echo(this.getTitle());
});

casper.run();


2.サンプルプログラムを実行し、「Google」と出力されれば動作確認完了です。

casperjs test.js
Google

PhantomJS掲載の雑誌

WEB+DB PRESS Vol.77

WEB+DB PRESS Vol.77

  • 作者: 中川勝樹,山内沙瑛,舟崎健治,吉荒祐一,今井雄太,八木橋徹平,安川健太,近藤宇智朗,奥野幹也,天野祐介,賈成カイ,伊藤直也,住川裕岳,北川貴久,菅原一志,後藤秀宣,久森達郎,登尾徳誠,渡邊恵太,中島聡,A-Listers,小俣裕一,はまちや2,川添貴生,石本光司,舘野祐一,沖田邦夫,澤村正樹,卜部昌平,吉藤博記,片山暁雄,平山毅,WEB+DB PRESS編集部
  • 出版社/メーカー: 技術評論社
  • 発売日: 2013/10/24
  • メディア: 大型本
  • この商品を含むブログ (3件) を見る

CasperJS掲載の雑誌

WEB+DB PRESS Vol.80

WEB+DB PRESS Vol.80

ChromeがフリーズしすぎるのでFirefoxに乗り換えたら快適になった

f:id:shinsuke789:20150329193048j:plain


会社のパソコンでは、ブラウザにGoogle Chromeを使用していました。

以前よりページの読み込み時にフリーズすることがあり、試行錯誤して対処方法を探していました。

私が試した方法

以前の記事に3通り試した方法を書きました。


shinsuke789.hatenablog.jp

shinsuke789.hatenablog.jp

shinsuke789.hatenablog.jp

環境

会社のパソコンの環境は次のとおりです。

メーカー lenovo
モデル T520
CPU Core i5 2520M
メモリ 8GB
HDD 500GB


スペック的には十分なのですが、Chromeではなぜかフリーズします。
意味がわかりません。

HDDに障害があるのではと思い、チェックディスクや障害確認ツール等で調べましたが全く異常なしでした。

何をやっても改善されないので、諦めてブラウザをFirefoxに乗り換えることにしました。

Firefoxに乗り換えてから快適!!

Firefoxに乗り換えると、Chromeでのフリーズのストレスから解放され、快適にブラウザイングできるようになりました。

もっと早く乗り換えていたらと思いました。

Chromeと少し使い勝手が異なる所がありますが、慣れれば特に問題なしです。

Firefoxをもっと快適にするための設定

普通に使っても快適ですが、更に快適に使用するためにキャッシュをメモリ上に置くようにします。

次のサイトで詳しく解説しているので参考にして下さい。blog.halpas.com


まとめ

Chromeは、アップデートされるたびにどんどん重くなっています。

Chromeが謳っている「スピード、シンプル、セキュリティの 3 つに重点を置いて開発されたブラウザ」の「スピード」とは何なのか疑問に感じます。

私の環境では、会社のパソコンだけで動作が重く、プライベートで使用しているMacWindowsでは全く問題はありません。
違いとしては、HDD、SSDの違いです。
物理的な速度は全然違いますが、それにしてもHDDの場合重すぎます。

Chromeの遅さにイライラしている方は、これを機会にFirefoxに乗り換えてみてはいかがでしょうか。

IIJmioのデータ量が4月から増量される!キャリア契約が不要になるのも近いかも!

f:id:shinsuke789:20150315083159j:plain

IIJmioで2015年4月1日から無料データ量が現行より増量されます。

IIJmio:サービス仕様改定のお知らせ(IIJmio高速モバイル/Dサービス)


3GB,5GB,10GB 価格はそのままデータ増量!|IIJmio

月額とデータ増加量

月額料金は据え置きで、データ量のみ増加します。

プラン 容量 データのみ月額 音声+データ月額
ミニマムスタートプラン 2GB→3GB 900円 1,600円
ライトスタートプラン 4GB→5GB 1,520円 2,220円
ファミリーシェアプラン 7GB→10GB 2,560円 3,260円

※月額は税抜き

以下のパッケージ、カウンターからの契約も対象となります。

もうキャリア契約は不要!?

最安のミニマムスタートプランでも3GBまで制限なしで使えるので、高額なキャリア契約は不要になるかもしれません。

料金プランがわかりやすいauと比較してみます。

データプランのみ比較

容量 IIJmio au 差額
3GB 900円 4,200円 3,300円
5GB 1,520円 5,000円 3,480円
10GB 2,560円 8,000円 5,440円


auIIJmioより3〜4倍の料金が発生します。
au高すぎです。ボッタクリすぎです。

音声通話で比較

IIJmio au 備考
音声通話 700円 2,700円 auはかけ放題
データ通信(3GB) 900円 4,200円
LTE NET なし 300円
合計 1,600円 7,200円 差額5,600円


auは電話がかけ放題なので比較しにくいですが、5,600円(4.5倍)も差があります。
その差額でauの月額料の約8割をまかなえてしまいます。
節約分を貯めていくと約1年ぐらいで新品のスマホが買えてしまいますね。


IIJmioの特徴として、データ量を翌月まで繰り越すことができます。
3GBの場合、最大ひと月で6GBまで使うことができます。
6GBとなると足りないということはなかなかないのではないでしょうか。

贅沢な悩み、無料データ量が使い切れない

データ量が増えてうれしいのですが、そこまでデータ通信しない方には使い切れないと思います。

私は、現在ミニマムスタートプラン(現行2GB)を利用しています。
毎日、スマホで頻繁に通信をしてるわけではないので、2GB/月を使い切るのに困っています。

スマホでの通信頻度を増やすか、テザリング等を行って通信量を増やして消化するしかないですね。

おすすめのSIMカード

他にもIIJmio系列のSIMカードとして「BIG SIM」「DMM SIM」があります。
基本的にIIJmio系列のSIMカードを契約しておけば安心だと思います。

同じサービスでも、料金、データ量、オプションが異なっているので使い勝手の良いサービスを選択すればいいと思います。

DMM SIM

料金を節約したいというなら「DMM SIM」の1GBプランが660円と最安でおすすめです。
データ量も細かく区切られていてプランが豊富です。

DMM mobile データSIMプラン 1GB


今回IIJmioがサービス改定を発表したので、DMMとプランが同じものがでてきました。
ひょっとするとDMMもサービス改定を行うかもしれません。

BIG SIM

IIJmioと全く同じプランを提供しています。
違いは、オプションサービスとして公衆無線LAN「Wi2」が無料で使える特典がついています。
外出先でデータ量を気にせず通信を行いたい方におすすめです。

BIC SIM(ビックシム)-ビックカメラ.com

サービスへの要望

キャリアでは、条件を満たすと無料でデータ量を増量するサービスがあります。
MVNOもそれをマネてサービス向上を行うのではと思います。

キャリアからMVNOへMNPして使っている方には、データ量が増えた方がいいと思います。
でも、スマホはデータ通信専用、モバイルルータを持っている、複数端末でSIMカードを使っているなど、SIMカードをデータ通信のみで使用している方には、無料データ量を細かく分けて、料金を安くして欲しいと思います。

私の場合、月1.5GBもあれば十分なので、データ量を増やすのではなく料金を安くしてほしいです。

まとめ

2015年5月からSIMロック解除が義務化されるので、携帯関連に変化があり競争が激化すると思われます。

今までは携帯本体と通信会社はセットとして扱われてきましたが、それが別々に選択できるようになってきます。
まだまだSIMフリー端末は、高い印象があり、身近に購入できる存在ではないです。
それも時間とともに安くなり、家電と同じように端末のみで購入できる日がくるでしょう。

そういう環境が整ってくると、docomoausoftbankで契約する意味というのはなくなってくるはずです。
いくらMNPで乗り換えてスマホが無料でもらえるからといっても、通信費が月7,000円以上かかるのはメリットが薄いように感じます。

目先の利益よりもトータルでどれだけお得になるのかを考えて契約するのがいいと思います。

PhantomJSをCentOSでビルドしたらエラーが出てインストールできない

既存のサイトからデータを取得して欲しいという要望があったので、PhantomJSを使ってプログラムからブラウザを操作し、スクレイピングすることを最近行っています。

Macにはすんなりインストールできて、プログラムもある程度出来上がったのでサーバーにもインストールして動作確認をしてみようと、PhantomJSをインストールしてみたけどエラーが出てインストールが完了しませんでした。

その時のエラー内容を記載しておきます。
まだきっちり調べてませんが、他の人も問題に上げているようで解決方法がはっきりしていないように感じます。

環境

CentOS 6.4
PhantomJS 1.9 or 2.0

PhantomJSのインストール方法

Linux用バイナリにはまだ問題があるようで、ソースからのインストールを推奨すると公式サイトには書いてあります。

Binary packages for Linux are still being prepared. There are still issues to be solved until a static build is available (see issue 12948 for more details).

In the mean time, it is recommended to build the Linux version from source.

バイナリの代わりにソースからインストールする方法も書かれているので、それに従ってインストールします。
Build | PhantomJS


まず必要なパッケージをyumでインストールします。

sudo yum -y install gcc gcc-c++ make flex bison gperf ruby \
  openssl-devel freetype-devel fontconfig-devel libicu-devel sqlite-devel \
  libpng-devel libjpeg-devel


その後、PhantomJSのソースをGitから取得しビルドします。

cd /usr/local/src
git clone git://github.com/ariya/phantomjs.git
cd phantomjs
git checkout 2.0
./build.sh

PhantomJS2.0をビルドした結果

2.0でビルドすると次のエラーが発生し、インストールに失敗します。
最終あたりのログを抜粋しています。

Encountered 4 configuration warning(s):

 ! QtQuick module not found, QML APIs will not be built
 ! Missing GStreamer or QtMultimedia, disabling HTML5 media element support
 ! Missing QtTest module, disabling DumpRenderTree, WebKitTestRunner and tests
 ! QtWebKitQml will not be build. It is not supported with static linking

The WebKit build was disabled for the following reasons: 
    * Missing gperf from PATH
    * Missing ruby from PATH 

make: `first' に対して行うべき事はありません.

Building main PhantomJS application...

cd src/ && ( test -e Makefile.phantomjs || /usr/local/src/phantomjs/src/qt/qtbase/bin/qmake /usr/local/src/phantomjs/src/phantomjs.pro -o Makefile.phantomjs ) && make -f Makefile.phantomjs 
Project ERROR: Unknown module(s) in QT: webkitwidgets
make: *** [sub-src-phantomjs-pro-make_first-ordered] エラー 3

PhantomJS1.9をビルドした結果

2.0では失敗するので1.9でやればうまくいくと書かれているものがあったので、やってみたけどこれも失敗します。

# /usr/local/src/phantomjsで
git checkout 1.9
./build.sh


最終あたりのログを抜粋しています。

g++ -m64 -Wl,-O1 -Wl,-rpath,/usr/local/src/phantomjs/src/qt/lib -o ../bin/phantomjs phantom.o callback.o webpage.o webserver.o main.o csconverter.o utils.o networkaccessmanager.o cookiejar.o filesystem.o system.o env.o terminal.o encoding.o config.o childprocess.o repl.o gif_err.o gifalloc.o egif_lib.o gif_hash.o quantize.o gifwriter.o mongoose.o linenoise.o utf8.o qcommandline.o minidump_file_writer.o convert_UTF.o md5.o string_conversion.o crash_generation_client.o exception_handler.o log.o linux_dumper.o linux_ptrace_dumper.o minidump_writer.o file_id.o guid_creator.o memory_mapped_file.o safe_readlink.o moc_phantom.o moc_callback.o moc_webpage.o moc_webserver.o moc_networkaccessmanager.o moc_cookiejar.o moc_filesystem.o moc_system.o moc_env.o moc_config.o moc_childprocess.o moc_repl.o moc_qcommandline.o qrc_phantomjs.o qrc_ghostdriver.o qrc_WebKit.o qrc_InspectorBackendStub.o    -L/usr/local/src/phantomjs/src/qt/lib -L/usr/local/src/phantomjs/src/qt/plugins/codecs -lqcncodecs -L/usr/local/src/phantomjs/src/qt/lib -lqjpcodecs -lqkrcodecs -lqtwcodecs -lQtWebKit -lQtGui -lfreetype -lfontconfig -lQtNetwork -lQtCore -lm -ldl -lrt -lpthread 
/usr/bin/ld: cannot find -lQtWebKit
collect2: ld はステータス 1 で終了しました
make[1]: *** [../bin/phantomjs] エラー 1
make[1]: ディレクトリ `/usr/local/src/phantomjs/src' から出ます
make: *** [sub-src-phantomjs-pro-make_default-ordered] エラー 2

エラーの原因

1.9、2.0とも「QtWebKit」に問題があると出ています。

「QtWebKit」はブラウザのレンダリングエンジンのライブラリなのかなと思います。
少しだけ調べると、「Qt」というライブラリがあるようです。
PhantomJSにWebKitは含まれているらしいのですが、それに問題があるのでしょうか。

もう少し調べてみようと思います。