|
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object org.apache.maven.archiva.common.utils.VersionUtil
public class VersionUtil
Version utility methods.
| Field Summary | |
|---|---|
static java.util.regex.Pattern |
GENERIC_SNAPSHOT_PATTERN
|
static java.lang.String |
SNAPSHOT
|
static java.util.regex.Pattern |
TIMESTAMP_PATTERN
|
static java.util.regex.Pattern |
UNIQUE_SNAPSHOT_PATTERN
|
| Constructor Summary | |
|---|---|
VersionUtil()
|
| Method Summary | |
|---|---|
static java.lang.String |
getBaseVersion(java.lang.String version)
|
static java.lang.String |
getReleaseVersion(java.lang.String snapshotVersion)
Get the release version of the snapshot version. |
static boolean |
isGenericSnapshot(java.lang.String version)
|
static boolean |
isSimpleVersionKeyword(java.lang.String identifier)
Tests if the identifier is a known simple version keyword. |
static boolean |
isSnapshot(java.lang.String version)
|
static boolean |
isUniqueSnapshot(java.lang.String version)
|
static boolean |
isVersion(java.lang.String unknown)
Tests if the unknown string contains elements that identify it as a version string (or not). |
| Methods inherited from class java.lang.Object |
|---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| Field Detail |
|---|
public static final java.lang.String SNAPSHOT
public static final java.util.regex.Pattern UNIQUE_SNAPSHOT_PATTERN
public static final java.util.regex.Pattern TIMESTAMP_PATTERN
public static final java.util.regex.Pattern GENERIC_SNAPSHOT_PATTERN
| Constructor Detail |
|---|
public VersionUtil()
| Method Detail |
|---|
public static boolean isVersion(java.lang.String unknown)
Tests if the unknown string contains elements that identify it as a version string (or not).
The algorithm tests each part of the string that is delimited by a '-' (dash) character. If 75% or more of the sections are identified as 'version' strings, the result is determined to be of a high probability to be version identifier string.
unknown
- the unknown string to test.
public static boolean isSimpleVersionKeyword(java.lang.String identifier)
Tests if the identifier is a known simple version keyword.
This method is different from isVersion(String)
in that it tests the whole input string in
one go as a simple identifier. (eg "alpha", "1.0", "beta", "debug", "latest", "rc#", etc...)
identifier
- the identifier to test.
public static boolean isSnapshot(java.lang.String version)
public static java.lang.String getBaseVersion(java.lang.String version)
public static java.lang.String getReleaseVersion(java.lang.String snapshotVersion)
Get the release version of the snapshot version.
If snapshot version is 1.0-SNAPSHOT, then release version would be 1.0 And if snapshot version is 1.0-20070113.163208-1.jar, then release version would still be 1.0
snapshotVersion
-
public static boolean isUniqueSnapshot(java.lang.String version)
public static boolean isGenericSnapshot(java.lang.String version)
|
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |


See this page with no CSS
Hypotenuse Calculator
Insert a numeric value for 'a':
Insert a numeric value for 'b':
Calculate
Slider
This is a slider with a range from 1 to 100, and a starting value of 1.
Slider value: 1


Buffered serial driver class template. More...
#include <cmsis-plus/posix-driver/circular-buffer.h>
Public Member Functions | |
Constructors & Destructor | |
| device_serial_buffered (const char *device_name, os::driver::Serial *driver, os::posix::circular_buffer_bytes *rx_buf, os::posix::circular_buffer_bytes *tx_buf) | |
| virtual | ~device_serial_buffered () |
Static Public Member Functions | |
Public Static Member Functions | |
| static void | signal_event (device_serial_buffered *object, uint32_t event) |
Protected Member Functions | |
Private Member Functions | |
| virtual int | do_vopen (const char *path, int oflag, std::va_list args) override |
| virtual int | do_close (void) override |
| virtual ssize_t | do_read (void *buf, std::size_t nbyte) override |
| virtual ssize_t | do_write (const void *buf, std::size_t nbyte) override |
| virtual bool | do_is_opened (void) override |
| virtual bool | do_is_connected (void) override |
Private Types | |
| using | critical_section = CS |
Buffered serial driver class template.
Definition at line 52 of file device-serial-buffered.h.
|
private |
Definition at line 54 of file device-serial-buffered.h.
| os::posix::device_serial_buffered< CS >::device_serial_buffered | ( | const char * | device_name, |
| os::driver::Serial * | driver, | ||
| os::posix::circular_buffer_bytes * | rx_buf, | ||
| os::posix::circular_buffer_bytes * | tx_buf | ||
| ) |
Definition at line 198 of file device-serial-buffered.h.
|
virtual |
Definition at line 220 of file device-serial-buffered.h.
|
overrideprotectedvirtual |
Definition at line 354 of file device-serial-buffered.h.
|
overrideprotectedvirtual |
Definition at line 347 of file device-serial-buffered.h.
|
overrideprotectedvirtual |
Definition at line 340 of file device-serial-buffered.h.
|
overrideprotectedvirtual |
Definition at line 401 of file device-serial-buffered.h.
|
overrideprotectedvirtual |
Definition at line 239 of file device-serial-buffered.h.
|
overrideprotectedvirtual |
Definition at line 432 of file device-serial-buffered.h.
|
static |
Definition at line 610 of file device-serial-buffered.h.


PDMIn
-- Record an input PDM audio stream¶
PDMIn can be used to record an input audio signal on a given set of pins.
-
class
audiobusio.
PDMIn
(clock_pin, data_pin, *, frequency=8000, bit_depth=8, mono=True, oversample=64)¶ Create a PDMIn object associated with the given pins. This allows you to record audio signals from the given pins. Individual ports may put further restrictions on the recording parameters.
Parameters: - clock_pin (Pin) -- The pin to output the clock to
- data_pin (Pin) -- The pin to read the data from
- frequency (int) -- Target frequency of the resulting samples. Check
frequency
for real value. - bit_depth (int) -- Final number of bits per sample. Must be divisible by 8
- mono (bool) -- True when capturing a single channel of audio, captures two channels otherwise
- oversample (int) -- Number of single bit samples to decimate into a final sample. Must be divisible by 8
Simple record to buffer:
import audiobusio import board # Prep a buffer to record into b = bytearray(200) with audiobusio.PDMIn(board.MICROPHONE_DATA, board.MICROPHONE_CLOCK) as mic: mic.record(b, len(b))
-
deinit
()¶ Deinitialises the PWMOut and releases any hardware resources for reuse.
-
__enter__
()¶ No-op used by Context Managers.
-
__exit__
()¶ Automatically deinitializes the hardware when exiting a context.
-
record
(destination, destination_length)¶ Records destination_length bytes of samples to destination. This is blocking.
An IOError may be raised when the destination is too slow to record the audio at the given rate. For internal flash, writing all 1s to the file before recording is recommended to speed up writes.
-
frequency
¶ The actual frequency of the recording. This may not match the constructed frequency due to internal clock limitations.


|
PRAgMaTIc
master
|
#include <DeferredOperations.h>
Public Member Functions | |
| DeferredOperations (Mesh< real_t > *mesh, const int num_threads, const int scaling_factor) | |
| ~DeferredOperations () | |
| void | addNN (const index_t i, const index_t n, const int tid) |
| void | remNN (const index_t i, const index_t n, const int tid) |
| void | addNE (const index_t i, const index_t n, const int tid) |
| void | addNE_fix (const index_t i, const index_t n, const int tid) |
| void | repEN (const size_t pos, const index_t n, const int tid) |
| void | remNE (const index_t i, const index_t n, const int tid) |
| void | propagate_coarsening (const index_t i, const int tid) |
| void | propagate_refinement (const index_t i, const index_t n, const int tid) |
| void | propagate_swapping (const index_t i, const index_t n, const int tid) |
| void | reset_colour (const index_t i, const int tid) |
| void | commit_addNN (const int tid, const int vtid) |
| void | commit_remNN (const int tid, const int vtid) |
| void | commit_addNE (const int tid, const int vtid) |
| void | commit_addNE_fix (std::vector< size_t > &threadIdx, const int tid, const int vtid) |
| void | commit_remNE (const int tid, const int vtid) |
| void | commit_repEN (const int tid, const int vtid) |
| void | commit_coarsening_propagation (index_t *dynamic_vertex, const int tid, const int vtid) |
| void | commit_refinement_propagation (std::vector< std::set< index_t > > &marked_edges, const int tid, const int vtid) |
| void | commit_swapping_propagation (std::vector< std::set< index_t > > &marked_edges, const int tid, const int vtid) |
| void | commit_colour_reset (int *node_colour, const int tid, const int vtid) |
Definition at line 45 of file DeferredOperations.h.
|
inline |
Definition at line 47 of file DeferredOperations.h.
|
inline |
Definition at line 55 of file DeferredOperations.h.
|
inline |
Definition at line 67 of file DeferredOperations.h.
|
inline |
Definition at line 72 of file DeferredOperations.h.
|
inline |
Definition at line 57 of file DeferredOperations.h.
|
inline |
Definition at line 125 of file DeferredOperations.h.
|
inline |
Definition at line 134 of file DeferredOperations.h.
|
inline |
Definition at line 105 of file DeferredOperations.h.
|
inline |
Definition at line 164 of file DeferredOperations.h.
|
inline |
Definition at line 191 of file DeferredOperations.h.
|
inline |
Definition at line 173 of file DeferredOperations.h.
|
inline |
Definition at line 145 of file DeferredOperations.h.
|
inline |
Definition at line 114 of file DeferredOperations.h.
|
inline |
Definition at line 155 of file DeferredOperations.h.
|
inline |
Definition at line 182 of file DeferredOperations.h.
|
inline |
Definition at line 87 of file DeferredOperations.h.
|
inline |
Definition at line 91 of file DeferredOperations.h.
|
inline |
Definition at line 96 of file DeferredOperations.h.
|
inline |
Definition at line 82 of file DeferredOperations.h.
|
inline |
Definition at line 62 of file DeferredOperations.h.
|
inline |
Definition at line 77 of file DeferredOperations.h.
|
inline |
Definition at line 101 of file DeferredOperations.h.


Flat+
Category
Action
Another action
Something else here
Separated link
Adrian Demian
Your Profile
Edit Account
Get Help
Log out
5
Notifications
Lorem ipsum dolor sit amet, consectetur adipisicing elit.

Joanne Smith
(1)
06:48 PM
Lorem ipsum dolor sit amet, consecte adipisicing elit.


Make an impact by joining VoluntCare's network, and select from hundreds of opportunities each month!
Or, Scroll down
VolunCare matches inspired people with inspiring causes. It’s how volunteers and nonprofits connect to achieve remarkable outcomes.
Eléna Puroski
Julien Bernard
Yu-Jane Chane
Camille Durin


