Monday, April 24, 2017

How to install iOS toolchain for Windows 64 bit

The instructions are here https://coolstar.org/theos.pdf
First, to install Cygwin (Run setup-x86_64.exe) for 64 bit versions of Windows with wget, git, ca-certificates, make, perl, openssh and python packages
Suggest to install zip and unzip packages as well.

The setup scripts for theos, toolchain and sdks are
shellscript    Select all
# the toollchain requires sdk files which are large, bette to put them in external drive cd /cygdrive/e git clone https://github.com/coolstar/theos.git && mkdir -p theos/toolchain/windows git clone -b x86_64 https://github.com/coolstar/iOSToolchain4Win.git theos/toolchain/windows/iphone # setup environment variable for THEOS export THEOS=/cygdrive/e/theos # update theos submodule cd $THEOS git submodule update --init --recursive mkdir -p $THEOS/sdks cd $THEOS/sdks # install the sdk by extracting the .tbz2 files # for example tar xjvf iPhoneOS8.1.sdk.tbz2 # create a Projects Folder outside theos folder cd ~ mkdir -p Projects cd Projects # create iPhone/tool project name "hello" $THEOS/bin/nic.pl cd hello make


Additional SDKs are here
iPhoneOS9.1.sdk.tbz2 (armv7, armv7s, arm64) https://mega.nz/#!PlxzHYjA!5c02sMSF6AE1M5CjuMt66tpFWHFx6sms_zeNyGMCukQ
iPhoneOS8.1.sdk.tbz2 (armv7, armv7s, arm64) https://mega.nz/#!us40SJaa!EpVL_VUgUji_H6QuTY_0YX7IG3ljTDrpzQgA1DMh2l8
iPhoneOS7.1.sdk.tbz2 (armv7, armv7s, arm64) https://mega.nz/#!qgYgmKgA!UR3dQ9ryusm251B8QcvUIo-DS_E2WXcDZENoa3q07RE
iPhoneOS6.1.sdk.tbz2 (armv7, armv7s) https://mega.nz/#!nkZDRA4D!8hJWkgYH2d3CxNtuWctCswBaAAdx4BLVuOLjGGVvKiA
iPhoneOS5.1.sdk.tbz2 (armv6, armv7) https://mega.nz/#!f4ADHaTI!FM57l5XrZMKscOoRrcwQqvtA4tzJxi7q6oDAa5QX1n0
iPhoneOS4.2.sdk.tbz2 (armv6, armv7) https://mega.nz/#!e5xA2K7b!ccK0N-y94bmSb6ifntcStAtssvD8qK9e3uAwAgrpmEU
iPhoneOS3.2.sdk.tbz2 (armv6, armv7) https://mega.nz/#!rkoylDSD!gxpXglAgcme5Wm2JurW3GCgSzUe4Y6ePMsW627xZ8hs


Edit ~/Projects/hello/Makefile to the following to allow FAT binary for different sdks
Projects/hello/Makefile    Select all
TARGET := iphone:clang # location of theos directory export THEOS=/cygdrive/e/theos # The base SDK location is what you build your app against (i.e. library files and frameworks) THEOS_PLATFORM_SDK_ROOT_armv6 = $(THEOS)/sdks/iPhoneOS5.1.sdk THEOS_PLATFORM_SDK_ROOT_armv7 = $(THEOS)/sdks/iPhoneOS7.1.sdk THEOS_PLATFORM_SDK_ROOT_armv7s = $(THEOS)/sdks/iPhoneOS7.1.sdk THEOS_PLATFORM_SDK_ROOT_arm64 = $(THEOS)/sdks/iPhoneOS8.1.sdk SDKVERSION_armv6 = 5.1 # 5.1 (armv6, armv7) SDKVERSION_armv7 = 7.1 # 7.1 (armv7, armv7s, arm64) SDKVERSION_armv7s = 7.1 # 7.1 (armv7, armv7s, arm64) SDKVERSION_arm64 = 8.1 # 8.1 (armv7, armv7s, arm64) # The SDK for include files, usually they should match with the library files and frameworks SDK INCLUDE_SDKVERSION_armv6 = 5.1 INCLUDE_SDKVERSION_armv7 = 7.1 INCLUDE_SDKVERSION_armv7s = 7.1 INCLUDE_SDKVERSION_arm64 = 8.1 # Deployment Target is the minimum required iOS version you application needs to run # usually base sdk version >= deployment target version TARGET_IPHONEOS_DEPLOYMENT_VERSION_armv6 = 5.0 TARGET_IPHONEOS_DEPLOYMENT_VERSION_armv7 = 6.0 TARGET_IPHONEOS_DEPLOYMENT_VERSION_armv7s = 7.0 TARGET_IPHONEOS_DEPLOYMENT_VERSION_arm64 = 8.0 # the default iphone architectures for this project build IPHONE_ARCHS = armv6 armv7 armv7s arm64 # ignore warnings export GO_EASY_ON_ME=1 include $(THEOS)/makefiles/common.mk TOOL_NAME = hello hello_FILES = main.mm include $(THEOS_MAKE_PATH)/tool.mk


make again and examine the FAT binary
shellscript    Select all
cd ~/Projects/hello make clean make DEBUG=1 # examine the compiled FAT binary architecture $THEOS/toolchain/windows/iphone/bin/arm64-apple-darwin14-otool.exe -h .theos/obj/debug/hello


Wednesday, March 29, 2017

How to install QuantLib Python for Windows 32 in offline installation

1. Download Python 2.7 Windows x86 MSI installer from

https://www.python.org/ftp/python/2.7.13/python-2.7.13.msi

2. Download required python packages and dependencies from

http://www.lfd.uci.edu/~gohlke/pythonlibs/#quantlib

QuantLib_Python‑1.9‑cp27‑cp27m‑win32.whl

Dependencies for matplotlib and others (win32)
six‑1.10.0‑py2.py3‑none‑any.whl
pyparsing‑2.2.0‑py2.py3‑none‑any.whl
packaging‑16.8‑py2.py3‑none‑any.whl
appdirs-1.4.3-py2.py3-none-any.whl
python_dateutil‑2.6.0‑py2.py3‑none‑any.whl
pytz‑2016.10‑py2.py3‑none‑any.whl
cycler‑0.10.0‑py2.py3‑none‑any.whl
setuptools‑34.3.3‑py2.py3‑none‑any.whl

numpy‑1.11.3+mkl‑cp27‑cp27m‑win32.whl
matplotlib‑1.5.3‑cp27‑cp27m‑win32.whl
xlrd-1.0.0-py2.py3-none-any.whl
pandas-0.19.2-cp27-cp27m-win32.whl
scipy‑0.19.0‑cp27‑cp27m‑win32.whl

3. Copy the above Installers and Packages to destination machine for offline installation

4. Install Python 2.7 and add Environment Variable PATH

SET PATH=C:\Python27;C:\Python27\Scripts;%PATH%

To be persistence, use sysdm.cpl to edit Advanced -> Environment Variables -> Path

or use py -2 to run python script under Windows OS without setting PATH
py -2 chap06.py

5. Install each and every the python packages above using pip

For example
pip install QuantLib_Python‑1.9‑cp27‑cp27m‑win32.whl

or if have python2 and python3 co-exist

py -2 -m pip install QuantLib_Python‑1.9‑cp27‑cp27m‑win32.whl

6. Microsoft Visual Studio not required

and no need to build your own QuantLib-Python library
However, a code editor like Microsoft VS Code is recommended.
https://code.visualstudio.com/download
(requirement : .NET Framework 4.5.2 for Windows 7)

Offline VS code extension for python can be downloaded from
https://donjayamanne.gallery.vsassets.io/_apis/public/gallery/publisher/donjayamanne/extension/python/0.6.0/assetbyname/Microsoft.VisualStudio.Services.VSIXPackage
see stack overflow discussion here http://stackoverflow.com/questions/37071388/how-to-install-vscode-extensions-offline

or NotePad ++
https://notepad-plus-plus.org/download/


7. Test

The code is borrowed from QuantLib Python Cookbook chapter 06
chap06.py    Select all
#! python2 #!/usr/bin/env python # pylint: disable-msg=C0103 # Interest-rate Curves # Chapter 6 EONIA curve bootstrapping # Everything You Always Wanted to Know About Multiple Interest Rate Curve Bootstrapping but Were Afraid to Ask # In[1] import math # In[2] from QuantLib import * print "\nOut[1]:" print "QuantLib version", QuantLib.__version__ # In[3] # setup evaluationDate today = Date(11, December,2012) Settings.instance().evaluationDate = today # In[4] # setup DepositRateHelper for 0-2 days helpers = [ DepositRateHelper(QuoteHandle(SimpleQuote(rate/100)), Period(1,Days), fixingDays, TARGET(), Following, False, Actual360()) for rate, fixingDays in [(0.04, 0), (0.04, 1), (0.04, 2)] ] # DepositRateHelper (const Handle< Quote > &rate, # const Period &tenor, # Natural fixingDays, # const Calendar &calendar, # BusinessDayConvention convention, # bool endOfMonth, # const DayCounter &dayCounter) # DepositRateHelper (Rate rate, # const Period &tenor, # Natural fixingDays, # const Calendar &calendar, # BusinessDayConvention convention, # bool endOfMonth, # const DayCounter &dayCounter) # In[5] """ Eonia(const Handle< YieldTermStructure > &h=Handle< YieldTermStructure >()) Eonia (Euro Overnight Index Average) rate fixed by the ECB HKDHibor(const Period &tenor, const Handle< YieldTermStructure > &h=Handle< YieldTermStructure >()) """ eonia = Eonia() """ http://quant.stackexchange.com/questions/32345/quantlib-python-dual-curve-bootstrapping-example swap-rate helpers used to bootstrap the LIBOR curve can take a discount curve to use. In the old single-curve examples, a SwapRateHelper instance would be created as helper = SwapRateHelper(quoted_rate, tenor, calendar, fixedLegFrequency, fixedLegAdjustment, fixedLegDayCounter, Euribor6M()) and use the curve being bootstrapped for both forecast and discounting. To use dual-curve bootstrapping, instead, you'll have to build it as helper = SwapRateHelper(quoted_rate, tenor, calendar, fixedLegFrequency, fixedLegAdjustment, fixedLegDayCounter, Euribor6M(), QuoteHandle(), Period(0,Days), # needed as default value discountCurve) # the discountCurve argument would be a handle to the OIS curve that you bootstrapped previously SwapRateHelper (Rate rate, const Period &tenor, const Calendar &calendar, Frequency fixedFrequency, BusinessDayConvention fixedConvention, const DayCounter &fixedDayCount, const boost::shared_ptr< IborIndex > &iborIndex, const Handle< Quote < &spread=Handle< Quote >(), const Period &fwdStart=0 *Days, const Handle< YieldTermStructure > &discountingCurve=Handle< YieldTermStructure >()) In the above, the additional QuoteHandle() and Period(0,Days) arguments are, unfortunately, needed because the SWIG wrappers don't support keyword arguments for this constructor; and the discountCurve argument would be a handle to the OIS curve that you bootstrapped previously. When the swap-rate helpers are instantiated as above, they will use the LIBOR curve being bootstrapped for forecast and the OIS curve for discounting. """ # In[6] # Overnight Index Swap rate # setup OISRateHelper for 1,2,3 weeks and 1 month helpers += [ OISRateHelper(2, Period(*tenor), QuoteHandle(SimpleQuote(rate/100)), eonia) for rate, tenor in [(0.070, (1,Weeks)), (0.069, (2,Weeks)), (0.078, (3,Weeks)), (0.074, (1,Months))] ] # In[7] """ DatedOISRateHelper(const Date &startDate, const Date &endDate, const Handle< Quote > &fixedRate, const boost::shared_ptr< OvernightIndex > &overnightIndex) """ # setup DatedOISRateHelper helpers += [ DatedOISRateHelper(start_date, end_date, QuoteHandle(SimpleQuote(rate/100)), eonia) for rate, start_date, end_date in [(0.046, Date(16,January,2013), Date(13,February,2013)), (0.016, Date(13,February,2013), Date(13,March,2013)), (-0.007, Date(13,March,2013), Date(10,April,2013)), (-0.013, Date(10,April,2013), Date(8,May,2013)), (-0.014, Date(8,May,2013), Date(12,June,2013))] ] # In[8] """ Overnight Index Swap rate OISRateHelper(Natural settlementDays, const Period &tenor, const Handle< Quote > &fixedRate, const boost::shared_ptr< OvernightIndex > &overnightIndex) """ # setup OISRateHelper from 15 months to 30 years helpers += [ OISRateHelper(2, Period(*tenor), QuoteHandle(SimpleQuote(rate/100)), eonia) for rate, tenor in [(0.002, (15,Months)), (0.008, (18,Months)), (0.021, (21,Months)), (0.036, (2,Years)), (0.127, (3,Years)), (0.274, (4,Years)), (0.456, (5,Years)), (0.647, (6,Years)), (0.827, (7,Years)), (0.996, (8,Years)), (1.147, (9,Years)), (1.280, (10,Years)), (1.404, (11,Years)), (1.516, (12,Years)), (1.764, (15,Years)), (1.939, (20,Years)), (2.003, (25,Years)), (2.038, (30,Years))] ] # In[9] eonia_curve_c = PiecewiseLogCubicDiscount(0, TARGET(), helpers, Actual365Fixed()) """ # QuantLib-SWIG/SWIG/piecewiseyieldcurve.i %define export_piecewise_curve(Name, Base, Interpolator) export_piecewise_curve(PiecewiseLogCubicDiscount, Discount, MonotonicLogCubic); PiecewiseYieldCurve<Base,Interpolator>( settlementDays, # Integer settlementDays, calendar, # const Calendar& calendar, instruments, # const std::vector<boost::shared_ptr<RateHelper> >& instruments, dayCounter, # const DayCounter& dayCounter, jumps, # const std::vector<Handle<Quote> >& jumps=std::vector<Handle<Quote> >(), jumpDates, # const std::vector<Date>& jumpDates = std::vector<Date>(), accuracy, # Real accuracy = 1.0e-12, i # const Interpolator& i = Interpolator() ) """ eonia_curve_c.enableExtrapolation() # In[10] today = eonia_curve_c.referenceDate() end = today+Period(2,Years) dates = [ Date(serial) for serial in range(today.serialNumber(), end.serialNumber()+1) ] rates_c = [ eonia_curve_c.forwardRate(d, TARGET().advance(d, 1, Days), Actual360(), Simple).rate()*100 for d in dates ] # In[11] import matplotlib.pyplot as plt plt.title("Multiple Interest Rate Curve Bootstrapping") plt.plot(rates_c, '-') plt.ylabel('Rates') plt.show() # get spot rates spots = [] tenors = [] today = eonia_curve_c.referenceDate() end = today+Period(2,Years) dates = [ Date(serial) for serial in range(today.serialNumber(), end.serialNumber()+1) ] #for d in eonia_curve_c.dates(): # return boost::dynamic_pointer_cast<Name>(*self)->dates(); for d in dates: day_count = Actual360() yrs = day_count.yearFraction(today, d) compounding = Simple freq = Annual zero_rate = eonia_curve_c.zeroRate(yrs, compounding, freq) tenors.append(yrs) eq_rate = zero_rate.equivalentRate(day_count, compounding, freq, today, d).rate() spots.append(100*eq_rate) plt.title('Discount Curve') plt.plot(tenors[1::], spots[1::], linewidth=2.0) plt.xlabel('tenor (Y)') plt.ylabel('spot (%)') plt.show()





