Compare commits

...

3 Commits

Author SHA1 Message Date
boris
f64a9eadbe backup 2025-02-06 12:30:01 +00:00
boris
f30a8fe711 backup 2025-02-06 12:28:24 +00:00
boris
2238305d65 improve CSS on workshop 5 2024-10-17 23:28:35 +01:00
197 changed files with 16956 additions and 144 deletions

11
.idea/dataSources.local.xml generated Normal file
View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="dataSourceStorageLocal" created-in="PS-243.23654.168">
<data-source name="students.sqlite" uuid="1a6627af-ec57-4782-8160-79144abe9af0">
<database-info product="" version="" jdbc-version="" driver-name="" driver-version="" dbms="SQLITE" />
<secret-storage>master_key</secret-storage>
<auth-provider>no-auth</auth-provider>
<schema-mapping />
</data-source>
</component>
</project>

12
.idea/dataSources.xml generated Normal file
View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
<data-source source="LOCAL" name="students.sqlite" uuid="1a6627af-ec57-4782-8160-79144abe9af0">
<driver-ref>sqlite.xerial</driver-ref>
<synchronize>true</synchronize>
<jdbc-driver>org.sqlite.JDBC</jdbc-driver>
<jdbc-url>jdbc:sqlite:$PROJECT_DIR$/ajax_workshop_2/students.sqlite</jdbc-url>
<working-dir>$ProjectFileDir$</working-dir>
</data-source>
</component>
</project>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,2 @@
#n:main
!<md> [0, 0, null, null, -2147483648, -2147483648]

20
.idea/php.xml generated
View File

@@ -1,20 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="MessDetectorOptionsConfiguration">
<option name="transferred" value="true" />
</component>
<component name="PHPCSFixerOptionsConfiguration">
<option name="transferred" value="true" />
</component>
<component name="PHPCodeSnifferOptionsConfiguration">
<option name="highlightLevel" value="WARNING" />
<option name="transferred" value="true" />
</component>
<component name="PhpProjectSharedConfiguration" php_language_level="8.0" />
<component name="PhpStanOptionsConfiguration">
<option name="transferred" value="true" />
</component>
<component name="PsalmOptionsConfiguration">
<option name="transferred" value="true" />
</component>
</project>

344
.idea/workspace.xml generated Normal file
View File

@@ -0,0 +1,344 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AnalysisUIOptions">
<option name="ANALYZE_INJECTED_CODE" value="false" />
</component>
<component name="AutoImportSettings">
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="e6f2f7bd-40fa-4e42-878e-5f7452e4f859" name="Changes" comment="improve CSS on workshop 5">
<change afterPath="$PROJECT_DIR$/ajax_workshop_1/gethint.php" afterDir="false" />
<change afterPath="$PROJECT_DIR$/ajax_workshop_1/index.html" afterDir="false" />
<change afterPath="$PROJECT_DIR$/ajax_workshop_1/index.js" afterDir="false" />
<change afterPath="$PROJECT_DIR$/ajax_workshop_1/styles.css" afterDir="false" />
<change afterPath="$PROJECT_DIR$/js_workshop6/favicon.ico" afterDir="false" />
<change afterPath="$PROJECT_DIR$/js_workshop6/index.html" afterDir="false" />
<change afterPath="$PROJECT_DIR$/js_workshop6/index.js" afterDir="false" />
<change afterPath="$PROJECT_DIR$/js_workshop6/styles.css" afterDir="false" />
<change afterPath="$PROJECT_DIR$/js_workshop7/favicon.ico" afterDir="false" />
<change afterPath="$PROJECT_DIR$/js_workshop7/index.html" afterDir="false" />
<change afterPath="$PROJECT_DIR$/js_workshop7/index.js" afterDir="false" />
<change afterPath="$PROJECT_DIR$/js_workshop7/styles.css" afterDir="false" />
<change afterPath="$PROJECT_DIR$/js_workshop8/SampleVideo.mp4" afterDir="false" />
<change afterPath="$PROJECT_DIR$/js_workshop8/index.html" afterDir="false" />
<change afterPath="$PROJECT_DIR$/js_workshop8/index.js" afterDir="false" />
<change afterPath="$PROJECT_DIR$/js_workshop8/styles.css" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/.gitignore" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/PHPStorm Repo.iml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/modules.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/php.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/vcs.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/MVCtemplate-23-24/.idea/.gitignore" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/MVCtemplate-23-24/.idea/.name" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/MVCtemplate-23-24/.idea/MVCtemplate.iml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/MVCtemplate-23-24/.idea/deployment.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/MVCtemplate-23-24/.idea/encodings.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/MVCtemplate-23-24/.idea/misc.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/MVCtemplate-23-24/.idea/modules.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/MVCtemplate-23-24/.idea/php.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/MVCtemplate-23-24/.idea/scopes/scope_settings.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/MVCtemplate-23-24/.idea/vcs.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/MVCtemplate-23-24/Views/index.phtml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/MVCtemplate-23-24/Views/page1.phtml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/MVCtemplate-23-24/Views/template/footer.phtml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/MVCtemplate-23-24/Views/template/header.phtml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/MVCtemplate-23-24/css/my-style.css" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/MVCtemplate-23-24/fonts/glyphicons-halflings-regular.eot" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/MVCtemplate-23-24/fonts/glyphicons-halflings-regular.svg" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/MVCtemplate-23-24/fonts/glyphicons-halflings-regular.ttf" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/MVCtemplate-23-24/fonts/glyphicons-halflings-regular.woff" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/MVCtemplate-23-24/images/new_uos_logo.jpg" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/MVCtemplate-23-24/index.php" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/MVCtemplate-23-24/js/bootstrap.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/MVCtemplate-23-24/js/bootstrap.min.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/MVCtemplate-23-24/page1.php" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/MVCtemplate-23-24/phpinfo.php" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/access.log" beforeDir="false" afterPath="$PROJECT_DIR$/access.log" afterDir="false" />
<change beforePath="$PROJECT_DIR$/docker-compose.yml" beforeDir="false" afterPath="$PROJECT_DIR$/docker-compose.yml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/error.log" beforeDir="false" afterPath="$PROJECT_DIR$/error.log" afterDir="false" />
<change beforePath="$PROJECT_DIR$/nginx/php/fpm-php.www.log" beforeDir="false" afterPath="$PROJECT_DIR$/nginx/php/fpm-php.www.log" afterDir="false" />
<change beforePath="$PROJECT_DIR$/test/.idea/.gitignore" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/test/.idea/modules.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/test/.idea/php.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/test/.idea/test.iml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/test/composer.json" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop1/.idea/.gitignore" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop1/.idea/modules.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop1/.idea/php.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop1/.idea/workshop1.iml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop1/composer.json" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop1/index.php" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop2/.idea/.gitignore" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop2/.idea/inspectionProfiles/Project_Default.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop2/.idea/jsLibraryMappings.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop2/.idea/modules.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop2/.idea/php.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop2/.idea/workshop2.iml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop2/index.css" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop2/index.html" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop2/index.php" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop2/passingdata.php" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop3/Emoji/index.php" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop3/Operators/index.php" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop3/Strings/index.php" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop4/.idea/.gitignore" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop4/.idea/.name" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop4/.idea/MVCtemplate.iml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop4/.idea/deployment.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop4/.idea/encodings.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop4/.idea/misc.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop4/.idea/modules.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop4/.idea/php.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop4/.idea/scopes/scope_settings.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop4/.idea/vcs.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop4/Models/Converter.php" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop4/Views/abouttemplate.phtml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop4/Views/converter.phtml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop4/Views/index.phtml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop4/Views/page1.phtml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop4/Views/template/footer.phtml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop4/Views/template/header.phtml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop4/Views/template/oldheader.phtml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop4/abouttemplate.php" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop4/converter.php" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop4/css/my-style.css" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop4/fonts/glyphicons-halflings-regular.eot" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop4/fonts/glyphicons-halflings-regular.svg" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop4/fonts/glyphicons-halflings-regular.ttf" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop4/fonts/glyphicons-halflings-regular.woff" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop4/images/new_uos_logo.jpg" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop4/index.php" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop4/js/bootstrap.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop4/js/bootstrap.min.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop4/page1.php" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop4/phpinfo.php" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop5/.idea/.gitignore" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop5/.idea/.name" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop5/.idea/MVCtemplate.iml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop5/.idea/deployment.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop5/.idea/encodings.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop5/.idea/misc.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop5/.idea/modules.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop5/.idea/php.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop5/.idea/scopes/scope_settings.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop5/.idea/vcs.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop5/Models/Calculator.php" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop5/Views/calculator.phtml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop5/Views/index.phtml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop5/Views/page1.phtml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop5/Views/template/footer.phtml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop5/Views/template/header.phtml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop5/calculator.php" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop5/css/my-style.css" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop5/fonts/glyphicons-halflings-regular.eot" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop5/fonts/glyphicons-halflings-regular.svg" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop5/fonts/glyphicons-halflings-regular.ttf" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop5/fonts/glyphicons-halflings-regular.woff" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop5/images/new_uos_logo.jpg" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop5/index.php" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop5/js/bootstrap.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop5/js/bootstrap.min.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop5/page1.php" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/workshop5/phpinfo.php" beforeDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="ComposerConfigs">
<option name="configs">
<option value="$PROJECT_DIR$/workshop1/composer.json" />
</option>
</component>
<component name="ComposerSettings" notifyAboutMissingVendor="false" synchronizationState="SYNCHRONIZE">
<pharConfigPath>$PROJECT_DIR$/test/composer.json</pharConfigPath>
<execution />
</component>
<component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES">
<list>
<option value="HTML File" />
<option value="JavaScript File" />
<option value="CSS File" />
</list>
</option>
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="PhpDebugGeneral" break_at_first_line="true" listening_started="true" />
<component name="PhpServers">
<servers>
<server host="localhost" id="3a088644-6825-4f07-a32e-77865b22bd4f" name="localhost" port="8080" />
<server host="localhost" id="38287632-911a-452e-9bbd-ac5ddc4909aa" name="Docker" port="8088" use_path_mappings="true">
<path_mappings>
<mapping local-root="$PROJECT_DIR$" remote-root="/var/www" />
</path_mappings>
</server>
</servers>
</component>
<component name="PhpWorkspaceProjectConfiguration" interpreter_name="PHP 8.2" />
<component name="ProblemsViewState">
<option name="selectedTabId" value="CurrentFile" />
</component>
<component name="ProjectColorInfo">{
&quot;associatedIndex&quot;: 3
}</component>
<component name="ProjectId" id="2nVn2fVmsKSLqHiVCU3uGfeOwpm" />
<component name="ProjectLevelVcsManager">
<ConfirmationsSetting value="2" id="Add" />
</component>
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent">{
&quot;keyToString&quot;: {
&quot;DefaultHtmlFileTemplate&quot;: &quot;HTML File&quot;,
&quot;Docker.Docker Compose Up.executor&quot;: &quot;Run&quot;,
&quot;Docker.Docker Compose.executor&quot;: &quot;Run&quot;,
&quot;Docker.Unnamed.executor&quot;: &quot;Run&quot;,
&quot;PHP Built-in Web Server.Built-In Webserver.executor&quot;: &quot;Run&quot;,
&quot;PHP Built-in Web Server.Unnamed.executor&quot;: &quot;Run&quot;,
&quot;PHP Remote Debug.Docker Debug.executor&quot;: &quot;Debug&quot;,
&quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
&quot;RunOnceActivity.git.unshallow&quot;: &quot;true&quot;,
&quot;git-widget-placeholder&quot;: &quot;main&quot;,
&quot;last_opened_file_path&quot;: &quot;/Users/boris/Library/CloudStorage/OneDrive-UniversityofSalford/CSCS-Y2/Client Server Systems/PHPStorm Repo/js_workshop8&quot;,
&quot;list.type.of.created.stylesheet&quot;: &quot;CSS&quot;,
&quot;node.js.detected.package.eslint&quot;: &quot;true&quot;,
&quot;node.js.detected.package.tslint&quot;: &quot;true&quot;,
&quot;node.js.selected.package.eslint&quot;: &quot;(autodetect)&quot;,
&quot;node.js.selected.package.tslint&quot;: &quot;(autodetect)&quot;,
&quot;nodejs_package_manager_path&quot;: &quot;npm&quot;,
&quot;run.code.analysis.last.selected.profile&quot;: &quot;pProject Default&quot;,
&quot;settings.editor.selected.configurable&quot;: &quot;settings.php.debug.servers&quot;,
&quot;vue.rearranger.settings.migration&quot;: &quot;true&quot;
},
&quot;keyToStringList&quot;: {
&quot;DatabaseDriversLRU&quot;: [
&quot;sqlite&quot;
]
}
}</component>
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="$PROJECT_DIR$/js_workshop8" />
<recent name="$PROJECT_DIR$" />
<recent name="$PROJECT_DIR$/workshop6/Views" />
<recent name="$PROJECT_DIR$/workshop6" />
<recent name="$PROJECT_DIR$/workshop5/Views" />
</key>
<key name="MoveFile.RECENT_KEYS">
<recent name="$PROJECT_DIR$/ajax_workshop_2/Views" />
<recent name="$PROJECT_DIR$/ajax_workshop_2" />
<recent name="$PROJECT_DIR$/ajax_workshop_2/Models" />
<recent name="$PROJECT_DIR$/js_workshop8" />
<recent name="$PROJECT_DIR$/js_workshop1" />
</key>
</component>
<component name="RunManager" selected="Docker.Docker Compose Up">
<configuration name="Built-In Webserver" type="PhpBuiltInWebServerConfigurationType" factoryName="PHP Built-in Web Server" document_root="$PROJECT_DIR$" port="8080">
<method v="2" />
</configuration>
<configuration name="Docker Debug" type="PhpRemoteDebugRunConfigurationType" factoryName="PHP Remote Debug" filter_connections="FILTER" server_name="Docker" session_id="docker">
<method v="2" />
</configuration>
<configuration name="Docker Compose Up" type="docker-deploy" factoryName="docker-compose.yml" server-name="Docker">
<deployment type="docker-compose.yml">
<settings>
<option name="envFilePath" value="" />
<option name="removeOrphansOnComposeDown" value="false" />
<option name="sourceFilePath" value="docker-compose.yml" />
</settings>
</deployment>
<method v="2" />
</configuration>
<list>
<item itemvalue="Docker.Docker Compose Up" />
<item itemvalue="PHP Built-in Web Server.Built-In Webserver" />
<item itemvalue="PHP Remote Debug.Docker Debug" />
</list>
</component>
<component name="SharedIndexes">
<attachedChunks>
<set>
<option value="bundled-js-predefined-d6986cc7102b-822845ee3bb5-JavaScript-PS-243.23654.168" />
<option value="bundled-php-predefined-a98d8de5180a-4c3855d0ab16-com.jetbrains.php.sharedIndexes-PS-243.23654.168" />
</set>
</attachedChunks>
</component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="e6f2f7bd-40fa-4e42-878e-5f7452e4f859" name="Changes" comment="" />
<created>1729066904428</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1729066904428</updated>
<workItem from="1729066905730" duration="24953000" />
<workItem from="1729767536480" duration="1929000" />
<workItem from="1730375221265" duration="533000" />
<workItem from="1730375763626" duration="29000" />
<workItem from="1730375804893" duration="598000" />
<workItem from="1730377524338" duration="1008000" />
<workItem from="1730378544000" duration="99000" />
<workItem from="1730378708802" duration="2494000" />
<workItem from="1731061137810" duration="193000" />
<workItem from="1731062774546" duration="19000" />
<workItem from="1731068997365" duration="1140000" />
<workItem from="1731072760630" duration="21000" />
<workItem from="1731073553773" duration="51000" />
<workItem from="1737037985730" duration="1378000" />
<workItem from="1737633482758" duration="15594000" />
<workItem from="1738237019574" duration="15889000" />
<workItem from="1738329990864" duration="841000" />
<workItem from="1738843358594" duration="1402000" />
</task>
<task id="LOCAL-00001" summary="commit existing workshops">
<option name="closed" value="true" />
<created>1729067067742</created>
<option name="number" value="00001" />
<option name="presentableId" value="LOCAL-00001" />
<option name="project" value="LOCAL" />
<updated>1729067067742</updated>
</task>
<task id="LOCAL-00002" summary="commit existing workshops">
<option name="closed" value="true" />
<created>1729121774141</created>
<option name="number" value="00002" />
<option name="presentableId" value="LOCAL-00002" />
<option name="project" value="LOCAL" />
<updated>1729121774142</updated>
</task>
<task id="LOCAL-00003" summary="workshop 4,5">
<option name="closed" value="true" />
<created>1729121808740</created>
<option name="number" value="00003" />
<option name="presentableId" value="LOCAL-00003" />
<option name="project" value="LOCAL" />
<updated>1729121808741</updated>
</task>
<task id="LOCAL-00004" summary="improve CSS on workshop 5">
<option name="closed" value="true" />
<created>1729204119068</created>
<option name="number" value="00004" />
<option name="presentableId" value="LOCAL-00004" />
<option name="project" value="LOCAL" />
<updated>1729204119068</updated>
</task>
<option name="localTasksCounter" value="5" />
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="3" />
</component>
<component name="VcsManagerConfiguration">
<MESSAGE value="commit existing workshops" />
<MESSAGE value="workshop 4,5" />
<MESSAGE value="improve CSS on workshop 5" />
<option name="LAST_COMMIT_MESSAGE" value="improve CSS on workshop 5" />
</component>
</project>