List of tables
(View these tables by clicking either the 'Quarterly statistics' or the 'Annual statistics' tab.)
- Gross domestic product, income-based, 1961 Q1 to date
- Gross domestic product, expenditure-based, at current prices, 1961 Q1 to date
- Gross domestic product, expenditure-based, at constant chained Fisher prices, 1961 Q1 to date
- Gross domestic product price indexes, 1961 Q1 to date
- Gross domestic product by industry, chained Fisher, part 1, 1997 Q1 to date
- Gross domestic product by industry, chained Fisher, part 2, 1997 Q1 to date
- Gross domestic product by industry, chained Fisher, part 3, 1997 Q1 to date
- Gross domestic income, gross national income and net national income, 1961 Q1 to date
- Gross national income and gross domestic income, indexes and related statistics, 1961 Q1 to date
- Compensation of employees, 1961 Q1 to date
- Property income of households, 1961 Q1 to date
- Undistributed corporate profits, 1961 Q1 to date
- Detailed household final consumption expenditure, 1981 Q1 to date
- Detailed household final consumption expenditure, 2012 constant prices, 1981 Q1 to date
- Gross fixed capital formation, 1961 Q1 to date
- Gross fixed capital formation, chained Fisher, 1961 Q1 to date
- Investment in inventories, 1961 Q1 to date
- Investment in inventories, chained Fisher, 1961 Q1 to date
- Current and capital accounts, National, 1961 Q1 to date
- Current and capital accounts, Households, 1961 Q1 to date
- Current and capital accounts, Non-profit institutions serving households, 1961 Q1 to date
- Current and capital accounts, Corporations, 1961 Q1 to date
- Current and capital accounts, General government, 1961 Q1 to date
- Current and capital accounts, Federal general government, 1961 Q1 to date
- Current and capital accounts, Provincial and territorial general governments, 1961 Q1 to date
- Current and capital accounts, Local general governments, 1961 Q1 to date
- Current and capital accounts, Non-residents, 1961 Q1 to date
- Revenue, expenditure and budgetary balance - General governments, 1961 Q1 to date
- Revenue, expenditure and budgetary balance - Federal general government, 1961 Q1 to date
- Revenue, expenditure and budgetary balance - Provincial and territorial general governments, 1961 Q1 to date
- Debt service indicators of households, 1990 Q1 to date
- Financial flow accounts - Total all sectors, 1990 Q1 to date
- National balance sheet accounts - Households and NPISH, 1990 Q1 to date
- National balance sheet accounts - Total all sectors, 1990 Q1 to date
- Balance of international payments, current account, 1981 Q1 to date
- Merchandise exports by commodity, 1988 Q1 to date
- Merchandise imports by commodity, 1988 Q1 to date
- Merchandise exports by commodity, chained Fisher, 1997 Q1 to date
- Merchandise imports by commodity, chained Fisher, 1997 Q1 to date
- International investment position, 2015 Q1 to date
- Indexes of business total labour productivity and related measures, 1981 Q1 to date
- Indexes of business real GDP by industry, 1997 Q1 to date
- Indexes of business jobs by industry, 1997 Q1 to date
- Indexes of business average hours worked by industry, 1997 Q1 to date
- Indexes of business total hours worked by industry, 1997 Q1 to date
- Indexes of business labour productivity by industry, 1997 Q1 to date
- Indexes of business labour compensation per hour by industry, 1997 Q1 to date
- Indexes of business unit labour cost by industry, 1997 Q1 to date
- Indexes of business unit labour cost in US dollars by industry, 1997 Q1 to date
- GFS statement of government operations and balance sheet - Consolidated government, 1990 Q1 to date
- GFS statement of government operations and balance sheet - Federal government, 1990 Q1 to date
- GFS statement of government operations and balance sheet - Provincial and territorial government, 1990 Q1 to date
- GFS statement of government operations and balance sheet - Local government, 1990 Q1 to date
- GFS statement of government operations and balance sheet - Canada Pension Plan (CPP) and Quebec Pension Plan (QPP), 1990 Q1 to date
- Historical: Gross domestic product, income-based, 1968 System of National Accounts, 1947 Q1 to 1997 Q2
- Historical: Gross domestic product, expenditure-based, 1968 System of National Accounts, 1947 Q1 to 1997 Q2
- Historical: Gross domestic product, expenditure-based, 1968 System of National Accounts, 1986 constant prices, 1947 Q1 to 1997 Q2


The following is a test markdown section that will test the server side interaction of markup and JavaScript. The idea is that anything outside of a script tag will be the same as console.log, and my program will generate a JavaScript file to run through node. What this means is that the person who is generating the report must have extensive knowledge of JavaScript, and that this will give extreme flexibility as other functions and files can be imported. The user would also have the full support of the extensive node package manager (npm) library. The only limitation would be the flexibility of markdown but even that can be manipulated with custom CSS files. Also, JavaScript is asynchronous so the developer will need even more understanding for how to create the templates using functional programming techniques.
The is more powerful that than you think for the following reasons.
NOTE: Nested script tags are not allowed
| Tables | Tables |
|---|---|
| Tables | Tables |
| Tables | Tables |
| Tables | Tables |
| Tables | Tables |
| Tables | Tables |
| Tables | Tables |
| Tables | Tables |
| Tables | Tables |
| Tables | Tables |
| Tables | Tables |


--- layout: post title: "Day 37 - Bar Brothers Workout" subtitle: "Progress this week isn't really on the horizon, but I'm sure the 40-day honor will be change or at least progress. I do everything I can, whether it's training or maintaining the diet and the first 40 days are the main influencer on my body." date: 2019-11-27 background: '/img/posts/intro-barbrothers.png' ---
Today Wednesday, my weight has been on the same index for two days, but I continued to eat what I was allowed to eat and do, I have to change my training order, do some exercise from a Bar Brothers table and then rest for a day or two.
For a weekend, I'm going to do a walk that includes runs, at least that's how I plan.
Good night.


--- layout: post title: 'Episode 001 | John Sonmez: Simple Programmer' link: http://traffic.libsyn.com/developeronfire/DeveloperOnFire-1-JohnSonmez.mp3 length: 37748736 speaker: Dave Rael duration: '40:11' subtitle: 'Developer On Fire: John Sonmez' guest_name: John Sonmez image: /assets/images/JohnSonmez.jpg guest_blog: http://simpleprogrammer.com/ guest_twitter: jsonmez disqus_url: http://developeronfire.com/Podcast/Episodes/episode-1-john-sonmez-simple-programmer episode_number: 1 book_recommendations: - { url: "http://www.amazon.com/dp/0671027034/?tag=devonfir-20", title: "How to Win Friends and Influence People", author: "Dale Carnegie"} - { url: "http://www.amazon.com/dp/0671700758/?tag=devonfir-20", title: "Psycho-Cybernetics, A New Way to Get More Living Out of Life", author: "Maxwell Maltz"} - { url: "http://www.amazon.com/dp/1936891026/?tag=devonfir-20", title: "The War of Art: Break Through the Blocks and Win Your Inner Creative Battles", author: "Steven Pressfield"} tags: - { url: "http://www.amazon.com/dp/0671027034/?tag=devonfir-20", title: "How to Win Friends and Influence People", author: "Dale Carnegie"} - { url: "http://www.amazon.com/dp/0671700758/?tag=devonfir-20", title: "Psycho-Cybernetics, A New Way to Get More Living Out of Life", author: "Maxwell Maltz"} - { url: "http://www.amazon.com/dp/1936891026/?tag=devonfir-20", title: "The War of Art: Break Through the Blocks and Win Your Inner Creative Battles", author: "Steven Pressfield"} redirect_from: - "/1/" - "/001/" - "/0001/" - "/episode-1-john-sonmez-simple-programmer/" - "/John-Sonmez/" - "/JohnSonmez/" - "/Podcast/Episodes/1/" - "/Podcast/Episodes/001/" - "/Podcast/Episodes/0001/" - "/Podcast/Episodes/episode-1-john-sonmez-simple-programmer/" - "/Podcast/Episodes/John-Sonmez/" - "/Podcast/Episodes/JohnSonmez/" guid: http://developeronfire.com:80/Podcast/Episodes/episode-1-john-sonmez-simple-programmer ---
John Sonmez talks with Dave Rael about delivering value and his experiences as a software developer, a life coach, and an entrepreneur.
John is the founder of Simple Programmer at simpleprogrammer.com, where he tirelessly pursues his vision of transforming complex issues into simple solutions. He is a prolific producer of developer training on Pluralsight. He's a seasoned software professional, podcaster, author, entrepreneur, and fitness enthusiast. John is a life coach for software developers, and helps software engineers, programmers and other technical professionals boost their careers and live a more fulfilled life. He empowers them to accomplish their goals by making the complex simple and is the author of Soft Skills: The software developer's life manual.
John's top 3 tips for delivering more value:
1. Stop watching television
2. Track your time - John's post on his process
3. Have a definite goal or purpose


Glossary
2-Pizza Team
3Scale
A/B Test
Adapter Containers
Ambassador Containers
API
Api Gateway
Authentication
Batch Size
Blue Green
Canary
CI/CD
Circuit Breaker
Compensating Transactions
Configuration
ConfigMap
Consistency Models
Container/Virtual Appliance
CQRS
Cycle Time
Dark Launch
Data Virtualization
A logical semantic layer on top of your data store(s) - Ramesh Reddy
DevOps
Discovery
Elasticity
Event Sourcing
Eventual Consistency
Fault Injection
Fault Tolerance
Feature Toggles
Governance
HAProxy
Health Checking
Immutable Infrastructure
Ingress
Lead Time
Let’s Encrypt
Log Aggregation
Metrics
Monitoring
Monolith
Node Proxy
Outlier
Orchestration
Pipeline
Rate Limiter
REST
Ribbon
Route
Router
RPC
Sagas
Serverless
Service Mesh
Sidecar Containers
Strangler
Testing: Many kinds
Tracing
Traffic splitting


|
Behavioral Architecture with Real Simulation AutonomousNav
|
Public Member Functions | |
| def | __init__ (self, name, visited, position) |
| def | getName (self) |
| def | getVisited (self) |
| def | getPosition (self) |
| def | setVisited (self, visited) |
| def | setPosition (self, position) |
Public Attributes | |
| name | |
| Name of the room. | |
| visited | |
| whether it has been visited or not | |
| position | |
| x and y position | |
A class used to represent the room in the house Attributes ----- @param name: name of the room @type name: string @param visited: whether it has been visited or not @type visited: bool @param position: x and y position @type position: Point Methods ----- getName()): Get the name of the room getVisited() Get if it was visited or not getPosition() Get the x and y position setVisited() Set that the room is visited setPosition() Set the x and y position
| def oracle.Location.__init__ | ( | self, | |
| name, | |||
| visited, | |||
| position | |||
| ) |
| def oracle.Location.getName | ( | self | ) |
| def oracle.Location.getPosition | ( | self | ) |
| def oracle.Location.getVisited | ( | self | ) |
| def oracle.Location.setPosition | ( | self, | |
| position | |||
| ) |
Set the x and y position @param position: x and y position @type position: pOINT
| def oracle.Location.setVisited | ( | self, | |
| visited | |||
| ) |
Set that the room is visited @param visited: room is visited @type visited: bool


---
layout: post
title:
date: '2006-09-28T12:14:00.000Z'
author: FredVDD
tags:
modified_time: '2006-09-28T12:14:22.576Z'
blogger_id: tag:blogger.com,1999:blog-5059265.post-115944566093692088
blogger_orig_url: http://frederiks.blogspot.com/2006/09/ms-word-random-text-generation.html
---
MS Word Random Text generation
=rand(NoOfParagraphs,NoOfSentences)
whereby the sentence is: "The quick brown fox jumps over the lazy dog."
This sentence is used because it contains every letter of the alphabet.


Post Development / Applications Engineer
Jeff leads our post development team, and provides technical support and training for Autodesk’s full portfolio of CAD/CAM software. Jeff has worked in the manufacturing industry for 20 years, and has extensive knowledge in the tool & die, and mold tool industries. He began his career as a tool and die maker, followed by many years as a machinist/programmer of 3, 4, and 5-axis CNC machines. LinkedIn
Business Development Manager
Mike brings an additional 20 years of experience to the team. In his first 15 years he gained great experience as a senior machinist using PowerMill on high-end 5-axis machines, and training new recruits. Then hired by Delcam (acquired by Autodesk), Mike spent over 5 years working with the Advanced Manufacturing technical support and implementation teams, specializing in PowerMill, PowerShape, Electrode Solution, and more. Mike carries with him a wide product and skills breadth, and looks forward to helping companies grow their business and optimize their digital manufacturing solution. LinkedIn
Education Engagement and Marketing Coordinator
Michael specializes in education engagement and market strategy. He manages short and long term relationships with education institutions, and produces marketing material for both industry and vocational learning institutes.
Director of Operations
Robert Kobielski is a CAD/CAM consultant and educator with 20 years of manufacturing and teaching experience. His credentials include 429A General Machinist Apprenticeship and Qualification, and Ontario College of Teachers Certification. LinkedIn
We have a contract team of 4 applications engineers deeply versed in a variety of products. Each member of our team is CAM specialized, and an authorized instructor in their respective discipline.