8. Test2, requires QuantLib, numpy, scipy, matplotlib

The code is borrowed from QuantLib Python Cookbook chapter 13
chap13.py    Select all
#! python2 #!/usr/bin/env python # pylint: disable-msg=C0103 # Interest-rate Models # Chapter 13 Thoughts on the Convergence of Hull-White Model Monte-Carlo Simulations # In[1] import QuantLib as ql print "\nOut[1]:" print "QuantLib version", ql.__version__ import matplotlib.pyplot as plt import numpy as np from scipy.integrate import simps, cumtrapz, romb # % matplotlib inline import math todays_date = ql.Date(15, 1, 2015) ql.Settings.instance().evaluationDate = todays_date # In[2] # <!-- collapse=True --> def get_path_generator(timestep, hw_process, length, low_discrepancy=False, brownian_bridge=True): """ Returns a path generator The `get_path_generator` function creates the a path generator. This function takes various inputs such as """ if low_discrepancy: usg = ql.UniformLowDiscrepancySequenceGenerator(timestep) rng = ql.GaussianLowDiscrepancySequenceGenerator(usg) seq = ql.GaussianSobolPathGenerator( hw_process, length, timestep, rng,brownian_bridge) else: usg = ql.UniformRandomSequenceGenerator(timestep, ql.UniformRandomGenerator()) rng = ql.GaussianRandomSequenceGenerator(usg) seq = ql.GaussianPathGenerator( hw_process, length, timestep, rng, brownian_bridge) return seq # In[3] # <!-- collapse=True --> def generate_paths(num_paths, timestep, seq): """ The `generate_paths` function uses the generic path generator produced by the `get_path_generator` function to return a tuple of the array of the points in the time grid and a matrix of the short rates generated." """ arr = np.zeros((num_paths, timestep+1)) for i in range(num_paths): sample_path = seq.next() path = sample_path.value() time = [path.time(j) for j in range(len(path))] value = [path[j] for j in range(len(path))] arr[i, :] = np.array(value) return np.array(time), arr # In[4] # <!-- collapse=True --> def generate_paths_zero_price(spot_curve_handle, a, sigma, timestep, length, num_paths, avg_grid_array, low_discrepancy=False, brownian_bridge=True): """ This function returns a tuple (T_array, F_array), where T_array is the array of points in the time grid, and F_array is the array of the average of zero prices observed from the simulation. The `generate_paths_zero_price` essentially is a wrapper around `generate_path_generator` and `generate_paths` taking all the required raw inputs. This function returns the average of zero prices from all the paths for different points in time. I wrote this out so that I can conveniently change all the required inputs and easily plot the results." """ hw_process = ql.HullWhiteProcess(spot_curve_handle, a, sigma) seq = get_path_generator( timestep, hw_process, length, low_discrepancy, brownian_bridge ) time, paths = generate_paths(num_paths, timestep, seq) avgs = [(time[j], (np.mean([math.exp(-simps(paths[i][0:j], time[0:j])) for i in range(num_paths)]))) for j in avg_grid_array ] return zip(*avgs) def generate_paths_discount_factors(spot_curve_handle, a, sigma, timestep, length, num_paths, avg_grid_array, low_discrepancy=False, brownian_bridge=True): """ This function returns a tuple (T_array, S_matrix), where T_array is the array of points in the time grid, and S_matrix is the matrix of the spot rates for each path in the different points in the time grid. """ hw_process = ql.HullWhiteProcess(spot_curve_handle, a, sigma) seq = get_path_generator( timestep, hw_process, length, low_discrepancy, brownian_bridge ) time, paths = generate_paths(num_paths, timestep, seq) arr = np.zeros((num_paths, len(avg_grid_array))) for i in range(num_paths): arr[i, :] = [np.exp(-simps(paths[i][0:j], time[0:j])) for j in avg_grid_array ] t_array = [time[j] for j in avg_grid_array] return t_array, arr def V(t,T, a, sigma): """ Variance of the integral of short rates, used below """ return sigma*sigma/a/a*(T-t + 2.0/a*math.exp(-a*(T-t)) - 1.0/(2.0*a)*math.exp(-2.0*a*(T-t)) - 3.0/(2.0*a) ) # In[5] # <!-- collapse=True --> # Here we vary sigma with fixed a and observe the error epsilon # define constants num_paths = 500 sigma_array = np.arange(0.01,0.1,0.03) a = 0.1 timestep = 180 length = 15 # in years forward_rate = 0.05 day_count = ql.Thirty360() avg_grid_array = np.arange(12, timestep+1, 12) # generate spot curve spot_curve = ql.FlatForward( todays_date, ql.QuoteHandle(ql.SimpleQuote(forward_rate)), day_count ) spot_curve_handle = ql.YieldTermStructureHandle(spot_curve) #initialize plots figure, axis = plt.subplots() plots = [] zero_price_theory = np.array([spot_curve.discount(j*float(length)/float(timestep)) for j in avg_grid_array]) for sigma in sigma_array: term, zero_price_empirical = generate_paths_zero_price( spot_curve_handle, a, sigma, timestep, length, num_paths, avg_grid_array ) plots += axis.plot( term, np.abs(zero_price_theory - np.array(zero_price_empirical)), lw=2, alpha=0.6, label="$\sigma=$"+str(sigma) ) # plot legend labels = [p.get_label() for p in plots] legend =axis.legend(plots,labels, loc=0)#, loc=0, bbox_to_anchor=(1.1,0.4)) axis.set_xlabel("T (years)", size=12) axis.set_ylabel("|$\epsilon(T)$|", size=12) axis.set_title("Out[5]:Discount Factor Error for $a=$%0.2f and Varying $\sigma$"%a, size=14) plt.show() # In[6] # <!-- collapse=True --> # Here we vary a with fixed sigma and observe the error epsilon # define constants num_paths = 500 sigma = 0.1 a_array = np.arange(0.1, 0.51, 0.1) timestep = 180 length = 15 # in years forward_rate = 0.05 day_count = ql.Thirty360() avg_grid_array = np.arange(12, timestep+1, 12) # generate spot curve spot_curve = ql.FlatForward( todays_date, ql.QuoteHandle(ql.SimpleQuote(forward_rate)), day_count ) spot_curve_handle = ql.YieldTermStructureHandle(spot_curve) #initialize plots figure, axis = plt.subplots() plots = [] zero_price_theory = np.array([spot_curve.discount(j*float(length)/float(timestep)) for j in avg_grid_array]) for a in a_array: term, zero_price_empirical = generate_paths_zero_price( spot_curve_handle, a, sigma, timestep, length, num_paths, avg_grid_array ) plots += axis.plot( term,np.abs(zero_price_theory - np.array(zero_price_empirical)), lw=2, alpha=0.6, label="a="+str(a) ) # plot legend labels = [p.get_label() for p in plots] legend =axis.legend(plots,labels, loc=0)#, loc=0, bbox_to_anchor=(1.1,0.4)) axis.set_xlabel("T (years)", size=12) axis.set_ylabel("|$\\epsilon(T)$|", size=12) axis.set_title("Out[6]:Discount Factor Error for $\sigma$=%0.2f and Varying $a$"%sigma, size=14) plt.show() # In[7] # <!-- collapse=True --> #define constants num_paths = 500 sigma = 0.02 a = 0.1 timestep = 180 length = 15 # in years forward_rate = 0.05 day_count = ql.Thirty360() avg_grid_array = np.arange(1, timestep+1, 12) # generate spot curve spot_curve = ql.FlatForward( todays_date, ql.QuoteHandle(ql.SimpleQuote(forward_rate)), day_count ) spot_curve_handle = ql.YieldTermStructureHandle(spot_curve) term, discount_factor_matrix = generate_paths_discount_factors( spot_curve_handle, a, sigma, timestep, length, num_paths, avg_grid_array ) vol = [np.var(discount_factor_matrix[:, i]) for i in range(len(term))] l1 = plt.plot(term, 100*np.sqrt(vol),"b", lw=2, alpha=0.6, label="Empirical") vol_theory = [100*np.sqrt(math.exp(V(0,T,a, sigma))-1.0) * spot_curve_handle.discount(T) for T in term] l2 = plt.plot(term, vol_theory,"r--", lw=2, alpha=0.6, label="Theory") plots = l1+l2 labels = [p.get_label() for p in plots] legend =plt.legend(plots,labels, loc=0) plt.xlabel("Time (Years)", size=12) plt.ylabel("$\sigma_D(0,T)$ (%)", size=12) plt.title("Out[7]:Standard Deviation of Discount Factors " "(a=%0.2f, $\sigma$=%0.2f)"%(a, sigma), size=14) plt.show()




9. Test3, requires QuantLib, numpy, panda, xlrd

