getKEGGModelForOrganism Reconstructs a genome-scale metabolic model based on protein homology to the orthologies in KEGG organismID three or four letter abbreviation of the organism (as used in KEGG). If not available, use a closely related species. This is used for determing the phylogenetic distance. Use 'eukaryotes' or 'prokaryotes' to get a model for the whole domain. Only applicable if fastaFile is empty, i.e. no homology search should be performed fastaFile a FASTA file that contains the protein sequences of the organism for which to reconstruct a model (opt, if no FASTA file is supplied then a model is reconstructed based only on the organism abbreviation. This option ignores all settings except for keepUndefinedStoich, keepIncomplete and keepGeneral) dataDir directory for which to retrieve the input data. Should contain a combination of these sub-folders: -dataDir\keggdb The KEGG database files used in 1a (see below). -dataDir\fasta The multi-FASTA files generated in 1b (see below) -dataDir\aligned The aligned FASTA files as generated in 2a (see below) -dataDir\hmms The hidden Markov models as generated in 2b or downloaded from BioMet Toolbox (see below) (opt, see note about fastaFile. Note that in order to rebuild the KEGG model from a database dump, as opposed to using the version supplied with RAVEN, you would still need to supply this) outDir directory to save the results from the quering of the hidden Markov models. The output is specific for the input sequences and the settings used. It is stored in this manner so that the function can continue if interrupted or if it should run in parallel. Be careful not to leave output files from different organisms or runs with different settings in the same folder. They will not be overwritten (opt, default is a temporary dir where all *.out files are deleted before and after doing the reconstruction) keepUndefinedStoich include reactions in the form n A <=> n+1 A. These will be dealt with as two separate metabolites (opt, default true) keepIncomplete include reactions which have been labelled as "incomplete", "erroneous" or "unclear" (opt, default true) keepGeneral include reactions which have been labelled as "general reaction". These are reactions on the form "an aldehyde <=> an alcohol", and are therefore unsuited for modelling purposes. Note that not all reactions have this type of annotation, and the script will therefore not be able to remove all such reactions (opt, default false) cutOff significans score from HMMer needed to assign genes to a KO (opt, default 10^-50) minScoreRatioG a gene is only assigned to KOs for which the score is >=log(score)/log(best score) for that gene. This is to prevent that a gene which clearly belongs to one KO is assigned also to KOs with much lower scores (opt, default 0.8 (lower is less strict)) minScoreRatioKO ignore genes in a KO if their score is <log(score)/log(best score in KO). This is to "prune" KOs which have many genes and where some are clearly a better fit (opt, default 0.3 (lower is less strict)) maxPhylDist -1: only use sequences from the same domain (Prokaryota, Eukaryota) other (positive) value: only use sequences for organisms where the phylogenetic distance is at the most this large (as calculated in getPhylDist) (opt, default Inf, which means that all sequences will be used) nSequences for each KO, use up to this many sequences from the most closely related species. This is mainly to speed up the alignment process for KOs with very many genes. This subsampling is performed before running CD-HIT (opt, default inf) seqIdentity sequence identity threshold in CD-HIT, referred as "global sequence identity" in CD-HIT User's Guide. The only possible options are 1 (100 %), 0.9 (90 %) and 0.5 (50 %). If other values are provided, CD-HIT is skipped (opt, default -1, i.e. CD-HIT is skipped) model the reconstructed model PLEASE READ THIS: The input to this function can be confusing, because it is intended to be run in parallel on a cluster or in multiple sessions. It therefore saves a lot of intermediate results to storage. This also serves the purpose of not having to do redundant calculations. This, however, comes with the disadvantage of somewhat trickier handling. This is what this function does: 1a. Loads files from a local KEGG FTP dump and constructs a general RAVEN model representing the metabolic network. KEGG FTP access requires a license. 1b. Generates FASTA files from the KEGG FTP dump (see 1a). One multi-FASTA file for each KO in KEGG is generated. Make sure you actually need these first, as the parsing is time-consuming (see below). These steps only have to be re-done every time KEGG updates their database (or rather when the updates are large enough to warrant rerunning this part). Many user would probably never use this feature. 2a. Does alignment of the multi-FASTA files for future use. This uses the settings "useEvDist" and "nSequences" to control which sequences should be used for constructing Hidden Markov models (HMMs), and later for matching your sequences to. 2b. Trains hidden Markov models using HMMer for each of the aligned FASTA files. The most common alternatives here would be to use sequences from only eukaryotes, only prokaryotes or all sequences in KEGG. As explained in the README.md file, various sets of pre-trained hidden Markov models are available at BioMet Toolbox. This is normally the most convenient way, but if you would like to use, for example, only fungal sequences for training the HMMs then you need to run this part. 3a. Queries the HMMs with sequences for the organism you are making a model for. This step uses both the output from step 1a and from 2b. 3b. Constructs a model based on the fit to the HMMs and the chosen parameters. These steps are specific to the organism for which you are reconstructing the model. In principle the function looks at which output that is already available and runs only the parts that are required for step 3. This means that (see the definition of the parameters for details): -1a is only performed if there are no KEGG model files in the RAVEN\external\kegg directory -1b is only performed if not all required HMMs OR aligned FASTA files OR multi-FASTA files exist in the defined dataDir. This means that this step is skipped if the HMMs are downloaded from BioMet Toolbox instead (see above). If not all files exist it will try to find the KEGG database files in dataDir. -2a is only performed if not all required HMMs OR aligned FASTA files files exist in the defined dataDir. This means that this step is skipped if the HMMs are downloaded from BioMet Toolbox instead (see above). -2b is only performed if not all required HMMs exist in the defined dataDir. This means that this step is skipped if the FASTA files or HMMs are downloaded from BioMet Toolbox instead (see above). -3a is performed for the required HMMs for which no corresponding .out file exists in outDir. This is just a way to enable the function to be run in parallel or to resume if interrupted. -3b is always performed. Usage: model=getKEGGModelForOrganism(organismID,fastaFile,dataDir,outDir,... keepUndefinedStoich,keepIncomplete,keepGeneral,cutOff,minScoreRatioG,... minScoreRatioKO,maxPhylDist,nSequences,seqIdentity) Eduard Kerkhoven, 2017-02-28
0001 function model=getKEGGModelForOrganism(organismID,fastaFile,dataDir,outDir,... 0002 keepUndefinedStoich,keepIncomplete,keepGeneral,cutOff,minScoreRatioG,... 0003 minScoreRatioKO,maxPhylDist,nSequences,seqIdentity) 0004 % getKEGGModelForOrganism 0005 % Reconstructs a genome-scale metabolic model based on protein homology to the 0006 % orthologies in KEGG 0007 % 0008 % organismID three or four letter abbreviation of the organism (as 0009 % used in KEGG). If not available, use a closely related 0010 % species. This is used for determing the 0011 % phylogenetic distance. Use 'eukaryotes' or 0012 % 'prokaryotes' to get a model for the whole domain. 0013 % Only applicable if fastaFile is empty, i.e. no 0014 % homology search should be performed 0015 % fastaFile a FASTA file that contains the protein sequences of 0016 % the organism for which to reconstruct a model (opt, 0017 % if no FASTA file is supplied then a model is 0018 % reconstructed based only on the organism 0019 % abbreviation. This option ignores all settings except for 0020 % keepUndefinedStoich, keepIncomplete and keepGeneral) 0021 % dataDir directory for which to retrieve the input data. 0022 % Should contain a combination of these sub-folders: 0023 % -dataDir\keggdb 0024 % The KEGG database files used in 1a (see below). 0025 % -dataDir\fasta 0026 % The multi-FASTA files generated in 1b (see below) 0027 % -dataDir\aligned 0028 % The aligned FASTA files as generated in 2a (see 0029 % below) 0030 % -dataDir\hmms 0031 % The hidden Markov models as generated in 2b or 0032 % downloaded from BioMet Toolbox (see below) 0033 % (opt, see note about fastaFile. Note that in order to 0034 % rebuild the KEGG model from a database dump, as opposed to 0035 % using the version supplied with RAVEN, you would still need 0036 % to supply this) 0037 % outDir directory to save the results from the quering of 0038 % the hidden Markov models. The output is specific 0039 % for the input sequences and the settings used. It 0040 % is stored in this manner so that the function can 0041 % continue if interrupted or if it should run in 0042 % parallel. Be careful not to leave output files 0043 % from different organisms or runs with different 0044 % settings in the same folder. They will not be 0045 % overwritten (opt, default is a temporary dir where 0046 % all *.out files are deleted before and after doing 0047 % the reconstruction) 0048 % keepUndefinedStoich include reactions in the form n A <=> n+1 A. These 0049 % will be dealt with as two separate metabolites 0050 % (opt, default true) 0051 % keepIncomplete include reactions which have been labelled as 0052 % "incomplete", "erroneous" or "unclear" (opt, 0053 % default true) 0054 % keepGeneral include reactions which have been labelled as 0055 % "general reaction". These are reactions on the form 0056 % "an aldehyde <=> an alcohol", and are therefore 0057 % unsuited for modelling purposes. Note that not all 0058 % reactions have this type of annotation, and the 0059 % script will therefore not be able to remove all 0060 % such reactions (opt, default false) 0061 % cutOff significans score from HMMer needed to assign genes 0062 % to a KO (opt, default 10^-50) 0063 % minScoreRatioG a gene is only assigned to KOs for which the score 0064 % is >=log(score)/log(best score) for that gene. 0065 % This is to prevent that a gene which clearly belongs 0066 % to one KO is assigned also to KOs with much lower 0067 % scores (opt, default 0.8 (lower is less strict)) 0068 % minScoreRatioKO ignore genes in a KO if their score is 0069 % <log(score)/log(best score in KO). This is to 0070 % "prune" KOs which have many genes and where some 0071 % are clearly a better fit 0072 % (opt, default 0.3 (lower is less strict)) 0073 % maxPhylDist -1: only use sequences from the same domain 0074 % (Prokaryota, Eukaryota) 0075 % other (positive) value: only use sequences for 0076 % organisms where the phylogenetic distance is at 0077 % the most this large (as calculated in getPhylDist) 0078 % (opt, default Inf, which means that all sequences will 0079 % be used) 0080 % nSequences for each KO, use up to this many sequences from 0081 % the most closely related species. This is mainly to 0082 % speed up the alignment process for KOs with very 0083 % many genes. This subsampling is performed before 0084 % running CD-HIT (opt, default inf) 0085 % seqIdentity sequence identity threshold in CD-HIT, referred as 0086 % "global sequence identity" in CD-HIT User's Guide. 0087 % The only possible options are 1 (100 %), 0.9 (90 %) 0088 % and 0.5 (50 %). If other values are provided, CD-HIT 0089 % is skipped (opt, default -1, i.e. CD-HIT is skipped) 0090 % 0091 % model the reconstructed model 0092 % 0093 % PLEASE READ THIS: The input to this function can be confusing, because 0094 % it is intended to be run in parallel on a cluster or in multiple sessions. 0095 % It therefore saves a lot of intermediate results to storage. This also 0096 % serves the purpose of not having to do redundant calculations. This, 0097 % however, comes with the disadvantage of somewhat trickier handling. 0098 % This is what this function does: 0099 % 0100 % 1a. Loads files from a local KEGG FTP dump and constructs a general 0101 % RAVEN model representing the metabolic network. KEGG FTP access 0102 % requires a license. 0103 % 1b. Generates FASTA files from the KEGG FTP dump (see 1a). One 0104 % multi-FASTA file for each KO in KEGG is generated. Make sure you 0105 % actually need these first, as the parsing is time-consuming (see below). 0106 % 0107 % These steps only have to be re-done every time KEGG updates their 0108 % database (or rather when the updates are large enough to warrant 0109 % rerunning this part). Many user would probably never use this feature. 0110 % 0111 % 2a. Does alignment of the multi-FASTA files for future use. This uses the 0112 % settings "useEvDist" and "nSequences" to control which sequences 0113 % should be used for constructing Hidden Markov models (HMMs), and 0114 % later for matching your sequences to. 0115 % 2b. Trains hidden Markov models using HMMer for each of the aligned 0116 % FASTA files. 0117 % 0118 % The most common alternatives here would be to use sequences from only 0119 % eukaryotes, only prokaryotes or all sequences in KEGG. As explained in 0120 % the README.md file, various sets of pre-trained hidden Markov models are 0121 % available at BioMet Toolbox. 0122 % This is normally the most convenient way, but if you would like to use, 0123 % for example, only fungal sequences for training the HMMs then you need 0124 % to run this part. 0125 % 0126 % 3a. Queries the HMMs with sequences for the organism you are making a 0127 % model for. This step uses both the output from step 1a and from 2b. 0128 % 3b. Constructs a model based on the fit to the HMMs and the chosen 0129 % parameters. 0130 % 0131 % These steps are specific to the organism for which you are reconstructing 0132 % the model. 0133 % 0134 % In principle the function looks at which output that is already available 0135 % and runs only the parts that are required for step 3. This means 0136 % that (see the definition of the parameters for details): 0137 % -1a is only performed if there are no KEGG model files in the 0138 % RAVEN\external\kegg directory 0139 % -1b is only performed if not all required HMMs OR aligned FASTA files 0140 % OR multi-FASTA files exist in the defined dataDir. This means that this 0141 % step is skipped if the HMMs are downloaded from BioMet Toolbox instead 0142 % (see above). If not all files exist it will try to find 0143 % the KEGG database files in dataDir. 0144 % -2a is only performed if not all required HMMs OR aligned FASTA files 0145 % files exist in the defined dataDir. This means that this step is skipped 0146 % if the HMMs are downloaded from BioMet Toolbox instead (see above). 0147 % -2b is only performed if not all required HMMs exist in the defined 0148 % dataDir. This means that this step is skipped if the FASTA files or 0149 % HMMs are downloaded from BioMet Toolbox instead (see above). 0150 % -3a is performed for the required HMMs for which no corresponding .out 0151 % file exists in outDir. This is just a way to enable the function to be 0152 % run in parallel or to resume if interrupted. 0153 % -3b is always performed. 0154 % 0155 % Usage: model=getKEGGModelForOrganism(organismID,fastaFile,dataDir,outDir,... 0156 % keepUndefinedStoich,keepIncomplete,keepGeneral,cutOff,minScoreRatioG,... 0157 % minScoreRatioKO,maxPhylDist,nSequences,seqIdentity) 0158 % 0159 % Eduard Kerkhoven, 2017-02-28 0160 % 0161 0162 if nargin<2 0163 fastaFile=[]; 0164 end 0165 if nargin<3 0166 dataDir=[]; 0167 end 0168 if nargin<4 0169 outDir=[]; 0170 end 0171 if isempty(outDir) 0172 outDir=tempdir; 0173 %Delete all *.out files if any exist 0174 delete(fullfile(outDir,'*.out')); 0175 end 0176 if nargin<5 0177 keepUndefinedStoich=true; 0178 end 0179 if nargin<6 0180 keepIncomplete=true; 0181 end 0182 if nargin<7 0183 keepGeneral=false; 0184 end 0185 if nargin<8 0186 cutOff=10^-50; 0187 end 0188 if nargin<9 0189 minScoreRatioG=0.8; 0190 end 0191 if nargin<10 0192 minScoreRatioKO=0.3; 0193 end 0194 if nargin<11 0195 maxPhylDist=inf; %Include all sequences for each reaction 0196 end 0197 if nargin<12 0198 nSequences=inf; %Include all sequences for each reaction 0199 end 0200 if nargin<13 0201 seqIdentity=-1; %CD-HIT is not used in the pipeline 0202 end 0203 0204 %Check if the fasta-file contains '/' or'\'. If not then it's probably just 0205 %a file name. It is then merged with the current folder 0206 if any(fastaFile) 0207 if ~any(strfind(fastaFile,'\')) && ~any(strfind(fastaFile,'/')) 0208 fastaFile=fullfile(pwd,fastaFile); 0209 end 0210 %Create the required sub-folders in dataDir if they dont exist 0211 if ~exist(fullfile(dataDir,'keggdb'),'dir') 0212 mkdir(dataDir,'keggdb'); 0213 end 0214 if ~exist(fullfile(dataDir,'fasta'),'dir') 0215 mkdir(dataDir,'fasta'); 0216 end 0217 if ~exist(fullfile(dataDir,'aligned'),'dir') 0218 mkdir(dataDir,'aligned'); 0219 end 0220 if ~exist(fullfile(dataDir,'hmms'),'dir') 0221 mkdir(dataDir,'hmms'); 0222 end 0223 if ~exist(outDir,'dir') 0224 mkdir(outDir); 0225 end 0226 end 0227 0228 %First generate the full KEGG model. The dataDir mustn't be supplied as 0229 %there is also an internal RAVEN version available 0230 if any(dataDir) 0231 [model, KOModel]=getModelFromKEGG(fullfile(dataDir,'keggdb'),keepUndefinedStoich,keepIncomplete,keepGeneral); 0232 else 0233 [model, KOModel]=getModelFromKEGG([],keepUndefinedStoich,keepIncomplete,keepGeneral); 0234 end 0235 fprintf('Completed generation of KEGG model\n'); 0236 model.id=organismID; 0237 model.c=zeros(numel(model.rxns),1); 0238 0239 %If no FASTA file is supplied, then just remove all genes which are not for 0240 %the given organism ID 0241 if isempty(fastaFile) 0242 if ismember(organismID,{'eukaryotes','prokaryotes'}) 0243 phylDists=getPhylDist(fullfile(dataDir,'keggdb'),maxPhylDist==-1); 0244 if strcmp(organismID,'eukaryotes') 0245 proxyid='hsa'; %Use H. sapiens here 0246 else 0247 proxyid='eco'; %Use E. coli here 0248 end 0249 [~,phylDistId]=ismember(proxyid,phylDists.ids); 0250 idsToKeep=phylDists.ids(~isinf(phylDists.distMat(phylDistId,:))); 0251 taxIDs=cellfun(@(x) x{1},cellfun(@(x) strsplit(x,':'),model.genes,'UniformOutput',false),'UniformOutput',false); 0252 I=ismember(upper(taxIDs),upper(idsToKeep)); 0253 else 0254 % KEGG organism IDs may have three or four letters 0255 if length(organismID)==3 0256 I=cellfun(@(x) strcmpi(x(1:3),organismID),model.genes); 0257 else if length(organismID)==4 0258 I=cellfun(@(x) strcmpi(x(1:4),organismID),model.genes); 0259 end 0260 end 0261 end 0262 0263 %Remove those genes 0264 model.genes=model.genes(I); 0265 model.rxnGeneMat=model.rxnGeneMat(:,I); 0266 end 0267 0268 %First remove all reactions without genes 0269 hasGenes=any(model.rxnGeneMat,2); 0270 0271 model=removeReactions(model,~hasGenes,true); 0272 0273 %If no FASTA file is supplied, then we're done here 0274 if isempty(fastaFile) 0275 return; 0276 end 0277 0278 %Trim the genes so that they only contain information that can be matched 0279 %to the KEGG file of protein sequences (remove all information after first 0280 %parenthesis) 0281 0282 %NOTE: For some reason the organism abbreviation should be in lower case in 0283 %this database. Fix this here 0284 for i=1:numel(KOModel.genes) 0285 parIndex=strfind(KOModel.genes{i},'('); 0286 if any(parIndex) 0287 KOModel.genes{i}=KOModel.genes{i}(1:parIndex-1); 0288 end 0289 colIndex=strfind(KOModel.genes{i},':'); 0290 KOModel.genes{i}=[lower(KOModel.genes{i}(1:colIndex-1)) KOModel.genes{i}(colIndex:end)]; 0291 end 0292 0293 %Create a phylogenetic distance structure 0294 phylDistStruct=getPhylDist(fullfile(dataDir,'keggdb'),maxPhylDist==-1); 0295 [~, phylDistId]=ismember(model.id,phylDistStruct.ids); 0296 fprintf('Completed creation of phylogenetic distance matrix\n'); 0297 0298 %Calculate the real maximal distance now. An abitary large number of 1000 is 0299 %used for the "all in kingdom" or "all sequences" options. This is a bit 0300 %inconvenient way to do it, but it's to make it fit with some older code 0301 if isinf(maxPhylDist) || maxPhylDist==-1 0302 maxPhylDist=1000; 0303 end 0304 0305 %Get the KO ids for which files have been generated. Maybe not the neatest 0306 %way.. 0307 fastaFiles=listFiles(fullfile(dataDir,'fasta','*.fa')); 0308 alignedFiles=listFiles(fullfile(dataDir,'aligned','*.fa')); 0309 alignedWorking=listFiles(fullfile(dataDir,'aligned','*.faw')); 0310 hmmFiles=listFiles(fullfile(dataDir,'hmms','*.hmm')); 0311 outFiles=listFiles(fullfile(outDir,'*.out')); 0312 0313 %Check if multi-FASTA files should be generated. This should only be 0314 %performed if there are IDs in the KOModel structure that haven't been 0315 %parsed yet 0316 missingFASTA=setdiff(KOModel.rxns,[fastaFiles;alignedFiles;hmmFiles;outFiles]); 0317 0318 if ~isempty(missingFASTA) 0319 if ~exist(fullfile(dataDir,'keggdb','genes.pep'),'file') 0320 EM=fprintf(['The file ''genes.pep'' cannot be located at ' strrep(keggPath,'\','/') '/ and should be downloaded from the KEGG FTP.\n']); 0321 dispEM(EM); 0322 end 0323 %Only construct models for KOs which don't have files already 0324 fastaModel=removeReactions(KOModel,setdiff(KOModel.rxns,missingFASTA),true,true); 0325 %Permute the order of the KOs in the model so that constructMultiFasta 0326 %can be run on several processors at once 0327 fastaModel=permuteModel(fastaModel,randperm(RandStream.create('mrg32k3a','Seed',cputime()),numel(fastaModel.rxns)),'rxns'); 0328 constructMultiFasta(fastaModel,fullfile(dataDir,'keggdb','genes.pep'),fullfile(dataDir,'fasta')); 0329 end 0330 fprintf('Completed generation of multi-FASTA files\n'); 0331 0332 %Get the directory for RAVEN Toolbox. This is to get the path to the third 0333 %party software used 0334 [ST, I]=dbstack('-completenames'); 0335 ravenPath=fileparts(fileparts(fileparts(ST(I).file))); 0336 0337 if isunix 0338 if ismac 0339 binEnd='.mac'; 0340 else 0341 binEnd=''; 0342 end 0343 elseif ispc 0344 binEnd=''; 0345 else 0346 EM='Unknown OS, exiting.'; 0347 disp(EM); 0348 return 0349 end 0350 0351 0352 %Check if alignment of FASTA files should be performed 0353 missingAligned=setdiff(KOModel.rxns,[alignedFiles;hmmFiles;alignedWorking;outFiles]); 0354 if ~isempty(missingAligned) 0355 missingAligned=missingAligned(randperm(RandStream.create('mrg32k3a','Seed',cputime()),numel(missingAligned))); 0356 %Align all sequences using MAFFT 0357 for i=1:numel(missingAligned) 0358 %This is checked here because it could be that it is created by a 0359 %parallell process. The faw-files are saved as temporary files to 0360 %keppt track of which files are being worked on 0361 if ~exist(fullfile(dataDir,'aligned',[missingAligned{i} '.faw']),'file') && ~exist(fullfile(dataDir,'aligned',[missingAligned{i} '.fa']),'file') 0362 %Check that the multi-FASTA file exists. It should do so since 0363 %we are saving empty files as well. Print a warning and 0364 %continue if not. 0365 if ~exist(fullfile(dataDir,'fasta',[missingAligned{i} '.fa']),'file') 0366 EM=['WARNING: The multi-FASTA file for ' missingAligned{i} ' does not exist']; 0367 dispEM(EM,false); 0368 continue; 0369 end 0370 0371 %If the multi-FASTA file is empty then save an empty aligned 0372 %file and continue 0373 s=dir(fullfile(dataDir,'fasta',[missingAligned{i} '.fa'])); 0374 if s.bytes<=0 0375 fid=fopen(fullfile(dataDir,'aligned',[missingAligned{i} '.fa']),'w'); 0376 fclose(fid); 0377 continue; 0378 end 0379 0380 %Create an empty file to prevent other threads to start to work on the same alignment 0381 fid=fopen(fullfile(dataDir,'aligned',[missingAligned{i} '.faw']),'w'); 0382 fclose(fid); 0383 0384 %First load the FASTA file, then select up to nSequences sequences 0385 %of the most closely related species, apply any constraints from 0386 %maxPhylDist, and save it as a temporary file, and create the 0387 %model from that 0388 0389 fastaStruct=fastaread(fullfile(dataDir,'fasta',[missingAligned{i} '.fa'])); 0390 phylDist=inf(numel(fastaStruct),1); 0391 for j=1:numel(fastaStruct) 0392 %Get the organism abbreviation 0393 index=strfind(fastaStruct(j).Header,':'); 0394 if any(index) 0395 abbrev=fastaStruct(j).Header(1:index(1)-1); 0396 [~, index]=ismember(abbrev,phylDistStruct.ids); 0397 if any(index) 0398 phylDist(j)=phylDistStruct.distMat(index(1),phylDistId); 0399 end 0400 end 0401 end 0402 0403 %Inf means that it should not be included 0404 phylDist(phylDist>maxPhylDist)=[]; 0405 0406 %Sort based on phylDist 0407 [~, order]=sort(phylDist); 0408 0409 %Save the first nSequences hits to a temporary FASTA file 0410 if nSequences<=numel(fastaStruct) 0411 fastaStruct=fastaStruct(order(1:nSequences)); 0412 else 0413 fastaStruct=fastaStruct(order); 0414 end 0415 0416 %Do the alignment if there are more than one sequences, 0417 %otherwise just save the sequence (or an empty file) 0418 if numel(fastaStruct)>1 0419 if (seqIdentity==1 || seqIdentity==0.9 || seqIdentity==0.5) 0420 if ~ispc 0421 if seqIdentity==1 0422 cdhitInp100=tempname; 0423 fastawrite(cdhitInp100,fastaStruct); 0424 tmpFile=tempname; 0425 [status, output]=unix(['"' fullfile(ravenPath,'software','cd-hit-v4.6.6',['cd-hit' binEnd]) '" -i "' cdhitInp100 '" -o "' tmpFile '" -c 1.0 -s 0.8 -n 5 -M 2000 -T 8']); 0426 if status~=0 0427 EM=['Error when performing clustering of ' missingAligned{i} ':\n' output]; 0428 dispEM(EM); 0429 end 0430 %Remove the old tempfile 0431 if exist(cdhitInp100, 'file') 0432 delete([cdhitInp100 '*']); 0433 end 0434 elseif seqIdentity==0.9 0435 cdhitInp100=tempname; 0436 fastawrite(cdhitInp100,fastaStruct); 0437 cdhitInp90=tempname; 0438 [status, output]=unix(['"' fullfile(ravenPath,'software','cd-hit-v4.6.6',['cd-hit' binEnd]) '" -i "' cdhitInp100 '" -o "' cdhitInp90 '" -c 1.0 -s 0.8 -n 5 -M 2000']); 0439 if status~=0 0440 EM=['Error when performing clustering of ' missingAligned{i} ':\n' output]; 0441 dispEM(EM); 0442 end 0443 %Remove the old tempfile 0444 if exist(cdhitInp100, 'file') 0445 delete([cdhitInp100 '*']); 0446 end 0447 tmpFile=tempname; 0448 [status, output]=unix(['"' fullfile(ravenPath,'software','cd-hit-v4.6.6',['cd-hit' binEnd]) '" -i "' cdhitInp90 '" -o "' tmpFile '" -c 0.9 -s 0.8 -n 5 -M 2000']); 0449 if status~=0 0450 EM=['Error when performing clustering of ' missingAligned{i} ':\n' output]; 0451 dispEM(EM); 0452 end 0453 %Remove the old tempfile 0454 if exist(cdhitInp90, 'file') 0455 delete([cdhitInp90 '*']); 0456 end 0457 elseif seqIdentity==0.5 0458 cdhitInp100=tempname; 0459 fastawrite(cdhitInp100,fastaStruct); 0460 cdhitInp90=tempname; 0461 [status, output]=unix(['"' fullfile(ravenPath,'software','cd-hit-v4.6.6',['cd-hit' binEnd]) '" -i "' cdhitInp100 '" -o "' cdhitInp90 '" -c 1.0 -s 0.8 -n 5 -M 2000']); 0462 if status~=0 0463 EM=['Error when performing clustering of ' missingAligned{i} ':\n' output]; 0464 dispEM(EM); 0465 end 0466 %Remove the old tempfile 0467 if exist(cdhitInp100, 'file') 0468 delete([cdhitInp100 '*']); 0469 end 0470 cdhitInp50=tempname; 0471 [status, output]=unix(['"' fullfile(ravenPath,'software','cd-hit-v4.6.6',['cd-hit' binEnd]) '" -i "' cdhitInp90 '" -o "' cdhitInp50 '" -c 0.9 -s 0.8 -n 5 -M 2000']); 0472 if status~=0 0473 EM=['Error when performing clustering of ' missingAligned{i} ':\n' output]; 0474 dispEM(EM); 0475 end 0476 %Remove the old tempfile 0477 if exist(cdhitInp90, 'file') 0478 delete([cdhitInp90 '*']); 0479 end 0480 tmpFile=tempname; 0481 [status, output]=unix(['"' fullfile(ravenPath,'software','cd-hit-v4.6.6',['cd-hit' binEnd]) '" -i "' cdhitInp50 '" -o "' tmpFile '" -c 0.5 -s 0.8 -n 3 -M 2000']); 0482 if status~=0 0483 EM=['Error when performing clustering of ' missingAligned{i} ':\n' output]; 0484 dispEM(EM); 0485 end 0486 %Remove the old tempfile 0487 if exist(cdhitInp50, 'file') 0488 delete([cdhitInp50 '*']); 0489 end 0490 end 0491 else 0492 % CD-HIT is not available in Windows so we just 0493 % export multifasta file into temporary file; 0494 tmpFile=tempname; 0495 fastawrite(tmpFile,fastaStruct); 0496 end 0497 else 0498 tmpFile=tempname; 0499 fastawrite(tmpFile,fastaStruct); 0500 end 0501 %Do the alignment for this file 0502 if ~ispc 0503 [status, output]=system(['"' fullfile(ravenPath,'software','mafft-7.221',['mafft' binEnd]) '" --auto "' tmpFile '" > "' fullfile(dataDir,'aligned',[missingAligned{i} '.faw']) '"']); 0504 else 0505 [status, output]=system(['"' fullfile(ravenPath,'software','mafft-7.221','mafft.bat') '" --auto "' tmpFile '" > "' fullfile(dataDir,'aligned',[missingAligned{i} '.faw']) '"']); 0506 end 0507 if status~=0 0508 EM=['Error when performing alignment of ' missingAligned{i} ':\n' output]; 0509 dispEM(EM); 0510 end 0511 %Remove the old tempfile 0512 if exist(tmpFile, 'file') 0513 delete([tmpFile '*']); 0514 end 0515 else 0516 %If there is only one sequence then it's not possible to do a 0517 %multiple alignment. Just print the sequence instead. An 0518 %empty file was written previously so that doesn't have to 0519 %be dealt with 0520 if numel(fastaStruct)==1 0521 fastawrite(fullfile(dataDir,'aligned',[missingAligned{i} '.faw']),fastaStruct); 0522 end 0523 end 0524 %Move the temporary file to the real one 0525 movefile(fullfile(dataDir,'aligned',[missingAligned{i} '.faw']),fullfile(dataDir,'aligned',[missingAligned{i} '.fa']),'f'); 0526 end 0527 end 0528 end 0529 0530 if ~ispc 0531 if (seqIdentity==1 || seqIdentity==0.9 || seqIdentity==0.5) 0532 fprintf('Completed clustering and multiple alignment of sequences\n'); 0533 else 0534 fprintf('Completed multiple alignment of sequences. Protein clustering was not requested or incorrect seqIdentity value was used\n'); 0535 end 0536 else 0537 if (seqIdentity==1 || seqIdentity==0.9 || seqIdentity==0.5) 0538 fprintf('Protein clustering was skipped, since CD-HIT is not compatible with Windows'); 0539 end 0540 fprintf('Completed multiple alignment of sequences\n'); 0541 end 0542 0543 %Check if training of Hidden Markov models should be performed 0544 missingHMMs=setdiff(KOModel.rxns,[hmmFiles;outFiles]); 0545 if ~isempty(missingHMMs) 0546 missingHMMs=missingHMMs(randperm(RandStream.create('mrg32k3a','Seed',cputime()),numel(missingHMMs))); 0547 0548 %Train models for all missing KOs 0549 for i=1:numel(missingHMMs) 0550 %This is checked here because it could be that it is created by a 0551 %parallell process 0552 if ~exist(fullfile(dataDir,'hmms',[missingHMMs{i} '.hmm']),'file') && ~exist(fullfile(dataDir,'hmms',[missingHMMs{i} '.hmw']),'file') 0553 %Check that the aligned FASTA file exists. It could be that it 0554 %is still being worked on by some other instance of the 0555 %program (the .faw file should then exist). This should not 0556 %happen on a single computer. I don't throw an error, because 0557 %it should finalize the ones it can. 0558 if ~exist(fullfile(dataDir,'aligned',[missingHMMs{i} '.fa']),'file') 0559 EM=['The aligned FASTA file for ' missingHMMs{i} ' does not exist']; 0560 dispEM(EM,false); 0561 continue; 0562 end 0563 0564 %If the multi-FASTA file is empty then save an empty aligned 0565 %file and continue 0566 s=dir(fullfile(dataDir,'aligned',[missingHMMs{i} '.fa'])); 0567 if s.bytes<=0 0568 fid=fopen(fullfile(dataDir,'hmms',[missingHMMs{i} '.hmm']),'w'); 0569 fclose(fid); 0570 continue; 0571 end 0572 %Create a temporary file to indicate that it is working on the 0573 %KO. This is because hmmbuild cannot overwrite existing files. 0574 fid=fopen(fullfile(dataDir,'hmms',[missingHMMs{i} '.hmw']),'w'); 0575 fclose(fid); 0576 0577 %Create HMM 0578 [status, output]=system(['"' fullfile(ravenPath,'software','hmmer-3.1',['hmmbuild' binEnd]) '" "' fullfile(dataDir,'hmms',[missingHMMs{i} '.hmm']) '" "' fullfile(dataDir,'aligned',[missingHMMs{i} '.fa']) '"']); 0579 if status~=0 0580 EM=['Error when training HMM for ' missingHMMs{i} ':\n' output]; 0581 dispEM(EM); 0582 end 0583 0584 %Delete the temporary file 0585 delete(fullfile(dataDir,'hmms',[missingHMMs{i} '.hmw'])); 0586 end 0587 end 0588 end 0589 fprintf('Completed generation of HMMs\n'); 0590 0591 %Check which new .out files that should be generated 0592 %Check if training of Hidden Markov models should be performed 0593 missingOUT=setdiff(KOModel.rxns,outFiles); 0594 if ~isempty(missingOUT) 0595 missingOUT=missingOUT(randperm(RandStream.create('mrg32k3a','Seed',cputime()),numel(missingOUT))); 0596 for i=1:numel(missingOUT) 0597 %This is checked here because it could be that it is created by a 0598 %parallell process 0599 if ~exist(fullfile(outDir,[missingOUT{i} '.out']),'file') 0600 %Check that the HMM file exists. It should do so since 0601 %we are saving empty files as well. Print a warning and 0602 %continue if not. 0603 if ~exist(fullfile(dataDir,'hmms',[missingOUT{i} '.hmm']),'file') 0604 EM=['The HMM file for ' missingOUT{i} ' does not exist']; 0605 dispEM(EM,false); 0606 continue; 0607 end 0608 0609 %Save an empty file to prevent several threads working on the 0610 %same file 0611 fid=fopen(fullfile(outDir,[missingOUT{i} '.out']),'w'); 0612 fclose(fid); 0613 0614 %If the HMM file is empty then save an out file and continue 0615 s=dir(fullfile(dataDir,'hmms',[missingOUT{i} '.hmm'])); 0616 if s.bytes<=0 0617 continue; 0618 end 0619 0620 %Check each gene in the input file against this model 0621 [status, output]=system(['"' fullfile(ravenPath,'software','hmmer-3.1',['hmmsearch' binEnd]) '" "' fullfile(dataDir,'hmms',[missingOUT{i} '.hmm']) '" "' fastaFile '"']); 0622 if status~=0 0623 EM=['Error when querying HMM for ' missingOUT{i} ':\n' output]; 0624 dispEM(EM); 0625 end 0626 0627 %Save the output to a file 0628 fid=fopen(fullfile(outDir,[missingOUT{i} '.out']),'w'); 0629 fwrite(fid,output); 0630 fclose(fid); 0631 end 0632 end 0633 end 0634 fprintf('Completed matching to HMMs\n'); 0635 0636 %***Begin retrieving the output and putting together the resulting model 0637 0638 %Retrieve matched genes from the HMMs 0639 koGeneMat=zeros(numel(KOModel.rxns),3000); %Make room for 3000 genes 0640 genes=cell(3000,1); 0641 %Store the best score for a gene in a hash list (since I will be searching 0642 %many times) 0643 hTable = java.util.Hashtable; 0644 0645 geneCounter=0; 0646 for i=1:numel(KOModel.rxns) 0647 if exist(fullfile(outDir,[KOModel.rxns{i} '.out']), 'file') 0648 fid=fopen(fullfile(outDir,[KOModel.rxns{i} '.out']),'r'); 0649 beginMatches=false; 0650 while 1 0651 %Get the next line 0652 tline = fgetl(fid); 0653 0654 %Abort at end of file 0655 if ~ischar(tline) 0656 break; 0657 end 0658 0659 if and(beginMatches,strcmp(tline,' ------ inclusion threshold ------')) 0660 break; 0661 end 0662 0663 if beginMatches==false 0664 %This is how the listing of matches begins 0665 if any(strfind(tline,'E-value ')) 0666 %Read one more line that is only padding 0667 tline = fgetl(fid); 0668 beginMatches=true; 0669 end 0670 else 0671 %If matches should be read 0672 if ~strcmp(tline,' [No hits detected that satisfy reporting thresholds]') && ~isempty(tline) 0673 elements=regexp(tline,' ','split'); 0674 elements=elements(cellfun(@any,elements)); 0675 0676 %Check if the match is below the treshhold 0677 score=str2num(elements{1}); 0678 gene=elements{9}; 0679 if score<=cutOff 0680 %If the score is exactly 0, change it to a very 0681 %small value to avoid NaN 0682 if score==0 0683 score=10^-250; 0684 end 0685 %Check if the gene is added already and, is so, get 0686 %the best score for it 0687 I=hTable.get(gene); 0688 if any(I) 0689 koGeneMat(i,I)=score; 0690 else 0691 geneCounter=geneCounter+1; 0692 %The gene was not present yet so add it 0693 hTable.put(gene,geneCounter); 0694 genes{geneCounter}=gene; 0695 koGeneMat(i,geneCounter)=score; 0696 end 0697 end 0698 else 0699 break; 0700 end 0701 end 0702 end 0703 fclose(fid); 0704 end 0705 end 0706 koGeneMat=koGeneMat(:,1:geneCounter); 0707 0708 %Remove the genes for each KO that are below minScoreRatioKO. 0709 for i=1:size(koGeneMat,1) 0710 J=find(koGeneMat(i,:)); 0711 if any(J) 0712 koGeneMat(i,J(log(koGeneMat(i,J))/log(min(koGeneMat(i,J)))<minScoreRatioKO))=0; 0713 end 0714 end 0715 0716 %Remove the KOs for each gene that are below minScoreRatioG 0717 for i=1:size(koGeneMat,2) 0718 J=find(koGeneMat(:,i)); 0719 if any(J) 0720 koGeneMat(J(log(koGeneMat(J,i))/log(min(koGeneMat(J,i)))<minScoreRatioG),i)=0; 0721 end 0722 end 0723 0724 %Create the new model 0725 model.genes=genes(1:geneCounter); 0726 model.grRules=cell(numel(model.rxns),1); 0727 model.grRules(:)={''}; 0728 model.rxnGeneMat=sparse(numel(model.rxns),numel(model.genes)); 0729 0730 %Loop through the reactions and add the corresponding genes 0731 for i=1:numel(model.rxns) 0732 if isstruct(model.rxnMiriams{i}) 0733 %Get all KOs 0734 I=find(strcmpi(model.rxnMiriams{i}.name,'urn:miriam:kegg.ko')); 0735 KOs=model.rxnMiriams{i}.value(I); 0736 %Find the KOs and the corresponding genes 0737 J=ismember(KOModel.rxns,KOs); 0738 [~, K]=find(koGeneMat(J,:)); 0739 0740 if any(K) 0741 model.rxnGeneMat(i,K)=1; 0742 %Also delete KOs for which no genes were found. If no genes at all 0743 %were matched to the reaction it will be deleted later 0744 L=sum(koGeneMat(J,:),2)==0; 0745 model.rxnMiriams{i}.value(I(L))=[]; 0746 model.rxnMiriams{i}.name(I(L))=[]; 0747 end 0748 end 0749 end 0750 0751 %Find and delete all reactions without any genes. This also removes genes 0752 %that are not used (which could happen because minScoreRatioG and 0753 %minScoreRatioKO) 0754 I=sum(model.rxnGeneMat,2)==0; 0755 model=removeReactions(model,I,true,true); 0756 0757 %Add the gene associations as 'or' 0758 for i=1:numel(model.rxns) 0759 %Find the involved genes 0760 I=find(model.rxnGeneMat(i,:)); 0761 model.grRules{i}=['(' model.genes{I(1)}]; 0762 for j=2:numel(I) 0763 model.grRules{i}=[model.grRules{i} ' or ' model.genes{I(j)}]; 0764 end 0765 model.grRules{i}=[model.grRules{i} ')']; 0766 end 0767 end 0768 0769 0770 %Supporter function to list the files in a directory and return them as a 0771 %cell array 0772 function files=listFiles(directory) 0773 temp=dir(directory); 0774 files=cell(numel(temp),1); 0775 for i=1:numel(temp) 0776 files{i}=temp(i,1).name; 0777 end 0778 files=strrep(files,'.fa',''); 0779 files=strrep(files,'.hmm',''); 0780 files=strrep(files,'.out',''); 0781 files=strrep(files,'.faw',''); 0782 end


Hi, I'm Jared
Developer, Student, and (aspiring) Entrepreneur
All of my open source projects are hosted on Github @jawerty
* Articles
{% for post in site.posts %} {{ post.title }} - {{ post.date | date: "%B %e, %Y" }}{% endfor %}


There is a <script> tag on this page that uses Lazy.generate to define a Lazy.GeneratedSequence that computes prime numbers. It is currently iterating over this sequence asynchronously using #async(). Pretty neat, right?
<script>
Lazy.generate
Lazy.GeneratedSequence
#async()


Men Cry Bullets Reviewed by Eugene Novikov http://www.ultimate-movie.com/ Member: Online Film Critics Society
"When it comes to loss of love, men cry bullets."
Starring Starring Steven Nelson, Honey Lauren, Jeri Ryan. Not Rated (would be a strong R due to profanity, gore and full-frontal nudity).
I'm not the kind of person you'd find automatically giving high-marks to the avant-garde or patently bizarre. In fact, when I see a movie that is obviously calculated to have a strikingly weird look and feel, I make it my goal to look beyond atmosphere and see what I can find. It is typical of modern-day independent filmmakers to use an "original" facade to compensate for a pointless or hollow script (or no script at all, as in the case of I Woke Up Early the Day I Died). So when I find a film with its point as prevalent as its peculiarity, it is a find indeed.
Which brings me to Men Cry Bullets, a remarkable little movie that's as weird as it is complex. It marks the feature debut of short-film veteran Tamara Hernandez, and it's impressive. Brazenly original and visually striking, this obscure production probably won't get even a marginally wide release, but if it does happen to open near you, take my word for it and sprint to the theater wise enough to exhibit it.
The story seemed intriguing even before I actually saw the movie: Billy (steven Nelson), a female impersonator with little life experience is jostled during one of his performances by Gloria, a fiercely tough novelist (Honey Lauren) who still lives with her parents. He goes to her place of residence expecting an apology but what he gets instead is his very first sexual experience. This begins a rocky, one-sided relationship which takes our protagonist on a roller-coaster ride because he has no control over what he has gotten himself into; the relationship is run either by fate or by his girlfriend.
Meanwhile, Gloria's cousin Lydia(Jeri Ryan) comes to visit. She is a gorgeous woman and Gloria is horrifically jealous; she even makes up stories about her being in a mental institution.  But Billy takes a liking to the vicious woman and begins to question who is better for him, the abusive, relentlessly angry Gloria or the affectionate, beautiful, arrogant Lydia.
Men Cry Bullets turns the tables on your typical abusive relationship. This time, the male is docile and the woman is dominant. Scenes in which Billy is being smacked around are punctuated by flashbacks of his childhood in which he sees his mother being abused in uncannily similar ways. These sequences are as touching as they come; compassionate, heartfelt and very powerful. They are also cryptic, coming together to form a complicated big picture, making the movie a terrific character study.
Never underestimate the importance of style in an independent picture. Thankfully, Men Cry Bullets is far from lacking in visual flair. From the glitzy nightclub scenes to the downright gritty parts set in a house or out in the middle of a field, it never ceases to impress aesthetically. Adding atmosphere is an ominous, exciting soundtrack that stays in the background much of the time but always makes an impact.
I must caution that this isn't a movie for everyone. Some will be put off by the subject matter, others by the graphic content. I've learned that if I allow myself to be overly influenced by such things I'm likely to miss the thematic undertones of a picture and will wind up oblivious to its potential significance. If personal feelings overtly distract from your appreciation for a motion picture, lock them out. This film must be seen.
Grade: A-
©1999 Eugene Novikov
Sent via Deja.com http://www.deja.com/ Before you buy.
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


ZXing TypeScript Examples
ZXing ("zebra crossing") TypeScript is an open-source, multi-format 1D/2D barcode image processing library ported to TypeScript from Java.
The library can be used from browser or from node. Below are links to browser demo & examples.
More information can be found in GitHub project home page.
QR Code Scanning Examples
- Scan QR Code from Video Camera
- Scan QR Code from Image
- Scan QR Code from Video File
- Write QR Code to SVG
View source code on GitHub.


These illustrations from Gediminas Pranckevičius remind me of the personal myths & reflections of Carl Jung.
A combination of the surreal and a sense of shared archetypes makes a compelling work of art.
These illustrations from Gediminas Pranckevičius remind me of the personal myths & reflections of Carl Jung.
A combination of the surreal and a sense of shared archetypes makes a compelling work of art.


- accept() - Method in class Rhapsody.server.communications.ServerCom
-
Client acception method
- addPassengerToFlight(int, boolean) - Method in class Rhapsody.server.sharedRegions.GeneralRepository
-
Update flight with one new passenger
- addPassengerToFlight(int, boolean) - Method in class Rhapsody.server.stubs.GeneralRepositoryStub
-
disembark passenger
- addToBusSeat(int, boolean) - Method in class Rhapsody.server.sharedRegions.GeneralRepository
-
Update bus seats with one new passenger
- addToBusSeat(int, boolean) - Method in class Rhapsody.server.stubs.GeneralRepositoryStub
-
passenger # seats on bus
- addToWaitingQueue(int, boolean) - Method in class Rhapsody.server.sharedRegions.GeneralRepository
-
Update bus waiting line with one new passenger
- addToWaitingQueue(int, boolean) - Method in class Rhapsody.server.stubs.GeneralRepositoryStub
-
passenger # arrives to arrival terminal tranfer quay
- announcingBusBoarding() - Method in class Rhapsody.client.stubs.ArrivalQuayStub
-
Method used by the BusDriver that is waiting for a full bus or starting time
- announcingBusBoarding() - Method in class Rhapsody.server.sharedRegions.ArrivalQuay
-
Method used by the BusDriver that is waiting for a full bus or starting time
- ANSI_BLACK - Static variable in class Rhapsody.client.stubs.DepartureQuayStub
-
Prettify
- ANSI_BLACK - Static variable in class Rhapsody.server.sharedRegions.DepartureQuay
-
- ANSI_BLUE - Static variable in class Rhapsody.client.stubs.ArrivalQuayStub
-
Prettify
- ANSI_BLUE - Static variable in class Rhapsody.server.sharedRegions.ArrivalQuay
-
- ANSI_BLUE - Static variable in class Rhapsody.server.sharedRegions.DepartureEntrance
-
- ANSI_BLUE - Static variable in class Rhapsody.server.stubs.ArrivalQuayStub
-
Prettify
- ANSI_CYAN - Static variable in class Rhapsody.client.entities.Porter
-
- ANSI_GREEN - Static variable in class Rhapsody.client.entities.Passenger
-
Prettify
- ANSI_PASSENGER - Static variable in class Rhapsody.server.sharedRegions.ArrivalExit
-
- ANSI_PASSENGER - Static variable in class Rhapsody.server.sharedRegions.ArrivalLounge
-
- ANSI_PASSENGER - Static variable in class Rhapsody.server.sharedRegions.ArrivalQuay
-
- ANSI_PASSENGER - Static variable in class Rhapsody.server.sharedRegions.DepartureQuay
-
- ANSI_PORTER - Static variable in class Rhapsody.server.sharedRegions.ArrivalLounge
-
- ANSI_PURPLE - Static variable in class Rhapsody.client.entities.BusDriver
-
Pretty stuff
- ANSI_RED - Static variable in class Rhapsody.client.stubs.DepartureEntranceStub
-
Prettify
- ANSI_RED - Static variable in class Rhapsody.server.sharedRegions.DepartureEntrance
-
- ANSI_RED - Static variable in class Rhapsody.server.stubs.DepartureEntranceStub
-
Prettify
- ANSI_RESET - Static variable in class Rhapsody.server.sharedRegions.ArrivalExit
-
- ANSI_RESET - Static variable in class Rhapsody.server.sharedRegions.ArrivalLounge
-
prettify
- ANSI_RESET - Static variable in class Rhapsody.server.sharedRegions.ArrivalQuay
-
- ANSI_RESET - Static variable in class Rhapsody.server.sharedRegions.DepartureEntrance
-
- ANSI_RESET - Static variable in class Rhapsody.server.sharedRegions.DepartureQuay
-
- ANSI_WHITE - Static variable in class Rhapsody.client.stubs.ArrivalLoungeStub
-
Prettify
- ANSI_WHITE - Static variable in class Rhapsody.client.stubs.BaggageCollectionStub
-
Prettify
- ANSI_WHITE - Static variable in class Rhapsody.server.sharedRegions.BaggageCollection
-
- ANSI_WHITE - Static variable in class Rhapsody.server.stubs.ArrivalLoungeStub
-
Prettify
- ANSI_WHITE - Static variable in class Rhapsody.server.stubs.BaggageCollectionStub
-
Prettify
- ANSI_YELLOW - Static variable in class Rhapsody.client.stubs.ArrivalExitStub
-
Prettify
- ANSI_YELLOW - Static variable in class Rhapsody.server.sharedRegions.ArrivalExit
-
Prettify
- ANSI_YELLOW - Static variable in class Rhapsody.server.stubs.ArrivalExitStub
-
Prettify
- ArrivalExit - Class in Rhapsody.server.sharedRegions
-
Arrival Exit entity
- ArrivalExit(GeneralRepositoryStub, ArrivalQuayStub, DepartureEntranceStub, ArrivalLoungeStub) - Constructor for class Rhapsody.server.sharedRegions.ArrivalExit
-
Arrival Exit constructor
- ArrivalExitHostName - Static variable in class Rhapsody.common.RunParameters
-
Arrival Exit Hostname
- ArrivalExitMain - Class in Rhapsody.server
-
Main class for the Arrival Terminal Exit Shared memmory Launches the Java VM
for this entity only
- ArrivalExitMain() - Constructor for class Rhapsody.server.ArrivalExitMain
-
- ArrivalExitPort - Static variable in class Rhapsody.common.RunParameters
-
Arrival Exit Port
- ArrivalExitProxy - Class in Rhapsody.server.proxies
-
Arrival exit proxy for the servers
- ArrivalExitProxy(ArrivalExit) - Constructor for class Rhapsody.server.proxies.ArrivalExitProxy
-
Arrival Exit Proxy constructor
- ArrivalExitStub - Class in Rhapsody.client.stubs
-
Arrival Terminal exit stub for the clients
- ArrivalExitStub() - Constructor for class Rhapsody.client.stubs.ArrivalExitStub
-
Arrival exit stub constructor
- ArrivalExitStub - Class in Rhapsody.server.stubs
-
Arrival Terminal exit stub for the cross comms
- ArrivalExitStub() - Constructor for class Rhapsody.server.stubs.ArrivalExitStub
-
Arrival exit stub constructor
- ArrivalLounge - Class in Rhapsody.server.sharedRegions
-
Arival lounge entity
- ArrivalLounge(GeneralRepositoryStub, BaggageCollectionStub) - Constructor for class Rhapsody.server.sharedRegions.ArrivalLounge
-
Arrival Lounge constructor
- ArrivalLoungeHostName - Static variable in class Rhapsody.common.RunParameters
-
Arrival Lounge Hostname
- ArrivalLoungeMain - Class in Rhapsody.server
-
Main class for the arrival lounge entity
- ArrivalLoungeMain() - Constructor for class Rhapsody.server.ArrivalLoungeMain
-
- ArrivalLoungePort - Static variable in class Rhapsody.common.RunParameters
-
Arrival Lounge Port
- ArrivalLoungeProxy - Class in Rhapsody.server.proxies
-
Arrival lounge proxy to process and reply to messages
- ArrivalLoungeProxy(ArrivalLounge) - Constructor for class Rhapsody.server.proxies.ArrivalLoungeProxy
-
Arrival lounge proxy constructor
- ArrivalLoungeStub - Class in Rhapsody.client.stubs
-
Arrival lounge stub, implements an interface for the clients to interact with
the arrival lounge from a safe distance
- ArrivalLoungeStub() - Constructor for class Rhapsody.client.stubs.ArrivalLoungeStub
-
- ArrivalLoungeStub - Class in Rhapsody.server.stubs
-
Arrival lounge stub, implements an interface for the servers
- ArrivalLoungeStub() - Constructor for class Rhapsody.server.stubs.ArrivalLoungeStub
-
- ArrivalQuay - Class in Rhapsody.server.sharedRegions
-
Arrival terminal transfer quay entity
- ArrivalQuay(long, GeneralRepositoryStub) - Constructor for class Rhapsody.server.sharedRegions.ArrivalQuay
-
ArrivalTerminalTransfer constructor method
- ArrivalQuayHostName - Static variable in class Rhapsody.common.RunParameters
-
Arrival Terminal Transfer Quay Hostname
- ArrivalQuayMain - Class in Rhapsody.server
-
Main class for the arrival terminal transfer quay entity
- ArrivalQuayMain() - Constructor for class Rhapsody.server.ArrivalQuayMain
-
- ArrivalQuayPort - Static variable in class Rhapsody.common.RunParameters
-
Arrival Terminal Transfer Quay Port
- ArrivalQuayProxy - Class in Rhapsody.server.proxies
-
Arrival Quay proxy
- ArrivalQuayProxy(ArrivalQuay) - Constructor for class Rhapsody.server.proxies.ArrivalQuayProxy
-
Proxy constructor
- ArrivalQuayStub - Class in Rhapsody.client.stubs
-
Arrival Terminal Transfer Quay Stub for the clients
- ArrivalQuayStub() - Constructor for class Rhapsody.client.stubs.ArrivalQuayStub
-
Arrival quay stub constructor
- ArrivalQuayStub - Class in Rhapsody.server.stubs
-
Arrival Terminal Transfer Quay Stub for the server
- ArrivalQuayStub() - Constructor for class Rhapsody.server.stubs.ArrivalQuayStub
-
Arrival quay stub constructor
- baggageCollection - Variable in class Rhapsody.server.sharedRegions.ArrivalLounge
-
Luggage collection point stub
- BaggageCollection - Class in Rhapsody.server.sharedRegions
-
Luggage collection point entity
- BaggageCollection(GeneralRepositoryStub) - Constructor for class Rhapsody.server.sharedRegions.BaggageCollection
-
Constructor of Baggage collection point
- BaggageCollectionHostName - Static variable in class Rhapsody.common.RunParameters
-
Baggage Collection Point Hostname
- BaggageCollectionMain - Class in Rhapsody.server
-
Main class for the luggage collection point entity
- BaggageCollectionMain() - Constructor for class Rhapsody.server.BaggageCollectionMain
-
- BaggageCollectionPort - Static variable in class Rhapsody.common.RunParameters
-
Baggage Collection Point Port
- BaggageCollectionProxy - Class in Rhapsody.server.proxies
-
Luggage collection point proxy
- BaggageCollectionProxy(BaggageCollection) - Constructor for class Rhapsody.server.proxies.BaggageCollectionProxy
-
Proxy constructor
- BaggageCollectionStub - Class in Rhapsody.client.stubs
-
Luggage collection stub
- BaggageCollectionStub() - Constructor for class Rhapsody.client.stubs.BaggageCollectionStub
-
Baggage collection stub constructor
- BaggageCollectionStub - Class in Rhapsody.server.stubs
-
Luggage collection stub for the servers
- BaggageCollectionStub() - Constructor for class Rhapsody.server.stubs.BaggageCollectionStub
-
Baggage collection stub constructor
- BaggageReclaim - Class in Rhapsody.server.sharedRegions
-
Baggage reclaim office entity
- BaggageReclaim(GeneralRepositoryStub) - Constructor for class Rhapsody.server.sharedRegions.BaggageReclaim
-
BaggageReclaim constructor
- BaggageReclaimHostName - Static variable in class Rhapsody.common.RunParameters
-
Baggage Reclaim Office Port
- BaggageReclaimMain - Class in Rhapsody.server
-
Luggage reclaim office entity instantiator
- BaggageReclaimMain() - Constructor for class Rhapsody.server.BaggageReclaimMain
-
- BaggageReclaimPort - Static variable in class Rhapsody.common.RunParameters
-
Baggage Reclaim Office Port
- BaggageReclaimProxy - Class in Rhapsody.server.proxies
-
Baggage reclaim office proxy
- BaggageReclaimProxy(BaggageReclaim) - Constructor for class Rhapsody.server.proxies.BaggageReclaimProxy
-
Constructor of the proxy
- BaggageReclaimStub - Class in Rhapsody.client.stubs
-
Baggage Reclaim stub for the clients
- BaggageReclaimStub() - Constructor for class Rhapsody.client.stubs.BaggageReclaimStub
-
Bagggage reclaim stub constructor
- burstAddPass(int, States, String, int, int, boolean) - Method in class Rhapsody.server.stubs.GeneralRepositoryStub
-
Burst add passenger method
- burstAddPassenger(int, States, String, int, int, boolean) - Method in class Rhapsody.server.sharedRegions.GeneralRepository
-
Updates a passenger with all dat ain one go
- BusDriver - Class in Rhapsody.client.entities
-
BusDriver entity code
- BusDriver(long, ArrivalQuayStub, DepartureQuayStub) - Constructor for class Rhapsody.client.entities.BusDriver
-
BusDriver entity constructor
- BusDriverInterface - Interface in Rhapsody.server.interfaces
-
Bus driver interface to be provided by the tunnel provider for the proxies
- BusDriverMain - Class in Rhapsody.client
-
Bus Driver main
- BusDriverMain() - Constructor for class Rhapsody.client.BusDriverMain
-
- busSchedule - Static variable in class Rhapsody.common.RunParameters
-
Bus scheduled timout
- carryItToAppropriateStore(Luggage) - Method in class Rhapsody.client.stubs.BaggageCollectionStub
-
Method to deposit a bag in the conveyor belt
DOES NOT ALTER BAGS IN PLANE'S HOLD OR STOREROOM
- carryItToAppropriateStore(Luggage) - Method in class Rhapsody.client.stubs.StorageAreaStub
-
Method to deposit a bag in storeroom.
- carryItToAppropriateStore(Luggage) - Method in class Rhapsody.server.sharedRegions.BaggageCollection
-
Method to deposit a bag in the conveyor belt
DOES NOT ALTER BAGS IN PLANE'S HOLD OR STOREROOM
- carryItToAppropriateStore(Luggage) - Method in class Rhapsody.server.sharedRegions.StorageArea
-
Method to deposit a bag in storeroom.
- clearFlight(boolean) - Method in class Rhapsody.server.sharedRegions.GeneralRepository
-
Method to clear all data relative to the flight
- clearFlight(boolean) - Method in class Rhapsody.server.stubs.GeneralRepositoryStub
-
Clear flight log method
- ClientCom - Class in Rhapsody.client.communications
-
Client communication channel data type Uses TCP sockets and object-based data
transfer
- ClientCom(String, int) - Constructor for class Rhapsody.client.communications.ClientCom
-
ClientCom constructor method
- ClientCom - Class in Rhapsody.server.communications
-
Client communication channel data type Uses TCP sockets and object-based data
transfer
- ClientCom(String, int) - Constructor for class Rhapsody.server.communications.ClientCom
-
ClientCom constructor method
- close() - Method in class Rhapsody.client.communications.ClientCom
-
Client closing method
- close() - Method in class Rhapsody.server.communications.ClientCom
-
Client closing method
- close() - Method in class Rhapsody.server.communications.ServerCom
-
Closing of the server socket
- closeStub() - Method in class Rhapsody.client.stubs.ArrivalExitStub
-
Close stub
- closeStub() - Method in class Rhapsody.client.stubs.ArrivalLoungeStub
-
Signals simulation finish
- closeStub() - Method in class Rhapsody.client.stubs.ArrivalQuayStub
-
Close stub
- closeStub() - Method in class Rhapsody.client.stubs.BaggageCollectionStub
-
Close the stub
- closeStub() - Method in class Rhapsody.client.stubs.BaggageReclaimStub
-
Close the stub connection
- closeStub() - Method in class Rhapsody.client.stubs.DepartureEntranceStub
-
Close the stub
- closeStub() - Method in class Rhapsody.client.stubs.DepartureQuayStub
-
Close the stub
- closeStub() - Method in class Rhapsody.client.stubs.StorageAreaStub
-
Close the stub
- closeStub() - Method in class Rhapsody.server.stubs.ArrivalExitStub
-
Close teh stub
- closeStub() - Method in class Rhapsody.server.stubs.ArrivalLoungeStub
-
Close the stub
- closeStub() - Method in class Rhapsody.server.stubs.ArrivalQuayStub
-
Close stub
- closeStub() - Method in class Rhapsody.server.stubs.BaggageCollectionStub
-
Close the stub
- closeStub() - Method in class Rhapsody.server.stubs.DepartureEntranceStub
-
Close the stub
- closeStub() - Method in class Rhapsody.server.stubs.GeneralRepositoryStub
-
Close stub
- currentBlockedPassengers() - Method in class Rhapsody.client.stubs.ArrivalExitStub
-
Getter method to obtain currentBlocked threads
- currentBlockedPassengers() - Method in class Rhapsody.client.stubs.DepartureEntranceStub
-
Method to get all waiting threads in this object monitor
- currentBlockedPassengers() - Method in class Rhapsody.server.sharedRegions.ArrivalExit
-
Getter method to obtain currentBlocked threads
- currentBlockedPassengers() - Method in class Rhapsody.server.sharedRegions.DepartureEntrance
-
Method to get all waiting threads in this object monitor
- currentBlockedPassengers() - Method in class Rhapsody.server.stubs.ArrivalExitStub
-
Getter method to obtain currentBlocked threads
- currentBlockedPassengers() - Method in class Rhapsody.server.stubs.DepartureEntranceStub
-
Method to get all waiting threads in this object monitor
- generalRepository - Variable in class Rhapsody.server.sharedRegions.ArrivalLounge
-
Logger stub
- GeneralRepository - Class in Rhapsody.server.sharedRegions
-
Repository shared region entity code Basically is a log handler
- GeneralRepository(String, States, States, States[], int[], int[], String[], int[], int[]) - Constructor for class Rhapsody.server.sharedRegions.GeneralRepository
-
General repository constructor
- GeneralRepositoryMain - Class in Rhapsody.server
-
Repository server launcher
- GeneralRepositoryMain() - Constructor for class Rhapsody.server.GeneralRepositoryMain
-
- GeneralRepositoryProxy - Class in Rhapsody.server.proxies
-
Repository proxy data type
- GeneralRepositoryProxy(GeneralRepository) - Constructor for class Rhapsody.server.proxies.GeneralRepositoryProxy
-
RepositoryProxy Construtor method
- GeneralRepositoryStub - Class in Rhapsody.server.stubs
-
General repository stub
- GeneralRepositoryStub() - Constructor for class Rhapsody.server.stubs.GeneralRepositoryStub
-
Stub constructor
- getBool1() - Method in class Rhapsody.common.Message
-
Get first boolean value
- getBool2() - Method in class Rhapsody.common.Message
-
Get second boolean value
- getBusDriverState() - Method in class Rhapsody.client.entities.BusDriver
-
Gets current BusDriver State
- getCurrentBag() - Method in class Rhapsody.server.communications.TunnelProvider
-
Get current luggage the porter is holding
- getCurrentBag() - Method in interface Rhapsody.server.interfaces.PorterInterface
-
Gets teh current bag the porter is holding
- getCurrentBags() - Method in class Rhapsody.client.entities.Passenger
-
Return's pasenger current bags
- getCurrentBags() - Method in class Rhapsody.server.communications.TunnelProvider
-
Gets the current bags of the passenger
- getCurrentBags() - Method in interface Rhapsody.server.interfaces.PassengerInterface
-
Gets the current bags the passenger has
- getCurrentLuggage() - Method in class Rhapsody.client.entities.Porter
-
Returns the bag porter is currently holding
- getCurrentState() - Method in class Rhapsody.client.entities.Passenger
-
Return's passenger current state
- getEntityID() - Method in class Rhapsody.server.communications.TunnelProvider
-
Get entity ID
- getEntityID() - Method in interface Rhapsody.server.interfaces.PassengerInterface
-
Get current entity ID
- getEntityState() - Method in class Rhapsody.server.communications.TunnelProvider
-
Return the state of the current entity
- getEntityState() - Method in interface Rhapsody.server.interfaces.BusDriverInterface
-
Get busdriver current state
- getEntityState() - Method in interface Rhapsody.server.interfaces.PassengerInterface
-
Get current entity state
- getEntityState() - Method in interface Rhapsody.server.interfaces.PorterInterface
-
Get busdriver current state
- getFlightID() - Method in class Rhapsody.server.communications.TunnelProvider
-
Get current clight ID
- getFlightID() - Method in interface Rhapsody.server.interfaces.PassengerInterface
-
Gets the current flight
- getId() - Method in class Rhapsody.common.Message
-
Return entity ID
- getInt1() - Method in class Rhapsody.common.Message
-
Get first integer value
- getInt2() - Method in class Rhapsody.common.Message
-
Get second integer value
- getInt3() - Method in class Rhapsody.common.Message
-
Get third integer value
- getIntArray1() - Method in class Rhapsody.common.Message
-
Get intArray1 value
- getIntArray2() - Method in class Rhapsody.common.Message
-
Get intArray2 value
- getLuggages() - Method in class Rhapsody.server.communications.TunnelProvider
-
7Get the amount of luggages the passenger has, or -1 if it is a
Porter/BusDriver entity
- getLuggageType() - Method in class Rhapsody.common.Luggage
-
Returns type of luggage
- getPassengerId() - Method in class Rhapsody.client.entities.Passenger
-
Return's passenger id
- getPassengerId() - Method in class Rhapsody.common.Luggage
-
Returns the Id of the passenger whose this luggage belongs
- getPassengerSituation() - Method in class Rhapsody.client.entities.Passenger
-
Get passenger situation for all flights
- getPorterState() - Method in class Rhapsody.client.entities.Porter
-
Returns porter current state
- getSeats() - Method in class Rhapsody.server.communications.TunnelProvider
-
Gets the seats in the bus
- getSeats() - Method in interface Rhapsody.server.interfaces.BusDriverInterface
-
Gets the seats in the bus
- getSituation() - Method in class Rhapsody.server.communications.TunnelProvider
-
Get passenger current situation
- getSituation() - Method in interface Rhapsody.server.interfaces.PassengerInterface
-
Get passenger situation for this flight
- getStartingBags() - Method in class Rhapsody.client.entities.Passenger
-
Get passenger starting bags for all flights
- getStartingBags() - Method in class Rhapsody.server.communications.TunnelProvider
-
gets the starting bags for the current flight
- getStartingBags() - Method in interface Rhapsody.server.interfaces.PassengerInterface
-
Gets the passenger starting bags for this flight
- getState() - Method in class Rhapsody.common.Message
-
Return entity state
- getType() - Method in class Rhapsody.common.Message
-
Set packet type, see PacketType for possible types
- getValidBool1() - Method in class Rhapsody.common.Message
-
Get first boolean value validity
- getValidBool2() - Method in class Rhapsody.common.Message
-
Get second boolean value validity
- getValidID() - Method in class Rhapsody.common.Message
-
Return entity ID validity
- getValidInt1() - Method in class Rhapsody.common.Message
-
Get first integer value validity
- getValidInt2() - Method in class Rhapsody.common.Message
-
Get second integer value validity
- getValidInt3() - Method in class Rhapsody.common.Message
-
Get third integer value validity
- getValidIntArray1() - Method in class Rhapsody.common.Message
-
Get validity of intArray1 field
- getValidIntArray2() - Method in class Rhapsody.common.Message
-
Get validity of intArray2 field
- getValidState() - Method in class Rhapsody.common.Message
-
Return entity state validity
- getValidType() - Method in class Rhapsody.common.Message
-
Get type validity
- goCollectABag(int) - Method in class Rhapsody.client.stubs.BaggageCollectionStub
-
Method for a passenger to try to collect the bags
- goCollectABag(int) - Method in class Rhapsody.server.sharedRegions.BaggageCollection
-
Method for a passenger to try to collect the bags
- goHome(boolean) - Method in class Rhapsody.client.stubs.ArrivalExitStub
-
GoHome method to signal a passenger his rhapsody has ended
- goHome(boolean) - Method in class Rhapsody.server.sharedRegions.ArrivalExit
-
GoHome method to signal a passenger his rhapsody has ended
- goToArrivalTerminal() - Method in class Rhapsody.client.stubs.DepartureQuayStub
-
method that simulates go back voyage of the BusDriver
- goToArrivalTerminal() - Method in class Rhapsody.server.sharedRegions.DepartureQuay
-
method that simulates go back voyage of the BusDriver
- goToDepartureTerminal() - Method in class Rhapsody.client.stubs.ArrivalQuayStub
-
Method to simulate the bus voyage
- goToDepartureTerminal() - Method in class Rhapsody.server.sharedRegions.ArrivalQuay
-
Method to simulate the bus voyage
- parkTheBus() - Method in class Rhapsody.client.stubs.ArrivalQuayStub
-
Method used by the BusDriver to signal he has arrived to the arrival terminal
bus stop
- parkTheBus() - Method in class Rhapsody.server.sharedRegions.ArrivalQuay
-
Method used by the BusDriver to signal he has arrived to the arrival terminal
bus stop
- parkTheBusAndLetPassOff(Queue<Integer>) - Method in class Rhapsody.client.stubs.DepartureQuayStub
-
Method to signl bus parking by the BusDriver entity
- parkTheBusAndLetPassOff(Queue<Integer>) - Method in class Rhapsody.server.sharedRegions.DepartureQuay
-
Method to signl bus parking by the BusDriver entity
- Passenger - Class in Rhapsody.client.entities
-
Passenger life-cycle Passenger arrives and informs of it's arival to the
lounge [Lounge.java] {AT_DISEMBARKING_ZONE} The Lounge puts the passenger on
hold until it can go to the baggage collection point (porter might be busy
with another plane) The Lounge checks if this passenger is the last of it's
flight, if it is awakes the porter, if it's not allows the porter to sleep
more When the porter awakes goes to the baggage collection point
[BaggageCollectionPoint.java] {AT_LUGGAGE_COLLECTION} In collection point
tries to collect all bags If successfull will go back to lounge or goHome
(50/50 chance) {AT_DISEMBARKING_ZONE, EXIT_ARRIVAL_TERMINAL} If porter
signals end of bags before it has collected all bags it will go to baggage
reclaim office {AT_LUGGAGE_RECLAIM} Baggage Reclaim office will answer all at
the same time(?)
- Passenger(int, int[], String[], ArrivalExitStub, ArrivalLoungeStub, ArrivalQuayStub, BaggageCollectionStub, BaggageReclaimStub, DepartureEntranceStub, DepartureQuayStub) - Constructor for class Rhapsody.client.entities.Passenger
-
Passenger entity constructor
- PassengerInterface - Interface in Rhapsody.server.interfaces
-
Passenger interface to be used for the provider
- PassengerMain - Class in Rhapsody.client
-
Passenger Thread Implements the life-cycle of the passenger and stores it's
current state.
- PassengerMain() - Constructor for class Rhapsody.client.PassengerMain
-
- Porter - Class in Rhapsody.client.entities
-
Porter entity data-type
- Porter(StorageAreaStub, ArrivalLoungeStub, BaggageCollectionStub) - Constructor for class Rhapsody.client.entities.Porter
-
Porter entity constructor
- PorterInterface - Interface in Rhapsody.server.interfaces
-
Porter interface data-type
- PorterMain - Class in Rhapsody.client
-
Porter main
- PorterMain() - Constructor for class Rhapsody.client.PorterMain
-
- prepareNextLeg(boolean) - Method in class Rhapsody.client.stubs.DepartureEntranceStub
-
Blocking method that signals a passenger is ready to leave the airport.
- prepareNextLeg(boolean) - Method in class Rhapsody.server.sharedRegions.DepartureEntrance
-
Blocking method that signals a passenger is ready to leave the airport.
- proccesPacket(Message) - Method in class Rhapsody.server.proxies.ArrivalExitProxy
-
Process the message packet and generates a reply
- proccesPacket(Message) - Method in class Rhapsody.server.proxies.ArrivalLoungeProxy
-
Process message and generate reply
- proccesPacket(Message) - Method in class Rhapsody.server.proxies.ArrivalQuayProxy
-
Process message and generate reply
- proccesPacket(Message) - Method in class Rhapsody.server.proxies.BaggageCollectionProxy
-
Proccess received message and generate reply
- proccesPacket(Message) - Method in class Rhapsody.server.proxies.BaggageReclaimProxy
-
Process message and generate reply
- proccesPacket(Message) - Method in class Rhapsody.server.proxies.DepartureEntranceProxy
-
Proccess message and generate reply
- proccesPacket(Message) - Method in class Rhapsody.server.proxies.DepartureQuayProxy
-
Processmessages and reply
- proccesPacket(Message) - Method in class Rhapsody.server.proxies.GeneralRepositoryProxy
-
Message processor
- proccesPacket(Message) - Method in interface Rhapsody.server.proxies.SharedMemoryProxy
-
Generic method to proccess a packet and generate a reply
- proccesPacket(Message) - Method in class Rhapsody.server.proxies.StorageAreaProxy
-
Process and reply method
- readObject() - Method in class Rhapsody.client.communications.ClientCom
-
Client data stream read method
- readObject() - Method in class Rhapsody.server.communications.ClientCom
-
Client data stream read method
- readObject() - Method in class Rhapsody.server.communications.ServerCom
-
Server data stream read method
- registerMem(int) - Method in class Rhapsody.server.stubs.GeneralRepositoryStub
-
Shared memory registering in logger
- removeFromBusSeat(boolean) - Method in class Rhapsody.server.sharedRegions.GeneralRepository
-
Update bus seats with one less passenger
- removeFromBusSeat(boolean) - Method in class Rhapsody.server.stubs.GeneralRepositoryStub
-
passenger # gets out of bus
- removeFromWaitingQueue(boolean) - Method in class Rhapsody.server.sharedRegions.GeneralRepository
-
Update bus waiting line with one less passenger
- removeFromWaitingQueue(boolean) - Method in class Rhapsody.server.stubs.GeneralRepositoryStub
-
passenger # goes inside bus
- removePassengerFromFlight(int, boolean) - Method in class Rhapsody.server.sharedRegions.GeneralRepository
-
Update flight with one new passenger
- reportMissingBags(int) - Method in class Rhapsody.client.stubs.BaggageReclaimStub
-
Method to client register his complaint about any lost luggage
- reportMissingBags(int) - Method in class Rhapsody.server.sharedRegions.BaggageReclaim
-
Method to client register his complaint about any lost luggage
- RepositoryHostName - Static variable in class Rhapsody.common.RunParameters
-
Repository Hostname
- RepositoryPort - Static variable in class Rhapsody.common.RunParameters
-
Repository Port
- Rhapsody.client - package Rhapsody.client
-
Airport Rhapsody Clients
Passenger, Bus Driver and Porter
- Rhapsody.client.communications - package Rhapsody.client.communications
-
Client Side communications channel
- Rhapsody.client.entities - package Rhapsody.client.entities
-
Interviening entites in the simulation
- Rhapsody.client.stubs - package Rhapsody.client.stubs
-
Stubs of the shared regions
- Rhapsody.common - package Rhapsody.common
-
Common classes to be used by the servers/clients for communication
- Rhapsody.server - package Rhapsody.server
-
Airport Rhapsody Server
Contains all shared regions (Lounge, Quays, Baggage Offices, Depatures and Storage Areas) as well as the repository
- Rhapsody.server.communications - package Rhapsody.server.communications
-
Server Side communications channel
- Rhapsody.server.interfaces - package Rhapsody.server.interfaces
-
Server interfaces for communication with the clients
- Rhapsody.server.proxies - package Rhapsody.server.proxies
-
Proxies of shared memories to parse messages and call the corresponding functions
Proxies unwrap the messages and forward them to the responsible entites, also wrap messages to be sent
- Rhapsody.server.sharedRegions - package Rhapsody.server.sharedRegions
-
Shared regions of the simulation
- Rhapsody.server.stubs - package Rhapsody.server.stubs
-
Airport Rhapsody Stubs
Contains all stubs for necessary shared regions (Lounge, Quays, Baggage Offices, Depatures and Storage Areas) to logging and cross comms
- run() - Method in class Rhapsody.client.entities.BusDriver
-
Bus Driver run method
- run() - Method in class Rhapsody.client.entities.Passenger
-
Passenger run method
- run() - Method in class Rhapsody.client.entities.Porter
-
Porter life-cycle
- run() - Method in class Rhapsody.server.communications.TunnelProvider
-
Wait & send method for the shared memory
- RunParameters - Class in Rhapsody.common
-
Simulation parameters
- RunParameters() - Constructor for class Rhapsody.common.RunParameters
-
- ServerCom - Class in Rhapsody.server.communications
-
Server communicaton channel data type
- ServerCom(int) - Constructor for class Rhapsody.server.communications.ServerCom
-
Communication channel creation (1)
- ServerCom(int, ServerSocket) - Constructor for class Rhapsody.server.communications.ServerCom
-
Communication channel creation (2)
- ServerCom(int, int) - Constructor for class Rhapsody.server.communications.ServerCom
-
Communication channel creation (3)
- ServerCom(int, int, ServerSocket) - Constructor for class Rhapsody.server.communications.ServerCom
-
Communication channel creation (4)
- setBool1(boolean) - Method in class Rhapsody.common.Message
-
Set first boolean to given value
- setBool2(boolean) - Method in class Rhapsody.common.Message
-
Set second boolean value to given value
- setBusDriverState(States) - Method in class Rhapsody.client.entities.BusDriver
-
Sets BusDriver state to new state
- setCurrentBag(Luggage) - Method in class Rhapsody.server.communications.TunnelProvider
-
Sets the current luggage the porter is holding
- setCurrentBag(Luggage) - Method in interface Rhapsody.server.interfaces.PorterInterface
-
Sets the bag the porter is holding to the specified bag
- setCurrentBags(int) - Method in class Rhapsody.client.entities.Passenger
-
Sets passenger current bags
- setCurrentBags(int) - Method in class Rhapsody.server.communications.TunnelProvider
-
Sets the current luggages to the specified value
- setCurrentBags(int) - Method in interface Rhapsody.server.interfaces.PassengerInterface
-
Sets the current bags the passenger is holding to the given value
- setCurrentLuggage(Luggage) - Method in class Rhapsody.client.entities.Porter
-
Sets the porter current luggage holding
- setCurrentState(States) - Method in class Rhapsody.client.entities.Passenger
-
Passenger state alteration function
- setEntityID(int) - Method in class Rhapsody.server.communications.TunnelProvider
-
Set entity ID
- setEntityID(int) - Method in interface Rhapsody.server.interfaces.PassengerInterface
-
Sets new ID if needed
- setEntityState(States) - Method in class Rhapsody.server.communications.TunnelProvider
-
Set current entity state
- setEntityState(States) - Method in interface Rhapsody.server.interfaces.BusDriverInterface
-
Set new busdriver state
- setEntityState(States) - Method in interface Rhapsody.server.interfaces.PassengerInterface
-
Set current entity state
- setEntityState(States) - Method in interface Rhapsody.server.interfaces.PorterInterface
-
Set new busdriver state
- setFlightID(int) - Method in class Rhapsody.server.communications.TunnelProvider
-
Set the flight ID, useful for altering the flight ID mid-simulation
- setId(int) - Method in class Rhapsody.common.Message
-
Set entity ID
- setInt1(int) - Method in class Rhapsody.common.Message
-
Set first integer value
- setInt2(int) - Method in class Rhapsody.common.Message
-
Set second integer value
- setInt3(int) - Method in class Rhapsody.common.Message
-
Set third integer value
- setIntArray1(int[]) - Method in class Rhapsody.common.Message
-
set intArray1 value to be sent
- setIntArray2(int[]) - Method in class Rhapsody.common.Message
-
set intArray2 value to be sent
- setLuggages(int) - Method in class Rhapsody.server.communications.TunnelProvider
-
Sets the amount of luggages the entity has or -1 if it is a Porter/BusDriver
- setPorterState(States) - Method in class Rhapsody.client.entities.Porter
-
Sets porter current state to the pretended state
- setSeats(int[]) - Method in class Rhapsody.server.communications.TunnelProvider
-
Sets the seats in the bus
- setSeats(int[]) - Method in interface Rhapsody.server.interfaces.BusDriverInterface
-
Sets the current seats on the bus
- setSituation(int) - Method in class Rhapsody.server.communications.TunnelProvider
-
Set passenget situation
- setSituation(int) - Method in interface Rhapsody.server.interfaces.PassengerInterface
-
Set passenger flight situation
- setStartingBags(int) - Method in class Rhapsody.server.communications.TunnelProvider
-
Set passenger startign bags
- setStartingBags(int) - Method in interface Rhapsody.server.interfaces.PassengerInterface
-
Set the passenger starting bags
- setState(States) - Method in class Rhapsody.common.Message
-
Set entity state
- setType(MessageType) - Method in class Rhapsody.common.Message
-
Get Packet type
- SharedMemoryProxy - Interface in Rhapsody.server.proxies
-
Generic interface for all the shared memories
- start() - Method in class Rhapsody.server.communications.ServerCom
-
Server startup method
- States - Enum in Rhapsody.common
-
Enum class with possible states for all entites
- stop() - Method in class Rhapsody.server.communications.ServerCom
-
Server alting method
- StorageArea - Class in Rhapsody.server.sharedRegions
-
- StorageArea(GeneralRepositoryStub) - Constructor for class Rhapsody.server.sharedRegions.StorageArea
-
Contructor method for the StoreRoom
- StorageAreaHostName - Static variable in class Rhapsody.common.RunParameters
-
Storage Area Port
- StorageAreaMain - Class in Rhapsody.server
-
Storage area main
- StorageAreaMain() - Constructor for class Rhapsody.server.StorageAreaMain
-
- StorageAreaPort - Static variable in class Rhapsody.common.RunParameters
-
Storage Area Port
- StorageAreaProxy - Class in Rhapsody.server.proxies
-
Storage Area proxy
- StorageAreaProxy(StorageArea) - Constructor for class Rhapsody.server.proxies.StorageAreaProxy
-
Proxy construtctor
- StorageAreaStub - Class in Rhapsody.client.stubs
-
Storage area stub
- StorageAreaStub() - Constructor for class Rhapsody.client.stubs.StorageAreaStub
-
Stub constructor
- synchBlocked() - Method in class Rhapsody.client.stubs.ArrivalExitStub
-
Method to increment the number of passengers that terminated in this monitor
- synchBlocked() - Method in class Rhapsody.client.stubs.DepartureEntranceStub
-
Method to increment the number of passengers that terminated in this monitor
- synchBlocked() - Method in class Rhapsody.server.sharedRegions.ArrivalExit
-
Method to increment the number of passengers that terminated in this monitor
- synchBlocked() - Method in class Rhapsody.server.sharedRegions.DepartureEntrance
-
Method to increment the number of passengers that terminated in this monitor
- synchBlocked() - Method in class Rhapsody.server.stubs.DepartureEntranceStub
-
Method to increment the number of passengers that terminated in this monitor
- updateBagsInPlane(int, boolean) - Method in class Rhapsody.server.sharedRegions.GeneralRepository
-
Updates the amount of bags currently in the plane's hold
- updateBagsInPlane(int, boolean) - Method in class Rhapsody.server.stubs.GeneralRepositoryStub
-
Update bags in the plane hold
- updateBusDriverState(States, boolean) - Method in class Rhapsody.server.sharedRegions.GeneralRepository
-
- updateBusDriverState(States, boolean) - Method in class Rhapsody.server.stubs.GeneralRepositoryStub
-
update bus driver state
- updateConveyorBags(int, boolean) - Method in class Rhapsody.server.sharedRegions.GeneralRepository
-
Updates the amount of bags in the conveyor's belt with a
- updateConveyorBags(int, boolean) - Method in class Rhapsody.server.stubs.GeneralRepositoryStub
-
update bags in conveyors belt
- updateCurrentBags(int, int, boolean) - Method in class Rhapsody.server.sharedRegions.GeneralRepository
-
Updates the current bags a passenger is holding
- updateCurrentBags(int, int, boolean) - Method in class Rhapsody.server.stubs.GeneralRepositoryStub
-
update passenger # current bags
- updateFDTPassengers(int, boolean) - Method in class Rhapsody.server.sharedRegions.GeneralRepository
-
Increases the FDT-type passengers with the amount given in the entry
parameter
- updateFDTPassengers(int, boolean) - Method in class Rhapsody.server.stubs.GeneralRepositoryStub
-
Update amount of fdt passengers
- updateFlight(int, boolean) - Method in class Rhapsody.server.sharedRegions.GeneralRepository
-
Updates the flightId with the new flightId
- updateFlight(int, boolean) - Method in class Rhapsody.server.stubs.GeneralRepositoryStub
-
Update flight with new id
- updateLostbags(int, boolean) - Method in class Rhapsody.server.sharedRegions.GeneralRepository
-
Increases the amount of lost bags
- updateLostbags(int, boolean) - Method in class Rhapsody.server.stubs.GeneralRepositoryStub
-
update bags reported as lost
- updatePassengerState(States, int, boolean) - Method in class Rhapsody.server.sharedRegions.GeneralRepository
-
- updatePassengerState(States, int, boolean) - Method in class Rhapsody.server.stubs.GeneralRepositoryStub
-
update passenger # state
- updatePlaneHoldBags(int, boolean) - Method in class Rhapsody.server.sharedRegions.GeneralRepository
-
Increses the amount of bags that should have been transported in the planes
hold
- updatePlaneHoldBags(int, boolean) - Method in class Rhapsody.server.stubs.GeneralRepositoryStub
-
update bags supposed to be transported
- updatePorterState(States, boolean) - Method in class Rhapsody.server.sharedRegions.GeneralRepository
-
- updatePorterState(States, boolean) - Method in class Rhapsody.server.stubs.GeneralRepositoryStub
-
Update porter state
- updateSituation(int, String, boolean) - Method in class Rhapsody.server.sharedRegions.GeneralRepository
-
Updates the passenger situation (TRT or FDT)
- updateSituation(int, String, boolean) - Method in class Rhapsody.server.stubs.GeneralRepositoryStub
-
update passenger # situation
- updateStartingBags(int[], String[]) - Method in class Rhapsody.client.stubs.ArrivalLoungeStub
-
Logs passenger in the servers
- updateStartingBags(int, int[], int[]) - Method in class Rhapsody.server.sharedRegions.ArrivalLounge
-
Method to update the starting bags of the planes
- updateStartingBags(int, int, boolean) - Method in class Rhapsody.server.sharedRegions.GeneralRepository
-
Updates the starting bags of a passenger
- updateStartingBags(int, int, boolean) - Method in class Rhapsody.server.stubs.GeneralRepositoryStub
-
Update passenger # starting bags
- updateStoreRoomBags(int, boolean) - Method in class Rhapsody.server.sharedRegions.GeneralRepository
-
Updates the amount of bags in the conveyor's belt
- updateStoreRoomBags(int, boolean) - Method in class Rhapsody.server.stubs.GeneralRepositoryStub
-
update bags in storage area
- updateTRTPassengers(int, boolean) - Method in class Rhapsody.server.sharedRegions.GeneralRepository
-
Increases the TRT-type passengers with the amount given in the entry
parameter
- updateTRTPassengers(int, boolean) - Method in class Rhapsody.server.stubs.GeneralRepositoryStub
-
update passengers passed as TRT type


The block
element is a simple spacer tool. It allows sibling HTML elements to have a consistent margin between them:
--- title: Block layout: documentation doc-tab: elements doc-subtab: block breadcrumb: - home - documentation - elements - elements-block meta: colors: false sizes: false variables: true --- {% capture block_example %}
The block
element is a simple spacer tool. It allows sibling HTML elements to have a consistent margin between them:
As you can see, the first two blocks have a margin-bottom
applied, but not the third one.. That is because Bulma applies a space on all blocks, except the last one. This means you can use as many blocks as you want, the spacing will only appear between them.
Without using block
, the HTML elements would have no space between them:
As you can see, the CSS of the block
is very simple: it applies a margin-bottom
on all siblings, except the last one.
This prevents the last sibling to add unnecessary space at the bottom.
As a matter of fact, you're already using the block
without knowing it. The block
CSS properties are shared across several Bulma elements and components:
breadcrumb
level
message
pagination
tabs
box
content
notification
other
progress
table
title
This is thanks to the @extend %block
Sass placeholder feature.
As a result, no matter which Bulma elements and components you are using, and no matter their order, they will have a consistent space between them.


Home
Book Now
Contact Us
QR Code
Logout
Select you preffered slot from below.
slot booked
slot vacant
CAR PARK AVALIABILITY
CAR ENTRANCE
CAR EXIT
TOTAL DURATION
Book for RS.100
You won’t be charged yet and the cancellation is free of charge
QR Code
×


There are many tools out there to help us measure performance metrics occurring on website page-load. Lighthouse, Pingdom, and WebPageTest to name a few (many tools use Lighthouse under the hood). Tooling targeted at measuring the performance of user interactions on websites after page-load is harder to find. The lack of tools may be due to how each site has its own unique requirements and user interactions. Therefore, the developer (you!), must tailor post-page-load, user-centric performance testing based on what your individual site requirements are.
I've been dabbling with building a testing framework that automates measuring the duration of certain user interactions on my website. My hope is this post provides a starting point to anyone who is considering doing the same with their own site.
Possible areas to prioritize testing focus.
Changing routes in a SPA
Priority Interactions
After reading the article The Psychology of Web Performance and it's excerpt from Usability Engineering there are "3 important limits to keep in mind when optimizing web and application performance."
When defining baselines to determine the success or failure of a test keep these limits in mind.
Puppeteer - a headless browser Node.js library.
Chrome Developer Tools Performance Timeline - included with the Chrome web browser
Assuming you've already installed Node and Puppeteer, let's look at a starting point for your Node.js script taken from this blog post by Addy Osmani.
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
const navigationPromise = page.waitForNavigation();
await page.goto('https://pptr.dev/#?product=Puppeteer&version=v2.1.1&show=outline');
await page.setViewport({ width: 1440, height: 714 });
await navigationPromise;
const selector = 'body > sidebar-component > sidebar-item:nth-child(3) > .pptr-sidebar-item';
await page.waitForSelector(selector);
await page.tracing.start({ path: 'trace.json', screenshots: true });
await page.click(selector);
await page.tracing.stop();
await browser.close();
})();
What you see above is the basic idea.
Start a new browser instance
Navigate to a URL
Start a trace (utilizes the Chrome Dev Tools Protocol to interact with the Performance Timeline tool)
Select an element on the page and click it
Stop the trace
Close the browser
The output of the trace file generated (trace.json) will look similar to the following only with many more entries.
// trace.json
{
"traceEvents": [
{
"args": { "data": { "type": "click" } },
"cat": "devtools.timeline",
"dur": 7761,
"name": "EventDispatch",
"ph": "X",
"pid": 61589,
"tdur": 7706,
"tid": 775,
"ts":<PHONE_NUMBER>04,
"tts": 119022
},
{
"args": {
"cat": "devtools.timeline,rail",
"dur": 18,
"name": "Paint",
"ph": "X",
"pid": 61589,
"tdur": 18,
"tid": 775,
"ts":<PHONE_NUMBER>95,
"tts": 196604
}
}
]
}
The trace file contains a traceEvents
array. Each event object contains the values of
ts = time start;
dur = duration;
ts: The tracing clock timestamp of the event. The timestamps are provided at microsecond granularity.
There is an extra parameter dur to specify the tracing clock duration of complete events in microseconds.
All other parameters are the same as in duration events. The ts parameter indicate the time of the start of the complete event.
Unlike duration events, the timestamps of complete events can be in any order.
An optional parameter tdur specifies the thread clock duration of complete events in microseconds.
In order to accurately measure how long the user interaction has taken we need to analyze the trace file and identify the browser rendering events. This article by Paul Irish explains the browser's rendering process as the "Pixel Pipeline."
We can find all of these events in the trace file generated by Puppeteer. If we follow the order of events of the "Pixel Pipeline" we should be able to determine the total duration of the rendering process initiated from the user interaction. Subtract the "User Interaction" event start time ("click" event in my example) from the sum of the start time of the final "Composite" event and the duration of the final "Composite" event.
const totalDuration = finalCompositeStartTime + finalCompositeDuration - clickStartTime;
There are other modifications you can make to simulate users more realistically. Notably, simulating users on poor performing networks and CPU's. Puppeteer allows configuration of network and CPU throttling during the performance timeline traces.
// Connect to Chrome DevTools
const client = await page.target().createCDPSession();
//Set Network Throttling property
await client.send('Network.emulateNetworkConditions', {
offline: false,
downloadThroughput: (200 * 1024) / 8,
uploadThroughput: (200 * 1024) / 8,
latency: 20,
});
// Set CPU Throttling property
await client.send('Emulation.setCPUThrottlingRate', { rate: 4 });
That's all there is to it! Utilizing this tooling and knowledge of the browser's rendering process we can create baselines, execute user interactions, and analyze the resulting timings. We now have a starting point to incorporate performance tests into a CI/CD pipeline.
Part 2 of this series we will look at an example project which follows the methodology in this post.


https://github.com/fox-it/Invoke-ACLPwn
https://github.com/fox-it/aclpwn.py
https://github.com/BloodHoundAD/SharpHound
https://docs.microsoft.com/en-us/powershell/module/Microsoft.powershell.utility/convertfrom-sddlstring?view=powershell-6
Invoke-ACLpwn is a tool that automates the discovery and pwnage of ACLs in Active Directory that are unsafe configured.
Invoke-ACLpwn is designed to run with integrated credentials as well as with specified network credentials. The script works by creating an export of all ACLs in the domain with SharpHound as well as the group membership of the user account that the tool is running under. If the user does not already have writeDACL permissions on the domain object, the tool will enumerate all ACEs of the ACL of the domain. Every identity in an ACE has an ACL of its own, which is added to the enumeration queue. If the identity is a group and the group has members, every group member is added to the enumeration queue as well.
It may take some time to calculate and parse every ACL, but could end up with a "chain" that leads to domain administrative privilges in the target domain.


Hi,
I just soldered the EmonTX Low Power Temperature Node, uploaded the firmware as described at the page, set the frequency to 868MHZ. But nothing happens. I got the following code for the gLCD:
void loop(){
if (rf12_recvDone()){
if (rf12_crc == 0 && (rf12_hdr & RF12_HDR_CTL) == 0){ // and no rf errors
int node_id = (rf12_hdr & 0x1F);
if (node_id == 18){ // === EXTERNAL TEMP MODULE ====
Serial.println("COMMUNICATION OK ");
}
}
}
what could possibly be wrong??
Re: EmonTX Low Power Temperature Node
Bramper,
I'm guessing you were expecting the temperature to display on your GLCD?
1) Firstly have you checked that your Temperature node is working by looking at the serial output?
2) Is your temperature Node and your GLCD on the same Network Group? Take a look at http://openenergymonitor.org/emon/buildingblocks/rfm12b2
Re: EmonTX Low Power Temperature Node
Now I got output to the Serial monitor:
temp: always -12700
battery: 3255
But this I only got when I remove the following part from the script:
rf12_sleep(RF12_WAKEUP);
// if ready to send + exit loop if it gets stuck as it seems too
int i = 0; while (!rf12_canSend() && i<10) {rf12_recvDone(); i++;}
rf12_sendStart(0, &emontx, sizeof emontx);
// set the sync mode to 2 if the fuses are still the Arduino default
// mode 3 (full powerdown) can only be used with 258 CK startup fuses
rf12_sendWait(2);
rf12_sleep(RF12_SLEEP);
Sleepy::loseSomeTime(time_between_readings);
So I got 2 problems: temperature is not correct, and he does not send any data
Re: EmonTX Low Power Temperature Node
How confident are you of your soldering? It might be worth checking your board.
Re: EmonTX Low Power Temperature Node
I checked the board, everything is OK but...
I found something else, when I upload the original firmware (emontx_lowpower_temperature.ino) it was not working, when I upload another (emontx_lowpower_temperature_humidity) and I delete the part to measure the humidity, it works fine... strange,.... no??
Re: EmonTX Low Power Temperature Node
I post the code soon...
Re: EmonTX Low Power Temperature Node
as promised ...
the GLCD file and the emonTX low temperature node file