0
access.log Normal file → Executable file
View File

BIN
ajax_workshop_1/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -0,0 +1,51 @@
<?php
$a[] = "Anna";
$a[] = "Brittany";
$a[] = "Cinderella";
$a[] = "Diana";
$a[] = "Eva";
$a[] = "Fiona";
$a[] = "Gunda";
$a[] = "Hege";
$a[] = "Inga";
$a[] = "Johanna";
$a[] = "Kitty";
$a[] = "Linda";
$a[] = "Nina";
$a[] = "Ophelia";
$a[] = "Petunia";
$a[] = "Amanda";
$a[] = "Raquel";
$a[] = "Cindy";
$a[] = "Doris";
$a[] = "Eve";
$a[] = "Evita";
$a[] = "Sunniva";
$a[] = "Tove";
$a[] = "Unni";
$a[] = "Violet";
$a[] = "Liza";
$a[] = "Elizabeth";
$a[] = "Ellen";
$a[] = "Wenche";
$a[] = "Vicky";
// get the q parameter, the text typed in, from URL
$q = $_REQUEST["q"];
$hint = "";
// lookup all hints from array if $q is different from ""
if ($q !== "") {
$q = strtolower($q);
$len=strlen($q);
foreach($a as $name) {
if (stristr($q, substr($name, 0, $len))) {
if ($hint === "") {
$hint = $name;
} else {
$hint .= ", $name";
}
}
}
}
// Output "no suggestion" if no hint was found or output results
echo $hint === "" ? "no suggestion" : $hint;

View File

@@ -0,0 +1,19 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>AJAX Live Search</title>
<link href="favicon.png" rel="icon">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
<link href="styles.css" rel="stylesheet">
</head>
<body>
<form>
First name: <input id="selectInput" type="text" onkeyup="showHintSelect(this.value)">
</form>
<p>Suggestions: <span id="txtHint"></span></p>
<select id="resultsSelectionBox"></select>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous" defer></script>
<script src="index.js" defer></script>
</body>
</html>

40
ajax_workshop_1/index.js Normal file
View File

@@ -0,0 +1,40 @@
function showHint(str) {
if (str.length === 0) {
document.getElementById("txtHint").innerHTML = "";
} else {
let xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
var uic = document.getElementById("txtHint")
uic.innerHTML = this.responseText;
}
};
xmlhttp.open("GET", "gethint.php?q=" + str, true);
xmlhttp.send();
}
}
function showHintSelect(str) {
if (str.length === 0) {
document.getElementById("txtHint").innerHTML = "";
} else {
let xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (this.readyState === 4 && this.status === 200) {
let select = document.getElementById("resultsSelectionBox")
let names = this.responseText.split(',');
for (let i = 0; i<names.length; i++) {
let opt = document.createElement('option');
opt.value = names[i];
opt.innerHTML = names[i];
select.appendChild(opt);
}
let hint = document.getElementById("txtHint")
hint.innerHTML = this.responseText;
}
};
xmlhttp.open("GET", "gethint.php?q=" + str, true);
xmlhttp.send();
}
}

View File

View File

@@ -1,8 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
# Default ignored files
/shelf/
/workspace.xml
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
# Editor-based HTTP Client requests
/httpRequests/

View File

@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="PublishConfigData" remoteFilesAllowedToDisappearOnAutoupload="false">
<serverData>
<paths name="workshop1">
<serverdata>
<mappings>
<mapping local="$PROJECT_DIR$" web="/" />
</mappings>
</serverdata>
</paths>
</serverData>
</component>
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="PublishConfigData" remoteFilesAllowedToDisappearOnAutoupload="false">
<serverData>
<paths name="workshop1">
<serverdata>
<mappings>
<mapping local="$PROJECT_DIR$" web="/" />
</mappings>
</serverdata>
</paths>
</serverData>
</component>
</project>

View File

@@ -0,0 +1,45 @@
<?php
class Database {
/**
* @var Database
*/
protected static $_dbInstance = null;
/**
* @var PDO
*/
protected $_dbHandle;
/**
* @return Database
*/
public static function getInstance() {
if(self::$_dbInstance === null) { //checks if the PDO exists
// creates new instance if not, sending in connection info
self::$_dbInstance = new self();
}
return self::$_dbInstance;
}
private function __construct() {
try {
$this->_dbHandle = new PDO("sqlite:students.sqlite");
}
catch (PDOException $e) { // catch any failure to connect to the database
echo $e->getMessage();
}
}
/**
* @return PDO
*/
public function getdbConnection() {
return $this->_dbHandle; // returns the PDO handle to be used elsewhere
}
public function __destruct() {
$this->_dbHandle = null; // destroys the PDO handle when no longer needed
}
}

View File

@@ -0,0 +1,36 @@
<?php
/*
* Class StudentData
*
* This class models a students data, utilizing protected fields for data encapsulation.
* It takes a database row (array) as input in the constructor and assigns values to private fields, which include:
* - Student ID
* - First and Last Name
* - Course ID
* - International status (converted to 'yes' or 'no' strings for clarity)
*/
class StudentData {
// private fields
protected $_id, $_firstName, $_lastName, $_courseID, $_international;
// constructor
public function __construct($dbRow) {
$this->_id = $dbRow['student_id'];
$this->_firstName = $dbRow['first_name'];
$this->_lastName = $dbRow['last_name'];
if ($dbRow['international']) $this->_international = 'yes'; else $this->_international = 'no';
$this->_courseID = $dbRow['courseID'];
}
// accessors
public function getStudentID() {
return $this->_id;
}
// add in accessors for the other fields, check the view file in the given project to see what
// the accessor methods should be called
}

View File

@@ -0,0 +1,32 @@
<?php
require_once ('Database.php');
require_once ('StudentData.php');
class StudentsDataSet {
protected $_dbHandle, $_dbInstance;
public function __construct() {
$this->_dbInstance = Database::getInstance();
$this->_dbHandle = $this->_dbInstance->getdbConnection();
}
public function fetchAllStudents(): array
{
$sqlQuery = 'SELECT * FROM students;';
$statement = $this->_dbHandle->prepare($sqlQuery); // prepare a PDO statement
$statement->execute(); // execute the PDO statement
$dataSet = [];
// loop through and read the results of the query and cast
// them into a matching object
while ($row = $statement->fetch()) {
$dataSet[] = new StudentData($row);
}
return $dataSet;
}
}

View File

@@ -0,0 +1,30 @@
<?php require('template/header.phtml') ?>
<div class="row">
<div class="col-5">
<p><?php echo $view->dbMessage; ?></p>
</div>
<div class="col-7">
<p>Current script <?php echo $_SERVER["PHP_SELF"]; ?></p>
</div>
</div>
<div class="row">
<table class="table table-bordered">
<thead> <tr> <th>Student ID</th> <th>First name</th> <th>Last name</th> <th>International</th> <th>CourseID</th> </tr>
</thead>
<tbody>
<?php foreach ($view->studentsDataSet as $studentData) {
echo '<tr> <td>' . $studentData->getStudentID() .
'</td> <td>' . $studentData->getFirstName() .
'</td> <td>' . $studentData->getLastName() .
'</td> <td>' . $studentData->getInternational() .
'</td> <td>' . $studentData->getCourseID() .
'</td> </td> </tr>';
} ?>
</tbody>
</table>
<?php require('template/footer.phtml') ?>

View File

@@ -0,0 +1,15 @@
</main>
<footer class="row">
<div id="footer" class="col-xs-12">
<p>Web-site development using the MVC design pattern and the Bootstrap CSS framework</p>
</div>
</footer>
<!-- Bootstrap core JavaScript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0/dist/js/bootstrap.bundle.min.js" crossorigin="anonymous"></script>
</body>
</html>

View File

