SlideShare a Scribd company logo
1 of 53
Download to read offline
BPjs Deep Dive 2019
4/4/2019, BGU
BPjs is
An extensible engine for
running and for analyzing
behavioral programs
Intended to be our industrial quality BP platform
BPjs is
An extensible engine for
running and for analyzing
behavioral programs
Intended to be our industrial quality BP platform
(...until something better is created)
James Birnie, ThoughtWorks
I tried to imagine as I was watching the demo how I could
have written the same program using techniques that I'm
most familiar with. Which probably means some kind of C#,
OOP based, implementation.


Whichever way I thought about it, I couldn't imagine a more
succinct, elegant version than that which was
demonstrated. As ever with succinct code I do wonder how
easy it would be to read by others without the (excellent)
explanation of what was going on.
http://www.jamesbirnie.com/2018/11/devoxx-belgium-and-two-talks.html
Using BPjs
• Command-line

For testing and experimenting with BP

• Maven

For maven-based JVM projects

• Uber-Jar

Has all the dependencies, may cause class duplication

• Jar

Just BPjs, but bring your own Rhino
https://github.com/bThink-BGU/BPjs
Command-line
• Download BPjs uber-jar
java -jar BPjs-0.10.3.uber.jar file1 file2 file3
java -jar BPjs-0.10.3.uber.jar file1 - file2
stdin
Maven (+Similar)
<dependencies>


...


<dependency>


<groupId>com.github.bthink-bgu</groupId>


<artifactId>BPjs</artifactId>

<version>0.10.3</version>


</dependency>


...


</dependencies>
• Preferred way for embedding in Java/JVM applications

• Stored at Maven Central
Jar/Uber-Jar
• Bring into class path

• Useful for using modi
fi
ed versions of BPjs

• (not recommended)
Application Lifecycle
BP CycleBPjs Program Start
Event
Selected
Synchronization
Point
B-threads
Arbiter
Event Selection Strategy
x✔/✘
B-Program
Start
B-thread
Registration
B-threads
.JS
start
x
bp.registerBThread(…)
Application Lifecycle
BP CycleBPjs Program Start
Event
Selected
Synchronization
Point
B-threads
Arbiter
Event Selection Strategy
x✔/✘
B-Program
Start
B-thread
Registration
B-threads
.JS
start
x
bp.registerBThread(…)
1
Application Lifecycle
BP CycleBPjs Program Start
Event
Selected
Synchronization
Point
B-threads
Arbiter
Event Selection Strategy
x✔/✘
B-Program
Start
B-thread
Registration
B-threads
.JS
start
x
bp.registerBThread(…)
1
2
Application Lifecycle
BP CycleBPjs Program Start
Event
Selected
Synchronization
Point
B-threads
Arbiter
Event Selection Strategy
x✔/✘
B-Program
Start
B-thread
Registration
B-threads
.JS
start
x
bp.registerBThread(…)
1
2 3
Application Lifecycle
BP CycleBPjs Program Start
Event
Selected
Synchronization
Point
B-threads
Arbiter
Event Selection Strategy
x✔/✘
B-Program
Start
B-thread
Registration
B-threads
.JS
start
x
bp.registerBThread(…)
1
2 3 4
Application Lifecycle
BP CycleBPjs Program Start
Event
Selected
Synchronization
Point
B-threads
Arbiter
Event Selection Strategy
x✔/✘
B-Program
Start
B-thread
Registration
B-threads
.JS
start
x
bp.registerBThread(…)
1
2 3 4
∞
bpjs
model
executionanalysis
started()
violationFound(Violation)
ended()
«abstract»
ProgressListener verify()
DfsBProgramVerifier
violation
VerificationResult
bthreadSnapshots
externalEvents
«serializable»
BProgramSyncSnapshot
prependCode(c)
appendCode(c)
externalEventQueue
globalScope
BProgram
selectableEvents(BProgamSyncSnapshot)
select(BProgamSyncSnapshot)
«abstract»
EventSelectionStrategyname:String
data:Object
BEvent
«waitFor»
«block»
start()
BProgramRunner
started(…)
eventSelected(e, …)
ended(…)
«abstract»
BProgramRunnerListener
isVisited(Node):Boolean
store(Node)
«abstract»
VisitedNodeStore
«produces»
inspectTrace( ExecutionTrace )
«abstract»
ExecutionTraceInspection
counterExample
«abstract»
Violation
Rhino continuation
synchronizationStatement
«serializable»
BThreadSyncSnapshot
request
waitFor
block
SyncStatement
1..*
contains(BEvent)
«abstract»
EventSet
1
nodes
ExecutionTrace
«produces»
«request»
1 1..* 1
0..*
1
1..*
2
No BThread class
• BThreads are emergent phenomenon of progression
between BThreadSyncSnaphots
BTSS BTSS BTSS BTSSStartBThread ResumeBThread ResumeBThread
ResumeBThread
BTSSBTSSBTSS
BTSS
ResumeBThreadResumeBThreadResumeBThread
Resume
bpjs
model
executionanalysis
started()
violationFound(Violation)
ended()
«abstract»
ProgressListener verify()
DfsBProgramVerifier
violation
VerificationResult
bthreadSnapshots
externalEvents
«serializable»
BProgramSyncSnapshot
prependCode(c)
appendCode(c)
externalEventQueue
globalScope
BProgram
selectableEvents(BProgamSyncSnapshot)
select(BProgamSyncSnapshot)
«abstract»
EventSelectionStrategyname:String
data:Object
BEvent
«waitFor»
«block»
start()
BProgramRunner
started(…)
eventSelected(e, …)
ended(…)
«abstract»
BProgramRunnerListener
Execution Host
isVisited(Node):Boolean
store(Node)
«abstract»
VisitedNodeStore
«produces»
inspectTrace( ExecutionTrace )
«abstract»
ExecutionTraceInspection
counterExample
«abstract»
Violation
Rhino continuation
synchronizationStatement
«serializable»
BThreadSyncSnapshot
request
waitFor
block
SyncStatement
1..*
contains(BEvent)
«abstract»
EventSet
1
nodes
ExecutionTrace
«produces»
«request»
1 1..* 1
0..*
1
1..*
Listener
«creates»
Verification Host
Listener
«creates»
2
VisualRunningExamples
• Sample BPjs application

