speed of light

speed_of_light = 299792458
billionth = 1.0 /1000000000
nanostick = speed_of_light * billion
print nanostick

variable changes with faster processer, even in the same expression, divede by cycles_per_second.

speed_of_light = 299792458
cycles_per_second = 2700000000. # 2.7GHz

cycle_distance = speed_of_light / cycles_per_second

cycles_per_second = 2800000000. # 2.8GHz
print(cycle_distance)

cycle_distance = speed_of_light / cycles_per_second
print(cycle_distance)

Finding Strings in strings

pythagoras = 'There is geometry in the humming of the string, there is music in the spacing of the spheres'
print(pythagoras.find('string'))
print(pythagoras[40:])
print(pythagoras.find('algebra'))

danton = "De l'audance, encore de l'audace, toujours de l'audace"
print(danton.find('audace'))
print(danton.find('audace', 0))
print(danton.find('audace', 5))
print(danton.find('audace', 6))
print(danton[6:])

link procedure

def get_next_target(page):
  start_link = page.find('<a href=')
  start_quote = page.find('"', start_link)
  end_quote = page.find('"', start_quote + 1)
  url = page&#91;start_quote + 1:end_quote&#93;
  return url, end_quote
  
print(get_next_target('this is a <a href="www.yahoo.co.jp">link</a>'))

How to crawler get a link from webpages.

def print_all_links(page):
  while True:
    url, endpos = get_next_target(page)
    if url:
      print(url)
      page = page[endpos:]
    else:
      break
  
print_all_links(get_page('http://yahoo.co.jp'))

find last position

def find_last(s, t):
  last_pos = -1
  while True:
    pos = s.find(t, last_pos)
    if pos == -1:
      return last_pos
      last_pos = pos

browser app

screen-shot-2016-11-26-at-07-06-42

import UIKit

class ViewController: UIViewController, UIWebViewDelegate, UITextFieldDelegate {
    
    
    @IBOutlet weak var textField: UITextField!
    @IBOutlet weak var webView: UIWebView!
    @IBOutlet weak var backButton: UIBarButtonItem!
    @IBOutlet weak var forwardButton: UIBarButtonItem!
    @IBOutlet weak var activityIndicatorView: UIActivityIndicatorView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let topBorder = CALayer()
        topBorder.frame = CGRectMake(0, 0, self.webView.frame.size.width, 1)
        topBorder.backgroundColor = UIColor.lightGrayColor().CGColor
        self.webView.layer.addSublayer(topBorder)
        self.webView.delegate = self
        self.textField.delegate = self
        
        self.webView.delegate  = self
        self.textField.delegate = self
        
        // string -> NSURL -> NSURLRequest -> webView.loadRequest
        let startUrl = "http://google.com"
//        if let url = NSURL(string: startUrl){
//            let urlRequest = NSURLRequest(URL: url)
//            self.webView.loadRequest(urlRequest)
//        }
        self.jumpToUrl(startUrl)
        self.setupButtonsEnabled()
        self.activityIndicatorView.hidesWhenStopped = true
    }
    
    func jumpToUrl(urlString: String){
        if let url = NSURL(string: urlString){
            let urlRequest = NSURLRequest(URL: url)
            self.webView.loadRequest(urlRequest)
        } else {
            self.showAlert("Invalid URL")
        }
    }
    
    func showAlert(message: String){
        let alertController = UIAlertController(title: "Error", message:message, preferredStyle: .Alert)
        let defaultAction = UIAlertAction(title: "OK", style: .Default, handler: nil)
        alertController.addAction(defaultAction)
        self.presentViewController(alertController, animated: true, completion: nil)
    }
    
    func textFieldShouldReturn(textField: UITextField) -> Bool {
        var urlString = self.textField.text
        urlString = urlString.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())
        if urlString == "" {
            // alert
            self.showAlert("please enter URL")
        } else {
            if urlString.hasPrefix("http://") && !urlString.hasPrefix("https://") {
                urlString = "http://" + urlString
            }
            self.jumpToUrl(urlString)
            self.setupButtonsEnabled()
        }
        self.textField.resignFirstResponder()
        return true
    }
    
    func setupButtonsEnabled() {
        self.backButton.enabled = self.webView.canGoBack
        self.forwardButton.enabled = self.webView.canGoForward
    }
    
    func webView(webView: UIWebView, didFailLoadWithError error: NSError) {
        self.webView.stopLoading()
        self.activityIndicatorView.stopAnimating()
        
        if error.code != NSURLErrorCancelled {
            self.showAlert("Network Error")
        }
        self.updateUrlLocation()
    }
    
    func webViewDidStartLoad(webView: UIWebView) {
        self.activityIndicatorView.startAnimating()
    }
    
    func updateUrlLocation(){
        if let urlString = self.webView.request?.URL?.absoluteString {
            self.textField.text = urlString
        }
    }
    
    
    func webViewDidFinishLoad(webView: UIWebView) {
        self.activityIndicatorView.stopAnimating()
        self.setupButtonsEnabled()
        self.updateUrlLocation()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
    @IBAction func goBack(sender: AnyObject) {
        self.webView.goBack()
    }
    
    @IBAction func goForward(sender: AnyObject) {
        self.webView.goForward()
    }
    
    @IBAction func reload(sender: AnyObject) {
        self.webView.reload()
    }

}