@@ -0,0 +1,42 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="">
<meta name="author" content="">
<!-- Bootstrap core CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-gH2yIJqKdNHPEq0n4Mqa/HGKIhSkIHeL5AyhkYV8i59U5AR6csBvApHHNl/vI1Bx" crossorigin="anonymous">
<link href="css/my-style.css" rel="stylesheet">
<title>Server-Side Programming - <?php echo $view->pageTitle; ?></title>
</head>
<body role="document">
<div class="container">
<div class="row">
<div id="title" class="col-xs-12">
<img src="images/new_uos_logo.jpg" alt="Salford University" />
<div class="pull-right"> <h1><?php echo $view->pageTitle ?> </h1></div>
</div>
</div>
<div class="row">
<nav id="menu" class="col-xs-6 col-sm-3 col-md-2">
<h2>Menu</h2>
<ul class="nav flex-column">
<li><a href="index.php">Students</a></li>
</ul>
</nav>
<main id="content" class="col-xs-6 col-sm-9 col-md-10">

View File

@@ -0,0 +1,38 @@
#title {
margin-top: 12px;
background-color: #fff;
color: #000;
}
#menu {
border-top: solid 6px #f00;
background-color: #f00;
color: #fff;
/*height: 400px;*/
}
#menu a {
background-color: #f00;
color: #fff;
text-decoration: none;
display: block;
}
#menu a:hover {
background-color: #f00;
color: #ddd;
text-decoration:underline;
display: block;
}
#content {
background-color: #fff;
border-top: solid 6px #f00;
}
#footer {
margin_top: 20px;
text-align: center;
background-color: #000;
color: #fff;
}

View File

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 62 KiB

View File

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

25
ajax_workshop_2/index.php Normal file
View File

@@ -0,0 +1,25 @@
<?php
// load required classes
require_once('Models/StudentsDataSet.php');
// make a view class
$view = new stdClass();
$view->pageTitle = 'Student Information System';
// create a new student dataset object that we can generate data from
$studentsDataSet = new StudentsDataSet();
$view->studentsDataSet = $studentsDataSet->fetchAllStudents();
// send a results count to the view to show how many results were retrieved
if (count($view->studentsDataSet) == 0)
{
$view->dbMessage = "No results";
}
else
{
$view->dbMessage = count($view->studentsDataSet) . " result(s)";
}
// include the view
require_once('Views/index.phtml');

View File

@@ -1,2 +1,2 @@
<?php
phpinfo();
<?php
phpinfo();

Binary file not shown.

View File

@@ -4,10 +4,10 @@ services:
image: nginx
volumes:
- ./nginx/configs/:/etc/nginx/conf.d
- /home/boris/OneDrive/CSCS-Y2/Client Server Systems/PHPStorm Repo/nginx/nginx.conf:/etc/nginx/nginx.conf
- /Users/boris/OneDrive/OneDrive - University of Salford/CSCS-Y2/Client Server Systems/PHPStorm Repo/nginx/nginx.conf:/etc/nginx/nginx.conf
- ./:/var/www/
- /home/boris/OneDrive/CSCS-Y2/Client Server Systems/PHPStorm Repo/access.log:/var/log/nginx/access.log
- /home/boris/OneDrive/CSCS-Y2/Client Server Systems/PHPStorm Repo/error.log:/var/log/nginx/error.log
- /Users/boris/OneDrive/OneDrive - University of Salford/CSCS-Y2/Client Server Systems/PHPStorm Repo/access.log:/var/log/nginx/access.log
- /Users/boris/OneDrive/OneDrive - University of Salford/CSCS-Y2/Client Server Systems/PHPStorm Repo/error.log:/var/log/nginx/error.log
ports:
- "8088:80"
environment:
@@ -22,5 +22,5 @@ services:
image: php:8-fpm
volumes:
- ./:/var/www/
- /home/boris/OneDrive/CSCS-Y2/Client Server Systems/PHPStorm Repo/nginx/php/config/www.conf:/usr/local/etc/php-fpm.d/www.conf
- /home/boris/OneDrive/CSCS-Y2/Client Server Systems/PHPStorm Repo/nginx/php/fpm-php.www.log:/var/log/fpm-php.www.log
- /Users/boris/OneDrive/OneDrive - University of Salford/CSCS-Y2/Client Server Systems/PHPStorm Repo/nginx/php/config/www.conf:/usr/local/etc/php-fpm.d/www.conf
- /Users/boris/OneDrive/OneDrive - University of Salford/CSCS-Y2/Client Server Systems/PHPStorm Repo/nginx/php/fpm-php.www.log:/var/log/fpm-php.www.log

600
error.log Normal file → Executable file
View File