• MDE

• Contains examples for
execution and veri
fi
cation
VisualRunningExamples
• Sample BPjs application

• MDE

• Contains examples for
execution and veri
fi
cation
VisualRunningExamples
• Sample BPjs application

• MDE

• Contains examples for
execution and veri
fi
cation
Model Driven Engineering
B-Program
(model)
B-Program Runner
Event Selection
Strategy
Input
Output
Long running processes
"Mainstream" System
Model Driven Engineering
B-Program
(model)
B-Program Runner
Event Selection
StrategyComplex, but
veri
fi
able.
Input
Output
Long running processes
"Mainstream" System
Model Driven Engineering
B-Program
(model)
B-Program Runner
Event Selection
Strategy
Simple
Complex, but
veri
fi
able.
Input
Output
Long running processes
"Mainstream" System
Parsing into B-Threads - Code
function parseMaze(mazeLines) {


for ( var row=0; row<mazeLines.length; row++ ) {


for ( var col=0; col<mazeLines[row].length; col++ ) {


var currentPixel =
mazeLines[row].substring(col,col+1);


if ( currentPixel===" " ||


currentPixel==="t" ||


currentPixel==="s" ) {


addSpaceCell(col, row);


if ( currentPixel==="t" ) {


addTargetCell(col, row);


} else if ( currentPixel==="s" ) {


addStartCell(col, row);


}


}


}


}


}
Parsing into B-Threads - Code
function parseMaze(mazeLines) {


for ( var row=0; row<mazeLines.length; row++ ) {


for ( var col=0; col<mazeLines[row].length; col++ ) {


var currentPixel =
mazeLines[row].substring(col,col+1);


if ( currentPixel===" " ||


currentPixel==="t" ||


currentPixel==="s" ) {


addSpaceCell(col, row);


if ( currentPixel==="t" ) {


addTargetCell(col, row);


} else if ( currentPixel==="s" ) {


addStartCell(col, row);


}


}


}


}


}
Parsing into B-Threads - Code
function parseMaze(mazeLines) {


for ( var row=0; row<mazeLines.length; row++ ) {


for ( var col=0; col<mazeLines[row].length; col++ ) {


var currentPixel =
mazeLines[row].substring(col,col+1);


if ( currentPixel===" " ||


currentPixel==="t" ||


currentPixel==="s" ) {


addSpaceCell(col, row);


if ( currentPixel==="t" ) {


addTargetCell(col, row);


} else if ( currentPixel==="s" ) {


addStartCell(col, row);


}


}


}


}


}
Parsing into B-Threads - Code
function parseMaze(mazeLines) {


for ( var row=0; row<mazeLines.length; row++ ) {


for ( var col=0; col<mazeLines[row].length; col++ ) {


var currentPixel =
mazeLines[row].substring(col,col+1);


if ( currentPixel===" " ||


currentPixel==="t" ||


currentPixel==="s" ) {


addSpaceCell(col, row);


if ( currentPixel==="t" ) {


addTargetCell(col, row);


} else if ( currentPixel==="s" ) {


addStartCell(col, row);


}


}


}


}


}
Parsing into B-Threads - Code
"Di
ff
erent types of cells have di
ff
erent behaviors"
function parseMaze(mazeLines) {


for ( var row=0; row<mazeLines.length; row++ ) {


for ( var col=0; col<mazeLines[row].length; col++ ) {


var currentPixel =
mazeLines[row].substring(col,col+1);


if ( currentPixel===" " ||


currentPixel==="t" ||


currentPixel==="s" ) {


addSpaceCell(col, row);


if ( currentPixel==="t" ) {


addTargetCell(col, row);


} else if ( currentPixel==="s" ) {


addStartCell(col, row);


}


}


}


}


}
Behaviors for a Space Cell
function addSpaceCell( col, row ) {


bp.registerBThread("cell(c:"+col+" r:"+row+")",


function() {

while ( true ) {


bp.sync({waitFor:adjacentCellEntries(col, row)});


bp.sync({


request: enterEvent(col, row),


waitFor: anyEntrance


});


}


}


);


}
[" # t ",


"## ## ###",


" ",


"### #### ",


" s# "];
Behaviors for a Space Cell
function addSpaceCell( col, row ) {


bp.registerBThread("cell(c:"+col+" r:"+row+")",


function() {

while ( true ) {


bp.sync({waitFor:adjacentCellEntries(col, row)});


bp.sync({


request: enterEvent(col, row),


waitFor: anyEntrance


});


}


}


);


}
[" # t ",


"## ## ###",


" ",


"### #### ",


" s# "];
Behaviors for a Space Cell
function addSpaceCell( col, row ) {


bp.registerBThread("cell(c:"+col+" r:"+row+")",


function() {

while ( true ) {


bp.sync({waitFor:adjacentCellEntries(col, row)});


bp.sync({


request: enterEvent(col, row),


waitFor: anyEntrance


});


}


}


);


}
[" # t ",


"## ## ###",


" ",


"### #### ",


" s# "];
Behaviors for a Target Cell
[" # t ",


"## ## ###",


" ",


"### #### ",


" s# "]
+function addTargetCell(col, row) {


bp.registerBThread("Target(c:"+col+" r:"+row+")", function(){


bp.sync({


waitFor: enterEvent(col, row)


});




bp.sync({


request: TARGET_FOUND,


block: bp.allExcept( TARGET_FOUND )


});


});


}