The code is using QuantLib, numpy, panda and xlrd to read xls data
testreadxls.py    Select all
#! python2 #!/usr/bin/env python # pylint: disable-msg=C0103 # pylint: disable-msg=C0301 # testreadxls.p import os import pandas import numpy as np import QuantLib as ql xls_file = os.path.dirname(os.path.realpath(__file__)) + '/usd_market_data_2016-07-13.xls' xl = pandas.ExcelFile(xls_file) print xl.sheet_names df = xl.parse("usdstd") #df = xl.parse(0) # alternate way to read first worksheet filename = xls_file sheetname = 'usdois' sheet = pandas.read_excel(filename, sheetname) # Read an Excel table into a pandas DataFrame #sheet = pandas.read_excel(filename, 0) # alternate way to read first worksheet instead of name print sheet.columns #tenors = np.array([Date.from_timestamp(d).t for d in sheet['dates']]) today = ql.Date(21,3,2016) act365 = ql.Actual365Fixed() dates = np.array([ql.Date(d.day, d.month, d.year) for d in sheet['dates']]) #dates = np.array([ql.Date(d.day, d.month, d.year) for d in df.iloc[0:,0]]) # use iloc to read first column, all rows print "\nusd_market_data_2016-07-13.xls dates column" print dates tenors = np.array([act365.yearFraction(today,ql.Date(d.day, d.month, d.year)) for d in sheet['dates']]) print "\nusd_market_data_2016-07-13.xls dates column convert to tenor" print tenors print "\nusd_market_data_2016-07-13.xls discounts column" discounts = np.array(sheet['discounts'].tolist()) #discounts = np.array(df.iloc[0:,1].tolist()) # use iloc to read second column, all rows print discounts


Assume the usd_market_data_2016-07-13.xls sheet usdois (first worksheet) has the following data


10. Test3, requires QuantLib, pandas, matplotlib

The code demonstrates the download of Interest Rate xml market data from markit.com and Bootstrapping IR Curve in QuantLib
test_xml_download.py    Select all
#!python2 #!/usr/bin/env python # pylint: disable-msg=C0103 # pylint: disable-msg=C0301 # test_xml_download.py from QuantLib import * print "\nQuantLib version", QuantLib.__version__ import urllib import zipfile import xml.etree.ElementTree as ET import pandas as pd import datetime as dt from matplotlib.dates import YearLocator, MonthLocator, DateFormatter from matplotlib.ticker import FuncFormatter def to_datetime(d): """ to_datetime """ return dt.datetime(d.year(), d.month(), d.dayOfMonth()) def format_rate(r, p=2): """ format_rate """ return '{0:.{prec}f}%'.format(r*100.00, prec=p) period_dict = {str(k)+'M': (k, Months) for k in range(1, 12, 1)} d2 = {str(k)+'Y': (k, Years) for k in range(1, 50, 1)} period_dict.update(d2) (ir_currency, ir_date) = ('USD', '20170331') url = 'https://www.markit.com/news/InterestRates_%s_%s.zip' % (ir_currency, ir_date) filehandle, _ = urllib.urlretrieve(url) zip_file_object = zipfile.ZipFile(filehandle, 'r') interest_rate_file = zip_file_object.open(zip_file_object.namelist()[1]) content = interest_rate_file.read() #print content root = ET.fromstring(content) print "\nInfo on InterestRates_%s_%s" % (ir_currency, ir_date) for a in [root.find(b) for b in ['./currency', './effectiveasof', './deposits/daycountconvention', './deposits/snaptime', './deposits/spotdate', './swaps/fixeddaycountconvention', './swaps/floatingdaycountconvention', './swaps/snaptime', './swaps/spotdate']]: print a.tag, a.text effectiveasof = root.find('./effectiveasof').text currency = root.find('./currency').text today = DateParser.parseFormatted(effectiveasof, '%Y-%m-%d') Settings.instance().evaluationDate = today print "\nDeposit Rates" deposits_maturitydates = [a.text for a in root.findall('.//deposits/curvepoint/maturitydate')] deposits_parrates_text = [a.text for a in root.findall('.//deposits/curvepoint/parrate')] deposits_tenors = [a.text for a in root.findall('.//deposits/curvepoint/tenor')] deposits_periods = [period_dict[a] for a in deposits_tenors] print pd.DataFrame(zip(deposits_tenors, deposits_maturitydates, map(float, deposits_parrates_text)), columns=('Tenor', 'Maturity', 'Parrate')) maturity_dict = {} for t, m in zip(deposits_tenors, deposits_maturitydates): d = {t: m} maturity_dict.update(d) print "\nSwap Rates" swaps_maturitydates = [a.text for a in root.findall('.//swaps/curvepoint/maturitydate')] swaps_parrates_text = [a.text for a in root.findall('.//swaps/curvepoint/parrate')] swaps_tenors = [a.text for a in root.findall('.//swaps/curvepoint/tenor')] swaps_periods = [period_dict[a] for a in swaps_tenors] print pd.DataFrame(zip(swaps_tenors, swaps_maturitydates, map(float, swaps_parrates_text)), columns=('Tenor', 'Maturity', 'Parrate')) for t, m in zip(swaps_tenors, swaps_maturitydates): d = {t: m} maturity_dict.update(d) #print maturity_dict euribor6m = Euribor6M() helpers = [DepositRateHelper(rate, Period(*tenor), 2, TARGET(), Following, False, Actual360()) for tenor, rate in zip(deposits_periods, map(float, deposits_parrates_text))] helpers += [SwapRateHelper(rate, Period(*tenor), TARGET(), Semiannual, Unadjusted, Thirty360(), euribor6m) for tenor, rate in zip(swaps_periods, map(float, swaps_parrates_text))] curve = PiecewiseLogCubicDiscount(2, TARGET(), helpers, Actual360()) curve.enableExtrapolation() spot = curve.referenceDate() #dates = [spot+Period(i,Months) for i in range(0, 30*12+1)] dates = [spot+Period(i, Years) for i in range(0, 30)] rates = [curve.forwardRate(d, euribor6m.maturityDate(d), Actual360(), Simple).rate() for d in dates] valid_dates = [d for d in dates if d >= spot] import matplotlib.pyplot as plt fig, ax = plt.subplots() fig.autofmt_xdate() ax.plot_date([to_datetime(d) for d in valid_dates], rates, '-') ax.set_xlim(to_datetime(min(dates)), to_datetime(max(dates))) ax.xaxis.set_major_locator(YearLocator(2, month=today.month(), day=today.dayOfMonth())) ax.xaxis.set_major_formatter(DateFormatter("%Y")) ax.xaxis.grid(True, 'major') ax.xaxis.grid(False, 'minor') ax.yaxis.set_major_formatter(FuncFormatter(lambda r, pos: format_rate(r))) plt.title("%s Interest Rate Curve Bootstrapping, effective %s" % (currency, effectiveasof)) plt.xlabel('Year') plt.ylabel('Rates') plt.show()






11. Compile QuantLib Python 1.10 for Mac

script.sh    Select all
# install Xcode and HomeBrew # ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" # install boost brew install boost # Download QuantLib-1.10 cd $(HOME)/Downloads wget --no-check-certificate https://jaist.dl.sourceforge.net/project/quantlib/test/QuantLib-1.10.tar.gz tar xzvf QuantLib-1.10.tar.gz # Compile QuantLib 1.10 cd QuantLib-1.10 ./configure --prefix=/usr/local/ CXXFLAGS='-O2 -stdlib=libstdc++ -mmacosx-version-min=10.6' LDFLAGS='-stdlib=libstdc++ -mmacosx-version-min=10.6' make && sudo make install # test compile c++ g++ Bonds.cpp -std=c++11 -stdlib=libstdc++ -o Bonds -lQuantLib ./Bonds # Download QuantLib-SWIG 1.10 cd $(HOME)/Downloads wget --no-check-certificate https://jaist.dl.sourceforge.net/project/quantlib/test/QuantLib-SWIG-1.10.tar.gz tar xzvf QuantLib-SWIG-1.10.tar.gz # Compile QuantLib Python cd QuantLib-SWIG-1.10 ./configure CXXFLAGS='-O2 -stdlib=libstdc++ -mmacosx-version-min=10.6' make -C Python make -C Python check sudo make -C Python install # Package wheel file sudo -H python pip install setuptools wheel cd $(HOME)/Downloads/QuantLib-SWIG-1.10/Python # Modify setup.py and replace from distutils.core import setup, Extension # With from setuptools import setup from distutils.core import Extension python setup.py bdist_wheel ls dist/


QuantLib_Python-1.10-cp27-cp27m-macosx_10_10_intel.whl download
QuantLib_Python-1.10-cp36-cp36m-macosx_10_6_intel.whl download



Saturday, December 31, 2016

How to create bootable PIXEL USB stick for Mac

The Debian+PIXEL is for x86 platforms. The PIXEL ISO, which is a 1.3GB download.

Reference : Fixing booting of the x86 image on Macs

Instructions to create EFI bootable USB stick for Mac. (tested working on my old MacBook Air 11-inch, Late 2010, Intel Core 2 Duo)

shell script    Select all
And here are the instructions to create EFI bootable USB stick on Mac # Running on Mac # list disk volumes diskutil list # assume format USB stick (64G) on /dev/disk1 with 2 partitions 8g and remaining 55g respectively # if for 32G USB stick, the 2 partition sizes can be divided into 4g and remaining 27g respectively sudo diskutil partitionDisk /dev/disk1 MBRFormat FAT32 LINUX 8g FAT32 PERSISTENCE 0b # for older Mac OSX 10.6, the partition type is "MS-DOS FAT32" # sudo diskutil partitionDisk /dev/disk1 MBRFormat "MS-DOS FAT32" LINUX 8g "MS-DOS FAT32" PERSISTENCE 0b mkdir -p /Volumes/LINUX/efi/boot # Download Enterprise-0.4.0.tar.gz to ~/Download # from http://blog.sevenbits.io/Enterprise/ cd ~/Downloads curl -OL https://github.com/SevenBits/Enterprise/releases/download/v0.4.0/Enterprise-0.4.0.tar.gz tar xzvf Enterprise-0.4.0.tar.gz cp ~/Downloads/Enterprise-0.4.0/*.efi /Volumes/LINUX/efi/boot/ cp ~/Downloads/2016-12-13-pixel-x86-jessie.iso /Volumes/LINUX/efi/boot/boot.iso # create enterprise.cfg cat > /Volumes/LINUX/efi/boot/enterprise.cfg << EOF autoboot 0 entry Debian family Debian initrd /live/initrd1.img kernel /live/vmlinuz1 findiso=/efi/boot/boot.iso boot=live config live-config quiet splash EOF # umount disk sudo diskutil unmountDisk disk1 # Reboot Mac and press Option key on restart and select EFI Boot for boot menu # Running on Debian PIXEL sudo fdisk -l #assume /dev/sdb is the USB stick sudo fdisk /dev/sdb # (d) (2) to delete partition 2 # and then (n) (p) (2) to recreate primary partition 2 for Linux in fdisk # (w) to write to partition table and quit fdisk # Reboot to let partition table effective # Running on Debian PIXEL # unmount /dev/sdb2 sudo umount /dev/sdb2 # format and label /dev/sdb2 sudo mkfs.ext4 -L persistence /dev/sdb2 # rename /dev/sdb2 if manually # sudo e2label /dev/sdb2 "persistence" # create persistence.conf sudo mkdir -p /mnt/persistence sudo mount -t ext4 /dev/sdb2 /mnt/persistence echo / union | sudo tee /mnt/persistence/persistence.conf #unmount /dev/sdb2 sudo umount /dev/sdb2 # Reboot # Running on Mac # recreate enterprise.cfg with persistence cat > /Volumes/LINUX/efi/boot/enterprise.cfg << EOF autoboot 0 entry Debian family Debian initrd /live/initrd1.img kernel /live/vmlinuz1 findiso=/efi/boot/boot.iso boot=live config live-config quiet splash persistence EOF # Reboot and Running on Debian PIXEL to verify and test persistence mode on Mac df -h


