| HADOOP-9099 |
NetUtils.normalizeHostName fails on domains where UnknownHost resolves to an IP address |
Minor |
test |
Ivan Mitic |
Ivan Mitic |
| HADOOP-10342 |
Extend UserGroupInformation to return a UGI given a preauthenticated kerberos Subject |
Major |
security |
Larry McCay |
Larry McCay |
| YARN-1718 |
Fix a couple isTerminals in Fair Scheduler queue placement rules |
Major |
scheduler |
Sandy Ryza |
Sandy Ryza |
| YARN-1736 |
FS: AppSchedulable.assignContainer’s priority argument is redundant |
Minor |
scheduler |
Sandy Ryza |
Naren Koneru |
| MAPREDUCE-5671 |
NaN can be created by client and assign to Progress |
Major |
. |
Chen He |
Chen He |
| YARN-1678 |
Fair scheduler gabs incessantly about reservations |
Major |
scheduler |
Sandy Ryza |
Sandy Ryza |
| YARN-1429 |
*nix: Allow a way for users to augment classpath of YARN daemons |
Trivial |
client |
Sandy Ryza |
Jarek Jarcec Cecho |
| MAPREDUCE-5665 |
Add audience annotations to MiniMRYarnCluster and MiniMRCluster |
Major |
test |
Sandy Ryza |
Anubhav Dhoot |
| HADOOP-10378 |
Typo in help printed by hdfs dfs -help |
Major |
. |
Mit Desai |
Mit Desai |
| YARN-1790 |
Fair Scheduler UI not showing apps table |
Major |
. |
bc Wong |
bc Wong |
| MAPREDUCE-5765 |
Update hadoop-pipes examples README |
Minor |
pipes |
Jonathan Eagles |
Mit Desai |
| HADOOP-10332 |
HttpServer’s jetty audit log always logs 200 OK |
Major |
. |
Daryn Sharp |
Jonathan Eagles |
| MAPREDUCE-5713 |
InputFormat and JobConf JavaDoc Fixes |
Trivial |
documentation |
Ben Robie |
Chen He |
| MAPREDUCE-5456 |
TestFetcher.testCopyFromHostExtraBytes is missing |
Minor |
mrv2, test |
Jason Lowe |
Jason Lowe |
| YARN-1520 |
update capacity scheduler docs to include necessary parameters |
Major |
. |
Chen He |
Chen He |
| YARN-1136 |
Replace junit.framework.Assert with org.junit.Assert |
Major |
. |
Karthik Kambatla |
Chen He |
| HDFS-6112 |
NFS Gateway docs are incorrect for allowed hosts configuration |
Minor |
nfs |
Aaron T. Myers |
Aaron T. Myers |
| HADOOP-10418 |
SaslRpcClient should not assume that remote principals are in the default_realm |
Major |
security |
Aaron T. Myers |
Aaron T. Myers |
| HDFS-3087 |
Decomissioning on NN restart can complete without blocks being replicated |
Critical |
namenode |
Kihwal Lee |
Rushabh S Shah |
| HDFS-6156 |
Simplify the JMX API that provides snapshot information |
Major |
. |
Haohui Mai |
Shinichi Yamashita |
| MAPREDUCE-5759 |
Remove unnecessary conf load in Limits |
Major |
. |
Sandy Ryza |
Sandy Ryza |
| HADOOP-10414 |
Incorrect property name for RefreshUserMappingProtocol in hadoop-policy.xml |
Major |
conf |
Joey Echeverria |
Joey Echeverria |
| HDFS-5591 |
Checkpointing should use monotonic time when calculating period |
Minor |
namenode |
Andrew Wang |
Charles Lamb |
| HADOOP-10459 |
distcp V2 doesn’t preserve root dir’s attributes when -p is specified |
Major |
tools/distcp |
Yongjun Zhang |
Yongjun Zhang |
| HDFS-6190 |
minor textual fixes in DFSClient |
Trivial |
tools |
Charles Lamb |
Charles Lamb |
| HADOOP-10462 |
DF#getFilesystem is not parsing the command output |
Major |
. |
Akira Ajisaka |
Akira Ajisaka |
| HDFS-6159 |
TestBalancerWithNodeGroup.testBalancerWithNodeGroup fails if there is block missing after balancer success |
Major |
test |
Chen He |
Chen He |
| HDFS-6181 |
Fix the wrong property names in NFS user guide |
Trivial |
documentation, nfs |
Brandon Li |
Brandon Li |
| HDFS-6180 |
dead node count / listing is very broken in JMX and old GUI |
Blocker |
. |
Travis Thompson |
Haohui Mai |
| HDFS-6143 |
WebHdfsFileSystem open should throw FileNotFoundException for non-existing paths |
Blocker |
. |
Gera Shegalov |
Gera Shegalov |
| HADOOP-10475 |
ConcurrentModificationException in AbstractDelegationTokenSelector.selectToken() |
Major |
security |
Arpit Gupta |
Jing Zhao |
| YARN-1784 |
TestContainerAllocation assumes CapacityScheduler |
Minor |
resourcemanager |
Karthik Kambatla |
Robert Kanter |
| HDFS-6160 |
TestSafeMode occasionally fails |
Major |
test |
Ted Yu |
Arpit Agarwal |
| HDFS-5669 |
Storage#tryLock() should check for null before logging successfull message |
Major |
datanode |
Vinayakumar B |
Vinayakumar B |
| HADOOP-10350 |
BUILDING.txt should mention openssl dependency required for hadoop-pipes |
Major |
. |
Vinayakumar B |
Vinayakumar B |
| HADOOP-10495 |
TestFileUtil fails on Windows due to bad permission assertions. |
Trivial |
fs, test |
Chris Nauroth |
Chris Nauroth |
| HADOOP-10496 |
Metrics system FileSink can leak file descriptor. |
Major |
metrics |
Chris Nauroth |
Chris Nauroth |
| HDFS-6238 |
TestDirectoryScanner leaks file descriptors. |
Minor |
datanode, test |
Chris Nauroth |
Chris Nauroth |
| HADOOP-10500 |
TestDoAsEffectiveUser fails on JDK7 due to failure to reset proxy user configuration. |
Trivial |
security, test |
Chris Nauroth |
Chris Nauroth |
| HDFS-6243 |
HA NameNode transition to active or shutdown may leave lingering image transfer thread. |
Major |
ha, namenode |
Chris Nauroth |
Chris Nauroth |
| HDFS-6194 |
Create new tests for ByteRangeInputStream |
Major |
. |
Haohui Mai |
Akira Ajisaka |
| MAPREDUCE-5836 |
Fix typo in RandomTextWriter |
Trivial |
. |
Akira Ajisaka |
Akira Ajisaka |
| MAPREDUCE-5775 |
Remove unnecessary job.setNumReduceTasks in SleepJob.createJob |
Minor |
. |
Liyin Liang |
jhanver chand sharma |
| HDFS-6214 |
Webhdfs has poor throughput for files >2GB |
Major |
webhdfs |
Daryn Sharp |
Daryn Sharp |
| HDFS-4909 |
Avoid protocol buffer RPC namespace clashes |
Blocker |
datanode, journal-node, namenode |
Ralph Castain |
Colin P. McCabe |
| YARN-1940 |
deleteAsUser() terminates early without deleting more files on error |
Major |
. |
Kihwal Lee |
Rushabh S Shah |
| MAPREDUCE-4937 |
MR AM handles an oversized split metainfo file poorly |
Major |
mr-am |
Jason Lowe |
Eric Payne |
| YARN-1865 |
ShellScriptBuilder does not check for some error conditions |
Minor |
nodemanager |
Remus Rusanu |
Remus Rusanu |
| HADOOP-9919 |
Update hadoop-metrics2.properties examples to Yarn |
Major |
conf |
Akira Ajisaka |
Akira Ajisaka |
| HADOOP-10526 |
Chance for Stream leakage in CompressorStream |
Minor |
. |
SreeHari |
Rushabh S Shah |
| HDFS-6178 |
Decommission on standby NN couldn’t finish |
Major |
namenode |
Ming Ma |
Ming Ma |
| HDFS-6213 |
TestDataNodeConfig failing on Jenkins runs due to DN web port in use |
Minor |
test |
Steve Loughran |
Andrew Wang |
| HADOOP-10251 |
Both NameNodes could be in STANDBY State if SNN network is unstable |
Critical |
ha |
Vinayakumar B |
Vinayakumar B |
| HADOOP-10531 |
hadoop-config.sh - bug in –hosts argument |
Major |
. |
Sebastien Barrier |
Sebastien Barrier |
| MAPREDUCE-5846 |
Rumen doesn’t understand JobQueueChangedEvent |
Major |
tools/rumen |
Nathan Roberts |
Nathan Roberts |
| MAPREDUCE-5837 |
MRAppMaster fails when checking on uber mode |
Critical |
. |
Haohui Mai |
Haohui Mai |
| HADOOP-10540 |
Datanode upgrade in Windows fails with hardlink error. |
Major |
tools |
Huan Huang |
Arpit Agarwal |
| MAPREDUCE-5749 |
TestRMContainerAllocator#testReportedAppProgress Failed |
Major |
. |
Hong Shen |
Jason Lowe |
| HDFS-6270 |
Secondary namenode status page shows transaction count in bytes |
Minor |
. |
Benoy Antony |
Benoy Antony |
| HDFS-6288 |
DFSInputStream Pread doesn’t update ReadStatistics |
Minor |
. |
Juan Yu |
Juan Yu |
| HADOOP-10508 |
RefreshCallQueue fails when authorization is enabled |
Major |
ipc |
Chris Li |
Chris Li |
| HDFS-3828 |
Block Scanner rescans blocks too frequently |
Major |
. |
Andy Isaacson |
Andy Isaacson |
| YARN-738 |
TestClientRMTokens is failing irregularly while running all yarn tests |
Major |
. |
Omkar Vinit Joshi |
Ming Ma |
| HDFS-6216 |
Issues with webhdfs and http proxies |
Major |
webhdfs |
Daryn Sharp |
Daryn Sharp |
| HADOOP-10547 |
Give SaslPropertiesResolver.getDefaultProperties() public scope |
Major |
security |
Jason Dere |
Benoy Antony |
| HADOOP-10543 |
RemoteException’s unwrapRemoteException method failed for PathIOException |
Major |
. |
Yongjun Zhang |
Yongjun Zhang |
| HDFS-6289 |
HA failover can fail if there are pending DN messages for DNs which no longer exist |
Critical |
ha |
Aaron T. Myers |
Aaron T. Myers |
| HADOOP-10568 |
Add s3 server-side encryption |
Major |
fs/s3 |
David S. Wang |
David S. Wang |
| HDFS-6337 |
Setfacl testcase is failing due to dash character in username in TestAclCLI |
Major |
test |
Uma Maheswara Rao G |
Uma Maheswara Rao G |
| HADOOP-10541 |
InputStream in MiniKdc#initKDCServer for minikdc.ldiff is not closed |
Minor |
test |
Ted Yu |
Swarnim Kulkarni |
| HADOOP-10517 |
InputStream is not closed in two methods of JarFinder |
Minor |
test, util |
Ted Yu |
Ted Yu |
| HADOOP-10581 |
TestUserGroupInformation#testGetServerSideGroups fails because groups stored in Set and ArrayList are compared |
Major |
. |
Mit Desai |
Mit Desai |
| HADOOP-10158 |
SPNEGO should work with multiple interfaces/SPNs. |
Critical |
. |
Kihwal Lee |
Daryn Sharp |
| MAPREDUCE-5884 |
History server uses short user name when canceling tokens |
Major |
jobhistoryserver, security |
Mohammad Kamrul Islam |
Mohammad Kamrul Islam |
| YARN-2036 |
Document yarn.resourcemanager.hostname in ClusterSetup |
Minor |
documentation |
Karthik Kambatla |
Ray Chiang |
| HDFS-6294 |
Use INode IDs to avoid conflicts when a file open for write is renamed |
Major |
namenode |
Colin P. McCabe |
Colin P. McCabe |
| HDFS-6230 |
Expose upgrade status through NameNode web UI |
Major |
namenode |
Arpit Agarwal |
Mit Desai |
| HDFS-5522 |
Datanode disk error check may be incorrectly skipped |
Major |
. |
Kihwal Lee |
Rushabh S Shah |
| HDFS-6367 |
EnumSetParam$Domain#parse fails for parameter containing more than one enum. |
Major |
webhdfs |
Yi Liu |
Yi Liu |
| HADOOP-10585 |
Retry polices ignore interrupted exceptions |
Critical |
ipc |
Daryn Sharp |
Daryn Sharp |
| HDFS-6305 |
WebHdfs response decoding may throw RuntimeExceptions |
Critical |
webhdfs |
Daryn Sharp |
Daryn Sharp |
| MAPREDUCE-5814 |
fat jar with *-default.xml may fail when mapreduce.job.classloader=true. |
Major |
mrv2 |
Gera Shegalov |
Gera Shegalov |
| MAPREDUCE-5652 |
NM Recovery. ShuffleHandler should handle NM restarts |
Major |
. |
Karthik Kambatla |
Jason Lowe |
| MAPREDUCE-5888 |
Failed job leaves hung AM after it unregisters |
Major |
mr-am |
Jason Lowe |
Jason Lowe |
| HDFS-6355 |
Fix divide-by-zero, improper use of wall-clock time in BlockPoolSliceScanner |
Major |
. |
Colin P. McCabe |
Colin P. McCabe |
| YARN-1981 |
Nodemanager version is not updated when a node reconnects |
Major |
resourcemanager |
Jason Lowe |
Jason Lowe |
| HDFS-6370 |
Web UI fails to display in intranet under IE |
Major |
datanode, journal-node, namenode |
Haohui Mai |
Haohui Mai |
| HDFS-6293 |
Issues with OIV processing PB-based fsimages |
Blocker |
. |
Kihwal Lee |
Kihwal Lee |
| HDFS-6381 |
Fix a typo in INodeReference.java |
Trivial |
documentation |
Binglin Chang |
Binglin Chang |
| HADOOP-10401 |
ShellBasedUnixGroupsMapping#getGroups does not always return primary group first |
Major |
util |
Colin P. McCabe |
Akira Ajisaka |
| HDFS-6400 |
Cannot execute “hdfs oiv_legacy” |
Critical |
tools |
Akira Ajisaka |
Akira Ajisaka |
| HADOOP-10588 |
Workaround for jetty6 acceptor startup issue |
Major |
. |
Kihwal Lee |
Kihwal Lee |
| HDFS-6345 |
DFS.listCacheDirectives() should allow filtering based on cache directive ID |
Major |
caching |
Lenni Kuff |
Andrew Wang |
| HDFS-6250 |
TestBalancerWithNodeGroup.testBalancerWithRackLocality fails |
Major |
. |
Kihwal Lee |
Binglin Chang |
| MAPREDUCE-5874 |
Creating MapReduce REST API section |
Major |
documentation |
Ravi Prakash |
Tsuyoshi Ozawa |
| HDFS-4913 |
Deleting file through fuse-dfs when using trash fails requiring root permissions |
Major |
fuse-dfs |
Stephen Chu |
Colin P. McCabe |
| HADOOP-10609 |
.gitignore should ignore .orig and .rej files |
Major |
. |
Karthik Kambatla |
Karthik Kambatla |
| HADOOP-10489 |
UserGroupInformation#getTokens and UserGroupInformation#addToken can lead to ConcurrentModificationException |
Major |
. |
Jing Zhao |
Robert Kanter |
| MAPREDUCE-5309 |
2.0.4 JobHistoryParser can’t parse certain failed job history files generated by 2.0.3 history server |
Major |
jobhistoryserver, mrv2 |
Vrushali C |
Rushabh S Shah |
| YARN-2050 |
Fix LogCLIHelpers to create the correct FileContext |
Major |
. |
Ming Ma |
Ming Ma |
| HDFS-6421 |
Fix vecsum.c compile on BSD and some other systems |
Major |
libhdfs |
Jason Lowe |
Mit Desai |
| HDFS-6409 |
Fix typo in log message about NameNode layout version upgrade. |
Trivial |
namenode |
Chris Nauroth |
Chen He |
| HDFS-6438 |
DeleteSnapshot should be a DELETE request in WebHdfs |
Major |
webhdfs |
Jing Zhao |
Jing Zhao |
| HDFS-6423 |
Diskspace quota usage should be updated when appending data to partial block |
Major |
namenode |
Jing Zhao |
Jing Zhao |
| YARN-2073 |
Fair Scheduler: Add a utilization threshold to prevent preempting resources when cluster is free |
Critical |
scheduler |
Karthik Kambatla |
Karthik Kambatla |
| YARN-2096 |
Race in TestRMRestart#testQueueMetricsOnRMRestart |
Major |
. |
Anubhav Dhoot |
Anubhav Dhoot |
| HDFS-6443 |
Fix MiniQJMHACluster related test failures |
Minor |
test |
Zesheng Wu |
Zesheng Wu |
| HDFS-6227 |
ShortCircuitCache#unref should purge ShortCircuitReplicas whose streams have been closed by java interrupts |
Major |
. |
Jing Zhao |
Colin P. McCabe |
| HADOOP-10625 |
Configuration: names should be trimmed when putting/getting to properties |
Major |
conf |
Wangda Tan |
Wangda Tan |
| MAPREDUCE-5862 |
Line records longer than 2x split size aren’t handled correctly |
Critical |
. |
bc Wong |
bc Wong |
| YARN-596 |
Use scheduling policies throughout the queue hierarchy to decide which containers to preempt |
Major |
scheduler |
Sandy Ryza |
Wei Yan |
| MAPREDUCE-5895 |
FileAlreadyExistsException was thrown : Temporary Index File can not be cleaned up because OutputStream doesn’t close properly |
Major |
client |
Kousuke Saruta |
Kousuke Saruta |
| HADOOP-10602 |
Documentation has broken “Go Back” hyperlinks. |
Trivial |
documentation |
Chris Nauroth |
Akira Ajisaka |
| YARN-2112 |
Hadoop-client is missing jackson libs due to inappropriate configs in pom.xml |
Major |
. |
Zhijie Shen |
Zhijie Shen |
| HDFS-6461 |
Use Time#monotonicNow to compute duration in DataNode#shutDown |
Trivial |
datanode |
James Thomas |
James Thomas |
| HDFS-6462 |
NFS: fsstat request fails with the secure hdfs |
Major |
nfs |
Yesha Vora |
Brandon Li |
| HADOOP-10639 |
FileBasedKeyStoresFactory initialization is not using default for SSL_REQUIRE_CLIENT_CERT_KEY |
Major |
security |
Alejandro Abdelnur |
Alejandro Abdelnur |
| HADOOP-10638 |
Updating hadoop-daemon.sh to work as expected when nfs is started as a privileged user. |
Major |
nfs |
Manikandan Narayanaswamy |
Manikandan Narayanaswamy |
| YARN-2054 |
Better defaults for YARN ZK configs for retries and retry-inteval when HA is enabled |
Major |
resourcemanager |
Karthik Kambatla |
Karthik Kambatla |
| HDFS-6404 |
HttpFS should use a 000 umask for mkdir and create operations |
Major |
. |
Alejandro Abdelnur |
Mike Yoder |
| YARN-1868 |
YARN status web ui does not show correctly in IE 11 |
Major |
webapp |
Chuan Liu |
Chuan Liu |
| HDFS-6472 |
fix typo in webapps/hdfs/explorer.js |
Trivial |
. |
Juan Yu |
Juan Yu |
| HDFS-6056 |
Clean up NFS config settings |
Major |
nfs |
Aaron T. Myers |
Brandon Li |
| YARN-2103 |
Inconsistency between viaProto flag and initial value of SerializedExceptionProto.Builder |
Major |
. |
Binglin Chang |
Binglin Chang |
| YARN-1550 |
NPE in FairSchedulerAppsBlock#render |
Critical |
fairscheduler |
caolong |
Anubhav Dhoot |
| HADOOP-10630 |
Possible race condition in RetryInvocationHandler |
Major |
. |
Jing Zhao |
Jing Zhao |
| HDFS-6424 |
blockReport doesn’t need to invalidate blocks on SBN |
Major |
. |
Ming Ma |
Ming Ma |
| YARN-1913 |
With Fair Scheduler, cluster can logjam when all resources are consumed by AMs |
Major |
scheduler |
bc Wong |
Wei Yan |
| YARN-2119 |
DEFAULT_PROXY_ADDRESS should use DEFAULT_PROXY_PORT |
Major |
. |
Anubhav Dhoot |
Anubhav Dhoot |
| HDFS-6464 |
Support multiple xattr.name parameters for WebHDFS getXAttrs. |
Major |
webhdfs |
Yi Liu |
Yi Liu |
| MAPREDUCE-5898 |
distcp to support preserving HDFS extended attributes(XAttrs) |
Major |
distcp |
Uma Maheswara Rao G |
Yi Liu |
| HADOOP-10647 |
String Format Exception in SwiftNativeFileSystemStore.java |
Minor |
fs/swift |
Gene Kim |
Gene Kim |
| HDFS-6487 |
TestStandbyCheckpoint#testSBNCheckpoints is racy |
Major |
. |
Mit Desai |
Mit Desai |
| HDFS-6497 |
Make TestAvailableSpaceVolumeChoosingPolicy deterministic |
Minor |
test |
Colin P. McCabe |
Colin P. McCabe |
| YARN-2122 |
In AllocationFileLoaderService, the reloadThread should be created in init() and started in start() |
Major |
scheduler |
Karthik Kambatla |
Robert Kanter |
| YARN-2128 |
FairScheduler: Incorrect calculation of amResource usage |
Major |
. |
Wei Yan |
Wei Yan |
| YARN-2132 |
ZKRMStateStore.ZKAction#runWithRetries doesn’t log the exception it encounters |
Major |
resourcemanager |
Karthik Kambatla |
Vamsee Yarlagadda |
| HDFS-6500 |
Snapshot shouldn’t be removed silently after renaming to an existing snapshot |
Blocker |
snapshots |
Junping Du |
Tsz Wo Nicholas Sze |
| HDFS-6399 |
Add note about setfacl in HDFS permissions guide |
Minor |
documentation, namenode |
Charles Lamb |
Chris Nauroth |
| HADOOP-10658 |
SSLFactory expects truststores being configured |
Major |
security |
Alejandro Abdelnur |
Alejandro Abdelnur |
| HADOOP-10664 |
TestNetUtils.testNormalizeHostName fails |
Major |
. |
Chen He |
Aaron T. Myers |
| HADOOP-9555 |
HA functionality that uses ZooKeeper may experience inadvertent TCP RST and miss session expiration event due to bug in client connection management |
Major |
ha |
Chris Nauroth |
Chris Nauroth |
| MAPREDUCE-5834 |
TestGridMixClasses tests timesout on branch-2 |
Major |
. |
Mit Desai |
Mit Desai |
| HDFS-6364 |
Incorrect check for unknown datanode in Balancer |
Major |
balancer & mover |
Benoy Antony |
Benoy Antony |
| YARN-2124 |
ProportionalCapacityPreemptionPolicy cannot work because it’s initialized before scheduler initialized |
Critical |
resourcemanager, scheduler |
Wangda Tan |
Wangda Tan |
| MAPREDUCE-5920 |
Add Xattr option in DistCp docs |
Minor |
distcp, documentation |
Uma Maheswara Rao G |
Yi Liu |
| HADOOP-10656 |
The password keystore file is not picked by LDAP group mapping |
Major |
security |
Brandon Li |
Brandon Li |
| HADOOP-10622 |
Shell.runCommand can deadlock |
Critical |
. |
Jason Lowe |
Gera Shegalov |
| HDFS-6379 |
HTTPFS - Implement ACLs support |
Major |
. |
Alejandro Abdelnur |
Mike Yoder |
| YARN-2148 |
TestNMClient failed due more exit code values added and passed to AM |
Major |
client |
Wangda Tan |
Wangda Tan |
| HDFS-6471 |
Make moveFromLocal CLI testcases to be non-disruptive |
Major |
test |
Dasha Boudnik |
Dasha Boudnik |
| YARN-2075 |
TestRMAdminCLI consistently fail on trunk and branch-2 |
Major |
. |
Zhijie Shen |
Kenji Kikushima |
| HDFS-6395 |
Skip checking xattr limits for non-user-visible namespaces |
Major |
namenode |
Andrew Wang |
Yi Liu |
| HDFS-3493 |
Invalidate excess corrupted blocks as long as minimum replication is satisfied |
Major |
namenode |
J.Andreina |
Juan Yu |
| YARN-2155 |
FairScheduler: Incorrect threshold check for preemption |
Major |
. |
Wei Yan |
Wei Yan |
| HADOOP-10678 |
SecurityUtil has unnecessary synchronization on collection used for only tests |
Minor |
security |
Benoy Antony |
Benoy Antony |
| HDFS-6470 |
TestBPOfferService.testBPInitErrorHandling is flaky |
Major |
. |
Andrew Wang |
Ming Ma |
| HADOOP-10657 |
Have RetryInvocationHandler log failover attempt at INFO level |
Major |
. |
Ming Ma |
Ming Ma |
| HADOOP-10683 |
Users authenticated with KERBEROS are recorded as being authenticated with SIMPLE |
Major |
security |
Benoy Antony |
Benoy Antony |
| HDFS-6539 |
test_native_mini_dfs is skipped in hadoop-hdfs/pom.xml |
Major |
. |
Binglin Chang |
Binglin Chang |
| HDFS-6518 |
TestCacheDirectives#testExceedsCapacity should take FSN read lock when accessing pendingCached list |
Major |
. |
Yongjun Zhang |
Andrew Wang |
| HADOOP-10702 |
KerberosAuthenticationHandler does not log the principal names correctly |
Minor |
security |
Benoy Antony |
Benoy Antony |
| YARN-1885 |
RM may not send the app-finished signal after RM restart to some nodes where the application ran before RM restarts |
Major |
. |
Arpit Gupta |
Wangda Tan |
| YARN-2167 |
LeveldbIterator should get closed in NMLeveldbStateStoreService#loadLocalizationState() within finally block |
Major |
nodemanager |
Junping Du |
Junping Du |
| HADOOP-10699 |
Fix build native library on mac osx |
Major |
. |
Kirill A. Korinskiy |
Binglin Chang |
| MAPREDUCE-5924 |
Windows: Sort Job failed due to ‘Invalid event: TA_COMMIT_PENDING at COMMIT_PENDING’ |
Major |
. |
Yesha Vora |
Zhijie Shen |
| HADOOP-10590 |
ServiceAuthorizationManager is not threadsafe |
Major |
security |
Benoy Antony |
Benoy Antony |
| HADOOP-10660 |
GraphiteSink should implement Closeable |
Major |
. |
Ted Yu |
Chen He |
| HDFS-6530 |
Fix Balancer documentation |
Minor |
documentation |
Tsz Wo Nicholas Sze |
Tsz Wo Nicholas Sze |
| HDFS-6552 |
add DN storage to a BlockInfo will not replace the different storage from same DN |
Trivial |
namenode |
Amir Langer |
Amir Langer |
| HDFS-6551 |
Rename with OVERWRITE option may throw NPE when the target file/directory is a reference INode |
Major |
namenode, snapshots |
Jing Zhao |
Jing Zhao |
| HDFS-6439 |
NFS should not reject NFS requests to the NULL procedure whether port monitoring is enabled or not |
Major |
nfs |
Brandon Li |
Aaron T. Myers |
| HDFS-6559 |
Fix wrong option “dfsadmin -rollingUpgrade start” in the document |
Minor |
documentation |
Akira Ajisaka |
Akira Ajisaka |
| HADOOP-10711 |
Cleanup some extra dependencies from hadoop-auth |
Major |
security |
Robert Kanter |
Robert Kanter |
| HADOOP-10716 |
Cannot use more than 1 har filesystem |
Critical |
conf, fs |
Daryn Sharp |
Rushabh S Shah |
| HDFS-6553 |
Add missing DeprecationDeltas for NFS Kerberos configurations |
Major |
nfs |
Stephen Chu |
Stephen Chu |
| HDFS-6563 |
NameNode cannot save fsimage in certain circumstances when snapshots are in use |
Critical |
namenode, snapshots |
Aaron T. Myers |
Aaron T. Myers |
| HDFS-3848 |
A Bug in recoverLeaseInternal method of FSNameSystem class |
Major |
namenode |
Hooman Peiro Sajjad |
Chen He |
| HDFS-6549 |
Add support for accessing the NFS gateway from the AIX NFS client |
Major |
nfs |
Aaron T. Myers |
Aaron T. Myers |
| MAPREDUCE-5844 |
Add a configurable delay to reducer-preemption |
Major |
. |
Maysam Yabandeh |
Maysam Yabandeh |
| HDFS-6312 |
WebHdfs HA failover is broken on secure clusters |
Blocker |
webhdfs |
Daryn Sharp |
Daryn Sharp |
| HDFS-6535 |
HDFS quota update is wrong when file is appended |
Major |
namenode |
George Wong |
George Wong |
| HADOOP-9559 |
When metrics system is restarted MBean names get incorrectly flagged as dupes |
Major |
metrics |
Mostafa Elhemali |
Mike Liddell |
| HDFS-6222 |
Remove background token renewer from webhdfs |
Major |
webhdfs |
Daryn Sharp |
Daryn Sharp |
| YARN-2187 |
FairScheduler: Disable max-AM-share check by default |
Major |
fairscheduler |
Robert Kanter |
Robert Kanter |
| HDFS-6583 |
Remove clientNode in FileUnderConstructionFeature |
Minor |
namenode |
Haohui Mai |
Haohui Mai |
| HDFS-6587 |
Bug in TestBPOfferService can cause test failure |
Major |
test |
Zhilei Xu |
Zhilei Xu |
| YARN-2191 |
Add a test to make sure NM will do application cleanup even if RM restarting happens before application completed |
Major |
resourcemanager |
Wangda Tan |
Wangda Tan |
| YARN-2111 |
In FairScheduler.attemptScheduling, we don’t count containers as assigned if they have 0 memory but non-zero cores |
Major |
scheduler |
Sandy Ryza |
Sandy Ryza |
| YARN-2192 |
TestRMHA fails when run with a mix of Schedulers |
Major |
. |
Anubhav Dhoot |
Anubhav Dhoot |
| HADOOP-10746 |
TestSocketIOWithTimeout#testSocketIOWithTimeout fails on Power PC |
Major |
test |
Jinghui Wang |
Jinghui Wang |
| YARN-2109 |
Fix TestRM to work with both schedulers |
Major |
scheduler |
Anubhav Dhoot |
Karthik Kambatla |
| HDFS-6598 |
Fix a typo in message issued from explorer.js |
Trivial |
webhdfs |
Yongjun Zhang |
Yongjun Zhang |
| HDFS-6475 |
WebHdfs clients fail without retry because incorrect handling of StandbyException |
Major |
ha, webhdfs |
Yongjun Zhang |
Yongjun Zhang |
| HDFS-6527 |
Edit log corruption due to defered INode removal |
Blocker |
. |
Kihwal Lee |
Kihwal Lee |
| YARN-2171 |
AMs block on the CapacityScheduler lock during allocate() |
Critical |
capacityscheduler |
Jason Lowe |
Jason Lowe |
| HADOOP-9705 |
FsShell cp -p does not preserve directory attibutes |
Major |
fs |
Stephen Chu |
Akira Ajisaka |
| MAPREDUCE-5939 |
StartTime showing up as the epoch time in JHS UI after upgrade |
Major |
. |
Kihwal Lee |
Chen He |
| HDFS-6572 |
Add an option to the NameNode that prints the software and on-disk image versions |
Minor |
namenode |
Charles Lamb |
Charles Lamb |
| YARN-2163 |
WebUI: Order of AppId in apps table should be consistent with ApplicationId.compareTo(). |
Minor |
resourcemanager, webapp |
Wangda Tan |
Wangda Tan |
| HADOOP-10701 |
NFS should not validate the access premission only based on the user’s primary group |
Major |
nfs |
Premchandra Preetham Kukillaya |
Harsh J |
| YARN-2204 |
TestAMRestart#testAMRestartWithExistingContainers assumes CapacityScheduler |
Trivial |
resourcemanager |
Robert Kanter |
Robert Kanter |
| YARN-2104 |
Scheduler queue filter failed to work because index of queue column changed |
Major |
resourcemanager, webapp |
Wangda Tan |
Wangda Tan |
| HADOOP-10739 |
Renaming a file into a directory containing the same filename results in a confusing I/O error |
Major |
fs |
Jason Lowe |
Chang Li |
| YARN-2201 |
TestRMWebServicesAppsModification dependent on yarn-default.xml |
Major |
. |
Ray Chiang |
Varun Vasudev |
| HDFS-6556 |
Refine XAttr permissions |
Major |
namenode |
Yi Liu |
Uma Maheswara Rao G |
| HDFS-6601 |
Issues in finalizing rolling upgrade when there is a layout version change |
Blocker |
. |
Kihwal Lee |
Kihwal Lee |
| HDFS-6418 |
Regression: DFS_NAMENODE_USER_NAME_KEY missing in trunk |
Blocker |
hdfs-client |
Steve Loughran |
Tsz Wo Nicholas Sze |
| HADOOP-10710 |
hadoop.auth cookie is not properly constructed according to RFC2109 |
Major |
security |
Alejandro Abdelnur |
Juan Yu |
| HDFS-6591 |
while loop is executed tens of thousands of times in Hedged Read |
Major |
hdfs-client |
LiuLei |
Liang Xie |
| YARN-2065 |
AM cannot create new containers after restart-NM token from previous attempt used |
Major |
. |
Steve Loughran |
Jian He |
| HDFS-6612 |
MiniDFSNNTopology#simpleFederatedTopology(int) always hardcode nameservice ID |
Minor |
. |
Juan Yu |
Juan Yu |
| HDFS-6604 |
The short-circuit cache doesn’t correctly time out replicas that haven’t been used in a while |
Critical |
hdfs-client |
Giuseppe Reina |
Colin P. McCabe |
| YARN-2241 |
ZKRMStateStore: On startup, show nicer messages if znodes already exist |
Minor |
resourcemanager |
Robert Kanter |
Robert Kanter |
| YARN-2232 |
ClientRMService doesn’t allow delegation token owner to cancel their own token in secure mode |
Major |
. |
Varun Vasudev |
Varun Vasudev |
| HDFS-6610 |
TestShortCircuitLocalRead tests sometimes timeout on slow machines |
Minor |
test |
Charles Lamb |
Charles Lamb |
| HADOOP-10312 |
Shell.ExitCodeException to have more useful toString |
Minor |
util |
Steve Loughran |
Steve Loughran |
| HADOOP-10533 |
S3 input stream NPEs in MapReduce job |
Minor |
fs/s3 |
Benjamin Kim |
Steve Loughran |
| HADOOP-10419 |
BufferedFSInputStream NPEs on getPos() on a closed stream |
Minor |
fs |
Steve Loughran |
Steve Loughran |
| HDFS-6493 |
Change dfs.namenode.startup.delay.block.deletion to second instead of millisecond |
Trivial |
. |
Juan Yu |
Juan Yu |
| YARN-2250 |
FairScheduler.findLowestCommonAncestorQueue returns null when queues not identical |
Major |
scheduler |
Krisztian Horvath |
Krisztian Horvath |
| MAPREDUCE-5868 |
TestPipeApplication causing nightly build to fail |
Major |
test |
Jason Lowe |
Akira Ajisaka |
| MAPREDUCE-5517 |
enabling uber mode with 0 reducer still requires mapreduce.reduce.memory.mb to be less than yarn.app.mapreduce.am.resource.mb |
Minor |
. |
Siqi Li |
Siqi Li |
| HADOOP-10801 |
Fix dead link in site.xml |
Major |
documentation |
Akira Ajisaka |
Akira Ajisaka |
| HDFS-6618 |
FSNamesystem#delete drops the FSN lock between removing INodes from the tree and deleting them from the inode map |
Blocker |
. |
Kihwal Lee |
Kihwal Lee |
| HDFS-6622 |
Rename and AddBlock may race and produce invalid edits |
Blocker |
. |
Kihwal Lee |
Kihwal Lee |
| HDFS-6631 |
TestPread#testHedgedReadLoopTooManyTimes fails intermittently. |
Major |
hdfs-client, test |
Chris Nauroth |
Liang Xie |
| HDFS-6647 |
Edit log corruption when pipeline recovery occurs for deleted file present in snapshot |
Blocker |
namenode, snapshots |
Aaron T. Myers |
Kihwal Lee |
| HDFS-6378 |
NFS registration should timeout instead of hanging when portmap/rpcbind is not available |
Major |
nfs |
Brandon Li |
Abhiraj Butala |
| MAPREDUCE-5790 |
Default map hprof profile options do not work |
Blocker |
. |
Andrew Wang |
Gera Shegalov |
| HADOOP-10468 |
TestMetricsSystemImpl.testMultiThreadedPublish fails intermediately |
Blocker |
. |
Haohui Mai |
Akira Ajisaka |
| MAPREDUCE-5952 |
LocalContainerLauncher#renameMapOutputForReduce incorrectly assumes a single dir for mapOutIndex |
Blocker |
mr-am, mrv2 |
Gera Shegalov |
Gera Shegalov |
| HDFS-6599 |
2.4 addBlock is 10 to 20 times slower compared to 0.23 |
Blocker |
. |
Kihwal Lee |
Daryn Sharp |
| HDFS-6632 |
Reintroduce dfs.http.port / dfs.https.port in branch-2 |
Major |
. |
Yongjun Zhang |
Yongjun Zhang |
| HDFS-6680 |
BlockPlacementPolicyDefault does not choose favored nodes correctly |
Major |
namenode |
Tsz Wo Nicholas Sze |
Tsz Wo Nicholas Sze |
| HDFS-6712 |
Document HDFS Multihoming Settings |
Major |
documentation |
Arpit Agarwal |
Arpit Agarwal |
| HDFS-6703 |
NFS: Files can be deleted from a read-only mount |
Major |
nfs |
Abhiraj Butala |
Srikanth Upputuri |
| HADOOP-10872 |
TestPathData fails intermittently with “Mkdirs failed to create d1” |
Major |
fs |
Yongjun Zhang |
Yongjun Zhang |
| HADOOP-10890 |
TestDFVariations.testMount fails intermittently |
Major |
. |
Yongjun Zhang |
Yongjun Zhang |
| HDFS-6422 |
getfattr in CLI doesn’t throw exception or return non-0 return code when xattr doesn’t exist |
Blocker |
. |
Charles Lamb |
Charles Lamb |
| HDFS-6723 |
New NN webUI no longer displays decommissioned state for dead node |
Major |
. |
Ming Ma |
Ming Ma |
| HDFS-6696 |
Name node cannot start if the path of a file under construction contains “.snapshot” |
Blocker |
. |
Kihwal Lee |
Andrew Wang |
| HDFS-6752 |
Avoid Address bind errors in TestDatanodeConfig#testMemlockLimit |
Major |
test |
Vinayakumar B |
Vinayakumar B |
| YARN-1726 |
ResourceSchedulerWrapper broken due to AbstractYarnScheduler |
Blocker |
. |
Wei Yan |
Wei Yan |
| MAPREDUCE-6002 |
MR task should prevent report error to AM when process is shutting down |
Major |
task |
Wangda Tan |
Wangda Tan |
| HADOOP-10686 |
Writables are not always configured |
Major |
. |
Abraham Elmahrek |
Abraham Elmahrek |
| HADOOP-10910 |
Increase findbugs maxHeap size |
Blocker |
. |
Andrew Wang |
Andrew Wang |
| HDFS-6793 |
Missing changes in HftpFileSystem when Reintroduce dfs.http.port / dfs.https.port in branch-2 |
Blocker |
. |
Juan Yu |
Juan Yu |
| HADOOP-10589 |
NativeS3FileSystem throw NullPointerException when the file is empty |
Major |
fs/s3 |
shuisheng wei |
Steve Loughran |
| HADOOP-10737 |
S3n silent failure on copy, data loss on rename |
Major |
fs/s3 |
Gian Merlino |
Steve Loughran |


