Skip to main content

Ionic コアコンセプト

Ionicアプリ開発を初めて行う人にとっては、プロジェクトの背後にある中核となる哲学、概念、およびツールについて高度な理解を得ることが役立ちます。複雑なトピックに飛び込む前に、Ionic Frameworkの基本とその仕組みについて説明します。

UIコンポーネント

Ionic FrameworkはUIコンポーネントのライブラリです。UIコンポーネントは、アプリケーションの構成要素として機能する再利用可能な要素です。イオンコンポーネントはウェブ標準HTML、CSS、およびJavaScriptを使用します。コンポーネントはあらかじめ構築されていますが、高度にカスタマイズできるようにゼロから設計されているため、アプリは各コンポーネントを独自に作成でき、各アプリに独自のルックアンドフィールを持たせることができます。具体的には、Ionicコンポーネントを簡単にテーマ化して、アプリ全体の外観をグローバルに変更できます。外観のカスタマイズの詳細については、テーマ

プラットフォームの継続性

Platform ContinuityはIonic Frameworkの組み込み機能であり、アプリ開発者は複数のプラットフォームで同じコードベースを使用できます。すべてのIonicコンポーネントは、アプリが実行されているプラ​​ットフォームに外観を適合させます。たとえば、iPhoneやiPadなどのAppleデバイスは、Apple独自のiOSデザイン言語を使用します。同様に、AndroidデバイスはMaterial Designと呼ばれるGoogleのデザイン言語を使用します。

プラットフォーム間で微妙な設計変更を行うことにより、ユーザーは使い慣れたアプリエクスペリエンスを提供されます。AppleのApp StoreからダウンロードしたIonicアプリはiOSテーマを取得し、AndroidのPlay StoreからダウンロードしたIonicアプリはMaterial Designテーマを取得します。ブラウザからプログレッシブWebアプリ(PWA)として表示されるアプリの場合、Ionicはデフォルトでマテリアルデザインテーマを使用します。さらに、特定のシナリオで使用するプラットフォームの決定は完全に構成可能です。プラットフォームの継続性に関する詳細は、テーマ

従来のWebアプリは線形の履歴を使用します。つまり、ユーザーはページに進み、戻るボタンを押して戻ることができます。この例としては、ユーザーがブラウザーの線形履歴スタックを前後に移動するウィキペディア周辺をクリックすることがあります。

対照的に、モバイルアプリは多くの場合、並列の「非線形」ナビゲーションを利用します。たとえば、タブ付きインターフェイスには、タブごとに個別のナビゲーションスタックを設定できます。これにより、ユーザーがタブ間を移動したり切り替えたりするときに場所を失うことがなくなります。

Ionicアプリはこのモバイルナビゲーションアプローチを採用しており、Web開発者が使い慣れたブラウザースタイルのナビゲーション概念を維持しながら、ネスト可能な並列ナビゲーション履歴をサポートしています。

Angularおよび@ionic/angularで構築されたアプリの場合、新しいIonic 4 Angularアプリごとにすぐに使用できるAngular Routerを使用することをお勧めします。Ionicの以前のバージョンには独自のカスタムルーターが付属していましたが、最高のツールと開発者のエクスペリエンスを提供するために、フレームワークの推奨ルーターの使用に移行しました。

ネイティブアクセス

Webテクノロジーで構築されたアプリ(Ionicアプリなど)のすばらしい機能は、デスクトップコンピューター、電話、タブレット、車、冷蔵庫など、ほぼすべてのプラットフォームで実行できることです!Ionicアプリの同じコードベースは、これらのプラットフォーム間で共有されるWeb標準と共通APIに基づいているため、多くのプラットフォームで動作します。

Ionicの最も一般的な使用例の1つは、App StorePlay Storeの両方からダウンロードできるアプリを構築することです。iOSとAndroidの両方のソフトウェア開発キット(SDK)は、「WebビューネイティブSDK に完全にアクセスしながら、Ionicアプリをレンダリングします。

CapacitorCordovaなどのプロジェクトは、IonicアプリがネイティブSDKにアクセスできるようにするためによく使用されます。つまり、開発者は一般的なWeb開発ツールを使用してアプリをすばやく構築でき、デバイスの加速度計、カメラ、GPSなどのネイティブ機能に引き続きアクセスできます。

テーマ

コアでは、Ionic FrameworkはCSSを使用して構築されているため、CSSプロパティ(変数)が提供する柔軟性を活用できます。これにより、Web標準に準拠しながら見栄えの良いアプリを非常に簡単に設計できます。開発者がデフォルトを使用できるように色のセットを提供しますが、それらをオーバーライドして、ブランド、会社、または希望のカラーパレットに一致するデザインを作成することをお勧めします。アプリケーションの背景色からテキストの色まで、すべてが完全にカスタマイズ可能です。アプリのテーマの詳細については、テーマ

Ionic Frameworkとは何ですか?

Ionic Frameworkは、Webテクノロジー(HTML、CSS、およびJavaScript)を使用して、高性能で高品質のモバイルおよびデスクトップアプリを構築するためのオープンソースUIツールキットです。

Ionic Frameworkは、フロントエンドのユーザーエクスペリエンス、またはアプリのUIの操作(コントロール、操作、ジェスチャー、アニメーション)に重点を置いています。学習は簡単で、Angularなどの他のライブラリやフレームワークとうまく統合できます。または、単純なスクリプトインクルードを使用して、フロントエンドフレームワークなしでスタンドアロンで使用できます。

現在、Ionic FrameworkはAngularおよびReactと 公式に統合されて おり、Vueのサポート は開発中です。飛び込む前にIonic Frameworkについて詳しく知りたい場合は、基本を説明するビデオを 作成しました。

目標

クロスプラットフォーム

ネイティブiOS、Android、デスクトップ、プログレッシブWebアプリとしてのWebなど、複数のプラットフォームで動作するアプリをビルドしてデプロイします-すべて1つのコードベースで。一度書くだけで、どこでも実行できます。

Web標準ベース

Ionic Frameworkは信頼性の高い上に構築されており、 標準化されたWebテクノロジー:HTML、CSS、およびJavaScript。カスタム要素やシャドウDOMなどの最新のWeb APIを使用します。このため、Ionicコンポーネントには安定したAPIがあり、単一のプラットフォームベンダーの気まぐれではありません。

美しいデザイン

クリーンでシンプル、機能的。Ionic Frameworkは、すべてのプラットフォームですぐに動作して表示できるように設計されています。事前に設計されたコンポーネント、タイポグラフィ、インタラクティブなパラダイム、豪華な(まだ拡張可能な)基本テーマから始めます。

シンプルさ

Ionic Frameworkは、シンプルさを念頭に置いて構築されているため、Ionicアプリの作成は楽しく、学びやすく、Web開発スキルのある人なら誰でもアクセスできます。

ライセンス

Ionic Frameworkは無料のオープンソースプロジェクトであり、許可されているMITライセンスの下でリリースされています。これは、個人または商業プロジェクトで無料で使用できることを意味します。MITは、jQueryやRuby on Railsなどの一般的なプロジェクトで使用されているライセンスと同じです。

このドキュメントコンテンツ(ionic-docsリポジトリにあります)は、Apache 2ライセンスの下でライセンスされています。

イオンCLI

公式 イオンCLI、またはコマンドラインインターフェイスは、Ionicアプリの足場をすばやく構築し、Ionic開発者に役立つコマンドを多数提供するツールです。Ionicのインストールと更新に加えて、CLIには組み込みの開発サーバー、ビルドおよびデバッグツールなどが付属しています。あなたがいる場合にはイオン性Appflowのメンバー、CLIを構築し、展開雲を行い、アカウントを管理するために使用することができます。

フレームワークの互換性

Ionicの過去のリリースはAngularと緊密に結合されていましたが、フレームワークのV4は、Angularなどの最新のJavaScriptフレームワークの統合により、スタンドアロンWebコンポーネントライブラリとして機能するように再設計されました。Ionicは、ReactやVueを含むほとんどのフロントエンドフレームワークで使用できますが、一部のフレームワークではWebコンポーネントを完全にサポートするためにshimが必要です。

JavaScript

Ionic 4の主な目標の1つは、コンポーネントをホストするための単一のフレームワークに関する厳しい要件を削除することでした。これは、Webページ内のスクリプトタグだけでコアコンポーネントがスタンドアロンで動作できることを意味します。フレームワークでの作業は、大規模なチームや大規模なアプリには適していますが、WordPressのようなコンテキストでも、Ionicを単一ページのスタンドアロンライブラリとして使用できるようになりました。

角度

角度は常にIonicの素晴らしさの中心にあります。コアコンポーネントはスタンドアロンWebコンポーネントライブラリとして機能するように記述されてい@ionic/angularますが、このパッケージにより、Angularエコシステムとの統合が簡単になります。@ionic/angularAngular開発者がIonic 2/3から来ることを期待するすべての機能を含み、AngularルーターなどのコアAngularライブラリと統合します。

反応する

Ionicは現在、人気のあるReactライブラリを公式にサポートしています。Ionic Reactを使用すると、React開発者は既存のWebスキルを使用して、iOS、Android、Web、およびデスクトップをターゲットとするアプリを構築できます。では@ionic/react、あなたはすべてのコアイオンのコンポーネントを使用しますが、ネイティブを使用したような感じがコンポーネントに反応する方法ですることができます。

今後のサポート

他のフレームワークのサポートは、将来のリリースで予定されています。現在、Vueの公式バインディングが開発されていますが、これらのフレームワークでは一部のコンポーネントがそのまま使用できます。

Ionic Framework V4 +

Ionic Framework V4は、パフォーマンス、互換性、および全体的な拡張性に重点を置いた、プロジェクトの基盤となるテクノロジと機能の大きな進歩です。V4は@ionic/angularパッケージを通じてAngularと密接に統合されていますが、フレームワークに依存しないため、他のJavaScriptフレームワーク(Vue、React、Preactなど)で動作するか、フレームワークをまったく使用しません。

V4では、Web標準に移行することで、Ionicのコアが、フレームワーク固有のモデルではなく、最新のブラウザーでサポートされている標準コンポーネントモデルに依存できるようになりました。これにより、ロード時間が短縮され、パフォーマンスが向上し、全体的なコードが少なくなります。

イオンAppflow

ライフサイクル全体でIonicアプリを管理できるように、オープンソースフレームワークとは別のIonic Appflowと呼ばれる本番アプリ用の商用アプリプラットフォームも提供しています

Ionic Appflowは、開発者とチームがネイティブアプリビルドをコンパイルし、集中型ダッシュボードからIonicアプリにライブコード更新を展開するのに役立ちます。オプションの有料アップグレードは、ワークフローの自動化、シングルサインオン(SSO)、接続されたサービスおよび統合へのアクセスなどのより高度な機能に利用できます。

AppflowにはIonicアカウントが必要で、その機能のいくつかを試してみたい人には無料の「スターター」プランが付属しています。

生態系

Ionic Frameworkは、コアチームによってフルタイムで積極的に開発および維持され、そのエコシステムは、その成長と採用を促進する開発者と貢献者の国際コミュニティによって導かれます。小規模および大規模の開発者および企業は、Ionicを使用して、あらゆる場所で実行される驚くべきアプリを構築および出荷しています。

コミュニティに参加する

世界中の200か国以上に数百万人のIonic開発者がいます。参加する方法は次のとおりです。

  • フォーラム:質問をしたり、アイデアを共有したりするのに最適な場所です。
  • Slack:開発者がリアルタイムで会ってチャットできる活気のある場所。
  • Twitter:更新を投稿し、Ionicコミュニティからのコンテンツを共有します。
  • GitHub:バグの報告や新機能のリクエストについては、ここで問題を作成してください。PRを歓迎します!
  • コンテンツのオーサリング:技術的なブログを作成するか、ストーリーをIonicコミュニティと共有します。

chinachuとRaspberry Pi 3+で地デジTVサーバーの構築

TV サーバーが必要な理由

日本は地デジテレビのチャンネルが多様で、画質もいいです。韓国では、ケーブルや光テレビがほとんどの割合を占めているので違いがあります。

地デジ、BS衛星、CS衛星で大きく三つに分けられていて、有線テレビと光テレビの割合は低い方だと知れれています。

だから、話題の新作アニメは各地の地デジチャンネルの確保に気を付けているんでしょう。

見るためには夜更かしが必要

しかし、韓国でも紹介される日本の新作アニメ番組は後で分かったのですが、ずいぶん遅い時間に放送していることでした。

つまり、昼間と夕方にはオタクっぽいものはできませんということです。

ゴールデンタイムの番組はニュース、エンタテインメント、ショッピングぐらいですね。

番組表を見ると新作アニメは一回放送のみで、新作の再放送は見たことがありません。

日本人の間では、テレビやブルーレイプレイヤーを使って予約録画をしていると聞いたことがあります。

普通の録画機能には制限がある

だとすると、その録画さえできればオッケーですが、それには制限があります。

それはファイルの伝送の自由を縛ることです。一緒のテレビでないと観られないように仕掛けられています。

TS抜きと呼ばれている、MPEGデータのみを抽出できれば、パソコンでは自分の好きなプレイヤーで、携帯ではエンコーディングして見たり、最新スマホではアプリだけで視聴ができるようになります。

どこでもオンエアー

Chinachuサーバーはウェブのサービスを提供しているため、交換するクライアントやブラウザーで接続して視聴できます。

チューナー一つに同時にチャンネル一つだけの受信ができるため、独占関係に注意が必要です。詳しくは後述します。

違法行為に注意

アニメの番組の始まりに現れるインターネット無断転送に関する警告をお目にしたなら、こうして録画したものを配信してはいけないことがわかります。

普通のPCではダメですか?

実は、私たちがこれから使うソフトウェアはオープンソースでリナックス系で問題なく起動します。つまり、皆様のパソコンでもできます。

しかし、次のような理由で別のデバイスをお勧めします。

  • 電源をつけっぱなしのまま予約録画に使うには電気代が気になります。
  • ウィンドウズのユーザーはマルチブートが必要になり、面倒です。
    • Windows 10のWSL BashでUbuntuの起動もできますが、USBデバイスとの通信ができないため、チューナーとカードの認識ができません。
    • Opera Virtual PCの無料バージョンにプラスパックをインストールすることでUSBの認識ができますが、リブートの時にやり直す必要と、ランダムでつながらない時もあるので、使えないくらいです。

お揃いもの

PCの役割:Raspberry Pi 3+ Model B

ラズベリーパイの起動にはSDカードの用意も忘れてはいけません。

すべてがそろっているスターターパッケージの比較で便利に用意できます。

ただ、OSは自分でインストールが必要になります。

USB地デジTVチューナー

PX-S1UDというデバイスは値段も抑えられるし、リナックスのドライバーもあるので、よく使われているようです。

幅広く使われるものが信用もできるでしょう。

アンテナの接続も忘れないでしておきます。

ICカードリーダー

SCR3310

ICカードリーダーは下のB-CASカードを読み込めるツールです。

B-CASカード

B-CASカードはスクランブル(暗号化)されている日本の番組シグナルを解釈するため必須のものです。

手にするにはハードルが高いです。元々、チューナーと一緒に手に入れるのが普通ですが、最近はないときもあり、何の理由もなく抜かれたりもします。

放送協会に頼むと3千円ほどかかります。

アマゾンで中古で500円で買うのが一番かと思います。

赤色と青色に分けられます。

  • 赤:多機能。衛星放送にも対応しています。
  • 青:地デジのみ対応しています。

500GB以上級のハードディスク

録画したTSファイルは圧縮されていない、リアルタイムのコンテンツのほぼそのまま入っています。ビットレートと呼ばれている秒単位で容量が積み重なります。

FullHD 1080pの受信におよそ15Mbps1なので、6ギガバイトするのは普通です。

十分な容量を用意して、時々エンコーディングで動画のサイズを圧縮するとさらに多く収納できます。

スタート

Raspberry OS インストール

NOOBS OS インストールで十分です。詳しくはリンクでどうぞ。

Piでネットにつながることを確認して、SSHか画面のBashコンソールから始めます。

事前準備

では、上のUSBデバイスは全部、ラズベリーパイに繋げます。

下のボックスの内容はbashにタイプするコマンドです。

필요한 것들
sudo apt-get install -y nano samba ntp wget curl git make cmake zip
sudo apt-get install -y pcscd libpcsclite1 libpcsclite-dev libccid pcsc-tools
sudo apt-get install -y autoconf build-essential git-core libssl-dev libtool libboost-all-dev pkg-config yasm pkg-config

インストール

PX-S1UD_driver_Ver.1.0.1.zipのバックアップ

チューナードライバーインストール
mkdir ~/PX-S1UD
cd ~/PX-S1UD
wget http://plex-net.co.jp/plex/px-s1ud/PX-S1UD_driver_Ver.1.0.1.zip
unzip PX-S1UD_driver_Ver.1.0.1.zip
sudo cp PX-S1UD_driver_Ver.1.0.1/x64/amd64/isdbt_rio.inp /lib/firmware/
カードリーダー
sudo pcsc_scan