Additional configurations or installation for PIXEL using Terminal
shell script    Select all
# username of this image is pi # password is raspberry #keyboard configuration #Preferences -> Mouse and Keyboard Settings -> Keyboard -> Keyboard Layout... sudo dpkg-reconfigure keyboard-configuration #reload the keymap (need reboot to be effective) sudo invoke-rc.d keyboard-setup start #reset timezone sudo dpkg-reconfigure tzdata #generate locale sudo dpkg-reconfigure locales sudo locale-gen en_US.UTF-8 # requires reboot sudo update-locale LC_ALL="en_US.UTF-8" #scan private hidden SSID network sudo iwlist wlan0 scanning essid "yourSSID" # then edit /etc/wpa_supplicant/wpa_supplicant.conf and add scan_ssid=1 for auto scan #reset wireless interface sudo ifdown wlan0 sudo ifup wlan0 # or sudo service network-manager restart #reinstall sshd on the system sudo apt-get update sudo apt-get purge openssh-server sudo apt-get install -y openssh-server ssh # List available upgrade sudo apt-get update sudo apt-get -V -u --assume-no upgrade #two fingers tap on touch pad for Right Click synclient tapbutton2=3 #node.js x86 (32 bit) download cd $HOME wget --no-check-certificate https://nodejs.org/dist/v6.9.2/node-v6.9.2-linux-x86.tar.xz tar xJvf node-v6.9.2-linux-x86.tar.xz # put this in $HOME/.bashrc export PATH=$HOME/node-v6.9.2-linux-x86/bin:$PATH #google app engine for python download cd $HOME wget --no-check-certificate https://storage.googleapis.com/appengine-sdks/featured/google_appengine_1.9.49.zip unzip google_appengine_1.9.49.zip # put this in $HOME/.bashrc export PATH=$HOME/google_appengine:$PATH #Traditional Chinese input method, need reboot to be effective and control+space to activate #Choose Auto in Preferences -> Input Method sudo apt-get install -y scim-tables-zh im-config # install additional Chinese fonts sudo apt-get install -y ttf-wqy-microhei ttf-wqy-zenhei xfonts-wqy # install vlc sudo apt-get install -y vlc browser-plugin-vlc # restart control panel lxpanelctl restart #install spotify #add repo and certificate see instructions here https://www.spotify.com/download/linux/ sudo apt-get update sudo apt-get install -y spotify-client Here is Visual Studio Code (32 bits) for Debian https://go.microsoft.com/fwlink/?LinkID=760680








EFI bootable USB stick for Ubuntu 16.10 Exton x64 platforms (PC or Mac)

exton-os-64bit-mate-refracta-1840mb-161231.iso (which is Ubuntu 16.10 for x64 platforms) can be downloaded from here https://sourceforge.net/projects/exton-os/ and copy to /Volumes/LINUX/efi/boot/ as boot.iso

or alternatively use the exton-os-light-64bit-isohybrid-970mb-161021.iso image from https://sourceforge.net/projects/exton-os/files/

The setup for this image for persistence in Mac is similar to the Debian PIXEL above
except the enterprise.cfg content should be
shell script    Select all
cat > /Volumes/LINUX/efi/boot/enterprise.cfg << EOF autoboot 0 entry Ubuntu family Ubuntu initrd /live/initrd.img kernel /live/vmlinuz findiso=/efi/boot/boot.iso boot=live username=live config live-config splash persistence EOF


Additional configuration and installation for Ubuntu 16.10 Exton x64 using Terminal
shell script    Select all
# additional installation for swift 3.0 for Exton OS Ubuntu 16.10 # username of this Ubuntu image is root # password is root sudo apt-get update sudo apt-get install -y libicu-dev clang-3.6 git cd $HOME # To download swift 3 release for Ubuntu 16.04 instead as the one for ubuntu1610 has bugs wget --no-check-certificate https://swift.org/builds/swift-3.0.2-release/ubuntu1604/swift-3.0.2-RELEASE/swift-3.0.2-RELEASE-ubuntu16.04.tar.gz tar xzvf $HOME/swift-3.0.2-RELEASE-ubuntu16.04.tar.gz export PATH=$HOME/swift-3.0.2-RELEASE-ubuntu16.04/usr/bin:$PATH #wget --no-check-certificate https://swift.org/builds/development/ubuntu1610/swift-DEVELOPMENT-SNAPSHOT-2017-01-05-a/swift-DEVELOPMENT-SNAPSHOT-2017-01-05-a-ubuntu16.10.tar.gz #tar xzvf $HOME/swift-DEVELOPMENT-SNAPSHOT-2017-01-05-a-ubuntu16.10.tar.gz #export PATH=$HOME/swift-DEVELOPMENT-SNAPSHOT-2017-01-05-a-ubuntu16.10/usr/bin:$PATH sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-3.6 100 sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-3.6 100 swift --version #node.js x64 (64 bit) download cd $HOME wget --no-check-certificate https://nodejs.org/dist/v6.9.3/node-v6.9.3-linux-x64.tar.xz tar xJvf node-v6.9.3-linux-x64.tar.xz # put this in $HOME/.bashrc export PATH=$HOME/node-v6.9.3-linux-x64/bin:$PATH node --version npm --version #install spotify sudo apt-get update sudo apt-get install -y spotify-client #Traditional Chinese input method sudo apt-get install -y ibus-cangjie ibus restart #then choose input method in System -> Preferences -> Other # install R # see insturctions here https://cloud.r-project.org/bin/linux/ubuntu/README.html cd $HOME echo deb https://cran.cnr.berkeley.edu//bin/linux/ubuntu yakkety/ | sudo tee /etc/apt/sources.list.d/r.list sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E084DAB9 gpg --keyserver keyserver.ubuntu.com --recv-key E084DAB9 gpg -a --export E084DAB9 | sudo apt-key add - sudo apt-get update sudo apt-get install -y r-base # download R Studio from https://www.rstudio.com/products/rstudio/download/ and install sudo apt-get install -y libjpeg62 libgstreamer0.10-0 libgstreamer-plugins-base0.10-0 cd ~/Downloads wget --no-check-certificate https://download1.rstudio.org/rstudio-1.0.136-amd64.deb sudo dpkg -i rstudio-1.0.136-amd64.deb # install Quantlib 1.9.1 sudo apt-get update sudo apt-get install -y libboost1.60-all-dev cd $HOME wget https://ncu.dl.sourceforge.net/project/quantlib/QuantLib/1.9.1/QuantLib-1.9.1.tar.gz tar xzvf QuantLib-1.9.1.tar.gz cd QuantLib-1.9.1 ./autogen.sh ./configure --prefix=/usr make -j9 sudo make install # Install RQuantLib Package in R # install.packages("RQuantLib") # install Quantlib-Python cd $HOME wget http://jaist.dl.sourceforge.net/project/quantlib/QuantLib/1.9/other%20languages/QuantLib-SWIG-1.9.tar.gz tar xzvf QuantLib-SWIG-1.9.tar.gz cd QuantLib-SWIG-1.9 ./autogen.sh ./configure make -C Python sudo make -C Python install # upgrade pip sudo apt-get update sudo apt-get install -y python-pip pip install --upgrade pip sudo pip install numpy # install ipython sudo pip install ipython # install jupyter notebook sudo pip install jupyter # List available upgrade sudo apt-get update sudo apt list --upgradeable # test QuantLib and QuantLib-Python cd $HOME cat > $HOME/qlversion.cpp <<EOF #include <iostream> #include <ql/version.hpp> int main() { std::cout << "Current QL Version:" << QL_LIB_VERSION << std::endl; return 0; } EOF g++ qlversion.cpp -o qlversion ./qlversion cat > $HOME/swap.py <<EOF import numpy as np import QuantLib as ql # Set Evaluation Date today = ql.Date(31,3,2015) ql.Settings.instance().setEvaluationDate(today) # Setup the yield termstructure rate = ql.SimpleQuote(0.03) rate_handle = ql.QuoteHandle(rate) dc = ql.Actual365Fixed() disc_curve = ql.FlatForward(today, rate_handle, dc) disc_curve.enableExtrapolation() hyts = ql.YieldTermStructureHandle(disc_curve) discount = np.vectorize(hyts.discount) start = ql.TARGET().advance(today, ql.Period('2D')) end = ql.TARGET().advance(start, ql.Period('10Y')) nominal = 1e7 typ = ql.VanillaSwap.Payer fixRate = 0.03 fixedLegTenor = ql.Period('1y') fixedLegBDC = ql.ModifiedFollowing fixedLegDC = ql.Thirty360(ql.Thirty360.BondBasis) index = ql.Euribor6M(ql.YieldTermStructureHandle(disc_curve)) spread = 0.0 fixedSchedule = ql.Schedule(start, end, fixedLegTenor, index.fixingCalendar(), fixedLegBDC, fixedLegBDC, ql.DateGeneration.Backward, False) floatSchedule = ql.Schedule(start, end, index.tenor(), index.fixingCalendar(), index.businessDayConvention(), index.businessDayConvention(), ql.DateGeneration.Backward, False) swap = ql.VanillaSwap(typ, nominal, fixedSchedule, fixRate, fixedLegDC, floatSchedule, index, spread, index.dayCounter()) engine = ql.DiscountingSwapEngine(ql.YieldTermStructureHandle(disc_curve)) swap.setPricingEngine(engine) print(swap.NPV()) print(swap.fairRate()) EOF python swap.py sudo apt-get install -y git cd $HOME git clone git://github.com/mmport80/QuantLib-with-Python-Blog-Examples.git cd QuantLib-with-Python-Blog-Examples/ python blog_frn_example.py








If for Debian PIXEL-x86 and Ubuntu-16.10 Exton-x64 together in one USB stick with persistence
shell script    Select all
# Running on Mac # copy iso to USB stick rm -f /Volumes/LINUX/efi/boot/boot.iso cp ~/Downloads/2016-12-13-pixel-x86-jessie.iso /Volumes/LINUX/efi/boot/pixel.iso cp ~/Downloads/exton-os-64bit-mate-refracta-1840mb-161231.iso /Volumes/LINUX/efi/boot/exton.iso # set up enterprise.cfg in USB stick and assume persistence is already formatted as ext4 with persistence.conf cat > /Volumes/LINUX/efi/boot/enterprise.cfg << EOF entry Debian PIXEL family Debian iso pixel.iso initrd /live/initrd1.img kernel /live/vmlinuz1 findiso=/efi/boot/pixel.iso boot=live config live-config quiet splash persistence entry Ubuntu 16.10 Exton family Ubuntu iso exton.iso initrd /live/initrd.img kernel /live/vmlinuz findiso=/efi/boot/exton.iso boot=live username=live config live-config splash persistence EOF








Add the Original Ubuntu 16.04 from Ubuntu to the EFI bootable USB stick

For the Original ubuntu-16.04.1-desktop-amd64.iso image, add it by copying the downloaded iso image to the LINUX FAT32 partition and create the enterprise.cfg as below
shell script    Select all
# Running on Mac # copy iso to USB stick rm -f /Volumes/LINUX/efi/boot/boot.iso cp ~/Downloads/2016-12-13-pixel-x86-jessie.iso /Volumes/LINUX/efi/boot/pixel.iso cp ~/Downloads/exton-os-64bit-mate-refracta-1840mb-161231.iso /Volumes/LINUX/efi/boot/exton.iso cp ~/Downloads/ubuntu-16.04.1-desktop-amd64.iso /Volumes/LINUX/efi/boot/ubuntu.iso cat > /Volumes/LINUX/efi/boot/enterprise.cfg << EOF entry Debian PIXEL family Debian iso pixel.iso initrd /live/initrd1.img kernel /live/vmlinuz1 findiso=/efi/boot/pixel.iso boot=live config live-config quiet splash persistence entry Ubuntu 16.10 Exton family Ubuntu iso exton.iso initrd /live/initrd.img kernel /live/vmlinuz findiso=/efi/boot/exton.iso boot=live username=live config live-config splash persistence entry Ubuntu 16.04-1 family Ubuntu iso ubuntu.iso initrd /casper/initrd.lz kernel /casper/vmlinuz.efi findiso=/efi/boot/ubuntu.iso file=/cdrom/preseed/ubuntu.seed boot=casper persistent quiet splash --- EOF # Reboot and running in the new Ubuntu 16.04-1 # it requires a Linux partition named casper-rw in order to enable the persistent feature. # So we need to create a third partition in Linux and then format it. # Running on Ubuntu 16.04 # First remove the second partition and recreate second partition with smaller size and add a third partition to it sudo fdisk -l #assume /dev/sdb is the USB stick # umount the partition 2 in order to modify it sudo umount/dev/sdb2 # partition the USB stick sudo fdisk /dev/sdb # (d) (2) to delete partition 2 # and then (n) (p) (2) to recreate primary partition 2 for Linux in fdisk # choose size say 20G if for 64G USB stick # and then (n) (p) (3) to recreate primary partition 3 for Linux in fdisk # choose size say remaining sectors # (w) to write to partition table and quit fdisk # Reboot to let partition table effective # Running on Ubuntu 16.04-1 # format the second partition with label persistence and add persistence.conf sudo mkfs.ext4 -L persistence /dev/sdb2 sudo mkdir -p /media/ubuntu/persistence sudo mount /dev/sdb2 /media/ubuntu/persistence echo / union | sudo tee /media/ubuntu/persistence/persistence.conf # format the third partition with label casper-rw sudo mkfs.ext4 -L casper-rw /dev/sdb3 # Reboot to start other configuration and installation