string -> NSURL -> NSURLRequest -> webView.loadRequest

    @IBOutlet weak var textField: UITextField!
    @IBOutlet weak var webView: UIWebView!
    @IBOutlet weak var backButton: UIBarButtonItem!
    @IBOutlet weak var forwardButton: UIBarButtonItem!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // string -> NSURL -> NSURLRequest -> webView.loadRequest
        let startUrl = "http://hogehoge.com"
        if let url = NSURL(string: startUrl){
            let urlRequest = NSURLRequest(URL: url)
            self.webView.loadRequest(urlRequest)
        }
        
    }

姓名診断 app

screen-shot-2016-11-26-at-02-38-19
tips
ctl + button -> segue: show
seque identifier -> class name
command + = -> size調整
file -> new file -> Cocoa Class : 新しいclassを生成 -> utility custom classでclass設定

import UIKit

class ViewController: UIViewController {

    
    @IBOutlet weak var textField: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }
    
    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        self.textField.text = ""
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    func showAlert() {
        let VERSION: Float = (UIDevice.currentDevice().systemVersion as NSString).floatValue
        if VERSION >= 8.0 {
            let alertController = UIAlertController(title: "Error", message: "Please enter your name", preferredStyle: .Alert)
            let defaultAction = UIAlertAction(title: "OK", style: .Default, handler: nil)
            alertController.addAction(defaultAction)
            self.presentViewController(alertController, animated: true, completion: nil)
        } else {
            let alert = UIAlertView()
            alert.title = "Error"
            alert.message = "Please enter your name"
            alert.addButtonWithTitle("OK")
            alert.show()
        }
    }
    
    override func shouldPerformSegueWithIdentifier(identifier: String?, sender: AnyObject?) -> Bool {
        if identifier == "showResult" {
            if self.textField.text == "" {
                self.showAlert()
                return false
            }
            return true
        }
        return true
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "showreResult" {
            let resultViewController: ResultViewController = segue.destinationViewController as! ResultViewController
            resultViewController.myName = self.textField.text
            self.textField.resignFirstResponder()
        }
    }
    
}


import UIKit

class ResultViewController: UIViewController {

    var myName: String = ""
    @IBOutlet weak var nameLabel: UILabel!
    @IBOutlet weak var scoreLabel: UILabel!
    
    override func viewDidLoad(){
        super.viewDidLoad()
        self.nameLabel.text = "\(self.myName)の点数は..."
        
        let score = arc4random_uniform(101)
        self.scoreLabel.text = "\(score)点"
        
    }
    
    
}

omikuji app

swiftではarcNrandom_uniform(UInt32(hoge.count))でランダムに数値を生成します。

Tips
command + option + 0: utility 非表示
launch screen -> main.storyboardに変更可能

