読者です 読者をやめる 読者になる 読者になる

それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

ネットワークのIPアドレスを一覧表示する(sort でIPアドレスをソート)

linux

ローカルネットワークのIPを列挙する

nmap を使って、ネットワークに疎通できるIPアドレスがどれだけあるか見ておく

takuya@Desktop$ nmap -sP 192.168.2.0/28 | /usr/bin/grep -o '192.168.2.\d' 
192.168.2.1
192.168.2.2
192.168.2.3
192.168.2.9

うちのローカルネットワークだと1−9の数台しか使ってないのであまり違いが出ない

sort であれこれソートできる

もっとたくさんのIPアドレスが出てくる場合はソートしないといけない

IPアドレスは、バージョンの記述に似ているので、バージョン番号でソートする機能と同じように使える。

sort -V 

やってみた。

takuya@Desktop$ for i in {1..10}; do echo  192.168.$(( $RANDOM%254 )).$(( $RANDOM%254 )) ; done  | sort  -V
192.168.54.9
192.168.88.230
192.168.91.181
192.168.105.133
192.168.130.186
192.168.134.246
192.168.153.65
192.168.185.8
192.168.240.5
192.168.250.31

うん、きれいに数値順にソートされる。

javascriptで名前空間を作って生産効率を上げる

javascript

名前空間の利用

名前空間を利用するとJavaScriptがもっと楽しくなる。

何でもかんでも、Globalなオブジェクトに登録していくと、どうしても限界が早くなる。

コードを書くよりもコードを読むのに時間がかかるという点です。問題に深く集中して売る時、腰を据えて午後の時間をかなりの量のコード作成に費やすことが出来ます。その為に「namespace」による管理は、管理コストを下げ共同作業をやりやすくするという点において最高ですね。

global だと変数名の衝突も置きて頭抱えることになる。

名前空間のはじめの一歩。

var takuya = {};

なければ作る名前空間

var takuya = {}; が2度呼び出されると、初期化されてしまうので、名前空間が破壊されてしまう。

そこで次のようにする。

シンプルで美しい

var takuya = takuya || {}

ベターなやり方

ちゃんとチェックしてもいいけどめんどくさいよね。

if ( typeof takuya == 'undefined' ) {
  var takuya = {};
}

複数個の namespace をどうするんだい

いくら シンプルで美しい 書き方でも、何度も書くと冗長すぎる・・・

var takuya = takuya || {}
var takuya.arrays  = takuya.arrays || {}
var takuya.utils   = takuya.utils || {}
var takuya.connect = takuya.connect || {}
var takuya.logins  = takuya.logins || {}

ちょっと関数を作っておきます。

function define_namespace( path ){
    var paths = path.split('.')
    var namespace = ''
    var _global = this;//window or global
    paths.reduce( function(prev,curr) {
      if ( !prev.hasOwnProperty(curr) ) {
        prev[curr] = {}
      }
      curr = prev[curr];
      return curr ;
    }, _global )
}

これで、マルっとオブジェクト作れますね

define_namespace('takuya.maps.drawing.lines.point')
console.log( takuya )
console.log( takuya.maps )
console.log( takuya.maps.drawing )
console.log( takuya.maps.drawing.lines )
console.log( takuya.maps.drawing.lines.point )

名前空間を使ったモジュール関数を作る。

名前空間を作ってモジュール化できることがわかったので、モジュール関数を作る

define_namespace('takuya.blog.sample')
takuya.blog.sample.log = function(e){
  console.log(e)
}
takuya.blog.sample.log('Hello from module func')

まぁ当たり前でですね。

名前空間を使ったモジュールにコンストラクタを作る

define_namespace('takuya.blog')
takuya.blog.Book = function(name){
  this.name = name 
  this.getName = function getName (){
    return this.name
  }
}
var book = new takuya.blog.Book('Hello from module constructor')
console.log(book.getName())

名前空間に定数を作る?

定数は存在しないので、大文字で書いて、定数であることを明示するくらいしか出来ない。

define_namespace('takuya.screen')
takuya.screen = {
  MAX_WIDTH: 1280;
  MAX_HEIGT:  720;
}
takuya.screen.MAX_HEIGHT;

参考資料

JavaScriptパターン ―優れたアプリケーションのための作法

JavaScriptパターン ―優れたアプリケーションのための作法

https://www.amazon.co.jp/JavaScriptパターン-優れたアプリケーションのための作法-Stoyan-Stefanov/dp/4873114888/ref=sr_1_1?ie=UTF8&qid=1487917553&sr=8-1&keywords=javascript+パターン

JavaScriptでプライベートな変数やメソッドを作る

javascript

プライベートなメンバを作る

プライベートメンバを作るには、どうするか?

プライベート・メンバを作るパターンが基本パターンとして次があげられる。

function Phone() {
  //プライベート・メンバ
  var name = 'Xperia'
  //パブリック・メンバ
  this.getName = function(){
    return name;
  }
}

プライベートな変数を作るのに、変数のスコープを使う。

まぁ、出来るんだけど、スコープの限界があるんので そこは仕方ないかもね

実行例はこちら

> my_phone = new Phone
Phone { getName: [Function] }
> my_phone.name
undefined
> my_phone.getName()
'Xperia'
>

ただしここも参照コピー問題。

function Phone() {
  //プライベート・メンバ
  var info = {name:"Xperia"}
  //パブリック・メンバ
  this.getInfo = function(){
    return info;
  }
}
my_phone = new Phone
var i = my_phone.getInfo();
i.my_name = 'takuya'
my_phone.getInfo()

実行結果

> var i = my_phone.getInfo(); 
> i
{ name: 'Xperia' }
> i.my_name = 'takuya'
'takuya'
> my_phone
Phone { getInfo: [Function] }
> my_phone.getInfo()
{ name: 'Xperia', my_name: 'takuya' }
>

すべてが参照ってのも怖いね。スコープの内部にアクセスできちゃうんですよね。

まぁ最近の更新で何か新機能が追加されてることを願おう