Additional configuration and installation for Ubuntu 16.04-1 using Terminal
shell script    Select all
# additional installation for swift 3.0.2 for Ubuntu 16.04 # username of this Ubuntu image is ubuntu # password is ubuntu # Additional installation needs to add these lines in /etc/apt/sources.list echo "deb http://archive.ubuntu.com/ubuntu/ xenial universe" | sudo tee --append /etc/apt/sources.list echo "deb http://archive.ubuntu.com/ubuntu/ xenial-updates universe" | sudo tee --append /etc/apt/sources.list echo "deb http://security.ubuntu.com/ubuntu/ xenial-security universe" | sudo tee --append /etc/apt/sources.list # To install swift 3.0.2 release for Ubuntu 16.04-1 is sudo apt-get update # for AppStream cache update failed error sudo chmod 777 /var/cache/app-info/xapian/default -R sudo apt-get update sudo apt-get install -y libicu-dev clang-3.6 git cd $HOME wget --no-check-certificate https://swift.org/builds/swift-3.0.2-release/ubuntu1604/swift-3.0.2-RELEASE/swift-3.0.2-RELEASE-ubuntu16.04.tar.gz tar xzvf $HOME/swift-3.0.2-RELEASE-ubuntu16.04.tar.gz export PATH=$HOME/swift-3.0.2-RELEASE-ubuntu16.04/usr/bin:$PATH sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-3.6 100 sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-3.6 100 swift --version #node.js x64 (64 bit) download cd $HOME wget --no-check-certificate https://nodejs.org/dist/v6.9.3/node-v6.9.3-linux-x64.tar.xz tar xJvf node-v6.9.3-linux-x64.tar.xz # put this in $HOME/.bashrc export PATH=$HOME/node-v6.9.3-linux-x64/bin:$PATH node --version npm --version #install spotify sudo apt-get update sudo apt-get install -y spotify-client #Traditional Chinese input method sudo apt-get install -y ibus-cangjie ibus restart # install R # see insturctions here https://cloud.r-project.org/bin/linux/ubuntu/README.html cd $HOME echo deb https://cran.cnr.berkeley.edu//bin/linux/ubuntu xenial/ | sudo tee /etc/apt/sources.list.d/r.list sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E084DAB9 gpg --keyserver keyserver.ubuntu.com --recv-key E084DAB9 gpg -a --export E084DAB9 | sudo apt-key add - sudo apt-get update sudo apt-get install -y r-base # download R Studio from https://www.rstudio.com/products/rstudio/download/ and install sudo apt-get install -y libjpeg62 libgstreamer0.10-0 libgstreamer-plugins-base0.10-0 cd ~/Downloads wget --no-check-certificate https://download1.rstudio.org/rstudio-1.0.136-amd64.deb sudo dpkg -i rstudio-1.0.136-amd64.deb # install Quantlib 1.9.1 sudo apt-get update sudo apt-get install -y libboost1.58-all-dev cd $HOME wget https://ncu.dl.sourceforge.net/project/quantlib/QuantLib/1.9.1/QuantLib-1.9.1.tar.gz tar xzvf QuantLib-1.9.1.tar.gz cd QuantLib-1.9.1 ./autogen.sh ./configure --prefix=/usr make -j9 sudo make install # Install RQuantLib Package in R # install.packages("RQuantLib") # install Quantlib-Python cd $HOME wget http://jaist.dl.sourceforge.net/project/quantlib/QuantLib/1.9/other%20languages/QuantLib-SWIG-1.9.tar.gz tar xzvf QuantLib-SWIG-1.9.tar.gz cd QuantLib-SWIG-1.9 ./autogen.sh ./configure make -C Python sudo make -C Python install # upgrade pip and install numpy sudo apt-get update sudo apt-get install -y python-pip sudo -H pip install --upgrade pip sudo -H pip install numpy # test QuantLib and QuantLib-Python cd $HOME cat > $HOME/qlversion.cpp <<EOF #include <iostream> #include <ql/version.hpp> int main() { std::cout << "Current QL Version:" << QL_LIB_VERSION << std::endl; return 0; } EOF g++ qlversion.cpp -o qlversion ./qlversion sudo apt-get install -y git cd $HOME git clone git://github.com/mmport80/QuantLib-with-Python-Blog-Examples.git cd QuantLib-with-Python-Blog-Examples/ python blog_frn_example.py # List available upgrade sudo apt-get update sudo apt list --upgradeable


Sunday, November 13, 2016

How to build C++ static libraries (boost and QuantLib) for Android Studio

(1) Create standalone toolchain for Android in Mac
shell script    Select all
#create standalone toolchain for x86, x86_64, arm and arm64 #assume ndk is installed in Mac at ~/Library/Android/sdk/ndk-bundle #API level will be set to the minimum supported level for the given architecture (currently 9 for 32-bit architectures and 21 for 64-bit architectures) ~/Library/Android/sdk/ndk-bundle/build/tools/make_standalone_toolchain.py --arch x86 --install-dir ~/Library/Android/sdk/ndk-bundle/sources/android-toolchain-x86 ~/Library/Android/sdk/ndk-bundle/build/tools/make_standalone_toolchain.py --arch x86_64 --install-dir ~/Library/Android/sdk/ndk-bundle/sources/android-toolchain-x86_64 ~/Library/Android/sdk/ndk-bundle/build/tools/make_standalone_toolchain.py --arch arm --install-dir ~/Library/Android/sdk/ndk-bundle/sources/android-toolchain-arm ~/Library/Android/sdk/ndk-bundle/build/tools/make_standalone_toolchain.py --arch arm64 --install-dir ~/Library/Android/sdk/ndk-bundle/sources/android-toolchain-arm64


(2) Download and build boost for Android
shell script    Select all
# download boost source to ndk-bundle cd ~/Library/Android/sdk/ndk-bundle/sources curl -O http://ncu.dl.sourceforge.net/project/boost/boost/1.62.0/boost_1_62_0.tar.bz2 tar xjvf boost_1_62_0.tar.bz2 cd boost_1_62_0 # create the following user-config.jam at ~/Library/Android/sdk/ndk-bundle/sources/boost_1_62_0/tools/build/src/ cat > tools/build/src/user-config.jam << 'EOF' # ------------------ # Android configurations. # ------------------ import os ; local NDK_ROOT = [ os.environ NDK_ROOT ] ; # -------------------------------------------------------------------- local ANDROID_TOOLCHAIN_x86 = /sources/android-toolchain-x86 ; using gcc : x86 : $(NDK_ROOT)$(ANDROID_TOOLCHAIN_x86)/bin/i686-linux-android-g++ : <archiver>$(NDK_ROOT)$(ANDROID_TOOLCHAIN_x86)/bin/i686-linux-android-ar <compileflags>-fexceptions <compileflags>-frtti <compileflags>-fpic <compileflags>-ffunction-sections <compileflags>-funwind-tables <compileflags>-Wno-psabi <compileflags>-Wno-missing-field-initializers <compileflags>-no-canonical-prefixes <linkflags>-no-canonical-prefixes <compileflags>-Os <compileflags>-fomit-frame-pointer <compileflags>-fno-strict-aliasing <compileflags>-funswitch-loops <compileflags>-finline-limit=300 <compileflags>-Wa,--noexecstack <compileflags>-DANDROID <compileflags>-D__ANDROID__ <compileflags>-DNDEBUG <compileflags>-O2 <compileflags>-g <root>$(NDK_ROOT)$(ANDROID_TOOLCHAIN_x86)/sysroot # @Moss - Above are the 'official' android flags <architecture>x86 <compileflags>-fvisibility=hidden <compileflags>-fvisibility-inlines-hidden <compileflags>-fdata-sections <cxxflags>-D_REENTRANT <cxxflags>-D_GLIBCXX__PTHREADS <compileflags>-Wno-long-long <compileflags>-Wno-missing-field-initializers <compileflags>-Wno-unused-variable ; # -------------------------------------------------------------------- local ANDROID_TOOLCHAIN_x86_64 = /sources/android-toolchain-x86_64 ; using gcc : x86_64 : $(NDK_ROOT)$(ANDROID_TOOLCHAIN_x86_64)/bin/x86_64-linux-android-g++ : <archiver>$(NDK_ROOT)$(ANDROID_TOOLCHAIN_x86_64)/bin/x86_64-linux-android-ar <compileflags>-fexceptions <compileflags>-frtti <compileflags>-fpic <compileflags>-ffunction-sections <compileflags>-funwind-tables <compileflags>-Wno-psabi <compileflags>-Wno-missing-field-initializers <compileflags>-no-canonical-prefixes <linkflags>-no-canonical-prefixes <compileflags>-Os <compileflags>-fomit-frame-pointer <compileflags>-fno-strict-aliasing <compileflags>-funswitch-loops <compileflags>-finline-limit=300 <compileflags>-Wa,--noexecstack <compileflags>-DANDROID <compileflags>-D__ANDROID__ <compileflags>-DNDEBUG <compileflags>-O2 <compileflags>-g <root>$(NDK_ROOT)$(ANDROID_TOOLCHAIN_x86_64)/sysroot # @Moss - Above are the 'official' android flags <architecture>x86 <compileflags>-fvisibility=hidden <compileflags>-fvisibility-inlines-hidden <compileflags>-fdata-sections <cxxflags>-D_REENTRANT <cxxflags>-D_GLIBCXX__PTHREADS <compileflags>-Wno-long-long <compileflags>-Wno-missing-field-initializers <compileflags>-Wno-unused-variable ; # -------------------------------------------------------------------- local ANDROID_TOOLCHAIN_ARM = /sources/android-toolchain-arm ; using gcc : armeabi : $(NDK_ROOT)$(ANDROID_TOOLCHAIN_ARM)/bin/arm-linux-androideabi-g++ : <archiver>$(NDK_ROOT)$(ANDROID_TOOLCHAIN_ARM)/bin/arm-linux-androideabi-ar <compileflags>-fexceptions <compileflags>-frtti <compileflags>-fpic <compileflags>-ffunction-sections <compileflags>-funwind-tables <compileflags>-D__ARM_ARCH_5__ <compileflags>-D__ARM_ARCH_5T__ <compileflags>-D__ARM_ARCH_5E__ <compileflags>-D__ARM_ARCH_5TE__ <compileflags>-Wno-psabi <compileflags>-march=armv5te <compileflags>-mtune=xscale <compileflags>-msoft-float <compileflags>-mthumb <linkflags>-march=armv5te <compileflags>-Os <compileflags>-fomit-frame-pointer <compileflags>-fno-strict-aliasing <compileflags>-finline-limit=64 <compileflags>-Wa,--noexecstack <compileflags>-DANDROID <compileflags>-D__ANDROID__ <compileflags>-DNDEBUG <compileflags>-O2 <compileflags>-g <root>$(NDK_ROOT)$(ANDROID_TOOLCHAIN_ARM)/sysroot # @Moss - Above are the 'official' android flags <architecture>arm <compileflags>-fvisibility=hidden <compileflags>-fvisibility-inlines-hidden <compileflags>-fdata-sections <cxxflags>-D_REENTRANT <cxxflags>-D_GLIBCXX__PTHREADS <compileflags>-Wno-long-long <compileflags>-Wno-missing-field-initializers <compileflags>-Wno-unused-variable ; # -------------------------------------------------------------------- using gcc : armeabi_v7a : $(NDK_ROOT)$(ANDROID_TOOLCHAIN_ARM)/bin/arm-linux-androideabi-g++ : <archiver>$(NDK_ROOT)$(ANDROID_TOOLCHAIN_ARM)/bin/arm-linux-androideabi-ar <compileflags>-fexceptions <compileflags>-frtti <compileflags>-fpic <compileflags>-ffunction-sections <compileflags>-funwind-tables <compileflags>-Wno-psabi <compileflags>-march=armv7-a <compileflags>-msoft-float <compileflags>-mfpu=neon <compileflags>-mthumb <linkflags>-march=armv7-a <linkflags>-Wl,--fix-cortex-a8 <compileflags>-Os <compileflags>-fomit-frame-pointer <compileflag>-fno-strict-aliasing <compileflags>-finline-limit=64 <compileflags>-Wa,--noexecstack <compileflags>-DANDROID <compileflags>-D__ANDROID__ <compileflags>-DNDEBUG <compileflags>-O2 <compileflags>-g <root>$(NDK_ROOT)$(ANDROID_TOOLCHAIN_ARM)/sysroot # @Moss - Above are the 'official' android flags <architecture>arm <compileflags>-fvisibility=hidden <compileflags>-fvisibility-inlines-hidden <compileflags>-fdata-sections <cxxflags>-D__arm__ <cxxflags>-D_REENTRANT <cxxflags>-D_GLIBCXX__PTHREADS <compileflags>-Wno-long-long <compileflags>-Wno-missing-field-initializers <compileflags>-Wno-unused-variable ; # -------------------------------------------------------------------- local ANDROID_TOOLCHAIN_ARM64 = /sources/android-toolchain-arm64 ; using gcc : arm64_v8a : $(NDK_ROOT)$(ANDROID_TOOLCHAIN_ARM64)/bin/aarch64-linux-android-g++ : <archiver>$(NDK_ROOT)$(ANDROID_TOOLCHAIN_ARM64)/bin/aarch64-linux-android-ar <compileflags>-fexceptions <compileflags>-frtti <compileflags>-fpic <compileflags>-ffunction-sections <compileflags>-funwind-tables <compileflags>-fstack-protector <compileflags>-Wno-psabi <compileflags>-march=armv8-a <compileflags>-mtune=cortex-a53 <linkflags>-march=armv8-a <compileflags>-Os <compileflags>-fno-short-enums <compileflags>-fomit-frame-pointer <compileflags>-fno-strict-aliasing <compileflags>-finline-limit=64 <compileflags>-DANDROID <compileflags>-D__ANDROID__ <compileflags>-DNDEBUG <compileflags>-O2 <compileflags>-g <root>$(NDK_ROOT)$(ANDROID_TOOLCHAIN_ARM64)/sysroot # @Moss - Above are the 'official' android flags <architecture>arm <compileflags>-fvisibility=hidden <compileflags>-fvisibility-inlines-hidden <compileflags>-fdata-sections <cxxflags>-D_REENTRANT <cxxflags>-D_GLIBCXX__PTHREADS <compileflags>-Wno-long-long <compileflags>-Wno-missing-field-initializers <compileflags>-Wno-unused-variable ; EOF # bootstrap ./bootstrap.sh --with-libraries=atomic,chrono,date_time,exception,filesystem,graph,iostreams,math,program_options,random,regex,serialization,signals,system,test,thread,wave # clean and build for Android, j option is num of cores x 1.5 rm -fr android-build ./b2 -j6 -sNDK_ROOT="$HOME/Library/Android/sdk/ndk-bundle" --build-dir=android-build --stagedir=android-build/x86 toolset=gcc-x86 threading=multi link=static stage ./b2 -j6 -sNDK_ROOT="$HOME/Library/Android/sdk/ndk-bundle" --build-dir=android-build --stagedir=android-build/x86_64 toolset=gcc-x86_64 threading=multi link=static stage ./b2 -j6 -sNDK_ROOT="$HOME/Library/Android/sdk/ndk-bundle" --build-dir=android-build --stagedir=android-build/armeabi toolset=gcc-armeabi threading=multi link=static stage ./b2 -j6 -sNDK_ROOT="$HOME/Library/Android/sdk/ndk-bundle" --build-dir=android-build --stagedir=android-build/armeabi-v7a toolset=gcc-armeabi_v7a threading=multi link=static stage ./b2 -j6 -sNDK_ROOT="$HOME/Library/Android/sdk/ndk-bundle" --build-dir=android-build --stagedir=android-build/arm64-v8a toolset=gcc-arm64_v8a threading=multi link=static stage # create link for include folder cd android-build mkdir -p include cd include ln -s ../../boost .


