Code Log

プログラミングの勉強メモを残していきます。

Node.jsでWebページをダウンロードする


Node.jsでWebページをダウンロードするサンプルを写経してみました。

download(
  "http://www.google.co.jp",
  "google.html",
  function(){console.log("ok, google");});

download(
  "http://www.yahoo.co.jp",
  "yahoo.html",
  function(){console.log("ok, yahoo");});

function download(url, savepath, callback) {
	var http = require('http');
	var fs = require('fs');
	var outfile = fs.createWriteStream(savepath);
	var req = http.get(url, function(res) {
		res.pipe(outfile);
		res.on('end', function() {
			outfile.close();
			callback();
		});
	});
}

JS+Node.jsによるWebクローラー/ネットエージェント開発テクニック

JS+Node.jsによるWebクローラー/ネットエージェント開発テクニック

npm -g でグローバルインストールしたときに、モジュールがインストールされるパスを調べる


npmとは、Node.jsのモジュールを管理するためのパッケージマネージャーです。
モジュールがインストールされる場所ですが、「npm install」を実行すると、このコマンドを実行したカレントディレクトリにモジュールがダウンロードされます。

つまり、そのモジュールは別のプロジェクトからは利用できないということです。

そこで、よく使うモジュールで、毎回インストールするのは面倒だという場合、グローバルインストールという手法を使います。
グローバルインストールすると、全てのプロジェクトから利用することができます。

npm install -g (モジュール名)

とコマンドを打てば、グローバルインストールすることができます。

グローバルインストール先、つまりどこにモジュールがインストールされているのか調べたい場合は、

$ npm root -g
/usr/local/lib/node_modules

また、Node.jsがモジュールを探す時に検索するパスを調べてみましょう。

以下のコマンドで、Node.jsがモジュールを探しに行くパスを表示することができます。

$ node -e "console.log(global.module.paths)"
[ '/home/vagrant/node_modules',
  '/home/node_modules',
  '/node_modules' ]

また、これに加えて、NODE_PATHも検索するので、環境変数「NODE_PATH」にグローバルなパスを登録することで、グローバルインストールしたモジュールのパスを正しく検索することができるようになります。

$ export NODE_PATH=/usr/local/lib/node_modules

Swiftでボタンを押したタイミングでキーボードを下げる


入力する時にキーボードは必要ですが、いつまでもキーボードが表示されたままだと格好悪いので、
入力が完了したタイミングでキーボードを隠す処理を実装してみましょう。

ボタンを押したタイミングでキーボードを下げる処理は以下のように実装します。

@IBAction func tapActionButton(sender: AnyObject) {
    let userDefaults = NSUserDefaults.standardUserDefaults()
    userDefaults.setObject(textField.text, forKey: "text")
    userDefaults.synchronize()
    view.endEditing(true)
    
}

値をNSUserDefaultに保存して、view.endEditing()でキーボードを下げます。

Swiftポケットリファレンス

Swiftポケットリファレンス

SwiftでUITextFieldの値の変化をチェックして、イベントを受け取ってLabelの値を更新する


SwiftでTextFieldに入力された値に反応して、その値を習得。
そして取得した値をLabelなどにリアルタイムで反映させたときがあると思います。

そんなときは、以下のようなコードを書きます。

viewDidLoad()のメソッド内に以下を書きます。

textField.addTarget(self, action: "textFieldDidChange:",forControlEvents: UIControlEvents.EditingChanged)

値が変化した時の処理を関数として書きます。

func textFieldDidChange(textFiled: UITextField) {
    testLabel.text = textField.text
}

参考)
http://stackoverflow.com/questions/28394933/how-do-i-check-when-a-uitextfield-changes

Swiftで自作クラスを作成する

Swiftで自作クラスを作成する構文は以下のとおり。

import UIKit

var str = "Hello, playground"

//クラスのインスタンス化を行う
var radio = UISwitch()

//プロパティを設定する
radio.on = true

//メソッドを使ってプロパティを設定する
radio.setOn(false, animated: true)

//独自クラスを作成
class Cat {
    var name = "";
    
    func bark() {
        print("nya---")
    }
}


var cat = Cat()
cat.name = "nya-su"
cat.bark()

AngularJSでng-repeatとfilterを併用してテキストを絞り込むインクリメンタル検索を実装


searchTextという属性は、検索ボックスにテキストが入力されるたびにデータが変更されます。
ng-repeatのmemberの値をsearchTextでfilterをかけるため、テキストボックスに文字列が入力されるたびに動的に中身がフィルタリングされたデータになります。

○HTML

<div ng-controller="MainCtrl">
  <input type="search" ng-model="searchText">
  <ul ng-repeat="member in members | filter:searchText">
    <li>{{member.name}} {{member.age}}</li>
  </ul> 
</div>


○JavaScript

'use strict';

var app = angular.module('myApp', []);
app.controller('MainCtrl', function($scope) {

  $scope.members = [
    { name: 'Takashi Shibuya', age: 31},
    { name: 'Yoshida Katsutoshi', age:32},
    { name: 'Akihiko Imura', age:33},
    { name: 'Kawabe Atsuhiko', age: 32}
  ]

});

AngularJSアプリケーション開発ガイド

AngularJSアプリケーション開発ガイド