Candied citrus peel matchsticks recipe
by Xanthe ClayMaking your own candied peel is easy and tastes much better than supermarket versions, especially if you use really thick-skinned fruit. It’s also lovely coated in chocolate and eaten with coffee at the end of a meal. Because the flavour reminds me of Matchmakers, I dip one end in chocolate to make a “matchhead” and pack them in a large matchbox lined with greaseproof paper.
The leftover juice and syrup makes a great Christmas cordial: just mix with still or sparkling water.
One caveat: the sugar content of this peel is lower than professionally made candied peel, so it won’t last far into the new year. The strips should keep for a week.
Prep time: 25 minutes, plus overnight | Cooking time: 1 hour 25 minutes
INGREDIENTS
- 4 thick-skinned lemons, 3 oranges or 1 large pink grapefruit
- 500g granulated sugar
- 300g caster sugar
- 200g plain chocolate, chopped and melted (optional)
METHOD
- Halve the fruit and squeeze out the juice into a bowl. Keep to one side.
- Cut the peel into quarters, pulling out any of the membranes still inside, and put in a large pan. Cover generously with water, bring to the boil, simmer for 15 minutes, then drain. Repeat, this time simmering for 30 minutes.
 Drain the peel.
- Once cool enough to handle, slice the peel into long strips.
- Put the granulated sugar in a pan with 500ml water. Heat gently until the sugar dissolves, then add the peel. Bring to the boil and simmer for 30-40 minutes until the peel and white pith is translucent. Add a splash of water if the syrup is going gummy – a sign it may be about to caramelise.
- Drain away any remaining syrup (cool and mix with the juice to make cordial, and store in the fridge). Lay the peel strips on a rack over a baking sheet and leave overnight, then transfer to trays lined with baking parchment and leave to dry further.
- Once the peel is tacky rather than sticky (one day in the airing cupboard, about two at room temperature) tip it on to a baking tray and dredge with the caster sugar. Turn to coat, then shake off the excess. Dip into melted chocolate if you like, allowing it to set, and store in an airtight container.