screen-shot-2016-11-26-at-01-32-40

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var myLabel: UILabel!
    
    
    @IBAction func getOmikuji(sender: AnyObject) {
        let results = [
            "大吉",
            "吉",
            "中吉",
            "凶",
            "大凶"
        ]
        
        // arc4random_uniform(n + 1)
        let random = arc4random_uniform(UInt32(results.count))
        
        if random == 0 {
            self.myLabel.textColor = UIColor.redColor()
        } else {
            self.myLabel.textColor = UIColor.blackColor()
        }
        
        self.myLabel.text = results[Int(random)]
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

Swift coding

untitled

//var s: String?
//s = nil

let name: String? = "yamada"
let msg = "hello " + name!

if name != nil {
    let msg = "hello " + name!
}

if let s = name {
 let msg = "hello " + s
}

var label: String!
label = "score"
println(label)

function

//func sayHi(){
//    println("hi")
//}
//sayHi()

func sayHi(name: String){
    println("hi " + name)
}
sayHi("satoshi")

func sayHi(myname name: String){
    println("hi " + name)
}
sayHi(myname: "satoshi")

func sayHi(#name: String = "jiro"){
    println("hi " + name)
}
sayHi(name: "satoshi")

列挙型

enum Result {
    case Success
    case Error
    func getMessage() -> String {
        switch self {
        case .Success:
            return "OK"
        case .Error:
            return "OK"
        }
    }
}

var r: Result

r = Result.Success
r = .Success

Result.Error.rawValue

class

class User {
    var name: String
    var score: Int = 0
    init(name: String){
        self.name = name
    }
    func updrade() {
        score++
    }
}

var tom = User(name: "Tom")
tom.name
tom.score
tom.updrade()
tom.score

継承

class User {
    var name: String
    var score: Int = 0
    init(name: String){
        self.name = name
    }
    final func upgrade() {
        score++
    }
}

class AdminUser: User {
    func reset(){
        score = 0
    }
    override func upgrade(){
        score += 3
    }
}

protocol

protocol Student {
    var studentId: String { get set }
    func study()
}

class User: Student {
    var name: String
    var score: Int = 0
    var studentId: String = "hoge"
    func study(){
        println("studying.....")
    }
    init(name: String){
        self.name = name
    }
    func upgrade() {
        score++
    }
}



var tom = User(name: "Tom")
tom.name
tom.score
tom.upgrade()
tom.score

willSet, didSet

class User {
    var name: String
    var score: Int = 0 {
        willSet{
            println("\(score) -> \(newValue)")
        }
        didSet {
            println("\(oldValue) -> \(score)")
        }
    }
    var level: Int {
        get{
            return Int(score / 10)
        }
        set {
            score = Int(newValue * 10)
        }
    }
    init(name: String){
         self.name = name
        }
    func upgrade() {
        score++
    }
}

optional chaining

class User {
    var blog: Blog?
}

class Blog {
    var title = "My Blog"
}

var tom = User()
tom.blog = Blog()
tom.blog?.title

if let t = tom.blog?.title {
    println(t)
}

type casting

class User {
    var name: String
    init(name: String){
        self.name = name
    }
}
class AdminUser: User {}

let tom = User(name: "Tom")
let bob = AdminUser(name: "Bob")
let steve = someUser()

let users: [AnyObject] = [tom, bob, steve]

for user in users {
    if let u = user as? AdminUser {
        println(u.name)

構造体

struct UserStruct {
    var name: String
    var score: Int = 0
    init(name: String){
        self.name = name
    }
    mutating func upgrade(){
        score++
    }
}

拡張

extension String {
    var size: Int {
        return countElements(self)
    }
    func dummy() -> String {
        return "dummy"
    }
}

var s: String = "hoge"
s.size
s.dummy()

generics

func getArray(item: T, count: Int) -> [T]
{
    var result = [T]()
    for _ in 0..
	

getting started Swift

X-codeのplaygroundでコードと実行結果を表示します。

//print("hello world")
print("hello world")

変数

//var msg: String
//msg = "hello world"
//変更ができない変数 let

//var msg = "hello world"

var msg = "hello"
let s = "hoge"
//s = "bar"
println("msg: \(msg), s: \(s)")

データ型

// String, Int, Float/Double, Bool, nil
// + - * / %
let x: Float = 8.0 % 2.5
var y = 0
y++
y

let s = "hello " + "world"
true && true
true || false
!true

let a = "hkt"
let b = 48
let c = a + String(b)

タプル: _xxx はxxxを破棄

//let error = (40, "not found")
//error.0
//error.1

let error = (code:40, msg:"not found")
error.code
error.msg

let error = (40, "not found")
//let (code, msg) = error
let (code, _msg) = error
code
msg

swift

var colors: [String] = ["blue", "pink"]
colors[0]
colors[1] = "red"
colors

colors.count
colors.isEmpty

colors.append("green")
colors.insert("gray", atIndex: 1)

let secondColor = colors.removeAtIndex(1)

dictionary

var users: [String: Int] = [
  "yamada": 500,
    "tanaka" : 800
]

users["yamada"]

users.count
users.isEmpty

users["ito"] = 900
users

users.removeValueForKey("ito")
users

users.updateValue(1000, forKey: "tanaka")
let keys = Array(users.keys)
let values = Array(users.values)

var emptyDictionary = [String: Int]()

if

let score = 72
var result = ""

if score > 80 {
    result = "Great"
} else if score > 60 {
   result = "good"
} else {
    result = "soso..."
}

result = score > 80 ? "great" : "so so..."

switch

let num = 7

switch num {
case 0:
    println("zero")
case 1, 2, 3:
    println("small")
case 4...6:
    println("4/5/6")
case 7..<9:
    println("7/8")
case let n where n > 10:
    println("huge")
default:
    println("n.a.")
}

while

var n = 0
//while n < 10 { // println(n) // n++ //} do { println(n) n++ } while n < 10 [/code] for

for var i = 0; i < 10; i++ {
 println(i)
}

for i in 0...9 {
    println(i)
}

let a = [5, 3, 10]
for i in a {
    println(i)
}

View Controller Scene

screen-shot-2016-11-25-at-10-06-33

developer向けサイト:https://developer.apple.com
developerプログラム:https://developer.apple.com/programs/jp/

ctrl で、support editorにひも付けて、変数myLableにchnageLabelしています。


    @IBOutlet weak var myLabel: UILabel!

    @IBAction func changeLabel(sender: AnyObject) {
        myLabel.text = "You changed me"
    }

tips
command + 0 ->navigator area削除
auto size, auto layout on
story board -> assistant editor -> preview
upgrade frames ->制約に自動調整, items new constrainsで作成時につけることも可能
clear constrains ->制約を解除

上下左右幅いっぱいにするには margin 0
screen-shot-2016-11-25-at-11-15-42
constrain: Editor -> pin -> height or width
view ctrl + dragでも可能
viewを2つ選択して equal height
multiplier: 2つのviewの比率を設定
screen-shot-2016-11-25-at-11-28-09

labelなどのtextはxcode側でサイズを自動計算するので、必ずしも指定しなくてOK
content Hugging priority 大きくなりにくさ

deviceごとに表示を変えるには、画面下のsize classで設定

Electron packager

名言は配列で持たせて、Math.floor(Math.random() * quotes.length)で表示。background-colorは、classを、ipc通信でindex.js, index.html, setting.html間をやりとりしています。また、初期値は、webstorageから値を取得することで、ipc通信を省略しています。

electron document:http://electron.atom.io/docs/

index.js

'use strict';

// index.js (main process)
// -GUI(renderer process)
// -GUI(renderer process)
// -GUI(renderer process)

const electron = require('electron');
const app = electron.app;
const BrowserWindow = electron.BrowserWindow;
const Menu = electron.Menu;
const dialog = electron.dialog;
const ipcMain = electron.ipcMain;

let mainWindow;
let settingsWindow;
// let backgroundColor = 'skyblue';


let menuTemplate = [{
  label: 'MyApp',
  submenu: [
  { label: 'About', accelerator: 'CmdOrCtrl+Shift+A', click:
  function(){ showAboutDialog(); }},
  { type: 'separator'},
  { label: 'Settings', accelerator: 'CmdOrCtrl+,', click:
  function(){ showSettingsWindow(); }},
  { label: 'separator'},
  { label: 'Quit', accelerator: 'CmdOrCtrl+Q', click:
  function(){ app.quit(); }},
  ]

}];
let menu = Menu.buildFromTemplate(menuTemplate);

ipcMain.on('settings_changed', function(event, color){
  mainWindow.webContents.send('set_bgcolor', color);
});


// ipcMain.on('bgcolor_changed', function(event, color){
//   backgroundColor = color;
// });

// ipcMain.on('get_bgcolor', function(event){
//  event.returnValue = backgroundColor;
// });


function showAboutDialog(){
  dialog.showMessageBox({
    type: 'info',
    buttons: ['OK'],
    message: 'About This App',
    detail: 'This app was created by @hpscript'
  });
}
function showSettingsWindow (){
  settingsWindow = new BrowserWindow({width: 600, height: 400});
  settingsWindow.loadURL('file://' + __dirname + '/settings.html');
  // settingsWindow.webContents.openDevTools();
  settingsWindow.show();
  settingsWindow.on('closed', function(){
    settingsWindow = null;
  });
}

function createMainWindow (){
  Menu.setApplicationMenu(menu);
  mainWindow = new BrowserWindow({width: 600, height: 400});
  mainWindow.loadURL('file://' + __dirname + '/index.html');
  // mainWindow.webContents.openDevTools();
  mainWindow.on('closed', function(){
    mainWindow = null;
  });
}

app.on('ready', function(){
 createMainWindow()
});

app.on('window-all-closed', function(){
 if (process.platform !== 'darwin'){
  app.quit();
 }
});

app.on('activate', function(){
  if(mainWindow === null ){
    createMainWindow();
  }
});

index.html

<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>Quotes!</title>
	<style>
	body{
		font-family: Verdana, sans-serif;
		padding: 10px;
		background: skyblue;
	}
	p {
		color: #fff;
		font-size: 36px;
		margin: 0;
		padding: 0;
	}
	</style>
</head>
<body>
	<p id="quote">Just do it!</p>
	<script>
	'use strict';

	const electron = require('electron');
    const ipcRenderer = electron.ipcRenderer;
    const remote = electron.remote;
    const Menu = remote.Menu;
    const MenuItem = remote.MenuItem;
    const shell = remote.shell;

    let color = localStorage.getItem('color') ?
    localStorage.getItem('color') : 'skyblue';
    setBackgroundColor(color);

    let menu = new Menu();
    menu.append(new MenuItem({ label: 'Skyblue', click: function(){
    	setBackgroundColor('skyblue');
    }}));
    menu.append(new MenuItem({ label: 'Tomato', click: function(){
    	setBackgroundColor('tomato');
    }}));
    menu.append(new MenuItem({ label: 'Slate Gray', click: function(){
    	setBackgroundColor('slategray');
    }}));
    window.addEventListener('contextmenu', function(e){
    	e.preventDefault();
    	menu.popup(remote.getCurrentWindow());
    });

    function setBackgroundColor(color){
    	document.body.style.backgroundColor = color;
    	localStorage.setItem('color', color);
    	// ipcRenderer.send('bgcolor_changed', color);
    }

	const quote = document.getElementById('quote');
	const quotes = [
	'Just do it!',
	'Done is better than perfect',
	'Stay hungry, stay foolish',
	'ask, do not tell',
	'focus on the user',
	'keep trying',
	'nothing is impossible',
	'that which is measured, improves',
	];
	window.addEventListener('click', function(){
		quote.innerHTML = quotes[Math.floor(Math.random() * quotes.length)];
	});

	ipcRenderer.on('set_bgcolor', function(event, color){
		setBackgroundColor(color);
	});

	setTimeout(function(){
		let notification = new Notification(
		'Quote!',
		{ body: 'Visit our website!' }
		);
	notification.onclick = function (){
			shell.openExternal('http://google.com');
	}

	},3000);
	</script>
</body>
</html>

setting.html

<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>Settings</title>
	<style>
	body{
		font-family: Verdana, sans-serif;
		padding: 10px;
		background: #eee;
	}
	h1 {
		font-size: 16px;
		margin: 0;
		padding: 0 0 10px 0;
	}
	ul {
		list-style: none;
		padding: 0;
		margin: 0;
	}
	ul > li {
		font-size: 14px;
		padding: 3px 0;
	}

	</style>
</head>
<body>
	<h1>Background Color</h1>
	<ul>
		<li><label><input type="radio" name="colors" value="skyblue">Skyblue</label></li>
		<li><label><input type="radio" name="colors" value="tomato">Tomato</label></li>
		<li><label><input type="radio" name="colors" value="slategray">Slate Gray</label></li>
	</ul>
	<script>
	'use strict';

    const ipcRenderer = require('electron').ipcRenderer;
    // let currentColor = ipcRenderer.sendSync('get_bgcolor');
    let currentColor = localStorage.getItem('color');

	let colors = document.getElementsByName('colors');
	for (let i = 0; i < colors.length; i++){
		if (currentColor === colors&#91;i&#93;.value){
			colors&#91;i&#93;.checked = true;
		}
		colors&#91;i&#93;.addEventListener('change', function(){
			let color = this.value;
			// console.log(color);
			// settings.html -> index.js -> index.html
			// ipc module
			ipcRenderer.send('settings_changed', color);
		});
	}
	</script>
</body>
</html>

Electron

AtomはElectronで作られています。
http://electron.atom.io/

Electronのインストール

> lesson\MyApp>npm init -y
> npm i electron-prebuilt --save-dev

package.jsの編集

{
  "name": "MyApp",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "electron index.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "electron-prebuilt": "^1.4.8"
  }
}
'use strict';

// index.js (main process)
// -GUI(renderer process)
// -GUI(renderer process)
// -GUI(renderer process)

const electron = require('electron');
const app = electron.app;
const BrowserWindow = electron.BrowserWindow;

let mainWindow;

app.on('ready', function(){

  mainWindow = new BrowserWindow({width: 600, height: 400});
  mainWindow.loadURL('file://' + __dirname + '/index.html');
  mainWindow.webContents.openDevTools();
  mainWindow.on('closed', function(){
    mainWindow = null;
  });
});

index.html

<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>Quotes!</title>
	<style>
	body{
		font-family: Verdana, sans-serif;
		padding: 10px;
		background: skyblue;
	}
	p {
		color: #fff;
		font-size: 36px;
		margin: 0;
		padding: 0;
	}
	</style>
</head>
<body>
	<p id="quote">Just do it!</p>
</body>
</html>

electronの起動

> npm start