ここでJapanese Chijou Digital B-CAS Cardという文句を確認します。

c44e16dbb0e2.zipのバックアップ

arib25ライブラリー
sudo su –
mkdir ~/tmp
cd ~/tmp
wget http://hg.honeyplanet.jp/pt1/archive/c44e16dbb0e2.zip
unzip c44e16dbb0e2.zip
cd pt1-c44e16dbb0e2/arib25
make clean && make
make install

arib25はB-CASのカード標準を読み取れるライブラリーに推測されます。

recdvb-1.3.1.tgzのバックアップ

recdvb
cd ~/
mkdir ~/recdvb
cd ~/recdvb
wget http://www13.plala.or.jp/sat/recdvb/recdvb-1.3.1.tgz
tar xvzf recdvb-1.3.1.tgz
cd recdvb-1.3.1
./autogen.sh
./configure –enable-b25
make
make install
chinachuインストールのためのnpm n構築
apt-get install -y nodejs npm
npm cache clean
npm install n -g
n 6.10.3  n 8.x
apt-get purge -y nodejs npm
apt-get -y autoremove

現在はchinachuのバージョンアップにより、npm 8バージョンが必要です。エラーを見てバージョンの範囲に合わせましょう。

nodeのバージョン確認
node -v

バージョンの表示が無事にできたら成功です。

Mirakurunのインストール

Mirakurunはメーカーのドライバによりチューナーをコントロールするソフトです。

mirakurunインストール
sudo npm install pm2 -g
sudo npm install mirakurun -g –unsafe –production
sudo npm install rivarun -g
sudo npm install arib-b25-stream-test -g –unsafe
mirakurun動作確認
ps ax | grep Mirakurun

数字でPIDが表示出来たらオッケーです。

Tuner設定
sudo nano /usr/local/etc/mirakurun/tuners.yml

このファイルの中身に次の内容を貼ります。

tuners.yml
– name: PX-S1UD-1
types:
– GR
command: recdvb –b25 –dev 0 – –

– name: PX-S1UD-2
types:
– GR
command: recdvb –b25 –dev 1 – –

持っているチューナーが一つでも両方入れてこそ成功しました。

チャンネル設定

チャンネルのマニュアル設定がしたい方は次のファイルを編集しましょう。

Channelのマニュアル設定
sudo nano /usr/local/etc/mirakurun/channels.yml

しかし、何のチャンネルが見れるかさえわからないため、これからは自動設定を始めます。アンテナが正常につながっていて、チューナーの認識もできえている状態をまず確認しておきましょう。次のコマンドを入れて、チャンネルが見つかったのかすぐ命令の結果で現れるため、ただ見てみるだけで充分です。もし、一つのチャンネルも取れず、エラーが続いているなら、リブート後チューナーの接続を再度行ってください。

Channelのオート設定
curl -X PUT http://localhost:40772/api/config/channels/scan”

40772ポートによりMirakurunサーバーに繋げます。失敗したら、Mirakurunの再度インストールを行ってください。npmを使ってため、nodeの設定に間違いがあったら、インストールできません。

Mirakurunのリスタート
mirakurun restart

すべての変更事項の繁栄のため、リブートします。

EPGの受信に10分ほど待った後、

EPG受信確認
rivarun –list | sed ‘s/},/},\n/g’

これを入力して、EPGの内容が正しく受け取れるのか確認します。

ログのローテーション設定
sudo pm2 install pm2-logrotate
sudo nano /etc/logrotate.d/mirakurun
mirakurunのファイル
/usr/local/var/log/mirakurun.stdout.log
/usr/local/var/log/mirakurun.stderr.log
/{
daily
compress
rotate 7
missingok
notifempty
}

Chinachuインストール

Chinachuは録画のスケジュール管理、リアルタイムストリーミングができるPVRマネージャーです。

Chinachu 설치
adduser chinachu
su – chinachu
git clone git://github.com/kanreisa/Chinachu.git ~/chinachu
cd /home/chinachu/chinachu
./chinachu installer

ここでインストールの方法を聞いていますが、1をタイプいて進みます。

時間がかかるので、当分待ちます。

環境設定

録画設定ファイルの初期化と環境設定の入力
echo “[]” > rules.json
cp config.sample.json config.json
nano config.json
config.jsonでKeyに合わせてValueの修正が必要な個所 (一部)
“uid”: “chinachu”,
“recordedDir” : “./recorded/”,
“wuiOpenPort”: 10772,

uidには私たちが只今作ったアカウントの名前を入れて(ここではchinachu), recordedDirは録画したファイルがセーブされるディレクトリです。所有者の権限とハードドライブマウント機能に気を付けます。

ポートはウェブから接続可能なところを設定し、別途の認証機能がないため、外部からの接続に気を付けます。

chinachuのログローテーション

chinachuのログローテーション
exit
nano /etc/logrotate.d/chinachu
chinachu
/usr/local/var/log/chinachu-operator.stderr.log
/usr/local/var/log/chinachu-operator.stdout.log
/usr/local/var/log/chinachu-wui.stderr.log
/usr/local/var/log/chinachu-wui.stdout.log
{
weekly
compress
rotate 4
missingok
notifempty
}

動作確認

確認後最後の段階でエラーが発生しなかったらCtrl+C
su – chinachu
cd ~/chinachu
./chinachu service wui execute
デーモン設定確認
exit
cd /home/chinachu/chinachu
pm2 start processes.json

プロセスの起動後10秒くらい待った後、次のコマンドを入力します。

ステータスの表示後onlineの文句確認
pm2 status
現在設定セーブ
pm2 save

今後config.jsonの修正があったときの仕事

設定を読み込むためのchinachuの再起動方法
pm2 restart chinachu-wui chinachu-operator
ログファイルの位置
/usr/local/var/log/chinachu-operator.stderr.log
/usr/local/var/log/chinachu-operator.stdout.log
/usr/local/var/log/chinachu-wui.stderr.log
/usr/local/var/log/chinachu-wui.stdout.log
EPGのマニュアル更新
su – chinachu
cd ~/chinachu
./chinachu update
ブラウザで接続するアドレス
http://(ラズベリーパイのIPアドレス):10772/

接続してみると、ブラウザにchinachuの画面が見えます。

Asus Zenfone 5z アンボクシング

ASUSがスマホを作っている

そういうことは日本人なら、MVNO格安SIM UNLOCKに興味がある方なら、誰でも分けっていると思います。Asusから作り出したスマホを手にした人も少なくないでしょう。

一方、過去のASUSスマホをご存知でしょうか。つまり、Asus Zenfone 5のことです。

そのときのレビューをどこかに書き込んだりはしませんでしたが、今になって写真を見ているとまさに四角い奇妙なデザインを持っていますね。

画面の裏の部分を開けますが、バッテリーの交換は普通にできないようになっています。

また、初めからDual Sim型のみを販売しています。当時は3G対応一つ、2G(GSM)対応をそれぞれ用意していて、実際に日本でDual Simとして使うことはできませんでした。日本での2G技術が他の国と違っていたからですね。3GのDual待機ができたなら、もっと愛されたかも知れません。

2014年の当時はなかなか良い方だったものの、LTEの時代になり、GSMも二世代も古い技術になった今、サービスも中断になる国も増えているし、変化が必要だったと思います。

そういう短所に触れてから、Dual SIMに対する自分も期待もかなり裏切られたとも言えるでしょう。

LG Optimus LTE, Galaxy S3, ASUS Zenfone 5 (2014) ベンチマーク

Intel Atom Z2580チップセットを使っていますが、x86命令セットにarmのエミュレーターが実装されているそうです。

それにもかかわらず、一部のゲームは交換性に問題がありました。曖昧な性能に、曖昧なバッテリー、少なくない発熱が印象的な経験でした。なぜ自分勝手に熱く燃えてきたのか、今もわかりません。(そういう伝統はLG V20が相次いでいたような…)

細かく言うと5GHz WiFiもサポートされてませんでしたね。

ASUS Zenfone 5の4年後のスマホがASUS Zenfone 5だと?

私が買った機種は正確には末にZが付いていますが、メインラインであるSnapdragon 660を搭載したものはZenfone 5なので、全く変わりがありません。

これは「どうしてこうなった」と言えるところでしょう。

したがって、今もググるとAsus Zenfone 5 (2014)とAsus Zenfone 5 (2018)に分けられます。

名前は同じですが、ほとんどすべてが変わりました。

遠い香港からの輸入を示すような重装備のパッケージから取り出した製品のパッケージは長くて細い形をしています。

上にパッケージのカバーを取り出すと写真が好きだというASUSの主張が書いていますね。

기본으로 ジェリーケース(透明)が付いています。中国のスマホではありませんが、こちらにはこういうサービスが普通らしいですね。

台湾の会社も同じだったんでしょうか。

SIMトレイのクリップも個性的だと思います。

無くさないようにしまっておきます。

シリコンケースと保証書類を取り出すと、プラスチックカーバーの中の本体が姿を現します。

縦に長いスマホがあまり透明ではない袋の中にあります。電源ボタンがどこなのか、アイコンのハイライトが見えます。

当然ながら、本体には書いていません。

パッケージの下の部分にはフリーボルト0.5Aインプットの充電器(アウトプット5V/2A+9V/2A)、データーケーブル、イヤホンがあります。

後ろは何か輝いています。グラスで包んでいるのか、金属の感触は全くなく、指紋は触ったとたん跡がついてしまいます。

ケースがなければ、後でべたべたになるので、こういった素材を避ける方もいらっしゃるかと思います。

真ん中のLGスマホのような指紋認識デバイスが見えます。人差し指が最適です。

違いがあるとしたら、電源ボタンなどの役割がない、固定された部分ということです。

ボタンの形をしているのに、ボタンではありません。

上部には特に何もありません。穴がありますが、これはマイクでしょう。左側にも特に何もありません。マイクのように見える穴がもう一つあります。

SIMカードを入れられるトレイとピン穴があります。ハイブリッドDualSIMなので、MicroSDと一緒にSIM2を使えません。しかし、こういったDualSIMとMicroSD両方を使いたい方なら、あるアイテムを使うと簡単にできるので、是非参考してください。下部は左からイヤホン端子、USB C-Type ポート、右にモノスピーカーがあります。

しかし、普段からステレオで聞けます。受信部のスピーカーも機能しているからです。スピーカーの特徴が違うので、音の調和がいいとは言えませんが、音域が違うから、カバーできる音の幅が広くなるというメリットはあるでしょう。右側には上からボリューム、電源ボタンが間を持って配置されています。

昔も今も、ASUSというロゴデザインは重みがあるのでは、と思います。Powered by Androidという文字の直後に見えます。ブートスピードはあまり遅くない方です。

ASUSはハイバネーションと近い技術のラム保存ブートを昔から導入したと知られています。今回もそうか確かではありませんが。

Android Oreo 8.1 バージョンがオリジナルデザインはあまり分かっておりませんが、修正が多くない方だと思います。シンプルで綺麗なUIを誇っていると思います。韓国語で設定しましたが、日本語も対応してます。日本でもMVNO格安プロバイダーでは、一や二を争っているお勧めのAndroidスマホで売られていますね。

韓国ではなぜ売られていないか、聞いてみたいほどのローカライズのいいスマホです。

これは韓国語の画面で、通話記録という表現に誤字があるところです。文法も不自然なところがありますね。

すでに使っていた携帯からデータのマイグレーションを簡単にWi-Fiダイレクトで済ませます。

ただ、Googleのリカバリーをしているなら、アプリを同時にインストールしようとするときがあります。その時に、エラーで中断になりますので、ASUSのアプリを後に使うということもありですね。

初期画面やほかのレビューは続編で続きます。

ゲーム機としての活躍も今後期待できそうです。

[翻訳] 1. 証明書の透明性(Certificate Transparency) 概要

証明書の透明性 概要

グーグルの証明書の透明性プロジェクトはすべてのHTTPSコネクションに使われるSSL証明書システムの欠陥を修正します。この欠陥はインターネットコネクションの暗号化コネクションの効用性と信頼性を脆弱にし、ドメイン認証、両側の暗号化、そして証明書を通じて生じられた信頼チェーンを含むTLS/SSL構図の深刻な損傷をもたらすこともあります。これを放置すると、この欠陥がウェブサイトなりすまし、サーバー偽装、中間者攻撃など広範囲なセキュリティー攻撃を容易にします。

証明書の透明性はSSL証明書をほぼリアルタイムに近くモニターし、監査できるオープンフレームワークを提供することで、このような欠陥を除くに役立ちます。特に、証明書透明性はSSL証明書が証明書認証が間違った場合、他のところでむやみに証明書の認証をもらったかを確認できるようにします。証明書の認証が悪意を持っているユーザーに乗っ取られて間違った認証を受けたかも確認できるようにします。

公開されいるオープンフレームワークなので、誰でも証明書の透明性を確かめる核心コンポーネントのビルドやアクセスができます。これは特に、ドメインの所有者、証明書の認証者、そしてブラウザの製造者など、SSL認証システムの無欠と好調を維持して、インターネットを構成するインターネットのセキュリティー関係者に特に役立つものです。

証明書の透明性を深く調べるには、導入ドキュメントをご覧ください。すでに証明書の透明性について、基本概念に馴染んでいる方は、詳細実装のための詳しいデザイン文書をご覧ください。証明書の透明性のフレームワークを起動する核心コンポーネントをビルドする方法についてオープンソースプロジェクトもあります。

証明書の透明性とは?

現代の暗号化技術のおかげで、ブラウザは常に偽装、偽物のSSL証明書が提供される怪しいウェブサイトの見分けができます。しかし、現在の暗号化技術は間違って発行された証明書と、危うくなったか、悪意を持っている集団に乗っ取られた証明機関(CA)の証明書が提供される怪しいウェブサイトを見分けるほど優れてはいません。この場合、ブラウザは証明書に問題がないと表示して、証明機関が信用できるし、訪問しているウェブサイトのコネクションが安全だという間違った印象を与えます。

ここで問題は、現在は簡単で効果的にSSL証明書をリアルタイムで監査、または監視する技術がなくて、このような(怪しい)誤作動が起きるのであって、疑いのある証明書は普通は検出されなく、証明書の取り消しは数週間後、あるいは数か月後になります。それに、このような種類のSSL誤作動の頻度がさらに増えつつあります。最近の数年間間違って発行になった証明書が適法なサイトとして仮装するに使われ、一部の場合、怪しいソフトをインストールしたり、ユーザーを浸透するにも使われました。

一例として、有名なオランダ証明機関(DigiNotar)が攻撃されて、ハッカーはCAシステムを利用して、偽物のSSL証明書を発行することができました。証明書はイランでGmailとFacebookなどの数多くのサイトを仮装することに活用されて、偽物のサイトの所有者がユーザーに浸透できるようにしました。

여기서 문제는, 현재로선 쉽고 효과적으로 SSL 인증서를 실시간으로 감사하거나 감시할 수 없어서, 이러한 오작동이 일어나게 되는 것이고 (수상한 경우 등), 의심스러운 인증서는 보통 탐지되지 않고 인증 철회는 수 주나 몇 개월 후에나 이뤄진다는 것입니다. 게다가, 이러한 종류의 SSL 오작동의 빈도가 더욱 늘어나고 있습니다. 지난 몇 년간 잘못 발급된 수많은 인증서가 합법적인 사이트를 가장하는데 쓰이고, 일부의 경우에는 수상한 소프트웨어를 설치하거나 무고한 사용자에게 침투하는데도 쓰였습니다.

한 가지 사례로, 저명한 네덜란드 인증 기관(DigiNotar)이 공격받았고, 해커는 CA 시스템을 사용하여 가짜 SSL 인증서를 발급할 수 있었습니다. 인증서는 이란에서 Gmail과 Facebook과 같은 수많은 사이트를 가장하는데 활용되었고, 이는 가짜 사이트 소유자가 무고한 사용자에게 침투할 수 있게 했습니다. 다른 사례는 말레이시아 소속의 인증서 기관(DigiCert Sdn. Bhd.)이 실수로 22개의 취약한 SSL 인증서를 발급하여, 웹 사이트를 가장하고 수상한 소프트웨어를 서명하는데 쓰였습니다. 그 결과, 주요 브라우저는 DigiCert Sdn. Bhd.가 발급한 모든 인증서에 대한 신뢰를 철회하였습니다.1

최근에, 거대한 U.S. 소재 인증 기관 (TrustWave)이 고객의 인증서 하나에 대한 하위 루트 인증서를 발급하여 고객이 내부 네트워크 트래픽을 관찰할 수 있게 했습니다. 하위 루트 인증서는 인터넷의 거의 모든 도메인에 대한 SSL 인증서를 발급할 수 있게 합니다. 비록 Trustwave는 인증서를 철회했고 고객에게 하위 루트 인증서를 더이상 발급하지 않지만, 인증 기관의 잘못에 의해 얼마나 커다란 결과를 낳게 되는지를 보여주는 사례입니다.