---
layout: post
title: Single Step JTAG debugging an ESP32 Arduino Sketch with VisualGDB
date: '2018-04-15T18:00:00.001-07:00'
author: gojimmypi
tags:
- Espressif
modified_time: '2018-07-09T09:03:17.829-07:00'
thumbnail: https://1.bp.blogspot.com/-sFq2SJuaA14/Ws4x0Bgz4fI/AAAAAAAABQY/eRFUfKZTDVAA-ZMvQYU9iiyepEv3a67XgCLcBGAs/s72-c/ArduinoConversion.PNG
blogger_id: tag:blogger.com,1999:blog-4109066286647243251.post-2224027445487449351
blogger_orig_url: https://gojimmypi.blogspot.com/2018/04/single-step-jtag-debugging-esp32.html
---
In my last post, I took the latest Preview 1 version of VisualGDB
for a test drive. This time around, I am looking at the next increment: Preview 2. Spoiler from the the blog title: it is pretty cool.
TLDR; This is for JTAG debug ESP32 VisualGDB 5.4 Preview 2. This will not work with Preview 1. Preview 3 is now available.
Key is to BOTH: (1) add directories as "Additional Include Directories" and (2) right-click on solution "Add existing files" for these directories:
C:\Users\gojimmypi\Documents\Arduino\libraries\RadioHead
C:\Users\gojimmypi\Documents\Arduino\hardware\espressif\esp32
C:\Users\gojimmypi\Documents\Arduino\hardware\espressif\esp32\cores\esp32
C:\Users\gojimmypi\Documents\Arduino\hardware\espressif\esp32\libraries\SPI
C:\Users\gojimmypi\Documents\Arduino\hardware\espressif\esp32\variants\esp32
This Visual Studio / VisualGDB Arduino project can be downloaded here:
https://github.com/gojimmypi/MyArduinoConversion
(Update 4/28: some final editing still in progress)
First, the Arduino "sketch" is an odd critter, so close to being C/C++ but just enough different that some people have even called Arduino a language of its own. In the Ardunio IDE, File-New creates something like this (note no "main"):
{% include code_header.html %}
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:}
The big drawback in the Arduino IDE is there's no debug. (besides - it is really just a text editor, not really an Integrated Development Environment, in my opinion).
Debugging a sketch in Visual Studio takes a few steps. The first part here is based on the
Switching Advanced ESP-IDF Projects Between Different IDF Versions and Creating Advanced ESP32 Projects with ESP-IDF
tutorials. I should also add that Arduino debugging is not yet officially by VisualGDB.
Note that I am using the
PREVIEW 2 version of VisualGDB 5.4
with Visual Studio 2017..
First, we'll need to create a project in Visual Studio with VisualGDB. This example is called myArduinoConversion:
Leave default at "Create a new project based on a sample project". (hopefully the sysprogs folks will fix the black-on-dark-gray color scheme for those of of that choose the dark theme in Visual Studio):
If you don't have the ESP-IDF installed, there will be a prompt:
In my case, there was a version error. (despite the version warning, my C:\SysGCC\esp32\esp-idf\master-VisualGDB didn't even exist!
Click Clone an
ESP-IDF from GitHub
link to download:
VisualGDB may give an error:
So I manually downloaded the toolchain. Unfortunately the error message does now show the actual command being attempted:
{% include code_header.html %}
mkdir C:\SysGCC\esp32\esp-idf\master
cd C:\SysGCC\esp32\esp-idf\master
git clone --recursive https://github.com/espressif/esp-idf.git
If you had to download your own manually, VisualGDB will not find it, even if in the specified directory. Choose the option on the right "Locate and existing ESP-IDF checkout. I purposely keep the VisualGDB stuff in this directory, as I have another ESP-IDF in my:
{% include code_header.html %}
Documents\Arduino\hardware\espressif\esp32
... that is used for other Arduino / VisualMicro
projects. Visual GDB will me looking for the README.md file in the root of the clone project. with the above command, I would need to use the ESP-IDF checkout here:
{% include code_header.html %}
C:\SysGCC\esp32\esp-idf\master\esp-idf
Next, ensure the proper ESP32 toolchain is selected:
Next, choose a sample project. Here we use the get-started / blink template:
Next is the JTAG driver. In my case, I am using the ESP32-WROVER-KIT V3, and I chose the interface/ftdi/esp32-devkitj_v1,cfg file:
Here we can optionally press the "test" button, for a result like this if everything is working properly:
Although there's a "next" button there, it does not do anything; click "finish".
WAIT. (yes, it takes a surprisingly long time) It appears nothing is happening. I think most of the time is spent setting up the project ESP-IDF container. Eventually a new "blink.c" file shows up:
{% include code_header.html %}
/* Blink Example
This example code is in the Public Domain (or CC0 licensed, at your option.)
Unless required by applicable law or agreed to in writing, this
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied.
*/
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "sdkconfig.h"
/* Can run 'make menuconfig' to choose the GPIO to blink,
or you can edit the following line and set a number here.
*/
#define BLINK_GPIO CONFIG_BLINK_GPIO
void blink_task(void *pvParameter)
{
/* Configure the IOMUX register for pad BLINK_GPIO (some pads are
muxed to GPIO on reset already, but some default to other
functions and need to be switched to GPIO. Consult the
Technical Reference for a list of pads and their default
functions.)
*/
gpio_pad_select_gpio(BLINK_GPIO);
/* Set the GPIO as a push/pull output */
gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT);
while(1) {
/* Blink off (output low) */
gpio_set_level(BLINK_GPIO, 0);
vTaskDelay(1000 / portTICK_PERIOD_MS);
/* Blink on (output high) */
gpio_set_level(BLINK_GPIO, 1);
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
void app_main()
{
xTaskCreate(&blink_task, "blink_task", configMINIMAL_STACK_SIZE, NULL, 5, NULL);
}
The first thing we'll need to do is take that
sketch_mmmdd.ino
file and rename it to something like main.cpp and make a few other changes. (hopefully in a future release, sysprogs will give the option of using C or C++ sample templates).
In the case of this blink app, BLINK_GPIO is simply defined as "2" with no type. The
gpio_set_level
expects a gpio_num_t
like this:
{% include code_header.html %}
gpio_set_level(static_cast<gpio_num_t>(BLINK_GPIO), 0);
The blink.c will also need to be renamed blink.cpp (apparently to ensure the compiler knows we are doing C++ and not just C). Preview 2 does not support right-click to rename, but you can click on the file in Solution Explorer and press F2 to enable the rename.
Only other minor tweak is needed; add
extern "C"
before the void main()
like this:
{% include code_header.html %}
extern "C" void app_main()
The revised code now looks like this:
{% include code_header.html %}
/* Blink Example
This example code is in the Public Domain (or CC0 licensed, at your option.)
Unless required by applicable law or agreed to in writing, this
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied.
*/
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "sdkconfig.h"
/* Can run 'make menuconfig' to choose the GPIO to blink,
or you can edit the following line and set a number here.
*/
#define BLINK_GPIO 2
void blink_task(void *pvParameter)
{
/* Configure the IOMUX register for pad BLINK_GPIO (some pads are
muxed to GPIO on reset already, but some default to other
functions and need to be switched to GPIO. Consult the
Technical Reference for a list of pads and their default
functions.)
*/
gpio_pad_select_gpio(BLINK_GPIO);
/* Set the GPIO as a push/pull output */
gpio_set_direction(static_cast<gpio_num_t>(BLINK_GPIO), GPIO_MODE_OUTPUT);
while(1) {
/* Blink off (output low) */
gpio_set_level(static_cast<gpio_num_t>(BLINK_GPIO), 0);
vTaskDelay(1000 / portTICK_PERIOD_MS);
/* Blink on (output high) */
gpio_set_level(static_cast<gpio_num_t>(BLINK_GPIO), 1);
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
extern "C" void app_main()
{
xTaskCreate(&blink_task, "blink_task", configMINIMAL_STACK_SIZE, NULL, 5, NULL);
}
So that all is your basic VisualGDB project. Not a whole lot new. Yet.
I've been
tinkering with LoRa stuff, and being able to single-step debug the code will be helpful. I'm using the RadioHead library and my local copy is git-cloned into \Documents\libraries\RadioHead. The interesting thing here is that the library is what I call "Arduino-style". I've never been able to get VisualGDB to play well with them, so I do a lot of development with VisualMicro instead. It is less expensive and fully supports the Arduino libraries. Alas I have a tons of "if debugging serial print" statements, as the JTAGsupport is weak. (there is however a VisualMicro GDB tutorial
I've been meaning to check out). The reality is the sysprogs VisualGDB is simply a more extensive and robust implementation with JTAG support (with a price to show for it). The problem with the sysprogs folks however, is they never had much of an interest in Arduino. (Yes, I want my cake and JTAG it too!)
So a single include statement turns out project into something considerably more interesting.
#include "RH_RF95.h"
Actually we'll do a few more things to instantiate the RadioHead drivers:
{% include code_header.html %}
#include "RH_RF95.h"
#define RFM95_CS 5 // LORA_CS_PIN
#define RFM95_RST 36 // LORA_RST_PIN is 36, TODO but it is read-only! so we'll need to short to another pin
#define RFM95_INT 26 // M5 LORA_IRQ_PIN 36 (jumper to 16)
RH_RF95 rf95(RFM95_CS, RFM95_INT);
Ok, so the code is actually from my M5Stack project, and I don't yet have LoRa hooked up to my lastest ESP32-WROVER, but that's beside the point...
After adding the code, the IDE will complain:
So simply go into Project-Properties and add the path the the "Additional Include Directories". In my case that's:
C:\Users\gojimmypi\Documents\Arduino\libraries\RadioHead
NOTE: If your cursor is in the source code panel when you click Project-Properties, you'll get this modal dialog box. It is NOT the one to use to enter paths for include files (it didn't work for me):
Be sure to click on the project name in the solution explorer, and THEN click Project - Properties:
...for this dialog box to enter the Additional Include File Directory paths:
(note I like to make a habit of always pressing "Apply" before pressing ok, anytime that option is available)
That will take care of finding the code, but trying to compile will give an error about platform not defined:
The first compile will take some time. There's a shockingly large amount of code that gets compiled for such a tiny target. If when building/cleaning/rebuilding, nothing happens, simply exit Visual Studio and relaunch (see below).
This is another one of those Arduino-style nuances. You'll notice this code in RadioHead.h header and shown here:
{% include code_header.html %}
#ifndef RH_PLATFORM
#if (MPIDE>=150 && defined(ARDUINO))
// Using ChipKIT Core on Arduino IDE
#define RH_PLATFORM RH_PLATFORM_CHIPKIT_CORE
#elif defined(MPIDE)
// Uno32 under old MPIDE, which has been discontinued:
#define RH_PLATFORM RH_PLATFORM_UNO32
#elif defined(NRF51)
#define RH_PLATFORM RH_PLATFORM_NRF51
#elif defined(NRF52)
#define RH_PLATFORM RH_PLATFORM_NRF52
#elif defined(ESP8266)
#define RH_PLATFORM RH_PLATFORM_ESP8266
#elif defined(ESP32)
#define RH_PLATFORM RH_PLATFORM_ESP32
#elif defined(ARDUINO)
#define RH_PLATFORM RH_PLATFORM_ARDUINO
#elif defined(__MSP430G2452__) || defined(__MSP430G2553__)
#define RH_PLATFORM RH_PLATFORM_MSP430
#elif defined(MCU_STM32F103RE)
#define RH_PLATFORM RH_PLATFORM_STM32
#elif defined(STM32F2XX)
#define RH_PLATFORM RH_PLATFORM_STM32F2
#elif defined(USE_STDPERIPH_DRIVER)
#define RH_PLATFORM RH_PLATFORM_STM32STD
#elif defined(RASPBERRY_PI)
#define RH_PLATFORM RH_PLATFORM_RASPI
#elif defined(__unix__) // Linux
#define RH_PLATFORM RH_PLATFORM_UNIX
#elif defined(__APPLE__) // OSX
#define RH_PLATFORM RH_PLATFORM_UNIX
#else
#error Platform not defined!
#endif
#endif
#if defined(__AVR_ATtiny84__) || defined(__AVR_ATtiny85__) || defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtinyX4__) || defined(__AVR_ATtinyX5__) || defined(__AVR_ATtiny2313__) || defined(__AVR_ATtiny4313__) || defined(__AVR_ATtinyX313__)
#define RH_PLATFORM_ATTINY#endif
To fix, simply add "ESP32" as a Preprocessor definition:
Rebuild again. There's a subtle change in the error message:
So this starts looking a bit more intimidating: Arduino.h missing for our ESP32 project. I took the brute-force approach and searched from the root of my C:\ drive:
{% include code_header.html %}
C:
cd\
dir Arduino.h /s
I had a 32 matches in various locations. Some are obviously not of interest if found in an .\Arduino\ directory. In my case, I have the
Espressif Arduino Core
git-cloned in my .\Documents\Hardware\Espressif directory. It can be installed like this:
{% include code_header.html %}
cd %USERPROFILE%\documents
mkdir hardware
git clone --recursive https://github.com/espressif/arduino-esp32.git
cd arduino-esp32
dir Arduino.h /s
dir SPI.h /s
dir pins_arduino.h /s
Put that directory in the include file list. Compile again and find another missing header file. Repeat. Note the pins_arduino.h is found in multiple directories. I chose the generic ESP32 one. After doing this a few times, VisualGDB often will complain the the settings are corrupt:
I simply exited Visual Studio and restarted. Upon restart, it complained out "line endings not being consistent". VisualGDB probably did this to itself; simple answer yes to fix:
Upon doing a rebuild, I found more files missing. Repeat the procedure for finding files.
Mine were found in:
C:\Users\gojimmypi\Documents\Arduino\libraries\RadioHead
C:\Users\gojimmypi\Documents\Arduino\hardware\espressif\esp32
C:\Users\gojimmypi\Documents\Arduino\hardware\espressif\esp32\cores\esp32
C:\Users\gojimmypi\Documents\Arduino\hardware\espressif\esp32\libraries\SPI\src
C:\Users\gojimmypi\Documents\Arduino\hardware\espressif\esp32\variants\esp32
May also need:
C:\Users\gojimmypi\Documents\Arduino\hardware\espressif\esp32\variants\doitESP32devkitV1
Note that the include file locations is not the only place for this fix; The intellisense will be happy, however the compiler does not seem to "find" there files. There is where things get a little wonky. Those same include files paths need to be added to the project. Right-click on the project, add, existing item (for each of the directories listed above).
Paste one of those include file paths into the File Name box. I choose to select header files (some directories have only headers!). Pick one of them. VisualGDB will recognize that there are others and prompt you to add them all. Click ok.
If multiple files are found, there will be a prompt asking if they all should be added (yes, they should):
Rebuild the project. (sometimes it can help to clean, and then do a full rebuild).
Tada! A fully compiled Arduino-style library with VisualGDB. For me - this was really quite cool: something I've been wanting to do for a long time.
There are still a few weird things. The include files are presented in the Solution Explorer in a pretty bizarre fashion. As these same include directories are found in the Project Properties, I really think it would be best of the directory scanning and file additions happened transparently to the developer.
Also, It seems that breakpoint cannot be placed directly on those included files. However you can step-into them. Unfortunately the only option is step into. Step-over does not seem to work. Nor does step out. Alas this is only Preview 2, and still in development.
The Solution Explorer also looks a bit odd:
There's also some wonkiness with OpenOCD when code is paused too long. I think there's some sort of panic watchdog that is not fed while single-step debug is paused:
And no sooner do I polish this Preview 2 blog... the
sysprogs folks have already released Preview 3
! (And yes, it DOES appear to work in Preview 3 as well!)
* July 2018 edit:
Over the course of time, my Windows 10 drivers were changed, resulting in the dreaded message:
{% include code_header.html %}
Error: libusb_open() failed with LIBUSB_ERROR_ACCESS
Error: no device found
Error: unable to open ftdi device with vid 0403, pid 6010, description '*', serial '*' at bus location '*'
Zadig to the rescue once again! Change both drivers on
Interface 0
and
Interface 1
to
libusbk
.
I am using the config file found in:
C:\sysgcc\esp32\esp32-bsp\OpenOCD\share\openocd\scripts\interface\ftdi\esp32_devkitj_v1.cfg
That specifically looks like this:
{% include code_header.html %}
#
# Driver for the FT2232H JTAG chip on the Espressif DevkitJ board
#
interface ftdi
ftdi_vid_pid 0x0403 0x6010
# interface 1 is the uart
ftdi_channel 0
# just TCK TDI TDO TMS, no reset
ftdi_layout_init 0x0008 0x000b
reset_config none
Copyright (c) gojimmypi all rights reserved. Blogger Image Move Cleaned: 5/3/2021 1:35:53 PM


Part of screen sharing
Copyright © 2013 Muaz Khan<@muazkh>. @WebRTCWeb
intro:
- Sharing part of the screen or region of screen (i.e. a DIV, SECTION, ARTICLE or ASIDE)... not the entire screen!
- Everything inside that DIV is synchronized in realtime.
- Works fine on all modern web browsers supporting WebRTC Data Channels.
how?
- Share screenshots of the entire DIV, ASIDE or BODY element in realtime!
- Using Firebase to transmit screenshots in realtime! (sharing screenshots after each 500 milliseconds)
- It is better to "pause sharing" to scroll down and see others' shared regions.
- It supports multi-user connectivity too! Hmm! i.e. you can share region of screen with many friends!
Try Part of Screen Sharing using WebRTC Data Channel / 100% realtime!
<script src="https://www.webrtc-experiment.com/screenshot.js"></script> <script> var divToShare = document.querySelector('div'); html2canvas(divToShare, { onrendered: function (canvas) { var screenshot = canvas.toDataURL(); // image.src = screenshot; // context.drawImage(screenshot, x, y, width, height); // firebase.push(screenshot); // pubnub.send(screenshot); // socketio.send(screenshot); // signaler.send(screenshot); // window.open(screenshot); } }); /*Note:
Put above code in a function; use "requestAnimationFrame" to loop the function and post/transmit DataURL in realtime!What above code will do?
Above code will take screenshot of the DIV or other HTML element and return you and image. You can preview image to render in IMG element or draw to Canvas2D. */ </script>


David Afonso
Portfolio
About
Hi, I'm David Afonso
Graphic Designer & Web enthusiast. Living in Porto, Portugal.
Welcome to my portfolio!
Portfolio
hánonovovidanova
web | illustration
Metamorfose Cultural
illustration | editorial
Galp
product rebranding | illustration
A Portuguese Love Affair
rebranding | typography
human
photography
metamorphosis
photography
la jetée
web
gradients
photography
Show more
Stylish Portfolio is the perfect theme for your next project!
This theme features some wonderful photography courtesy of
Death to the Stock Photo
.
get in touch
sttill@gmail.com


A Streetcar Named Desire (1951)
Grade: 72
One problem common to most plays that have been adapted for the movies is that there's too much dialogue, and not enough action. Scenes of two people talking (or, more likely, one person mostly talking and one person mostly listening) seem to stretch on and on. Of course, if the script is good enough, all is forgiven.
Although "A Streetcar Named Desire" received an Oscar nomination for Best Screenplay, the script, based on the Tennessee Williams' play, is not strong enough to fully overcome the stagy nature of the film. The character of Blanche (Vivien Leigh) in particular is burdened with rambling speeches, which she must deliver in her affected whisper.
"A Streetcar Named Desire" has aging beauty Blanche forced to leave her hometown, as the family estate has been lost, and her scandalous behaviour has made her not welcome. She moves in with sister Stella (Kim Hunter) in New Orleans, who lives with brutish husband Stanley (Marlon Brando). There, the emotionally fragile Blanche spins lies to cover her scandals, and to further a romance with lonely Mitch (Karl Malden). As her true past comes out, Blanche becomes the only person to believe her lies.
The film caused a sensation, as did the play. Brando, who received an Oscar nomination for Best Actor, has the most controversial role, a swaggering, bullying blue-collar character.  Blanche is pitied by other women, but is a subject of derision for men.
I have not seen any of Williams' plays, but several of his screen adaptions. From what I have seen, he appears to be over-rated as a playwright, drawing excessive publicity through the use of controversial and sexual themes.
"A Streetcar Named Desire" is a very good film despite its problems. The cast is excellent, and the characters are sharply defined. The cast was mostly taken from the successful Broadway play, with Leigh substituting for Jessica Tandy as Blanche. Leigh is so convincing that she has been identified with the role, her second most famous after Scarlett in "Gone With the Wind". It is ironic that her later years are said to resemble Blanche's character in some ways.
"A Streetcar Named Desire" won Oscars for Best Actress (Leigh), Best Supporting Actor (Malden), Best Supporting Actress (Hunter) and for the sets. It was also nominated for Best Picture, Best Director (Elia Kazan) and Best Cinematography. But despite its critical success, the film is somewhat over-rated, while more deserving Kazan efforts such as "A Tree Grows in Brooklyn" and "America, America" are comparitively obscure.
<EMAIL_ADDRESS>http://members.tripod.com/~Brian_Koller/movies.html
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


Username
Password
First time user? Sign up
Name: Luke
Date Seen: January 29, 2019
This bird was trying to get some nectar, and this is the photo I was able to capture.
Name: Flutter
Date Seen: March 10, 2019
A docile British shorthair, found inside Golden Gate park.
Name: Tom
Date Seen: May 15, 2018
I found this bird located in the park.
THU 6:26pm
Beautiful hummingbirds in the flower...
Thu 1:15PM
Two hummingbirds in the flowers...
Thu 8:03AM
I think I saw a beautiful Anna Hummingbird...
jxcmaggie@gmail.com


console
editor
settings
Process up to
instructions every
milliseconds.
Tablet mode will attempt to detect your screen size and adjust the user interface to make better use of it.


Donald Trump's doctor says shock health examination was not for heart condition
Trump's private doctor Sean Conley said his unexpected trip to Walter Reed National Military Medical Center was actually 'routine' and ruled out health issues
by Andrew Gilpin, https://www.mirror.co.uk/authors/andrew-gilpin/Donald Trump's health examination on Saturday was "routine" and he was not treated for any urgent issues, his physician has said.
Trump's unexpected trip to Walter Reed National Military Medical Center triggered questions on social media since it came months before the president's annual physical has been carried out in the past.
"Despite some of the speculation, the president has not had any chest pain, nor was he evaluated or treated for any urgent or acute issues," U.S. Navy Commander Sean Conley, Trump's doctor, said in a memo released by the White House.
"Specifically, he did not undergo any specialised cardiac or neurologic evaluations," Conley said.
It comes as the President is subject of an impeachment hearing over his conduct with the Ukrainian President.
The exam was a "routine, planned interim checkup as part of the regular, primary preventative care he receives throughout the year", Conley said.
"Due to scheduling uncertainties, the trip was kept off the record."
He said Trump's total cholesterol is now 165, with an HDL of 70, and LDL of 84 and a non-HDL of 95, all of which are considered healthy levels, according to the National Heart, Lung and Blood Institute.
"Everything very good (great!)," Trump said in a tweet on Sunday about the results. "Will complete next year."
Earlier in the year Trump was classed in the "obese range' after piling on the pounds during his presidency.
However the 72-year-old remains in "very good health overall," according to the results of his annual physical examination conducted in February.
"After taking into account all the laboratory results, examinations and specialist recommendations, it is my determination that the president remains in very good health overall," the president's physician, Sean Conley, wrote in a memo on Thursday.
A copy of the memo was released by the White House.
The memo, which detailed the findings of an examination of Trump that Conley led on Friday, said the 72-year-old president weighed 243 pounds (110.2 kg), up from 239 pounds (108.4 kg) in early 2018.


LUX defaults to a 256 character limit if unspecified as an attribute. We should be able to set the max-length to whatever we think it should be.
closed
by None at 2020-02-11 13:25:42.closed
by None at 2020-02-11 13:25:46.closed
by None at 2020-02-11 13:25:48.referenced
by Kevin Reiss at 2020-02-11 17:38:08.merged
by Kevin Reiss at 2020-02-11 17:38:08.closed
by Kevin Reiss at 2020-02-11 17:38:08.head_ref_deleted
by Kevin Reiss at 2020-02-11 17:38:16.review_requested
by Axa Mei Liauw at 2020-02-11 14:11:21.referenced
by Kevin Reiss at 2020-02-11 17:38:48.merged
by Kevin Reiss at 2020-02-11 17:38:48.closed
by Kevin Reiss at 2020-02-11 17:38:49.head_ref_deleted
by Kevin Reiss at 2020-02-11 17:38:52.assigned
by None at 2020-02-11 18:16:30.referenced
by None at 2020-02-11 18:34:38.closed
by Axa Mei Liauw at 2020-02-11 18:49:57.review_requested
by None at 2020-02-11 18:39:54.referenced
by Axa Mei Liauw at 2020-02-11 18:49:57.merged
by Axa Mei Liauw at 2020-02-11 18:49:57.closed
by Axa Mei Liauw at 2020-02-11 18:49:57.head_ref_deleted
by Axa Mei Liauw at 2020-02-11 18:50:00.closed
by Axa Mei Liauw at 2020-02-11 19:49:13.@jpstroop I added a hint to both the occurrences and the cost. It is out in production now. Does this satisfy the request?
👍🏻👍🏻👍🏻
mentioned
by Jon Stroop at 2020-02-11 13:27:51.subscribed
by Jon Stroop at 2020-02-11 13:27:51.referenced
by Trey Pendragon at 2020-02-10 23:31:21.referenced
by Trey Pendragon at 2020-02-10 23:44:12.closed
by Trey Pendragon at 2020-02-10 23:58:40.head_ref_force_pushed
by Trey Pendragon at 2020-02-10 23:44:12.referenced
by Trey Pendragon at 2020-02-10 23:58:40.merged
by Trey Pendragon at 2020-02-10 23:58:40.closed
by Trey Pendragon at 2020-02-10 23:58:40.head_ref_deleted
by Trey Pendragon at 2020-02-10 23:58:43.closed
by Cliff Wulfman at 2020-02-11 14:12:43.closed
by Christina Chortaria at 2020-02-11 15:10:49.This looks good, but I'm seeing two issues: 1. When I edit an issue, the default selected values for object type, denomination, metal, and shape are the defaults, not the values in the saved object. 2. The time to load the edit form is much, much longer than the time to load the new form.
The first seems like a blocker for merging and deploying this, and for the numismatics staff to use Figgy. The second issue would be nice to fix, but it would be fine to defer that to a separate issue.
When I look at the HTML source, I see no object_type, etc. filled out even though the saved object has them populated (and displaying in the show view):
<input id="object_type" type="hidden" name="numismatics_issue[object_type]" value="" />
https://github.com/pulibrary/figgy/pull/3648/commits/ad1a715be62a1c84f1cbdcad6e4a468a28a5c25e should fix the problems with rendering persisted values.
I know that select2 provides a solution for loading from an API endpoint, but in order to get this into production, I did not explore this.
Thank you @jrgriffiniii . The edit form shows now the selected values. The only issue I see is the performance. The edit form takes around 49 s to load and the new form 46 s, but this is something we could improve and I don't think it should prevent us from merging.
head_ref_force_pushed
by James R. Griffin III at 2020-02-11 06:29:43.head_ref_force_pushed
by James R. Griffin III at 2020-02-11 06:49:04.deployed
by Trey Pendragon at 2020-02-11 13:11:45.deployed
by Trey Pendragon at 2020-02-11 13:56:35.head_ref_force_pushed
by James R. Griffin III at 2020-02-11 14:10:22.deployed
by Trey Pendragon at 2020-02-11 14:10:30.head_ref_force_pushed
by James R. Griffin III at 2020-02-11 14:17:35.deployed
by Trey Pendragon at 2020-02-11 14:17:50.mentioned
by James R. Griffin III at 2020-02-11 14:31:33.subscribed
by James R. Griffin III at 2020-02-11 14:31:33.referenced
by Christina Chortaria at 2020-02-11 15:10:49.merged
by Christina Chortaria at 2020-02-11 15:10:49.closed
by Christina Chortaria at 2020-02-11 15:10:50.@tampakis thank you for fixing this issue. can you rebase and push again?
head_ref_force_pushed
by Nikitas Tampakis at 2020-02-10 22:38:46.mentioned
by Nikitas Tampakis at 2020-02-11 14:58:02.subscribed
by Nikitas Tampakis at 2020-02-11 14:58:02.head_ref_force_pushed
by Nikitas Tampakis at 2020-02-11 15:00:44.head_ref_force_pushed
by Nikitas Tampakis at 2020-02-11 15:14:28.referenced
by Christina Chortaria at 2020-02-11 15:34:20.merged
by Christina Chortaria at 2020-02-11 15:34:20.closed
by Christina Chortaria at 2020-02-11 15:34:20.closed
by Christina Chortaria at 2020-02-11 15:34:20.@kelea99 Which part/collection? And is there info on what kind of metadata they need? OAI_DC? MARC21?
@tpendragon OAI. Lemme get the specs and send them to you via email. The big collection we are wanting to send with the first batch at the end of this month is the Louis-Alexandre Berthier Collection (C0022).
I have the docs, we're going to see if we can post it here. The format is OAI_DC, the doc says which fields are necessary on page 8.
We should be able to implement this by defining to_oai_dc
on ScannedResource
mentioned
by Kim Leaman at 2020-02-11 17:03:50.subscribed
by Kim Leaman at 2020-02-11 17:03:50.mentioned
by Trey Pendragon at 2020-02-11 17:17:59.subscribed
by Trey Pendragon at 2020-02-11 17:17:59.assigned
by Trey Pendragon at 2020-02-11 18:07:11.numismatics/New Tiffs
assigned
by Eliot Jordan at 2020-02-11 18:27:39.We might be able to just swap the source metadata identifiers and everything will fix itself up.
labeled
by Eliot Jordan at 2020-02-11 17:44:14.labeled
by Eliot Jordan at 2020-02-11 17:44:14.@roelmoon We think re-photographing this is the best way forward, since otherwise we'd lose the full-resolution images. How much work are these to photograph?
labeled
by Eliot Jordan at 2020-02-11 17:38:39.labeled
by Eliot Jordan at 2020-02-11 17:38:39.mentioned
by Roel Munoz at 2020-02-11 18:52:51.subscribed
by Roel Munoz at 2020-02-11 18:52:51.labeled
by None at 2020-02-11 19:41:51.labeled
by Eliot Jordan at 2020-02-11 20:49:16.assigned
by Eliot Jordan at 2020-02-11 20:49:16.The user creates the citation in the new issue form. My understanding is that they want to be able to have a link to create new accessions , firms, monograms, people, places, references (Basically what is in the dashboard)
I will add links to open a new tab for each one.
assigned
by Christina Chortaria at 2020-02-11 19:09:59.renamed
by Christina Chortaria at 2020-02-11 23:54:29.closed
by Christina Chortaria at 2020-02-11 15:49:29.referenced
by Christina Chortaria at 2020-02-11 15:49:29.merged
by Christina Chortaria at 2020-02-11 15:49:29.closed
by Christina Chortaria at 2020-02-11 15:49:30.referenced
by Francis Kayiwa at 2020-02-11 13:08:50.referenced
by Francis Kayiwa at 2020-02-11 13:27:55.head_ref_force_pushed
by Francis Kayiwa at 2020-02-11 19:50:33.referenced
by Peter Green at 2020-02-11 20:06:48.merged
by Peter Green at 2020-02-11 20:06:48.closed
by Peter Green at 2020-02-11 20:06:49.review_requested
by Francis Kayiwa at 2020-02-11 13:09:32.head_ref_force_pushed
by Francis Kayiwa at 2020-02-11 13:27:55.head_ref_force_pushed
by None at 2020-02-11 22:00:37.


The amount of time to delay the popover content in milliseconds. Default 500.
Activate the dictionary by entering your API key from dictionaryapi.com
The maximum number of words trigger the revealer content. Default 3.


☰
Jonnovative
folder
Portfolio
person
About
call
Contact
☰
×
Home
Portfolio
About
Contact
Responsive Side Menu


Quickstart¶
Below we present a simple example that monitors the current directory recursively (which means, it will traverse any sub-directories) to detect changes. Here is what we will do with the API:
- Create an instance of the
watchdog.observers.Observer
thread class. - Implement a subclass of
watchdog.events.FileSystemEventHandler
(or as in our case, we will use the built-inwatchdog.events.LoggingEventHandler
, which already does). - Schedule monitoring a few paths with the observer instance attaching the event handler.
- Start the observer thread and wait for it generate events without blocking our main thread.
By default, an watchdog.observers.Observer
instance will not monitor
sub-directories. By passing recursive=True
in the call to
watchdog.observers.Observer.schedule()
monitoring
entire directory trees is ensured.
A Simple Example¶
The following example program will monitor the current directory recursively for file system changes and simply log them to the console:
import sys
import time
import logging
from watchdog.observers import Observer
from watchdog.events import LoggingEventHandler
if __name__ == "__main__":
logging.basicConfig(level=logging.INFO,
format='%(asctime)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S')
path = sys.argv[1] if len(sys.argv) > 1 else '.'
event_handler = LoggingEventHandler()
observer = Observer()
observer.schedule(event_handler, path, recursive=True)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
To stop the program, press Control-C.


This post is a continuation of many articles about WebGL. The last one was about using textures for rendering text in WebGL. If you haven't read it you might want to check that out before continuing.
In the last article we went over how to use a texture to draw text in your WebGL scene. That techinque is very common and it's great for things like in multi-player games where you want to put a name over an avatar. As that name rarely changes it's perfect.
Let's say you want to render a lot of text that changes often like a UI. Given the last example in the previous article an obvious solution is to make a texture for each letter. Let's change the last sample to do that.
+var names = [
+ "anna", // 0
+ "colin", // 1
+ "james", // 2
+ "danny", // 3
+ "kalin", // 4
+ "hiro", // 5
+ "eddie", // 6
+ "shu", // 7
+ "brian", // 8
+ "tami", // 9
+ "rick", // 10
+ "gene", // 11
+ "natalie",// 12,
+ "evan", // 13,
+ "sakura", // 14,
+ "kai", // 15,
+];
// create text textures, one for each letter
var textTextures = [
+ "a", // 0
+ "b", // 1
+ "c", // 2
+ "d", // 3
+ "e", // 4
+ "f", // 5
+ "g", // 6
+ "h", // 7
+ "i", // 8
+ "j", // 9
+ "k", // 10
+ "l", // 11
+ "m", // 12,
+ "n", // 13,
+ "o", // 14,
+ "p", // 14,
+ "q", // 14,
+ "r", // 14,
+ "s", // 14,
+ "t", // 14,
+ "u", // 14,
+ "v", // 14,
+ "w", // 14,
+ "x", // 14,
+ "y", // 14,
+ "z", // 14,
].map(function(name) {
* var textCanvas = makeTextCanvas(name, 10, 26);
Then instead of rendering one quad for each name we'll render one quad for each letter in each name.
// setup to draw the text.
+// Because every letter uses the same attributes and the same progarm
+// we only need to do this once.
+gl.useProgram(textProgramInfo.program);
+setBuffersAndAttributes(gl, textProgramInfo.attribSetters, textBufferInfo);
textPositions.forEach(function(pos, ndx) {
+ var name = names[ndx];
+
+ // for each leter
+ for (var ii = 0; ii < name.length; ++ii) {
+ var letter = name.charCodeAt(ii);
+ var letterNdx = letter - "a".charCodeAt(0);
+
+ // select a letter texture
+ var tex = textTextures[letterNdx];
// use just the position of the 'F' for the text
// because pos is in view space that means it's a vector from the eye to
// some position. So translate along that vector back toward the eye some distance
var fromEye = normalize(pos);
var amountToMoveTowardEye = 150; // because the F is 150 units long
var viewX = pos[0] - fromEye[0] * amountToMoveTowardEye;
var viewY = pos[1] - fromEye[1] * amountToMoveTowardEye;
var viewZ = pos[2] - fromEye[2] * amountToMoveTowardEye;
var desiredTextScale = -1 / gl.canvas.height; // 1x1 pixels
var scale = viewZ * desiredTextScale;
var textMatrix = makeIdentity();
+ textMatrix = matrixMultiply(textMatrix, makeTranslation(ii, 0, 0));
textMatrix = matrixMultiply(textMatrix, makeScale(tex.width * scale, tex.height * scale, 1));
textMatrix = matrixMultiply(textMatrix, makeTranslation(viewX, viewY, viewZ));
textMatrix = matrixMultiply(textMatrix, projectionMatrix);
// set texture uniform
textUniforms.u_texture = tex.texture;
copyMatrix(textMatrix, textUniforms.u_matrix);
setUniforms(textProgramInfo.uniformSetters, textUniforms);
// Draw the text.
gl.drawElements(gl.TRIANGLES, textBufferInfo.numElements, gl.UNSIGNED_SHORT, 0);
}
});
And you can see it works
Unfortunately it's SLOW. The example below doesn't show it but we're individually drawing 73 quads. We're computing 73 matrices and 292 matrix multplies. A typical UI might easily have 1000 letters showing. That's way way too much work to get a reasonable framerate.
So to fix that the way this is usually done is to make a texture atlas that contains all the letters. We went over what a texture atlas when we talked about texturing the 6 faces of a cube.
Let's make some code to make a texture atlas of glyphs.
function makeGlyphCanvas(ctx, maxWidthOfTexture, heightOfLetters, baseLine, padding, letters) {
var rows = 1; // number of rows of glyphs
var x = 0; // x position in texture to draw next glyph
var y = 0; // y position in texture to draw next glyph
var glyphInfos = { // info for each glyph
};
// Go through each letter, measure it, remember its width and position
for (var ii = 0; ii < letters.length; ++ii) {
var letter = letters[ii];
var t = ctx.measureText(letter);
// Will this letter fit on this row?
if (x + t.width + padding > maxWidthOfTexture) {
// so move to the start of the next row
x = 0;
y += heightOfLetters;
++rows;
}
// Remember the data for this letter
glyphInfos[letter] = {
x: x,
y: y,
width: t.width,
};
// advance to space for next letter.
x += t.width + padding;
}
// Now that we know the size we need set the size of the canvas
// We have to save the canvas settings because changing the size
// of a canvas resets all the settings
var settings = saveProperties(ctx);
ctx.canvas.width = (rows == 1) ? x : maxWidthOfTexture;
ctx.canvas.height = rows * heightOfLetters;
restoreProperties(settings, ctx);
// Draw the letters into the canvas
for (var ii = 0; ii < letters.length; ++ii) {
var letter = letters[ii];
var glyphInfo = glyphInfos[letter];
var t = ctx.fillText(letter, glyphInfo.x, glyphInfo.y + baseLine);
}
return glyphInfos;
}
And let's use it
var ctx = document.createElement("canvas").getContext("2d");
ctx.font = "20px sans-serif";
ctx.fillStyle = "white";
var maxTextureWidth = 256;
var letterHeight = 22;
var baseline = 16;
var padding = 1;
var letters = "0123456789.abcdefghijklmnopqrstuvwxyz";
var glyphInfos = makeGlyphCanvas(
ctx,
maxTextureWidth,
letterHeight,
baseline,
padding,
letters);
Here's the result
Now that we have a texture with glyphs in it we need to use it. To do that we'll build quad vertices on the fly for each glyph. Those vertices will use texture coordinates to select a particlar glyph
Given a string lets build the vertices
function makeVerticesForString(fontInfo, s) {
var len = s.length;
var numVertices = len * 6;
var positions = new Float32Array(numVertices * 2);
var texcoords = new Float32Array(numVertices * 2);
var offset = 0;
var x = 0;
for (var ii = 0; ii < len; ++ii) {
var letter = s[ii];
var glyphInfo = fontInfo.glyphInfos[letter];
if (glyphInfo) {
var x2 = x + glyphInfo.width;
var u1 = glyphInfo.x / fontInfo.textureWidth;
var v1 = (glyphInfo.y + fontInfo.letterHeight) / fontInfo.textureHeight;
var u2 = (glyphInfo.x + glyphInfo.width) / fontInfo.textureWidth;
var v2 = glyphInfo.y / fontInfo.textureHeight;
// 6 vertices per letter
positions[offset + 0] = x;
positions[offset + 1] = 0;
texcoords[offset + 0] = u1;
texcoords[offset + 1] = v1;
positions[offset + 2] = x2;
positions[offset + 3] = 0;
texcoords[offset + 2] = u2;
texcoords[offset + 3] = v1;
positions[offset + 4] = x;
positions[offset + 5] = fontInfo.letterHeight;
texcoords[offset + 4] = u1;
texcoords[offset + 5] = v2;
positions[offset + 6] = x;
positions[offset + 7] = fontInfo.letterHeight;
texcoords[offset + 6] = u1;
texcoords[offset + 7] = v2;
positions[offset + 8] = x2;
positions[offset + 9] = 0;
texcoords[offset + 8] = u2;
texcoords[offset + 9] = v1;
positions[offset + 10] = x2;
positions[offset + 11] = fontInfo.letterHeight;
texcoords[offset + 10] = u2;
texcoords[offset + 11] = v2;
x += glyphInfo.width;
offset += 12;
} else {
// we don't have this character so just advance
x += fontInfo.spaceWidth;
}
}
// return ArrayBufferViews for the portion of the TypedArrays
// that were actually used.
return {
arrays: {
position: new Float32Array(positions.buffer, 0, offset),
texcoord: new Float32Array(texcoords.buffer, 0, offset),
},
numVertices: offset / 2,
};
}
To use it we'll manually create a bufferInfo. (See previous article if you don't remember what a bufferInfo is).
// Maunally create a bufferInfo
var textBufferInfo = {
attribs: {
a_position: { buffer: gl.createBuffer(), numComponents: 2, },
a_texcoord: { buffer: gl.createBuffer(), numComponents: 2, },
},
numElements: 0,
};
and a fontInfo and texture from the canvas with glyphs in it
var ctx = document.createElement("canvas").getContext("2d");
ctx.font = "20px sans-serif";
ctx.fillStyle = "white";
var maxTextureWidth = 256;
var letterHeight = 22;
var baseline = 16;
var padding = 1;
var letters = "0123456789.,abcdefghijklmnopqrstuvwxyz";
var glyphInfos = makeGlyphCanvas(
ctx,
maxTextureWidth,
letterHeight,
baseline,
padding,
letters);
var fontInfo = {
glyphInfos: glyphInfos,
letterHeight: letterHeight,
baseline: baseline,
spaceWidth: 5,
textureWidth: ctx.canvas.width,
textureHeight: ctx.canvas.height,
};
And then to render text we'll update the buffers. We'll also make the text dynamic
textPositions.forEach(function(pos, ndx) {
var name = names[ndx];
var s = name + ":" + pos[0].toFixed(0) + "," + pos[1].toFixed(0) + "," + pos[2].toFixed(0);
var vertices = makeVerticesForString(fontInfo, s);
// update the buffers
textBufferInfo.attribs.a_position.numComponents = 2;
gl.bindBuffer(gl.ARRAY_BUFFER, textBufferInfo.attribs.a_position.buffer);
gl.bufferData(gl.ARRAY_BUFFER, vertices.arrays.position, gl.DYNAMIC_DRAW);
gl.bindBuffer(gl.ARRAY_BUFFER, textBufferInfo.attribs.a_texcoord.buffer);
gl.bufferData(gl.ARRAY_BUFFER, vertices.arrays.texcoord, gl.DYNAMIC_DRAW);
setBuffersAndAttributes(gl, textProgramInfo.attribSetters, textBufferInfo);
// use just the position of the 'F' for the text
var textMatrix = makeIdentity();
// because pos is in view space that means it's a vector from the eye to
// some position. So translate along that vector back toward the eye some distance
var fromEye = normalize(pos);
var amountToMoveTowardEye = 150; // because the F is 150 units long
textMatrix = matrixMultiply(textMatrix, makeTranslation(
pos[0] - fromEye[0] * amountToMoveTowardEye,
pos[1] - fromEye[1] * amountToMoveTowardEye,
pos[2] - fromEye[2] * amountToMoveTowardEye));
textMatrix = matrixMultiply(textMatrix, projectionMatrix);
// set texture uniform
copyMatrix(textMatrix, textUniforms.u_matrix);
setUniforms(textProgramInfo.uniformSetters, textUniforms);
// Draw the text.
gl.drawArrays(gl.TRIANGLES, 0, vertices.numVertices);
});
And here's that
That's the basic technique of using a texture atlas of glyphs. There's a few obvious things to add or ways to improve it.
Reuse the same arrays.
Currently makeVerticesForString
allocates new Float32Arrays each time it's called.
That's probably going to eventually cause garbage collection hiccups. Re-using the
same arrays would probably be better. You'd enlarge the array if it's not large
enough and keep that size around
Add support for carriage return
Check for \n
and go down a line when generating vertices. This would make it
easy to make paragraphs of text.
Add support for all kinds of other formatting.
If you wanted to center the text or justify it you could add all that.
Add support for vertex colors.
Then you could color the text different colors per letter. Of course you'd have to decide how to specify when to change colors.
The other big issue which I'm not going to cover is that textures have a limited size but fonts are effectively unlimited. If you want to support all of unicode so that you can handle Chinese and Japanese and Arabic and all the other languages, well, as of 2015 there are over 110,000 glyphs in Unicode! You can't fit all of those in textures. There just isn't enough room.
The way the OS and browsers handle this when they're GPU accelerated is by using a glyph texture cache. Like above they might put textures in a texture atlas but they probably make the area for each glpyh a fixed size. They keep the most recently used glyphs in the texture. If they need to draw a glyph that's not in the texture they replace the least recently used one with the new one they need. Of course if that glyph they are about to replace is still being refereneced by a quad yet to be drawn then they need to draw with what they have before replacing the glyph.
Another thing you can do, though I'm not recommending it, is combine this technique with the previous technique. You can render glyphs directly into another texture. Of course a GPU acclerated canvas already does that for you so there's probably no reason to do it yourself.
Yet one more way to draw text in WebGL is to actually use 3D text. The 'F' in all the samples above is a 3D letter. You'd make one for each letter. 3D letters are common for titles and movie logos but not much else.
I hope that's covered text in WebGL.


When I visited the flat for the first time, C introduced to me how she allocated books in different locations in the flat according to their relevance to her studies. Below is the floor plan of the house with annotations of different book categories.
Physical Books
Since C was a PhD student, she had to do a lot of writing on her laptop. The laptop, therefore, was placed on the table where she did most of her studies. She preferred using the dining table to the desk provided by the landlord because of its position next to the window, from which sounds from the street could be heard1.
C put the books in different places of the flat according to their relevance to her current study. The books and papers she was reading at the moment were on the dining table. The shelf opposite the table were books of relevance to her. Interestingly, those books were all borrowed from the library since she found that books on that shelf gathered dust.
Recent purchases and books of possible relevance were put on the desk or the shelf next to the desk.
There was another shelf next to her bed in the bedroom. The books on that shelf were what she considered books of no immediate relevance. They were mostly fictional works.
Electronic Books
C had a Kindle e-reader with hundreds of e-books, but it was no longer her primary reading device2. Originally it was placed on the desk, but she relocated it to the table when I asked her about it. She purchased many theoretical e-books in the past but had stopped acquiring new titles. Thus, Kindle was only used when she wanted to refer to the books stored within.
Papers/Articles
As a PhD student, C was constantly searching for relevant papers to read for her research. Her main searching tool was Google Scholar, and she found out about articles both at home, at school, and during commute.
No matter where and when she discovered the articles, the electronic copies would be categorized and saved to her laptop3. However, she preferred reading articles in their print format much more than their electronic format, so she would take the electronic files to the school library to print out the physical copies and then read them at home or at cafés. Only when time did not permit her to print out articles first would she read electronic documents.
Articles were, thus, the materials that traveled the longest distance among all of her materials. They also took on different materialities in each reading stage.
The printed articles were piled up on the desk and on the dining table during my first and second visit to the home. During the final interview, I noticed that a new box was placed in the middle of the library-cum-living room to accommodate the print articles.
Researcher: Has this box always been here? I don't remember seeing it before.
C: I placed the box there last week, and it has stayed in the same location. It's quite heavy, so I can't move it elsewhere.
Researcher: How did you organize articles before the box was there?
C: Quite messily. I just put them on the table and the desk.
Researcher: Such as this pile [on the table]?
C: Yes, on the table, in drawers, on chairs. There were too many of them. I thought I needed... a box to easily pick out the ones I want. If they pile up on the table, it's difficult to take out those at the bottom.
Organizing scattered items in boxes is a common practice in domestic life. C collected academic reading materials were collected in a box, and these materials mediated not mediated her own personal memories but also her relationships with the academic communities. The box as well as other objects in her home thus contains her cultural memories (van Djick, 2007)3, and they open a window to analyses of how memories and identities are constructed4.


Post edited 1 x times, last by
BrainFooLong
Administrator
Topicstarter
There is an Error in the Bblog Assignment "Dude , im a Frag Master" / 500 Grenade Kills
The counter for the Grenade Kills is not activ.
So no one has the possibility to bring that challenge to the End.!!
Please read
http://getbblog.com/en/board/topic/49746/1/Assignment-bug
BrainFooLong
Administrator
Battlelog Bug, not BBLog.


This demo shows off the basic uses of the tab component.
There are many more variations and features available when using the material tab components. More information can be found at the following locations:


Your library will be published to GAS Library Manager Sites with your profile, user icon, nickname and Google+ Profile URL. If you want to change library descriptions, please close this dialog and click{{i18n('modify')}}
button.
If you want to change library descriptions, please close this dialog and click"{{i18n('modify')}}"
button.


Brazil is and will always be my home. Brazil is a beautiful country, full of good things, beautiful places and nice people.
I'm from Sao Paulo, well known as "drizzle land". Sao Paulo is like New York, a city that never stops.
I love that Sao Paulo is the largest state in Brazil and it is possible to do everything there and meet people from all over the world.
The city of Sao Paulo is capital to the state of the same name. It is particularly rich in historical, political and cultural value, giving visitors an authentic, memorable experience of a fascinating country. With over 12.000 different restaurants, as well as pubs, clubs and discos, there is no shortage of activities and attractions for all visitors, regardless of age or profile. It is impossible not to fall in love with Sao Paulo.


BAD BOY BUBBY. 1993, Australia. Writer/Director: Rolf de Heer. Cinematography: Ian Jones Music: Graham Tardiff Actors: Nicholas Hope, Claire Benito, Carmel Johnson, Ralph Cotterill. Running time: 114 mins.
If your sense of humour runs to blow-up dolls with huge breasts and nipples that flash on and off like Christmas tree lights, then this movie is for you. Every sequence of this amazing film pushes the boundaries of bad taste in just about every direction. You will be flinching in your seats, as I did, while laughing out loud at the extraordinary adventures of Bubby as he undergoes redemption.
Set in Port Adelaide, South Australia this black comedy is certainly worth seeing. Nicholas Hope portrays the emotionally deprived Bubby, a 35 year old man who has been kept incarcerated all his life by his slatternly mother. She uses him for sex and keeps him locked inside with only a cat and cockroaches for company. Having been convinced that the air outside is poisonous, he never tries to explore outside their ghastly two-roomed slum. His father Pop returns, not knowing that Bubby existed, and soon thereafter Bubby discovers new uses for clingwrap. Emerging into the outside world, this man-child sets about finding a life.
The filmmaker Rolf de Heer uses the style of film noir beautifully expanding it to include disillusionment with society, manipulation of time and an emphasis on corruption and despair. It is an honest, raw view of the world through Bubby's innocent eyes.
9 a.m. Monday morning could never be said to be the best time for a viewing at a film festival but that's just what happened at the Venice Film Festival in August 1993. The applause in the barn-like "Palagalileo" was resounding at the end of the credits and "Bad Boy Bubby" won the hearts of the audience and votes of the judges.
Pitted against "Three Colours: Blue" and "Short Cuts", "Bad Boy Bubby" made its mark. It won the Festival's Jury Prize, the Jury Prize for the Italian Cinemagoers' Association (CIAK), shared the International Film Critics' Award (FIPRESCI) with "Short Cuts", won a Bronze Plaque from the International Catholic Organisation for Cinema and Audio-Visuals (OCIC) and last but not least won a prize from a group of Italian high school students who were guests at the screenings of the Festival.
Initially the OCIC jury was divided with one member declaring that the film was bestial and unethical and had complained to Festival management. Some judges were fascinated by its off-beat arresting themes but found it too ugly according to Peter Malone, Australia's OCIC representative on the panel. Fortunately there were some judges who argued that the breaking of new ground in theme and cinematic style and the fact that we live in a world of evil needs to be seen in films that mirror this world, won through.
The jury panel theologians referred to Psalm 130, the De Profundis psalm, "Out of the depths, I cry to you" in their description of "Bad Boy Bubby". This was indeed apt. It is a film that takes its audience into the depths of brutality and the ugliness of human experience yet it reaches out in hope of finding meaning for the experience.
Australian film makers have never been backward in coming forward, as we have seen and read and Bad Boy Bubby is not a film about froth and bubbles. This creative child of writer/director Rolf De Heer. Previous works of this graduate from the Australian Film and Television School are "Tail of a Tiger", a children's film, "Incident at Raven's Gate", a science-fiction film, and "Dingo", a young man's dreams of emulating his idol Miles Davis. De Heer has continued to stretch his creative ideas and explore the emotions of childhood, this time in the emotionally immature, adult body of Bubby.

Angel's reply is "I don't think he's anything…he's just a…kid."
This major turning point in the film reinforces the theme of childhood emotions which De Heer returns to in his films, both those made before and since "Bad Boy Bubby". The fact that "Bad Boy Bubby" was on the cards throughout De Heer's career until 1993 when the film came to fruition makes the theme understandable but continued exploitation wears very thin very quickly. It is hoped that De Heer can go beyond this theme in future films.
When asked, De Heer revealed that the film came from a ‘drifting collation of ideas' collected over a number of years of observation of people. The hard part he said was the ‘organisation into a coherent whole'. After viewing the film one could agree. Some parts are rather fractured and with a limited knowledge of film-making on board a bold statement that some scenes could be construed as fillers, bubbles to the surface. Whether this is poor editing or structural storyline weakness requires a more knowledgeable critic. De Heer did admit that the film was made from the first draft with the only changes being made as a result of casting and logistical reasons. He claimed that this led to the experience being very fulfilling for him as a writer. This remains open to opinion. Perhaps this student critic has learnt more than she gives herself credit.
With the music of Salvation Army choralists, a blues band, of bagpipes, violins and church organs throughout the film we finally hear (but don't see) the entire piece, Handel's "Largo" from "Xerxes" performed by the Adelaide Symphony Orchestra and conducted by Jose Serebrier during the last three scenes of the film completing at the end of the credit roll.
It is the music that carries the viewer out of the theatre but the story lingers on in this student's memory to no doubt be recalled time and time again down the road of life.
Submitted by Babs Londie
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


{% extends "base.html" %} {% block title %}Account Recovery — {{ service_name }}{% endblock %} {% block content %}
Enter your email address and we will send you an email to reset your password.


These howtos are for blender 2.49b.
Move the mouse cursor into the "3D View" window
Press 'A' to select everything
Press 'X' and click to confirm
Click "File" -> "Save As..." and save as "lightCycle.blend"
Remember to save throughout and to save often
Get the "View Properties" window by clicking "View" then "View Properties..."
In the "View Properties" window move the 3D cursor to location 0.0, 0.0, 0.0 by clicking the center of each coordinate number and typing 0
Make sure the the "3D View" window is in orthographic mode by clicking "View" then "Orthographic"
Press 'Spacebar'
Goto "Add" -> "Mesh" and click "Torus"
Press 'N' to reveal the "Transform Properties" window
Make sure the torus is highlighted
In the "Transform Properties" window change "ScaleZ" to 2.000
Go into edit mode by pressing 'Tab'
Rotate the torus 90 degrees by pressing 'R' then 'Y' for the axis and enter in 90
Press 'Tab' again to exit edit mode and go into object mode
Change to side view by clicking "View" then "Side"
In the "Transform Properties" window change "LocY" to -2.000
In the "Transform Properties" window change "OB" to "backWheel"
Hold 'Shift' and press 'D' to duplicate the object
Right click to return the duplicated object
Move the duplicated object by changing "LocY" to 3.000 in the "Transform Properties" window
In the "Transform Properties" window change "OB" to "frontWheel"
In the "View Properties" window move the 3D cursor to location 0.0, 0.0, 0.0
Click "Add" -> "Mesh" and click "Torus"
Go into edit mode by pressing 'Tab'
Rotate the torus 90 degrees by pressing 'R' then 'Y' for the axis and enter in 90
Press 'S' and enter in 4 to resize the torus
Hold 'Ctrl' and press tab and select "Vertices" for vertex select mode
Press 'Z' to make hidden vertices selectable
Press 'B' and drag the mouse to select vertices
Press 'X' and click "Vertices" to erase unwanted geometry to create a top shell
Right clicking can also be used to select vertices
Hold 'Ctrl' and press tab and select "Edges" for edge select mode
Hold 'Shift' and select two edges at the corner and press 'F' to create a face
Repeat for each corner of the shell
Use 'S' and 'G' to size and move the shell how you want it on top of the wheels
In the "View Properties" window move the 3D cursor to location 0.0, 0.0, 0.0
While still in edit mode click "Add" -> "Mesh" and click "Cube"
Right click select the top edges of the cube and press 'X' and click "Only Faces"
While the top edges are selected press 'S' and enter in 1.5
Hold 'Ctrl' and press 'L' to selected connected vertices Press 'S' and enter in 0.6
Hold 'Ctrl' and press tab and select "Vertices" for vertex select mode
Click "View" then "Side" to help position vertices
Use 'B' to select and position each corner how you want it under the shell
Press 'Tab' to exit edit mode and go into object mode
In the "Transform Properties" window change "OB" to "body"
In the "View Properties" window move the 3D cursor to location 0.0, 0.0, 0.0
Click "Add" -> "Mesh" and click "Circle"
In the "Add Circle" window type 16 for "Vertices", 0.7 for "Radius", and enable "Fill"
Go into edit mode by pressing 'Tab'
Rotate the circle 90 degrees by pressing 'R' then 'Y' for the axis and enter in 90
In the "Transform Properties" window change "LocY" to -2.000
Hold 'Shift' and press 'D' to duplicate the mesh
Right click to return the duplicated mesh
Move the duplicated mesh by changing "LocY" to 3.000 in the "Transform Properties" window
Hold 'Ctrl' and press tab and select "Edges" for edge select mode
Right click to highlight and use 'F' to connect the closest 4 edges of each circle
Press 'A' 1 or 2 times to have nothing selected
Use 'B' to select the 5 connected lines
Press 'W' and in the "Specials" window click "Subdivide Multi", use 3 for "Number of Cuts"
Hold 'Ctrl' and press tab and select "Vertices" for vertex select mode
Select everything except the outer edges and center vertex of each circle
Press 'W' and in the "Specials" window click "Smooth" and repeat
Press 'A' 2 times to select all
In the "Transform Properties" window change "LocX" to 0.600
Press 'E' and in the "Extrude" window click "Region"
Right click to return the duplicated mesh
In the "Transform Properties" window change "LocX" to -0.600
Hold 'Ctrl' and press tab and select "Edges" for edge select mode
Select an edge near the hubs connected to a face a wheel goes through, press 'X' and click "Edges", repeat 3 more times
Hold 'Ctrl' and press tab and select "Vertices" for vertex select mode
Select all vertices between the wheels
Press 'S' then 'X' and enter in 0.75 to resize the center of the frame
Press 'Tab' to exit edit mode and go into object mode
In the "Transform Properties" window change "OB" to "frame"
In the "View Properties" window move the 3D cursor to location 0.0, 0.0, 4.0
Click "Add" -> "Mesh" and click "Plane"
Go into edit mode by pressing 'Tab'
Rotate the circle 90 degrees by pressing 'R' then 'X' for the axis and enter in 90
Press 'Tab' to exit edit mode and go into object mode
In the "Transform Properties" window change "OB" to "sign"
Open "lightCycle.blend"
Select the "body" while in object mode
Go into edit mode by pressing 'Tab'
Press 'D' and click "Texture Solid" to differentiate the inside of faces from the outside
Press 'A' 1 or 2 times to select all
Hold 'Ctrl', press 'N' and click "Recalculate normals outside"
Repeat this process for all objects
Note: To recalculate normals inside hold 'Ctrl', 'Shift' and press 'N'
Change where it say's "Object Mode" to "Vertex Paint"
Press 'F' to enable or disable the painting mask
Press 'F9' to view paint controls in the "Buttons Window"
Press 'N' to hide or reveal the "Paint Properties"
With the painting mask enabled select a color, select what to paint and click "SetVCol"
Use 'Tab' to get in and out of edit mode for better selecting options
Change where it say's "Vertex Paint" back to "Object Mode" to switch to a different object
Note: You will need texture_to_vcol.py (a "Bake Texture to VColor" python script)
Open "lightCycle.blend"
Right click between the "3D View" and "Buttons Window" windows and click "Split Area"
Use about half the "3D View" window and change the window on the right to "UV/Image Editor"
Make sure normals are flipped the right way first
Press 'D' and click "OpenGL Solid"
Select the "body" while in object mode
Go into edit mode by pressing 'Tab'
Press 'A' 1 or 2 times to select all
Press 'F9' and in "Link and Materials" click "Set Smoot"
Repeat for all objects
Press 'D' and click "Textured Solid"
Select the "body" while in object mode
Go into edit mode by pressing 'Tab'
Press 'A' 1 or 2 times to select all
Press 'U' and click "Unwrap"
In the "UV/Image Editor" window click "Image" -> "New..." then "OK"
Click "Image" -> "Texture Painting"
Click "View" -> "Paint Tool..."
In the "3D View" press 'Tab' then 'V' to get to vertex paint mode
Click "Paint" -> "Bake Texture to VColor..." (a python script)
In the "3D View" press 'V' then 'Tab' to get to edit mode
In the "UV/Image Editor" click the "X" next to the datablock name
In the "3D View" press 'Tab' to get back to object mode
Press 'D' and click "Textured Solid"
Select the "body" while in object mode
Go into edit mode by pressing 'Tab'
Press 'A' 1 or 2 times to select all
Press 'U' and click "Unwrap"
Sometimes "Lightmap UVPack" might be a better choice
If using "Lightmap UVPack" choose 48 for "Pack Quality" and 1.000 for "Margin"
In the "UV/Image Editor" window click "Image" -> "New..." then "OK"
Press 'Tab' for object mode
Click "Add" -> "Lamp" and click "Lamp"
Move the lamp where ever you want it
Press 'F5' while the lamp is selected
In the shading panel change the type, color, and energy how you want
Use as many lamps as you need
Press 'F10' and click the "Bake" tab
Select the "body" in the "3D View" window
With "Full Render" selected click "BAKE"
In the "3D View" press 'V' to get to vertex paint mode
Click "Paint" -> "Bake Texture to VColor..." (a python script)
In the "3D View" press 'V' then 'Tab' to get to edit mode
In the "UV/Image Editor" click the "X" next to the datablock name
In the "3D View" press 'Tab' to get back to object mode
Open "lightCycle.blend"
Right click between the "3D View" and "Buttons Window" windows and click "Split Area"
Use about half the "3D View" window and change the window on the right to "UV/Image Editor"
Select the "sign" while in object mode
Hold 'Shift' and press 'D' to duplicate the object
Place the object where it can be easily distinguished from the other objects
Duplicate the "sign" object 3 more times
Press 'D' and click "Textured Solid"
Select the "body" while in object mode
Go into edit mode by pressing 'Tab'
Press 'A' 1 or 2 times to select all
Press 'U' and click "Unwrap"
In the "UV/Image Editor" window click "Image" -> "Open..."
Locate "cityGlare.bmp" in the texture folder
Press 'B' to select and use 'S' and 'G' to size and move the outline how you want over the texture
Repeat this process for the "frame" object
Add "green.bmp" to the "sign" object
Add "noise1.bmp" to the "sign.001" object
Add "noise2.bmp" to the "sign.002" object
Add "noise3.bmp" to the "sign.003" object
Add "red.bmp" to the "sign.004" object
In the "UV/Image Editor" window click "Image" -> "Consolidate into one image"
Use 512 for "Pixel Size"
Use 2 for "Pixel Margin"
Click "All Sel Objects" and "OK"
In the "UV/Image Editor" window click "Image" -> "Save As..."
Save image as "lightCycle.bmp" make sure to choose the "BMP" option
In the "UV/Image Editor" window click "Image" -> "Replace..." and choose "lightCycle.bmp"
Using "lightCycle.bmp" as a template, open it with an image editor
Anything painted with black is hidden
Anything painted with white is visible
Save as "lightCycleMask.bmp"
Note: You will need c_exportTex.py and c_importTex.py
Open "lightCycle.blend"
Goto "File" -> "Export" -> "C code tex (.c)..."
Goto "File" -> "Import" -> "C code tex (.c)..."
Choose a compatible c file


Present: Provost Parrish, AVP Serrano, Chief of Staff Wallace; Professor's Cumiskey, Milligan, Sanchez, Verzani; Higher Education Officer DeMeglio
https://csi-covid19.github.io/CUNY/6-9-FY2020.pdf
As for CSI, our projected year end balance is 19K; heading into the year our balance was 13k. The expenditures and resources are essentially the same.
The projected revenue over tuition target is -1.8M, a bit better than our mid-year position; better than last year's ending position (though there was a signifcant adjustment to this year's target so that comparison is not a straight comparison.) The college was on track to make a dent in this, as collections had improved as of February. It was noted that some campuses (notably KBCC) had a huge negative change in this category post March.
we heard non-tax levy resources are severely challenged, though no numbers were discussed (Auxiliary,
...)
We don't know if there is any unencumbered OTPS; close out isn't completed until September, typically.
The June 30 end of budget year means trying to get purchases done and delivered by that date.
Historically, the college would be notified of its initial allocation by the end of June.
At CUNY's Admin Council there was notice that there is currently no allocation numbers known. These will likely be known the 1st or 2nd week of July
(NYS may make another adjustment to its revenue projections by June 30th. At the last opportunity, end of April, the April 1 budget was to be modified by ~10B for state agencies. Presumably, CUNY is waiting for that decision. Meanwhile, the state is waiting the outcome of the HEROS act, which promises 35B for the state...)
While at one point, colleges were alerted to prepare for a 10% reduction, it is currently working on a contingency of a 3% reduction.
We reviewed several reductions (real and possible)
The campus based allocation is ~110M
While campus based expenditures would typically go up 5%, the initial NYS budget for CUNY showed only a ~2% increase, pending a tuition increase (this is a 3% reduction). (The reserve was used to pay prioir year's contractual increases, but going forward this must come from the campus-based resources.)
the tuition increase may not pass the board. This is roughly a 2% reduction
the state budget may ask for 10% reductions,
the enrollment picture appears to be heded to a 5% reduction, Every 1.25% drop is about a 1% reduction in campus based resources; so that would be a ~4% reduction
The cares act brought students at CSI ~6.3M (mostly allocated)
The CARES act brings CSI ~ 6.3M for covid related expenses (response to and planning for). This money has not come to campus; There is an addition 900k, with similar restrictions, coming as we are a hispanic serving institution.
It was suggested that some of this money could pay for creative teaching (the equivalent of having TAs in large lectures).
It is uncertain how fungible these funds will prove to be
There was a sentiment expressed that FEMA funds may be more certain
There was a chicken-and-egg problem mentioned: we don't have funds to spend so that we can get reimbursed
To that, the question of whether endowment funds could be used for purchases was raised. In general these funds have restrictions on the amount spent per year so that the capital is preserved (e.g., CUNY's investment fund lowered their cap recently to 3.75%, down from 4.25%). The specific details of the case of the 7M Business School endowment were not discussed.
the college has asked departments to submit logs on expenses, and use special codes for CUNY First
In response to a question about the cost of delays, we heard:
work with subcommittees to track quantities
CARES money is one-shot money
figure out how to leverage it
can't afford everything
gather supplies, materials and phase it
IT/Facilities investments
can we sustain: Example: if we have to provide face masks for 1200 people, 1 per day, for one semester this is around 100k
We heard that the following was shared with P&B: contingency plans for bad scenarios include 3M reduction in the CA budget. (Emphasize, this is part of a plan and may not come to pass). (3M in CAs is about 200 1020-hour lines).
It was pointed out that P&B is not a wide enough venue for this discussionn.
It was noted that several creative ideas could be discussed, but aren't being due to the forums for dscussion (an emphasis on the P&B).