Arsenal fans praise Bernd Leno despite conceding two against Southampton
Bernd Leno saved a penalty.
by Jay WilliamsBernd Leno was let down by his defence once again, several Arsenal fans are saying.
Arsenal drew 2-2 at home with lowly Southampton in yet another disappointing result. The winless run goes on and Unai Emery faces increasing calls to walk.
Danny Ings fired Southampton into the lead early in the match before Alexandre Lacazette equalised. With less than 20 minutes remaining, Southampton retook the lead – despite Leno’s best efforts.
The German stopper saved James Ward-Prowse’s penalty but the English midfielder tapped in the rebound. Arsenal were eventually saved by a 96th-minute equaliser from Lacazette.
Leno has made the most saves of any goalkeeper in the Premier League. This is a testament to his fine form but it also highlights a major concern with Arsenal’s defence. The Gunners are conceding way too many shots and Leno does not have a chance.
Arsenal fans took to Twitter to praise Leno after Saturday’s draw with Southampton. Despite conceding two, he impressed with his overall performance and his penalty save. Here are some of the best tweets.
Have something to tell us about this article?
Let us know


shopping_cart
My Cart
Your cart is empty
Billing info
Item total
10
Delivery Charges
0
Taxes
0
To Pay
300
delete
Clear cart
check
Checkout