많은 경우에 잘못 발급된 인증서는 해커에 의해 심각한 결과를 초래할 수 있는 악의적인 공격을 하는데 사용되었지만, 일이 터진 후 후폭풍도 거대하고 위험합니다.

결국, 네덜란드의 인증 기관 인증서는 인증 철회되고, 인증 기관은 폐쇄되었습니다. 인증 철회 및 폐쇄는 네덜란드 사람들이 인증 기관의 SSL 인증서를 발급받은 정부와 개인 사이트를 접속하지 못하게 되는 여파를 만들었습니다.

사태 해결을 위한 인증서 투명성

인증서 투명성은 SSL 인증서 발급 유무를 도메인 소유자, 인증 기관과 도메인 유저에 의해 정밀하게 조사할 수 있도록 개방할 수 있도록 하여 이들 인증서 기반 위협을 대처하는 걸 목표로 합니다. 특히, 인증서 투명성은 세 가지 주요 목표가 있습니다.

  • SSL 인증서를 도메인 소유자를 드러내지 않고서는 인증 기관이 도메인 SSL 인증서를 발급하지 못하게 하거나, 어렵게 만듭니다.
  • 아무 도메인 소유자나 인증 기관이 인증서가 실수 또는 악의적으로 발급되었는지 여부에 대한 공개 감사 및 감시 시스템을 제공합니다.
  • 사용자가 가능한한 실수 또는 악의적으로 발급된 인증서에 속지 않도록 만듭니다.

인증서 투명성은 TLS/SSL 인증 시스템 감시와 특정 TLS/SSL 인증서 감사를 위한 공개 프레임워크를 만듦으로써 이러한 목표를 만족시킵니다. 이 공개 프레임워크는 아래 세 가지 주요 구성 요소로 구성되어 있습니다.

인증서 로그

인증서 로그는 암호로 보호되며, 공개적으로 감사되며, 인증서에 대한 레코드 추가만 가능한, 단순한 네트워크 서비스입니다. 누구든지 로그에 인증서를 등록할 수 있지만, 인증 기관이 최우선 등록자가 될 것입니다. 비슷하게, 누구든지 로그된 특정 인증서가 잘 로그되고 있는지, 그리고 인증서를 검증하기 위해서 암호 증명에 대한 로그를 조회할 수 있습니다. 로그 서버 개수는 많을 필요가 없고 (이를테면, 전세계에 1000개보다 적습니다), 각각은 인증 기관, 인터넷 제공 업체 또는 어떤 다른 조직에서든지 독립적으로 운영될 수 있습니다.

감시자 (Monitors)

감시자는 주기적으로 모든 로그 서버와 접촉하면서 수상한 인증서에 대한 주시를 공개적으로 실행하는 서버입니다. 예를 들어, 감시자는 인증 기관을 잃었거나 인증되지 않은 인증서가 도메인에게 발급되었는지, 비정상적인 인증서 확장이나 인증 기관이 갖고 있는 인증 권한 같은 이상한 권한을 갖고 있는지 알려줄 수 있습니다.

감시자는 대출이나 신용 카드에 여러분 이름으로 누군가 사용할 때 알려주는 것과 같은 신용 경고 알림과 매우 유사한 방식으로 동작합니다. 일부 감시자는 Google 또는 은행, 정부와 같은 회사와 조직에 의해 운영됩니다. 그 외에도 도메인 소유자나 인증 기관이 구매할 수 있는 구독 서비스를 운영할 것입니다. 기술에 정통한 개인도 스스로 감시자를 운영할 수 있습니다.

감사자 (Auditors)

감사자들은 크게 보아 두 가지 기능을 수행하는 가벼운 소프트웨어 구성 요소입니다. 첫째는 로그가 올바르게 쓰이고 있고 암호화가 유지되고 있는지 검증할 수 있습니다. 로그가 제대로 작성되지 않으면, 로그 스스로 이에 대해 서술해야 하고 그렇지 않으면 종료될 수 있습니다. 둘째로 특정 인증서가 로그에 나타나는지를 검증할 수 있습니다. 이는 감사 기능에서 특히 중요한데, 인증서 투명성 프레임워크는 모든 SSL 인증서가 로그에 등록되어 있을 것을 필요로 하기 때문입니다. 인증서가 로그에 등록되어 있지 않다면, 인증서가 수상하다는 의미이며, TLS 클라이언트는 수상한 인증서에 대한 연결을 거절할 것입니다.

감사자는 브라우저의 TLS 클라이언트, 단독 서비스, 아니면 감시자의 보조 기능으로서 필수 구성 요소가 될 수 있습니다. 누구든지 감사자를 만들 수 있는데, 이는 인증 기관이 모든 인증 기관에 대한 운영 투명도를 높일 수 있는 효과적인 방법이므로 인증 기관이 수많은 감사자를 운영할 것입니다.

아울러서, 이들 구성 요소가 실시간으로 새로운 또는 기존에 존재하는 SSL 인증서를 누구든지 관찰하고 검증할 수 있게 하는 공개 프레임워크를 구성합니다.2

오작동의 감소, 안전한 브라우징

이것이 구현되면, 인증서 투명성은 잘못 발급된 인증서, 악의적으로 취득한 인증서, 공격받은 인증 기관과 같은 인증서 기반 공격의 몇 종류에 대한 대비를 하는데 도움을 줍니다. 이 공격은 도메인 소유자의 금전적 손실 증가, 인증 기관의 신뢰 하락 그리고 인터넷 사용자를 웹 사이트 스푸핑, 서버 위장, 중간자 공격과 같은 광범위 공격으로 노출할 수 있습니다.

인증서 투명성 프레임워크는 공개 조사 제공 및 SSL 인증 시스템 개방을 통해 이들 인증서 기반 위협을 격리시키는 것을 목표로 합니다. 비록 공개 프레임워크가 공개적으로 감시자와 감사자에 의해 구통되지만, 인증성 투명성은 현행 SSL 인증 시스템에 빠져있는 몇몇 이점을 제공합니다.

잘못 발급된 인증서, 수상한 인증서, 공격 받은 인증 기관의 조기 탐지

대부분의 경우, 인증서 투명성 시스템은 수상한 인증서나 인증 기관을 수 일, 수 주, 수 개월을 수 시간으로 단축하여 탐지할 수 있습니다.

수상한 인증서나 인증 기관이 감지되었을 때 빠른 이탈

인증서 투명성이 위험한 인증서와 인증 기관을 다루는 기존의 해결 방식에 의존하긴 하지만(예를 들어 인증서 철회), 단축된 탐지 시간은 위험한 인증서나 인증 기관이 발견되었을 때 전체 해결 과정을 가속할 수 있습니다.

전체 TLS/SSL 시스템에 대한 더 나은 확인

인증서 투명성은 새로 발급되거나 존재하는 TLS/SSL 인증서에 대한 공개 감시 및 검증을 지원하는 공개 프레임워크로 설립되었습니다.  이에 (도메인 소유자, 인증 기관, 사용자 같은) 관심 있는 이들에게 TLS/SSL 시스템의 투명도와 상태를 관찰하고 검증할 수 있는 기회를 제공합니다.

집중 솔루션으로서, 인증서 투명성은 HTTPS 연결을 더욱 신뢰할 수 있고 정보 탈취 및 위장으로부터 안전하게 만듦으로써 인증 기관으로부터 개인 서버까지 확장된 신뢰 체인을 강화합니다. 그러나 그 이상으로, 일반적인 보안 관점에서, 인증서 투명성은 광범위한 인터넷 보안 공격을 방어하고, 모든 사용자가 안전하게 브라우징할 수 있도록 도와줍니다.

다음글: 2. 인증서 투명성 작동 방식

OpenSSLをインストールして、アップデートする方法

OpenSSL を Ubuntu 16.04でインストールして、アップデートする方法

OpenSSLはSSLとTLSプロトコルのオープンソース実装です。OpenSSLをUbuntuデバイスでインストールし、アップデートすることはとても簡単であって、この記事はその点について触れています。

OpenSSLをインストールして、アップデートする

OpenSSLのインストールの前に、現在バージョンのOpenSSLを次のコマンドで調べてみましょう。

$ openssl version
OpenSSL 1.1.0h  27 Mar 2018

その後、OpenSSLの最新バージョンを次のコマンドでダウンロードします。左側のリンクをクリックして、適切なバージョンを選びます。openssl-1.xのフォーマットの中での最新版がお勧めですが、preが付いたのは正式反ではないので、問題発生の恐れがあります。

バージョンが低いのに、継続的に更新されているバージョンもありますが、これはLTSバージョンであって、今後アップデートをなるべく避けたいし、最新機能を必要としていない方にお勧めします。多分、Ubuntuのデフォルトバージョンなので、このようにするひゆ

원하는 항목을 브라우저에서 링크만 복사하여 아래 wget 명령 우측에 채워줍니다. 여기서는 openssl 1.1.1 pre7 버전을 설치하는 모습입니다.

$ cd /usr/src
$ wget https://www.openssl.org/source/openssl-1.1.1-pre7.tar.gz
--2018-06-19 08:49:17--  https://www.openssl.org/source/openssl-1.1.1-pre7.tar.gz
Resolving www.openssl.org (www.openssl.org)... 202.43.57.191, 2600:140b:5000:1af::c1e, 2600:140b:5000:1ab::c1e, ...
Connecting to www.openssl.org (www.openssl.org)|202.43.57.191|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 8308876 (7.9M) [application/x-gzip]
Saving to: ‘openssl-1.1.1-pre7.tar.gz’

openssl-1.1.1-pre7.tar.gz   100%[=================================================>]   7.92M  4.00MB/s    in 2.0s

2018-06-19 08:49:26 (4.00 MB/s) - ‘openssl-1.1.1-pre7.tar.gz’ saved [8308876/8308876]

다운로드가 완료되면, 다운 받은 압축 파일을 다음과 같이 풀어줍니다.

$ tar -zxf openssl-1.1.1-pre7.tar.gz

수동으로 컴파일하기 위한 준비 작업이 필요합니다. 다음 명령으로 빌드 도구를 설치해주세요. 아래 명령에 파일을 찾을 수 없다는 오류가 발생하면, 우선 우분투 패키지 업데이트부터 실시합니다.1

$ sudo apt install build-essential

이어서 OpenSSL 컴파일 후 설치 및 업그레이드를 하기 위해서 다음 명령을 사용합니다. cd 명령어 뒤에 디렉토리명은 정확해도 되지만, 여기서는 편의를 위해 와일드카드로 간편하게 들어갔습니다. 둘 이상 존재한다면, 정확한 디렉토리명을 지정해주세요.

$ cd openssl*
$ ./config

참고로 위 ./config 대신 ./Configure --help를 참고하여 원하는 옵션을 더 넣을 수 있습니다. 특정 Cipher는 기본적으로 빠져있어서 이런 작업을 미리 해둬야 설치 후 사용 가능한 경우도 있습니다. 보통의 경우 위 명령으로 충분합니다.

이 작업이 끝나면, make 명령으로 OpenSSL의 설치를 준비합시다.

$ make

컴파일이 다 끝나면, make test 명령을 쳐줍니다.

$ make test

다양한 평가 항목이 완료되면, 루트 권한을 갖고 install을 시작합니다.

$ sudo make install

에러에 대한 언급이 없다면, 성공적으로 설치된 것입니다.

아래는 오류 발생시 따라합니다.

여기서부터 링크를 잘 걸어야 잘 실행할 수 있습니다. openssl 명령 실행시 error while loading shared libraries: libcrypto.so.1.1 등의 오류가 발생할 수 있습니다. libssl.so 또한 마찬가지입니다. 이 때 libcrypto.so와 libssl.so를 /usr/lib/usr/local/lib에 위치한 파일을 향하게 심볼릭 링크를 만들어야 합니다. 각 경로에 들어가서 파일이 (그것도 링크가 아닌 실행 가능한 파일로서) 실존하는지 확인합니다. 기존에 존재하던 예전 버전의 쓰레기가 있다면 제거합니다.

$ sudo rm /usr/lib/libcrypto.so*
$ sudo rm /usr/lib/libssl.so*
$ sudo ln -s /usr/local/lib/libcrypto.so.1.1 /usr/lib/libcrypto.so
$ sudo ln -s /usr/local/lib/libssl.so.1.1 /usr/lib/libssl.so
$ sudo ln -s /usr/local/lib/libcrypto.so.1.1 /usr/lib/libcrypto.so.1.1
$ sudo ln -s /usr/local/lib/libssl.so.1.1 /usr/lib/libssl.so.1.1

그리고 방금 설치한 openssl이 bin 폴더에 바로 저장될 수도 있지만, 다른 곳에 만들어졌을 수 있습니다. 위 make install에서 bin 파일이 어디 만들어졌는지 확인하고, 원래의 openssl을 치워버리고 링크해야 합니다.

$ sudo mv /usr/bin/openssl /root/
$ sudo ln -s /usr/local/bin/openssl /usr/bin/openssl

간단한 설치와 업데이트 방법이죠? OpenSSL은 기본적인 암호화 기능과 다양한 유틸리티 기능을 제공합니다. https 서비스 연결, ssh 터미널에도 쓰입니다. 또한, 명령줄을 통해 온라인 인증서에서 정보를 검증하고 추출하는데도 쓰일 수 있습니다.

사견으로, 빌드 난이도는 nginx보다도 낮은, 무척 쉬움에 속하며 아무래도 종속성이 낮은 원시 코드에 가까워서 그런 것 같습니다. 그러나 시스템 설치 단계에서 기존 버전과 충돌을 처리하는 방법에서 고민해야하는 부분이 많으므로, 시스템 백업을 사전에 한 후 도전하길 강력하게 권합니다.

[번역] Docker 컨테이너를 Windows Bash에서 구동하기

Linux를 위한 Windows Subsystem(WSL)1이 Microsoft의 Build 컨퍼런스 2016에서 발표되었을 때, Windows 개발자들에게 새로운 도구의 세계가 열렸습니다. 개인적으로, PowerShell, Bash와 예전의 낡은 cmd까지, 스크립트를 할 때 자유롭게 고를 수 있다는 점을 참 좋아합니다. 그리고 Windows Bash에서 Docker 를 구동하지 못하고 있다는 점은 저를 지금까지도 괴롭게 합니다.

이 글의 원본 제목은 “Windows Bash에서 Docker를 구동하기”였습니다만, 이는 다소 과장되어 있습니다. Docker 는 Windows에서 완전히 완성되지 않은 수많은 시스템 호출에 대한 접근을 필요로 하며, 이로 인해 WSL에서 엔진을 구동하는 것은 아마도 쉽지 않을 것입니다. 대신, 우리는 Docker Engine을 Windows에서 구동하고 이를 Bash에서 연결할 것입니다. 이 또한 PowerShell에서 컨테이너를 시작하고 Bash로 상호작용하거나, 다른 방식을 제공한다는 장점을 갖고 있습니다. 다시 말해서, 당신의 컴퓨터가 단일 머신처럼 느껴질 것입니다.

그 방법을 알아봅시다.

1. Docker를 Windows에서 설치하기

Docker 엔진을 Windows에서 설치하려면, docker.com에 가서 적절한 배포판을 다운로드합니다. 물론, 하드웨어 가상화가 활성화돼있고, Hyper-V가 설치되어 있어야 하며, 그렇지 않으면 엔진이 시작되지 않습니다.

가장 빠른 방법: Windows 10 크리에티터 업데이트 설치

Windows 실행 파일을 Bash에서 실행할 수 있게 되었기 때문에, Windows 10 크리에이터 업데이트에서는 이 과정이 더욱 단순해졌습니다. 그저 아래 두 줄을 .bashsrc에 추가하고 (환경을 다시 로드하면) 끝납니다!

export PATH="$HOME/bin:$HOME/.local/bin:$PATH"
export PATH="$PATH:/mnt/c/Program\ Files/Docker/Docker/resources/bin"
alias docker=docker.exe
alias docker-compose=docker-compose.exe

docker –version을 Bash에서 실행하면, 나머지 글을 읽을 필요도 없습니다. :)

*) Windows 10 크리에이터 업데이트는 2017년 4월 11일에 인사이더에 공개되었으며 현재 유효합니다.

Windows 10 애니버서리 에디션에서 작동하는 법

Docker를 WSL에 설치하기 위해서, 몇 가지 더 많은 단계가 필요합니다. 일부 선택적 단계를 제외하고는 WSL에서도 잘 작동하는, 일반적인 Ubuntu 설치 방법은 여기 적혀 있습니다.

제가 한 방식은 이것입니다:

# Install packages to allow apt to use a repository over HTTPS
$ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
# Add Docker's official GPG key
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# Set up the repository
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# Update source lists
sudo apt-get update
# Install Docker
sudo apt-get install docker-ce