Note: Total SD includes the base 32
not just SD earned
.
Total SD:
Traits
General Traits:
Professional Trait:
Stats and Techniques
Note: calculations assume all SD added to stats. This app does not currently take into account SD modifications from traits.
SD Earned:
SD Spent on Stats:
Fortune:
Technique Points:
Maximum Technique Rank:


This tutorial walks you through building a simple widget that listens for changes in the browser location hash and updates the content of the page. It demonstrates how to make a site Google crawlable and searchable.
We'll make a mini app that updates the contents of page with an
Ajax request when a user clicks on a navigation link. Then, we'll make this searchable
with the ajaxy/scripts/crawl.js
script.
The crawl script generates html pages that Google can use as a representation of the content of an Ajax application. Read Google's documentation on its Ajax crawling API before continuing this tutorial.
Download and install the latest version of JavaScriptMVC.
After installing JavaScriptMVC, open a command line to the steal.root folder (where you unzipped JavaScriptMVC).
We'll use the application generator to generate an application skeleton folder. Run:
js jquery/generate/app ajaxy
In the generated ajaxy folder, you'll find ajaxy.html
and ajaxy.js
. We'll add a content area
and few links to
ajaxy.html
. When we click on links,
we'll make ajaxy.js
load content into
the content area.
Change ajaxy.html
so it looks like:
<!DOCTYPE HTML>