function addSpaceCell( col, row ) {...}
Behaviors for a Target Cell
[" # t ",


"## ## ###",


" ",


"### #### ",


" s# "]
+function addTargetCell(col, row) {


bp.registerBThread("Target(c:"+col+" r:"+row+")", function(){


bp.sync({


waitFor: enterEvent(col, row)


});




bp.sync({


request: TARGET_FOUND,


block: bp.allExcept( TARGET_FOUND )


});


});


}


function addSpaceCell( col, row ) {...}
Behaviors for a Target Cell
[" # t ",


"## ## ###",


" ",


"### #### ",


" s# "]
+function addTargetCell(col, row) {


bp.registerBThread("Target(c:"+col+" r:"+row+")", function(){


bp.sync({


waitFor: enterEvent(col, row)


});




bp.sync({


request: TARGET_FOUND,


block: bp.allExcept( TARGET_FOUND )


});


});


}


function addSpaceCell( col, row ) {...}
Behaviors for a Target Cell
[" # t ",


"## ## ###",


" ",


"### #### ",


" s# "]
+function addTargetCell(col, row) {


bp.registerBThread("Target(c:"+col+" r:"+row+")", function(){


bp.sync({


waitFor: enterEvent(col, row)


});




bp.sync({


request: TARGET_FOUND,


block: bp.allExcept( TARGET_FOUND )


});


});


}