(3) Create Android.mk at ~/Library/Android/sdk/ndk-bundle/sources/boost_1_62_0/ for ndkBuild in Android Studio
~/Library/Android/sdk/ndk-bundle/sources/boost_1_62_0/Android.mk    Select all
# create the following Android.mk cat > ~/Library/Android/sdk/ndk-bundle/sources/boost_1_62_0/Android.mk << 'EOF' LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := libboost_atomic LOCAL_SRC_FILES := android-build/$(TARGET_ARCH_ABI)/lib/libboost_atomic.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/android-build/include LOCAL_CPP_FEATURES := rtti exceptions include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libboost_chrono LOCAL_SRC_FILES := android-build/$(TARGET_ARCH_ABI)/lib/libboost_chrono.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/android-build/include LOCAL_CPP_FEATURES := rtti exceptions include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libboost_date_time LOCAL_SRC_FILES := android-build/$(TARGET_ARCH_ABI)/lib/libboost_date_time.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/android-build/include LOCAL_CPP_FEATURES := rtti exceptions include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libboost_exception LOCAL_SRC_FILES := android-build/$(TARGET_ARCH_ABI)/lib/libboost_exception.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/android-build/include LOCAL_CPP_FEATURES := rtti exceptions include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libboost_filesystem LOCAL_SRC_FILES := android-build/$(TARGET_ARCH_ABI)/lib/libboost_filesystem.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/android-build/include LOCAL_CPP_FEATURES := rtti exceptions include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libboost_graph LOCAL_SRC_FILES := android-build/$(TARGET_ARCH_ABI)/lib/libboost_graph.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/android-build/include LOCAL_CPP_FEATURES := rtti exceptions include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libboost_iostreams LOCAL_SRC_FILES := android-build/$(TARGET_ARCH_ABI)/lib/libboost_iostreams.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/android-build/include LOCAL_CPP_FEATURES := rtti exceptions include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libboost_math_c99 LOCAL_SRC_FILES := android-build/$(TARGET_ARCH_ABI)/lib/libboost_math_c99.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/android-build/include LOCAL_CPP_FEATURES := rtti exceptions include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libboost_math_c99f LOCAL_SRC_FILES := android-build/$(TARGET_ARCH_ABI)/lib/libboost_math_c99f.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/android-build/include LOCAL_CPP_FEATURES := rtti exceptions include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libboost_math_c99l LOCAL_SRC_FILES := android-build/$(TARGET_ARCH_ABI)/lib/libboost_math_c99l.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/android-build/include LOCAL_CPP_FEATURES := rtti exceptions include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libboost_math_tr1 LOCAL_SRC_FILES := android-build/$(TARGET_ARCH_ABI)/lib/libboost_math_tr1.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/android-build/include LOCAL_CPP_FEATURES := rtti exceptions include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libboost_math_tr1f LOCAL_SRC_FILES := android-build/$(TARGET_ARCH_ABI)/lib/libboost_math_tr1f.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/android-build/include LOCAL_CPP_FEATURES := rtti exceptions include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libboost_math_tr1l LOCAL_SRC_FILES := android-build/$(TARGET_ARCH_ABI)/lib/libboost_math_tr1l.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/android-build/include LOCAL_CPP_FEATURES := rtti exceptions include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libboost_prg_exec_monitor LOCAL_SRC_FILES := android-build/$(TARGET_ARCH_ABI)/lib/libboost_prg_exec_monitor.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/android-build/include LOCAL_CPP_FEATURES := rtti exceptions include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libboost_program_options LOCAL_SRC_FILES := android-build/$(TARGET_ARCH_ABI)/lib/libboost_program_options.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/android-build/include LOCAL_CPP_FEATURES := rtti exceptions include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libboost_random LOCAL_SRC_FILES := android-build/$(TARGET_ARCH_ABI)/lib/libboost_random.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/android-build/include LOCAL_CPP_FEATURES := rtti exceptions include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libboost_regex LOCAL_SRC_FILES := android-build/$(TARGET_ARCH_ABI)/lib/libboost_regex.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/android-build/include LOCAL_CPP_FEATURES := rtti exceptions include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libboost_serialization LOCAL_SRC_FILES := android-build/$(TARGET_ARCH_ABI)/lib/libboost_serialization.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/android-build/include LOCAL_CPP_FEATURES := rtti exceptions include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libboost_signals LOCAL_SRC_FILES := android-build/$(TARGET_ARCH_ABI)/lib/libboost_signals.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/android-build/include LOCAL_CPP_FEATURES := rtti exceptions include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libboost_system LOCAL_SRC_FILES := android-build/$(TARGET_ARCH_ABI)/lib/libboost_system.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/android-build/include LOCAL_CPP_FEATURES := rtti exceptions include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libboost_test_exec_monitor LOCAL_SRC_FILES := android-build/$(TARGET_ARCH_ABI)/lib/libboost_test_exec_monitor.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/android-build/include LOCAL_CPP_FEATURES := rtti exceptions include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libboost_thread LOCAL_SRC_FILES := android-build/$(TARGET_ARCH_ABI)/lib/libboost_thread.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/android-build/include LOCAL_CPP_FEATURES := rtti exceptions include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libboost_timer LOCAL_SRC_FILES := android-build/$(TARGET_ARCH_ABI)/lib/libboost_timer.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/android-build/include LOCAL_CPP_FEATURES := rtti exceptions include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libboost_unit_test_framework LOCAL_SRC_FILES := android-build/$(TARGET_ARCH_ABI)/lib/libboost_unit_test_framework.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/android-build/include LOCAL_CPP_FEATURES := rtti exceptions include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libboost_wave LOCAL_SRC_FILES := android-build/$(TARGET_ARCH_ABI)/lib/libboost_wave.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/android-build/include LOCAL_CPP_FEATURES := rtti exceptions include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libboost_wserialization LOCAL_SRC_FILES := android-build/$(TARGET_ARCH_ABI)/lib/libboost_wserialization.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/android-build/include LOCAL_CPP_FEATURES := rtti exceptions include $(PREBUILT_STATIC_LIBRARY) EOF


