diff --git a/.gitignore b/.gitignore index a96d304..78dd9bd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,10 @@ node_modules public package-lock.json +events/.venv *.log *.lock *.zip -*.DS_Store \ No newline at end of file +*.DS_Store +*.pyc \ No newline at end of file diff --git a/events/app.py b/events/app.py new file mode 100644 index 0000000..f2180af --- /dev/null +++ b/events/app.py @@ -0,0 +1,75 @@ +from flask import Flask, request, render_template +import json +from pathlib import Path + +from form_content import FormContent + +app = Flask(__name__) +save_path = Path('data.txt') +all_keys = set(FormContent.times | FormContent.topics | FormContent.languages) | { 'name', 'email', 'topic-other' } + +def get_data_stats() -> dict: + data = {} + summed = { + key: { + 'sum': 0, + 'total': 0, + 'percent': 0 + } for key in all_keys + } + summed['topic-other'] = set() + + if save_path.exists(): + for raw_line in save_path.read_text().split('\n'): + if raw_line: + line = json.loads(raw_line) + data[line['email']] = line + for line in data.values(): + for key, value in dict.items(line): + if key == 'topic-other' and value is not None: + summed['topic-other'] = summed['topic-other'] | { value } + if type(value) is bool: + sum = summed[key]['sum'] if key in summed else 0 + sum = sum + 1 if value is True else sum + total = summed[key]['total'] + 1 if key in summed else 1 + summed[key] = { + 'sum': sum, + 'total': total, + 'percent': f'{((sum / total) * 100):.1f}' + } + summed['topic-other'] = list(summed['topic-other']) + return summed + +stats_cache = (0, get_data_stats()) + +@app.route('/') +def form(): + return render_template('form.html', times=FormContent.times, topics=FormContent.topics, languages=FormContent.languages) + +@app.route('/submit', methods=['POST']) +def submit(): + if save_path.exists() and save_path.stat().st_size > 1_000_000: + return { 'error': 'Database full.' }, 500 + if len(request.data) > 1000: + return { 'error': 'Request too long.' }, 400 + + data = request.get_json() + + if set(data) != all_keys: + return { 'error': 'Invalid request format.' }, 400 + + with save_path.open(mode='a') as file: + file.write(f'{json.dumps(data)}\n') + return {}, 200 + +@app.route('/stats') +def stats(): + global stats_cache + if save_path.exists() and save_path.stat().st_mtime > stats_cache[0]: + stats_cache = (save_path.stat().st_mtime, get_data_stats()) + return render_template('stats.html', times=FormContent.times, topics=FormContent.topics, + languages=FormContent.languages, data=stats_cache[1]) + + +if __name__ == '__main__': + app.run(host='0.0.0.0', port=9700, debug=False) \ No newline at end of file diff --git a/events/form_content.py b/events/form_content.py new file mode 100644 index 0000000..92d4741 --- /dev/null +++ b/events/form_content.py @@ -0,0 +1,21 @@ +class FormContent: + times = { + 'time-weekday-evenings': 'Monday to Thursday Evenings 月曜日〜木曜日の夕方', + 'time-friday-evenings': 'Friday Evenings 金曜日の夕方', + 'time-saturday-daytime': 'Saturday Daytime 土曜日の昼', + 'time-saturday-evenings': 'Saturday Evenings 土曜日の夕方', + 'time-sunday-daytime': 'Sunday Daytime 日曜日の昼', + 'time-sunday-evenings': 'Sunday Evenings 日曜日の夕方' + } + topics = { + 'topic-hardware': 'Hardware ハードウェア', + 'topic-containerization': 'Containerization コンテナー開発 (Docker, etc.)', + 'topic-programming-languages': 'Programming Languages プログラミング言語 (Python, Rust, C++, etc.)', + 'topic-linux': 'Linux', + 'topic-ai': 'AI / Deep Learning libraries ディープラーニングのライブラリー (Pytorch, Tensorflow, etc.) ', + 'topic-web-dev': 'Web Development ウェブ開発' + } + languages = { + 'language-english': 'English 英語', + 'language-japanese': 'Japanese 日本語', + } diff --git a/events/static/app.css b/events/static/app.css new file mode 100644 index 0000000..cfa1394 --- /dev/null +++ b/events/static/app.css @@ -0,0 +1,200 @@ +* { + box-sizing: border-box; +} + +html { + background: #222; + color: #fff; + font-family: 'Avenir', sans-serif; + text-align: center; +} + +body { + margin: 0; + margin-bottom: 4rem; +} + +p, span, label { + margin: 0; + font-size: 0.9rem; +} + +input[type="text"], input[type="email"] { + outline: none; + width: 100%; + padding: 0.5rem 0.75rem; + border: 0; + border-radius: 4px; + background-color: #ccc; + font-family: 'Avenir', sans-serif; +} + +input[type="text"]:focus, input[type="email"]:focus { + background-color: #fff; +} + +select { + outline: none; + appearance: none; + width: 100%; + padding: 0.5rem 0.65rem; + padding-right: 2rem; + border: 0; + border-radius: 4px; + background: url('caret.svg') calc(100% - 0.65rem) calc(50% - 1px) / 8px no-repeat, #ccc; + font-family: 'Avenir', sans-serif; +} + +select:focus { + background: url('caret.svg') calc(100% - 0.65rem) calc(50% - 1px) / 8px no-repeat, #fff; +} + +button { + outline: none; + padding: 0.5rem 1.25rem; + border: 0; + border-radius: 4px; + color: #fff; + background-color: #3663a2; + font-family: 'Avenir', sans-serif; + font-size: 0.9rem; + font-weight: 500; + cursor: pointer; +} + +button:hover { + background-color: #497ec8; +} + +.header { + width: 100%; + height: 200px; + margin-bottom: 1rem; + object-fit: cover; + object-position: 50% 30%; +} + +.instructions { + color: #aaa; +} + +.questionnaire-content { + width: 100%; + max-width: 400px; + margin: 2rem auto; + text-align: left; +} + +.info { + margin: 1.5rem 0; +} +.info p { + margin-bottom: 0.5rem; +} + +.question { + margin: 3rem 0; +} +.question p { + margin-bottom: 0.5rem; + white-space: pre-line; +} + +.row { + display: flex; + align-items: flex-start; + color: #ccc; + margin: 0.25rem 0; + user-select: none; +} +.row label { + padding-left: 0.25rem; +} +.row, .row * { + cursor: pointer; +} +.row:hover { + color: #fff; +} + +#other-text { + display: none; +} + +.required::after { + content: '*'; + color: rgb(245, 84, 84); + margin-left: 0.25rem; +} + +#error { + display: none; + width: 100%; + padding: 0.75rem 1.25rem; + border-radius: 6px; + color: #ff6262; + background-color: #3d2525; + white-space: pre-line; +} + +.stats-table { + display: grid; + grid-template-columns: 1fr 1fr; + border-spacing: 1rem; + margin: auto; + max-width: 720px; +} + +.stats-header { + margin-top: 2rem; + margin-bottom: 1rem; + grid-column: 1 / -1; + font-size: 1.1rem; +} + +.stat-item { + display: flex; + align-items: center; + margin: 1rem; +} + +.stat-label { + text-align: left; + font-size: 0.85rem; + font-weight: 300; + word-wrap: break-word; +} + +.stat-chart { + display: flex; + flex-direction: column; + align-items: center; + margin-right: 1rem; +} + +.stat-percent { + padding-top: 0.5rem; + font-size: 0.75rem; + color: #aaa; +} + +.stat-other-topics { + display: flex; + flex-direction: column; + align-items: center; + grid-column: 1 / -1; +} + +.stat-other-topics p { + margin: 0.25rem 0; +} + +.pie-chart { + --color: #2a74c2; + --bg: #3c4452; + + width: 48px; + height: 48px; + background-color: #555; + border-radius: 100%; +} \ No newline at end of file diff --git a/events/static/app.js b/events/static/app.js new file mode 100644 index 0000000..e7164e2 --- /dev/null +++ b/events/static/app.js @@ -0,0 +1,101 @@ +const isEmailValid = (email) => { + const match = email.match(/[^@ \t\r\n]+@[^@ \t\r\n]+\.[^@ \t\r\n]+/) + return !!match?.[0] && match.index === 0 ? match?.[0] : null +} + +const toggleOtherTopic = () => { + const otherInput = document.getElementById('other-text') + if (document.getElementById('topic-other')?.checked) { + otherInput.style.display = 'block' + } + else { + otherInput.style.display = 'none' + } +} + + +const send = () => { + const error = document.getElementById('error') + error.style.display = 'none' + + const name = document.getElementById('name') + if (!name.value.trim()) { + error.style.display = 'block' + error.innerHTML = 'Please enter your name. 名前を入力してください。' + return + } + + const email = document.getElementById('email') + if (!isEmailValid(email.value)) { + error.style.display = 'block' + error.innerHTML = 'Please enter a valid email. 有効なメールアドレスを入力してください。' + return + } + + const times = [...document.querySelectorAll('[id^=time-]')]?.reduce((entries, checkbox) => { + return { ...entries, [checkbox.id]: checkbox.checked } + }, {}) + if (Object.values(times).every(time => time == false)) { + error.style.display = 'block' + error.innerHTML = 'Please select at least one convenient time. 都合の時間を一つ以上を選択してください。' + return + } + + const topics = [...document.querySelectorAll('[id^=topic-]')]?.reduce((entries, checkbox) => { + return { ...entries, [checkbox.id]: checkbox.checked } + }, {}) + if (Object.values(topics).every(time => time == false)) { + error.style.display = 'block' + error.innerHTML = 'Please select at least one topic of interest. 興味あるテーマを一つ以上を選択してください。' + return + } + + const otherText = document.getElementById('other-text') + if (topics['topic-other'] && !otherText.value.trim()) { + error.style.display = 'block' + error.innerHTML = 'Please enter your other topic of interest. その他の興味あるテーマを入力してください。' + return + } + + const language = document.getElementById('language') + const data = { + name: name.value, + email: email.value, + ...times, + ...topics, + 'topic-other': topics['topic-other'] ? otherText.value : null, + 'language-english': language.value == 'english' || language.value == 'either', + 'language-japanese': language.value == 'japanese' || language.value == 'either', + } + + fetch('/submit', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(data) + }) + .then(async response => { + return { + ok: response.ok, + status: response.status, + ...await response.json() + } + }) + .then(response => { + if (!response.ok) { + throw response.error || 'Bad request' + } + window.location.href = '/stats' + + if (response.status >= 200 && response.status < 300) { + window.location.href = '/stats' + } + else { + throw response.error || 'Bad request' + } + }) + .catch(error => { + console.error(error); + }) +} \ No newline at end of file diff --git a/events/static/caret.svg b/events/static/caret.svg new file mode 100644 index 0000000..e9a2891 --- /dev/null +++ b/events/static/caret.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/events/static/event_header.jpeg b/events/static/event_header.jpeg new file mode 100644 index 0000000..c14630c Binary files /dev/null and b/events/static/event_header.jpeg differ diff --git a/events/static/favicon.svg b/events/static/favicon.svg new file mode 100644 index 0000000..627c850 --- /dev/null +++ b/events/static/favicon.svg @@ -0,0 +1,20 @@ + diff --git a/events/templates/form.html b/events/templates/form.html new file mode 100644 index 0000000..f266b4e --- /dev/null +++ b/events/templates/form.html @@ -0,0 +1,76 @@ + + + + + + + AYO Events + + + + + +

AYO Events

+ +

Questionnaire / アンケート

+
+ +
+ +
+

Name 名前

+ +
+ +
+

Email メールアドレス

+ +
+ +
+ +

Please provide answers to the following questions.

+

以下のアンケートにお答えしていただければ幸いです。

+ +
+

What days and times of the week are convenient for you? 都合の良い時間を教えてください。

+ {% for id, name in times.items() %} +
+ + +
+ {% endfor %} +
+ +
+

What topics are of interest to you? どのテーマに興味がありますか?

+ {% for id, name in topics.items() %} +
+ + +
+ {% endfor %} +
+ + +
+ +
+ +
+

What language would you prefer? どちらの言語が良いですか?

+ +
+ +

+
+ +
+ + + + \ No newline at end of file diff --git a/events/templates/stats.html b/events/templates/stats.html new file mode 100644 index 0000000..89ca38a --- /dev/null +++ b/events/templates/stats.html @@ -0,0 +1,65 @@ + + + + + + + AYO Events + + + + + +

AYO Events

+ +

Thank you for your feedback submission!

+

アンケートのご協力いただき、ありがとうございました!

+ +
+

Here are some insights into what others have said.

+

以下は他の方からいただいた回答についての情報があります。

+
+ +
+ Times 都合の時間 + {% for id, label in times.items() %} +
+
+
+ {{ data[id]['percent'] }}% +
+

{{ label }}

+
+ {% endfor %} + + Topics of Interest 興味あるテーマ + {% for id, label in topics.items() %} +
+
+
+ {{ data[id]['percent'] }}% +
+

{{ label }}

+
+ {% endfor %} + + Other Topics of Interest その他の興味あるテーマ +
+ {% for item in data['topic-other'] %} +

{{ item }}

+ {% endfor %} +
+ + Languages 言語 + {% for id, label in languages.items() %} +
+
+
+ {{ data[id]['percent'] }}% +
+

{{ label }}

+
+ {% endfor %} +
+ + \ No newline at end of file diff --git a/.gitattributes b/home/.gitattributes similarity index 100% rename from .gitattributes rename to home/.gitattributes diff --git a/assets/blog/2021-10-07_Deep Learning Framework Benchmarks/Deep Learning Framework Benchmarks.md b/home/assets/blog/2021-10-07_Deep Learning Framework Benchmarks/Deep Learning Framework Benchmarks.md similarity index 100% rename from assets/blog/2021-10-07_Deep Learning Framework Benchmarks/Deep Learning Framework Benchmarks.md rename to home/assets/blog/2021-10-07_Deep Learning Framework Benchmarks/Deep Learning Framework Benchmarks.md diff --git a/assets/blog/2021-10-07_Deep Learning Framework Benchmarks/result_add_float32.png b/home/assets/blog/2021-10-07_Deep Learning Framework Benchmarks/result_add_float32.png similarity index 100% rename from assets/blog/2021-10-07_Deep Learning Framework Benchmarks/result_add_float32.png rename to home/assets/blog/2021-10-07_Deep Learning Framework Benchmarks/result_add_float32.png diff --git a/assets/blog/2021-10-07_Deep Learning Framework Benchmarks/result_jax_nn_dense_float32.png b/home/assets/blog/2021-10-07_Deep Learning Framework Benchmarks/result_jax_nn_dense_float32.png similarity index 100% rename from assets/blog/2021-10-07_Deep Learning Framework Benchmarks/result_jax_nn_dense_float32.png rename to home/assets/blog/2021-10-07_Deep Learning Framework Benchmarks/result_jax_nn_dense_float32.png diff --git a/assets/blog/2021-10-07_Deep Learning Framework Benchmarks/result_matmul_float64_LARGE.png b/home/assets/blog/2021-10-07_Deep Learning Framework Benchmarks/result_matmul_float64_LARGE.png similarity index 100% rename from assets/blog/2021-10-07_Deep Learning Framework Benchmarks/result_matmul_float64_LARGE.png rename to home/assets/blog/2021-10-07_Deep Learning Framework Benchmarks/result_matmul_float64_LARGE.png diff --git a/assets/blog/2021-10-07_Deep Learning Framework Benchmarks/result_nn_dense_float32_MEDIUM.png b/home/assets/blog/2021-10-07_Deep Learning Framework Benchmarks/result_nn_dense_float32_MEDIUM.png similarity index 100% rename from assets/blog/2021-10-07_Deep Learning Framework Benchmarks/result_nn_dense_float32_MEDIUM.png rename to home/assets/blog/2021-10-07_Deep Learning Framework Benchmarks/result_nn_dense_float32_MEDIUM.png diff --git a/assets/blog/2021-10-07_Deep Learning Framework Benchmarks/result_nn_dense_x5_float32_VERY_LARGE.png b/home/assets/blog/2021-10-07_Deep Learning Framework Benchmarks/result_nn_dense_x5_float32_VERY_LARGE.png similarity index 100% rename from assets/blog/2021-10-07_Deep Learning Framework Benchmarks/result_nn_dense_x5_float32_VERY_LARGE.png rename to home/assets/blog/2021-10-07_Deep Learning Framework Benchmarks/result_nn_dense_x5_float32_VERY_LARGE.png diff --git a/assets/blog/2021-10-07_Deep Learning Framework Benchmarks/result_torch_matmul_float32.png b/home/assets/blog/2021-10-07_Deep Learning Framework Benchmarks/result_torch_matmul_float32.png similarity index 100% rename from assets/blog/2021-10-07_Deep Learning Framework Benchmarks/result_torch_matmul_float32.png rename to home/assets/blog/2021-10-07_Deep Learning Framework Benchmarks/result_torch_matmul_float32.png diff --git a/assets/blog/2021-10-07_Deep Learning Framework Benchmarks/tf1_graph.png b/home/assets/blog/2021-10-07_Deep Learning Framework Benchmarks/tf1_graph.png similarity index 100% rename from assets/blog/2021-10-07_Deep Learning Framework Benchmarks/tf1_graph.png rename to home/assets/blog/2021-10-07_Deep Learning Framework Benchmarks/tf1_graph.png diff --git a/assets/blog/2021-10-07_Deep Learning Framework Benchmarks/tf1_graph_network.png b/home/assets/blog/2021-10-07_Deep Learning Framework Benchmarks/tf1_graph_network.png similarity index 100% rename from assets/blog/2021-10-07_Deep Learning Framework Benchmarks/tf1_graph_network.png rename to home/assets/blog/2021-10-07_Deep Learning Framework Benchmarks/tf1_graph_network.png diff --git a/assets/blog/2021-10-07_Deep Learning Framework Benchmarks/tf1_graph_train.png b/home/assets/blog/2021-10-07_Deep Learning Framework Benchmarks/tf1_graph_train.png similarity index 100% rename from assets/blog/2021-10-07_Deep Learning Framework Benchmarks/tf1_graph_train.png rename to home/assets/blog/2021-10-07_Deep Learning Framework Benchmarks/tf1_graph_train.png diff --git a/assets/blog/2023-09-12_Self-Hosted Web Infrastructure/Self-Hosted Web Infrastructure.md b/home/assets/blog/2023-09-12_Self-Hosted Web Infrastructure/Self-Hosted Web Infrastructure.md similarity index 100% rename from assets/blog/2023-09-12_Self-Hosted Web Infrastructure/Self-Hosted Web Infrastructure.md rename to home/assets/blog/2023-09-12_Self-Hosted Web Infrastructure/Self-Hosted Web Infrastructure.md diff --git a/assets/blog/2023-09-12_Self-Hosted Web Infrastructure/odroidn2plus.jpg b/home/assets/blog/2023-09-12_Self-Hosted Web Infrastructure/odroidn2plus.jpg similarity index 100% rename from assets/blog/2023-09-12_Self-Hosted Web Infrastructure/odroidn2plus.jpg rename to home/assets/blog/2023-09-12_Self-Hosted Web Infrastructure/odroidn2plus.jpg diff --git a/assets/blog/2023-09-21_Audio Preprocessing for Deep Learning/Audio Preprocessing for Deep Learning.md b/home/assets/blog/2023-09-21_Audio Preprocessing for Deep Learning/Audio Preprocessing for Deep Learning.md similarity index 100% rename from assets/blog/2023-09-21_Audio Preprocessing for Deep Learning/Audio Preprocessing for Deep Learning.md rename to home/assets/blog/2023-09-21_Audio Preprocessing for Deep Learning/Audio Preprocessing for Deep Learning.md diff --git a/assets/blog/2023-09-21_Audio Preprocessing for Deep Learning/fft.png b/home/assets/blog/2023-09-21_Audio Preprocessing for Deep Learning/fft.png similarity index 100% rename from assets/blog/2023-09-21_Audio Preprocessing for Deep Learning/fft.png rename to home/assets/blog/2023-09-21_Audio Preprocessing for Deep Learning/fft.png diff --git a/assets/blog/2023-09-21_Audio Preprocessing for Deep Learning/human_frequency_response.jpeg b/home/assets/blog/2023-09-21_Audio Preprocessing for Deep Learning/human_frequency_response.jpeg similarity index 100% rename from assets/blog/2023-09-21_Audio Preprocessing for Deep Learning/human_frequency_response.jpeg rename to home/assets/blog/2023-09-21_Audio Preprocessing for Deep Learning/human_frequency_response.jpeg diff --git a/assets/blog/2023-09-21_Audio Preprocessing for Deep Learning/mfcc.png b/home/assets/blog/2023-09-21_Audio Preprocessing for Deep Learning/mfcc.png similarity index 100% rename from assets/blog/2023-09-21_Audio Preprocessing for Deep Learning/mfcc.png rename to home/assets/blog/2023-09-21_Audio Preprocessing for Deep Learning/mfcc.png diff --git a/assets/blog/2023-09-21_Audio Preprocessing for Deep Learning/quantization.png b/home/assets/blog/2023-09-21_Audio Preprocessing for Deep Learning/quantization.png similarity index 100% rename from assets/blog/2023-09-21_Audio Preprocessing for Deep Learning/quantization.png rename to home/assets/blog/2023-09-21_Audio Preprocessing for Deep Learning/quantization.png diff --git a/assets/blog/draft_2023-09-XX-_Web_infrastructure_2/Web Infrastructure 2.md b/home/assets/blog/draft_2023-09-XX-_Web_infrastructure_2/Web Infrastructure 2.md similarity index 100% rename from assets/blog/draft_2023-09-XX-_Web_infrastructure_2/Web Infrastructure 2.md rename to home/assets/blog/draft_2023-09-XX-_Web_infrastructure_2/Web Infrastructure 2.md diff --git a/assets/blog/draft_2023-09-xx_Training A Speech-to-Text Neural Network/Training A Speech-to-Text Neural Network.md b/home/assets/blog/draft_2023-09-xx_Training A Speech-to-Text Neural Network/Training A Speech-to-Text Neural Network.md similarity index 100% rename from assets/blog/draft_2023-09-xx_Training A Speech-to-Text Neural Network/Training A Speech-to-Text Neural Network.md rename to home/assets/blog/draft_2023-09-xx_Training A Speech-to-Text Neural Network/Training A Speech-to-Text Neural Network.md diff --git a/assets/fonts/open_sans.ttf b/home/assets/fonts/open_sans.ttf similarity index 100% rename from assets/fonts/open_sans.ttf rename to home/assets/fonts/open_sans.ttf diff --git a/assets/icons/arrow_forward.svg b/home/assets/icons/arrow_forward.svg similarity index 100% rename from assets/icons/arrow_forward.svg rename to home/assets/icons/arrow_forward.svg diff --git a/assets/icons/brain.svg b/home/assets/icons/brain.svg similarity index 100% rename from assets/icons/brain.svg rename to home/assets/icons/brain.svg diff --git a/assets/icons/brightness_high.svg b/home/assets/icons/brightness_high.svg similarity index 100% rename from assets/icons/brightness_high.svg rename to home/assets/icons/brightness_high.svg diff --git a/assets/icons/brightness_medium.svg b/home/assets/icons/brightness_medium.svg similarity index 100% rename from assets/icons/brightness_medium.svg rename to home/assets/icons/brightness_medium.svg diff --git a/assets/icons/cloud_server.svg b/home/assets/icons/cloud_server.svg similarity index 100% rename from assets/icons/cloud_server.svg rename to home/assets/icons/cloud_server.svg diff --git a/assets/icons/favicon.ico b/home/assets/icons/favicon.ico similarity index 100% rename from assets/icons/favicon.ico rename to home/assets/icons/favicon.ico diff --git a/assets/icons/favicon.png b/home/assets/icons/favicon.png similarity index 100% rename from assets/icons/favicon.png rename to home/assets/icons/favicon.png diff --git a/assets/icons/favicon.svg b/home/assets/icons/favicon.svg similarity index 100% rename from assets/icons/favicon.svg rename to home/assets/icons/favicon.svg diff --git a/assets/icons/github.svg b/home/assets/icons/github.svg similarity index 100% rename from assets/icons/github.svg rename to home/assets/icons/github.svg diff --git a/assets/icons/gitlab.svg b/home/assets/icons/gitlab.svg similarity index 100% rename from assets/icons/gitlab.svg rename to home/assets/icons/gitlab.svg diff --git a/assets/icons/linkedin.svg b/home/assets/icons/linkedin.svg similarity index 100% rename from assets/icons/linkedin.svg rename to home/assets/icons/linkedin.svg diff --git a/assets/icons/logo.svg b/home/assets/icons/logo.svg similarity index 100% rename from assets/icons/logo.svg rename to home/assets/icons/logo.svg diff --git a/assets/icons/logo_old.svg b/home/assets/icons/logo_old.svg similarity index 100% rename from assets/icons/logo_old.svg rename to home/assets/icons/logo_old.svg diff --git a/assets/icons/translate.svg b/home/assets/icons/translate.svg similarity index 100% rename from assets/icons/translate.svg rename to home/assets/icons/translate.svg diff --git a/assets/icons/window.svg b/home/assets/icons/window.svg similarity index 100% rename from assets/icons/window.svg rename to home/assets/icons/window.svg diff --git a/assets/images/kyoto.jpeg b/home/assets/images/kyoto.jpeg similarity index 100% rename from assets/images/kyoto.jpeg rename to home/assets/images/kyoto.jpeg diff --git a/assets/images/undraw_Artificial_intelligence_oyxx.svg b/home/assets/images/undraw_Artificial_intelligence_oyxx.svg similarity index 100% rename from assets/images/undraw_Artificial_intelligence_oyxx.svg rename to home/assets/images/undraw_Artificial_intelligence_oyxx.svg diff --git a/assets/images/undraw_analytics_5pgy.svg b/home/assets/images/undraw_analytics_5pgy.svg similarity index 100% rename from assets/images/undraw_analytics_5pgy.svg rename to home/assets/images/undraw_analytics_5pgy.svg diff --git a/assets/images/undraw_design_data_khdb.svg b/home/assets/images/undraw_design_data_khdb.svg similarity index 100% rename from assets/images/undraw_design_data_khdb.svg rename to home/assets/images/undraw_design_data_khdb.svg diff --git a/assets/images/undraw_detailed_analysis_xn7y.svg b/home/assets/images/undraw_detailed_analysis_xn7y.svg similarity index 100% rename from assets/images/undraw_detailed_analysis_xn7y.svg rename to home/assets/images/undraw_detailed_analysis_xn7y.svg diff --git a/assets/images/undraw_maintenance_cn7j.svg b/home/assets/images/undraw_maintenance_cn7j.svg similarity index 100% rename from assets/images/undraw_maintenance_cn7j.svg rename to home/assets/images/undraw_maintenance_cn7j.svg diff --git a/assets/theme/dark.css b/home/assets/theme/dark.css similarity index 100% rename from assets/theme/dark.css rename to home/assets/theme/dark.css diff --git a/assets/theme/light.css b/home/assets/theme/light.css similarity index 100% rename from assets/theme/light.css rename to home/assets/theme/light.css diff --git a/index.html b/home/index.html similarity index 100% rename from index.html rename to home/index.html diff --git a/package.json b/home/package.json similarity index 100% rename from package.json rename to home/package.json diff --git a/robot.txt b/home/robot.txt similarity index 100% rename from robot.txt rename to home/robot.txt diff --git a/scripts/tmpfs_dirs.sh b/home/scripts/tmpfs_dirs.sh similarity index 100% rename from scripts/tmpfs_dirs.sh rename to home/scripts/tmpfs_dirs.sh diff --git a/server.js b/home/server.js similarity index 100% rename from server.js rename to home/server.js diff --git a/src/actions.js b/home/src/actions.js similarity index 100% rename from src/actions.js rename to home/src/actions.js diff --git a/src/blog.css b/home/src/blog.css similarity index 100% rename from src/blog.css rename to home/src/blog.css diff --git a/src/blog.jsx b/home/src/blog.jsx similarity index 100% rename from src/blog.jsx rename to home/src/blog.jsx diff --git a/src/blog_entry.jsx b/home/src/blog_entry.jsx similarity index 100% rename from src/blog_entry.jsx rename to home/src/blog_entry.jsx diff --git a/src/blog_entry.scss b/home/src/blog_entry.scss similarity index 100% rename from src/blog_entry.scss rename to home/src/blog_entry.scss diff --git a/src/home.jsx b/home/src/home.jsx similarity index 100% rename from src/home.jsx rename to home/src/home.jsx diff --git a/src/index.jsx b/home/src/index.jsx similarity index 100% rename from src/index.jsx rename to home/src/index.jsx diff --git a/src/lang/en.json b/home/src/lang/en.json similarity index 100% rename from src/lang/en.json rename to home/src/lang/en.json diff --git a/src/lang/jp.json b/home/src/lang/jp.json similarity index 100% rename from src/lang/jp.json rename to home/src/lang/jp.json diff --git a/src/main.css b/home/src/main.css similarity index 100% rename from src/main.css rename to home/src/main.css diff --git a/src/main.jsx b/home/src/main.jsx similarity index 100% rename from src/main.jsx rename to home/src/main.jsx diff --git a/src/reducers.js b/home/src/reducers.js similarity index 100% rename from src/reducers.js rename to home/src/reducers.js diff --git a/src/svg.jsx b/home/src/svg.jsx similarity index 100% rename from src/svg.jsx rename to home/src/svg.jsx diff --git a/src/svg_toggle.jsx b/home/src/svg_toggle.jsx similarity index 100% rename from src/svg_toggle.jsx rename to home/src/svg_toggle.jsx diff --git a/webpack.base.js b/home/webpack.base.js similarity index 100% rename from webpack.base.js rename to home/webpack.base.js diff --git a/webpack.dev.js b/home/webpack.dev.js similarity index 100% rename from webpack.dev.js rename to home/webpack.dev.js diff --git a/webpack.prod.js b/home/webpack.prod.js similarity index 100% rename from webpack.prod.js rename to home/webpack.prod.js