물론 필요한 바이너리를 다운받고 압축을 푸는 작업, 그리고 그것을 PATH에 넣는 방식의 선택지도 있습니다. 가장 최신 버전에 맞는 방법은 여기 적혀 있습니다.

그 결과는?

Docker 엔진을 Windows와 WSL 양쪽에 설치했지만, 둘 다 구동하진 않았습니다. Windows 인스톨러는 고맙게도 Docker 엔진을 시작할 때 쓰는 Docker 바로 가기를 바탕 화면에 만들어놨습니다. 그리고 docker images를 PowerShell이나 Bash에서 호출할 수 있습니다.

PowerShell:

PS C:\> docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

아직까지 이미지를 아무 것도 만들지 않았지만, 괜찮습니다.

Bash:

$ docker images
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

전혀 만족스럽지 못하군요. 하지만 한 두 가지 과정을 더 거치면, 모두 잘 작동할 것입니다.

2. Windows Docker로 WSL의 Docker 연결하기

docker를 다른 장치의 엔진을 대상으로 구동하는 것은 꽤 쉬운데, Docker가 CLI가 연결될 수 있는 TCP 엔드포인트를 노출할 수 있기 때문입니다.

참고: 글을 처음 공개한지 얼마 되지 않아서 Docker 업데이트를 통해 이 TCP 엔드포인트는 기본적으로 꺼져 있습니다. (Mark님 알려주셔서 감사해요!) 활성화하려면, 작업표시줄에 있는 Docker 아이콘을 우클릭하여, 메뉴에서 설정을 들어갑니다. 그리고 “Expose daemon on tcp://localhost:2375 without TLS” 옵션을 켭니다 (보안 위험성에 유의합니다).

export PATH="$HOME/bin:$HOME/.local/bin:$PATH"
export PATH="$PATH:/mnt/c/Program\ Files/Docker/Docker/resources/bin"
alias docker=docker.exe
alias docker-compose=docker-compose.exe

이렇게 하면, 다음처럼 할 일은 Bash 상의 CLI가 Bash 상에는 없는 엔진 대신에 Windows에서 엔진을 실행하게 됩니다.

$ docker -H tcp://0.0.0.0:2375 images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

훨씬 낫군요!

이 상태를 지속하게 만드는 두 가지 방법이 있습니다. 위 명령을 별명으로 추가하거나, 아니면 더 나은 방법으로(Dave님의 추천), Docker가 호스트 엔진을 찾도록 환경 변수를 만들면 됩니다.

$ echo "export DOCKER_HOST='tcp://0.0.0.0:2375'" >> ~/.bashrc
$ source ~/.bashrc

이제, 도커 명령을 Bash에서 실행하면, 우리가 바라던 대로 작동하게 됩니다.

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

미션 성공!


이 글에서 사용한 버전

물론, 이 방법이 사용하는 버전에 따라 되지 않을 수 있습니다. 이 블로그 포스트에서는 다음과 같은 버전을 사용하였습니다.

Windows

Windows 10 Pro Anniversary Edition (Version 1607, OS Build 14393.1066)
Windows 10 Pro Creators Update (Version 1703, OS Build 15063.138)

WSL Ubuntu

14.04.5 LTS

Docker on Windows

17.03.1-ce, build c6d412e

Docker on Ubuntu

17.03.1-ce, build c6d412e

출처: https://blog.jayway.com/2017/04/19/running-docker-on-bash-on-windows/

ゼロから始めるGit(分散型バージョン管理)ライフ 1

Gitを使うべし!

形象バージョン管理アプリの中で、一番優秀だと思われるのは断然Gitと言える。Gitは次のような特徴が長所と思われている。

  1. ファイルごとに変更内容を追跡し、ステージ後、コミット、プッシュ過程を通してアップロードができる。
  2. 中央サーバー中心ではない。分散セーブをする。
    • Gitは確かリモートサーバーという概念を持ってるが、サーバーにつながらなくてもローカルコミットまではできる。SVNはリモートサーバーと繋がらなければ、一切のコミットができない。
    • ローカルに貯めていたコミットを一気にプッシュすることでサーバーと無事に同期化もできる。
  3. ほとんどの場合、コンフリクトの解消は簡単にできる。
  4. ソース保管と複製に利用できる。
    • Githubはgitを活用した代表的な公開サービスであって、ここにPublicとしてアップすることで、誰でもクローンができる。
    • GitをCloneすれば、レポジトリーの歴史と内容のすべてがコピーされて、サーバーの有無と関係なく、再アップロードして歴史を続けられる。
  5. コミットの容量が小さいし、いつでもアンドゥしたり、他のコミットをチェックアウトできる。
    • Branchを分岐して、人あるいは機能ごとに分けることができる。完成されていない作業中の機能も柔軟にセーブできる。
    • 新しい機能が問題の原因となった場合、過去のコミットに戻ることも、他のブランチに変えることもできる。
    • Checkoutをすると、ローカルのファイルはすべて変わってしまうが、たとしてコミットした既存のファイルがどこか消えるのではない。プロジェクトフォルダの内容をまるでテンポラリーファイルのように変えられる。

一方、形象管理を経験していない人なら、「グーグルドライブやラインで送ればいいじゃん」と思うかもしれない。これは次のような理由で避けた方が進められる。

  1. 同じか似ているファイルが複数存在するようになる。
    (マスター.zip, マスター.zip (1), マスター-最終.zipが積み重なるような…)
  2. プロジェクトファイル全体を圧縮して、コピー(アップロード/ダウンロード), 解凍する過程で時間の無駄遣いと手間がかかる。
  3. 常に何を変更したか分からない。
  4. 前はできた機能が壊れた場合、その原因を探るのはとても難しい。
  5. 誰かが動かないと言っても、その人のファイルが最新かどうかわからない。

Gitを使うためのそろいもの

Windows環境でGitを使うには予め大きく二つの気にすることがある。

  • クライアント側
    • Gitをコマンドで使うか?
      • Gitバイナリーは確かコマンドプロンプトやbashなどで使われるCLIアプリであり、使いにくいが、GUIにない機能を使うためには必須である。
      • 一部のGUI Gitは別途のバイナリーが要るが、大体にGUIのみ使っている場合ならそのアプリの以外にGitをまたインストールする必要はない。しかし、上記の理由でコマンドの必要性はあるので、両方あって損することもない。
    • Gitを便利に使えるGUIを選ぼう。
      • SourceTreeは地域化が進められていて、日本語バージョンもある。しかし、機能では惜しいところもある。
      • GitKrakenはこのシリーズで紹介するアプリであり、豊富な機能と優れている視覚化が特徴だ。しかし、英語のみサポートされている。
      • TortoiseGitはエクスプローラーのメニューの中にあり、連携に優れているが、機能と直感性は劣っている。
      • eclipseのeGit, Visual Studioのgitなど、IDEに含まれているプラグインも活用できる。しかし、本の最小の機能しかないので、gitに対する誤解を招くこともあり、コンフリクトなどの問題解決が非常に難しいか、不可能な場合もある。
  • サーバー側
    • 誰でもgitバイナリーを使い、git serverの設定ができる。
    • githubとbitbucketのようなウェブgitが使える。
      • github: Publicの場合無料。Privateは一人に7ドルの費用。
      • bitbucket: Public無料。Privateも5人内なら無料。
    • Synology NASにgitを設定して、SSHプロトコルで使用できる。

Git for Windows ダウンロード

Linuxの環境では、基本的な構成されることが多いし、(Ubuntu等)、必要なら単純な命令でインストールできる。

Linux Git ダウングレード

Gitをパソコンで設定

GUIのみの方には必要ないかもしれないが、gitコマンドを使うには事前設定が必要だ。

まず、上記のリンクからファイルのダウンロードを行い、インストールを済ませる。PATH設定が適用されるには、現在のコマンドプロンプトをすべて終了し、必要な時はシステム再起動もする。

次のようなメッセージが表示されたら、PATHが間違っていることである。

> git
'git' is not recognized as an internal or external command,
operable program or batch file.

下の結果が成功である。

> git
usage: git [--version] [--help] [-C ] [-c name=value]
           [--exec-path[=]] [--html-path] [--man-path] [--info-path]
           [-p | --paginate | --no-pager] [--no-replace-objects] [--bare]
           [--git-dir=] [--work-tree=] [--namespace=]
            []

These are common Git commands used in various situations:

start a working area (see also: git help tutorial)
   clone      Clone a repository into a new directory
   init       Create an empty Git repository or reinitialize an existing one

work on the current change (see also: git help everyday)
   add        Add file contents to the index
   mv         Move or rename a file, a directory, or a symlink
   reset      Reset current HEAD to the specified state
   rm         Remove files from the working tree and from the index

examine the history and state (see also: git help revisions)
   bisect     Use binary search to find the commit that introduced a bug
   grep       Print lines matching a pattern
   log        Show commit logs
   show       Show various types of objects
   status     Show the working tree status

grow, mark and tweak your common history
   branch     List, create, or delete branches
   checkout   Switch branches or restore working tree files
   commit     Record changes to the repository
   diff       Show changes between commits, commit and working tree, etc
   merge      Join two or more development histories together
   rebase     Reapply commits on top of another base tip
   tag        Create, list, delete or verify a tag object signed with GPG

collaborate (see also: git help workflows)
   fetch      Download objects and refs from another repository
   pull       Fetch from and integrate with another repository or a local branch
   push       Update remote refs along with associated objects

'git help -a' and 'git help -g' list available subcommands and some
concept guides. See 'git help ' or 'git help '
to read about a specific subcommand or concept.

これから、基本ユーザー設定をしてみよう。次のコマンドがあれば、git commitのたびに、ユーザー設定が自動でできる。

> git config --global user.name "My Name"
> git config --global user.email [email protected]

一度使ってみたらはまるGitKraken

つづく…

SCIT Schedule Hi

SCIT Schedule Hi (2018)

SCIT Schedule Hi
SCIT Schedule Hi

SCIT Schedule HiとはSCIT Masterの在学中の学生が手軽に自分の志望企業に関するスケジュールを確認し、変動事項をアラートにより分かるプログラムです。

開発動機

SCITの面接シーズンになり、学生の生活は不安そのものになりました。不安を抱き、施設内のサイトでF5を連打する姿はまるで健康的ではありません。接続しなくても、ただアプリを起動する、それどころか、パソコンを起動するだけで自分のスケジュールの確認ができたらさらに便利でしょう。そうなると、GET1回、POST1回の2回の要請が、POST1回に減り、更新間隔も縮めることができます。ポーリングのリクエストもよりシンプルになり、施設の側からみても、トラフィックの低減ができますね。

開発の言語とツール

  • Language: C#
  • Tool: Visual Studio 2017
  • Template: WPF Application

続きを読む

アルゴリズム探求-隣接している元素の位置を求めよう

問題

U < V < WまたはU > V > Wの時、整数VとUはWの間にある。

開いていない配列Aは与えられたN個の整数で構成されていて、数字のインデックス(P,Q)のペアは0 ≤ P < Q < Nの隣接する数がA[P]とA[Q]の間にないことと、A[P]≠A[Q]であることを表す。 例えば、配列Aでは:

A[0] = 0
A[1] = 3
A[2] = 3
A[3] = 7
A[4] = 5
A[5] = 3
A[6] = 11
A[7] = 1

次のインデックスのペアは隣接した値を持っている。

(0,7), (1,4), (1,7), (2,4), (2,7), (3,4), (3,6), (4,5), (5,7)

例えば、インデックス4と5は隣接した数字を持っている。なぜなら、A[4] = 5とA[5] = 3は異なっていて、配列Aにはその間に挟まる数字はない。つまり、数字4のみが間にあるが、配列には存在しない。

与えられた二つのインデックスPとQの距離はX ≥ 0ではabs(X) = X、X < 0ではabs(X) = -Xの時、abs(P-Q)として定義される。例えば、インデックス4と5の中の距離は1であり、その理由はabs(4-5) = (5-4) = 1だからである。

関数を作成せよ:

class Solution { public int solution{int[] A); }

与えられた、空いていない配列AはN個の整数で構成されていて、隣接した値を持っている配列の一番遠い距離をリターンする。この関数は隣接したインデックスがない場合、-1をリターンしなければならない。

例えば、与えられた配列Aは次のようになる。

A[0] = 1
A[1] = 4
A[2] = 7
A[3] = 3
A[4] = 3
A[5] = 5

この関数は次の理由で4をリターンしなければならない:

  • インデックス0と4は隣接している。その理由はA[0] ≠ A[4]で、配列にはA[0] = 1とA[4] = 3の間の数字を持っていないからだ。
  • これらのインデックスの距離はabs(0-4) = 4である。
  • より遠い距離の隣接したインデックスのペアはない。

次のように仮定する:

  • Nは[1..40,000]の範囲内である。
  • 配列Aの項目は整数であり、範囲[-2,147,483,648..2,147,483,647]の内である。

複雑さ:

  • 期待される最悪の場合、時間計算量はO(N*log(N))である。
  • 期待される最悪の場合、空間計算量はO(N)で、入力空間以降を言う。(インプット記号に必要な空間を除く)

発送

  • 左から探してその次の隣接した数を探すのは?
    • N個の項目に対し、N-1個のリピートをしなければならない。
    • よりいい方法があるはずだ。
  • ソートを先にした後に、低い順で登りながら当ててみるか?
    • ソートアルゴリズムは検証済みであり、内部のライブラリの方が速いし、信用できる。
    • 同じ数を除くとループはさらに速くなる。
    • でも、ソート後インデックスがなくなるのでは?
      • 元の位置は左から探すなど原始的な方法でいい。
      • 見つかったとたん、脱出するとループは短くなる。

解き方

import java.util.ArrayList;
import java.util.Arrays;

public class Question {

    /*プロゴラムのエントリ。*/
   public static void main(String[] args) {
      // TODO Auto-generated method stub
      //int[] A = new int[] {0,3,3,7,5,3,11,1};
      //int[] A = new int[] {1,4,7,3,3,5};
      //int[] A = new int[] {1,1,1,1,1,1,1,1};
      
      //ランダムの40000個の整数を入れる
      int[] A = new int[40000];
      for(int i = 0; i < A.length; i++) {
         A[i]=(int)Math.round(Math.random()*2147483647*2-2147483647);
      }
      
      //時間の計算
      long startTime = System.nanoTime();
      System.out.println("Result: "+solution(A));
      System.out.println("Elapsed Time: "+(System.nanoTime()-startTime)/1000000.0+"ms");
   }
   /* */

   /* 補助関数: 配列から項目の位置を探す */
   private static int indexOfArray(int[] A, int val, boolean reverse) {
      if(reverse) {
         //後ろから
         for(int i = A.length-1; i >= 0; i--) {
            if(A[i]==val) {
               return i;
            }
         }
      } else {
         //前から
         for(int i = 0; i < A.length; i++) {
            if(A[i]==val) {
               return i;
            }
         }
      }
      return -1;
   }
   
   /* minと maxを配列でindexOfArrayを使い、それぞれ求めてその最大値を求める */
   private static int findPairDistance(int[] A, int min, int max) {
      //左、右からmin, max検索
      int aleft = indexOfArray(A,min,false);
      int aright = indexOfArray(A,min,true);
      int bleft = indexOfArray(A,max,false);
      int bright = indexOfArray(A,max,true);
      return Math.max(Math.abs(aleft-bright),Math.abs(aright-bleft));
   }
   
   /* ソリューションのメイン */
   public static int solution(int[] A) {
      //ソート後重複を除く
      int[] sorted = A.clone();
      Arrays.sort(sorted);
      /*for(int i = 0; i < sorted.length; i++) {
         System.out.print(sorted[i]+",");
      }*/
      //ArrayList alSel = new ArrayList<>();
      int max = -1;
      for(int i = 1;i < sorted.length; i++) {
         //前項と現在項の違い
         int cha = sorted[i]-sorted[i-1];
         if(cha >= 1) { //違いが1以上の場合整数は変化したとする
            //alSel.add(sorted[i-1]);
            //findPairDistance(A,A[i-1],A[i]);
            max = Math.max(max, findPairDistance(A,sorted[i-1],sorted[i]));
            //二つの左右検索最大距離を求めた後、maxより大きい時に記録
            //System.out.println(String.format("Value: (%d,%d), Distance: %d",sorted[i-1],sorted[i],findPairDistance(A,sorted[i-1],sorted[i])));
         }
      }
      
      
      return max;
   }

}

 

IISのcipherセキュリティーを改善してSSLLabsの高得点を目指そう

IISのSSLは不完全?

Windows 10 1607、しかもServer 2016 1607というそれなりの最新1バージョンを使用しながら、IISを先週の記事で設定したことがあります。なのに、Let’s encryptに設定したのにもかかわらず、SSLLabsではこんな酷い点数になってしまったんでしょうか。

