投稿

2018の投稿を表示しています

JavaScriptのthis参照について

イメージ
Follow @venividivici830 JavaScriptのthisは、関数の呼ばれ方によって、参照するオブジェクトが異なる。ただし、アロー関数はこの限りではない。 呼び出し方 参照 普通の関数呼び出し グローバルオブジェクト メソッドとして呼び出し レシーバーオブジェクト 明示的に指定 指定したオブジェクト コンストラクターとして呼び出し インスタンス イベントハンドラー/リスナーとして呼び出し イベントの発火元オブジェクト 普通の関数として呼ばれた場合、メソッドとして呼ばれた場合、明示的に指定した場合 main.js function test () { console . log ( 'this === global' ); console . log ( this === global ); console . log ( 'this === obj' ); console . log ( this === obj ); console . log ( 'this === obj2' ); console . log ( this === obj2 ); console . log ( '' ); } var obj = { test: test }; var obj2 = {} console . log ( '***** test() *****' ); test (); console . log ( '***** obj.test() *****' ); obj . test (); console . log ( '***** (test.bind(obj2))() *****' ); ( test . bind ( obj2 ))(); $ node main.js   ***** test() ***** this === global true this === obj false this =

Node.jsのモジュール機能について

Follow @venividivici830 Node.jsのモジュール機能について学習した。 モジュール機能は、サーバーサイドJavaScriptの標準APIの仕様を定めるプロジェクトであるCommonJSでも、早い時期から規格化と実装が進んでいたようだ。 モジュールは、プログラムのソース・ファイルを複数ファイルに分けて管理し、名前空間を分離することを可能にする、Node.js自体が提供する言語機能である。 Nodeのバージョンは、 $ node -v v10.9.0 モジュールのエクスポートとインポート 下記の構成で、2つのファイルを使って検証した。 $ pwd /Users/ user /Desktop/node_test $ ls   Animal.js main.js まずは、モジュールとして利用される側。 moduleという名前のオブジェクトが、最初から存在する。 moduleオブジェクトのexportsプロパティが参照するオブジェクトのプロパティに、エクスポートするオブジェクトを設定することで、オブジェクトをエクスポートできる。 Animal.js var Animal = function () {} module . exports . Animal = Animal ; モジュールとして利用する側は、require関数を使う。 require関数の引数には、ファイル名を指定する。ファイル名の.jsは省略できる。 main.js var lib = require ( './Animal' ) var animal = new lib . Animal (); 当然下記のようにも書ける。 var Animal = require ( './Animal' ). Animal ; var animal = new Animal (); 実行すると、特にエラーなく処理が終了する。 $ node main.js   モジュールは、デフォルトでグローバルの名前空間を汚染しない。 下記のよう

JavaScriptのプロトタイプ継承について

イメージ
Follow @venividivici830 JavaScriptのプロトタイプ継承について、以下にまとめた。 下記の本に詳細に書かれており、非常に参考になった。 パーフェクトJavaScript (PERFECT SERIES 4) 井上 誠一郎  (著), 土江 拓郎 (著), 浜辺 将太 (著) 勉強中のため、間違いがあれば指摘をいただけると幸いである。 プロトタイプ継承とプロトタイプチェーン プロトタイプ継承は、下記のように定義できると思う。 コンストラクターのprototypeプロパティが参照するオブジェクトのプロパティが、インスタンスに継承される仕組み これにより、効率的なインスタンスメソッドの実装や、Javaのような継承を実装できる。 下記のJavaScriptの仕様を利用している。 コンストラクターは、関数である 関数は、オブジェクトである 全ての関数は、prototypeという名前のプロパティを持つ 全てのオブジェクトは、オブジェクト生成に使ったコンストラクターのprototypeプロパティが参照するオブジェクトへの隠しリンク(暗黙リンク)を持つ オブジェクトのプロパティが読み込まれる時は、プロパティは下記の順で探される。この仕様が、プロトタイプチェーンである。 オブジェクト自身のプロパティ 暗黙リンク先のオブジェクトのプロパティ 暗黙リンク先のオブジェクトの、暗黙リンク先のオブジェクトのプロパティ これを繰り返し、Object.prototypeが参照するオブジェクトで終わる 上述した内容を図で表すと、下図のようになる。 上図により、インスタンスメソッドを定義する下記のコードや、 var Person = function ( name ) { this . _name = name ; } Person . prototype . getName = function () { return this . _name ; } 継承する際の下記のコードについて、理解が深まると思う。 var Dog = function () {} Dog . prototype = ne

SquidのDigest認証でパスワードファイルをハッシュ化する