<title>Ajaxy</title>
<meta name="fragment" content="!">

Videos
Articles
Images

Notice that the page includes a <meta name="fragment" content="!">
tag. This tells to Google to process ajaxy.html
as having Ajax content.
Next, add some content to show when these links are clicked. Put the following content in each file:
ajaxy/fixtures/articles.html

Articles

Some articles.

ajaxy/fixtures/images.html

Images

Some images.

ajaxy/fixtures/videos.html

Videos

Some videos.

Finally, change ajaxy.js
to look like:
steal('jquery/controller',
'jquery/event/hashchange',
'steal/html',function(){
$.Controller('Ajaxy',{
init : function(){
this.updateContent()
},
"{window} hashchange" : function(){
this.updateContent();
},
updateContent : function(){
var hash = window.location.hash.substr(2),
url = "fixtures/"+(hash || "videos")+".html";
// postpone reading the html
steal.html.wait();
$.get(url, {}, this.callback('replaceContent'),"text" )
},
replaceContent : function(html){
this.element.html(html);
// indicate the html is ready to be crawled
steal.html.ready();
}
})
$('#content').ajaxy();
});
When a hashchange ("{window} hashchange"
) event occurs, Ajaxy
uses the window.location.hash
value to make a
request ($.get
)
for content in thefixtures
folder.
When the content is retrieved, it replaces the element's
html (this.element.html(...)
).
Ajaxy also calls updateContent
to load content when
the page loads initially.
To crawl your site and generate google-searchable html, run:
js ajaxy/scripts/crawl.js
This script peforms the following actions:
window.location.hash
to the next index-able pageBy default, the contents are scraped immediately after the page's scripts have loaded or the window.location.hash has changed. The Ajax request for content happens asynchronously so we have to tell steal.html to wait to scrape the content.
To do this, Ajaxy calls:
steal.html.wait();
before the Ajax request. And when the page is ready, Ajaxy calls:
steal.html.ready();
If you haven't already, read up on Google's Ajax crawling API.
When google wants to crawl your site, it will send a
request to your page with _escaped_fragment=
.
When your server sees this param, redirect google to the generated html page. For example, when the Google Spider requests http://mysite.com?_escaped_fragment=val
, this is its attempt to crawl http://mysite.com#!val
. You should redirect this request to http://mysite.com/html/val.html
.
Yes, it's that easy!
By default the crawl script uses EnvJS to open your page and build a static snapshot. For some pages, EnvJS won't be powerful enough to accurately simulate everything. If your page experiences errors, you can use PhantomJS (headless Webkit) to generate snapshots instead, which may work better.
To turn on Phantom:
Open scripts/crawl.js and change the second parameter of steal.html.crawl to an options object with a browser option, like this:
steal('steal/html', function(){ steal.html.crawl("ajaxy/ajaxy.html", { out: 'ajaxy/out', browser: 'phantomjs' }) })


It's based on a jQuery autocomplete and to be honest jQuery do the main part of work. The only idea that I suggested was an approach to generate database of words that minimizes a traffic between client and server and eliminates any need of server-side computation


--- layout: post title: 2022-08-25-Family.png date: 2022-08-25 00:00:00 permalink: /assets/html/gallery/2022-08-25-Family.png.html exclude: true ---


File
New Project
New
Open
Save As
Settings
File Properties
Exit
Edit
Undo
Redo
Cut
Copy
Paste
Delete
View
Tool Windows
►
Commit
Alt+0
Project
Alt+1
Favorites
Alt+2
Problems
Alt+6
Structure
Alt+7
Services
Alt+8
Git
Alt+9
Database
Event Log
npm
Terminal
Alt+F12
TODO
Appearance
►
Enter Presentation Mode
Enter Distraction Free Mode
Enter Full Screen
Enter Zen Mode
Tool Bar
Tool Window Bar
Status Bar
Status Bar Widgets
►
Line / Column
Line Separator
File Encoding
Editor Selection Mode
Indentation
Memory Notification
JSON Schema
Git Branch
Grid Position
Navigation Bar
Members in Navigation Bar
Main Menu
Detail in Tree View
Alt+Shift+\
Zoom [{{ zoom.toFixed(1) }}]
Zoom In
100%
Zoom Out
Help
Find Action
Help
Getting Started
Keymap Reference
Demos and Screencasts
Tip of the Day
Productivity Guide
Contact Support
Submit a Bug Report
Action


Arsenal: The 5 big reasons why Unai Emery was fired
Arsenal have fired Unai Emery midway through his second season at the helm. Here are five big reasons why the Gunners pulled the plug on their head coach.
by Andrew DowdeswellOn Friday morning, Arsenal finally put their fans out of their misery and fired head coach Unai Emery. It is a decision that has been a long time coming, but after a listless 2-1 defeat to Eintracht Frankfurt in the Europa League in front of an empty Emirates Stadium on Thursday night, there was no more patience left for the seemingly helpless Emery.
Find the latest episode of the Pain in the Arsenal Podcast here — Emergency: Unai Emery sacked
But why did Arsenal finally make the decision? What led them to sack Emery? Here are the five major reasons why they said ‘goodbye and good ebening’ to the Spaniard?
5. Regression from Arsene Wenger
At the end of the 2018 season, Arsenal had confirmed their place in the Europa League for the second successive season, slipped to sixth in the Premier League, and found themselves miles behind the other elite teams in England, especially Manchester City and Liverpool.
Arsene Wenger’s final 50 games were the worst period of his tenure in north London. And yet, in Unai Emery’s first 50 games as Arsenal head coach, the Gunners were worse in almost every category imaginable. Here is just a smattering of the statistics that they regressed in under Emery:
- Wins (27 vs 25)
- Points (88 vs 87)
- Goals (96 vs 89)
- Goals conceded (64 vs 68)
- Clean sheets (18 vs 10)
- Attempts (764 vs 617)]
- Shots on target (299 vs 223)
- Chances created (582 vs 479)
- Shots faced (576 vs 696)
- Shots on target faced (210 vs 252)
- Possession (61.4% vs 57.6%)
Arsenal were worse under Emery than they were during Wenger’s worst period. That tells you everything you need to know.