Login
Register
First name
Last name
Email address
Password
Confirm Password
Register
Have an account?
Login


Currently on job training where my primary language is Delphi (ew).
I like to work on small Projects, mostly in rust and
pascal,
like my
System Fetcher
or other simple CLI utils. I'm also a fulltime Linux
user and I'm currently running Arch with leftwm.


---
layout: post
title: A new buzzword
tags:
- Personal Opinion
status: publish
type: post
published: true
meta: {}
---
I have decided that Agile is
- Grossly overused and over hyped
- Promoted at the single silver bullet for all projects and project problems
A lot (most) of this is balderdash! However an Agile approach is till useful in many situations but in an effort to avoid the Agile bandwagon I will be using the term "Appropriately Lightweight" -- more on what this might mean for developers and application lifecycle management in the ongoing blog, I have already posted some material on lightweight ticket processes previously.
Or should that be a new "buzzphrase"?


Makoto Shinkai (新海 誠)
Anime Film Director
Makoto Shinki is a prominent anime film director in the industry. In recent years he was produced film hits such as "Graden of Words" and "Your Name". Influenced by titans such as Hayao Miyazaki, Makoto Shinki continutes to pave way to make his mark in anime history.
Shinkai began his career as a video game designer for the company Falcom. In 1999 he release a monochrome film, "She and Her Cat" for the DoGA CG Animation contest in 2000, a contest for entry-level animators. Upon winning the contest Shinkai would remain at Falcom but continue to create animations. In 2001 he quit his job at Falcom to pursue the production of "Voices of a Distant Star" full time which would be released in 2002. Shinkai's film releases would continue to be praised one after another by critics and fans alike. His most recent release "Your Name" currently stands as the highest-grossing anime film of all time. A title previously held by "Spirited Away" directed by the reknown Hayao Miyazaki. Shinkai's next filim "Weathering With You" is anticipated for release in 2019.
For more information about his works, visit his website!