@@ -40,3 +40,603 @@
2024/10/16 16:15:27 [notice] 1#1: start worker process 33
2024/10/16 16:15:27 [notice] 1#1: start worker process 34
2024/10/16 16:15:27 [notice] 1#1: start worker process 35
2024/10/17 09:27:37 [notice] 1#1: using the "epoll" event method
2024/10/17 09:27:37 [notice] 1#1: nginx/1.27.2
2024/10/17 09:27:37 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14)
2024/10/17 09:27:37 [notice] 1#1: OS: Linux 6.8.0-45-generic
2024/10/17 09:27:37 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2024/10/17 09:27:37 [notice] 1#1: start worker processes
2024/10/17 09:27:37 [notice] 1#1: start worker process 28
2024/10/17 09:27:37 [notice] 1#1: start worker process 29
2024/10/17 09:27:37 [notice] 1#1: start worker process 30
2024/10/17 09:27:37 [notice] 1#1: start worker process 31
2024/10/17 09:27:37 [notice] 1#1: start worker process 32
2024/10/17 09:27:37 [notice] 1#1: start worker process 33
2024/10/17 09:27:37 [notice] 1#1: start worker process 34
2024/10/17 09:27:37 [notice] 1#1: start worker process 35
2024/10/24 10:59:19 [notice] 1#1: using the "epoll" event method
2024/10/24 10:59:19 [notice] 1#1: nginx/1.27.2
2024/10/24 10:59:19 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14)
2024/10/24 10:59:19 [notice] 1#1: OS: Linux 6.8.0-45-generic
2024/10/24 10:59:19 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2024/10/24 10:59:19 [notice] 1#1: start worker processes
2024/10/24 10:59:19 [notice] 1#1: start worker process 28
2024/10/24 10:59:19 [notice] 1#1: start worker process 29
2024/10/24 10:59:19 [notice] 1#1: start worker process 30
2024/10/24 10:59:19 [notice] 1#1: start worker process 31
2024/10/24 10:59:19 [notice] 1#1: start worker process 32
2024/10/24 10:59:19 [notice] 1#1: start worker process 33
2024/10/24 10:59:19 [notice] 1#1: start worker process 34
2024/10/24 10:59:19 [notice] 1#1: start worker process 35
2024/10/31 12:29:01 [notice] 1#1: using the "epoll" event method
2024/10/31 12:29:01 [notice] 1#1: nginx/1.27.2
2024/10/31 12:29:01 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14)
2024/10/31 12:29:01 [notice] 1#1: OS: Linux 6.8.0-47-generic
2024/10/31 12:29:01 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2024/10/31 12:29:01 [notice] 1#1: start worker processes
2024/10/31 12:29:01 [notice] 1#1: start worker process 28
2024/10/31 12:29:01 [notice] 1#1: start worker process 29
2024/10/31 12:29:01 [notice] 1#1: start worker process 30
2024/10/31 12:29:01 [notice] 1#1: start worker process 31
2024/10/31 12:29:01 [notice] 1#1: start worker process 32
2024/10/31 12:29:01 [notice] 1#1: start worker process 33
2024/10/31 12:29:01 [notice] 1#1: start worker process 34
2024/10/31 12:29:01 [notice] 1#1: start worker process 35
2024/11/07 13:20:58 [notice] 1#1: signal 3 (SIGQUIT) received, shutting down
2024/11/07 13:20:58 [notice] 29#29: gracefully shutting down
2024/11/07 13:20:58 [notice] 32#32: gracefully shutting down
2024/11/07 13:20:58 [notice] 31#31: gracefully shutting down
2024/11/07 13:20:58 [notice] 34#34: gracefully shutting down
2024/11/07 13:20:58 [notice] 28#28: gracefully shutting down
2024/11/07 13:20:58 [notice] 33#33: gracefully shutting down
2024/11/07 13:20:58 [notice] 30#30: gracefully shutting down
2024/11/07 13:20:58 [notice] 29#29: exiting
2024/11/07 13:20:58 [notice] 32#32: exiting
2024/11/07 13:20:58 [notice] 31#31: exiting
2024/11/07 13:20:58 [notice] 34#34: exiting
2024/11/07 13:20:58 [notice] 28#28: exiting
2024/11/07 13:20:58 [notice] 33#33: exiting
2024/11/07 13:20:58 [notice] 30#30: exiting
2024/11/07 13:20:58 [notice] 32#32: exit
2024/11/07 13:20:58 [notice] 29#29: exit
2024/11/07 13:20:58 [notice] 31#31: exit
2024/11/07 13:20:58 [notice] 28#28: exit
2024/11/07 13:20:58 [notice] 34#34: exit
2024/11/07 13:20:58 [notice] 30#30: exit
2024/11/07 13:20:58 [notice] 33#33: exit
2024/11/07 13:20:58 [notice] 35#35: gracefully shutting down
2024/11/07 13:20:58 [notice] 35#35: exiting
2024/11/07 13:20:58 [notice] 35#35: exit
2024/11/07 13:20:58 [notice] 1#1: signal 17 (SIGCHLD) received from 29
2024/11/07 13:20:58 [notice] 1#1: worker process 29 exited with code 0
2024/11/07 13:20:58 [notice] 1#1: worker process 30 exited with code 0
2024/11/07 13:20:58 [notice] 1#1: worker process 31 exited with code 0
2024/11/07 13:20:58 [notice] 1#1: worker process 33 exited with code 0
2024/11/07 13:20:58 [notice] 1#1: worker process 34 exited with code 0
2024/11/07 13:20:58 [notice] 1#1: signal 29 (SIGIO) received
2024/11/07 13:20:58 [notice] 1#1: signal 17 (SIGCHLD) received from 34
2024/11/07 13:20:58 [notice] 1#1: signal 17 (SIGCHLD) received from 35
2024/11/07 13:20:58 [notice] 1#1: worker process 35 exited with code 0
2024/11/07 13:20:58 [notice] 1#1: signal 29 (SIGIO) received
2024/11/07 13:20:58 [notice] 1#1: signal 17 (SIGCHLD) received from 28
2024/11/07 13:20:58 [notice] 1#1: worker process 28 exited with code 0
2024/11/07 13:20:58 [notice] 1#1: worker process 32 exited with code 0
2024/11/07 13:20:58 [notice] 1#1: exit
2024/11/08 10:19:03 [notice] 1#1: using the "epoll" event method
2024/11/08 10:19:03 [notice] 1#1: nginx/1.27.2
2024/11/08 10:19:03 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14)
2024/11/08 10:19:03 [notice] 1#1: OS: Linux 6.8.0-47-generic
2024/11/08 10:19:03 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2024/11/08 10:19:03 [notice] 1#1: start worker processes
2024/11/08 10:19:03 [notice] 1#1: start worker process 28
2024/11/08 10:19:03 [notice] 1#1: start worker process 29
2024/11/08 10:19:03 [notice] 1#1: start worker process 30
2024/11/08 10:19:03 [notice] 1#1: start worker process 31
2024/11/08 10:19:03 [notice] 1#1: start worker process 32
2024/11/08 10:19:03 [notice] 1#1: start worker process 33
2024/11/08 10:19:03 [notice] 1#1: start worker process 34
2024/11/08 10:19:03 [notice] 1#1: start worker process 35
2024/11/08 10:22:02 [notice] 1#1: signal 3 (SIGQUIT) received, shutting down
2024/11/08 10:22:02 [notice] 28#28: gracefully shutting down
2024/11/08 10:22:02 [notice] 30#30: gracefully shutting down
2024/11/08 10:22:02 [notice] 29#29: gracefully shutting down
2024/11/08 10:22:02 [notice] 30#30: exiting
2024/11/08 10:22:02 [notice] 34#34: gracefully shutting down
2024/11/08 10:22:02 [notice] 29#29: exiting
2024/11/08 10:22:02 [notice] 34#34: exiting
2024/11/08 10:22:02 [notice] 28#28: exiting
2024/11/08 10:22:02 [notice] 29#29: exit
2024/11/08 10:22:02 [notice] 30#30: exit
2024/11/08 10:22:02 [notice] 28#28: exit
2024/11/08 10:22:02 [notice] 34#34: exit
2024/11/08 10:22:02 [notice] 31#31: gracefully shutting down
2024/11/08 10:22:02 [notice] 31#31: exiting
2024/11/08 10:22:02 [notice] 31#31: exit
2024/11/08 10:22:02 [notice] 32#32: gracefully shutting down
2024/11/08 10:22:02 [notice] 32#32: exiting
2024/11/08 10:22:02 [notice] 32#32: exit
2024/11/08 10:22:02 [notice] 35#35: gracefully shutting down
2024/11/08 10:22:02 [notice] 35#35: exiting
2024/11/08 10:22:02 [notice] 33#33: gracefully shutting down
2024/11/08 10:22:02 [notice] 33#33: exiting
2024/11/08 10:22:02 [notice] 35#35: exit
2024/11/08 10:22:02 [notice] 33#33: exit
2024/11/08 10:22:02 [notice] 1#1: signal 17 (SIGCHLD) received from 28
2024/11/08 10:22:02 [notice] 1#1: worker process 28 exited with code 0
2024/11/08 10:22:02 [notice] 1#1: worker process 30 exited with code 0
2024/11/08 10:22:02 [notice] 1#1: worker process 31 exited with code 0
2024/11/08 10:22:02 [notice] 1#1: signal 29 (SIGIO) received
2024/11/08 10:22:02 [notice] 1#1: signal 17 (SIGCHLD) received from 29
2024/11/08 10:22:02 [notice] 1#1: worker process 29 exited with code 0
2024/11/08 10:22:02 [notice] 1#1: signal 29 (SIGIO) received
2024/11/08 10:22:02 [notice] 1#1: signal 17 (SIGCHLD) received from 33
2024/11/08 10:22:02 [notice] 1#1: worker process 33 exited with code 0
2024/11/08 10:22:02 [notice] 1#1: worker process 34 exited with code 0
2024/11/08 10:22:02 [notice] 1#1: signal 29 (SIGIO) received
2024/11/08 10:22:02 [notice] 1#1: signal 17 (SIGCHLD) received from 32
2024/11/08 10:22:02 [notice] 1#1: worker process 32 exited with code 0
2024/11/08 10:22:02 [notice] 1#1: signal 29 (SIGIO) received
2024/11/08 10:22:02 [notice] 1#1: signal 17 (SIGCHLD) received from 35
2024/11/08 10:22:02 [notice] 1#1: worker process 35 exited with code 0
2024/11/08 10:22:02 [notice] 1#1: exit
2025/01/16 14:53:46 [notice] 1#1: using the "epoll" event method
2025/01/16 14:53:46 [notice] 1#1: nginx/1.27.3
2025/01/16 14:53:46 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14)
2025/01/16 14:53:46 [notice] 1#1: OS: Linux 6.10.14-linuxkit
2025/01/16 14:53:46 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2025/01/16 14:53:46 [notice] 1#1: start worker processes
2025/01/16 14:53:46 [notice] 1#1: start worker process 28
2025/01/16 14:53:46 [notice] 1#1: start worker process 29
2025/01/16 14:53:46 [notice] 1#1: start worker process 30
2025/01/16 14:53:46 [notice] 1#1: start worker process 31
2025/01/16 14:53:46 [notice] 1#1: start worker process 32
2025/01/16 14:53:46 [notice] 1#1: start worker process 33
2025/01/16 14:53:46 [notice] 1#1: start worker process 34
2025/01/16 14:53:46 [notice] 1#1: start worker process 35
2025/01/16 14:53:46 [notice] 1#1: start worker process 36
2025/01/16 14:53:46 [notice] 1#1: start worker process 37
2025/01/16 14:53:46 [notice] 1#1: start worker process 38
2025/01/16 14:53:46 [notice] 1#1: start worker process 39
2025/01/16 14:53:46 [notice] 1#1: start worker process 40
2025/01/16 14:53:46 [notice] 1#1: start worker process 41
2025/01/16 20:14:43 [notice] 1#1: signal 3 (SIGQUIT) received, shutting down
2025/01/16 20:14:43 [notice] 29#29: gracefully shutting down
2025/01/16 20:14:43 [notice] 28#28: gracefully shutting down
2025/01/16 20:14:43 [notice] 31#31: gracefully shutting down
2025/01/16 20:14:43 [notice] 33#33: gracefully shutting down
2025/01/16 20:14:43 [notice] 30#30: gracefully shutting down
2025/01/16 20:14:43 [notice] 34#34: gracefully shutting down
2025/01/16 20:14:43 [notice] 35#35: gracefully shutting down
2025/01/16 20:14:43 [notice] 38#38: gracefully shutting down
2025/01/16 20:14:43 [notice] 32#32: gracefully shutting down
2025/01/16 20:14:43 [notice] 37#37: gracefully shutting down
2025/01/16 20:14:43 [notice] 36#36: gracefully shutting down
2025/01/16 20:14:43 [notice] 39#39: gracefully shutting down
2025/01/16 20:14:43 [notice] 41#41: gracefully shutting down
2025/01/16 20:14:43 [notice] 40#40: gracefully shutting down
2025/01/16 20:14:43 [notice] 29#29: exiting
2025/01/16 20:14:43 [notice] 31#31: exiting
2025/01/16 20:14:43 [notice] 33#33: exiting
2025/01/16 20:14:43 [notice] 30#30: exiting
2025/01/16 20:14:43 [notice] 34#34: exiting
2025/01/16 20:14:43 [notice] 28#28: exiting
2025/01/16 20:14:43 [notice] 35#35: exiting
2025/01/16 20:14:43 [notice] 38#38: exiting
2025/01/16 20:14:43 [notice] 32#32: exiting
2025/01/16 20:14:43 [notice] 37#37: exiting
2025/01/16 20:14:43 [notice] 39#39: exiting
2025/01/16 20:14:43 [notice] 36#36: exiting
2025/01/16 20:14:43 [notice] 41#41: exiting
2025/01/16 20:14:43 [notice] 40#40: exiting
2025/01/16 20:14:43 [notice] 33#33: exit
2025/01/16 20:14:43 [notice] 29#29: exit
2025/01/16 20:14:43 [notice] 31#31: exit
2025/01/16 20:14:43 [notice] 30#30: exit
2025/01/16 20:14:43 [notice] 34#34: exit
2025/01/16 20:14:43 [notice] 35#35: exit
2025/01/16 20:14:43 [notice] 38#38: exit
2025/01/16 20:14:43 [notice] 28#28: exit
2025/01/16 20:14:43 [notice] 32#32: exit
2025/01/16 20:14:43 [notice] 39#39: exit
2025/01/16 20:14:43 [notice] 37#37: exit
2025/01/16 20:14:43 [notice] 36#36: exit
2025/01/16 20:14:43 [notice] 41#41: exit
2025/01/16 20:14:43 [notice] 40#40: exit
2025/01/16 20:14:43 [notice] 1#1: signal 17 (SIGCHLD) received from 29
2025/01/16 20:14:43 [notice] 1#1: worker process 29 exited with code 0
2025/01/16 20:14:43 [notice] 1#1: signal 29 (SIGIO) received
2025/01/16 20:14:43 [notice] 1#1: signal 17 (SIGCHLD) received from 41
2025/01/16 20:14:43 [notice] 1#1: worker process 38 exited with code 0
2025/01/16 20:14:43 [notice] 1#1: worker process 41 exited with code 0
2025/01/16 20:14:43 [notice] 1#1: signal 17 (SIGCHLD) received from 33
2025/01/16 20:14:43 [notice] 1#1: worker process 31 exited with code 0
2025/01/16 20:14:43 [notice] 1#1: worker process 33 exited with code 0
2025/01/16 20:14:43 [notice] 1#1: worker process 35 exited with code 0
2025/01/16 20:14:43 [notice] 1#1: worker process 36 exited with code 0
2025/01/16 20:14:43 [notice] 1#1: signal 17 (SIGCHLD) received from 31
2025/01/16 20:14:43 [notice] 1#1: signal 29 (SIGIO) received
2025/01/16 20:14:43 [notice] 1#1: signal 29 (SIGIO) received
2025/01/16 20:14:43 [notice] 1#1: signal 17 (SIGCHLD) received from 28
2025/01/16 20:14:43 [notice] 1#1: worker process 28 exited with code 0
2025/01/16 20:14:43 [notice] 1#1: worker process 34 exited with code 0
2025/01/16 20:14:43 [notice] 1#1: worker process 39 exited with code 0
2025/01/16 20:14:43 [notice] 1#1: signal 29 (SIGIO) received
2025/01/16 20:14:43 [notice] 1#1: signal 17 (SIGCHLD) received from 34
2025/01/16 20:14:43 [notice] 1#1: worker process 30 exited with code 0
2025/01/16 20:14:43 [notice] 1#1: signal 29 (SIGIO) received
2025/01/16 20:14:43 [notice] 1#1: signal 17 (SIGCHLD) received from 32
2025/01/16 20:14:43 [notice] 1#1: worker process 32 exited with code 0
2025/01/16 20:14:43 [notice] 1#1: worker process 40 exited with code 0
2025/01/16 20:14:43 [notice] 1#1: signal 29 (SIGIO) received
2025/01/16 20:14:43 [notice] 1#1: signal 17 (SIGCHLD) received from 40
2025/01/16 20:14:43 [notice] 1#1: worker process 37 exited with code 0
2025/01/16 20:14:43 [notice] 1#1: exit
2025/01/23 12:06:58 [notice] 1#1: using the "epoll" event method
2025/01/23 12:06:58 [notice] 1#1: nginx/1.27.3
2025/01/23 12:06:58 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14)
2025/01/23 12:06:58 [notice] 1#1: OS: Linux 6.10.14-linuxkit
2025/01/23 12:06:58 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2025/01/23 12:06:58 [notice] 1#1: start worker processes
2025/01/23 12:06:58 [notice] 1#1: start worker process 27
2025/01/23 12:06:58 [notice] 1#1: start worker process 28
2025/01/23 12:06:58 [notice] 1#1: start worker process 29
2025/01/23 12:06:58 [notice] 1#1: start worker process 30
2025/01/23 12:06:58 [notice] 1#1: start worker process 31
2025/01/23 12:06:58 [notice] 1#1: start worker process 32
2025/01/23 12:06:58 [notice] 1#1: start worker process 33
2025/01/23 12:06:58 [notice] 1#1: start worker process 34
2025/01/23 12:06:58 [notice] 1#1: start worker process 35
2025/01/23 12:06:58 [notice] 1#1: start worker process 36
2025/01/23 12:06:58 [notice] 1#1: start worker process 37
2025/01/23 12:06:58 [notice] 1#1: start worker process 38
2025/01/23 12:06:58 [notice] 1#1: start worker process 39
2025/01/23 12:06:58 [notice] 1#1: start worker process 40
2025/01/23 19:02:59 [notice] 1#1: signal 3 (SIGQUIT) received, shutting down
2025/01/23 19:02:59 [notice] 27#27: gracefully shutting down
2025/01/23 19:02:59 [notice] 29#29: gracefully shutting down
2025/01/23 19:02:59 [notice] 30#30: gracefully shutting down
2025/01/23 19:02:59 [notice] 31#31: gracefully shutting down
2025/01/23 19:02:59 [notice] 28#28: gracefully shutting down
2025/01/23 19:02:59 [notice] 32#32: gracefully shutting down
2025/01/23 19:02:59 [notice] 34#34: gracefully shutting down
2025/01/23 19:02:59 [notice] 35#35: gracefully shutting down
2025/01/23 19:02:59 [notice] 39#39: gracefully shutting down
2025/01/23 19:02:59 [notice] 38#38: gracefully shutting down
2025/01/23 19:02:59 [notice] 40#40: gracefully shutting down
2025/01/23 19:02:59 [notice] 33#33: gracefully shutting down
2025/01/23 19:02:59 [notice] 36#36: gracefully shutting down
2025/01/23 19:02:59 [notice] 37#37: gracefully shutting down
2025/01/23 19:02:59 [notice] 27#27: exiting
2025/01/23 19:02:59 [notice] 29#29: exiting
2025/01/23 19:02:59 [notice] 30#30: exiting
2025/01/23 19:02:59 [notice] 28#28: exiting
2025/01/23 19:02:59 [notice] 28#28: exit
2025/01/23 19:02:59 [notice] 31#31: exiting
2025/01/23 19:02:59 [notice] 34#34: exiting
2025/01/23 19:02:59 [notice] 32#32: exiting
2025/01/23 19:02:59 [notice] 35#35: exiting
2025/01/23 19:02:59 [notice] 39#39: exiting
2025/01/23 19:02:59 [notice] 38#38: exiting
2025/01/23 19:02:59 [notice] 40#40: exiting
2025/01/23 19:02:59 [notice] 33#33: exiting
2025/01/23 19:02:59 [notice] 36#36: exiting
2025/01/23 19:02:59 [notice] 37#37: exiting
2025/01/23 19:02:59 [notice] 27#27: exit
2025/01/23 19:02:59 [notice] 29#29: exit
2025/01/23 19:02:59 [notice] 30#30: exit
2025/01/23 19:02:59 [notice] 31#31: exit
2025/01/23 19:02:59 [notice] 34#34: exit
2025/01/23 19:02:59 [notice] 32#32: exit
2025/01/23 19:02:59 [notice] 35#35: exit
2025/01/23 19:02:59 [notice] 39#39: exit
2025/01/23 19:02:59 [notice] 38#38: exit
2025/01/23 19:02:59 [notice] 40#40: exit
2025/01/23 19:02:59 [notice] 33#33: exit
2025/01/23 19:02:59 [notice] 36#36: exit
2025/01/23 19:02:59 [notice] 37#37: exit
2025/01/23 19:02:59 [notice] 1#1: signal 17 (SIGCHLD) received from 32
2025/01/23 19:02:59 [notice] 1#1: worker process 31 exited with code 0
2025/01/23 19:02:59 [notice] 1#1: worker process 27 exited with code 0
2025/01/23 19:02:59 [notice] 1#1: worker process 28 exited with code 0
2025/01/23 19:02:59 [notice] 1#1: worker process 30 exited with code 0
2025/01/23 19:02:59 [notice] 1#1: worker process 32 exited with code 0
2025/01/23 19:02:59 [notice] 1#1: signal 29 (SIGIO) received
2025/01/23 19:02:59 [notice] 1#1: signal 17 (SIGCHLD) received from 31
2025/01/23 19:02:59 [notice] 1#1: worker process 29 exited with code 0
2025/01/23 19:02:59 [notice] 1#1: worker process 35 exited with code 0
2025/01/23 19:02:59 [notice] 1#1: signal 29 (SIGIO) received
2025/01/23 19:02:59 [notice] 1#1: signal 17 (SIGCHLD) received from 40
2025/01/23 19:02:59 [notice] 1#1: worker process 37 exited with code 0
2025/01/23 19:02:59 [notice] 1#1: worker process 39 exited with code 0
2025/01/23 19:02:59 [notice] 1#1: worker process 40 exited with code 0
2025/01/23 19:02:59 [notice] 1#1: signal 29 (SIGIO) received
2025/01/23 19:02:59 [notice] 1#1: signal 17 (SIGCHLD) received from 37
2025/01/23 19:02:59 [notice] 1#1: signal 17 (SIGCHLD) received from 36
2025/01/23 19:02:59 [notice] 1#1: worker process 36 exited with code 0
2025/01/23 19:02:59 [notice] 1#1: signal 29 (SIGIO) received
2025/01/23 19:02:59 [notice] 1#1: signal 17 (SIGCHLD) received from 33
2025/01/23 19:02:59 [notice] 1#1: worker process 33 exited with code 0
2025/01/23 19:02:59 [notice] 1#1: worker process 34 exited with code 0
2025/01/23 19:02:59 [notice] 1#1: worker process 38 exited with code 0
2025/01/23 19:02:59 [notice] 1#1: exit
2025/01/30 11:39:16 [notice] 1#1: using the "epoll" event method
2025/01/30 11:39:16 [notice] 1#1: nginx/1.27.3
2025/01/30 11:39:16 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14)
2025/01/30 11:39:16 [notice] 1#1: OS: Linux 6.10.14-linuxkit
2025/01/30 11:39:16 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2025/01/30 11:39:16 [notice] 1#1: start worker processes
2025/01/30 11:39:16 [notice] 1#1: start worker process 28
2025/01/30 11:39:16 [notice] 1#1: start worker process 29
2025/01/30 11:39:16 [notice] 1#1: start worker process 30
2025/01/30 11:39:16 [notice] 1#1: start worker process 31
2025/01/30 11:39:16 [notice] 1#1: start worker process 32
2025/01/30 11:39:16 [notice] 1#1: start worker process 33
2025/01/30 11:39:16 [notice] 1#1: start worker process 34
2025/01/30 11:39:16 [notice] 1#1: start worker process 35
2025/01/30 11:39:16 [notice] 1#1: start worker process 36
2025/01/30 11:39:16 [notice] 1#1: start worker process 37
2025/01/30 11:39:16 [notice] 1#1: start worker process 38
2025/01/30 11:39:16 [notice] 1#1: start worker process 39
2025/01/30 11:39:16 [notice] 1#1: start worker process 40
2025/01/30 11:39:16 [notice] 1#1: start worker process 41
2025/01/30 15:59:33 [notice] 1#1: signal 3 (SIGQUIT) received, shutting down
2025/01/30 15:59:33 [notice] 32#32: gracefully shutting down
2025/01/30 15:59:33 [notice] 31#31: gracefully shutting down
2025/01/30 15:59:33 [notice] 37#37: gracefully shutting down
2025/01/30 15:59:33 [notice] 30#30: gracefully shutting down
2025/01/30 15:59:33 [notice] 33#33: gracefully shutting down
2025/01/30 15:59:33 [notice] 29#29: gracefully shutting down
2025/01/30 15:59:33 [notice] 28#28: gracefully shutting down
2025/01/30 15:59:33 [notice] 32#32: exiting
2025/01/30 15:59:33 [notice] 34#34: gracefully shutting down
2025/01/30 15:59:33 [notice] 39#39: gracefully shutting down
2025/01/30 15:59:33 [notice] 35#35: gracefully shutting down
2025/01/30 15:59:33 [notice] 38#38: gracefully shutting down
2025/01/30 15:59:33 [notice] 40#40: gracefully shutting down
2025/01/30 15:59:33 [notice] 36#36: gracefully shutting down
2025/01/30 15:59:33 [notice] 37#37: exiting
2025/01/30 15:59:33 [notice] 31#31: exiting
2025/01/30 15:59:33 [notice] 41#41: gracefully shutting down
2025/01/30 15:59:33 [notice] 29#29: exiting
2025/01/30 15:59:33 [notice] 28#28: exiting
2025/01/30 15:59:33 [notice] 30#30: exiting
2025/01/30 15:59:33 [notice] 33#33: exiting
2025/01/30 15:59:33 [notice] 34#34: exiting
2025/01/30 15:59:33 [notice] 35#35: exiting
2025/01/30 15:59:33 [notice] 32#32: exit
2025/01/30 15:59:33 [notice] 39#39: exiting
2025/01/30 15:59:33 [notice] 36#36: exiting
2025/01/30 15:59:33 [notice] 37#37: exit
2025/01/30 15:59:33 [notice] 40#40: exiting
2025/01/30 15:59:33 [notice] 31#31: exit
2025/01/30 15:59:33 [notice] 38#38: exiting
2025/01/30 15:59:33 [notice] 41#41: exiting
2025/01/30 15:59:33 [notice] 29#29: exit
2025/01/30 15:59:33 [notice] 30#30: exit
2025/01/30 15:59:33 [notice] 28#28: exit
2025/01/30 15:59:33 [notice] 33#33: exit
2025/01/30 15:59:33 [notice] 34#34: exit
2025/01/30 15:59:33 [notice] 35#35: exit
2025/01/30 15:59:33 [notice] 39#39: exit
2025/01/30 15:59:33 [notice] 36#36: exit
2025/01/30 15:59:33 [notice] 40#40: exit
2025/01/30 15:59:33 [notice] 38#38: exit
2025/01/30 15:59:33 [notice] 41#41: exit
2025/01/30 15:59:34 [notice] 1#1: signal 17 (SIGCHLD) received from 31
2025/01/30 15:59:34 [notice] 1#1: worker process 28 exited with code 0
2025/01/30 15:59:34 [notice] 1#1: worker process 29 exited with code 0
2025/01/30 15:59:34 [notice] 1#1: worker process 30 exited with code 0
2025/01/30 15:59:34 [notice] 1#1: worker process 31 exited with code 0
2025/01/30 15:59:34 [notice] 1#1: worker process 32 exited with code 0
2025/01/30 15:59:34 [notice] 1#1: worker process 33 exited with code 0
2025/01/30 15:59:34 [notice] 1#1: worker process 34 exited with code 0
2025/01/30 15:59:34 [notice] 1#1: worker process 37 exited with code 0
2025/01/30 15:59:34 [notice] 1#1: worker process 38 exited with code 0
2025/01/30 15:59:34 [notice] 1#1: worker process 39 exited with code 0
2025/01/30 15:59:34 [notice] 1#1: worker process 40 exited with code 0
2025/01/30 15:59:34 [notice] 1#1: signal 29 (SIGIO) received
2025/01/30 15:59:34 [notice] 1#1: signal 17 (SIGCHLD) received from 40
2025/01/30 15:59:34 [notice] 1#1: signal 17 (SIGCHLD) received from 35
2025/01/30 15:59:34 [notice] 1#1: worker process 35 exited with code 0
2025/01/30 15:59:34 [notice] 1#1: signal 29 (SIGIO) received
2025/01/30 15:59:34 [notice] 1#1: signal 17 (SIGCHLD) received from 36
2025/01/30 15:59:34 [notice] 1#1: worker process 36 exited with code 0
2025/01/30 15:59:34 [notice] 1#1: signal 29 (SIGIO) received
2025/01/30 15:59:34 [notice] 1#1: signal 17 (SIGCHLD) received from 41
2025/01/30 15:59:34 [notice] 1#1: worker process 41 exited with code 0
2025/01/30 15:59:34 [notice] 1#1: exit
2025/01/30 16:19:09 [notice] 1#1: using the "epoll" event method
2025/01/30 16:19:09 [notice] 1#1: nginx/1.27.3
2025/01/30 16:19:09 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14)
2025/01/30 16:19:09 [notice] 1#1: OS: Linux 6.10.14-linuxkit
2025/01/30 16:19:09 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2025/01/30 16:19:09 [notice] 1#1: start worker processes
2025/01/30 16:19:09 [notice] 1#1: start worker process 28
2025/01/30 16:19:09 [notice] 1#1: start worker process 29
2025/01/30 16:19:09 [notice] 1#1: start worker process 30
2025/01/30 16:19:09 [notice] 1#1: start worker process 31
2025/01/30 16:19:09 [notice] 1#1: start worker process 32
2025/01/30 16:19:09 [notice] 1#1: start worker process 33
2025/01/30 16:19:09 [notice] 1#1: start worker process 34
2025/01/30 16:19:09 [notice] 1#1: start worker process 35
2025/01/30 16:19:09 [notice] 1#1: start worker process 36
2025/01/30 16:19:09 [notice] 1#1: start worker process 37
2025/01/30 16:19:09 [notice] 1#1: start worker process 38
2025/01/30 16:19:09 [notice] 1#1: start worker process 39
2025/01/30 16:19:09 [notice] 1#1: start worker process 40
2025/01/30 16:19:09 [notice] 1#1: start worker process 41
2025/01/31 09:13:39 [notice] 1#1: signal 3 (SIGQUIT) received, shutting down
2025/01/31 09:13:39 [notice] 28#28: gracefully shutting down
2025/01/31 09:13:39 [notice] 34#34: gracefully shutting down
2025/01/31 09:13:39 [notice] 31#31: gracefully shutting down
2025/01/31 09:13:39 [notice] 38#38: gracefully shutting down
2025/01/31 09:13:39 [notice] 30#30: gracefully shutting down
2025/01/31 09:13:39 [notice] 29#29: gracefully shutting down
2025/01/31 09:13:39 [notice] 32#32: gracefully shutting down
2025/01/31 09:13:39 [notice] 33#33: gracefully shutting down
2025/01/31 09:13:39 [notice] 35#35: gracefully shutting down
2025/01/31 09:13:39 [notice] 37#37: gracefully shutting down
2025/01/31 09:13:39 [notice] 36#36: gracefully shutting down
2025/01/31 09:13:39 [notice] 40#40: gracefully shutting down
2025/01/31 09:13:39 [notice] 41#41: gracefully shutting down
2025/01/31 09:13:39 [notice] 39#39: gracefully shutting down
2025/01/31 09:13:39 [notice] 31#31: exiting
2025/01/31 09:13:39 [notice] 28#28: exiting
2025/01/31 09:13:39 [notice] 34#34: exiting
2025/01/31 09:13:39 [notice] 38#38: exiting
2025/01/31 09:13:39 [notice] 30#30: exiting
2025/01/31 09:13:39 [notice] 29#29: exiting
2025/01/31 09:13:39 [notice] 32#32: exiting
2025/01/31 09:13:39 [notice] 33#33: exiting
2025/01/31 09:13:39 [notice] 37#37: exiting
2025/01/31 09:13:39 [notice] 35#35: exiting
2025/01/31 09:13:39 [notice] 36#36: exiting
2025/01/31 09:13:39 [notice] 36#36: exit
2025/01/31 09:13:39 [notice] 40#40: exiting
2025/01/31 09:13:39 [notice] 41#41: exiting
2025/01/31 09:13:39 [notice] 39#39: exiting
2025/01/31 09:13:39 [notice] 38#38: exit
2025/01/31 09:13:39 [notice] 34#34: exit
2025/01/31 09:13:39 [notice] 29#29: exit
2025/01/31 09:13:39 [notice] 31#31: exit
2025/01/31 09:13:39 [notice] 28#28: exit
2025/01/31 09:13:39 [notice] 30#30: exit
2025/01/31 09:13:39 [notice] 33#33: exit
2025/01/31 09:13:39 [notice] 37#37: exit
2025/01/31 09:13:39 [notice] 32#32: exit
2025/01/31 09:13:39 [notice] 35#35: exit
2025/01/31 09:13:39 [notice] 40#40: exit
2025/01/31 09:13:39 [notice] 41#41: exit
2025/01/31 09:13:39 [notice] 39#39: exit
2025/01/31 09:13:40 [notice] 1#1: signal 17 (SIGCHLD) received from 28
2025/01/31 09:13:40 [notice] 1#1: worker process 28 exited with code 0
2025/01/31 09:13:40 [notice] 1#1: worker process 30 exited with code 0
2025/01/31 09:13:40 [notice] 1#1: worker process 31 exited with code 0
2025/01/31 09:13:40 [notice] 1#1: worker process 32 exited with code 0
2025/01/31 09:13:40 [notice] 1#1: worker process 35 exited with code 0
2025/01/31 09:13:40 [notice] 1#1: worker process 36 exited with code 0
2025/01/31 09:13:40 [notice] 1#1: worker process 37 exited with code 0
2025/01/31 09:13:40 [notice] 1#1: signal 29 (SIGIO) received
2025/01/31 09:13:40 [notice] 1#1: signal 17 (SIGCHLD) received from 33
2025/01/31 09:13:40 [notice] 1#1: worker process 33 exited with code 0
2025/01/31 09:13:40 [notice] 1#1: worker process 29 exited with code 0
2025/01/31 09:13:40 [notice] 1#1: worker process 34 exited with code 0
2025/01/31 09:13:40 [notice] 1#1: worker process 38 exited with code 0
2025/01/31 09:13:40 [notice] 1#1: worker process 39 exited with code 0
2025/01/31 09:13:40 [notice] 1#1: worker process 40 exited with code 0
2025/01/31 09:13:40 [notice] 1#1: worker process 41 exited with code 0
2025/01/31 09:13:40 [notice] 1#1: exit
2025/01/31 13:27:19 [notice] 1#1: using the "epoll" event method
2025/01/31 13:27:19 [notice] 1#1: nginx/1.27.3
2025/01/31 13:27:19 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14)
2025/01/31 13:27:19 [notice] 1#1: OS: Linux 6.10.14-linuxkit
2025/01/31 13:27:19 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2025/01/31 13:27:19 [notice] 1#1: start worker processes
2025/01/31 13:27:19 [notice] 1#1: start worker process 28
2025/01/31 13:27:19 [notice] 1#1: start worker process 29
2025/01/31 13:27:19 [notice] 1#1: start worker process 30
2025/01/31 13:27:19 [notice] 1#1: start worker process 31
2025/01/31 13:27:19 [notice] 1#1: start worker process 32
2025/01/31 13:27:19 [notice] 1#1: start worker process 33
2025/01/31 13:27:19 [notice] 1#1: start worker process 34
2025/01/31 13:27:19 [notice] 1#1: start worker process 35
2025/01/31 13:27:19 [notice] 1#1: start worker process 36
2025/01/31 13:27:19 [notice] 1#1: start worker process 37
2025/01/31 13:27:19 [notice] 1#1: start worker process 38
2025/01/31 13:27:19 [notice] 1#1: start worker process 39
2025/01/31 13:27:19 [notice] 1#1: start worker process 40
2025/01/31 13:27:19 [notice] 1#1: start worker process 41
2025/01/31 13:28:14 [notice] 1#1: signal 3 (SIGQUIT) received, shutting down
2025/01/31 13:28:14 [notice] 30#30: gracefully shutting down
2025/01/31 13:28:14 [notice] 29#29: gracefully shutting down
2025/01/31 13:28:14 [notice] 28#28: gracefully shutting down
2025/01/31 13:28:14 [notice] 32#32: gracefully shutting down
2025/01/31 13:28:14 [notice] 33#33: gracefully shutting down
2025/01/31 13:28:14 [notice] 31#31: gracefully shutting down
2025/01/31 13:28:14 [notice] 36#36: gracefully shutting down
2025/01/31 13:28:14 [notice] 35#35: gracefully shutting down
2025/01/31 13:28:14 [notice] 35#35: exiting
2025/01/31 13:28:14 [notice] 38#38: gracefully shutting down
2025/01/31 13:28:14 [notice] 34#34: gracefully shutting down
2025/01/31 13:28:14 [notice] 37#37: gracefully shutting down
2025/01/31 13:28:14 [notice] 39#39: gracefully shutting down
2025/01/31 13:28:14 [notice] 41#41: gracefully shutting down
2025/01/31 13:28:14 [notice] 40#40: gracefully shutting down
2025/01/31 13:28:14 [notice] 30#30: exiting
2025/01/31 13:28:14 [notice] 29#29: exiting
2025/01/31 13:28:14 [notice] 28#28: exiting
2025/01/31 13:28:14 [notice] 32#32: exiting
2025/01/31 13:28:14 [notice] 33#33: exiting
2025/01/31 13:28:14 [notice] 31#31: exiting
2025/01/31 13:28:14 [notice] 36#36: exiting
2025/01/31 13:28:14 [notice] 35#35: exit
2025/01/31 13:28:14 [notice] 38#38: exiting
2025/01/31 13:28:14 [notice] 34#34: exiting
2025/01/31 13:28:14 [notice] 37#37: exiting
2025/01/31 13:28:14 [notice] 39#39: exiting
2025/01/31 13:28:14 [notice] 41#41: exiting
2025/01/31 13:28:14 [notice] 40#40: exiting
2025/01/31 13:28:14 [notice] 30#30: exit
2025/01/31 13:28:14 [notice] 29#29: exit
2025/01/31 13:28:14 [notice] 28#28: exit
2025/01/31 13:28:14 [notice] 32#32: exit
2025/01/31 13:28:14 [notice] 33#33: exit
2025/01/31 13:28:14 [notice] 31#31: exit
2025/01/31 13:28:14 [notice] 36#36: exit
2025/01/31 13:28:14 [notice] 38#38: exit
2025/01/31 13:28:14 [notice] 34#34: exit
2025/01/31 13:28:14 [notice] 37#37: exit
2025/01/31 13:28:14 [notice] 39#39: exit
2025/01/31 13:28:14 [notice] 41#41: exit
2025/01/31 13:28:14 [notice] 40#40: exit
2025/01/31 13:28:14 [notice] 1#1: signal 17 (SIGCHLD) received from 32
2025/01/31 13:28:14 [notice] 1#1: worker process 32 exited with code 0
2025/01/31 13:28:14 [notice] 1#1: worker process 35 exited with code 0
2025/01/31 13:28:14 [notice] 1#1: worker process 41 exited with code 0
2025/01/31 13:28:15 [notice] 1#1: signal 29 (SIGIO) received
2025/01/31 13:28:15 [notice] 1#1: signal 17 (SIGCHLD) received from 35
2025/01/31 13:28:15 [notice] 1#1: worker process 28 exited with code 0
2025/01/31 13:28:15 [notice] 1#1: worker process 30 exited with code 0
2025/01/31 13:28:15 [notice] 1#1: worker process 33 exited with code 0
2025/01/31 13:28:15 [notice] 1#1: signal 29 (SIGIO) received
2025/01/31 13:28:15 [notice] 1#1: signal 17 (SIGCHLD) received from 28
2025/01/31 13:28:15 [notice] 1#1: worker process 29 exited with code 0
2025/01/31 13:28:15 [notice] 1#1: signal 29 (SIGIO) received
2025/01/31 13:28:15 [notice] 1#1: signal 17 (SIGCHLD) received from 29
2025/01/31 13:28:15 [notice] 1#1: worker process 31 exited with code 0
2025/01/31 13:28:15 [notice] 1#1: worker process 36 exited with code 0
2025/01/31 13:28:15 [notice] 1#1: signal 29 (SIGIO) received
2025/01/31 13:28:15 [notice] 1#1: signal 17 (SIGCHLD) received from 31
2025/01/31 13:28:15 [notice] 1#1: worker process 38 exited with code 0
2025/01/31 13:28:15 [notice] 1#1: signal 29 (SIGIO) received
2025/01/31 13:28:15 [notice] 1#1: signal 17 (SIGCHLD) received from 34
2025/01/31 13:28:15 [notice] 1#1: worker process 34 exited with code 0
2025/01/31 13:28:15 [notice] 1#1: worker process 40 exited with code 0
2025/01/31 13:28:15 [notice] 1#1: signal 29 (SIGIO) received
2025/01/31 13:28:15 [notice] 1#1: signal 17 (SIGCHLD) received from 40
2025/01/31 13:28:15 [notice] 1#1: worker process 39 exited with code 0
2025/01/31 13:28:15 [notice] 1#1: signal 29 (SIGIO) received
2025/01/31 13:28:15 [notice] 1#1: signal 17 (SIGCHLD) received from 39
2025/01/31 13:28:15 [notice] 1#1: signal 17 (SIGCHLD) received from 37
2025/01/31 13:28:15 [notice] 1#1: worker process 37 exited with code 0
2025/01/31 13:28:15 [notice] 1#1: exit
2025/02/06 12:05:55 [notice] 1#1: using the "epoll" event method
2025/02/06 12:05:55 [notice] 1#1: nginx/1.27.3
2025/02/06 12:05:55 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14)
2025/02/06 12:05:55 [notice] 1#1: OS: Linux 6.10.14-linuxkit
2025/02/06 12:05:55 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2025/02/06 12:05:55 [notice] 1#1: start worker processes
2025/02/06 12:05:55 [notice] 1#1: start worker process 28
2025/02/06 12:05:55 [notice] 1#1: start worker process 29
2025/02/06 12:05:55 [notice] 1#1: start worker process 30
2025/02/06 12:05:55 [notice] 1#1: start worker process 31
2025/02/06 12:05:55 [notice] 1#1: start worker process 32
2025/02/06 12:05:55 [notice] 1#1: start worker process 33
2025/02/06 12:05:55 [notice] 1#1: start worker process 34
2025/02/06 12:05:55 [notice] 1#1: start worker process 35
2025/02/06 12:05:55 [notice] 1#1: start worker process 36
2025/02/06 12:05:55 [notice] 1#1: start worker process 37
2025/02/06 12:05:55 [notice] 1#1: start worker process 38
2025/02/06 12:05:55 [notice] 1#1: start worker process 39
2025/02/06 12:05:55 [notice] 1#1: start worker process 40
2025/02/06 12:05:55 [notice] 1#1: start worker process 41