(4) Download and build QuantLib for Android
shell script    Select all
# download quantlib source to ndk-bundle cd ~/Library/Android/sdk/ndk-bundle/sources curl -O http://nchc.dl.sourceforge.net/project/quantlib/QuantLib/1.9/QuantLib-1.9.tar.gz tar xzvf QuantLib-1.9.tar.gz cd QuantLib-1.9 #Create the following shell script for x86 cat > ~/Library/Android/sdk/ndk-bundle/sources/QuantLib-1.9/build-x86.sh << 'x86EOF' #!/bin/bash # build-x86.sh BUILD_DIR=android-build mkdir -p ${BUILD_DIR} INSTALL_DIR="`pwd`/${BUILD_DIR}" YOUR_PATH_TO_INSTALL_DIR="`cd "${INSTALL_DIR}";pwd`" NDK_DIR="${HOME}/Library/Android/sdk/ndk-bundle" YOUR_PATH_TO_NDK="`cd "${NDK_DIR}";pwd`" YOUR_TOOLCHAIN=${YOUR_PATH_TO_NDK}/sources/android-toolchain-x86 export CC=${YOUR_TOOLCHAIN}/bin/i686-linux-android-gcc export CXX=${YOUR_TOOLCHAIN}/bin/i686-linux-android-g++ export CPP=${YOUR_TOOLCHAIN}/bin/i686-linux-android-cpp export AR=${YOUR_TOOLCHAIN}/bin/i686-linux-android-ar export RANLIB=${YOUR_TOOLCHAIN}/bin/i686-linux-android-ranlib export LD=${YOUR_TOOLCHAIN}/bin/i686-linux-android-ld export CPPFLAGS="-fexceptions -frtti -fpic -ffunction-sections -funwind-tables -fvisibility=hidden -fvisibility-inlines-hidden -fdata-sections" export CXXFLAGS="-DANDROID -D__ANDROID__ -DNDEBUG -O2 -g -D_REENTRANT -D_GLIBCXX__PTHREADS" sysroot=${YOUR_TOOLCHAIN} boost_include="`cd "${YOUR_PATH_TO_NDK}/sources/boost_1_62_0/android-build/include";pwd`" boost_lib="`cd "${YOUR_PATH_TO_NDK}/sources/boost_1_62_0/android-build/x86/lib";pwd`" make distclean ./configure --prefix=/x86 --host=i686-linux-android --with-sysroot=${sysroot} --with-boost-include=${boost_include} --with-boost-lib=${boost_lib} --enable-static --enable-shared=no --enable-examples=no --enable-thread-safe-observer-pattern make -j6 make install DESTDIR=${YOUR_PATH_TO_INSTALL_DIR} x86EOF #Create the following shell script for x86_64 cat > ~/Library/Android/sdk/ndk-bundle/sources/QuantLib-1.9/build-x86_64.sh << 'x86_64EOF' #!/bin/bash # build-x86_64.sh BUILD_DIR=android-build mkdir -p ${BUILD_DIR} INSTALL_DIR="`pwd`/${BUILD_DIR}" YOUR_PATH_TO_INSTALL_DIR="`cd "${INSTALL_DIR}";pwd`" NDK_DIR="${HOME}/Library/Android/sdk/ndk-bundle" YOUR_PATH_TO_NDK="`cd "${NDK_DIR}";pwd`" YOUR_TOOLCHAIN=${YOUR_PATH_TO_NDK}/sources/android-toolchain-x86_64 export CC=${YOUR_TOOLCHAIN}/bin/x86_64-linux-android-gcc export CXX=${YOUR_TOOLCHAIN}/bin/x86_64-linux-android-g++ export CPP=${YOUR_TOOLCHAIN}/bin/x86_64-linux-android-cpp export AR=${YOUR_TOOLCHAIN}/bin/x86_64-linux-android-ar export RANLIB=${YOUR_TOOLCHAIN}/bin/x86_64-linux-android-ranlib export LD=${YOUR_TOOLCHAIN}/bin/x86_64-linux-android-ld export CPPFLAGS="-fexceptions -frtti -fpic -ffunction-sections -funwind-tables -fvisibility=hidden -fvisibility-inlines-hidden -fdata-sections" export CXXFLAGS="-D_REENTRANT -D_GLIBCXX__PTHREADS -DANDROID -D__ANDROID__ -DNDEBUG -O2 -g" sysroot=${YOUR_TOOLCHAIN} boost_include="`cd "${YOUR_PATH_TO_NDK}/sources/boost_1_62_0/android-build/include";pwd`" boost_lib="`cd "${YOUR_PATH_TO_NDK}/sources/boost_1_62_0/android-build/x86_64/lib";pwd`" make distclean ./configure --prefix=/x86_64 --host=x86_64-linux-android --with-sysroot=${sysroot} --with-boost-include=${boost_include} --with-boost-lib=${boost_lib} --enable-static --enable-shared=no --enable-examples=no --enable-thread-safe-observer-pattern make -j6 make install DESTDIR=${YOUR_PATH_TO_INSTALL_DIR} x86_64EOF #Create the following shell script for armeabi cat > ~/Library/Android/sdk/ndk-bundle/sources/QuantLib-1.9/build-armeabi.sh << 'armeabiEOF' #!/bin/bash # build-armeabi.sh BUILD_DIR=android-build mkdir -p ${BUILD_DIR} INSTALL_DIR="`pwd`/${BUILD_DIR}" YOUR_PATH_TO_INSTALL_DIR="`cd "${INSTALL_DIR}";pwd`" NDK_DIR="${HOME}/Library/Android/sdk/ndk-bundle" YOUR_PATH_TO_NDK="`cd "${NDK_DIR}";pwd`" YOUR_TOOLCHAIN=${YOUR_PATH_TO_NDK}/sources/android-toolchain-arm export CC=${YOUR_TOOLCHAIN}/bin/arm-linux-androideabi-gcc export CXX=${YOUR_TOOLCHAIN}/bin/arm-linux-androideabi-g++ export CPP=${YOUR_TOOLCHAIN}/bin/arm-linux-androideabi-cpp export AR=${YOUR_TOOLCHAIN}/bin/arm-linux-androideabi-ar export RANLIB=${YOUR_TOOLCHAIN}/bin/arm-linux-androideabi-ranlib export LD=${YOUR_TOOLCHAIN}/bin/arm-linux-androideabi-ld export CPPFLAGS="-fexceptions -frtti -fpic -ffunction-sections -funwind-tables -fvisibility=hidden -fvisibility-inlines-hidden -fdata-sections" export CXXFLAGS="-D_REENTRANT -D_GLIBCXX__PTHREADS -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -march=armv5te -mtune=xscale -msoft-float -mthumb -DANDROID -D__ANDROID__ -DNDEBUG -O2 -g" export LDFLAGS="-march=armv5te" sysroot=${YOUR_TOOLCHAIN} boost_include="`cd "${YOUR_PATH_TO_NDK}/sources/boost_1_62_0/android-build/include";pwd`" boost_lib="`cd "${YOUR_PATH_TO_NDK}/sources/boost_1_62_0/android-build/armeabi/lib";pwd`" make distclean ./configure --prefix=/armeabi --host=arm-linux-androideabi --with-sysroot=${sysroot} --with-boost-include=${boost_include} --with-boost-lib=${boost_lib} --enable-static --enable-shared=no --enable-examples=no --enable-thread-safe-observer-pattern make -j6 make install DESTDIR=${YOUR_PATH_TO_INSTALL_DIR} armeabiEOF #Create the following shell script for armeabi-v7a cat > ~/Library/Android/sdk/ndk-bundle/sources/QuantLib-1.9/build-armeabi-v7a.sh << 'armeabi-v7aEOF' #!/bin/bash # build-armeabi-v7a.sh BUILD_DIR=android-build mkdir -p ${BUILD_DIR} INSTALL_DIR="`pwd`/${BUILD_DIR}" YOUR_PATH_TO_INSTALL_DIR="`cd "${INSTALL_DIR}";pwd`" NDK_DIR="${HOME}/Library/Android/sdk/ndk-bundle" YOUR_PATH_TO_NDK="`cd "${NDK_DIR}";pwd`" YOUR_TOOLCHAIN=${YOUR_PATH_TO_NDK}/sources/android-toolchain-arm export CC=${YOUR_TOOLCHAIN}/bin/arm-linux-androideabi-gcc export CXX=${YOUR_TOOLCHAIN}/bin/arm-linux-androideabi-g++ export CPP=${YOUR_TOOLCHAIN}/bin/arm-linux-androideabi-cpp export AR=${YOUR_TOOLCHAIN}/bin/arm-linux-androideabi-ar export RANLIB=${YOUR_TOOLCHAIN}/bin/arm-linux-androideabi-ranlib export LD=${YOUR_TOOLCHAIN}/bin/arm-linux-androideabi-ld export CPPFLAGS="-fexceptions -frtti -fpic -ffunction-sections -funwind-tables -fvisibility=hidden -fvisibility-inlines-hidden -fdata-sections" export CXXFLAGS="-D_REENTRANT -D_GLIBCXX__PTHREADS -march=armv7-a -msoft-float -mfpu=neon -mthumb -DANDROID -D__ANDROID__ -DNDEBUG -O2 -g" export LDFLAGS="-march=armv7-a -Wl,--fix-cortex-a8" sysroot=${YOUR_TOOLCHAIN} boost_include="`cd "${YOUR_PATH_TO_NDK}/sources/boost_1_62_0/android-build/include";pwd`" boost_lib="`cd "${YOUR_PATH_TO_NDK}/sources/boost_1_62_0/android-build/armeabi-v7a/lib";pwd`" make distclean ./configure --prefix=/armeabi-v7a --host=arm-linux-androideabi --with-sysroot=${sysroot} --with-boost-include=${boost_include} --with-boost-lib=${boost_lib} --enable-static --enable-shared=no --enable-examples=no --enable-thread-safe-observer-pattern make -j6 make install DESTDIR=${YOUR_PATH_TO_INSTALL_DIR} armeabi-v7aEOF #Create the following shell script for arm64-v8a cat > ~/Library/Android/sdk/ndk-bundle/sources/QuantLib-1.9/build-arm64-v8a.sh << 'arm64-v8aEOF' #!/bin/bash # build-arm64-v8a.sh BUILD_DIR=android-build mkdir -p ${BUILD_DIR} INSTALL_DIR="`pwd`/${BUILD_DIR}" YOUR_PATH_TO_INSTALL_DIR="`cd "${INSTALL_DIR}";pwd`" NDK_DIR="${HOME}/Library/Android/sdk/ndk-bundle" YOUR_PATH_TO_NDK="`cd "${NDK_DIR}";pwd`" YOUR_TOOLCHAIN=${YOUR_PATH_TO_NDK}/sources/android-toolchain-arm64 export CC=${YOUR_TOOLCHAIN}/bin/aarch64-linux-android-gcc export CXX=${YOUR_TOOLCHAIN}/bin/aarch64-linux-android-g++ export CPP=${YOUR_TOOLCHAIN}/bin/aarch64-linux-android-cpp export AR=${YOUR_TOOLCHAIN}/bin/aarch64-linux-android-ar export RANLIB=${YOUR_TOOLCHAIN}/bin/aarch64-linux-android-ranlib export LD=${YOUR_TOOLCHAIN}/bin/aarch64-linux-android-ld export CPPFLAGS="-fexceptions -frtti -fpic -ffunction-sections -funwind-tables -fstack-protector -fvisibility=hidden -fvisibility-inlines-hidden -fdata-sections" export CXXFLAGS="-D_REENTRANT -D_GLIBCXX__PTHREADS -march=armv8-a -mtune=cortex-a53 -DANDROID -D__ANDROID__ -DNDEBUG -O2 -g" export LDFLAGS="-march=armv8-a" sysroot=${YOUR_TOOLCHAIN} boost_include="`cd "${YOUR_PATH_TO_NDK}/sources/boost_1_62_0/android-build/include";pwd`" boost_lib="`cd "${YOUR_PATH_TO_NDK}/sources/boost_1_62_0/android-build/arm64-v8a/lib";pwd`" make distclean ./configure --prefix=/arm64-v8a --host=aarch64-linux-android --with-sysroot=${sysroot} --with-boost-include=${boost_include} --with-boost-lib=${boost_lib} --enable-static --enable-shared=no --enable-examples=no --enable-thread-safe-observer-pattern make -j6 make install DESTDIR=${YOUR_PATH_TO_INSTALL_DIR} arm64-v8aEOF #run shell scripts to clean and build for Android cd ~/Library/Android/sdk/ndk-bundle/sources cd QuantLib-1.9 rm -fr android-build sh build-x86.sh sh build-x86_64.sh sh build-armeabi.sh sh build-armeabi-v7a.sh sh build-arm64-v8a.sh


(5) Create Android.mk at ~/Library/Android/sdk/ndk-bundle/sources/QuantLib-1.9/ for ndkBuild in Android Studio
~/Library/Android/sdk/ndk-bundle/sources/QuantLib-1.9/Android.mk    Select all
# create the following Android.mk cat > ~/Library/Android/sdk/ndk-bundle/sources/QuantLib-1.9/Android.mk << 'EOF' LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := libQuantLib LOCAL_SRC_FILES := android-build/$(TARGET_ARCH_ABI)/lib/libQuantLib.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/android-build/$(TARGET_ARCH_ABI)/include LOCAL_CPP_FEATURES := rtti exceptions include $(PREBUILT_STATIC_LIBRARY) EOF


