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

BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEBATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEOrtus Solutions, Corp
 
What are the features of Vehicle Tracking System?
What are the features of Vehicle Tracking System?What are the features of Vehicle Tracking System?
What are the features of Vehicle Tracking System?Watsoo Telematics
 
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样umasea
 
Unit 1.1 Excite Part 1, class 9, cbse...
Unit 1.1 Excite Part 1, class 9, cbse...Unit 1.1 Excite Part 1, class 9, cbse...
Unit 1.1 Excite Part 1, class 9, cbse...aditisharan08
 
Engage Usergroup 2024 - The Good The Bad_The Ugly
Engage Usergroup 2024 - The Good The Bad_The UglyEngage Usergroup 2024 - The Good The Bad_The Ugly
Engage Usergroup 2024 - The Good The Bad_The UglyFrank van der Linden
 
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideBuilding Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideChristina Lin
 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...MyIntelliSource, Inc.
 
buds n tech IT solutions
buds n  tech IT                solutionsbuds n  tech IT                solutions
buds n tech IT solutionsmonugehlot87
 
cybersecurity notes for mca students for learning
cybersecurity notes for mca students for learningcybersecurity notes for mca students for learning
cybersecurity notes for mca students for learningVitsRangannavar
 
Project Based Learning (A.I).pptx detail explanation
Project Based Learning (A.I).pptx detail explanationProject Based Learning (A.I).pptx detail explanation
Project Based Learning (A.I).pptx detail explanationkaushalgiri8080
 
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...soniya singh
 
EY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityEY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityNeo4j
 
why an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfwhy an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfjoe51371421
 
Asset Management Software - Infographic
Asset Management Software - InfographicAsset Management Software - Infographic
Asset Management Software - InfographicHr365.us smith
 
Cloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackCloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackVICTOR MAESTRE RAMIREZ
 
Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Andreas Granig
 
Implementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureImplementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureDinusha Kumarasiri
 
Salesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantSalesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantAxelRicardoTrocheRiq
 
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...kellynguyen01
 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)OPEN KNOWLEDGE GmbH
 

Recently uploaded (20)

BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEBATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
 
What are the features of Vehicle Tracking System?
What are the features of Vehicle Tracking System?What are the features of Vehicle Tracking System?
What are the features of Vehicle Tracking System?
 
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
 
Unit 1.1 Excite Part 1, class 9, cbse...
Unit 1.1 Excite Part 1, class 9, cbse...Unit 1.1 Excite Part 1, class 9, cbse...
Unit 1.1 Excite Part 1, class 9, cbse...
 
Engage Usergroup 2024 - The Good The Bad_The Ugly
Engage Usergroup 2024 - The Good The Bad_The UglyEngage Usergroup 2024 - The Good The Bad_The Ugly
Engage Usergroup 2024 - The Good The Bad_The Ugly
 
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideBuilding Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
 
buds n tech IT solutions
buds n  tech IT                solutionsbuds n  tech IT                solutions
buds n tech IT solutions
 
cybersecurity notes for mca students for learning
cybersecurity notes for mca students for learningcybersecurity notes for mca students for learning
cybersecurity notes for mca students for learning
 
Project Based Learning (A.I).pptx detail explanation
Project Based Learning (A.I).pptx detail explanationProject Based Learning (A.I).pptx detail explanation
Project Based Learning (A.I).pptx detail explanation
 
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
 
EY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityEY_Graph Database Powered Sustainability
EY_Graph Database Powered Sustainability
 
why an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfwhy an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdf
 
Asset Management Software - Infographic
Asset Management Software - InfographicAsset Management Software - Infographic
Asset Management Software - Infographic
 
Cloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackCloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStack
 
Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024
 
Implementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureImplementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with Azure
 
Salesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantSalesforce Certified Field Service Consultant
Salesforce Certified Field Service Consultant
 
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)
 

BPjs deep dive 2019