BIN
js_workshop6/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 165 KiB

54
js_workshop6/index.html Normal file
View File

@@ -0,0 +1,54 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JS-Calc</title>
<link href="favicon.ico" rel="icon">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
<link href="styles.css" rel="stylesheet">
</head>
<body class="d-flex bg-secondary-subtle justify-content-center">
<div class="p-0 container border rounded bg-white">
<div id="titlebox" class="w-100">
<h1 class="text-center mb-0 py-4 bg-dark-subtle shadow-sm">JS-Calc</h1>
</div>
<br>
<div class="row mb-4 justify-content-center">
<div class="col-md-8 d-flex flex-column gap-2">
<div class="form-group form-floating shadow-sm">
<input class="form-control" id='num1' type="text">
<label for="num1">Number 1</label>
</div>
<div class="form-group form-floating shadow-sm">
<select class="form-select" id="operator">
<option selected value="add">Add (+)</option>
<option value="minus">Minus (-)</option>
<option value="mult">Mult (x)</option>
<option value="div">Div (÷)</option>
</select>
<label for="operator">Operator</label>
</div>
<div class="form-group form-floating shadow-sm">
<input class="form-control" id='num2' type="text">
<label for="num2">Number 2</label>
</div>
<div class="form-group form-floating shadow-sm align-self-center">
<button class="btn btn-primary" id="calculate">Calculate</button>
</div>
<div class="form-group form-floating shadow-sm">
<input disabled class="form-control" id="result">
<label for="result">Result</label>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous" defer></script>
<script src="index.js" defer></script>
</body>
<footer class="bg-dark-subtle fixed-bottom">
<div class="d-flex flex-row justify-content-center pt-3">
<p>Made by George Wilkinson @ 2025. Powered by Bootstrap and JS.</p>
</div>
</footer>
</html>