AngularJSで繰り返し処理を実装する

ng-repeatを使ってみる

ng-repeatを使えば繰り返しを簡単に実装できます。
リストの繰り返し処理や絞込みに使われることが多いです。

○HTML

<div ng-controller="MainCtrl">
  <ul ng-repeat="name in names">
    <li>{{name}}</li>
  </ul>
</div>


○JavaScript

var app = angular.module('myApp', []);
app.controller('MainCtrl', function($scope) {
  $scope.names = [
  	'Kazuhito nakamura',
  	'Takeshi matsumoto',
  	'akihiro Tanama',
  	'sayaka takeda',
  	'yoko yamada'
  ];

});

ng-repeatで使うことができる特殊変数

$index: 0から始まる現在のループの位置を示す
$first: ループの一回目ならtrue,それ以外のときはfalse
$middle: ループの最初と最後でなければtrue,それ以外のときはfalse
$last: ループの最後であればtrue, それ以外のときはfalse
$even: $indexが偶数の時はtrue, 奇数の時はfalse
$odd: $indexが奇数の時はtrue, 偶数の時はfalse


○HTML

<div ng-controller="MainCtrl">
  <table>
    <tr>
      <th>value</th>
      <th>$index</th>
      <th>$first</th>
      <th>$middle</th>
      <th>$last</th>
      <th>$even</th>
      <th>$odd</th>
    </tr>
    <tr ng-repeat="name in names">
      <td>{{name}}</td>
      <td>{{$index}}</td>
      <td>{{$first}}</td>
      <td>{{$middle}}</td>
      <td>{{$last}}</td>
      <td>{{$even}}</td>
      <td>{{$odd}}</td>
    </tr>
  </table>
</div>


○JavaScript

var app = angular.module('myApp', []);
app.controller('MainCtrl', function($scope) {
  $scope.names = [
  	'Kazuhito nakamura',
  	'Takeshi matsumoto',
  	'akihiro Tanama',
  	'sayaka takeda',
  	'yoko yamada'
  ];

});


Webアプリ構築のためのAngularJS

Webアプリ構築のためのAngularJS

NSURLSessionを使ってインターネット通信を行う。

import UIKit
import XCPlayground

XCPlaygroundPage.currentPage.needsIndefiniteExecution = true

let session = NSURLSession.sharedSession()

let url = NSURL(string: "http://www.yahoo.co.jp")!

let request = NSURLRequest(URL: url)

let task = session.dataTaskWithRequest(request) {
    (data:NSData?, response:NSURLResponse?, error:NSError?) -> Void in
    
    if let data = data {
        let value = NSString(data: data, encoding: NSUTF8StringEncoding)
        print(value)
    }
}

task.resume()


App Transport Securityとは

ATS(App Transport Security)とは、iOS9から搭載された機能のこと。
通信処理のデフォルトをHTTPSにするもの。ATSを一時的に無効にする方法もAppleから公開されている。

NSUserDefaultsを使って自作クラスをシリアライズ/デシリアライズする

シリアライズとは、オブジェクトの内容をバイナリに変換すること。
バイナリからオブジェクトに復元することをデシリアライズという。

import Foundation


class MyData :NSObject, NSCoding {
    var valueString :String?
    
    override init() {
    }
    
    func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeObject(valueString, forKey: "valueString")
    }
    
    required init?(coder aDecoder: NSCoder) {
        valueString = aDecoder.decodeObjectForKey("valueString") as? String
    }
    
    
}

上のようなクラスをNSUserDefaultsに保存して取り出す処理。

    override func viewDidLoad() {
        super.viewDidLoad()
        
        print("process start")
        //NSUserDefaultsの生成
        let userDefaults = NSUserDefaults.standardUserDefaults()
        
        //シリアライズ対象となるインスタンスを生成
        let data = MyData()
        data.valueString = "test"
        
        //NSUserDefaultsにシリアライズしたデータを保存
        let archiveData = NSKeyedArchiver.archivedDataWithRootObject(data)
        userDefaults.setObject(archiveData, forKey: "data")
        userDefaults.synchronize()
        

        //デシリアライズ処理
        if let storedData = userDefaults.objectForKey("data") as? NSData {
            if let unarchivedData = NSKeyedUnarchiver.unarchiveObjectWithData(storedData) as? MyData {
                if let valueString = unarchivedData.valueString {
                    print ("desirialize data:" + valueString)
                }
            }
        }
    }

iOSでデータ保存する仕組み

NSUserDefaults

NSUserDefaultsはiOSアプリのデータ永続性の仕組みのこと。
key=value形式でデータを保存することができる。

NSUserDefaultsで保存したデータはローカルストレージのアプリ内部にplist(プロパティリスト)形式で保存される。plist形式の実体はXMLである。

plistファイルは毎回読み込まれるわけではなく、アプリ起動時にキャッシュに保存される。

NSUserDefaultsは大きすぎる値の保存には向いていない。
なぜなら、キャッシュ動作があるためだ。
メモリに大量のデータを保存するのには向いていない。

Core Data

Core Dataはデータをレコード形式で保存するデータ永続性の仕組みのこと。
Core Dataが提供する関数を利用してレコードを参照する。

Keychain

KeychainはiOS内部のセキュアな場所に保存される仕組みのこと。