(6) Demo of using boost c++ libraries for ndkBuild in Android Studio 2.2.2
Assume prebuilt libraries are installed to ~/Library/Android/sdk/ndk-bundle/sources
app/build.gradle    Select all
apply plugin: 'com.android.application' Properties properties = new Properties() properties.load(project.rootProject.file('local.properties').newDataInputStream()) def sdkFolder = properties.getProperty('sdk.dir') def ndkFolder = properties.getProperty('ndk.dir') android { compileSdkVersion 23 buildToolsVersion "23.0.3" defaultConfig { applicationId "com.example.helloboost" minSdkVersion 9 targetSdkVersion 23 versionCode = 1 versionName = '1.0' archivesBaseName = 'HELLOBOOST_' + versionName ndk { moduleName "hello-boost" abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' } externalNativeBuild { ndkBuild { arguments "NDK_APPLICATION_MK=src/main/jni/Application.mk" // default module search path NDK_MODULE_PATH is at ${ndkFolder}/sources } } } buildTypes { debug { minifyEnabled false zipAlignEnabled true debuggable true useProguard false versionNameSuffix 'debug' } release { minifyEnabled false zipAlignEnabled true useProguard true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } } externalNativeBuild { ndkBuild { path "src/main/jni/Android.mk" } } }


app/src/main/jni/Android.mk    Select all
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello-boost LOCAL_SRC_FILES := hello-boost.cpp first.cpp LOCAL_STATIC_LIBRARIES := libboost_system libboost_thread libboost_program_options libQuantLib include $(BUILD_SHARED_LIBRARY) $(call import-module, boost_1_62_0) $(call import-module, QuantLib-1.9)


app/src/main/jni/Application.mk    Select all
APP_STL = gnustl_static APP_CPPFLAGS = -Wall


(7) HelloJNI, sample of using cmake CMakeLists.txt after adding Boost and QuantLib libraries
Assume prebuilt libraries are installed to ~/Library/Android/sdk/ndk-bundle/sources
app/src/main/cpp/CMakeLists.txt    Select all
cmake_minimum_required(VERSION 3.4.1) # build native_app_glue as a static lib add_library(app-glue STATIC ${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c) # now build app's shared lib set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11 -frtti -fexceptions") add_library(hello-jni SHARED hello-jni.c) #BOOST set(Boost_INCLUDE_DIR ${ANDROID_NDK}/sources/boost_1_62_0/android-build/include) set(Boost_LIBRARY_DIR ${ANDROID_NDK}/sources/boost_1_62_0/android-build/${ANDROID_ABI}/lib) set(Boost_USE_STATIC_LIBS ON) # only find static libs set(Boost_USE_MULTITHREADED ON) set(Boost_USE_STATIC_RUNTIME OFF) set(Boost_COMPILER -gcc) find_package(Boost COMPONENTS system thread program_options REQUIRED) #BOOSTEND #QuantLib set(QuantLib_INCLUDE_DIR ${ANDROID_NDK}/sources/QuantLib-1.9/android-build/${ANDROID_ABI}/include) set(QuantLib_LIBRARY_DIR ${ANDROID_NDK}/sources/QuantLib-1.9/android-build/${ANDROID_ABI}/lib) add_library(QuantLib STATIC IMPORTED) set_property(TARGET QuantLib PROPERTY IMPORTED_LOCATION ${QuantLib_LIBRARY_DIR}/libQuantLib.a) #QuantLibEND # if have QuantLibJNI, uncomment below and add QuantLibJNI to target_link_libraries of hello-jni for c++ classes generated from QuantLib-SWIG-1.9 #add_library(QuantLibJNI SHARED quantlib_wrap.cpp) #target_link_libraries(QuantLibJNI ${Boost_LIBRARIES} QuantLib) if(Boost_FOUND) # Include libraries needed include_directories(${Boost_INCLUDE_DIR}) include_directories(${QuantLib_INCLUDE_DIR}) target_link_libraries(hello-jni android app-glue log ${Boost_LIBRARIES} QuantLib) endif()

app/build.gradle    Select all
apply plugin: 'com.android.application' android { compileSdkVersion 23 buildToolsVersion '23.0.3' defaultConfig { applicationId 'com.example.hellojni' minSdkVersion 15 targetSdkVersion 23 versionCode 1 versionName "1.0" archivesBaseName = 'HELLOJNI_' + versionName externalNativeBuild { cmake { arguments '-DANDROID_TOOLCHAIN=clang' cppFlags "" } } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug { debuggable true jniDebuggable true versionNameSuffix 'debug' } } externalNativeBuild { cmake { path "src/main/cpp/CMakeLists.txt" } } productFlavors { arm { ndk { abiFilter 'armeabi' } } arm7 { ndk { abiFilter 'armeabi-v7a' } } arm64 { ndk { abiFilter 'arm64-v8a' } } x86 { ndk { abiFilter 'x86' } } x86_64 { ndk { abiFilter 'x86_64' } } universal { ndk { abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' } } } } dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') compile 'com.android.support:appcompat-v7:23.4.0' compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha7' }


(8) Download & Compile swig and generate java & c++ classes from QuantLib-SWIG-1.9 for Android project
shell scriptSelect all
#download and compile swig cd ~/Downloads curl -O http://nchc.dl.sourceforge.net/project/swig/swig/swig-3.0.10/swig-3.0.10.tar.gz tar xzvf swig-3.0.10.tar.gz curl -O http://nchc.dl.sourceforge.net/project/pcre/pcre/8.39/pcre-8.39.tar.gz tar xzvf pcre-8.39.tar.gz cd ~/Downloads/pcre-8.39 ./configure --enable-utf8 --enable-unicode-properties make sudo make install cd ~/Downloads/swig-3.0.10 ./configure make sudo make install # download QuantLib-SWIG-1.9 cd ~/Library/Android/sdk/ndk-bundle/sources curl -O http://jaist.dl.sourceforge.net/project/quantlib/QuantLib/1.9/other%20languages/QuantLib-SWIG-1.9.tar.gz tar xzvf QuantLib-SWIG-1.9.tar.gz # generate SWIG java & c++ classes to HelloJNI project cd ~/Projects cd HelloJNI/app/src/main mkdir -p cpp mkdir -p java/org/quantlib swig -java -c++ -module QuantLib -package org.quantlib -outdir java/org/quantlib -o cpp/quantlib_wrap.cpp ~/Library/Android/sdk/ndk-bundle/sources/QuantLib-SWIG-1.9/SWIG/quantlib.i



Sunday, September 18, 2016

CSS selector in Chrome using the example of Apple iPhone 7 Plus Availability Monitoring

The iPhone 7 Plus Reserve Page for HK is a dynamic web content as in https://reserve.cdn-apple.com/HK/en_HK/reserve/iPhone/availability

The basic javascript console code in Google Chrome for availability is as below

iPhone7availability    Select all
// proper case string prptotype (JScript 5.5+) String.prototype.toProperCase = function() { return this.toLowerCase().replace(/^(.)|\s(.)/g, function($1) { return $1.toUpperCase(); }); } function testip7plus() { var targetProduct = "Plus" var targetCapacity = "256GB" // "32GB", "128GB", "256GB" var targetColor = "Silver" // "Rose Gold" 玫瑰金色, "Gold" 金色, "Sliver" 銀色, "Black" 黑色, "Jet Black" 亮黑色 var FinalSelectedProduct = false; targetCapacity = targetCapacity.toUpperCase() targetColor = targetColor.toProperCase(); var stores_length = $('form#availabilityForm #selectStore option[disabled!=disabled]').length; for(a=0; a<stores_length; a++) { var enabledStore = $('form#availabilityForm #selectStore option[disabled!=disabled]').eq(a).val(); setTimeout(function() { $('form#availabilityForm div.form-element.select-store select').val(enabledStore); $('form#availabilityForm div.form-element.select-store select').change(); },1800) var enabledStoreText = $('form#availabilityForm #selectStore option[disabled!=disabled]').eq(a).text().replace(/^\s+|\s+$/g, ''); var products_length = $('form#availabilityForm #selectSubfamily option[disabled!=disabled]').length; for(p=0; p<products_length; p++) { var enabledProduct = $('div#productSelectionView #selectSubfamily option[disabled!=disabled]').eq(p).val(); var enabledProductText = $('div#productSelectionView #selectSubfamily option[disabled!=disabled]').eq(p).text(); if (~enabledProductText.toLowerCase().indexOf(targetProduct.toLowerCase())) { console.log("Log " + enabledStoreText + " has " + enabledProductText); $('form#availabilityForm div.form-element.select-product select').val(enabledProduct); $('form#availabilityForm div.form-element.select-product select').change(); var unavailableGB = $('div#capacity-row li.unavailable input[value="'+targetCapacity+'"]').length console.log("Log " + enabledStoreText + " checking for " + targetCapacity) if (unavailableGB == 0) { var sizeAva_length = $('div#capacity-row li').length; for(u=0;u<sizeAva_length;u++) { if ($('div#capacity-row li').eq(u).find('div').attr('id') == targetCapacity) { $('div#capacity-row li').eq(u).find("input").click(); break; } } var unavailableColor = $('div#product-row li.unavailable input[data-color="'+targetColor+'"]').length console.log("Log " + enabledStoreText + " checking for " + targetColor) if (unavailableColor == 0) { var colorAva_length = $('div#product-row li').length; for(v=0;v<colorAva_length;v++) { if ($('div#product-row li').eq(v).find('input').attr('data-color') == targetColor) { setTimeout(function() { $('div#product-row li').eq(v).find("input").click(); },800) FinalSelectedProduct = true; break; } } if (FinalSelectedProduct) { console.log("SUCCESS!!! " + enabledStoreText + " has " + $('div.section-product.product-bottom.hide-for-large.show-only-for-small.with-fade.fade-in div.product div.callout.callout-center.product-specs ul.specs li:first').text().trim() + " " + enabledProductText + $('div.success.row div.success-copy.small-center').text().trim()); break; } } else { console.log("Log " + enabledStoreText + ", sorry no " + targetCapacity + " " + targetColor) } } } else { console.log(enabledStoreText + ", sorry no " + targetProduct) } } if (FinalSelectedProduct) { return; } } } testip7plus()



There is an archive for iPhone 6 Availability script in last year, please click the Chrome CSS Javascript label below


Saturday, September 17, 2016

How to check something that "is not yet implemented" in Swift 3 Linux

How to grep "XXXX is not yet implemented" in Swift 3 Linux
cd $(HOME) git clone --depth=1 https://github.com/apple/swift-corelibs-foundation
cd $(HOME)/swift-corelibs-foundation/Foundation
grep -r "NSUnimplemented() }"



How to grep func or init in Swift 3 Linux
cd $(HOME)/swift-corelibs-foundation/Foundation
grep -r "open func \|public init"



Wednesday, August 24, 2016

How to install Objective C 2.0 and GNUstep under Windows SubSystem for Linux - Bash Shell

Install Objective C 2.0 and GNUstep under Windows 10 bash shell
Follow the steps below (make sure the steps are followed in order, that is build libobjc2 before GNUstep) to install required packages and build scripts

bash    Select all
sudo apt-get update sudo apt-get install build-essential libblocksruntime-dev libkqueue-dev libpthread-workqueue-dev gobjc libxml2-dev libjpeg-dev libtiff-dev libpng12-dev libcups2-dev libfreetype6-dev libcairo2-dev libxt-dev libgl1-mesa-dev sudo apt-get install clang-3.6 cmake git sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-3.6 100 sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-3.6 100 cd $HOME git clone --depth=1 https://github.com/gnustep/libobjc2 cd libobjc2 rm -fr Build mkdir Build && cd Build cmake .. -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DLIB_INSTALL_PATH=/usr/local/lib make sudo make install cd $HOME wget ftp://ftp.gnustep.org/pub/gnustep/core/gnustep-make-2.6.7.tar.gz tar xvf gnustep-make*.tar.gz cd gnustep-make* CC=clang CXX=clang++ ./configure --prefix=/usr/local make sudo make install cd $HOME wget ftp://ftp.gnustep.org/pub/gnustep/core/gnustep-base-1.24.8.tar.gz tar xvf gnustep-base*.tar.gz cd gnustep-base* CC=clang CXX=clang++ ./configure --prefix=/usr/local make sudo make install sudo ldconfig -v # no gnustep-gui installation here. sudo apt-get install libdispatch-dev # testing cd $HOME cat > blocktest.m << EOF #include <stdio.h> int main() { void (^hello)(void) = ^(void) { printf("Hello, block!\n"); }; hello(); return 0; } EOF clang `gnustep-config --objc-flags` -fblocks -o blocktest -x objective-c blocktest.m `gnustep-config --base-libs` ./blocktest cat > main.m << EOF // // main.m // Just a little test case for Objective-C 2.0 on Ubuntu // #import <Foundation/Foundation.h> #import <dispatch/dispatch.h> int main(int argc, const char * argv[]) { @autoreleasepool { int multiplier = 7; int (^myBlock)(int) = ^(int num) { return num * multiplier; }; NSLog(@"%d", myBlock(3)); dispatch_queue_t queue = dispatch_queue_create(NULL, NULL); dispatch_sync(queue, ^{ printf("Hello, world from a dispatch queue!\n"); }); dispatch_release(queue); } @autoreleasepool { NSLog(@"Wow it works!"); } return 0; } EOF # command line for locale generation sudo locale-gen en_US.UTF-8 # command line to reset timezone if not yet configured sudo dpkg-reconfigure tzdata clang `gnustep-config --objc-flags` -fblocks -o main -x objective-c main.m `gnustep-config --base-libs` -ldispatch ./main # to compile objective c++, you would need extra parameters and use clang++ clang++ -std=c++11 -stdlib=libc++ -x objective-c++ clang++ -std=c++11 -stdlib=libstdc++ -x objective-c++



GNUstep documentation is here -> http://www.gnustep.org/developers/documentation.html