40
js_workshop6/index.js Normal file
View File

@@ -0,0 +1,40 @@
// Creates the Calculator Object
function Calculator() {
this.number1 = 0;
this.number2 = 0;
this.op = 'add';
this.add = function() { return this.number1 + this.number2; }
this.minus = function() { return this.number1 - this.number2; }
this.multiply = function() { return this.number1 * this.number2; }
this.divide = function() { return this.number1 / this.number2; }
this.Calculate = function getResult() {
if (this.op === 'add') return this.add();
if (this.op === "mult") return this.multiply();
if (this.op === "minus") return this.minus();
if (this.op === "div") return this.divide()
}
}
// Create Event Listener for button
document.getElementById('calculate').addEventListener('click', getResult, false);
// Instantiate Calculator
let calculator = new Calculator();
// Validates input and sets disabled input box to result
function getResult() {
// handler function for the calcButton
if (document.getElementById("num1").value === "") {
// show error or make a page element show the error
alert("Enter some values")
return;
}
// Give object variables values.
calculator.number1 = parseFloat(document.getElementById("num1").value);
calculator.number2 = parseFloat(document.getElementById("num2").value);
calculator.op = document.getElementById("operator").value;
// This is pretty cool, + typecasts to Number, I multiply by 100, then divide by 100,
// while avoiding rounding errors!
document.getElementById('result').value = +(Math.round(calculator.Calculate() + "e+2") + "e-2");
}

