節電と防寒のために購入した「膝掛け」には便利な「肩紐」がついていました。
このおかげで、立って移動する場合でも膝掛けが体にくっついてきます。
・・・が、しかし、この形はどう見ても「袈裟」です。
そんなわけで最近は、徳の高い僧侶になった気分で仕事しています。
節電と防寒のために購入した「膝掛け」には便利な「肩紐」がついていました。
このおかげで、立って移動する場合でも膝掛けが体にくっついてきます。
・・・が、しかし、この形はどう見ても「袈裟」です。
そんなわけで最近は、徳の高い僧侶になった気分で仕事しています。
ウェブテクノロジのサーバやネットワークのお守りをしている yone です。今後、社内で実際に使っているソフトウェア・設定・構成などの豆知識のご紹介をしていきたいと思っています。巷にある情報の再掲になりますが、実稼働事例の一つとしてご参考になれば幸いです。
HTTPS を使ったウェブサイトを立ち上げるとき、SSL サーバ証明書屋さんからサーバ証明書を購入するのが普通です。
ところが、会社内や特定のメンバー内だけで利用するサーバであれば、必ずしも証明書屋さんから証明書を購入する必要はないのです。
今回は、証明書屋さんから買わずに自前で証明書屋さんを作って自前で証明書を発行し、HTTPS サイトを立ち上げる方法をご紹介します。
その証明書の正式名称は、自己署名証明書ですが、本稿ではオレオレ証明書と表記することにします。(笑)
試しに、「オレオレ証明書」で検索してみてください。ジャーゴンとして、意外と広く使われているようです。
同様に、自前の証明書屋さんはオレオレ認証局と表記します。こちらも正式な名称ではありません。
ウェブサイトの URL の先頭が、https:// となっている場合、SSL または TLS を利用しています。このときの主な特徴は下記のようになります。
証明書屋さんへお金を払って証明書を買うのはなぜでしょうか。それは、2番目のサーバ認証のためです。このサーバは本物だぞと、証明書屋さんが太鼓判を押しているのです。
特定のメンバー内だけで使う場合、事前にオレオレ証明書を「この証明書は本物や!」と配布しておけば、証明書屋さんから購入したサーバ証明書と同様に使えちゃったりします。
不特定多数がアクセスするウェブサイトに使うのは不適切です。諦めて、証明書屋さんから購入しましょう。
サーバー証明書エラーの画面
実は CentOS 5 の場合、mod_ssl パッケージをインストールするとオレオレ証明書で稼動状態になります。が、そのままアクセスすると警告を表示してしまいます。
この難局に立ち向かう術は2つあります。
サーバの数が多くないのであれば前者でもよいのですが、いくつもいくつもある場合は認証局を作ってしまいましょう。認証局の登録を一回行えば、他の登録作業はなくなります。
ここでは CentOS5 上で新規構築します。一度だけの実施です。下記は、exampleCA という名称で作成した例です。
# cd /etc/pki # mkdir exampleCA # cp tls/misc/CA exampleCA/ # cp tls/openssl.cnf exampleCA/ # echo 01 > exampleCA/crlnumber
/etc/pki/exampleCA/CA ファイルを修正します。
SSLEAY_CONFIG="-config /etc/pki/exampleCA/openssl.cnf" ← 追加 DAYS="-days 365" # 1 year CADAYS="-days 1095" # 3 years REQ="openssl req $SSLEAY_CONFIG" CA="openssl ca $SSLEAY_CONFIG" VERIFY="openssl verify" X509="openssl x509" CATOP=/etc/pki/exampleCA ← 修正 (中略) -newca) (中略) $CA -out ${CATOP}/$CACERT $CADAYS -batch \ -extensions v3_ca \ ← 追加 -keyfile ${CATOP}/private/$CAKEY -selfsign \ -infiles ${CATOP}/$CAREQ
/etc/pki/exampleCA/openssl.cnf ファイルを修正します。
[ CA_default ] dir = /etc/pki/exampleCA # Where everything is kept ← 修正 (中略) [ req_distinguished_name ] countryName = Country Name (2 letter code) countryName_default = JP ←修正 countryName_min = 2 countryName_max = 2 stateOrProvinceName = State or Province Name (full name) stateOrProvinceName_default = Tokyo ←修正 localityName = Locality Name (eg, city) localityName_default = Toshima-ku ←修正 0.organizationName = Organization Name (eg, company) 0.organizationName_default = Example Corp. ←修正 (中略) [ usr_cert ] basicConstraints=CA:FALSE keyUsage = digitalSignature, keyEncipherment ←追加 extendedKeyUsage = serverAuth ←追加 # nsComment = "OpenSSL Generated Certificate" ←コメントアウト subjectKeyIdentifier=hash authorityKeyIdentifier=keyid,issuer (中略) [ v3_ca ] keyUsage = cRLSign, keyCertSign ←コメント削除
秘密鍵・公開鍵・自己署名証明書を生成します。
# cd /etc/pki/exampleCA # ./CA -newca mkdir: cannot create directory `/etc/pki/exampleCA': File exists CA certificate filename (or enter to create) (そのままEnter) Making CA certificate ... Generating a 1024 bit RSA private key ...++++++ ...........++++++ writing new private key to '/etc/pki/exampleCA/private/./cakey.pem' Enter PEM pass phrase:CAパスフレーズを入力 Verifying - Enter PEM pass phrase:CAパスフレーズを入力 ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [JP]: State or Province Name (full name) [Tokyo]: Locality Name (eg, city) [Toshima-ku]: Organization Name (eg, company) [Example Corp.]: Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server's hostname) []:example CA Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Using configuration from /etc/pki/exampleCA/openssl.cnf Enter pass phrase for /etc/pki/exampleCA/private/./cakey.pem:CAパスフレーズを入力 Check that the request matches the signature Signature ok Certificate Details: Serial Number: 0 (0x0) Validity Not Before: Aug 1 10:34:25 2007 GMT Not After : Jul 31 10:34:25 2010 GMT Subject: countryName = JP stateOrProvinceName = Tokyo organizationName = Example Corp. commonName = example CA X509v3 extensions: X509v3 Subject Key Identifier: xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx X509v3 Authority Key Identifier: keyid:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx DirName:/C=JP/ST=Tokyo/O=Example Corp./CN=Example CA serial:00 X509v3 Basic Constraints: CA:TRUE X509v3 Key Usage: Certificate Sign, CRL Sign Certificate is to be certified until Jul 31 10:34:25 2010 GMT (1095 days) Write out database with 1 new entries Data Base Updated # mv careq.pem certs/00.pem # openssl ca -config openssl.cnf -gencrl -out crl.pem
これで準備完了です。
説明 | ファイル名 |
---|---|
CA 証明書 | cacert.pem, newcerts/00.pem |
CA 秘密鍵 | private/cakey.pem |
CA 証明書発行要求 | certs/00.pem |
ではさっそく、サーバ証明書を作ってみます。https://www.example.jp/ 用の証明書の発行例です。
# cd /etc/pki/exampleCA # ./CA -newreq Generating a 1024 bit RSA private key .........++++++ ...........................++++++ writing new private key to 'newreq.pem' Enter PEM pass phrase:パスフレーズを入力 Verifying - Enter PEM pass phrase:パスフレーズを入力 ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [JP]: State or Province Name (full name) [Tokyo]: Locality Name (eg, city) [Toshima-ku]: Organization Name (eg, company) [Example Corp.]: Organizational Unit Name (eg, section) []: Common Name (eg, YOUR name) []:www.example.jp Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Request is in newreq.pem, private key is in newkey.pem # ./CA -sign Using configuration from /etc/pki/exampleCA/openssl.cnf Enter pass phrase for /etc/pki/exampleCA/private/cakey.pem:CAパスフレーズを入力 Check that the request matches the signature Signature ok Certificate Details: Serial Number: 3 (0x3) (中略) Certificate is to be certified until Sep 30 07:12:47 2005 GMT (365 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated Certificate: Data: Version: 3 (0x2) (中略) Signed certificate is in newcert.pem # ls newcerts 01.pem 02.pem 03.pem (←一番大きな値のファイルを探す) # mv newreq.pem certs/03.pem (←探したファイル名を入れる) # mv newkey.pem private/03.pem (←探したファイル名を入れる) # rm newcert.pem # openssl x509 -in newcerts/03.pem -out www.crt # openssl rsa -in private/03.pem -out www.key Enter pass phrase for private/03.pem:パスフレーズを入力
これで、www.example.jp の SSL サーバ証明書ができました。
mod_ssl ディレクティブ | ファイル |
---|---|
SSLCertificateFile | www.crt |
SSLCertificateKeyFile | www.key |
このまま https://www.example.jp/ へアクセスしても、証明書エラーになってしまいます。
今回構築したルート CA を信頼すると、その CA が署名した www.example.jp も正しい証明書と認識するようになります。
Internet Explorer へ登録する方法を紹介します。Mozilla Firefox 等の場合は、それぞれのソフトウェア内で証明書を登録してください。
信頼されたルート証明機関
これでめでたく、https://www.example.jp/ を警告なしに表示することができます。
オレオレ認証局が力を発揮するのは、HTTPS だけではありません。私のところでは下記の用途で使っています。
SSL あるところ、ほとんどのところで活躍できます。
ウェブテクノロジ開発部の山崎です。こんにちは。
今回は、スマートフォンアプリ(アンドロイド(Android)アプリ)と、iOSアプリ(iPhoneアプリ/iPadアプリ)で綺麗な画像を軽く扱いたい開発者の方のために、解決策をご紹介いたします。
※ 本エントリーはブログ掲載時点の情報をまとめたものです。将来的に仕様が変更になる可能性もあるのであらかじめご了承ください。
さて、スマートフォンアプリでは、アプリケーションのファイルサイズに制限があります。「Android Market」ではアップロード可能なアプリの上限サイズが「50MBまで」と制限されていますし、
Android Market では50MBまで
「App Store」では3G回線経由にてダウンロード可能なアプリの上限サイズは「20MBまで」と制限されています。
AppStoreでは20MBまで
ちなみに、iOSでは、WiFi経由でダウンロード可能なアプリの上限サイズは2GBとのことです。
また、それぞれの端末のメモリストレージの量も現段階では「PCのように豊富にある」「湯水のように使える」とは言えない状況です。「Android Market」や「App Store」の制限もさることながら、アプリケーションは少しでも軽いほうがユーザーに喜ばれるのは確かです。
努力してソースコードを短くしてもアプリケーションのサイズが劇的に小さくなることはほとんど無いと言えるでしょう。
アプリケーションの中で大きくサイズを使っているのは「画像データ」なのです。
スマートフォンの画面の解像度は、昔のPCに匹敵するほど大きく(広く)なっています。最近は、WVGA:800×480以上の端末が増えています。この大きさの画像データを複数枚持つだけでアプリの容量はどんどん増えていきます。
画像の数を減らすことなく、アプリの容量を抑えようとして画像データを必要以上に圧縮すると画像内にモスキートノイズが増えてしまい、スマートフォンのキレイで広い画面のメリットを損なう結果になってしまいます。
写真の画像はJPEG形式が最適です。キレイに小さく圧縮できます。しかし、図表やイラストの画像はJPEG形式で圧縮(保存)するとモスキートノイズだらけのひどい結果になります。
図表の画像を使う場合はPNG形式で圧縮(保存)してください。圧縮には減色で対応するとキレイな画像のまま軽くすることができます。
写真と図表が混在している画像は、JPEG形式?PNG形式?どちらで保存すればキレイなまま軽くできるでしょうか。
手間を惜しまないのであれば、写真の画像と図表の画像を分離するとよいでしょう。
次の図のように、写真の部分を切り出してJPEG形式で保存し、図表や文字の部分はPNG形式で保存します。そして、表示するときに1つの画像に見えるようにくっつけるわけです。
特にモスキートノイズの入りやすい文字周りはPNG形式で保存するとJPEG形式と同じバイトサイズにまで圧縮しても表示がクッキリとキレイになります。
しかし、この作業。技術や理論が理解できても実際にやってみるととても大変です。
特に、画像の枚数が多かったり、何度も改修がかかるような画像に対してこの作業を手でやるのは・・・コスト的にも品質的にも問題があります。
この作業を確実に全自動で計算&分割&保存してしまうのが「ハイブリッドフォーマット」で画像を保存できる「OPTPiX imesta 7 for Mobile & Social」です。
詳しくは「電子書籍・雑誌やコミックをキレイに!軽く!ハイブリッド画像作成ツール – OPTPiX imesta 7 for Mobile & Social」のページをご覧ください。
「・・・で、そのハイブリッド画像をアプリで表示するには、どうしたらいいの?」
アプリとして動作実績のあるアンドロイド(Android)アプリのサンプルソースコードと、iOSアプリ(iPhoneアプリ/iPadアプリ)のサンプルソースコードともにご用意しています。
「サンプルソースコードを参考にしたい」開発者の方はお問い合わせフォームからお問い合わせください。
SpriteStudio担当の三輪です。
今回取り上げますのは、SpriteStudio本体の話題・・・ではなく、連携情報についてのお話しです。
現在弊社では、ゲームエンジンの「Unity3D」で「SpriteStudio」の2Dアニメーションデータを再生・制御する「SpriteStudioPlayer for Unity3D」という連携アセットを開発中です。
この連携アセットは、CEDEC2011 や ゲームツール&ミドルウェアセミナー in 福岡で紹介をさせていただきましたが、ここへきてようやく機能の詳細をご紹介できるようになってまいりました。
早速ですが、「SpriteStudioPlayer for Unity3D」を使うと、Unity3Dでどういったことが表現できるようになるのか、紹介をしている動画をご用意しました。
Unity3Dと言えば、2011年のゲーム業界の話題を総ざらいしていった感もあるゲームエンジン。なのですが、Unity3Dは3D表現が得意なゲームエンジンなので、2Dの複雑なキャラクタアニメーションやユーザーインターフェース演出といったものを作るのにはあまりお手軽とは言えません。
そこで、弊社のSpriteStudioのXML形式アニメーションデータをUnity3Dで取り込んで、アニメーションの再生・制御まで面倒を見てしまおうと開発されたのが「SpriteStudioPlayer for Unity3D」です
SpriteStudioの機能の大きな特徴に、キーフレームアニメーションが挙げられます。パタパタアニメのコマアニメーションでは、アニメーションパターンを作るには毎コマ違った絵を描き込んでいかなければいけませんでした。
キーフレームアニメーションでは、表示させたいパーツを作成し、それに動きを付けることによってアニメーションが表現できます。
▲SpriteStudioでのキーフレーム編集
また、SpriteStudioでは親子関係を設定してパーツ管理をすることができます。親パーツの動きを子パーツが継承して動作することができますので、多関節のアニメーションを表現することができます。
▲SpriteStudioでの親子構造
これらを組み合わせてできたものが、動画中の女の子キャラクタになります。
▲キーフレームアニメーション例
この女の子キャラクタ、アニメーションはそれぞれ別に作られているのですが、パーツとして参照している画像素材は共通になっています。SpriteStudioでは、画像とアニメーションデータは別々で管理する構造になっていますので、こうした画像素材の使いまわし共通使用が可能になっています。この仕組みはSpriteStudioPlayer for Unity3Dでも取り入れられています。
SpriteStudioPlayer for Unity3D で表現できるのはキャラクタアニメーションだけではなく、ユーザーインターフェース(UI)やHUD表示の素材、エフェクトなどにも使用できます。
▲ボタン素材としての使用例
こうしたボタン絵の演出なども後述のゲームスクリプトと組み合わせることで、表現することができます。Unity3Dの3Dオブジェクトとの同時表示もちゃんと対応しています。
▲2Dアニメーションデータと3Dオブジェクトの同時表示
SpriteStudioPlayer for Unity3D を使ってUntiy3Dに取り込んだアニメーションデータは、ゲームシーン内ではゲームオブジェクトの一つとして管理をします。ゲームオブジェクト自体はUnity3Dの管理単位ですが、SpriteStudioPlayer for Unity3D の機能がアタッチされていると、独自のステータスを設定することができます。このステータスをUnity3DのInspectorを使って編集することができます。
▲Unity3DのInspector
特に値を設定しなくてもアニメーションの再生表示はできますが、細かな設定をすることで色々な演出をすることができます。
Inspectorには選択しているゲームオブジェクトの情報が表示され、
などの設定ができます。
ゲーム中ではユーザーの入力やプログラムの処理に合わせてアニメーションの表示を制御する必要が出てきます。スライド操作でキャラクタを走らせたり、タッチ操作で攻撃を繰り出したり、ボタンを押したり・・・。
▲ゲーム画面のイメージ
Unity3DのゲームスクリプトからSpriteStudioのアニメーションデータの制御ができます。
操作できるのは主にInspectorに表示されている項目で、各ステータスの変更のほか、アニメーションデータの切り替えや再生停止などができます。
また、アニメーションデータ中にユーザーデータが埋め込まれている場合に、アニメーション再生中にそのデータが検出されたらトリガを発行するとか、ゲームオブジェクトのバウンディングボックスを当たり判定に使用するとか・・・。
紹介動画の中で女の子が棒を振るアニメーションがありますが、この振る動作の途中に「当たり判定開始」「当たり判定終了」というような情報を埋め込んでおり、判定をするタイミングをアニメーションデータから引用しています。
他にもゲーム内で使用するであろう色々な処理を機能として追加していく予定です。
「SpriteStudioPlayer for Unity3D」のもろもろについては、こちらでも紹介をしております。iPhoneやAndroid向けのパブリッシュでも使えますので、このアセットを使うことで2Dのゲームがたくさん出てくるといいなと思いながら、正式公開に向けて開発進行中でございます。逐次情報公開も進めてまいりますので、今後もぜひご注目ください。
ウェブテクノロジ開発部の遠藤です。
先日、Unityを用いたiPhone(以下、iOS)アプリの開発環境を構築する機会がありまして、その過程でちょっとしたトラブルが起こりました。
その問題とは、1つのライセンスを用いて複数のMacでiOSアプリの開発環境を構築する際に発生するものです。
今回の記事では、この問題の解決方法についてご紹介したいと思います。
iOSアプリのビルド環境を構築し、iOS実機上で動作検証するにはMacにXcodeをインストールしたあとに、証明書のインストールや認証などいくつかのステップが必要になります。
これらのステップに関する情報は既にネット上で簡単に見つけることができますのでここでは割愛します。
さて、一通りセットアップを終えたところで、いざビルドを試みると、
Xcode could not find a valid private key / certificate pair for this profile in your keychain.
というエラーが発生しました。
オーガナイザで見たプロビジョニングのStatusには
Valid signing identity not found
とあります。
上記のエラーについて、ネット上でよく書かれているのが、デフォルトのキーチェーンが「ログイン」になっていないため、というものです。
この点については私の環境では問題ありませんでした。
あれこれ悩んでいたところ、問題は私が利用した証明書が、別のMac上で既に作成済みだったものであり、それをAppleの開発サイト経由でダウンロードして取り込んでいたために秘密鍵が含まれておらず、正しく認証することができなかった、ということのようです。
つまり1つのライセンス(Certificate)を用いて複数台のMacで開発を行う場合は、最初に認証したMac上にある秘密鍵が必要になる、ということでした。
このための手順は、“iPhone 証明書 複数台 Mac” といったキーワードで検索すれば先人の方々のお知恵を拝借できるので、ここも割愛させて頂きます。
そのお知恵を借りて早速「iPhone Developer: 名 姓 (HOGEHOGE)」という秘密鍵を一台目のMacから書き出し、2台目のMacに取り込んで見ましたが…
私の環境ではそれでも足りず…
結果として、
iPhone Developer: 名 姓 (HOGEHOGE) iPhone Distribution: 会社名
という2つの証明書ファイルを書き出して、取り込む必要がありました。
※「iPhone Distribution: 会社名」については個人で開発されている方には必要がないものかもしれません。
[ 正しく動作する証明書の例 ]
証明書に関する問題については以上です。
iOSアプリに関連してUnityプロジェクトに関しても少々触れたいと思います。
近年話題のマルチプラットフォームのゲームエンジンであるUnity 上でアプリを作成し、iOS 向けにパブリッシュする際にも、設定が正しくないと似たようなエラーが発生します。
「Player Settings…」の「Company Name, Product Name, Bundle Identifier」あたりの内容が、iOS の開発者ページで申請したものと合致していないと、Code Sign errorの類のエラーが発生します。
初めて環境を構築される方は、このあたりもチェックされるとよいと思います。