RC4を使ってはいけない理由

RC4暗号化は1987年設計されたストリーム暗号です。ストリーム暗号である分、速く適用できるし、今まで幅広く使われてきましたが、今は使用はお勧めきないそうです。いろいろ脆弱さが発見されたこと、暗号は十分に複雑ではないこと、したがって無線LANの暗号化形式の一つであるWEPを信用できなくなった原因でもあります。よって、新しいSSLプロトコルでは導入されたこともないし、そんな古いものをIISではまだサポートしていることでセキュリティーの点数に損をしてしまったわけです。

Cipher選択によって左右されるセキュリティー

SSLについての今までの記事で申しあげたとおりに、セキュリティー cipherは暗号化方法を意味します。サーバーだけではなく、クライアント側もサポートしているアルゴリズムがなければ、正しく情報通信ができないはずです。Cipherとは暗号化アルゴリズムとして定義されており、その種類は多様であります。中には、最新型セキュリティーもあれば、脆弱点を誰もが知り尽くしている古いものもあります。

もちろん、一番最新のアルゴリズムのみ使えば安全なのは当然ですが、すべてのブラウザに合わせないので、昔のOSやソフトではエラーだけが迎えてくれるでしょう。そのすべてを考慮して交換制とセキュリティー両方に近づいてみましょう。つまり、これは前回のリトライと言っても間違っていません。

IISでCipherの選択

[スタート]→[実行]に入って‘gpedit.msc’を起動するとグループ製作が出ます。グループ製作で次のパスに入ります。

パソコン管理\管理テンプレート\ネットワーク\SSL構成設定

SSL Cipher Suite Order項目を押して‘使用’を選択すると、下に入力欄があります。デフォルトはこのようになっています。

TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
TLS_DHE_RSA_WITH_AES_256_CBC_SHA,
TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
TLS_RSA_WITH_AES_256_GCM_SHA384,
TLS_RSA_WITH_AES_128_GCM_SHA256,
TLS_RSA_WITH_AES_256_CBC_SHA256,
TLS_RSA_WITH_AES_128_CBC_SHA256,
TLS_RSA_WITH_AES_256_CBC_SHA,
TLS_RSA_WITH_AES_128_CBC_SHA,
TLS_RSA_WITH_3DES_EDE_CBC_SHA,
TLS_DHE_DSS_WITH_AES_256_CBC_SHA256,
TLS_DHE_DSS_WITH_AES_128_CBC_SHA256,
TLS_DHE_DSS_WITH_AES_256_CBC_SHA,
TLS_DHE_DSS_WITH_AES_128_CBC_SHA,
TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA,
TLS_RSA_WITH_RC4_128_SHA,
TLS_RSA_WITH_RC4_128_MD5,
TLS_RSA_WITH_NULL_SHA256,
TLS_RSA_WITH_NULL_SHA,
TLS_PSK_WITH_AES_256_GCM_SHA384,
TLS_PSK_WITH_AES_128_GCM_SHA256,
TLS_PSK_WITH_AES_256_CBC_SHA384,
TLS_PSK_WITH_AES_128_CBC_SHA256,
TLS_PSK_WITH_NULL_SHA384,
TLS_PSK_WITH_NULL_SHA256

RSA + PSK WITH NULLってなんでしょう

高順位ではありますが、RC4はもちろん、別途の暗号化アルゴリズムを持っていないものも見えます。これが保安の弱点になりうるところです。

Windowsのドキュメントでの提案

Windows公式ドキュメントからも関わっている情報を公開しています。この通りなら、大きく2つに注意しましょう。

  • 一部cipherはHTTP/2バージョンのコネクトをサポートしていないので、通信に失敗します。バージョンが2になると同時リクエストができるので、速度に必要です。
  • SCH_USE_STRONG_CRYPTOのYesバリューになっているものは安全だとみられております。なのに、SSLLabsは厳しく見るので、WEAKが付く可能性があることを忘れてはいけません。

ここでSCH_USE_STRONG_CRYPTOがYesになっているののみ入れてみます。

TLS_PSK_WITH_AES_256_GCM_SHA384,
TLS_PSK_WITH_AES_128_GCM_SHA256,
TLS_PSK_WITH_AES_256_CBC_SHA384,
TLS_PSK_WITH_AES_128_CBC_SHA256,
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
TLS_DHE_RSA_WITH_AES_256_CBC_SHA,
TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
TLS_RSA_WITH_AES_256_GCM_SHA384,
TLS_RSA_WITH_AES_128_GCM_SHA256,
TLS_RSA_WITH_AES_256_CBC_SHA256,
TLS_RSA_WITH_AES_128_CBC_SHA256,
TLS_RSA_WITH_AES_256_CBC_SHA,
TLS_RSA_WITH_AES_128_CBC_SHA,
TLS_RSA_WITH_3DES_EDE_CBC_SHA,
TLS_DHE_DSS_WITH_AES_256_CBC_SHA256,
TLS_DHE_DSS_WITH_AES_128_CBC_SHA256

再びSSLLabsテストを受けてみたら、未だにWEAK判定はあります。RC4を消すことでランクもAにアップしました。

報告書を見ながら問題となったcipherを強調してみます。

TLS_RSA_WITH_AES_256_GCM_SHA384,
TLS_RSA_WITH_AES_128_GCM_SHA256,
TLS_RSA_WITH_AES_256_CBC_SHA256,
TLS_RSA_WITH_AES_128_CBC_SHA256,
TLS_RSA_WITH_AES_256_CBC_SHA,
TLS_RSA_WITH_AES_128_CBC_SHA,
TLS_RSA_WITH_3DES_EDE_CBC_SHA

このcipherさえなければ、問題ないってことですね。 さらに、ブラウザの優先順位に合わせて順番も変えました。

TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
TLS_PSK_WITH_AES_256_GCM_SHA384
TLS_PSK_WITH_AES_128_GCM_SHA256
TLS_PSK_WITH_AES_256_CBC_SHA384
TLS_PSK_WITH_AES_128_CBC_SHA256
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
TLS_DHE_RSA_WITH_AES_256_CBC_SHA
TLS_DHE_RSA_WITH_AES_128_CBC_SHA
TLS_DHE_DSS_WITH_AES_256_CBC_SHA256
TLS_DHE_DSS_WITH_AES_128_CBC_SHA256

HSTS設定をすることでA+を目指そう

Cipherも無欠になったところなので、最後にもう一押しでA+を撮る裏ワザを紹介いたします。

SSLが強制されるサイトでHTTP Response Headersを設定します。

[追加(Add)…]を押して新しいアイテムを追加しましょう。

ご覧になってるように、Strict-Transport-Securityを設定します。このバリューを設定したうえで、ヘッダーに転送されたら、ユーザークライアントブラウザでは今後このサイトに対するリクエストをすべてHTTPSのみに制限し、一時的にHTTPになる可能性を防げるので、より安全な通信ができます。

ただし、これからは証明書の抹消、期限切れの問題があった場合、サイトにまったく接続できなくなるかもしれません。証明書の管理に特に気を付けなければなりません。

Name: Strict-Transport-Security
Value: max-age=31536000

SSLLabsは少なくとも120日(10368000秒)以上を要求し、理想的な値は1年(31536000秒)だそうです。

また、平文伝送の場合、このようなヘッダーは望ましくないので、リダイレクトの専用サービス一つを作り、SSL専用サイトのみこのような設定をした方がいいそうです。

あら、まだA+が出ておりません。

IISの限界というか残念なところがあります。これに対する対策も立てましょう。

  • SHA1とRC4とRCがCipherに存在しないことを確認しました。
  • OCSP StaplingはIISのデフォルト状態で問題はなさそうです。ただし、Must Stapleオプションの決め方はまだ分かっておりません。
  • Forward SecrecyはECDHEとDHEさえサポートしていれば、適切にrobust supportができるはずです。
  • TLS_FALLBACK_SCSV: ブラウザがフォールバックトライができるようにして、古いセキュリティ標準にダウングレードする攻撃につながる可能性を断つ必要があります。この脆弱でPOODLE攻撃につながることもあります。残念ながら、この機能はIISではサポートされてないそうです。
    • 代わりにTLS1.2バージョンのみサポートすることで、低いバージョンで繋がる可能性を遮断できます。
    • TLS1.2のみ許容すると次のようなデバイスでは接続できません。
      • Android 4.3以前の機器
      • Baidu 2015年1月以前バージョン
      • XPでのIE62~IE8
      • VistaでのIE7~IE8
      • Windows 7でのIE8~IE10 (Windows 7での最新バージョンはIE11)
      • Windows Phone 8.0でのIE8
      • Java 6, Java 7
      • OS X 10でのSafari 6.x

この作業の結果、A+を獲得するに成功しました。しかしながら、捨てられるデバイスが相当な割合を占めるようで、実際に適用するには難しいところがあります。

HangmanAndroid (2018)

HangmanAndroidはオンラインの状態で、サーバーと通信し、接続している全員と一緒に英単語問題を解いてみるハングマンゲームのアンドロイドアプリです。

開発動機

SCITマスター第3回個人プロジェクト

BokunoVocaの開発により、単語学習プログラムについての可能性と同時に思い残すこともありました。ここでネットワーク機能を積極的に利用したらさらに面白くなるかもしれないと思いました。特にSpringとAndroidの組み合わせでHTTP通信の構成が可能ならば、その効果は大きくなるに違いありません。ちょうどWordamentという既存のMicrosoft Studioゲームをモチーフにした全世界人向けのゲームを作ることになりました。

開発言語とツール

  • JAVA, Android
  • Android Studio
  • Android SDK API 23 (Marshmallow)

続きを読む

Windows Server IISにASPリモートデプロイメントする方法

Javaを長年続いてきたことがある方なら、Spring MVCでApache Tomcatに一気にアップロードできるEclipseの連動した環境が結構魅力的な場面だと同意すると思います。最近はファイル一つ一つをFTPでアップロードするより、パッケージにして一気にサイトの構築を済ませることが、マネジメントにも、問題発生の可能性も下げられるのでだんだん広まってくるでしょう。

この記事でIISでASPリモートデプロイメントが可能になる方法を紹介いたします。

持ち物

  • Windows Server 2012以上のサーバーOS
    • もちろんIIS役割は必須です。
    • Windows 8.0, 8.1はサポートされていないと書かれていますが、Windows 10ではこのようなことができるのかまだ確認しておりません。
  • Web Deployのインストールファイル (.msi)
  • 開発用のPCの場合、Visual Studio 2017 Community以上
    • パッケージを作れる他のパソコンでのことです。

手順

サーバー役割の選択

サーバーマネージャーで役割と機能の追加を押します。

IISマネージャーをすべて選んでインストールします。これを先にした方が成功につながるようです。

Web Deployのインストール

Web Deployソフトウェアをインストールします。Web PIで3.5、3.6バージョンをボタン一回クリックでインストールもできますが、これが問題の原因になりがちです。

一番大きい問題は接続テスト段階で404、550エラーのようなことが起こるということです。必要なコンポーネントがまったく一緒にインストールされないようです。

そういう恐れを逃れるため、自分でリンクをクリックしてインストールしてみましょう。ファイルは上記の持ち物にあります。

インストールウィザードですべてのコンポーネントインストールを必ず選んでください。インストール完了したら、サーバーも一回再起動します。できるならシステム再起動してですね。

IISメニューを読み直しする必要があるからです。

IISのエキストラ設定

再起動はいかがでしたか。IISでの仕事がまだ残っています。

もし、すべてが順調ならば、Management Servicec Delegation項目も見えるはずです。

今は何もすることはありませんが。

私がこれからリモートで管理するサイトを(作るか、既存のものを)選択して、デプロイ(Deploy)のウェブデプロイ設定(Configure Web Publish Deploying…)を押します。

ここでデプロイ権限を設定したら、このサイトにアップロードをもらえるようになります。

サイトの設定が終わったら、マネジメントサービス(Management Service)に入りましょう。

ID資格証明を適当に設定し、証明書も使えるようにhttpsの証明書を選んでおきます。

自分のドメインネームを合う証明書を事前にもらって置いたらさらに便利でしょう。

接続テスト

間違いなく設定したら、Visual Studioで接続を確かめられます。

ソリューションのプロジェクトのメニューで [公開(Publish)…]に入ります。すでにしたことがあるなら、保存されたプロフィールが先に出ると思います。

ターゲットメソッドはIISにしましょう。

Web Deployを選び、サーバー(IP / ホストネーム)、IISメニューで見えるサイトの名前(Default Web Siteなど)、ユーザー名、暗証番号、ターゲットURLを入力します。

ターゲットURLはコネクションに影響はないはずですが、プレビューのアドレスに活用するようです。

[テスト(Vaildate Connection)]ボタンを押すと、上記の設定に間違いがなく、通信に成功したが表示されます。

ファイアウォールの設定

接続失敗の場合、Windowsファイアウォールが邪魔になっている可能性があります。ファイアウォールのオプションと回線からの制限も確認します。ポート番号はトラブルシューティングをご覧ください。

トラブルシューティング

  • Web Deployを復元、アップグレードする時、命令プロンプトで次のコマンドを実行し、ハンドラーとエージェントの再起動を行います。
    • net stop msdepsvc & net start msdepsvc
    • net stop wmsvc & net start wmsvc
  • 回線にあるファイアウォールが通信を邪魔してはいけません。Web Deployment Agent Serviceは普通80番、Web Management Serviceは8172番ポートを使います。
  • MsDepSvcはAdministratorあるいはAdminグループのみで実行する必要があります。ローカルでは動作しません。
  • .NET 4.0がIISに登録されていない可能性もあります。
    • .NET 4.0がインストールされておりますが、IISのサービスプールに登録されていない可能性もあります。その原因は.NET 4.0がIISのインストール前の事前になかったからです。
    • 次のコマンドで解決できます。
      • %systemdrive%\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -iru

結論

Springよりも強力なVisual Studioとサイトが繋がりました。SQLも一気にできそうですが、活用も知識次第だと思います。

IIS 7でLetsEncryptの設定

LetsEncryptは無料証明書の発行でhttpsの拡散に貢献した団体であります。1

特に、Certbotという強力なツールにより、Linux系ではApacheを使おうが、Nginxを使おうが、関係なくコマンド数行で証明書がもらえる時代になりました。

ですが、Windowsでは公式的にLetsEncryptの証明書をインストールする方法が提供されません。なのに、ソース公開も十分できているので、誰でもLetsEncryptの認証サーバーに接続して、証明書がもらえます。

だったら、自分で通信すればいいのでは?

というわけには恐れ入りますが、LetsEncryptの証明書の期限が90日以内で大変短いので、自動実行で更新されなかったら問題になりがちです。ツールの使用は避けられませんね。

そういうツールには何があるんでしょうか。

Certify The Web

https://certifytheweb.com/

現在は3.0.11 Stableバージョンと4.0 Alphaバージョンに分けられています。Alpha4の問題により、Alpha3を再公開したらしいです。

インストールは素早く進められます。

メインはこうなっています。

すぐにNew Certificateのボタンを押して、新しい証明書をもらってみましょう。
ちなみに、正式バージョンではない場合、常用はやめてほしいという警告が何回か出ます。

 

LetsEncrypt側に伝えたい自分のメールアドレスを書きます。

期限切れの到来など証明書の特異事項のお知らせが届きます。
この機能はLinuxのcertbotとまったく同じですね。

 

現在IISでサービスしているサイトを選びます。複数のサイトに使いたければ、複数選択も可能であり、サイトを選ばずに、発行のみも可能です。
Request Certificateボタンを押すと、証明書の発行は完了です。Settingsに入って、更新日程も正しいか確認する必要があります。

こうすると、IISのSSL証明書にLetsEncryptが入れられたことが分かり、今後もすぐに変更ができます。

HTTPS通信だけではなく、リモート配布機能とFTP SSLなど証明書が必要な個所に幅広く活用もできます。

限界

無料バージョンは5個のサイトまで管理ができます。プロライセンスでは3個の追加が50ドル、エンタープライズライセンスでは100個の追加が349ドルです。複数購買もできるので、多数のサイトには購入が必須です。

トラブルシューティング

  • テストボタンを押したとき、失敗する可能性もあります。外部接続確認の時、DNS確認が正しくない場合があります。インターネットのコネクションに問題がなく、サイトのバインドも設定されて2、ファイアウォールも遮ることなかったら、Request Certificateを押してみても問題はないはずです。
  • その他CloudflareなどのDNSサービスを使用中なら、API Keyを入れておいて、このアプリでDNS-01方式でチェックするようにできます。こうすれば、サーバーのファイルにテンポラリファイルの生成なしに、早く問題の余地なくドメインの持ち主の確認ができます。ワイルドカード証明書(4バージョン以降)にはDNSが必要な場合があります。

Windows 2016サーバーの構築

Windows Server 2016

とは言いましたが、ただ安く買っただけです。Windows Serverもかなりサービス値段を下げることができますね。(韓国の場合です)