7
js_workshop6/styles.css Normal file
View File

@@ -0,0 +1,7 @@
.container {
position: absolute;
top: 50%;
transform: translateY(-50%);
width: 20% !important;
box-shadow: 0 2px 10px rgba(0,0,0,0.3);
}

BIN
js_workshop7/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 165 KiB

52
js_workshop7/index.html Normal file
View File

@@ -0,0 +1,52 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JS-Calc</title>
<link href="favicon.ico" rel="icon">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
<link href="styles.css" rel="stylesheet">
</head>
<body class="d-flex bg-secondary-subtle justify-content-center">
<div class="p-0 container border rounded bg-white">
<div id="titlebox" class="w-100">
<h1 class="text-center mb-0 py-4 bg-dark-subtle shadow-sm">JS-Calc</h1>
</div>
<div class="row m-3 justify-content-center">
<div class="calculator p-3 border bg-secondary rounded-3">
<div class="form-group form-floating">
<input disabled class="form-control" type="text" value="0" id="result">
<label for="result">Result</label>
</div>
<div class="buttons">
<button class="btn is-clear span-2 btn-danger operator">C</button>
<button class="btn btn-warning operator">&larr;</button>
<button class="btn btn-primary operator">&divide;</button>
<button class="btn bg-white">7</button>
<button class="btn bg-white">8</button>
<button class="btn bg-white">9</button>
<button class="btn btn-primary operator">x</button>
<button class="btn bg-white">4</button>
<button class="btn bg-white">5</button>
<button class="btn bg-white">6</button>
<button class="btn btn-primary">-</button>
<button class="btn bg-white">1</button>
<button class="btn bg-white">2</button>
<button class="btn bg-white">3</button>
<button class="btn btn-primary operator">+</button>
<button class="btn bg-white span-3">0</button>
<button class="btn btn-success operator">=</button>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous" defer></script>
<script src="index.js" defer></script>
</body>
<footer class="bg-dark-subtle fixed-bottom">
<div class="d-flex flex-row justify-content-center pt-3">
<p>Made by George Wilkinson @ 2025. Powered by Bootstrap and JS.</p>
</div>
</footer>
</html>

108
js_workshop7/index.js Normal file
View File

@@ -0,0 +1,108 @@
// Creates the Calculator Object
function Calculator() {
// Set current and buffer values to 0
this.current = 0;
this.buffer = "0";
// Set previous operator to null
this.previousOperator = null;
// When button is clicked, if not a number, buffer an operator
// if a number, buffer the operand.
this.buttonClicked = ( value ) => {
if (isNaN(parseInt(value))) {
calculator.bufferOperator(value);
} else {
calculator.bufferOperand(value);
}
// Push to value
this.renderResult();
}
// Function to buffer an operator given a value
this.bufferOperator = (value) =>
{
switch( value ) {
// If the value is Clear, reset all values to default.
case "C":
this.buffer = "0";
this.current = 0;
this.previousOperator = null;
break;
// If the value is equals, set previous operator to null,
// flush the operation using the typecasted buffer, and set
// buffer to the current value in order to continue operations.
// Finally set current value and previous operator to default.
case "=":
if( this.previousOperator === null ) {
return;
}
this.flushOperation( parseInt( this.buffer ));
this.buffer = "" + this.current;
this.previousOperator = null;
this.current = 0;
break;
// If value is backspace, delete the last digit in the buffer.
case "←":
if( this.buffer.length === 1 ) {
this.buffer = 0;
}
else {
this.buffer = this.buffer.substring( 0, this.buffer.length - 1 );
}
break;
default:
this.calculate( value );
}
}
// Adds operand, given a value, to the buffer.
this.bufferOperand = ( value ) =>
{
if( this.buffer === "0" )
{
this.buffer = value;
}
else
{
this.buffer += value;
}
}
// Performs operator functions depending on which operator was clicked.
// Given a tempBuffer, perform the corresponding operation to the current value.
this.flushOperation = ( tempBuffer ) => {
if( this.previousOperator === "+" ) { this.current += tempBuffer}
else if( this.previousOperator === "-" ) { this.current -= tempBuffer}
else if( this.previousOperator === "x" ) { this.current *= tempBuffer}
else { this.current /= tempBuffer}
}
// Given a value, create a temporary buffer equal to current buffer,
// perform the corresponding operation, and reset operator and buffer to
// default values.
this.calculate = ( value ) => {
const tempBuffer = parseInt( this.buffer );
if ( this.current === 0 ) {
this.current = tempBuffer;
}
else {
this.flushOperation(tempBuffer)
}
this.previousOperator = value;
this.buffer = "0";
}
// Exclusively called when a button is clicked, display a value
// rounded to 4 decimal places in the result box.
this.renderResult = () => {
// Note: this is the proper way to round to decimal places. Math.round( ( x * 100 ) / 100 )
// will almost always give rounding errors
result.value = +(Math.round(this.buffer + 'e+4') + 'e-4');
}
}
// Instantiate Calculator
let calculator = new Calculator();
// Create constant for result display HTML object
const result = document.querySelector("#result");
// Create Event Listener for button
document.querySelector( '.buttons' ).addEventListener( 'click', function( event ) {
// Pass the value of the HTML button to the buttonClicked() function.
calculator.buttonClicked( event.target.innerHTML );
});

45
js_workshop7/styles.css Normal file
View File

@@ -0,0 +1,45 @@
.container {
position: absolute;
top: 50%;
transform: translateY(-50%);
width: 320px;
box-shadow: 0 2px 10px rgba(0,0,0,0.3);
}
.calculator{
max-width:320px;
}
.buttons{
display:grid;
grid-template-columns: repeat(4,1fr);
border:0;
}
#result {
font-family: 'Monospaced', monospace ;
background: black;
color: white;
font-size: 2em;
border:0;
padding: 0.3em;
text-align: right;
width: 100%;
height: 100px;
}
.btn {
font-size:1em;
height: 65px;
border:1px solid black;
margin: 1px;
}
.btn:hover{
background: #fff;
}
.span-2 {
grid-column: span 2;
}
.span-3 {
grid-column: span 3;
}

Binary file not shown.

42
js_workshop8/index.html Normal file
View File

@@ -0,0 +1,42 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JS-Calc</title>
<link href="favicon.ico" rel="icon">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
<link href="styles.css" rel="stylesheet">
</head>
<body class="d-flex bg-secondary-subtle justify-content-center">
<div id="playerContainer" class="p-0 container border rounded bg-white d-flex flex-column">
<video id="video" class="img-fluid shadow">
<source src="SampleVideo.mp4" type="video/mp4">
<p>This video is not supported in your browser</p>
</video>
<div id="trackBar" class="bg-primary"></div>
<div id="buttonContainer" class="container-fluid align-items-center d-flex gap-2">
<button id="pauseplay" class="btn"></button>
<div id="leftAlign" class="align-items-center ms-auto d-flex gap-3">
<div id="durationWrapper" class="align-items-center d-flex gap-1">
<p class="m-auto" id="durationElapsed"></p>
<p class="m-auto">|</p>
<p class="m-auto" id="durationTotal"></p>
</div>
<div id="volWrapper" class="align-items-center d-flex flex-row gap-2">
<label id="volIco" for="volBar"></label>
<input type="range" id="volBar" class="form-range w-100">
</div>
<button id="fullscreen" class="btn"></button>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous" defer></script>
<script src="index.js"></script>
</body>
<footer class="bg-dark-subtle fixed-bottom">
<div class="d-flex flex-row justify-content-center pt-3">
<p>Made by George Wilkinson @ 2025. Powered by Bootstrap and JS.</p>
</div>
</footer>
</html>

75
js_workshop8/index.js Normal file
View File

@@ -0,0 +1,75 @@
class VideoPlayer {
constructor( video ) {
this.fullscreenStatus = false;
this.video = document.getElementById("video");
this.playerContainer = document.getElementById("playerContainer");
this.pausePlayBtn = document.getElementById("pauseplay");
this.volBar = document.getElementById("volBar");
this.volIco = document.getElementById('volIco')
this.fullscreenBtn = document.getElementById('fullscreen');
this.elapsed = document.getElementById('durationElapsed');
this.total = document.getElementById('durationTotal');
this.trackBar = document.getElementById("trackBar");
}
init() {
this.pausePlayBtn.innerHTML = '\u23F5\uFE0E';
this.fullscreenBtn.innerHTML = '\u26F6\uFE0E'
this.volIco.innerHTML = '\u266A\uFE0E'
this.total.innerHTML =
Math.floor(this.video.duration % 3600 / 60).toString().padStart(2,'0') + ":" +
Math.floor(this.video.duration % 60).toString().padStart(2,'0');
this.elapsed.innerHTML = "0:00";
this.pausePlayBtn.addEventListener('click', ( event ) => player.pausePlay( event.target.innerHTML ) );
this.volBar.addEventListener( "change", ( event )=> player.changeVol( event.currentTarget.value ) );
this.fullscreenBtn.addEventListener( 'click', () => player.fullscreen( player.playerContainer ) );
}
updateTrackbar() {
this.trackBar.style.width = parseInt(( this.video.currentTime / this.video.duration ) * 100 ) + "%";
this.elapsed.innerHTML =
Math.floor(this.video.currentTime % 3600 / 60).toString().padStart(2,'0') + ":" +
Math.floor(this.video.currentTime % 60).toString().padStart(2,'0');
}
pausePlay( value ) {
switch( value ) {
// Play Button
case '\u23F5\uFE0E':
this.play();
break;
// Pause Button
case '\u23F8\uFE0E':
this.pause()
break;
}
};
pause() {
this.video.pause();
this.pausePlayBtn.innerHTML = '\u23F5\uFE0E';
this.intervalID = 0;
};
play() {
this.video.play();
this.pausePlayBtn.innerHTML = '\u23F8\uFE0E';
this.intervalID = window.setInterval(() => this.updateTrackbar(), 500)
};
changeVol( newVolume ) {
this.video.volume = newVolume / 100;
}
fullscreen( element ) {
if( this.fullscreenStatus === false ) {
element.requestFullscreen({navigationUI:'show'}).catch((e) => {
alert(`Could not enter fullscreen: ${e.message} (${e.name})`);
});
this.fullscreenStatus = true;
}
else {
document.exitFullscreen().catch((e) => {
alert(`Could not exit fullscreen: ${e.message} (${e.name})`);
});
this.fullscreenStatus = false;
}
}
}
let player = new VideoPlayer();
player.init();

46
js_workshop8/styles.css Normal file
View File