<EMAIL_ADDRESS>Copyright © 2000 by Paula Valenca
Nowadays, several projects have become so complex and large that are impossible to develop and maintain as a single monolithic block. On the other hand, the ability for an application to acquire as much functionality as possible, reusing software and without accumulating functionality not needed at that moment and, thus, not wasting resources, is also becoming an important problem.
These and other problems caused some new strategies to develop, in particular, the use of plugins and components which, using some old principles of modularity and implementation facilities like shared libraries and middleware (e.g., CORBA), permit to overcome these problems in a clean and standard way.
This article presents an overview over this technology.
One of the biggest problems developers have to handle nowadays is on how to cope with the enormous size and complexity of an increasing number of current projects. It is common knowledge that from a certain point it is impossible to have the application as a monolithic block. It is necessary to divide the project in different parts, as independent as possible, so that architecting the different parts together is as easy and consistent as possible. This tends to be difficult since different teams are only familiar with their parts and the inter-communication is usually low. Also, it is very common nowadays to have a project spread in different platforms and locations.
On the other hand, it is also usually said that, if a certain functionality is needed and it is already available somewhere, one should reuse this implementation and not "reinvent the wheel". This should account also for using/developing products aside especially for a certain task instead of integrating that functionality in the main application. Besides the reusability, this also brings more flexibility and a simpler and clearer main application. For instance, consider an application which captures, evaluates and stores data where in the evaluation stage, some graphics need to be generated. There are a big number of applications that draw graphics and are probably preferred than to add "from scratch" graphics functionality to the application. But the main problem is whether the graphic program is easily integrated which, most of the times, is not the case.
Continuing on the subject of adding/changing functionality and considering the same example, imagine that the data it handles is very heterogeneous and, thus, the way this data is evaluated, for example, is different according to the type of data. When the set of the types handled is small and doesn't change and the way they are handled is also static, the final product is a bit complex but handleable. But when this is not the case several problems appear:
Flexibility and consistency. How to add/change/remove functionality in a flexible manner without compromising the consistency of the application and, preferably, not having to rebuild all the application?
Efficiency. How to do this in a way that doesn't compromise to much the efficiency, e.g., there isn't a waste of resources since most will only be used for a certain period or not even used at all in a session?
Recently, two paradigms have evolved that are especially aimed at this type of problems: Plugins and Components. These enable us to fulfil the following compilation of objectives in a clever and transparent way. It is easily seen why this two paradigms have become so popular.
Modularity is one of the keywords. How to divide an utility in different parts that obey the rules of modularity (independence, encapsulation) and interact with each other in a desired way. A special case would be to divide an utility in its main part (management) and its several branches, thus, separating functionality.
In other words, to be able to add/change/remove functionality of an utility without touching the main part. As an add-on, to be able to do that on runtime. This implies that the application shouldn't be rebuild and, further more, compiled, each time these changes take place.
The development of each part of a project should be independent from the other ones. This obliges the communication between parts to be transparent and standard. Also, each part should be able to cope with the others being in different platforms and locations. Basically, each part shouldn't have to worry about how others are implemented and located.
This means being able to embed an application A that provides a desired functionality inside an application B thus reusing code and providing a lighter and simpler application B.
An illustration of the plugin-concept: an independent application where units of software, intended to complement the functionality, can be "plugged" to.
A plugin is a unit of software intended to extend the functionality of an independent application at run-time (see Glossary). It provides several advantages, making this technology very popular among several programs that process heterogeneous data and would, otherwise, be less flexible and heavier (one of the most famous examples being Netscape that uses plugins to handle and/or view special data like audio or movies):
The functionality is added/changed/removed on runtime so that the application doesn't have to be rebuild and, furthermore, not even recompiled.
The application doesn't know the plugin beforehand ( it is the plugin's responsibility to present itself) providing wider flexibility to what functionality can be added.
It leads to a complete, clean separation from the main application and the various branches with their separate functionality. Thus we get a lighter main application focused on the essentials.
It is usually very easy for an user to add a plugin to the application.
Plugins are usually implemented as demand-loaded shared libraries. These type of libraries are only loaded on runtime as opposed to static whose code is included in the application on the compilation stage. They can be loaded in two different ways:
automatically at the start of the process and, thus, only unloaded at the end: the library must be linked at compilation stage;
by request of the program itself (using, for example, dlopen()): the code can be loaded and unloaded in the middle of the process or not even loaded at all; furthermore, the library is not linked at compilation stage;
When the library is loaded, the system checks if it is already in memory, so that, at most, one copy of the library is present in the memory.
Plugins are typically implemented as the second type since their characteristics are especially adequate for the "plug" concept. But in order to comply with the desired functionality of a plugin, the following list of requirements must be met:
The application must be independent from the plugins.
There should be a "black-box" view in both directions.
The application must not "know" the plugin beforehand; the plugin must introduce itself to the application.
The application must be loosely coupled with the plugins; a common interface to be provided by the plugins (whether total or partial) must be defined precisely (Contract).
The application should define what services are provided to the plugin via interface definitions.
A plugin must be self-contained.
A plugin should create a plugin instance to handle each task.
The interface common to all plugins is one of the critical points and, although this interface varies between technologies, the plugin should provide:
information on the type of task it can handle
a function to be called to handle that type of task (do_work())
an instance-type strategy including a structure to store all the data of a particular task and a way to know if there aren't any tasks (instances) still working so that the plugin can be unloaded
a function to initialize the plugin
Netscape (and other Web browsers) uses plugins to view/handle special data present in some Web pages, for example, audio and video.
The API is very well defined in the documentation: it contains a list of functions provided by Netscape, a list of functions the plugin must and can define and structures to be used. Since the communication is all done by this total interface, both parts act as complete "black-boxes". Another interesting characteristic is the life cycle of a plugin: Initialize(when the plugin is first called), New Instance(each time it is invoked), Destroy Instance(when a task is completed and that instance is no longer needed) and Shutdown (when all instances are destroyed).
PluginInitResult init_plugin (CommandContext *context, PluginData *pd) { FunctionCategory *cat; 5 /* The next line checks if the Gnumeric version being used corresponds to the required by the plugin */ if (plugin_version_mismatch (context, pd, GNUMERIC_VERSION)) return PLUGIN_QUIET_ERROR; 10 cat = function_get_category (_("Fact PlugIn")); function_add_args (cat, "MyFactorial", "f", "number", NULL, func_fact); pd->can_unload = can_unload; 15 pd->cleanup_plugin = cleanup_plugin; pd->title = g_strdup ("My PlugIn Plugin"); return PLUGIN_OK; } |
The program listing above is part of a Gnumeric plugin source code. Gnumeric uses plugins both to handle different formats (e.g., Excel) and add functions not defined (statistical, numerical,...). The API the plugin must define is very concise and partial: the plugin registers the new functions it defines (in lines 11-12, the plugin is registering a function, in this example, the factorial function). The init_plugin() function is called at start-up. Besides registering the functions it also provides information on the Plugin (in this case, the title) and functionality to unload the plugin (e.g., check if there aren't any instances left). Although Gnumeric plugins are not the best example, since the requirements above are not completely met (Gnumeric is completely transparent to the plugin) it provides a very simple example with most of the core ideas.
An illustration of the use of components
There isn't much consensus on what constitutes a component. Although this is not complete and may seem to general we can say that a component is a unit of software with the following characteristics:
It is an indivisible unit of independent deployment . The component must be independent from the environment and other components and, so, has to encapsulate it's features. It also can't be partially deployed since it constitutes an whole.
It is a unit of third-party composition. A party exterior to at least one component must be able to compose them together. The component has to be self-contained, interface hiding and provide a well defined interface
Has no persistent state. This way, any copy of a component won't differ from the original so that, at most, one copy of the component is present.
A typical use is in big, complex and heterogeneous projects divided in different parts, each with its particular function and interacting with other parts of the project, being developed by different teams and where each part doesn't want to know how the other parts are implemented or where they are located. Basically, each part constitutes a component. An interface contract for each component is established and interaction is done through these interfaces.
Another example can be found in desktop environments. Imagine a user writing a document or a web page where he wants to integrate a graphic. Putting graphics functionality in the word processor or web page editor would be overloading them (how about audio, movie, barcharts...?). Doing it outside and importing as an image is also not the best solution. But if there is already a mechanism for handling that functionality why not reuse it? Basically, the idea is to "embed" the graphics mechanism in the word processor or web page editor (something like: "when handling this data use this particular mechanism"). But to have a good interaction between mechanisms we need independence, interface contracts and again components appear as a good solution for this.
The key aspects in component-based development are [1] :
Standardised parts and services (both through the standardisation of components and the environment in which they operate.)
Minimal or no contact between entities designing components; decoupling of development efforts.
Access to practical (re)use both internal and external through standardised interoperability, configurability, and deployment.
Independent variability through documentation of components 'seams' (the interfaces used and exposed).
Source code for custom needs; binary components for standard needs.
A strict emphasis on component assembly first; manual coding second.
A robust mechanism for the delivery of architectures, frameworks, and services.
But to conform with this characteristics it is necessary to complement the definition above with a list of requirements that must be met[1][2]:
A component must be loosely coupled with other components via interface definitions and implementation separation.
A component must explicitly identify both the interfaces it uses and exposes, and/or the service categories it uses and exposes.
A component has an unbreakable contract with all of its clients by virtue of the services its interface promises to deliver (design by contract).
A component must be deliverable in binary form (black box).
A component must use and expose services through standardised middleware services (DCOM, CORBA, JavaBeans, etc.)
A component must be configurable at design-time/run-time through a standardised interface (such as ActiveX and JavaBeans property sheets or standard configuration files).
A component must be interoperable with other components across processes, machines, networks, languages, operating systems, transaction environments, and tools.
A component should make use of standardised infrastructure services such as security, licensing, versioning, life-cycle management, visual assembly, event notification, configuration, scripting, metadata, introspection, persistence, relationships, administration, management, debugging, and installation.
A component should be able to wire itself into a collaboration with other components solely via design-time/run-time configuration.
One of the keywords in component-based technology is middleware. Middleware is now a very popular term and is basically used to refer to software "that sits in the middle, connecting diverse (and usually preexisting) programs together". In other words, a separate product that acts as a glue between two applications.
A request passing from client to object implementation (from the OMG documentation)
CORBA is one of the most popular architecture and specification for creating software components. It provides the functionality required as middleware. CORBA stands for Common Object Request Broker Architecture and is defined by OMG. Its building blocks are:
OMG Interface Definition Language, OMG IDL which defines mappings for a variety of different languages and which purpose is to abstract from the language being used to implement the component so that they all have a common language.
The Object Request Broker or ORB which handles requests from programs to components and between components enabling abstraction of where the program that receives the request and the one sending are.
The standard protocol IIOP which provides a standard communication between different ORBs above TCP/IP.
CORBA provides, with these building blocks, independence of language and independence of platform.
As an example, GNOME implemented BONOBO in order to comply with interoperability between different applications in the desktop (e.g, embed a graphics object in a word processor document). BONOBO is basically a set of CORBA interfaces and an implementation in GNOME/GTK+ of these interfaces that are designed to be simple to use and hide CORBA and between-components protocol used. An application uses these interfaces to export its functionality or integrate other components functionality making it possible to edit a graphic or even play GnoMines in a spreadsheet.
When developing either plugins or components, some requirements must be met to obtain all the functionality provided by these two paradigms[3].
It may seem that some of this requirements are, sometimes, dispensable. For example, why use strategies like CORBA when it doesn't seem to be necessary? The problem is that, if we want to make use of the benefits that this technology enables, not complying with just one of the requirements will make the plugin/component-strategy less robust and flexible. In this example, if later on there would be a need to have different platforms, for example, wrappers would have to be written to do the work this technology is responsible for.
These technologies are very different and each has it's advantages and disadvantages as also having different scopes. If it is the right choice to use one of them or which one to use depends on the project. Nevertheless there are some common keywords that pop out:
Modularity
Encapsulation
Interface contracts
Finally, please note that
It was the purpose of this article to present only an overview on this interesting and popular technology. Please refer to http://wwwinfo.cern.ch/pdp/ose/plcomp00/ for a more detailed study, specially regarding the pros and cons, why the above requirements are needed and more focus on implementation issues. |
A unit of software whose purpose is to extend the functionality of an independent application at run-time. The application has no prior knowledge of the plugin; plugin must act as a "black-box" and present itself by means of a standard interface.
A component is an indivisible unit of independent deployment.
A component is a unit of third-party composition.
A component has no persistent state.
a block of code, loaded on request, providing data types and procedures.
A popular and generic term basically used to refer to software "that sits in the middle, connecting diverse (and usually preexisting) programs together". In other words, a separate product that acts as a glue between two applications.
| [1] | Based on [Components: Where are They?] and [Components and Objects Together]. Please refer to the documentation mentioned at Some remarks. |
| [2] | The last two items are desirable but not essential. They are also very hard to comply. |
| [3] | Some may not agree with the lists presented above, of course. |


SHOP.BRD.COM
BRD Snapback Trucker Cap
cotton/polyester
Snapback closure
Quantity:
$27
BRD Pink T-Shirt
100% cotton
Unisex sizing
Quantity:
$27
BRD Soft Shell Jacket
polyester/spandex
water-resistant
Quantity:
$130
Summary
Subtotal
$0
Discount
$0
Shipping
$0
Total
$0
Pay with
Modal title
×


A question on noodles
I ran across an interesting question yesterday, and I figured that if any people in the world knew the answer, the assembled KKC collective probably did.
Is there an easier way to eat noodles?
My girlfriend has some problems with her wrists, and hence finds eating noodles with a fork rather hard work.

I’ve suggested chopsticks, which I personally much prefer for anything noodley, but does anyone have any other/wierder suggestions?


lym
UI
Home
Elements
Magazine
Index
Article
Article - Image
Archive
Lym.io Magazine
Vivamus sem ipsum, interdum sed est sit amet, egestas accumsan nisi.
Nullam laoreet libero.
In International News
by
John Doe
12
302
Vel elit curabitur cras lobortis sociosqu sociis ut magna
In International News
by
John Doe
12
302
Finibus
In International News
by
John Doe
12
302
Vestibulum
In International News
by
John Doe
12
302
Nulla elit
In International News
by
John Doe
12
302
Eu pharetra consequat gravida lectus nunc.
In International News
by
John Doe
12
302
Sit suspendisse lectus ipsum id arcu.
In International News
by
John Doe
12
302
Older
Newer


Bitcoin Core activity 2019-2020
-
Among the more active contributors in code review and
commits since beginning to contribute in March 2019.
$ git log --since=2019-03-15 --until=2020-04-20 --no-merges | grep '^Author' | sort | uniq -c | sort -nr | head -n 10 1. 407 Author: MarcoFalke 2. 172 Author: practicalswift 3. 157 Author: fanquake 4. 157 Author: Hennadii Stepanov 5. 143 Author: Andrew Chow 6. 99 Author: Jon Atack 7. 92 Author: John Newbery 8. 85 Author: Russell Yanofsky 9. 81 Author: Pieter Wuille 10. 78 Author: João Barbosa
- #27 all-time of the Bitcoin Core contributors with 99 commits merged into Bitcoin Core and a primary focus on code review.
- Invited to join the Bitcoin and Bitcoin Core teams in November 2019 after 7 months of contributing.
- Recipient of a Square Crypto 2020 Bitcoin Core developer grant.
- Invited to CoreDev in March 2020 in San Francisco.
What i have been working on
- Contributing to Bitcoin Core via code review, testing, bug discovery, fixes, features, and verifying gitian signatures for each release.
- Contributing to the Bitcoin Core PR Review Club with John Newbery, regularly hosting meetings, and creating and co-running the BitcoinCorePRs twitter account.
- Weekly review for Bitcoin Optech.
- Publishing Bitcoin Core technical and social process information in jonatack/bitcoin-development, a resource which was relayed in a September 2019 article in Bitcoin Magazine.
Future work
- Continuing and deeper code review, notably of the difficult and important PRs. This is the most-needed work and bottleneck in Bitcoin Core development.
- Working to improve Bitcoin Core's robustness: finding and fixing bugs and regressions and improving test coverage.
- Working to strengthen Bitcoin Core's decentralization, censorship resistance, and privacy.
- Improving the Bitcoin Core wallet features and RPC/CLI interface.
- Investing in developer education via the Bitcoin Core PR Review Club and continued review/work for Bitcoin Optech.
- Continuing to publish Bitcoin Core technical and social process information in jonatack/bitcoin-development and here on this website.
- Much longer term, possibly evolving to general maintainership.
I began programming at age 9 in BASIC and assembly language. From age 14 to 18, I wrote several professional games in assembly for Atari and Commodore computers that were internationally published and widely known.
I studied Computer Science at Harvey Mudd College in Claremont, California (USA), Business Administration and French at Oregon State University, followed by an MBA at INSEAD in Fontainebleau, France. In addition to software engineering, I have 2 years of marketing brand management experience in mass consumer products at L'Oréal from their world headquarters in Paris. I speak English, French, and German.
Over the past decade I have been a freelance software engineer for large companies and an open source contributor (Ruby on Rails Top 100) and library author/maintainer, notably of Ransack, the leading Ruby search engine, but also of Kraken Ruby Client, an API client for the Kraken cryptocurrency exchange featured in the Kraken API documentation.
In March 2019, I started learning to contribute to Bitcoin Core, beginning with studying the repository and the social process and technical details of contributing to the project. I've been compiling and curating this knowledge at https://github.com/jonatack/bitcoin-development, which is frequently recommended to other developers like in this Bitcoin Magazine September 2019 article and is becoming an educational resource.
It became clear that what is most needed and useful, and paradoxically the least done by new contributors, is review and testing of PRs and issues. More than 350 pull requests and 750 issues are open at any given moment in Bitcoin Core waiting for experienced review and testing, and the amount continues to increase. The maintainers need help!
I quickly became an active reviewer and contributor to:
- Bitcoin Core
- Bitcoin Optech
- Bitcoin Core PR Review Club, co-maintaining and collaborating with John Newbery to improve the codebase and website, hosting meetings, and creating and running the @BitcoinCorePRs twitter account
In early June 2019, thanks to John Newbery and Adam Jonas, I was invited to attend the Chaincode Labs summer residency Bitcoin seminars. I spent 2 weeks in the Chaincode Labs office in Manhattan learning about Bitcoin and meeting developers and the summer residents — an amazing experience.
Opening pull requests has not been a priority of mine. Yet, as a by-product of reviewing, finding issues, seeing what needs to be done, and understanding how to make contributions easy to review, I have had 99 commits merged into Bitcoin Core. I am #27 of the all-time contributors and one of the more active ones currently.
I plan to prioritise my time to Bitcoin roughly as follows:
Robustness > Privacy > Features > Scaling > UI
Robustness and privacy/censorship resistance are therefore my highest priorities.
Goals
-
Dedicating time to review of the important, critical PRs
that often sit for months without enough review to be merged
and have to go through multiple painful rebases, which blocks
vital progress and demotivates experienced long-term
contributors from working on Bitcoin Core.
The number one bottleneck in Bitcoin Core is experienced review of difficult PRs. As Steve Lee of Square Crypto once wrote to me: "If literally all a developer did was review hard but important PRs it'd be incredibly valuable."
- The idea is to unblock these critical PRs not only by reviewing them, but also coordinating with the maintainers and other contributors to ensure timely review where it is most needed and difficult.
- Reviewing also means continuing to find and fix regressions and bugs throughout Bitcoin Core to make it more robust.
- Increasing Bitcoin Core's robustness: finding and fixing regressions and bugs, and adding missing test coverage and better testing. Robustness can also mean working on codebase performance, modularity and multiprocess.
- Improving the Bitcoin Core wallet features and RPC/CLI interface.
- Strengthening Bitcoin Core's decentralization, censorship resistance and privacy by working on the peer-to-peer network privacy and resistance to surveillance and attacks: researching and proposing improvements, and collaborating with and testing work by fellow developers and researchers.
-
Investing in developer education and awareness of
code review via the Bitcoin Core PR Review Club, and
continued review and writing for Bitcoin Optech:
- Co-maintain and develop the Bitcoin Core PR Review Club website and activity with John Newbery.
- Host Bitcoin Core PR Review Club meetings.
- Develop a backend for the BitcoinCorePRs twitter account to live-tweet Bitcoin Core reviews, high-priority PR updates, and publish monthly rankings of the most active Bitcoin Core reviewers.
- Continue reviewing and writing for Bitcoin Optech newsletters and perhaps other actions to help Dave Harding, John Newbery, Steve Lee, Adam Jonas, and Mike Schmidt.
- Continuing to publish Bitcoin Core technical and social process information in jonatack/bitcoin-development and here on this website.
- Longer term, possibly evolving towards a maintainer role in Bitcoin Core. It fits my experience and open source service perspective, there will always be a need, and it takes years to cultivate a maintainer in a project like this.
Don't hesitate to ask any of the following people about me:
- John Newbery, Chaincode Labs and Bitcoin Optech
- Steve Lee, Square Crypto
- Miles Suter, Square
- Wladimir van der Laan, Bitcoin Core maintainer
- Jonas Schnelli, Bitcoin Core maintainer
- Samuel Dobson (meshcollider), Bitcoin Core maintainer
- Michael Ford (fanquake), Bitcoin Core maintainer
- practicalswift, Bitcoin Core developer — endorsement :)
- Gleb Naumenko, Chaincode Labs
- Mike Schmidt, Bitcoin Optech
- João Barbosa (promag), Bitcoin Core developer
- Andrew Chow (achow101), Blockstream
Feel free to reach out for more details or to chat.
Jon