今まではLinuxのUbuntu, CentOSなどでサーバー構築をLEMPの手順により、成功的に進んできましたが、Windows Serverはワクワクします。

これから何ができるのか、期待が高まりますね。

本物のIISはXP時代以降初めてです。

ASPなど古い遺産もありますが、Visual Studioと連携して、Springのように一貫したサイト管理がどう行われるかを重点的に見てみたいです。

realLyrics / realLyrics+ レアル歌詞 (2011)

realLyrics playing screen
realLyrics

レアル歌詞はオンライン『ALSong』(ESTSoftのアプリ)サーバーから歌詞を検索して、ユーザーが今聞いている音楽とシンクを合わせて表示してくれるWindows Phone 8向けの音楽プレイヤーアプリです。

開発のきっかけ

新しいOSであるWindows Phone 7.5 Mangoが世の中に出され、韓国にも出るかも知れないという期待が高まっていました。私は自分で海外購入したSamsung Omnia 7というWindows Phoneスマートフォンにすぐはまりました。しかし、使用できるアプリがまったくないという状況に落胆するしかありませんでした。そして、ないなら自分で作ってみようという新たな目標で胸が熱くなりました。

Zuneのデザインコードを受け継いだWindows PhoneのMetro Designはまるで白紙のキャンバスのように、想像力を刺激してくれました。このシンプルなデザインコードに合わせて、貧弱なプレイヤー機能を補強する工夫を始めました。

開発の言語とツール

  • C# / XAML
  • Microsoft Visual Studio 2010
  • Windows Phone 7.1 SDK

続きを読む

SQL ビュー(View) 紹介

ビューとは、CREATE TABLE で定義された実テーブルから作成される仮想的なテーブルのことです。ビューはあくまでも仮想テーブルなので、その中にデータは存在しません。ビューは実テーブルをどのように見るのかを定義したものと言えます。

もうすでに使っていますが、CREATE TABLE で定義された、データの入ったテーブルのことを実テーブル、この実テーブルから作られる仮想的なテーブルをビューと呼ぶことにします。

ビューのメリット

ビューの実体は SELECT 文によるクエリを定義したものです。ビューにアクセスすると、定義されたクエリが実行され、実テーブルから必要なデータが抽出されます。また、ビューからビューを定義することも可能です。ですから、あらかじめ毎回入力するのが面倒な複雑なクエリを一度ビューとして定義しておけば、ユーザやプログラムは単純なクエリを実行するだけですみます。

このような開発労力の軽減という観点以外に、セキュリティについてもメリットもあります。たとえば、実テーブルのデータの中に一般ユーザには見せたくないものがある場合、実テーブルへのアクセス権限を一般ユーザには与えることはできません。しかし、見せたくないデータを除いたビューを定義することにより、一般ユーザでも実テーブルのデータを利用できるようになります。

ビューの作成

ビューを作成するには CREATE VIEW 文を用います。基本構文は次のとおりです。

CREATE VIEW ビュー名 [(列名, 列名, .....)] AS
SELECT文
[WITH CHECK OPTION];

ビュー名の後には、抽出するデータの列名を記述します。列名を省略した場合、SELECT 文で指定した列の名前がそのまま使用されます。SELECT 文で演算子を使用した場合や、改めて列名を指定したい場合に明示的に記述するものです。

ビュー名と列名の後には、AS に続けて SELECT 文によるクエリを記述します。このクエリの結果がこのビューのデータということになります。[WITH CHECK OPTION] はビューの更新に関連するオプションです。ビューの更新については後の節で説明します。

この章の SQL のサンプルはこれまでの章でも使用してきた受注表・顧客表・商品表を実テーブルとして使用します。sample.21-1 では v_受注という名前のビューを定義し、最後にビューの内容を確認しています。

/* ビューの作成 */
CREATE VIEW v_受注 AS
SELECT JJ.受注番号, KK.顧客名, SS.商品名,
JJ.受注個数, JJ.納品日
FROM 受注表 JJ, 顧客表 KK, 商品表 SS
WHERE JJ.顧客コード = KK.顧客コード
AND JJ.商品コード = SS.商品コード;
 
/* 確認 */
SELECT JJ.受注番号, KK.顧客名, SS.商品名,
JJ.受注個数, JJ.納品日
FROM 受注表 JJ, 顧客表 KK, 商品表 SS
WHERE JJ.顧客コード = KK.顧客コード
AND JJ.商品コード = SS.商品コード;

定義したビューから特定の行や列を出力することも出来ます。sample.21-2 は定義したv_受注から、受注個数が 100以上である行を選択し、その顧客名、商品名及び受注個数を出力するものです。

実行結果
顧客名 商品名 受注個数
──────────── ────── ───────
KUROKIYA JUICE 300
ONSIDE BEER 200
KUSHINANA BEER 150
ONSIDE WINE 110
KUROKIYA TEA 250
KUSHINANA BEER 135
KUROKIYA BEER 290
KUSHINANA BEER 175

標準規格として

標準SQL規格としては、SQL89から使用可能です。SQL92ではCHECK OPTION、LOCAL、CASCADEの機能拡張が行なわれています。SQL99では更に機能強化が計られ、一定条件下でビューから実表のデータの更新が可能になった。なお、SQL89においては、ビューを作成できるものの、DROPステートメントが無いため削除できません。

ビューの削除

ビュー削除の際に、以下のようにSQL文を記述します。(DROPステートメントの詳細)

DROP VIEW ビュー名;

実習課題

  1. 次のテーブルを以下の条件に合わせて表示するクエリを作ってみましょう。
  • 名前を一つのコラムに入れてfullnameと呼ぶ
  • Birthdateが2001-09-01より前の人だけを表示する
id first_name last_name email birthdate added
1 Bonnie Medhurst [email protected] 1999-07-26 1982-05-01 21:32:19
2 Vincenza Streich [email protected] 2006-01-30 2000-07-15 18:19:18
3 Carter Kilback do’[email protected] 1998-12-07 1998-08-14 06:13:52
4 Mariano Stroman [email protected] 1996-06-18 2008-04-06 14:43:43
5 Deondre Kerluke [email protected] 1994-04-10 2008-06-26 22:02:19
6 Gia Towne [email protected] 1988-07-13 1982-03-22 03:16:39
7 Margarett Beahan [email protected] 2008-01-22 2010-09-12 08:59:33
8 Gilda Brekke [email protected] 1981-09-18 2016-04-14 01:17:38
9 Zackary Cummerata [email protected] 2001-05-27 2003-05-23 21:18:54
10 Kory Wiegand [email protected] 2010-03-16 1992-03-22 04:14:31
11 Vinnie Zboncak [email protected] 2016-06-23 2014-12-29 20:55:25
12 Carmella Bogan [email protected] 1978-06-10 1993-01-17 08:43:08
13 Vance Rice [email protected] 1996-10-09 1999-09-14 15:27:08
14 Coleman Maggio [email protected] 1999-11-22 2001-05-01 05:42:36
15 Patricia Zieme [email protected] 1978-11-18 1987-07-21 18:44:25
16 Jada Beer [email protected] 1991-07-17 1997-10-08 09:41:57
17 Kianna Torphy [email protected] 1994-03-17 2011-11-20 20:15:40
18 Maegan Harvey [email protected] 1979-07-18 2010-10-06 20:52:03
19 Winona Welch [email protected] 1974-10-28 2010-09-02 22:05:57
20 Queen Mosciski [email protected] 1983-05-23 1985-10-09 08:51:49

CREATE VIEW scit_view AS
SELECT (first_name || last_name) AS fullname, email
FROM scit_user
WHERE birthdate < to_date('2001-09-01','YYYY-MM-DD');

SELECT fullname, email FROM scit_view;
  1. WHEREで決められた条件に合うアイテムが元のテーブルで変わると、ビューは変わりますか。
  2. Oracleを含めて、最近のデータベースシステムではビューのINSERTやUPDATE、DELETEなどもできますが、こういったDML操作ができない場合を考えてみましょう。

 

これは、Techscoreからの原文を加工して、発表のためにまとめた資料です。

 

ワサビマンゴUSB Type C Gen 2ケーブルの受領

ワサビマンゴUSB Type-A – Type-C Gen 2ケーブル

ワサビマンゴから今回新しく出したこのUSBケーブルはもともとUSB 3.0と呼ばれていた今の3.1 Gen 1を遥かに上回るGen 2という規格をサポートしています。

未だにGen 2をしっかりサポートしている機種もないが、こういうところこそ消耗品の仕事ではないかと思います。安く買えるアクセサリーがなければ、伝送規格の環境も整えるとは思えません。

確かに、後方互換もあるし、ただ携帯を充電するだけでも問題はありません。

 

とにかく、これを早速使ってみたいです。

コミュニティからもらったステッカーは、所属感を刺激しますね。

リサイズのせいで、文字が見られなくなりましたが、色々長所を書いてあります。いわゆる自己アピールというやつですね。

プラスティックバック以外に、中に包まれているものはありません。

すでに丈夫なので、投げられたら痛いかもしれません。

ケーブルの表面には80℃、30V、VW-1、USB 3.1 HIGH SPEEDと書かれてあります。

流石にケーブルのスペックを自慢するようで、頼もしいところがありますね。

Galaxy Note 8での高速充電メッセージが出ています。これはQC 2.0のみサポートしていて、Adaptive Chargeという機能を正品充電器で使えます。QCのバージョンに惜しいところはありますが、このケーブルには容易いものだったようです。

USBテスターに表示されている電力量は11Wです。

電圧とともに心臓の鼓動が速まりますが、今までのケーブルは電圧は上がっても、電流が落ちたので、イライラしていました。

特に、12Wぐらいでコネクター当たりが熱くなる下の銀色ケーブルに持っている失望に比べるものではなかったです。格が違います。

そして、引き出しから出したLumia 950を充電します。
主が忘れ気味で、いつも放置で電源が入らないくらいでした。

電圧が低いのは、Lumia 950で入れられなかったQC 技術です。

 

python

certbotなどでpythonからのモジュールエラーが出たときのチェックリスト

Letsencypt (certbot) 設定をアップデートしてから、この前にしたUbuntuの大規模システムアップデートがあれこれ壊したことに気づいた。

実はLinuxのほとんどの部分はpythonコードを支えていると言っても過言ではないほどだが(yumとapt-getを含めるらしい)、certbotも例外ではなかった。

ただ起動しただけなのに、よく働いていたアプリがこんな大変な状態になっていた。