function addSpaceCell( col, row ) {...}
Behaviors for a Start Cell
[" # t ",


"## ## ###",


" ",


"### #### ",


" s# "]
+
function addSpaceCell( col, row ) {...}
function addStartCell(col, row) {


bp.registerBThread("starter(c:"+col+" r:"+row+")",
function() {


bp.sync({


request:enterEvent(col,row)


});


});


}
Behaviors for a Start Cell
[" # t ",


"## ## ###",


" ",


"### #### ",


" s# "]
+
function addSpaceCell( col, row ) {...}
function addStartCell(col, row) {


bp.registerBThread("starter(c:"+col+" r:"+row+")",
function() {


bp.sync({


request:enterEvent(col,row)


});


});


}
Behaviors for a Start Cell
[" # t ",


"## ## ###",


" ",


"### #### ",


" s# "]
+
function addSpaceCell( col, row ) {...}
function addStartCell(col, row) {


bp.registerBThread("starter(c:"+col+" r:"+row+")",
function() {


bp.sync({


request:enterEvent(col,row)


});


});


}
Behaviors for a Start Cell
[" # t ",


"## ## ###",


" ",


"### #### ",


" s# "]
+
function addSpaceCell( col, row ) {...}
function addStartCell(col, row) {


bp.registerBThread("starter(c:"+col+" r:"+row+")",
function() {


bp.sync({


request:enterEvent(col,row)


});


});


}
Execution
private void runBprogram() {


// UI stuff


setInProgress(true);


//...




// Setup the b-program from the source


BProgram bprog = new StringBProgram(programEditor.getText());


bprog.setWaitForExternalEvents( true );


bprogramRunner = new BProgramRunner(bprog);




// add the maze


String mazeJs = mazeTableModel.getRows().stream()...


bprog.prependSource(mazeJs);


bprogramRunner.addListener(new BProgramRunnerListenerImpl(this));




// set pausing ESS


PausingEventSelectionStrategyDecorator pausingESS =


new PausingEventSelectionStrategyDecorator(


new SimpleEventSelectionStrategy());


bprog.setEventSelectionStrategy(pausingESS);




pausingESS.setListener( pess -> {
bprog.prependSource(mazeJs);


bprogramRunner.addListener(new BProgramRunnerListenerImpl(this));




// set pausing ESS


PausingEventSelectionStrategyDecorator pausingESS =


new PausingEventSelectionStrategyDecorator(


new SimpleEventSelectionStrategy());


bprog.setEventSelectionStrategy(pausingESS);




pausingESS.setListener( pess -> {


try {


Thread.sleep(150);


pess.unpause();


} catch (InterruptedException ex) {


System.err.println("Interrupted during event pause");


}


});




// go!


new Thread(()->{


try{


bprogramRunner.run();


} catch ( Exception e ) {


e.printStackTrace(System.out);


addToLog(e.getMessage());


setInProgress(false);


}


}).start();


}
class BProgramRunnerListenerImpl implements BProgramRunnerListener {




private final MainWindowCtrl mwCtrl;


public BProgramRunnerListenerImpl(final MainWindowCtrl mwCtrl) {


this.mwCtrl = mwCtrl;


}


@Override


public void starting(BProgram bprog) {


mwCtrl.addToLog("Starting...");


}


@Override


public void eventSelected(BProgram bp, BEvent theEvent) {


SwingUtilities.invokeLater(() -> {


String eventName = theEvent.getName();


if (eventName.startsWith("Enter")) {


String[] comps = eventName.substring(7).split(",");


comps[1] = comps[1].replace(")", "");


mwCtrl.mazeTableModel.addCellEntry(...);


}


mwCtrl.addToLog("Event: " + theEvent.toString());


});


}


}
Verifi cation
private void verifyBProgram() {


setInProgress(true);


stopBtn.setEnabled(false);




BProgram bprog = new StringBProgram(programEditor.getText() );




// add the maze


String mazeJs = mazeTableModel.getRows().stream()...collect(...);


bprog.prependSource(mazeJs);



// Mix in the assumptions and requirements


bprog.appendSource(additionsEditor.getText());




DfsBProgramVerifier vfr = new DfsBProgramVerifier();


vfr.setIterationCountGap(100);




vfr.addInspection( ExecutionTraceInspections.FAILED_ASSERTIONS );


vfr.addInspection( ExecutionTraceInspections.HOT_BPROGRAM_CYCLES );




vfr.setProgressListener( new DfsBProgramVerifier.ProgressListener() {


@Override


public void started(DfsBProgramVerifier v) {


addToLog("Verification started");


}


@Override
vfr.addInspection( ExecutionTraceInspections.HOT_BPROGRAM_CYCLES );



vfr.setProgressListener( new DfsBProgramVerifier.ProgressListener() {


@Override


public void started(DfsBProgramVerifier v) {


addToLog("Verification started");


}


@Override


public void iterationCount(long count, long statesHit, DfsBProgramVerifier v){


addToLog(" ~ "+count+" iterations, "+statesHit+" states visited.");


}


@Override


public void maxTraceLengthHit(List<DfsTraversalNode> trace,


DfsBProgramVerifier v) {


addToLog(" (max trace length hit)");


}


@Override


public void done(DfsBProgramVerifier v) {


addToLog("Verification done");

setInProgress(false);


}


@Override


public boolean violationFound(Violation aViolation, DfsBProgramVerifier vfr) {


return false; // do not continue searching,

}


});




logModel.clear();


mazeTableModel.resetCellEntries();
addToLog("Verification done");


setInProgress(false);


}

@Override


public boolean violationFound(Violation aViolation, DfsBProgramVerifier vfr) {


return false; // do not continue searching,


}


});




logModel.clear();

mazeTableModel.resetCellEntries();




// go!


new Thread(()->{


try{


VerificationResult res = vfr.verify(bprog);


SwingUtilities.invokeLater(()->setVerificationResult(res));


} catch ( Exception e ) {


e.printStackTrace(System.out);


addToLog(e.getMessage());


setInProgress(false);


}


}).start();




}
bp.registerBThread("round", function(){


while( true ) {


bp.sync({request:bp.Event("A")});


bp.sync({waitFor:[bp.Event("B1"),


bp.Event("B2")]});


bp.sync({request:bp.Event("C")});


}


});


bp.registerBThread("round-s1", function(){


while( true ) {


bp.sync({waitFor:bp.Event("A")});


bp.sync({request:bp.Event("B1"),
waitFor:bp.Event("B2")});


}


});


bp.registerBThread("round-s2", function(){

while( true ) {


bp.sync({waitFor:bp.Event("A")});


bp.sync({request:bp.Event("B2"),
waitFor:bp.Event("B1")});


}


});


round.js
start
ff55dba7
3281e80f
A
6ac289d7
B1 B2
C
bpjs
model
executionanalysis
started()
violationFound(Violation)
ended()
«abstract»
ProgressListener verify()
DfsBProgramVerifier
violation
VerificationResult
bthreadSnapshots
externalEvents
«serializable»
BProgramSyncSnapshot
prependCode(c)
appendCode(c)
externalEventQueue
globalScope
BProgram
selectableEvents(BProgamSyncSnapshot)
select(BProgamSyncSnapshot)
«abstract»
EventSelectionStrategyname:String
data:Object
BEvent
«waitFor»
«block»
start()
BProgramRunner
started(…)
eventSelected(e, …)
ended(…)
«abstract»
BProgramRunnerListener
isVisited(Node):Boolean
store(Node)
«abstract»
VisitedNodeStore
«produces»
inspectTrace( ExecutionTrace )
«abstract»
ExecutionTraceInspection
counterExample
«abstract»
Violation
Rhino continuation
synchronizationStatement
«serializable»
BThreadSyncSnapshot
request
waitFor
block
SyncStatement
1..*
contains(BEvent)
«abstract»
EventSet
1
nodes
ExecutionTrace
«produces»
«request»
1 1..* 1
0..*
1
1..*
2

More Related Content

What's hot

Windbg랑 친해지기
Windbg랑 친해지기Windbg랑 친해지기
Windbg랑 친해지기Ji Hun Kim
 
Building Your First Data Science Applicatino in MongoDB
Building Your First Data Science Applicatino in MongoDBBuilding Your First Data Science Applicatino in MongoDB
Building Your First Data Science Applicatino in MongoDBMongoDB
 
C++ How I learned to stop worrying and love metaprogramming
C++ How I learned to stop worrying and love metaprogrammingC++ How I learned to stop worrying and love metaprogramming
C++ How I learned to stop worrying and love metaprogrammingcppfrug
 
clWrap: Nonsense free control of your GPU
clWrap: Nonsense free control of your GPUclWrap: Nonsense free control of your GPU
clWrap: Nonsense free control of your GPUJohn Colvin
 
Going On with the Check of Geant4
Going On with the Check of Geant4Going On with the Check of Geant4
Going On with the Check of Geant4Andrey Karpov
 
Работа с реляционными базами данных в C++
Работа с реляционными базами данных в C++Работа с реляционными базами данных в C++
Работа с реляционными базами данных в C++corehard_by
 
Skiron - Experiments in CPU Design in D
Skiron - Experiments in CPU Design in DSkiron - Experiments in CPU Design in D
Skiron - Experiments in CPU Design in DMithun Hunsur
 
Checking the Source SDK Project
Checking the Source SDK ProjectChecking the Source SDK Project
Checking the Source SDK ProjectAndrey Karpov
 
Waiting for the Linux-version: Checking the Code of Inkscape Graphics Editor
Waiting for the Linux-version: Checking the Code of Inkscape Graphics EditorWaiting for the Linux-version: Checking the Code of Inkscape Graphics Editor
Waiting for the Linux-version: Checking the Code of Inkscape Graphics EditorPVS-Studio
 
Re-analysis of Umbraco code
Re-analysis of Umbraco codeRe-analysis of Umbraco code
Re-analysis of Umbraco codePVS-Studio
 
C++ amp on linux
C++ amp on linuxC++ amp on linux
C++ amp on linuxMiller Lee
 
The CppCat Analyzer Checks TortoiseGit
The CppCat Analyzer Checks TortoiseGitThe CppCat Analyzer Checks TortoiseGit
The CppCat Analyzer Checks TortoiseGitAndrey Karpov
 
[263] s2graph large-scale-graph-database-with-hbase-2
[263] s2graph large-scale-graph-database-with-hbase-2[263] s2graph large-scale-graph-database-with-hbase-2
[263] s2graph large-scale-graph-database-with-hbase-2NAVER D2
 
Facebook Glow Compiler のソースコードをグダグダ語る会
Facebook Glow Compiler のソースコードをグダグダ語る会Facebook Glow Compiler のソースコードをグダグダ語る会
Facebook Glow Compiler のソースコードをグダグダ語る会Mr. Vengineer
 
Picking Mushrooms after Cppcheck
Picking Mushrooms after CppcheckPicking Mushrooms after Cppcheck
Picking Mushrooms after CppcheckAndrey Karpov
 
.gradle 파일 정독해보기
.gradle 파일 정독해보기.gradle 파일 정독해보기
.gradle 파일 정독해보기경주 전
 
Reversing the dropbox client on windows
Reversing the dropbox client on windowsReversing the dropbox client on windows
Reversing the dropbox client on windowsextremecoders
 
200 Open Source Projects Later: Source Code Static Analysis Experience
200 Open Source Projects Later: Source Code Static Analysis Experience200 Open Source Projects Later: Source Code Static Analysis Experience
200 Open Source Projects Later: Source Code Static Analysis ExperienceAndrey Karpov
 

What's hot (20)

Windbg랑 친해지기
Windbg랑 친해지기Windbg랑 친해지기
Windbg랑 친해지기
 
Building Your First Data Science Applicatino in MongoDB
Building Your First Data Science Applicatino in MongoDBBuilding Your First Data Science Applicatino in MongoDB
Building Your First Data Science Applicatino in MongoDB
 
C++ How I learned to stop worrying and love metaprogramming
C++ How I learned to stop worrying and love metaprogrammingC++ How I learned to stop worrying and love metaprogramming
C++ How I learned to stop worrying and love metaprogramming
 
TVM VTA (TSIM)
TVM VTA (TSIM) TVM VTA (TSIM)
TVM VTA (TSIM)
 
clWrap: Nonsense free control of your GPU
clWrap: Nonsense free control of your GPUclWrap: Nonsense free control of your GPU
clWrap: Nonsense free control of your GPU
 
Going On with the Check of Geant4
Going On with the Check of Geant4Going On with the Check of Geant4
Going On with the Check of Geant4
 
Работа с реляционными базами данных в C++
Работа с реляционными базами данных в C++Работа с реляционными базами данных в C++
Работа с реляционными базами данных в C++
 
Skiron - Experiments in CPU Design in D
Skiron - Experiments in CPU Design in DSkiron - Experiments in CPU Design in D
Skiron - Experiments in CPU Design in D
 
Checking the Source SDK Project
Checking the Source SDK ProjectChecking the Source SDK Project
Checking the Source SDK Project
 
Return of c++
Return of c++Return of c++
Return of c++
 
Waiting for the Linux-version: Checking the Code of Inkscape Graphics Editor
Waiting for the Linux-version: Checking the Code of Inkscape Graphics EditorWaiting for the Linux-version: Checking the Code of Inkscape Graphics Editor
Waiting for the Linux-version: Checking the Code of Inkscape Graphics Editor
 
Re-analysis of Umbraco code
Re-analysis of Umbraco codeRe-analysis of Umbraco code
Re-analysis of Umbraco code
 
C++ amp on linux
C++ amp on linuxC++ amp on linux
C++ amp on linux
 
The CppCat Analyzer Checks TortoiseGit
The CppCat Analyzer Checks TortoiseGitThe CppCat Analyzer Checks TortoiseGit
The CppCat Analyzer Checks TortoiseGit
 
[263] s2graph large-scale-graph-database-with-hbase-2
[263] s2graph large-scale-graph-database-with-hbase-2[263] s2graph large-scale-graph-database-with-hbase-2
[263] s2graph large-scale-graph-database-with-hbase-2
 
Facebook Glow Compiler のソースコードをグダグダ語る会
Facebook Glow Compiler のソースコードをグダグダ語る会Facebook Glow Compiler のソースコードをグダグダ語る会
Facebook Glow Compiler のソースコードをグダグダ語る会
 
Picking Mushrooms after Cppcheck
Picking Mushrooms after CppcheckPicking Mushrooms after Cppcheck
Picking Mushrooms after Cppcheck
 
.gradle 파일 정독해보기
.gradle 파일 정독해보기.gradle 파일 정독해보기
.gradle 파일 정독해보기
 
Reversing the dropbox client on windows
Reversing the dropbox client on windowsReversing the dropbox client on windows
Reversing the dropbox client on windows
 
200 Open Source Projects Later: Source Code Static Analysis Experience
200 Open Source Projects Later: Source Code Static Analysis Experience200 Open Source Projects Later: Source Code Static Analysis Experience
200 Open Source Projects Later: Source Code Static Analysis Experience
 

Similar to BPjs deep dive 2019

Presentation of Python, Django, DockerStack
Presentation of Python, Django, DockerStackPresentation of Python, Django, DockerStack
Presentation of Python, Django, DockerStackDavid Sanchez
 
A la découverte de TypeScript
A la découverte de TypeScriptA la découverte de TypeScript
A la découverte de TypeScriptDenis Voituron
 
PyData Berlin Meetup
PyData Berlin MeetupPyData Berlin Meetup
PyData Berlin MeetupSteffen Wenz
 
CoffeeScript Design Patterns
CoffeeScript Design PatternsCoffeeScript Design Patterns
CoffeeScript Design PatternsTrevorBurnham
 
Programming with Python and PostgreSQL
Programming with Python and PostgreSQLProgramming with Python and PostgreSQL
Programming with Python and PostgreSQLPeter Eisentraut
 
Wprowadzenie do technologii Big Data / Intro to Big Data Ecosystem
Wprowadzenie do technologii Big Data / Intro to Big Data EcosystemWprowadzenie do technologii Big Data / Intro to Big Data Ecosystem
Wprowadzenie do technologii Big Data / Intro to Big Data EcosystemSages
 
Javascript Everywhere
Javascript EverywhereJavascript Everywhere
Javascript EverywherePascal Rettig
 
Node.js - async for the rest of us.
Node.js - async for the rest of us.Node.js - async for the rest of us.
Node.js - async for the rest of us.Mike Brevoort
 
Browsers with Wings
Browsers with WingsBrowsers with Wings
Browsers with WingsRemy Sharp
 
mobl presentation @ IHomer
mobl presentation @ IHomermobl presentation @ IHomer
mobl presentation @ IHomerzefhemel
 
Is HTML5 Ready? (workshop)
Is HTML5 Ready? (workshop)Is HTML5 Ready? (workshop)
Is HTML5 Ready? (workshop)Remy Sharp
 
Is html5-ready-workshop-110727181512-phpapp02
Is html5-ready-workshop-110727181512-phpapp02Is html5-ready-workshop-110727181512-phpapp02
Is html5-ready-workshop-110727181512-phpapp02PL dream
 
BlockChain implementation by python
BlockChain implementation by pythonBlockChain implementation by python
BlockChain implementation by pythonwonyong hwang
 
Clojure: Simple By Design
Clojure: Simple By DesignClojure: Simple By Design
Clojure: Simple By DesignAll Things Open
 
Designing REST API automation tests in Kotlin
Designing REST API automation tests in KotlinDesigning REST API automation tests in Kotlin
Designing REST API automation tests in KotlinDmitriy Sobko
 
Azure for SharePoint Developers - Workshop - Part 2: Azure Functions
Azure for SharePoint Developers - Workshop - Part 2: Azure FunctionsAzure for SharePoint Developers - Workshop - Part 2: Azure Functions
Azure for SharePoint Developers - Workshop - Part 2: Azure FunctionsBob German
 
PVS-Studio for Linux (CoreHard presentation)
PVS-Studio for Linux (CoreHard presentation)PVS-Studio for Linux (CoreHard presentation)
PVS-Studio for Linux (CoreHard presentation)Andrey Karpov
 
Snickers: Open Source HTTP API for Media Encoding
Snickers: Open Source HTTP API for Media EncodingSnickers: Open Source HTTP API for Media Encoding
Snickers: Open Source HTTP API for Media EncodingFlávio Ribeiro
 

Similar to BPjs deep dive 2019 (20)

Presentation of Python, Django, DockerStack
Presentation of Python, Django, DockerStackPresentation of Python, Django, DockerStack
Presentation of Python, Django, DockerStack
 
A la découverte de TypeScript
A la découverte de TypeScriptA la découverte de TypeScript
A la découverte de TypeScript
 
PyData Berlin Meetup
PyData Berlin MeetupPyData Berlin Meetup
PyData Berlin Meetup
 
CoffeeScript Design Patterns
CoffeeScript Design PatternsCoffeeScript Design Patterns
CoffeeScript Design Patterns
 
Programming with Python and PostgreSQL
Programming with Python and PostgreSQLProgramming with Python and PostgreSQL
Programming with Python and PostgreSQL
 
Wprowadzenie do technologii Big Data / Intro to Big Data Ecosystem
Wprowadzenie do technologii Big Data / Intro to Big Data EcosystemWprowadzenie do technologii Big Data / Intro to Big Data Ecosystem
Wprowadzenie do technologii Big Data / Intro to Big Data Ecosystem
 
Javascript Everywhere
Javascript EverywhereJavascript Everywhere
Javascript Everywhere
 
Node.js - async for the rest of us.
Node.js - async for the rest of us.Node.js - async for the rest of us.
Node.js - async for the rest of us.
 
Browsers with Wings
Browsers with WingsBrowsers with Wings
Browsers with Wings
 
mobl presentation @ IHomer
mobl presentation @ IHomermobl presentation @ IHomer
mobl presentation @ IHomer
 
Is HTML5 Ready? (workshop)
Is HTML5 Ready? (workshop)Is HTML5 Ready? (workshop)
Is HTML5 Ready? (workshop)
 
Is html5-ready-workshop-110727181512-phpapp02
Is html5-ready-workshop-110727181512-phpapp02Is html5-ready-workshop-110727181512-phpapp02
Is html5-ready-workshop-110727181512-phpapp02
 
BlockChain implementation by python
BlockChain implementation by pythonBlockChain implementation by python
BlockChain implementation by python
 
Clojure: Simple By Design
Clojure: Simple By DesignClojure: Simple By Design
Clojure: Simple By Design
 
huhu
huhuhuhu
huhu
 
Designing REST API automation tests in Kotlin
Designing REST API automation tests in KotlinDesigning REST API automation tests in Kotlin
Designing REST API automation tests in Kotlin
 
mobl
moblmobl
mobl
 
Azure for SharePoint Developers - Workshop - Part 2: Azure Functions
Azure for SharePoint Developers - Workshop - Part 2: Azure FunctionsAzure for SharePoint Developers - Workshop - Part 2: Azure Functions
Azure for SharePoint Developers - Workshop - Part 2: Azure Functions
 
PVS-Studio for Linux (CoreHard presentation)
PVS-Studio for Linux (CoreHard presentation)PVS-Studio for Linux (CoreHard presentation)
PVS-Studio for Linux (CoreHard presentation)
 
Snickers: Open Source HTTP API for Media Encoding
Snickers: Open Source HTTP API for Media EncodingSnickers: Open Source HTTP API for Media Encoding
Snickers: Open Source HTTP API for Media Encoding
 

More from Michael Bar-Sinai

Sharing Sensitive Data With Confidence: The DataTags system
Sharing Sensitive Data With Confidence: The DataTags systemSharing Sensitive Data With Confidence: The DataTags system
Sharing Sensitive Data With Confidence: The DataTags systemMichael Bar-Sinai
 
DataTags, The Tags Toolset, and Dataverse Integration
DataTags, The Tags Toolset, and Dataverse IntegrationDataTags, The Tags Toolset, and Dataverse Integration
DataTags, The Tags Toolset, and Dataverse IntegrationMichael Bar-Sinai
 

More from Michael Bar-Sinai (6)

BPjs for IoT class
BPjs for IoT classBPjs for IoT class
BPjs for IoT class
 
Deep Dive into BPjs
Deep Dive into BPjsDeep Dive into BPjs
Deep Dive into BPjs
 
Sharing Sensitive Data With Confidence: The DataTags system
Sharing Sensitive Data With Confidence: The DataTags systemSharing Sensitive Data With Confidence: The DataTags system
Sharing Sensitive Data With Confidence: The DataTags system
 
DataTags, The Tags Toolset, and Dataverse Integration
DataTags, The Tags Toolset, and Dataverse IntegrationDataTags, The Tags Toolset, and Dataverse Integration
DataTags, The Tags Toolset, and Dataverse Integration
 
Draw More, Work Less
Draw More, Work LessDraw More, Work Less
Draw More, Work Less
 
Invitation to Scala
Invitation to ScalaInvitation to Scala
Invitation to Scala
 

Recently uploaded

%in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park %in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park masabamasaba
 
Exploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdfExploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdfproinshot.com
 
Chinsurah Escorts ☎️8617697112 Starting From 5K to 15K High Profile Escorts ...
Chinsurah Escorts ☎️8617697112  Starting From 5K to 15K High Profile Escorts ...Chinsurah Escorts ☎️8617697112  Starting From 5K to 15K High Profile Escorts ...
Chinsurah Escorts ☎️8617697112 Starting From 5K to 15K High Profile Escorts ...Nitya salvi
 
The title is not connected to what is inside
The title is not connected to what is insideThe title is not connected to what is inside
The title is not connected to what is insideshinachiaurasa2
 
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfonteinmasabamasaba
 
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...SelfMade bd
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsJhone kinadey
 
%+27788225528 love spells in Vancouver Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Vancouver Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Vancouver Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Vancouver Psychic Readings, Attraction spells,Br...masabamasaba
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...Health
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Modelsaagamshah0812
 
%in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park %in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park masabamasaba
 
%in Lydenburg+277-882-255-28 abortion pills for sale in Lydenburg
%in Lydenburg+277-882-255-28 abortion pills for sale in Lydenburg%in Lydenburg+277-882-255-28 abortion pills for sale in Lydenburg
%in Lydenburg+277-882-255-28 abortion pills for sale in Lydenburgmasabamasaba
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisamasabamasaba
 
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdfintroduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdfVishalKumarJha10
 
SHRMPro HRMS Software Solutions Presentation
SHRMPro HRMS Software Solutions PresentationSHRMPro HRMS Software Solutions Presentation
SHRMPro HRMS Software Solutions PresentationShrmpro
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providermohitmore19
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisamasabamasaba
 
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdfPayment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdfkalichargn70th171
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...masabamasaba
 

Recently uploaded (20)

%in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park %in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
 
Exploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdfExploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdf
 
Chinsurah Escorts ☎️8617697112 Starting From 5K to 15K High Profile Escorts ...
Chinsurah Escorts ☎️8617697112  Starting From 5K to 15K High Profile Escorts ...Chinsurah Escorts ☎️8617697112  Starting From 5K to 15K High Profile Escorts ...
Chinsurah Escorts ☎️8617697112 Starting From 5K to 15K High Profile Escorts ...
 
The title is not connected to what is inside
The title is not connected to what is insideThe title is not connected to what is inside
The title is not connected to what is inside
 
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
 
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial Goals
 
%+27788225528 love spells in Vancouver Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Vancouver Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Vancouver Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Vancouver Psychic Readings, Attraction spells,Br...
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Models
 
%in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park %in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park
 
%in Lydenburg+277-882-255-28 abortion pills for sale in Lydenburg
%in Lydenburg+277-882-255-28 abortion pills for sale in Lydenburg%in Lydenburg+277-882-255-28 abortion pills for sale in Lydenburg
%in Lydenburg+277-882-255-28 abortion pills for sale in Lydenburg
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdfintroduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
 
Microsoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfMicrosoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdf
 
SHRMPro HRMS Software Solutions Presentation
SHRMPro HRMS Software Solutions PresentationSHRMPro HRMS Software Solutions Presentation
SHRMPro HRMS Software Solutions Presentation
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdfPayment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
 

BPjs deep dive 2019