|
Note
|
More to Come
Please keep checking this section frequently
for this space for more information.
|
Pre-requisites
Hardware
The trainees are expected to have Macbooks(preferably) or Windows based machine with the required software list as listed in the below section.
Software
The softwares that are needed for development/qa are listed below:
| Application Name | Version |
|---|---|
Java |
1.8.0_73 or higher |
Maven |
3.3.9 |
Lombok |
1.16.18 |
NodeJs |
Latest |
STS |
3.7.3.RELEASE or higher |
VS Code |
1.14.2 or higher |
Docker |
Docker CE 17.06 |
Robo 3T |
latest (1.0) |
Kitematic |
v0.17.1 |
Chrome |
latest |
Advanced Rest Client |
<IP_ADDRESS>5-stable |
| Application Name | Version |
|---|---|
Java |
1.8.0_73 or higher |
Maven |
3.3.9 |
Eclipse |
4.7.0 |
Firefox |
latest |
Chrome |
latest |
|
Note
|
Windows Machine Instructions
If you are using Windows machine please follow the below link to set up
https://confluence.anthem.com/display/TAIGROUP/Tools+and+Install+Instructions+-+Tutorials+for+Installing+the+Various+Tools+Required+for+Developing+and+Testing+Nimbus
The training application is not verified on the windows environment yet.
|
|
Note
|
Pre-requisite
Please ensure that the below steps are done before the workshop - https://confluence.anthem.com/display/NIM/Connect+to+AWS+CLI+to+pull+nimbus+docker+images – Follow this link to be able to access AWS
|
PLEASE MAKE SURE THAT YOU HAVE DOCKER AND THE FOLLOWING IMAGES DOWNLOADED OFF THE VPN
Structure
The framework can be used to churn out different applications based on the client needs. Be it a simple hello world app or a workflow based petclinic application, nimbus framework enables an individual/team to build application quickly.
Hello World App
As the above diagram shows that multiple applications can be developed quickly using the nimbus framework, lets have a hands on how to build a hello world app using the framework.
Application setup and configuration demo
-
How to configure an application
-
What dependencies are there to run an application
-
Time it takes to build applications vs the traditional application development
Please follow the link Getting started to get started.
Technical Architecture overview
Objective
Understand the underlying framework architecture and technology stack
Content
Domain Model - For any application we first have to define the business entity/entities. This would be the first step in the process of building the product.
Config - Once we have the domain model, we can define the configuration for the view, workflow and the rules. The view definition configs, the mapping to the domain model, the workflow(if any) and the corresponding view and core domain rules can be written.
Command - The command is the instruction that the framework understands to execute and come back with an output. It is similar to writing the traditional method calls for button click to do some business logic but just that we have standardized the process of writing such to the domain specific language that the framework understands.
State - The value of every entity and its corresponding attributes is referred to as state by the framework. There could various events for example generated based on the state and certain other things associated with the state. To get the history of changes that happened on an entity attribute, we would need audit to be enabled.
Configuration
-
Business Entity configuration (Refer to Entity Configuration)
-
View configuration (Refer to View Configuration)
-
Business Rule configuration (Refer to Business Rule Configuration)
-
Workflow Configuration (Refer to BPM Configuration)
Command
-
Query DSL: The framework processes information using url. The url is based on a query dsl structure. It consists of two parts;
-
Target application identifier: Anything prior to /p identifies the application associated with the request
-
Domain identifier: Anything post /p identifies the domain for which the request is to be processed.
-
Action
-
-
_new: Creates a new instance for the model
-
_get: Fetches the instance of the model referenced by the Id
-
_save: Saves the model into the database
-
_replace: Replaces the model state
-
_update: Updates the model state
-
_remove: Removes the model from the database
-
_search: Searches the model based on a search criteria
-
_process: Executes asigned workflow process or custom hanlders
Framework Tech Stack
The framework is primarily having 2 main components -
FrontEnd - Built using Angular 4, RxJs, SASS.
BackEnd - Built using Spring framework components, Activiti, Drools, Query DSL, RxJava
Product Tech Stack
Cross Cutting concerns
Quad Model
Wrap Up
-
Providing the ability to build application through configuration.
-
Providing boilerplate code for cross cutting concerns.
Requirement Documentation
Requirement Documentation Standards
Building an Application - Pet Clinic
The objective of this topic is to provide an overview of the different steps involved in building an application. A Pet Clinic application is being configured using Nimbus.
Exercise 1
The purpose of this exercise is to have the petclinic shell application running
Step 1
Run docker software
Step 2
-
Run the command in terminal or use STS to clone the project:
using ssh - ssh://git@bitbucket.anthem.com:7999/nim/petclinic-training.git
Step 3
Import the pet-clinic extension project into STS JavaEE perspective
Step 4
-
Run maven build. Right click on project → RunAs → Maven build →enter goals : clean install and enable check box Skip Tests
This will download the configuration project for the complete pet-clinic app
This should create a jar file in Users/<YOURUSERID>/Documents/clientextensions/com.anthem.nimbus.platform.client.extension.petclinic-1.0.0.M4-SNAPSHOT.jar
Step 5
GOTO terminal and navigate to the directory where you have cloned the petclinic-training
-
If you have issues with the certificates please follow the steps in the below link - https://confluence.anthem.com/pages/viewpage.action?pageId=67994899
Step 6
Follow the readme.md doc inside the petclinic-training to run the required scripts for bringing up the dependent docker container
You should now be able to see all the containers running in Kitematic as shown below -
Step 7
As a verification please check if the com.anthem.nimbus.platform.client.extension.petclinic-1.0.0.M4-SNAPSHOT.jar is created in the below path
/Users/<YOURUSERID>/Documents/clientextensions/
-
Please make sure that no other jars are there in the above mentioned location
Step 8
Rebuild and deploy the web using the script sh dev-script-p-core-all-petclinic-start.sh (Please run this command whenever you make changes to the petclinic configuration project)
Step 9
Please wait until the platform-web container is started. Open Kitematic software and hit command+R(Mac instruction) to refresh the list of containers.
In the logs you should see - * Platform-web ** Started !!
Step 10
-
Launch the app with the url localhost:9090/ui/
-
Login with the credetials - training/training
-
Submit on clicking the approve radio options on the next page
-
After the above steps the dashboard page is rendered on the browser.
-
How to set up the code and the required dependencies
-
Run the code and check the output
Exercise 2
The purpose of this exercise is to develop the business entity Owner
Step 1
Craete an owner business entity
package com.anthem.nimbus.platform.client.extension.petclinic.model;
import com.anthem.oss.nimbus.core.domain.definition.Domain;
import com.anthem.oss.nimbus.core.domain.definition.Domain.ListenerType;
import com.anthem.oss.nimbus.core.domain.definition.Repo;
import com.anthem.oss.nimbus.core.domain.definition.Repo.Cache;
import com.anthem.oss.nimbus.core.domain.definition.Repo.Database;
import com.anthem.oss.nimbus.core.entity.AbstractEntity.IdString;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Domain(value="owner", includeListeners={ListenerType.persistence, ListenerType.update})
@Repo(value=Database.rep_mongodb, cache=Cache.rep_device)
@Getter @Setter @ToString(callSuper=true)
public class Owner extends IdString {
private static final long serialVersionUID = 1L;
private String firstName;
private String lastName;
private String address;
private String city;
private String telephone;
}
-
How to create a business entity
-
Understand the core config annotations
Exercise 3
The purpose of this exercise is to develop the view page definition for owner flow
Step 1
Create the view root entity for owner business flow landing page
package com.anthem.nimbus.platform.client.extension.petclinic.view;
import java.util.List;
import javax.validation.constraints.NotNull;
import com.anthem.nimbus.platform.client.extension.petclinic.model.Owner;
import com.anthem.nimbus.platform.client.extension.petclinic.model.OwnerLineItem;
import com.anthem.oss.nimbus.core.domain.definition.Domain;
import com.anthem.oss.nimbus.core.domain.definition.Domain.ListenerType;
import com.anthem.oss.nimbus.core.domain.definition.Execution.Config;
import com.anthem.oss.nimbus.core.domain.definition.Executions.Configs;
import com.anthem.oss.nimbus.core.domain.definition.MapsTo;
import com.anthem.oss.nimbus.core.domain.definition.MapsTo.Path;
import com.anthem.oss.nimbus.core.domain.definition.Model;
import com.anthem.oss.nimbus.core.domain.definition.Repo;
import com.anthem.oss.nimbus.core.domain.definition.ViewConfig.Button;
import com.anthem.oss.nimbus.core.domain.definition.ViewConfig.ButtonGroup;
import com.anthem.oss.nimbus.core.domain.definition.ViewConfig.Form;
import com.anthem.oss.nimbus.core.domain.definition.ViewConfig.Grid;
import com.anthem.oss.nimbus.core.domain.definition.ViewConfig.Page;
import com.anthem.oss.nimbus.core.domain.definition.ViewConfig.Section;
import com.anthem.oss.nimbus.core.domain.definition.ViewConfig.TextBox;
import com.anthem.oss.nimbus.core.domain.definition.ViewConfig.Tile;
import lombok.Getter;
import lombok.Setter;
@Domain(value = "ownerlandingview", includeListeners = {ListenerType.websocket})
@Repo(value=Repo.Database.rep_none,cache=Repo.Cache.rep_device)
@Getter @Setter
public class VROwnerLanding {
@Page(defaultPage=true, layout="home")
private VPOwners vpOwners;
@Model
@Getter @Setter
public static class VPOwners {
@Tile(title = "OWNERS", imgSrc = "resources/icons/task.svg#Layer_1", size = Tile.Size.Medium)
private VTOwners vtOwners;
}
@Model
@Getter @Setter
public static class VTOwners {
@Section
private VSSearchOwnerCriteria vsSearchOwnerCriteria;
@Section
private VSOwners vsOwners;
}
@Model
@Getter @Setter
public static class VSSearchOwnerCriteria {
@Form(cssClass="twoColumn")
@Path(linked=false)
private VFSearchOwnerCriteria vfSearchOwnerCriteria;
}
@Model
@MapsTo.Type(Owner.class)
@Getter @Setter
public static class VFSearchOwnerCriteria {
@Path @TextBox @NotNull private String firstName;
@Path @TextBox private String lastName;
@ButtonGroup
private VBGSearchOwner vbgSearchOwner;
}
@Model
@Getter @Setter
public static class VBGSearchOwner {
@Configs({
@Config(url="/vpOwners/vtOwners/vsSearchOwnerCriteria/vfSearchOwnerCriteria/_update"),
@Config(url="/vpOwners/vtOwners/vsOwners/owners.m/_process?fn=_set&url=/p/owner/_search?fn=example")
})
@Button(style=Button.Style.PRIMARY,type=Button.Type.submit)
private String search;
@Configs({
@Config(url="/p/ownerview/_new")
})
@Button(imgSrc = "add.svg", cssClass ="btn btn-icon green")
private String addOwner;
}
@Model
@Getter @Setter
public static class VSOwners {
@MapsTo.Path(linked=false)
@Config(url="/p/ownerlandingview/vpOwners/vtOwners/vsOwners/owners.m/_process?fn=_set&url=/p/owner/_search?fn=example")
@Grid(onLoad=true, isTransient = true, pageSize = "7")
private List<OwnerLineItem> owners;
}
}
Step 2
Create OwnerLineItem.java grid view model entity
package com.anthem.nimbus.platform.client.extension.petclinic.model;
import com.anthem.oss.nimbus.core.domain.definition.Execution.Config;
import com.anthem.oss.nimbus.core.domain.definition.Executions.Configs;
import com.anthem.oss.nimbus.core.domain.definition.MapsTo;
import com.anthem.oss.nimbus.core.domain.definition.MapsTo.Path;
import com.anthem.oss.nimbus.core.domain.definition.ViewConfig.GridColumn;
import com.anthem.oss.nimbus.core.domain.definition.ViewConfig.Link;
import lombok.Getter;
import lombok.Setter;
@MapsTo.Type(Owner.class)
@Getter @Setter
public class OwnerLineItem {
@Path @GridColumn(hidden=true) private String id;
@Path private String firstName;
@Path private String lastName;
@Path("city") private String ownerCity;
@Path private String telephone;
@Config(url="/p/ownerview:<!/id!>/_get")
@Link(imgSrc="edit.png") private String edit;
@Configs({
@Config(url="/p/ownerview:<!/id!>/_get"),
@Config(url="/p/ownerview:<!/id!>/_nav?pageId=vpOwnerInfo")
})
@Link(imgSrc="task.svg") private String ownerInfo;
}
Step 3
Restart the web container and navigate to localhost:9090/ui/ in a new browser session to see the changes.
-
How to create a view root definition and the corresponding pages
-
Understand the view config annotations
Exercise 4
Step 1
Create the view root entity for add/edit an owner
package com.anthem.nimbus.platform.client.extension.petclinic.view;
import javax.validation.constraints.NotNull;
import com.anthem.nimbus.platform.client.extension.petclinic.model.Owner;
import com.anthem.oss.nimbus.core.domain.definition.Domain;
import com.anthem.oss.nimbus.core.domain.definition.Domain.ListenerType;
import com.anthem.oss.nimbus.core.domain.definition.Execution.Config;
import com.anthem.oss.nimbus.core.domain.definition.Executions.Configs;
import com.anthem.oss.nimbus.core.domain.definition.MapsTo;
import com.anthem.oss.nimbus.core.domain.definition.MapsTo.Path;
import com.anthem.oss.nimbus.core.domain.definition.MapsTo.Type;
import com.anthem.oss.nimbus.core.domain.definition.Model;
import com.anthem.oss.nimbus.core.domain.definition.Repo;
import com.anthem.oss.nimbus.core.domain.definition.ViewConfig.Button;
import com.anthem.oss.nimbus.core.domain.definition.ViewConfig.ButtonGroup;
import com.anthem.oss.nimbus.core.domain.definition.ViewConfig.Form;
import com.anthem.oss.nimbus.core.domain.definition.ViewConfig.Header;
import com.anthem.oss.nimbus.core.domain.definition.ViewConfig.Page;
import com.anthem.oss.nimbus.core.domain.definition.ViewConfig.Section;
import com.anthem.oss.nimbus.core.domain.definition.ViewConfig.TextBox;
import com.anthem.oss.nimbus.core.domain.definition.ViewConfig.Tile;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Domain(value = "ownerview", includeListeners = {ListenerType.websocket})
@MapsTo.Type(Owner.class)
@Repo(value=Repo.Database.rep_none,cache=Repo.Cache.rep_device)
@Getter @Setter @ToString(callSuper=true)
public class VROwner {
@Page(route="ownerview",defaultPage=true)
private VPAddEditOwner vpAddEditOwner;
@Page(route="ownerview")
private VPOwnerInfo vpOwnerInfo;
@MapsTo.Type(Owner.class)
@Getter @Setter
public static class VPAddEditOwner {
@Tile(size = Tile.Size.Large)
private VTAddEditOwner vtAddEditOwner;
}
@Model
@Getter @Setter
public static class VTAddEditOwner {
@Header(size=Header.Size.H3)
private String addOwnerHeader;
@Header(size=Header.Size.H3)
private String editOwnerHeader;
@Section
private VSAddEditOwner vsAddEditOwner;
}
@Model
@Getter @Setter
public static class VSAddEditOwner {
@Form(cssClass="twoColumn")
private VFAddEditOwner vfAddEditOwner;
}
@Type(Owner.class)
@Getter @Setter
public static class VFAddEditOwner {
@ButtonGroup(cssClass="text-sm-right pt-2 pb-2")
private VBGAddOwnerButtonGrp vbgAddOwnerButtonGrp;
@Path @TextBox @NotNull private String firstName;
@Path @TextBox @NotNull private String lastName;
@Path @TextBox private String address;
@Path @TextBox @NotNull private String city;
@Path @TextBox @NotNull private String telephone;
}
@Model
@Getter @Setter
public static class VBGAddOwnerButtonGrp {
@Configs({
@Config(url="/vpAddEditOwner/vtAddEditOwner/vsAddEditOwner/vfAddEditOwner/_update"),
@Config(url="/p/ownerlandingview/_nav?pageId=vpOwners")
})
@Button(style = Button.Style.PRIMARY,type=Button.Type.submit)
private String submit;
@Configs({
@Config(url="/vpAddEditOwner/vtAddEditOwner/vsAddEditOwner/vfAddEditOwner/_update"),
@Config(url="/vpAddEditOwner/vtAddEditOwner/vsAddEditOwner/vfAddEditOwner/_nav?pageId=vpOwnerInfo")
})
@Button(style = Button.Style.PRIMARY,type=Button.Type.submit)
private String update;
@Config(url="/p/ownerlandingview/_nav?pageId=vpOwners")
@Button(style = Button.Style.PLAIN,type = Button.Type.reset)
private String cancel;
}
}
Step 2
Create the view page definition of owner information
package com.anthem.nimbus.platform.client.extension.petclinic.view;
import java.util.List;
import com.anthem.nimbus.platform.client.extension.petclinic.model.Owner;
import com.anthem.nimbus.platform.client.extension.petclinic.model.PetLineItem;
import com.anthem.oss.nimbus.core.domain.definition.Execution.Config;
import com.anthem.oss.nimbus.core.domain.definition.Executions.Configs;
import com.anthem.oss.nimbus.core.domain.definition.MapsTo.Path;
import com.anthem.oss.nimbus.core.domain.definition.MapsTo.Type;
import com.anthem.oss.nimbus.core.domain.definition.Model;
import com.anthem.oss.nimbus.core.domain.definition.ViewConfig.Button;
import com.anthem.oss.nimbus.core.domain.definition.ViewConfig.CardDetail;
import com.anthem.oss.nimbus.core.domain.definition.ViewConfig.FieldValue;
import com.anthem.oss.nimbus.core.domain.definition.ViewConfig.Grid;
import com.anthem.oss.nimbus.core.domain.definition.ViewConfig.Section;
import com.anthem.oss.nimbus.core.domain.definition.ViewConfig.Tile;
import lombok.Getter;
import lombok.Setter;
@Model
@Getter @Setter
public class VPOwnerInfo {
@Tile(title="OWNER INFO ", imgSrc="resources/icons/careplan.svg#Layer_1", size=Tile.Size.Large)
private VTOwnerInfo vtOwnerInfo;
@Model
@Getter @Setter
public static class VTOwnerInfo {
@Section
private VSOwnerInfo vsOwnerInfo;
@Section(cssClass="contentBox bg-lightest")
private VSPets vsPets;
}
@Model
@Getter @Setter
public static class VSOwnerInfo {
@CardDetail(cssClass="contentBox right-gutter bg-alternate mt-0")
private VCDOwnerInfo vcdOwnerInfo;
}
@Model
@Getter @Setter
public static class VCDOwnerInfo {
@CardDetail.Body
private VCDBOwner vcdbOwner;
}
@Type(Owner.class)
@Getter @Setter
public static class VCDBOwner {
@Path @FieldValue(cols="2") private String firstName;
@Path @FieldValue private String lastName;
@FieldValue(type=FieldValue.Type.Divider)
private String divider2;
@Path @FieldValue private String address;
@Path @FieldValue private String city;
@Path @FieldValue private String telephone;
}
@Model
@Getter @Setter
public static class VSPets {
}
}
//created on: Aug 10, 2017
package com.anthem.nimbus.platform.client.extension.petclinic
import com.anthem.oss.nimbus.core.domain.model.state.EntityState.Param;
rule "Show/Hide buttons in edit flow"
when
$param: Param($param.findParamByPath("/vpAddEditOwner/vtAddEditOwner/vsAddEditOwner/vfAddEditOwner/firstName").getState() != null)
then
$param.findParamByPath("/vpAddEditOwner/vtAddEditOwner/addOwnerHeader/#/visible").setState(false);
$param.findParamByPath("/vpAddEditOwner/vtAddEditOwner/editOwnerHeader/#/visible").setState(true);
$param.findParamByPath("/vpAddEditOwner/vtAddEditOwner/vsAddEditOwner/vfAddEditOwner/vbgAddOwnerButtonGrp/submit/#/visible").setState(false);
$param.findParamByPath("/vpAddEditOwner/vtAddEditOwner/vsAddEditOwner/vfAddEditOwner/vbgAddOwnerButtonGrp/update/#/visible").setState(true);
end
rule "Show/Hide buttons in create flow"
when
$param: Param($param.findParamByPath("/vpAddEditOwner/vtAddEditOwner/vsAddEditOwner/vfAddEditOwner/firstName").getState() == null)
then
$param.findParamByPath("/vpAddEditOwner/vtAddEditOwner/addOwnerHeader/#/visible").setState(true);
$param.findParamByPath("/vpAddEditOwner/vtAddEditOwner/editOwnerHeader/#/visible").setState(false);
$param.findParamByPath("/vpAddEditOwner/vtAddEditOwner/vsAddEditOwner/vfAddEditOwner/vbgAddOwnerButtonGrp/submit/#/visible").setState(true);
$param.findParamByPath("/vpAddEditOwner/vtAddEditOwner/vsAddEditOwner/vfAddEditOwner/vbgAddOwnerButtonGrp/update/#/visible").setState(false);
end
Step 3
Restart the web container and navigate to localhost:9090/ui/ in a new browser session to see the changes.
-
How to achieve a create/update of an entity using a form
-
Understand execution config annotation and dsl
Exercise 5
Step 1
Create a view page definition for add/edit of a pet
In the VPOwnerInfo.java class that was created previously please add the following code in the VSPets class section
@Model
@Getter @Setter
public static class VSPets {
@Configs({
@Config(url="/p/petview/_new?fn=_initEntity&target=/.m/ownerId&json=\"<!/.m/id!>\"")
})
@Button(imgSrc = "add.svg", cssClass ="btn btn-icon green")
private String addPet;
@Path(linked=false)
@Config(url="/vpOwnerInfo/vtOwnerInfo/vsPets/pets.m/_process?fn=_set&url=/p/pet/_search?fn=query&where=pet.ownerId.eq('<!/.m/id!>')")
@Grid(onLoad=true, isTransient = true, pageSize = "7")
private List<PetLineItem> pets;
}
}
Step 2
Create the PetLineItem grid view model definition
package com.anthem.nimbus.platform.client.extension.petclinic.model;
import java.time.LocalDate;
import com.anthem.oss.nimbus.core.domain.definition.Execution.Config;
import com.anthem.oss.nimbus.core.domain.definition.Executions.Configs;
import com.anthem.oss.nimbus.core.domain.definition.MapsTo;
import com.anthem.oss.nimbus.core.domain.definition.MapsTo.Path;
import com.anthem.oss.nimbus.core.domain.definition.ViewConfig.GridColumn;
import com.anthem.oss.nimbus.core.domain.definition.ViewConfig.Link;
import lombok.Getter;
import lombok.Setter;
@MapsTo.Type(Pet.class)
@Getter @Setter
public class PetLineItem {
@Path @GridColumn(hidden=true)
private String id;
@Path
private String name;
@Path
private LocalDate dob;
@Path("type")
private String petType;
@Configs({
@Config(url="/p/petview:<!/id!>/_get")
})
@Link()
private String editPet;
@Configs({
@Config(url="/p/petview:<!/id!>/_get"),
@Config(url="/p/petview:<!/id!>/_nav?pageId=vpPetInfo")
})
@Link() private String viewVisits;
}
Step 3
Restart the web container and navigate to localhost:9090/ui/ in a new browser session to see the changes.
-
How to add/edit for an entity that is associated with another entity
-
Association of entitities
Requirement Gathering
Exercise 1
The purpose of the exercise is to start the dialogue in building the new Petclinic Application
Project scope: The application requirement is for an information system that is accessible through a web browser. The users of the application are employees of the clinic who in the course of their work need to view and manage information regarding the veterinarians, the clients, and their pets.
-
Treat your Facilitator as your Business Owner
-
Use your Personal confluence space to draft/take notes OR Word document
-
Identify the highlevel capabilities
-
Identify the Persona for which the application be used
-
Identify the user workflow as they interact with the system
-
Did you have something similar to this: https://confluence.anthem.com/display/NIM/PetClinic+-+Nimbus+Onboarding+Sample#PetClinic-NimbusOnboardingSample-Persona:PetClinicEmployee
Exercise 2
The purpose of this exercise is to identify Business Domain entities, create Wireframe and develop a User Story Map
-
Treat your Facilitator as your Business Owner
-
Use your Personal confluence space OR Word document to define your Domain Entities, Wireframes (use balsamic or just paper and pen) and Story Map
-
Use the UI pattern template to keep your wireframes as close to these patterns (Learn more in Ex 3) https://confluence.anthem.com/download/attachments/92831971/UI%20Basic%20Patterns%20Template.xlsx?api=v2
-
Accomplish Step 1 of our use case definition, data definition and ERD
-
Define highlevel Wireframes (try to use UI patterns already present)
-
Break Capabilities to – JIRA Epics and US
-
Did you get close to these wireframes: https://confluence.anthem.com/display/NIM/PetClinic+-+Nimbus+Onboarding+Sample#PetClinic-NimbusOnboardingSample-Wireframes
Does your Business Entities and ERD look like this: https://confluence.anthem.com/display/NIM/PetClinic+-+Nimbus+Onboarding+Sample#PetClinic-NimbusOnboardingSample-BusinessEntitiesIdentified
Does your Story Map look like: https://jira.anthem.com/projects/NIM?selectedItem=com.arijea.plugins.easy-agile-user-story-maps&rapidView=8688
Exercise 3
Learn the UI Patterns
Global Page
WorkPage
View Containers
View Parameters image::requirements/View_Parameters.png[View Parameters]
Go through the ‘UI Basic Patterns Template.xlsx’
-
Familiarize with UI View Definition for the any Application built using Nimbus Framework
-
Know how to use the UI Basic Pattern Template to add to your Use Cases
-
We will learn more as we do Sample User Story!
Exercise 4
-
Refine User story to search for an Owner *
-
Create US in JIRA.
-
US name put “<Your Name >– Search Owner”
-
Make sure the IT Team = ‘Onboarding Team - Pet Clinic’ and Epic = NIM-5231
-
Make sure US has all the AC, Linked to proper supporting documents
-
Did your story look like NIM-4912
Exercise 5
-
Refine User Story to Add vets *
-
Create US in JIRA.
-
US name put “<Your Name >– Add a new Vet”
-
Make sure the IT Team = ‘Onboarding Team - Pet Clinic’ and Epic = NIM-5231
-
Make sure US has all the AC, Linked to proper supporting documents
-
Did your story look like NIM-4909
Sample Requirement Specification
Configuration Documentation
Refer to Documentation for more information.