イメージ
Follow @venividivici830 SquidでDigest認証(ダイジェストにんしょう)を設定した話。 「squid digest認証」などで検索すると、パスワードファイルにパスワードを平文として記載する例が多くヒットする(日本語のページの話)。 それだとBasic認証とたいして変わらない気がするので、パスワードファイルをハッシュ化(暗号化)しても、Digest認証できるようにした。 結論としては、squid.confのauth_param digest programで指定する認証用のコマンドで、-cオプションを付ければよかった。 auth_param digest program /usr/lib64/squid/digest_file_auth -c path_to_password_file 前提条件 プロキシサーバーは、Virtualbox バージョン 5.2.12 r122591上のCentOS-7 (1804)にインストールした、Squid Cache: Version 3.5.20。 プロキシのクライアントは、macOS High Sierra バージョン 10.13.5。 CentOSのネットワークは設定済 。 CentOSとmacOSは、同一ネットワーク192.168.11.0/24に所属し、CentOSのIPアドレスは192.168.11.77。 以下、プロンプトが#の場合は、CentOSのrootユーザー、$の場合は、macOSの一般ユーザー。 Squidのインストール〜疎通確認まで CentOS 7にsquidをyumでインストールした。 # yum -y install squid インストール後、squidの設定ファイル(デフォルトで/etc/squid/squid.conf)を編集。 # vi /etc/squid/squid.conf 筆者の自宅のネットワークは、ネットワークアドレスが192.168.11.0/24のため、下記の部分を、 acl localnet src 10.0.0.0/8     # RFC1918 possible internal network acl localnet src 172.16.0.0/12  # RFC1

PowerShell 6で、Shift_JISのCSVをImport-Csvで読み込んだら文字化けした

Follow @venividivici830 PowerShell 4で作ったShift_JIS(シフトJIS)のCSVを読み込むスクリプトを、PowerShell 6で動かしたら文字化けした話。 結論としては、下記のようにすればOK。 > Import-Csv -Encoding ([System.Text.Encoding]::GetEncoding(932)) path_to_csv_file 現象 PowerShell 4では、 このページ にあるように、Import-Csvコマンドレットのオプションとして、-Encoding defaultを付ければよかった。 ところが、PowerShell 6では上手くいかない。 例えば、下記のようなshift-jisのCSVがある。 名前,年齢 田中,20 山田,10 これを、-Encoding defaultオプションで読み込むと、 > Import-Csv -Encoding default ./test.csv                        O N ---- ---- c 20   Rc 10   このように文字化けする具合だ。 原因 まず、「default」がutf-8に変わったのが原因のようだ。 .NET Framework クラスライブラリーの、System.Text名前空間の、Encodingクラスの、Defaultプロパティーを確認した。 > [ System.Text.Encoding ]:: Default BodyName           : utf-8 EncodingName       : Unicode (UTF-8) HeaderName         : utf-8 WebName           : utf-8 WindowsCodePage   : 1200 IsBrowserDisplay   : True IsBrowserSave     : True IsMailNewsDisplay : True IsMailNewsSave     : Tru

CentOS 7にOracle Database 18cをコマンドラインでインストールした

イメージ
Follow @venividivici830 仮想マシン上のCentOS 7に、Oracle Database 18cをCUIで(GUIを使わず)インストールした時の記録。 インストール後、dbcaで、これまたコマンドラインからDBを作成し、インスタンスの開始と停止ができるところまで確認した。 OracleのインストールはGUIでもハマるけど、CUIだともっとしんどい。 環境は、macOS High Sierra バージョン 10.13.5、Virtualbox バージョン 5.2.12 r122591、CentOS-7 (1804)、Oracle Database 18c (18.3)。 CentOS 7は、 Minimal ISOからインストールした もの。 このCentOS 7に対し、コマンドライン( サイレント・モード )で、X Window System(GUI)を使わずにインストールした。 MacのCPUは3.06 GHz Intel Core 2 Duo、メモリーは4 GB 1067 MHz DDR3。 VirtualboxのゲストOS(CentOS 7)には、HDD 10 GB、メモリー 1Gを割り当てた状態からスタートし、適宜拡張した。 以下、コマンドのプロンプトが#の場合は、CentOS のrootでの作業、$の場合は、特に断りがなければCentOSのユーザーoracle、oracle以外の場合は、CentOSかMacの任意の一般ユーザー。 なお、以下の手順を参考にする場合、 頻繁にスナップショット機能でイメージバックアップを取得することをおすすめする 。 ライセンス確認 このページ に下記の記述があるように、学習などの限定用途で、無償で使用できるようだ。 OTNサイト(www.oracle.com/technetwork)からダウンロードできるソフトウエアには OTN開発者ライセンスがついており、限定された用途で無償で使用できます。 OTN開発者ライセンス付きのソフトウエアは、お客様のアプリケーションの開発、テスト、プロトタイプ作成、及びデモンストレーションのみを目的として(かつ、お客様のアプリケーションが、データ処理、業務、商用又は本番利用を目的として使用されたことがない場合に限られ