@@ -0,0 +1,46 @@
.container {
position: absolute;
top: 50%;
transform: translateY(-50%);
width: 640px;
box-shadow: 0 2px 10px rgba(0,0,0,0.3);
}
.container:fullscreen {
width: 100%;
height: 100%;
}
.container:fullscreen #video {
height: 100%;
}
.container:fullscreen #buttonContainer {
height: 5%;
}
#volWrapper {
width: 100px;
}
#leftAlign {
align-self: flex-end;
}
#video {
object-fit: cover;
height: 100%;
}
#buttonContainer {
height: 10%;
background: rgba(50, 50, 50, 0.8);
}
#trackBar {
width: 0;
height: 4px;
}
#buttonContainer * {
color: white;
}

92
nginx/php/fpm-php.www.log Normal file → Executable file
View File

@@ -0,0 +1,92 @@
[06-Feb-2025 12:24:23 UTC] PHP Fatal error: Uncaught Error: Call to a member function prepare() on null in /var/www/ajax_workshop_2/Models/StudentsDataSet.php:17
Stack trace:
#0 /var/www/ajax_workshop_2/index.php(12): StudentsDataSet->fetchAllStudents()
#1 {main}
thrown in /var/www/ajax_workshop_2/Models/StudentsDataSet.php on line 17
[06-Feb-2025 12:24:48 UTC] PHP Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: 1 no such table: students in /var/www/ajax_workshop_2/Models/StudentsDataSet.php:17
Stack trace:
#0 /var/www/ajax_workshop_2/Models/StudentsDataSet.php(17): PDO->prepare('SELECT * FROM s...')
#1 /var/www/ajax_workshop_2/index.php(12): StudentsDataSet->fetchAllStudents()
#2 {main}
thrown in /var/www/ajax_workshop_2/Models/StudentsDataSet.php on line 17
[06-Feb-2025 12:26:09 UTC] PHP Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: 1 no such table: students in /var/www/ajax_workshop_2/Models/StudentsDataSet.php:18
Stack trace:
#0 /var/www/ajax_workshop_2/Models/StudentsDataSet.php(18): PDO->prepare('SELECT * FROM s...')
#1 /var/www/ajax_workshop_2/index.php(12): StudentsDataSet->fetchAllStudents()
#2 {main}
thrown in /var/www/ajax_workshop_2/Models/StudentsDataSet.php on line 18
[06-Feb-2025 12:26:18 UTC] PHP Fatal error: Uncaught Error: Call to undefined method StudentData::getFirstName() in /var/www/ajax_workshop_2/Views/index.phtml:20
Stack trace:
#0 /var/www/ajax_workshop_2/index.php(25): require_once()
#1 {main}
thrown in /var/www/ajax_workshop_2/Views/index.phtml on line 20
[06-Feb-2025 12:26:26 UTC] PHP Fatal error: Uncaught Error: Call to undefined method StudentData::getFirstName() in /var/www/ajax_workshop_2/Views/index.phtml:20
Stack trace:
#0 /var/www/ajax_workshop_2/index.php(25): require_once()
#1 {main}
thrown in /var/www/ajax_workshop_2/Views/index.phtml on line 20
[06-Feb-2025 12:26:27 UTC] PHP Fatal error: Uncaught Error: Call to undefined method StudentData::getFirstName() in /var/www/ajax_workshop_2/Views/index.phtml:20
Stack trace:
#0 /var/www/ajax_workshop_2/index.php(25): require_once()
#1 {main}
thrown in /var/www/ajax_workshop_2/Views/index.phtml on line 20
[06-Feb-2025 12:26:27 UTC] PHP Fatal error: Uncaught Error: Call to undefined method StudentData::getFirstName() in /var/www/ajax_workshop_2/Views/index.phtml:20
Stack trace:
#0 /var/www/ajax_workshop_2/index.php(25): require_once()
#1 {main}
thrown in /var/www/ajax_workshop_2/Views/index.phtml on line 20
[06-Feb-2025 12:26:27 UTC] PHP Fatal error: Uncaught Error: Call to undefined method StudentData::getFirstName() in /var/www/ajax_workshop_2/Views/index.phtml:20
Stack trace:
#0 /var/www/ajax_workshop_2/index.php(25): require_once()
#1 {main}
thrown in /var/www/ajax_workshop_2/Views/index.phtml on line 20
[06-Feb-2025 12:26:27 UTC] PHP Fatal error: Uncaught Error: Call to undefined method StudentData::getFirstName() in /var/www/ajax_workshop_2/Views/index.phtml:20
Stack trace:
#0 /var/www/ajax_workshop_2/index.php(25): require_once()
#1 {main}
thrown in /var/www/ajax_workshop_2/Views/index.phtml on line 20
[06-Feb-2025 12:26:28 UTC] PHP Fatal error: Uncaught Error: Call to undefined method StudentData::getFirstName() in /var/www/ajax_workshop_2/Views/index.phtml:20
Stack trace:
#0 /var/www/ajax_workshop_2/index.php(25): require_once()
#1 {main}
thrown in /var/www/ajax_workshop_2/Views/index.phtml on line 20
[06-Feb-2025 12:26:28 UTC] PHP Fatal error: Uncaught Error: Call to undefined method StudentData::getFirstName() in /var/www/ajax_workshop_2/Views/index.phtml:20
Stack trace:
#0 /var/www/ajax_workshop_2/index.php(25): require_once()
#1 {main}
thrown in /var/www/ajax_workshop_2/Views/index.phtml on line 20
[06-Feb-2025 12:26:28 UTC] PHP Fatal error: Uncaught Error: Call to undefined method StudentData::getFirstName() in /var/www/ajax_workshop_2/Views/index.phtml:20
Stack trace:
#0 /var/www/ajax_workshop_2/index.php(25): require_once()
#1 {main}
thrown in /var/www/ajax_workshop_2/Views/index.phtml on line 20
[06-Feb-2025 12:26:28 UTC] PHP Fatal error: Uncaught Error: Call to undefined method StudentData::getFirstName() in /var/www/ajax_workshop_2/Views/index.phtml:20
Stack trace:
#0 /var/www/ajax_workshop_2/index.php(25): require_once()
#1 {main}
thrown in /var/www/ajax_workshop_2/Views/index.phtml on line 20
[06-Feb-2025 12:26:52 UTC] PHP Fatal error: Uncaught Error: Call to undefined method StudentData::getFirstName() in /var/www/ajax_workshop_2/Views/index.phtml:20
Stack trace:
#0 /var/www/ajax_workshop_2/index.php(25): require_once()
#1 {main}
thrown in /var/www/ajax_workshop_2/Views/index.phtml on line 20
[06-Feb-2025 12:27:26 UTC] PHP Fatal error: Uncaught Error: Call to undefined method StudentData::getFirstName() in /var/www/ajax_workshop_2/Views/index.phtml:20
Stack trace:
#0 /var/www/ajax_workshop_2/index.php(25): require_once()
#1 {main}
thrown in /var/www/ajax_workshop_2/Views/index.phtml on line 20
[06-Feb-2025 12:27:31 UTC] PHP Fatal error: Uncaught Error: Call to undefined method StudentData::getFirstName() in /var/www/ajax_workshop_2/Views/index.phtml:20
Stack trace:
#0 /var/www/ajax_workshop_2/index.php(25): require_once()
#1 {main}
thrown in /var/www/ajax_workshop_2/Views/index.phtml on line 20
[06-Feb-2025 12:27:41 UTC] PHP Fatal error: Uncaught Error: Call to undefined method StudentData::getFirstName() in /var/www/ajax_workshop_2/Views/index.phtml:20
Stack trace:
#0 /var/www/ajax_workshop_2/index.php(25): require_once()
#1 {main}
thrown in /var/www/ajax_workshop_2/Views/index.phtml on line 20
[06-Feb-2025 12:27:48 UTC] PHP Fatal error: Uncaught Error: Call to undefined method StudentData::getFirstName() in /var/www/ajax_workshop_2/Views/index.phtml:20
Stack trace:
#0 /var/www/ajax_workshop_2/index.php(25): require_once()
#1 {main}
thrown in /var/www/ajax_workshop_2/Views/index.phtml on line 20

View File

@@ -1,8 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
# Editor-based HTTP Client requests
/httpRequests/
# Default ignored files
/shelf/
/workspace.xml
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
# Editor-based HTTP Client requests
/httpRequests/

0
workshop5/.idea/.name → php-s1/MVCtemplate-23-24/.idea/.name generated Normal file → Executable file
View File

View File

View File

@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="PublishConfigData" remoteFilesAllowedToDisappearOnAutoupload="false">
<serverData>
<paths name="workshop1">
<serverdata>
<mappings>
<mapping local="$PROJECT_DIR$" web="/" />
</mappings>
</serverdata>
</paths>
</serverData>
</component>
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="PublishConfigData" remoteFilesAllowedToDisappearOnAutoupload="false">
<serverData>
<paths name="workshop1">
<serverdata>
<mappings>
<mapping local="$PROJECT_DIR$" web="/" />
</mappings>
</serverdata>
</paths>
</serverData>
</component>
</project>

View File

0
workshop5/.idea/misc.xml → php-s1/MVCtemplate-23-24/.idea/misc.xml generated Normal file → Executable file
View File

View File

0
workshop5/.idea/php.xml → php-s1/MVCtemplate-23-24/.idea/php.xml generated Normal file → Executable file
View File

0
workshop5/.idea/vcs.xml → php-s1/MVCtemplate-23-24/.idea/vcs.xml generated Normal file → Executable file
View File

View File

@@ -0,0 +1,11 @@
<?php require('template/header.phtml') ?>
<h2>Welcome to the web-site </h2>
<h3>A template for web-site development using the <i>Model-View-Controller</i> design pattern and <a href="https://getbootstrap.com/docs/5.2/getting-started/introduction/"><i>Bootstrap</i></a>.</h3>
<p>The <i>Views/template</i> directory contains a <i>header.phtml</i> and a <i>footer.phtml</i> which should be included on every new page generated.
To add additional pages just edit the file <i>header.phtml</i> to add the extra link and then add a new <i>Controller (pageN.php)</i> and a new <i>View (pageN.phtml)</i>, for each page required.<p/>
<p>The <i>Model</i> code files are placed in the <i>Models</i> directory.</p>
<p>Do not change any of the css files in the <i>css</> directory!<p>
<?php require('template/footer.phtml') ?>

View File

@@ -0,0 +1,15 @@
</main>
<footer class="row">
<div id="footer" class="col-xs-12">
<p>Web-site development using the MVC design pattern and the Bootstrap CSS framework</p>
</div>
</footer>
<!-- Bootstrap core JavaScript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0/dist/js/bootstrap.bundle.min.js" crossorigin="anonymous"></script>
</body>
</html>

View File

@@ -0,0 +1,43 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="">
<meta name="author" content="">
<!-- Bootstrap core CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-gH2yIJqKdNHPEq0n4Mqa/HGKIhSkIHeL5AyhkYV8i59U5AR6csBvApHHNl/vI1Bx" crossorigin="anonymous">
<link href="./css/my-style.css" rel="stylesheet">
<title>Server-Side Programming - <?php echo $view->pageTitle; ?></title>
</head>
<body role="document">
<div class="container">
<div class="row">
<div id="title" class="col-xs-12">
<img src="../../images/new_uos_logo.jpg" alt="Salford University" />
<div class="pull-right"> <h1><?php echo $view->pageTitle ?> </h1></div>
</div>
</div>
<div class="row">
<nav id="menu" class="col-xs-6 col-sm-3 col-md-2">
<h2>Menu</h2>
<ul class="nav flex-column">
<li><a href="./index.php">Home</a></li>
<li><a href="./page1.php">Page1</a></li>
</ul>
</nav>
<main id="content" class="col-xs-6 col-sm-9 col-md-10">

View File

@@ -0,0 +1,38 @@
#title {
margin-top: 12px;
background-color: #fff;
color: #000;
}
#menu {
border-top: solid 6px #f00;
background-color: #f00;
color: #fff;
/*height: 400px;*/
}
#menu a {
background-color: #f00;
color: #fff;
text-decoration: none;
display: block;
}
#menu a:hover {
background-color: #f00;
color: #ddd;
text-decoration:underline;
display: block;
}
#content {
background-color: #fff;
border-top: solid 6px #f00;
}
#footer {
margin_top: 20px;
text-align: center;
background-color: #000;
color: #fff;
}

View File

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 62 KiB

View File

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@@ -0,0 +1,5 @@
<?php
$view = new stdClass();
$view->pageTitle = 'Homepage';
require_once('Views/index.phtml');

View File

View File

View File

@@ -1,2 +1,2 @@
<?php
phpinfo();
<?php
phpinfo();

0
.idea/.gitignore → php-s1/test/.idea/.gitignore generated vendored Normal file → Executable file
View File

Some files were not shown because too many files have changed in this diff Show More