- Item 1
- Item 2
- Item 3
- Item 4
- Item 5
To create a basic list, jus create a ul
or a ol
structure with several li
elements nested inside. The result is a simple list, without bullets or numbers.
If you dont want to create a standard bulleted list, just wrap the list structure we saw previsously with a .content
div
element. Bullets will then show. Numbers will be also be shown if it is an ordered list.
You can customize the glyph or bullet being shown at the left of unordered list items. You can replace it with a font icon. Add the .icon-bullet-list
class to an unordered list to activate it. Default icon is fa fa-circle-o
. It could be anything else, you just have to make the changes in the related css snippet.
You can build customized lists with solid lists. However, it doesnt rely on ul
or ol
for the structure, but rather on div
. You can have anything you want as a bullet, including icons and images. Check the code sample for more details.
You can make a list display horizontally. Just add the .inline-list
class to the ul
element. List separators are made of font awesome icons. You are free to change them with an appropriate element.
List blocks are very handy and act as interactive lists, such as menus or options. They can also have badges appended to list items. Here is the structure of a minimal list block. Active list items are by default highlighted with the $primary
color.
A list block can appear like a small panel with a light shadow. This is the list block default behaviour.
You can add icons to a list block element items. Insert the icon before the item's text. It can be from any icon family.
Add the .bordered
class to a list block to make its items bordered.
You can change the background color of active items. In order to do this, add the .is-secondary
or the .is -accent
class to the ul
element. The list block active background color defaults to $primary
.
Level is a versatile component brought by Bulma. It basically imitates the behaviour of an inline list. However, you can insert almost any element inside a level. The default level has two parts : .level-left
and .level-right
. Each one of these parts contains level items. By default, level items are displayed vertically on mobile. Check the code sample for more details about level structure.
A level can easily be turned into a navigation bar. Add the class .nav-level
to the .level
element.
Level items can be centered. To achieve this, remove .level-left
and .level-right
wrappers. All level items must be direct children of the .level
element.
The level's inline layout can be kept on mobile, instead of the stacking behaviour. Simply add the modifier .is-mobile
to the .level
element. Reduce your screen size to see it in action.
You can use lists to display other types of content. This is a user availability list for example.
This is another example of a user list. It is based on the Bulma media object element.
Terry Daniels
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Marjory Cambell
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sinum garet et setus.
Kevin Smith
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Melany Wright
Lorem ipsum dolor sit amet, consectetur adipiscing elit.


Center: ${center | latLng:6}
Zoom: ${zoom} + -
Bounds: ${bounds | latLngBounds:6}
My position: ${myPosition | latLng:6} Go