:~$ sudo certbot
Traceback (most recent call last):
  File "/usr/bin/certbot", line 11, in 
    load_entry_point('certbot==0.21.1', 'console_scripts', 'certbot')()
  File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 561, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 2631, in load_entry_point
    return ep.load()
  File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 2291, in load
    return self.resolve()
  File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 2297, in resolve
    module = __import__(self.module_name, fromlist=['__name__'], level=0)
  File "/usr/lib/python3/dist-packages/certbot/main.py", line 10, in 
    import josepy as jose
  File "/usr/lib/python3/dist-packages/josepy/__init__.py", line 41, in 
    from josepy.interfaces import JSONDeSerializable
  File "/usr/lib/python3/dist-packages/josepy/interfaces.py", line 8, in 
    from josepy import errors, util
  File "/usr/lib/python3/dist-packages/josepy/util.py", line 4, in 
    import OpenSSL
  File "/usr/lib/python3/dist-packages/OpenSSL/__init__.py", line 8, in 
    from OpenSSL import crypto, SSL
  File "/usr/lib/python3/dist-packages/OpenSSL/crypto.py", line 16, in 
    from OpenSSL._util import (
  File "/usr/lib/python3/dist-packages/OpenSSL/_util.py", line 6, in 
    from cryptography.hazmat.bindings.openssl.binding import Binding
  File "/usr/lib/python3/dist-packages/cryptography/hazmat/bindings/openssl/binding.py", line 156, in 
    Binding.init_static_locks()
  File "/usr/lib/python3/dist-packages/cryptography/hazmat/bindings/openssl/binding.py", line 137, in init_static_locks
    cls._ensure_ffi_initialized()
  File "/usr/lib/python3/dist-packages/cryptography/hazmat/bindings/openssl/binding.py", line 124, in _ensure_ffi_initialized
    cls.lib = build_conditional_library(lib, CONDITIONAL_NAMES)
  File "/usr/lib/python3/dist-packages/cryptography/hazmat/bindings/openssl/binding.py", line 84, in build_conditional_library
    if not getattr(lib, condition):
AttributeError: cffi library '_openssl' has no function, constant or global variable named 'Cryptography_HAS_MEM_FUNCTIONS'

cffi library ‘_openssl’ has no function, constant or global variable named ‘Cryptography_HAS_MEM_FUNCTIONS’

普段の場合、関数でエラーが発生し、ライブラリーをインストールするだけで解決になるはずだが、

$ pip install cryptography

今はどうやら、pipの中の問題ではなさそうだ。cryptographyを何度もインストールしなおしても解決の見込みはない。

-Uオプションで強制アップデートをしても変化はなかった。

そして、python 2.7とpython3という表記に注目をした。すでに2.7と3で、3.5まで様々なバージョンが共存している今の状態を考えると、これは不思議なことでもない。

pipの起動ファイルはpython 2.7に対しての設定しか行われないが、certbotはpython 3で起動するため、次のようなスクリプトになっている。

#!/usr/bin/python3
# EASY-INSTALL-ENTRY-SCRIPT: 'certbot==0.21.1','console_scripts','certbot'
__requires__ = 'certbot==0.21.1'
import re
import sys
from pkg_resources import load_entry_point

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
    sys.exit(
        load_entry_point('certbot==0.21.1', 'console_scripts', 'certbot')()
    )

それで、問題が見えてきた。pipが2.7のpythonにモジュールを無意味にインストールしたり、アンインストールしたりを繰り返していたのだ。

これでは、python 3の問題は全然解決にならない。

$ sudo apt-get install python3-setuptools
Reading package lists... Done
Building dependency tree
Reading state information... Done
Suggested packages:
  python-setuptools-doc
The following NEW packages will be installed:
  python3-setuptools
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 215 kB of archives.
After this operation, 944 kB of additional disk space will be used.
Get:1 http://ppa.launchpad.net/certbot/certbot/ubuntu xenial/main amd64 python3-setuptools all 33.1.1-1+certbot~xenial+1 [215 kB]
Fetched 215 kB in 1s (109 kB/s)
Selecting previously unselected package python3-setuptools.
(Reading database ... 109834 files and directories currently installed.)
Preparing to unpack .../python3-setuptools_33.1.1-1+certbot~xenial+1_all.deb ...
Unpacking python3-setuptools (33.1.1-1+certbot~xenial+1) ...
Setting up python3-setuptools (33.1.1-1+certbot~xenial+1) ...

easy_install python3 バージョンをインストールするためには、ubuntuでこのようなコマンドが必要だ。インストールしたばかりのeasy_install3を使って、pipも一緒にインストールしよう。

$ sudo easy_install3 pip
Searching for pip
Reading https://pypi.python.org/simple/pip/
Downloading https://pypi.python.org/packages/11/b6/abcb525026a4be042b486df43905d6893fb04f05aac21c32c638e939e447/pip-9.0.1.tar.gz#md5=35f01da33009719497f01a4ba69d63c9
Best match: pip 9.0.1
Processing pip-9.0.1.tar.gz
Writing /tmp/easy_install-wmqoi3hf/pip-9.0.1/setup.cfg
Running pip-9.0.1/setup.py -q bdist_egg --dist-dir /tmp/easy_install-wmqoi3hf/pip-9.0.1/egg-dist-tmp-b7xxe23x
warning: no previously-included files found matching '.coveragerc'
warning: no previously-included files found matching '.mailmap'
warning: no previously-included files found matching '.travis.yml'
warning: no previously-included files found matching '.landscape.yml'
warning: no previously-included files found matching 'pip/_vendor/Makefile'
warning: no previously-included files found matching 'tox.ini'
warning: no previously-included files found matching 'dev-requirements.txt'
warning: no previously-included files found matching 'appveyor.yml'
no previously-included directories found matching '.github'
no previously-included directories found matching '.travis'
no previously-included directories found matching 'docs/_build'
no previously-included directories found matching 'contrib'
no previously-included directories found matching 'tasks'
no previously-included directories found matching 'tests'
creating /usr/local/lib/python3.5/dist-packages/pip-9.0.1-py3.5.egg
Extracting pip-9.0.1-py3.5.egg to /usr/local/lib/python3.5/dist-packages
Adding pip 9.0.1 to easy-install.pth file
Installing pip script to /usr/local/bin
Installing pip3 script to /usr/local/bin
Installing pip3.5 script to /usr/local/bin

Installed /usr/local/lib/python3.5/dist-packages/pip-9.0.1-py3.5.egg
Processing dependencies for pip
Finished processing dependencies for pip

うまくインストールが完了したら、シェルで起動できるか確かめてみる。

$ which pip3
/usr/local/bin/pip3

このように、バイナリーの絶対パスをしっかり表示してくれている。

pip3コマンドを通じて、cryptographyモジュールも一緒に設定すると一件落着だ。バージョンで騒ぎにならないように、Uオプションも忘れずに入れて進もう。

$ sudo pip3 install -U cryptography
The directory '/home/yeon/.cache/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
The directory '/home/yeon/.cache/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
Collecting cryptography
  Downloading cryptography-2.1.4-cp35-cp35m-manylinux1_x86_64.whl (2.2MB)
    100% |████████████████████████████████| 2.2MB 451kB/s
Collecting idna>=2.1 (from cryptography)
  Downloading idna-2.6-py2.py3-none-any.whl (56kB)
    100% |████████████████████████████████| 61kB 3.7MB/s
Collecting asn1crypto>=0.21.0 (from cryptography)
  Downloading asn1crypto-0.24.0-py2.py3-none-any.whl (101kB)
    100% |████████████████████████████████| 102kB 3.1MB/s
Collecting cffi>=1.7; platform_python_implementation != "PyPy" (from cryptography)
  Downloading cffi-1.11.4-cp35-cp35m-manylinux1_x86_64.whl (419kB)
    100% |████████████████████████████████| 419kB 833kB/s
Requirement already up-to-date: six>=1.4.1 in /usr/lib/python3/dist-packages (from cryptography)
Collecting pycparser (from cffi>=1.7; platform_python_implementation != "PyPy"->cryptography)
  Downloading pycparser-2.18.tar.gz (245kB)
    100% |████████████████████████████████| 256kB 1.8MB/s
Installing collected packages: idna, asn1crypto, pycparser, cffi, cryptography
  Found existing installation: idna 2.5
    Uninstalling idna-2.5:
      Successfully uninstalled idna-2.5
  Found existing installation: asn1crypto 0.22.0
    Uninstalling asn1crypto-0.22.0:
      Successfully uninstalled asn1crypto-0.22.0
  Running setup.py install for pycparser ... done
  Found existing installation: cryptography 1.9
    Uninstalling cryptography-1.9:
      Successfully uninstalled cryptography-1.9
Successfully installed asn1crypto-0.24.0 cffi-1.11.4 cryptography-2.1.4 idna-2.6 pycparser-2.18

なにか、うまく進行できている。

$ sudo certbot
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx

Which names would you like to activate HTTPS for?
-------------------------------------------------------------------------------

以降、何もなかったのように、動作できている。

Oracleでの管理者パスワード探しとアカウントのロック解除

突然現れたORA-28000エラー。もしくは、ORA-01017 invaild username/passwordというメッセージを見たら? system権限だけが頼りになるはずだ。

WindowsでのOracle環境を前提として書いたものである。

アカウントがロックされました!

SQL> conn ID/パスワード
ERROR:
ORA-28000: the account is locked

このようなエラーが発生して、何の動作もできなくなる場合がある。

これは、連続でパスワードを間違ったときにアカウントがロックされるようになったからである。

こういう場合は、システムアカウントに接近して、解除する必要がある。

システムパスワードも知りません!

SQL> conn system
Enter password:
ERROR:
ORA-01017: invalid username/password; logon denied

一難去ってまた一難。この時はsysdba権限が対策として有効だ。

パスワード無しで入れるのが、不思議なことだが、OSでアドミン権限でログインされていれば、動作できるという。

システムの制御を乗っ取られたら、DBも一緒に無くさないように、sysdba権限に対する追加設定があとで必要になりそうだ。

次のようにしたのである。

SQL> conn /as sysdba
Connected.

結構簡単なものだった。

忘れたパスワード、変えらますか?

次に、それぞれのパスワードの設定をしよう。

SQL> alter user system identified by 새로운비밀번호;

User altered.

こういう方法で、新しいパスワードに設定はできる。systemのところに、hrなどアカウントを入れれば、すぐにパスワードは変更できる。

SQL命令と似たような気がする。

そして、ロックはどう解除するつもりですか?

少々お待ちを。はたして、アカウントは本当にロックになっているのか?次の命令でわかることができる。

SQL> select username, account_status, lock_date from dba_users

結果は長いから、わざと載せないようにした。

SQL> alter user hr account unlock;

User altered.

こうやって、hrアカウントのアンロックはできたのだ。

結論

  • パスワードは忘れないこと。
  • ロックにならないように、DBのアクセスも難しくしよう。
  • 絶対アドミンアカウントでOracleコンソールを開けないようにするか、sysdbaのセキュリティ設定を変えよう。

WebSocket 今日の困惑事例

ブラウザのデベロッパーツールを見ると、まず見えるのはインスペクター機能ですが、それ以外にもネットワークという実用的なタップがあります。

主に、アプリを作るとき、ウェブの情報を持ち出すにはHTMLの要素を分析するのも方法の一つですが、スクリプトを通じてリアルタイムで情報を非同期で持ち出すことの方も珍しくないからです。

特に、有益な情報はスターチックの場合はあまりありません。

 

この場合、ネットワークでは特に何も見つかったHTTPパケットがないのに、活発にデータの更新が行われることがあります。

最近、流行っている仮想貨幣の価値はリアルタイムそのものではないと、まったく意味がありません。リフラッシュなしに、すぐに確認できますね。

これは、HTTPコネクションを通じて非同期でダウンロードは負担が高いので、HTML5で導入されたWebSocketというものが使われているそうです。

WebSocketはコネクトの待機時間とヘッダーの伝送が不要になるため、素早くリアルタイムで情報を受信するのに向いています。

こういう流れとともに、ブラウザでのサポートツールも増えています。

Chromeは代表的な事例で、Canaryから披露した機能はもう正式バージョンにも載せられ、WebSocketの分析は今すぐできます。

しかし、その画面には何もありません

 

 

Nothing Here
Nothing Here

これをどうすればいいでしょうか。

Chromeのインストールがうまくできてないのか、そう悩むしかありませんで敷いた。

Firefoxもネット上では可能だと書かれておりますが、最新バージョンに合わないので、プラグインのインストールができませんでした。

そして、ついにたどり着いた「今回のオチ」は次のようになります。

 

 

Chrome Dev Tools WebSocket
Chrome Dev Tools WebSocket

出所: https://stackoverflow.com/questions/44533111/chrome-59-websocket-frames-no-longer-visible-in-devtools

 

もう言葉が必要ありません。無事で、データの分析を終えました。

 

これからの問題はこれをどうやってクライアントから接続するかですね。

できたら、ここに方法を整理してみましょう。

 

갑자계산

C#で干支の計算式を建ててみよう

干支 : 十干と十二支を組み合わせた60を周期とする数詞です。

始まり

60の干支を並んだ資料は簡単に手に入れますが。これを直接計算する方法について押してくれる資料はあまりありません。

最近はJavaばかり学んでいるカリキュラムなので、もともとしていたC#をすべて忘れては困るので、C#の知識と経験を少しでも生かしてみないとと思いました。

それで、タイムアタックのように挑んでみました。目標は三十分です。

アプローチ

数学的に美しい方法を探るのもいいことですが、アレイの特徴を活用することにしました。

いつ見ても、また理解できるし、難しくないコードがいいですね。

まず、干支をアレイとして書いてみます。

static string[] gap = new string[] { "갑", "을", "병", "정", "무", "기", "경", "신", "임", "계" };
static string[] ja = new string[] { "자", "축", "인", "묘", "진", "사", "오", "미", "신", "유", "술", "해" };

ほら、簡単ですね。

具現

年度を干支に変換

연도를 간지로 바꿔봅시다. 생각하기 편하게 올해(2017, 정유년)를 기준으로 생각해봅니다.

올해와 목표년도의 차이를 구하고 단순히 각각의 배열 길이로 나누어 나머지를 구하면 됩니다. 그 다음 올해의 간지만큼 더해주면 끝이죠.

하지만 여기서 의외로 연도를 간지로 바꾸는데는 구현에 약간의 애를 먹었는데, 앞으로는 문제 없이 구하는데 거꾸로는 엉뚱한게 나왔던 것입니다.

고민하다가 원인은 음수 처리에 있었다는 걸 알았습니다.

private static string YearToGapja(int i) {
            int cha = i - 2017;
            //기준점을 2017년으로 잡아봅니다.
            int gap_cha = cha % gap.Length;
            int ja_cha = cha % ja.Length;

            gap_cha = (gap_cha + 3) % gap.Length;
            ja_cha = (ja_cha + 9) % ja.Length;

            if (gap_cha < 0) {
                gap_cha = gap.Length + gap_cha;
            }
            if (ja_cha < 0) {
                ja_cha = ja.Length + ja_cha;
            }

            return gap[gap_cha] + ja[ja_cha];
        }

음수 처리로 한 번 더 길이를 더해주면 끝에서부터 음수로 세어간 위치를 구할 수 있습니다. 이렇게 하면 몇 년이고 틀리지 않고 다 구할 수 있죠.

아, 여기서 옥에티가 있군요. 기원전을 지원하는 것입니다. 그냥 해서는 0년이 포함되어버리죠.

private static int MinusToBC(int i) {
    if(i < 0) { //
       return ++i;
    }else if(i == 0) {
       return int.MinValue;
    }
    return i;
}

이렇게 음수에 한해서는 입력값을 실제보다 1 더해주면 됩니다.

0을 입력한 경우를 별도로 구분하기 위해 int.MinValue로 넣어줬습니다. 이는 Int32 범위의 최하 숫자를 가져올 수 있는데, 이걸로 무효한 숫자로 처리하면 크게 유용성에 간섭받지 않고 잘 확인할 수 있습니다.

int.MinValue와 같으면 계산을 포기한다는 구절을 넣는 것으로 충분하죠.

한편, Console.ReadLine()을 통해 입력값을 받는 만큼, 이것이 유효한 숫자인지 판별할 필요가 있습니다.

do {
    Console.Write("희망 서력 년도(기원전=>마이너스) 또는 갑자 입력: ");
    input = Console.ReadLine();
} while ((!int.TryParse(input, out i) && !isGapja(input)) || input == "0");

이를 통해 input이 숫자가 아니거나, 갑자가 아닌 경우 또는 0을 입력한 경우 모두 다시 읽으려고 시도하겠군요.

int.TryParse는 Parse 실패시에 out i 값이 0이라고 합니다.

private static bool isGapja(string input) {
            if (input.Length == 2) {
                if(!(gap.Contains(input[0].ToString()))) {
                    return false;
                }
                if (!(ja.Contains(input[1].ToString()))) {
                    return false;
                }
                return true;
            }
            return false;
        }

위에서 등장한 IsGapja라는 함수를 만들어두면 반복문을 돌 때 input의 간지 유효성을 확인하고 실제 갑자를 갖고 있는지 확인할 수 있습니다.

결과 확인

여기까지 하면 결과가 시원하게 나옵니다.

희망 서력 년도(기원전=>마이너스) 또는 갑자 입력: 2017
결과: 정유

희망 서력 년도(기원전=>마이너스) 또는 갑자 입력: 2002
결과: 임오

희망 서력 년도(기원전=>마이너스) 또는 갑자 입력: 1988
결과: 무진

와우. 이렇게 하였더니 목표 30분보다 10분 빠르게 끝났네요.

하지만 15분 냉장고를 부탁해 컷에는 실패했습니다. 다음에는 분발합시다!

간지를 연도로

그 다음으로 간지를 연도로 변환해보겠습니다. 60년마다 돌아오니까 환갑이라고 하죠. 아무래도 여러 번 있을 것이고, 시작 년도와 끝 년도도 중요하겠죠.

유연한 적용을 위해서 일부러 시작 년도와 끝 년도를 매개변수로 받았습니다.

그리고 이제 끝없는 고민을 합니다. 위의 간지 변환 사례를 역으로 방정식을 세우면 그만일까요?

아무래도 머리가 핑핑돌고 문제가 생겼을 때 어떤 방식을 써야할지 수알못에게 두려움이 비칩니다.

이럴 때는 컴퓨터를 믿고 왕도를 걸어보기로 합니다. 사실 목표 간지와 기준 간지의 차이만큼을 알고 있으면 그 +/- 60만 반복하면 결과가 됩니다.

그러나 목표 간지와 기준 간지 차이를 구하기엔, 쉽지 않습니다. 계산식을 더 많이 고민하면 되겠지만요.

수학자가 아닌 프로그래머에겐, 코드가 더 많은 답을 줍니다.

private static string[] EnumGapja() {
            string[] s = new string[60];
            for(int i = 0; i < 60; i++) {
                s[i] = gap[i % gap.Length] + ja[i % ja.Length];
            }
            return s;
        }

이렇게 하면 위 전역변수를 활용하여 60갑자가 뚝딱 완성됩니다.

나머지가 끊임없이 찬조출연하더군요.

private static int[] GapjaToYear(string input, int min, int max) {
            string[] eg = EnumGapja();
            int ifrom_gapja=Array.IndexOf(eg, input);

            //서기 4년은 갑자년.
            //4*60n=갑자
            //4*60n+ifrom_gapja=갑자+ifrom_gapja
            List ilist = new List();
            for (int i = 4 + ifrom_gapja; i < max; i+=60) {
                if(i < min) {
                    continue;
                }
                ilist.Add(i);
            }

            return ilist.ToArray();
        }

이제 한없이 길어지던 코드가 한결 간결해졌습니다.

단순히 60갑자 목록에서 index의 차이만 알게 되는 것으로 추가해야할 년도를 알 수 있습니다.

갑자년이 서기 4년이라고 합니다. 이 갑자년과의 차이 = index라는 걸 쉽게 예측할 수 있으니까요.

min년부터 max년까지 반복문을 돌리면 그만이겠습니다.

희망 서력 년도(기원전=>마이너스) 또는 갑자 입력: 무자
28년 88년 148년 208년 268년 328년 388년 448년 508년 568년 628년 688년 748년 808년 868년 928년 988년 1048년 1108년 1168년 1228년 1288년 1348년 1408년 1468년 1528년 1588년 1648년 1708년 1768년 1828년 1888년 1948년 2008년 2068년 2128년 2188년 2248년 2308년 2368년 2428년 2488년 2548년 2608년 2668년 2728년 2788년 2848년 2908년 2968년 3028년 3088년 3148년 3208년 3268년 3328년 3388년 3448년 3508년 3568년 3628년 3688년 3748년 3808년 3868년 3928년 3988년 4048년 4108년 4168년 4228년 4288년 4348년 4408년 4468년 4528년 4588년 4648년 4708년 4768년 4828년 4888년 4948년 5008년 5068년 5128년 5188년 5248년 5308년 5368년 5428년 5488년 5548년 5608년 5668년 5728년 5788년 5848년 5908년 5968년 6028년 6088년 6148년 6208년 6268년 6328년 6388년 6448년 6508년 6568년 6628년 6688년 6748년 6808년 6868년 6928년 6988년 7048년 7108년 7168년 7228년 7288년 7348년 7408년 7468년 7528년 7588년 7648년 7708년 7768년 7828년 7888년 7948년 8008년 8068년 8128년 8188년 8248년 8308년 8368년 8428년 8488년 8548년 8608년 8668년 8728년 8788년 8848 년 8908년 8968년 9028년 9088년 9148년 9208년 9268년 9328년 9388년 9448년 9508년 9568년 9628년 9688년 9748년 9808년 9868년 9928년 9988년

:)

전체 소스

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Gapja {
    class Program {
        //4 5 6 7 8 9 0 1 2 3
        static string[] gap = new string[] { "갑", "을", "병", "정", "무", "기", "경", "신", "임", "계" };
        static string[] ja = new string[] { "자", "축", "인", "묘", "진", "사", "오", "미", "신", "유", "술", "해" };
        static void Main(string[] args) {
            //2017 = 정유년 = 4/9

            while (true) {
                string input = ""; int i = 0;
                do {
                    Console.Write("희망 서력 년도(기원전=>마이너스) 또는 갑자 입력: ");
                    input = Console.ReadLine();
                } while ((!int.TryParse(input, out i) && !isGapja(input)) || input == "0");
                i = MinusToBC(i);
                if(i != int.MinValue) {
                    Console.WriteLine("결과: {0}", YearToGapja(i));
                } else {
                    var result = GapjaToYear(input, 1, 10000);
                    foreach(var r in result) {
                        Console.Write("{0}년 ",r);
                    }
                }
                Console.WriteLine();
            }
        }

        private static bool isGapja(string input) {
            if (input.Length == 2) {
                if(!(gap.Contains(input[0].ToString()))) {
                    return false;
                }
                if (!(ja.Contains(input[1].ToString()))) {
                    return false;
                }
                return true;
            }
            return false;
        }

        private static int MinusToBC(int i) {
            if(i < 0) { //
                return ++i;
            }else if(i == 0) {
                return int.MinValue;
            }
            return i;
        }

        private static string YearToGapja(int i) {
            int cha = i - 2017;
            //기준점을 2017년으로 잡아봅니다.
            int gap_cha = cha % gap.Length;
            int ja_cha = cha % ja.Length;

            gap_cha = (gap_cha + 3) % gap.Length;
            ja_cha = (ja_cha + 9) % ja.Length;

            if (gap_cha < 0) {
                gap_cha = gap.Length + gap_cha;
            }
            if (ja_cha < 0) {
                ja_cha = ja.Length + ja_cha;
            }

            return gap[gap_cha] + ja[ja_cha];
        }

        private static string[] EnumGapja() {
            string[] s = new string[60];
            for(int i = 0; i < 60; i++) {
                s[i] = gap[i % gap.Length] + ja[i % ja.Length];
            }
            return s;
        }

        private static int[] GapjaToYear(string input, int min, int max) {
            string[] eg = EnumGapja();
            int ifrom_gapja=Array.IndexOf(eg, input);

            //서기 4년은 갑자년.
            //4*60n=갑자
            //4*60n+ifrom_gapja=갑자+ifrom_gapja
            List ilist = new List();
            for (int i = 4 + ifrom_gapja; i < max; i+=60) {
                if(i < min) {
                    continue;
                }
                ilist.Add(i);
            }

            return ilist.ToArray();
        }
    }
}
Servers

VPSを考慮する理由、経済的なVPSは?

このブログでは韓国の場合を想定しています。例示や説明が日本と合わない部分にご注意ください。

Webホスティングが万能ではないこと

Webホスティングはなかなか単純なサービスです。ただ、サイトが欲しいと思ってホスティングサービスに申し込めば、安い価格でセッティングしてくれます。

例えば、韓国のホスティングサービスであるCafe24の場合には申し込み代がありますが、月に約50円くらいです。FTPで接続して、ファイルさえアップロードしたら、ホームページの出来上がりです。

この過程も省略するため、WordpressやゼロボードXE、他の掲示板ソフトもサポートしてくれるサービスが少なくありません。こういう場合、キーボードをあまり叩かなくても早速サイトの完成ですね。

ところが、そうして自慢の自己紹介サイトを作り上げたKさん…(いきなり実例の登場?)
彼はディスクの容量だけを考えて、最低プランでWebホスティングを申し込んだ後、自分のポートフォリオサイトでアップロードして、面接の履歴書をあちこちに叩き込んで、就職活動に突入しました。

ある日、就職コミュを訪れたKさん。

ある企業の担当者の共有で自分のサイトが優秀事例として書かれておりましたので、誰にも知られずに喜んでいました。
そして、それから数時間後、たった四つ目のコメントで思ってもみなかった内容を目にすることになりました。

入れませんが。

あれ?として、自分のポートフォリオのサイトを入ってみたら、迎えてくれたのはこのページでした。

Cafe24のトラフィック超過のお知らせ
Cafe24のトラフィック超過のお知らせ

あたふたプランのアップグレードのために比較してみると、なんと、価格は月に数千円ぐらいに急上昇します。トラフィックのリセットもあまり安い方法ではありません。

十分なトラフィックと余裕のあるスペース、この二つを狙うには、やはり家の中の個人サーバーでしょうか。
そしたら、電気代はどうなるんでしょうか。

VPSは少しスマートであればメリットあり

そういうKさんは知り合いからVPS1のことを聞きました。VPSというのも初めてなのに、聞いてみれば、リモートに自分のサーバーが一つできるらしいですね。

Hostingサーバーとは何が違うかとしたら、これは完全にパソコン1個ができるそうです。

月に数万円から十万円もするサーバーホスティングとは違って、これはサーバーを分けてまたサーバーにする仕組みです。

サーバーを一つのコンピューターのの中で分けられるのは、仮想化技術の進歩に秘密があります。
パソコンの中のパソコンでコマンドを別途に処理しなければならなかった過去とは違って、CPUと主な装置が最初から仮想化に備えて作られているので、性能の損失を最少2にするそうです。

サーバーを借りるのだから、価格も半端ではないと思いますが、サーバーは自分の好きなままに使えるので、場合によっては有利なところがあります。特に、基本トラフィック提供量が少なくないことが魅力です。

繰り返して説明することになりますが、最初のトラフィック容量だけでも、ほとんどのWeb Hostingサービスの最高プランに匹敵します。3

しかしVPSが全員の答えではないこと

たしかに、コストパフォーマンスがいいというのは分かるものの、だとして特に知識を持ってない人がVPSから持つことになったら、接続から戸惑うことになります。

やっと接続しても、インストール直後のUbuntu4の黒い画面は困惑そのものです。

せめて、Windowsのインストールは何度かしていて、コンピューターとソフトに関した概念がある程度ある人なら、コマンド5と関連ソフトに慣れることで熟達できるようです。(いつも忘れてしまうことがみんなの問題ですね)

 

だから、黒い画面でLAMP(Linux+Apache+MySQL/MariaDB+PHP)あるいはLEMP(Linux+nginX+MySQL/MariaDB+PHP)の構成はできなくちゃですね。もちろん、これについての講座はいろいろありますので、従うことでなかなか手軽にできます。

ただし、問題解決でまた挑戦になると思います。きっとPermisson(権限)問題がみんなを苦しめることになります。
それ以外にも、問題の原因を把握するのに苦労するとしたら、サーバーを運用しようとしてから、習うことばかりになったと苦情が増えるかもしれません。

主なサービス会社の比較

実はVPSのサービスは世の中に多くあり、下のサービスよりよくて、メジャーな会社もあるでしょう。

しかし、どこまでも自分の意見を披露するため、直接解説してみた(お金がかかった)所だけを並べました。

ConoHa

VPS Conoha
VPSならコノハ!
모에한 미유키
萌え萌え美雲このは

conoha.jp
萌えページ6

コノハは日本のGMOインターネット株式会社で運営している仮想サーバーホスティングサービスです。親企業も丈夫だとのことで、ここはなによりも無制限トラフィック7が特徴です。

グロバル営業も活発になっていて、韓国語も当然のようにホームページと管理コンソールでサポートしております。

しかし、用途以外の使用か、DDoS攻撃の的になったら、一方的にサービスが解除されるし、これを解決するにはすごく難しいと言われます。

それに、メールで日本語と英語の問い合わせもできますが、韓国人には高い壁となるのは電話での日本語ですね。

100Mbpsの回線のみ使用されていますので、少々残念なところです。でも、Pingとサーバー演算はまた回線とは別の問題です。

変にドンくさいところがあります。東京を選んでもそうです。それに、これが時間により変わってくるのが、オーバーブッキング8が疑われる部分があります。

利用金額はクレジットでチャージするか、クレジットカードをリンクできます。

サーバーをオフにしても、維持費用が同じくかかります。

ConoHa 컨트롤 패널
ConoHa コントロールパンネル
ConoHa Japan Plan
ConoHa Japan Plan

メリット

  • CPU 快適
  • 贅沢なトラフィック
  • オタク向けのデザインあり(別のメニュー)。 オタクではない人は普通のメニューが基本。

デメリット

  • 不思議な遅さ。不定の接続スピード、高いPing
  • 問い合わせ、問題の解決が難しい。親切なのに事務的な職員
  • 機能が多いようで、実は少ないウェブコンソール。APIを利用したらできることは多い方だが、入門者には向いていない
  • リモートビュー(リモート サーバー グラフィック 表示)なし。SSH不具合でもあったら接続不能。

ぶっちゃけ、オタク向けかどうかよりはスピードが大事でしょう?

Vultr

Vultr
Vultr

vultr.com

Vultrは他のVPSサービスより歴史は短い方ですが、長いアップタイムで高い信頼度を誇っています。

問題があったら、すぐに保障のクレジットをくれるし、普段から勧誘者リンクで、Paybackも可能なお得な政策を持っています。

リンクを通じて申し込むと両方割引してくれたごろもありましたが、今は特にイベントがないようです。サイトを直接見てください。

管理コンソールは簡単で、必須要素全部含んでいます。

Snapshotセーブに課金がありませんし、リミットも特に決まっておりません。サーバーのインスタンスを複製するにも使えるし、問題があったとき、Rollbackする一番容易い方法です。Snapshotの生成と適用(復元)も5分ぐらいで終わるくらいです。

10Gbpsの速い回線でサービスしているので、全世界に広まっているサーバーどこでも選んで作ればいいです。

New Jerseyでは無料でブロック ストレージを提供しています。ブロック ストレージをリンクすると追加ハードディスクを繋げたように、拡張できて、データも安全に保管できます。

東京のサーバーもありますので、ConoHaと同じく使用できます。しかし、ここも回線は速いのに、サーバーのオーバーブッキングが疑われます。回線の状態はテストサイトで直接確認できます。

利用金額はクレジットをチャージするか、クレジットカードを使えます。

サーバーをオフにしても、課金されます。

メリット

  • 楽な管理者コンソール
  • 贅沢なクレジットカード提供。ダウン時間の保障
  • Web上でサーバーグラフィックコンソールの提供
  • スナップショットの生成可能。リミット無し

デメリット

  • 我慢できるほど遅い
  • 東京地域の高い使用率、低いサーバー準備率(オーバーブッキングの予測できるAvailability Low表示)
    • 太平洋渡って、アメリカ東部のNew Jerseyと変わらない時もあるくらい

Somagu

Somagu
Somagu

somagu.com

SomaguはMudfishを運営しているミクラジネットワークスという会社を建ててから、カスタムVPSサービスを2017年始めました。

淡々なデザインと機能に比べて、NoVNCなどいろいろな方法でサーバーをコントロールできるようにしています。高性能にオプションを上げても、高い費用を要求しません。趣味でしょうかね

信頼できる韓国のISPであるKTの回線で、スピードは快適な方です。

サーバーの場所が田舎だと言われていて、運営者とも距離があるそうです。フォーラムでの問い合わせの回答は三日以上かかるのが自然です。

これにもメリットがありますが、管理UIにない機能でも、納得できるくらいなら、直接見てくれるところです。潜在なカスタマイズが必要ならば、こちらも是非使ってみることです。対応言語は韓国語と英語です。

メリット

  • コストパフォーマンスの優れているところ
  • 韓国では最適なスピード (KT網)
  • Tossでクレジットが買える

デメリット

  • 遅い問い合わせの対応
  • 不安なアップタイム、電気問題
    • 地域が田舎なため、余儀なく点検したり、あまり無誠意な電気会社の製作。
    • 一部のサーバーに問題が続いていて交換中なので、一時的にハイクラスのプランがなくなっている
  • 管理機能の不便
    • スナップショット生成無し
    • 管理コンソールではパソコンのオンオフ、リモートアクセス情報提供くらいがすべて
  • スイッチを通るのに、独立した気がしない
    • 同じ外部ポートを複数のユーザーが使えない
    • 20個に限られたポート数
    • 80 / 443はHTTP仮想ホスト方式でマップ (Webサーバーとして問題なし)
    • すべてのコネクションは10.0.0.1だと表示。訪問者の見分け不能。(X-Forwardedもない)

IwinV

IwinV
IwinV

iwinv.kr

2002年から始めて、長年発展し続けていたノーハウを持っている会社で、2014年赤字のアイビホストも引き受けるなど、積極的にビジネスの領域を広めています。VPSはiwinvというところで管理しています。

このサービスの利点は幅広いオプション、安い価格です。

メリット

  • 仮想コアー、リアルコアー、独占コアー三つの分類になっている詳細スペック
    • 仮想コアーとは、CPU Coreを仮想でまた分けたのであって、多数のユーザーに提供するための方法です。他の使用者のコアー使用率により、パフォーマンスは違います。
    • リアルコアーの使用はCPUが仮想化による性能の損失(10%以内だと言う)のみに限られ、他ユーザーに関係なく利用できます。9
    • 独占サーバーが当然もっとも高いが、他者より安い方
  • ポートの開放、リソース現状の把握などをして異常状態のお知らせができる
    • ただし、テキストは発想費用があるので、Telegramが進められます。

デメリット

  • あまりプロモーションがないこと

結論

VPSというのが安くなり、可視化されたばかりなので、なかなか情報を得ることは難しいと思います。

しかし、Linuxに前より馴染んで、大型サーバーに依存しない自分だけのセキュリティー対策を工夫するには、もう避けられない流れだと思います。

なのに、それはどこまでも自分に合うかどうかを確かめてから決めることでしょう。数人がそろって、一つのVPSに挑んでみることも柔軟な使用方だと思います。

現時点ではこのサイトはIwinVを使用しております。

Galaxy Note 7

[翻訳]aptX vs. aptX HD: 何が違う?

3.5mm ヘッドホンプラグが絶滅の寸前の今、aptX HDが変化を見出します。

Bluetoothについて読んだ人なら、数多い英語と数字で秘密まみれのスペックに呆れたはずです。この中から、一番最新のものはaptX HDですが、変な名前の後にHDが付いています。HDが高鮮明だというのは皆様もご存じだと思いますが、ではaptXは何でしょうか。aptX(高鮮明を含めて)がaptX HDとは何が違うでしょうか。

こういうことが気になるのはあなただけではありません。一緒に調べましょう。

aptXとは何?

hbs910
hbs910

aptXは352Kbpsで4:1圧縮率で16ビット/44.1kHzのオーディオとの伝送ができるBluetoothオーディオコーデックです。

あまり役に立つ内容ではありませんが、これが皆様の気になるaptXのスペックです。これは(皆様の携帯やパソコン、A/Vレシーバー、その他のBluetoothオーディオの伝送可能な)デバイスがオーディオを“CD水準”音質で伝送するということです。オリジナルのサウンドがCD音質以上なら、サウンドはより豊かに聞こえます。

もともとのaptXコーデックはCD水準の音質を約束して、それにほぼ同じく到達しました。

CD音質と“CD水準”音質の違いに注目することです。これは圧縮のためにできた表現です。aptXは他のBluetooth オーディオ コーデックのように、オーディオを送って装置(皆様のヘッドホンや他のスピーカー)でを受け取るに圧縮と解除が使用されます。データを圧縮して送らなければならない理由は、Bluetoothがステレオ オーディオの伝送には十分に速くないからです。aptXコーデックは音の遅延を減らすのに重点を持ちました。

음질과 “CD 수준” 음질의 차이에 주목하세요. 이는 압축때문에 생긴 표현입니다. aptX는 다른 블루투스 오디오 코덱처럼, 오디오를 보내고 장치(여러분의 헤드폰이나 다른 스피커)에서 받는 재생 과정에 압축과 압축 해제를 사용합니다. 데이터를 압축하고 전송해야 하는 이유가 있는데, 그것은 바로 블루투스가 스테레오 오디오 전송을 하기에 충분히 빠르지 않기 때문이란 점입니다. aptX 코덱은 소리 지연을 줄이는데 중점을 두었는데, 지연이란 소리를 보낸 후 들을 때까지 걸리는 시간을 말합니다.

음악을 듣는다면, 지연은 크게 문제가 되지 않습니다. 폰을 쓰면서 헤드폰에 상당항 딜레이가 있더라도 눈치채지 못할 수 있습니다. 하지만 동영상을 본다면 확실히 얘기가 달라집니다. 영상이 약간 구닥다리 더빙처럼 느껴지고 배우들의 립싱크가 맞질 않는 걸 쉽게 느낄 수 있습니다.

続きを読む

PocoTube on Omnia II

PocoTube (2010)

PocoTube on Omnia II
Omnia2 PocoTube App

オフライン状態で、選択した路線での電車の位置を教えてくれるWindows Mobileアプリ。

 

開発動機

韓国ではPDAフォンからスマートフォンに移動する過渡期に、相変わらず地下鉄アプリはただ駅の間の所要時間を重ねて計算することだけであった。ソウルに地下鉄9号線が2009年開通した以降、韓国にも急行概念が人々の混乱を招くことになった。1そして、どの電車が速いか、より高度の情報提供が必要になった。そういうニーズを満たせるアプリを一人で作ろうと決めた。

続きを読む

excercise1

簡単に解いてみるJava急テスト

よりにもよって、季節の変わり目で、鼻水で頭はフラフラしている最中ですが、Javaの実力検証のためのテストを受けることになりました。

みんな解けるくらいの簡単なものだと言いましたが、必ずしもみんなそう思うわけにはいかないので、長い時間があっても手間取っていた人もいました。

Java 問題 1. 1桁を一に変えるコードを作成せよ

문제 1

public class Exercise1 {

	public static void main(String[] args) {
		int num = 333;
		int num2 = (int)Math.round((double)(Math.floor((float)num*0.1f)))*10+1;
		System.out.println(num2);
	}

}

実はnum / 10 * 10が簡単で、そう解いた人が圧倒的に多いですが、これにも理由はある…というには長すぎます。解いた後に後悔した件です。

Stringに変えてサブストリングで変えて、 Integer.parseInt()もいいアイデアですね。

続きを読む