diff --git a/.github/workflows/daily.yml b/.github/workflows/daily.yml
new file mode 100644
index 000000000..0e11d6969
--- /dev/null
+++ b/.github/workflows/daily.yml
@@ -0,0 +1,66 @@
+name: Daily Workflow
+
+on:
+ schedule:
+ # æ¯æ 9:00 JST
+ - cron: '0 0 * * *'
+ # Allows you to run this workflow manually from the Actions tab
+ # https://docs.github.com/en/actions/managing-workflow-runs/manually-running-a-workflow
+ workflow_dispatch:
+
+jobs:
+ daily:
+ runs-on: ubuntu-latest
+ outputs:
+ FOUND_NEWS: ${{ steps.check_news.outputs.FOUND_NEWS }}
+
+ steps:
+ - name: âïž Checkout code
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 2
+
+ - name: ð Setup Ruby
+ uses: ruby/setup-ruby@v1
+ with:
+ bundler-cache: true
+
+ - name: ð° Run news:fetch task
+ run: bin/rails news:fetch
+
+ - name: ð Commit updated news.yml
+ id: check_news
+ run: |
+ git config user.name "Yohei Yasukawa"
+ git config user.email "yohei@yasslab.jp"
+ git checkout main
+ git add db/news.yml
+ if ! git diff --cached --quiet; then
+ git commit -m 'ð€ Upsert db/news.yml'
+ git push origin main
+ echo "ð Found news in db/news.yml"
+ echo "FOUND_NEWS=true" >> $GITHUB_OUTPUT
+ else
+ echo "â
No news in db/news.yml"
+ echo "FOUND_NEWS=false" >> $GITHUB_OUTPUT
+ fi
+
+ deploy:
+ needs: daily
+ if: ${{ needs.daily.outputs.FOUND_NEWS == 'true' }}
+ # TODO: ubuntu-latest image needs to install heroku CLI to deploy.
+ # https://github.com/AkhileshNS/heroku-deploy/issues/188
+ runs-on: ubuntu-22.04
+
+ steps:
+ - name: âïž Checkout code
+ uses: actions/checkout@v4
+ with:
+ ref: main
+
+ - name: ð Deploy to Heroku
+ uses: akhileshns/heroku-deploy@v3.14.15
+ with:
+ heroku_api_key: ${{ secrets.HEROKU_API_KEY }}
+ heroku_app_name: ${{ secrets.HEROKU_APP_NAME }}
+ heroku_email: ${{ secrets.HEROKU_EMAIL }}
diff --git a/.github/workflows/fetch_news.yml b/.github/workflows/fetch_news.yml
deleted file mode 100644
index 01c36a8c0..000000000
--- a/.github/workflows/fetch_news.yml
+++ /dev/null
@@ -1,39 +0,0 @@
-name: Fetch News
-
-on:
- schedule:
- # æ¯æ 9:00 JST
- - cron: '0 0 * * *'
- workflow_dispatch:
-
-jobs:
- fetch:
- runs-on: ubuntu-latest
-
- steps:
- - name: Checkout repository
- uses: actions/checkout@v4
-
- - name: Set up Ruby
- uses: ruby/setup-ruby@v1
- with:
- ruby-version: .ruby-version
- bundler-cache: true
-
- - name: Install dependencies
- run: bundle install --jobs 4 --retry 3
-
- - name: Run news:fetch task
- run: bin/rails news:fetch
-
- - name: Commit updated news.yml
- run: |
- git config user.name "github-actions[bot]"
- git config user.email "github-actions[bot]@users.noreply.github.com"
- git add db/news.yml
- if ! git diff --cached --quiet; then
- git commit -m "chore: update news.yml via GitHub Actions"
- git push
- else
- echo "No changes in db/news.yml"
- fi
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
index ded06bfc5..b4ab14b44 100644
--- a/CODE_OF_CONDUCT.md
+++ b/CODE_OF_CONDUCT.md
@@ -1,6 +1,6 @@
# è¡åèŠç¯ - Code of Conduct
-[äžè¬ç€Ÿå£æ³äºº CoderDojo Japan](https://coderdojo.jp/about-coderdojo-japan) ã¯ã次ã®è¡åèŠç¯ã«ãããã£ãŠ [GitHub äžã®åçš®ãªããžããª](https://github.com/coderdojo-japan)ãéå¶ããŠããŸãã
+[äžè¬ç€Ÿå£æ³äºº CoderDojo Japan](https://coderdojo.jp/about) ã¯ã次ã®è¡åèŠç¯ã«ãããã£ãŠ [GitHub äžã®åçš®ãªããžããª](https://github.com/coderdojo-japan)ãéå¶ããŠããŸãã
ã³ã³ããªãã¥ãŒã¿ãŒè¡åèŠç¯ - CoderDojo Japan
https://coderdojo.jp/conduct
diff --git a/Gemfile.lock b/Gemfile.lock
index a2c4d1029..667b5d315 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -286,7 +286,7 @@ GEM
get_process_mem (>= 0.2)
puma (>= 2.7)
racc (1.8.1)
- rack (3.1.16)
+ rack (3.1.18)
rack-attack (6.7.0)
rack (>= 1.0, < 4)
rack-host-redirect (1.3.0)
@@ -356,7 +356,7 @@ GEM
io-console (~> 0.5)
reverse_markdown (3.0.0)
nokogiri
- rexml (3.4.1)
+ rexml (3.4.2)
rinku (2.0.6)
rspec-core (3.13.4)
rspec-support (~> 3.13.0)
diff --git a/LICENSE.md b/LICENSE.md
index 54b45332c..246b7e164 100644
--- a/LICENSE.md
+++ b/LICENSE.md
@@ -42,4 +42,4 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
Check out README's LICENSE (ã©ã€ã»ã³ã¹) section in GitHub:
https://github.com/coderdojo-japan/coderdojo.jp#5-license
-Copyright © [äžè¬ç€Ÿå£æ³äºº CoderDojo Japan](https://coderdojo.jp/about-coderdojo-japan)
+Copyright © [äžè¬ç€Ÿå£æ³äºº CoderDojo Japan](https://coderdojo.jp/about)
diff --git a/README.md b/README.md
index 8d3c0122a..fa443ff63 100644
--- a/README.md
+++ b/README.md
@@ -273,7 +273,7 @@ We use `SCRIVITO_TENANT` and `SCRIVITO_API_KEY` keys in production, but they are
This web application is developed with many other brilliant works! :sparkling_heart:
You can check out them and our works with associated licenses from [LICENSE.md](https://github.com/coderdojo-japan/coderdojo.jp/blob/main/LICENSE.md). :wink:
-Copyright © [äžè¬ç€Ÿå£æ³äºº CoderDojo Japan](https://coderdojo.jp/about-coderdojo-japan) ([@coderdojo-japan](https://github.com/coderdojo-japan)).
+Copyright © [äžè¬ç€Ÿå£æ³äºº CoderDojo Japan](https://coderdojo.jp/about) ([@coderdojo-japan](https://github.com/coderdojo-japan)).
diff --git a/app/assets/images/dojocon-japan-2025.png b/app/assets/images/dojocon-japan-2025.png
new file mode 100644
index 000000000..21d56b5c8
Binary files /dev/null and b/app/assets/images/dojocon-japan-2025.png differ
diff --git a/app/assets/images/dojocon-japan-2025.webp b/app/assets/images/dojocon-japan-2025.webp
new file mode 100644
index 000000000..2d5bf233d
Binary files /dev/null and b/app/assets/images/dojocon-japan-2025.webp differ
diff --git a/app/controllers/podcasts_controller.rb b/app/controllers/podcasts_controller.rb
index be959a74a..a0db59389 100644
--- a/app/controllers/podcasts_controller.rb
+++ b/app/controllers/podcasts_controller.rb
@@ -50,7 +50,7 @@ def convert_shownote(content)
content.gsub!(Podcast::TIMESTAMP_REGEX) do
original_t = $1
parts = original_t.split(':')
-
+
# ã¿ã€ã ã¹ã¿ã³ããh:m:s圢åŒã«å€æ
if parts.size == 3
# 00:00:00 圢åŒ
@@ -64,7 +64,7 @@ def convert_shownote(content)
# ãã以å€ïŒéåžžã¯æ¥ãªãã¯ãïŒ
t = original_t
end
-
+
"- [#{original_t}](https://youtu.be/#{youtube_id}?t=#{t}) "
end
end
diff --git a/app/models/document.rb b/app/models/document.rb
index 513fb4d82..68ebaeb2d 100644
--- a/app/models/document.rb
+++ b/app/models/document.rb
@@ -20,7 +20,8 @@ def last
end
def initialize(filename)
- @filename = filename
+ # ActiveStorage::Filename ã䜿çšããŠãã¡ã€ã«åããµãã¿ã€ãº
+ @filename = ActiveStorage::Filename.new(filename).sanitized
end
def path
@@ -56,7 +57,6 @@ def url
end
def exist?
- return false if path.include? "\u0000"
Document.all.map(&:filename).include?(filename)
end
diff --git a/app/views/docs/kata.html.erb b/app/views/docs/kata.html.erb
index a96175ece..93be231de 100644
--- a/app/views/docs/kata.html.erb
+++ b/app/views/docs/kata.html.erb
@@ -1071,7 +1071,7 @@
æ¥æ¬å šåœã® Dojo 代衚è éå®ã®éå ¬é Facebook ã°ã«ãŒãããããŸãããã®ã°ã«ãŒãã§ã¯éå¶ã«é¢ããçžè«ããéå¶è åãã®éå ¬éæ å ±ãªã©ãå ±æããŠããŸããDojo ãæ¿èªããããã³ãã©ãããæ°è»œã«ç³è«ããŠãã ããã
åžæãã Dojo ã¯ããã€ã§ã <%= link_to 'coderdojo.jp ã«æ²èŒ', root_path(anchor: 'dojos') %>ããããšãã§ããŸãããŸããDoorkeeper ã connpass ã§ã€ãã³ãã管çã»äœæããŠããå Žåã¯ã<%= link_to 'è¿æ¥éå¬ã®éå Ž', events_path %>ããã€ãã³ããèªåçã«åšç¥ãããããã«ãªããŸããæºåãã§ããã<%= link_to 'ã³ãã©', signup_path %>ããç³è«ããŠãã ãã! ðž
by <%= link_to 'CoderDojo Japan', doc_path('about-coderdojo-japan') %>
+by <%= link_to 'CoderDojo Japan', doc_path('about') %>
by <%= link_to 'CoderDojo Japan', doc_path('about-coderdojo-japan') %>
+by <%= link_to 'CoderDojo Japan', doc_path('about') %>
by <%= link_to 'CoderDojo Japan', doc_path('about-coderdojo-japan') %>
+by <%= link_to 'CoderDojo Japan', doc_path('about') %>
by <%= link_to 'CoderDojo Foundation', foundation_url %> & <%= link_to 'CoderDojo Japan', doc_path('about-coderdojo-japan') %>
+by <%= link_to 'CoderDojo Foundation', foundation_url %> & <%= link_to 'CoderDojo Japan', doc_path('about') %>
by <%= link_to 'CoderDojo Foundation', foundation_url %> & <%= link_to 'CoderDojo Japan', doc_path('about-coderdojo-japan') %>
+by <%= link_to 'CoderDojo Foundation', foundation_url %> & <%= link_to 'CoderDojo Japan', doc_path('about') %>
by <%= link_to 'CoderDojo Foundation', foundation_url %> & <%= link_to 'CoderDojo Japan', doc_path('about-coderdojo-japan') %>
+by <%= link_to 'CoderDojo Foundation', foundation_url %> & <%= link_to 'CoderDojo Japan', doc_path('about') %>
CoderDojo ã³ãã¥ããã£ã«ã¯å°åããšã« <%= link_to 'CoderDojo Japan', doc_path('about-coderdojo-japan') %> ã®ãããªå ¬åŒæ³äººïŒNational PartnersïŒããããŸããå ¬åŒæ³äººãããå°åã¯æ¯èŒç掻çºãªå°åãšãªã£ãŠããŸãã®ã§ãäžèšããŒãžããèå³ããå°åã®å ¬åŒæ³äººã«ã³ã³ã¿ã¯ãããŠã¿ããšè¯ããããããŸããã
+CoderDojo ã³ãã¥ããã£ã«ã¯å°åããšã« <%= link_to 'CoderDojo Japan', doc_path('about') %> ã®ãããªå ¬åŒæ³äººïŒNational PartnersïŒããããŸããå ¬åŒæ³äººãããå°åã¯æ¯èŒç掻çºãªå°åãšãªã£ãŠããŸãã®ã§ãäžèšããŒãžããèå³ããå°åã®å ¬åŒæ³äººã«ã³ã³ã¿ã¯ãããŠã¿ããšè¯ããããããŸããã
ð National Partners - Foundation
å 容ãèŠæš¡ãããããç°ãªããŸãããã©ã®éå Žã§ãäž»äœçã«åŠã¶å§¿å¢ã倧åã§ãã
+å 容ãèŠæš¡ãããããç°ãªããŸãããã©ã®éå Žã§ãäž»äœçã«åŠã¶å§¿å¢ã倧åã§ãã
è©³çŽ°ã¯æ¬¡ã®ã¹ã©ã€ãããèªã¿ãã ããã
@@ -107,33 +107,40 @@
è¿ãã®éå Žãæ¢ããŠã¿ãŸãããïŒ
ãããã°ã©ãã³ã°ã§ãã±ã¢ã³ããããããŠã¿ãããã®ã¯ãŒã¯ã·ã§ããäºäŸãèŒããŠããŸãã
Copyright ©
-
+
äžè¬ç€Ÿå£æ³äºº CoderDojo Japan
+
+
diff --git a/app/views/podcasts/index.html.erb b/app/views/podcasts/index.html.erb
index 437e2b3e0..b427df717 100644
--- a/app/views/podcasts/index.html.erb
+++ b/app/views/podcasts/index.html.erb
@@ -22,7 +22,7 @@
ð» <%= @title %>
ã¯ãŒã¯ã·ã§ããéå¬ãæ€èšããŠãã CoderDojo é¢ä¿è
ã®åèã«ãªãã°å¹žãã§ãã
diff --git a/app/views/stats/show.html.erb b/app/views/stats/show.html.erb
index 33fdc5cd1..1cefcba08 100644
--- a/app/views/stats/show.html.erb
+++ b/app/views/stats/show.html.erb
@@ -12,7 +12,10 @@
<%= @lang == 'en' ? 'Statistics' : 'çµ±èšæ
å ±' %>
+
+ ðŸ
+ <%= @lang == 'en' ? 'Statistics' : 'çµ±èšæ
å ±' %>
+
diff --git a/config/routes.rb b/config/routes.rb
index 0eb3e73fe..f756ff20f 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -14,12 +14,14 @@
#get "/docs/teikan", to: redirect('/teikan')
#get "/docs/signup", to: redirect('/signup')
- get "/docs/join-in-board", to: redirect('/about-coderdojo-japan')
- get "/docs/join-in-board-2017", to: redirect('/about-coderdojo-japan')
- get "/join-in-board", to: redirect('/about-coderdojo-japan')
- get "/join-in-board-2017", to: redirect('/about-coderdojo-japan')
- get "/about-coderdojo-japan" => "docs#show", id: 'about-coderdojo-japan'
+ get "/docs/join-in-board", to: redirect('/about')
+ get "/docs/join-in-board-2017", to: redirect('/about')
+ get "/join-in-board", to: redirect('/about')
+ get "/join-in-board-2017", to: redirect('/about')
+ get "/join-in-board", to: redirect('/about')
+ get "/about-coderdojo-japan", to: redirect('/about')
get "/about-coderdojo" => "docs#show", id: 'about-coderdojo'
+ get "/about" => "docs#show", id: 'about-coderdojo-japan'
get "/docs/code-of-conduct", to: redirect('/conduct')
get "/docs/conduct", to: redirect('/conduct')
@@ -36,6 +38,7 @@
get "/docs/_thanks", to: redirect('/thanks')
get "/redirects/202407", to: redirect('https://www.facebook.com/groups/coderdojo.jp.champions/posts/7788378511253707/')
+ get "/redirects/prtimes", to: redirect('https://prtimes.jp/main/html/searchrlp/company_id/38935')
get "/redirects/interface", to: redirect('/')
get "/youtube", to: redirect('https://www.youtube.com/CoderDojoJapan')
get "/calendar", to: redirect('/calendars')
@@ -49,9 +52,10 @@
get "/brand" => "docs#show", id: 'brand-guidelines'
get "/charter" => "docs#show", id: 'charter'
get "/charter_en" => "docs#show", id: 'charter_en'
- get "/english" => "docs#show", id: 'english'
get "/for-media" => "docs#show", id: 'for-media'
get "/styleguides" => "docs#show", id: 'styleguides'
+ get "/english" => "docs#show", id: 'english'
+ get "/english/calendar" => "docs#show", id: '_calendar-english'
get "/financial-report", to: redirect('/finances')
get "/finances" => "docs#show", id: 'finances'
diff --git a/db/dojo_event_services.yml b/db/dojo_event_services.yml
index ef709498d..fc0dcf67f 100644
--- a/db/dojo_event_services.yml
+++ b/db/dojo_event_services.yml
@@ -27,6 +27,12 @@
### 以äžãDojo æ
å ±ãŸãšã ###
### (dojos.yml ã®è¿œå é ) ###
+# æ°·èŠ@bigberriesïŒå¯å±±çæ°·èŠåžïŒ
+#- dojo_id: 344
+# name: ???
+# group_id: ???
+# url: https://codeclub.org/ja/clubs/6a93d88f-6f44-4057-8a2a-d003896b0406
+
# æç£šç§åŠå
¬åéœåžïŒå
µåº«çäžé¡çºïŒ
#- dojo_id: 343
# name: ???
diff --git a/db/dojos.yml b/db/dojos.yml
index 98afa7ae2..1ce77eee1 100644
--- a/db/dojos.yml
+++ b/db/dojos.yml
@@ -1437,7 +1437,7 @@
created_at: '2017-11-18'
name: ç«å·
prefecture_id: 13
- url: https://coderdojotachikawa.github.io/
+ url: https://coderdojotachikawa.doorkeeper.jp/
logo: "/img/dojos/tachikawa.webp"
description: ç«å·åžã§æ¯æéå¬
tags:
@@ -1995,6 +1995,18 @@
- Minecraft
- é»åå·¥äœ
- 3Dãã¶ã€ã³
+- id: 344
+ order: '162051'
+ created_at: '2025-10-27'
+ name: æ°·èŠ@bigberries
+ prefecture_id: 16
+ logo: "/img/dojos/default.webp"
+ url: https://codeclub.org/ja/clubs/6a93d88f-6f44-4057-8a2a-d003896b0406
+ description: æ°·èŠåžã§éé±éå¬
+ tags:
+ - Scratch
+ - micro:bit
+ - MESH
- id: 279
order: '162060'
created_at: '2022-03-01'
@@ -2601,10 +2613,11 @@
- id: 62
order: '242039'
created_at: '2016-12-22'
- note: 2025-03-16 https://www.instagram.com/p/DG990t1PjEk/?img_index=1
+ inactivated_at: '2025-04-21'
+ note: Last session confirmed - 2024/4/21(æ¥)
name: äŒå¢
prefecture_id: 24
- url: https://www.instagram.com/coderdojo.ise/
+ url: https://coderdojo-ise.jimdofree.com/
logo: "/img/dojos/ise.webp"
description: äŒå¢åžã§æ¯æéå¬
tags:
@@ -3247,7 +3260,7 @@
created_at: '2025-07-28'
name: æç£šç§åŠå
¬åéœåž
prefecture_id: 28
- url: https://koto-ictclub.net/dojo/
+ url: https://www.coderdojo-hsgc-techno.org/
logo: "/img/dojos/default.webp"
description: èµ€ç©é¡äžé¡çºã§æ¯æéå¬
tags:
@@ -3832,7 +3845,7 @@
created_at: '2017-10-06'
name: ããã¡
prefecture_id: 40
- url: https://peraichi.com/landing_pages/view/coderdojo
+ url: https://kikakusouken.co.jp/coderdojo/
logo: "/img/dojos/momochi.webp"
description: çŠå²¡åžæ©è¯åºçŸéã§æ¯æéå¬
tags:
@@ -4024,7 +4037,7 @@
prefecture_id: 45
url: https://lmlab.net/coderdojo/
logo: "/img/dojos/miyazaki.webp"
- description: è¥¿èŒæµé¡ã§æ¯æéå¬
+ description: å®®åŽåžã§éæéå¬
tags:
- Scratch
- IchigoJam
diff --git a/db/news.yml b/db/news.yml
index e1bd26725..3990312c7 100644
--- a/db/news.yml
+++ b/db/news.yml
@@ -1,46 +1,590 @@
---
-news:
-- id: 11
+- id: 147
+ url: https://news.coderdojo.jp/2025/11/02/dojoletter-vol-90-2025%e5%b9%b409%e6%9c%88%e5%8f%b7/
+ title: DojoLetter Vol.90 2025幎09æå·
+ published_at: '2025-11-02T22:10:18+09:00'
+- id: 146
+ url: https://prtimes.jp/main/html/rd/p/000000016.000038935.html
+ title: CoderDojo ã®ãªãŒãã³ããŒã¿ããããžã¿ã«åºãæšé²ããå°åã® Well-Being ææšã®ããžã¿ã«çæŽ»ææ°ã«æ¡çš
+ published_at: '2025-10-24T20:00:07+09:00'
+- id: 145
+ url: https://news.coderdojo.jp/2025/10/04/dojoletter-vol-89-2025%e5%b9%b408%e6%9c%88%e5%8f%b7/
+ title: DojoLetter Vol.89 2025幎08æå·
+ published_at: '2025-10-04T22:20:16+09:00'
+- id: 144
+ url: https://news.coderdojo.jp/2025/09/10/dojoletter-vol-88-2025%e5%b9%b407%e6%9c%88%e5%8f%b7/
+ title: DojoLetter Vol.88 2025幎07æå·
+ published_at: '2025-09-10T12:45:56+09:00'
+- id: 143
+ url: https://prtimes.jp/main/html/rd/p/000000017.000038935.html
+ title: æ¥æ¬åå°ã« 200 以äžïŒå
šåœã® CoderDojo é¢ä¿è
ãéãŸãã«ã³ãã¡ã¬ã³ã¹ãDojoCon Japan 2025ããã10æ25æ¥ (åæ)
+ ã«çŠå²¡çä¹
çç±³åžã§éå¬
+ published_at: '2025-09-02T17:30:01+09:00'
+- id: 142
url: https://news.coderdojo.jp/2025/08/12/dojoletter-vol-87-2025%e5%b9%b406%e6%9c%88%e5%8f%b7/
title: DojoLetter Vol.87 2025幎06æå·
- published_at: Tue, 12 Aug 2025 04:00:02 +0000
-- id: 10
+ published_at: '2025-08-12T13:00:02+09:00'
+- id: 141
url: https://news.coderdojo.jp/2025/07/14/233-laptops-to-coderdojo/
title: ç±³åœç³» IT äŒæ¥ãã CoderDojo ãžã233 å°ã®ããŒã PC å¯èŽ
- published_at: Mon, 14 Jul 2025 05:50:31 +0000
-- id: 9
+ published_at: '2025-07-14T14:50:31+09:00'
+- id: 140
url: https://news.coderdojo.jp/2025/07/10/dojoletter-vol-86-2025%e5%b9%b405%e6%9c%88%e5%8f%b7/
title: DojoLetter Vol.86 2025幎05æå·
- published_at: Thu, 10 Jul 2025 04:00:07 +0000
-- id: 8
+ published_at: '2025-07-10T13:00:07+09:00'
+- id: 139
url: https://news.coderdojo.jp/2025/06/10/dojoletter-vol-85-2025%e5%b9%b404%e6%9c%88%e5%8f%b7/
title: DojoLetter Vol.85 2025幎04æå·
- published_at: Tue, 10 Jun 2025 03:30:18 +0000
-- id: 7
+ published_at: '2025-06-10T12:30:18+09:00'
+- id: 138
url: https://news.coderdojo.jp/2025/05/12/dojoletter-vol-84-2025%e5%b9%b403%e6%9c%88%e5%8f%b7/
title: DojoLetter Vol.84 2025幎03æå·
- published_at: Mon, 12 May 2025 04:00:33 +0000
-- id: 6
+ published_at: '2025-05-12T13:00:33+09:00'
+- id: 137
url: https://news.coderdojo.jp/2025/04/10/dojoletter-vol-83-2025%e5%b9%b402%e6%9c%88%e5%8f%b7/
title: DojoLetter Vol.83 2025幎02æå·
- published_at: Thu, 10 Apr 2025 03:45:27 +0000
-- id: 5
+ published_at: '2025-04-10T12:45:27+09:00'
+- id: 136
url: https://news.coderdojo.jp/2025/04/04/55-laptops-to-coderdojo/
title: ç±³åœç³» IT äŒæ¥ãã CoderDojo ãžã55 å°ã®ããŒã PC å¯èŽ
- published_at: Fri, 04 Apr 2025 10:00:32 +0000
-- id: 4
+ published_at: '2025-04-04T19:00:32+09:00'
+- id: 135
url: https://news.coderdojo.jp/2025/03/10/dojoletter-vol-82-2025%e5%b9%b401%e6%9c%88%e5%8f%b7/
title: DojoLetter Vol.82 2025幎01æå·
- published_at: Mon, 10 Mar 2025 04:00:33 +0000
-- id: 3
+ published_at: '2025-03-10T13:00:33+09:00'
+- id: 134
url: https://news.coderdojo.jp/2025/02/14/coderdojo-de-nyaicecode/
title: "\U0001F3B2 ãã€ã¹Ãããã°ã©ãã³ã°ããã£ã€ã¹ïŒã³ãŒããããCoderDojo ã«75å°å¯èŽ"
- published_at: Fri, 14 Feb 2025 08:24:07 +0000
-- id: 2
+ published_at: '2025-02-14T17:24:07+09:00'
+- id: 133
url: https://news.coderdojo.jp/2025/02/10/dojoletter-vol-80-2024%e5%b9%b412%e6%9c%88%e5%8f%b7/
title: DojoLetter Vol.80 2024幎12æå·
- published_at: Mon, 10 Feb 2025 04:00:55 +0000
-- id: 1
+ published_at: '2025-02-10T13:00:55+09:00'
+- id: 132
url: https://news.coderdojo.jp/2025/01/14/dojoletter-vol-79-2024%e5%b9%b411%e6%9c%88%e5%8f%b7/
title: DojoLetter Vol.79 2024幎11æå·
- published_at: Tue, 14 Jan 2025 03:30:45 +0000
+ published_at: '2025-01-14T12:30:45+09:00'
+- id: 131
+ url: https://news.coderdojo.jp/2024/12/25/box-japan-to-coderdojo/
+ title: "\U0001F384128å°ã®ããŒã PC å¯èŽãBox Japan ãã CoderDojo ãž \U0001F381"
+ published_at: '2024-12-25T20:00:40+09:00'
+- id: 130
+ url: https://prtimes.jp/main/html/rd/p/000000014.000038935.html
+ title: Box Japan ããã®æ¯æŽãåããå
šåœã® CoderDojo ãž 128 å°ã®ããŒã PC å¯èŽ
+ published_at: '2024-12-25T20:00:31+09:00'
+- id: 129
+ url: https://news.coderdojo.jp/2024/12/10/dojoletter-vol-78-2024%e5%b9%b410%e6%9c%88%e5%8f%b7/
+ title: DojoLetter Vol.78 2024幎10æå·
+ published_at: '2024-12-10T13:00:06+09:00'
+- id: 128
+ url: https://news.coderdojo.jp/2024/11/11/dojoletter-vol-77-2024%e5%b9%b409%e6%9c%88%e5%8f%b7/
+ title: DojoLetter Vol.77 2024幎09æå·
+ published_at: '2024-11-11T13:00:36+09:00'
+- id: 127
+ url: https://news.coderdojo.jp/2024/10/10/dojoletter-vol-77-2024%e5%b9%b408%e6%9c%88%e5%8f%b7/
+ title: DojoLetter Vol.77 2024幎08æå·
+ published_at: '2024-10-10T12:00:46+09:00'
+- id: 126
+ url: https://news.coderdojo.jp/2024/09/10/dojoletter-vol-76-2024%e5%b9%b407%e6%9c%88%e5%8f%b7/
+ title: DojoLetter Vol.76 2024幎07æå·
+ published_at: '2024-09-10T12:30:21+09:00'
+- id: 125
+ url: https://news.coderdojo.jp/2024/08/13/dojoletter-vol-75-2024-06/
+ title: DojoLetter Vol.75 2024幎06æå·
+ published_at: '2024-08-13T13:00:47+09:00'
+- id: 124
+ url: https://news.coderdojo.jp/2024/07/29/learn-ai-programming-with-scratch-2e/
+ title: "ãScratchã§ã¯ãããæ©æ¢°åŠç¿ 第2çãå¯èŽ"
+ published_at: '2024-07-29T08:43:42+09:00'
+- id: 123
+ url: https://news.coderdojo.jp/2024/07/10/dojoletter-vol-74-2024%e5%b9%b405%e6%9c%88%e5%8f%b7/
+ title: DojoLetter Vol.74 2024幎05æå·
+ published_at: '2024-07-10T12:00:28+09:00'
+- id: 122
+ url: https://news.coderdojo.jp/2024/06/10/dojoletter-vol-73-2024%e5%b9%b404%e6%9c%88%e5%8f%b7/
+ title: DojoLetter Vol.73 2024幎04æå·
+ published_at: '2024-06-10T13:00:51+09:00'
+- id: 121
+ url: https://news.coderdojo.jp/2024/05/10/dojoletter-vol-72-2024%e5%b9%b43%e6%9c%88%e5%8f%b7/
+ title: DojoLetter Vol.72 2024幎3æå·
+ published_at: '2024-05-10T12:30:21+09:00'
+- id: 120
+ url: https://news.coderdojo.jp/2024/04/10/dojoletter-vol-71-2024%e5%b9%b42%e6%9c%88%e5%8f%b7/
+ title: DojoLetter Vol.71 2024幎2æå·
+ published_at: '2024-04-10T12:30:41+09:00'
+- id: 119
+ url: https://news.coderdojo.jp/2024/03/29/from-yukai-engineering-to-coderdojo/
+ title: ãŠã«ã€å·¥åŠãã CoderDojo ãžãåŠãã§éã¹ããããã¯ãããããŠãŽã¯ãããã¯ããïŒïŒå°å¯èŽ
+ published_at: '2024-03-29T12:52:53+09:00'
+- id: 118
+ url: https://news.coderdojo.jp/2024/03/10/dojoletter-vol-70/
+ title: DojoLetter Vol.70 2024幎1æå·
+ published_at: '2024-03-10T12:00:54+09:00'
+- id: 117
+ url: https://prtimes.jp/main/html/rd/p/000000012.000038935.html
+ title: åœéçãªéå¶å©æŽ»åãCoderDojoãã®å
±åçºèµ·äººãæ¥æ¥ãé«ç°éŠ¬å Žã§ããŒã¯ã€ãã³ãéå¬
+ published_at: '2024-02-29T15:00:02+09:00'
+- id: 116
+ url: https://news.coderdojo.jp/2024/02/11/dojoletter-vol-69-2023%e5%b9%b412%e6%9c%88%e5%8f%b7/
+ title: DojoLetter Vol.69 2023幎12æå·
+ published_at: '2024-02-11T12:00:13+09:00'
+- id: 115
+ url: https://news.coderdojo.jp/2024/01/10/dojoletter-vol-68-2023%e5%b9%b411%e6%9c%88%e5%8f%b7/
+ title: DojoLetter Vol.68 2023幎11æå·
+ published_at: '2024-01-10T12:30:47+09:00'
+- id: 114
+ url: https://news.coderdojo.jp/2023/12/11/dojoletter-vol-67-2023%e5%b9%b410%e6%9c%88%e5%8f%b7/
+ title: DojoLetter Vol.67 2023幎10æå·
+ published_at: '2023-12-11T13:00:16+09:00'
+- id: 113
+ url: https://news.coderdojo.jp/2023/11/10/dojoletter-vol-66-2023%e5%b9%b49%e6%9c%88%e5%8f%b7/
+ title: DojoLetter Vol.66 2023幎9æå·
+ published_at: '2023-11-10T13:00:17+09:00'
+- id: 112
+ url: https://news.coderdojo.jp/2023/10/10/dojoletter-vol-65-2023%e5%b9%b408%e6%9c%88%e5%8f%b7/
+ title: DojoLetter Vol.65 2023幎08æå·
+ published_at: '2023-10-10T12:30:30+09:00'
+- id: 111
+ url: https://news.coderdojo.jp/2023/09/11/dojoletter-vol-64-2023%e5%b9%b407%e6%9c%88%e5%8f%b7/
+ title: DojoLetter Vol.64 2023幎07æå·
+ published_at: '2023-09-11T12:30:05+09:00'
+- id: 110
+ url: https://news.coderdojo.jp/2023/08/30/tfabworks-takoratch/
+ title: TFabWorks ãšé£æºããå
šåœã® CoderDojo ã察象ãšãã Scratch çšã³ã³ãããŒã©ãŒãTakoratchãã®ç¡åã¬ã³ã¿ã«ããã°ã©ã ãã¹ã¿ãŒã
+ published_at: '2023-08-30T12:10:40+09:00'
+- id: 109
+ url: https://prtimes.jp/main/html/rd/p/000000011.000038935.html
+ title: TFabWorks ãšé£æºããå
šåœã® CoderDojo ã察象ãšãã Scratch çšã³ã³ãããŒã©ãŒãTakoratchãã®ç¡åã¬ã³ã¿ã«ããã°ã©ã ãã¹ã¿ãŒã
+ published_at: '2023-08-30T12:10:01+09:00'
+- id: 108
+ url: https://news.coderdojo.jp/2023/08/10/dojoletter-vol-63-2023%e5%b9%b406%e6%9c%88%e5%8f%b7/
+ title: DojoLetter Vol.63 2023幎06æå·
+ published_at: '2023-08-10T12:00:59+09:00'
+- id: 107
+ url: https://news.coderdojo.jp/2023/07/10/dojoletter-vol-62-2023%e5%b9%b405%e6%9c%88%e5%8f%b7/
+ title: DojoLetter Vol.62 2023幎05æå·
+ published_at: '2023-07-10T13:00:32+09:00'
+- id: 106
+ url: https://prtimes.jp/main/html/rd/p/000000010.000038935.html
+ title: åœå
ã® CoderDojo é¢ä¿è
ãéãŸããDojoCon Japan 2023 âBe Coolâãã2023幎8æ27æ¥ïŒæ¥æïŒã«å¥è¯ã§éå¬
+ published_at: '2023-06-22T10:00:03+09:00'
+- id: 105
+ url: https://news.coderdojo.jp/2023/06/19/dojoletter-vol-61-2023%e5%b9%b404%e6%9c%88%e5%8f%b7/
+ title: DojoLetter Vol.61 2023幎04æå·
+ published_at: '2023-06-19T12:30:44+09:00'
+- id: 104
+ url: https://news.coderdojo.jp/2023/05/28/donation-to-coderdojo-community/
+ title: "ãæé»äžç! ã¬ãžã§ããåè§£ã®ã¹ã¹ã¡ HYPERãããŠãŠãšéæ³ã®ããã°ã©ãã³ã°ã»ããŒããã3Dããªã³ã¿ãŒãå¯èŽ"
+ published_at: '2023-05-28T15:27:33+09:00'
+- id: 103
+ url: https://news.coderdojo.jp/2023/05/10/dojoletter-vol-60-2023%e5%b9%b403%e6%9c%88%e5%8f%b7/
+ title: DojoLetter Vol.60 2023幎03æå·
+ published_at: '2023-05-10T12:30:54+09:00'
+- id: 102
+ url: https://news.coderdojo.jp/2023/04/10/dojoletter-vol-59-2023%e5%b9%b42%e6%9c%88%e5%8f%b7/
+ title: DojoLetter Vol.59 2023幎2æå·
+ published_at: '2023-04-10T12:30:14+09:00'
+- id: 101
+ url: https://news.coderdojo.jp/2023/04/06/sponsored-by-prtimes/
+ title: PR TIMES ã CoderDojo Japan åè³äŒæ¥ã®ïŒç€Ÿã«å ãããŸãã
+ published_at: '2023-04-06T21:24:15+09:00'
+- id: 100
+ url: https://news.coderdojo.jp/2023/03/10/dojoletter-vol-58-2023%e5%b9%b41%e6%9c%88%e5%8f%b7/
+ title: DojoLetter Vol.58 2023幎1æå·
+ published_at: '2023-03-10T12:30:04+09:00'
+- id: 99
+ url: https://news.coderdojo.jp/2023/02/10/dojoletter-vol-57-2022%e5%b9%b412%e6%9c%88%e5%8f%b7/
+ title: DojoLetter Vol.57 2022幎12æå·
+ published_at: '2023-02-10T12:00:02+09:00'
+- id: 98
+ url: https://news.coderdojo.jp/2023/01/10/dojoletter-vol-56-2022%e5%b9%b411%e6%9c%88%e5%8f%b7/
+ title: DojoLetter Vol.56 2022幎11æå·
+ published_at: '2023-01-10T12:00:39+09:00'
+- id: 97
+ url: https://news.coderdojo.jp/2023/01/06/dojoletter-vol-55-2022%e5%b9%b410%e6%9c%88%e5%8f%b7/
+ title: DojoLetter Vol.55 2022幎10æå·
+ published_at: '2023-01-06T22:14:25+09:00'
+- id: 96
+ url: https://news.coderdojo.jp/2023/01/01/partnership-with-mitsue-links/
+ title: ãããšãŒãªã³ã¯ã¹ãããŒãããŒæ³äººãšã㊠CoderDojo Japan ãæ¯æŽ
+ published_at: '2023-01-01T11:00:59+09:00'
+- id: 95
+ url: https://news.coderdojo.jp/2022/12/03/docker-sponsored-open-source-program/
+ title: Docker-Sponsored Open Source ããã°ã©ã ã®å¯Ÿè±¡ãšãªããŸãã
+ published_at: '2022-12-03T15:45:33+09:00'
+- id: 94
+ url: https://prtimes.jp/main/html/rd/p/000000008.000038935.html
+ title: Geolonia ã®æ¯æŽãåŸãŠãå
šåœã® CoderDojo ãå°å³ããæ¢ãããDojoMapããéçº
+ published_at: '2022-12-01T13:59:22+09:00'
+- id: 93
+ url: https://news.coderdojo.jp/2022/12/01/dojomap-and-geolonia/
+ title: Geolonia ã®æ¯æŽãåŸãŠãå°å³ããæ¢ãããDojoMapããéçº
+ published_at: '2022-12-01T09:30:33+09:00'
+- id: 92
+ url: https://news.coderdojo.jp/2022/11/10/dojoletter-vol-54-2022%e5%b9%b409%e6%9c%88%e5%8f%b7/
+ title: DojoLetter Vol.54 2022幎09æå·
+ published_at: '2022-11-10T12:30:29+09:00'
+- id: 91
+ url: https://news.coderdojo.jp/2022/10/11/dojoletter-vol-53-2022%e5%b9%b408%e6%9c%88%e5%8f%b7/
+ title: DojoLetter Vol.53 2022幎08æå·
+ published_at: '2022-10-11T12:00:59+09:00'
+- id: 90
+ url: https://news.coderdojo.jp/2022/09/12/dojoletter-vol-52-2022%e5%b9%b407%e6%9c%88%e5%8f%b7/
+ title: DojoLetter Vol.52 2022幎07æå·
+ published_at: '2022-09-12T11:45:31+09:00'
+- id: 89
+ url: https://news.coderdojo.jp/2022/08/10/dojoletter-vol-51-2022%e5%b9%b406%e6%9c%88%e5%8f%b7/
+ title: DojoLetter Vol.51 2022幎06æå·
+ published_at: '2022-08-10T12:00:50+09:00'
+- id: 88
+ url: https://news.coderdojo.jp/2022/07/22/play-and-learn-machine-learning-with-scratch/
+ title: æžç±ãScratchã§ããã¶æ©æ¢°åŠç¿ããïŒåå¯èŽãããŸãã
+ published_at: '2022-07-22T21:58:39+09:00'
+- id: 87
+ url: https://news.coderdojo.jp/2022/07/12/donation-from-box-to-coderdojo/
+ title: 15å°ã® MacBook Air å¯èŽãBox Japan ãã CoderDojo ãž
+ published_at: '2022-07-12T16:00:21+09:00'
+- id: 86
+ url: https://news.coderdojo.jp/2022/07/12/dojoletter-vol-50-2022%e5%b9%b405%e6%9c%88%e5%8f%b7/
+ title: DojoLetter Vol.50 2022幎05æå·
+ published_at: '2022-07-12T12:00:06+09:00'
+- id: 85
+ url: https://news.coderdojo.jp/2022/06/10/dojoletter-vol-49-2022%e5%b9%b404%e6%9c%88%e5%8f%b7/
+ title: DojoLetter Vol.49 2022幎04æå·
+ published_at: '2022-06-10T13:00:35+09:00'
+- id: 84
+ url: https://news.coderdojo.jp/2022/05/31/partnership-with-minecraftcup/
+ title: Minecraftã«ããå
šåœå€§äŒãšé£æºããCoderDojoåãæè²çãã€ã³ã¯ã©ããã®ã©ã€ã»ã³ã¹è²žãåºãããã°ã©ã ãéå§
+ published_at: '2022-05-31T17:50:18+09:00'
+- id: 83
+ url: https://news.coderdojo.jp/2022/05/16/1500-microbits-to-coderdojo/
+ title: ãã±ãããµã€ãºã®æè²çšã³ã³ãã¥ãŒã¿ãŒãmicro:bitããCoderDojo ã« 1500 å°å¯èŽ
+ published_at: '2022-05-16T17:00:18+09:00'
+- id: 82
+ url: https://prtimes.jp/main/html/rd/p/000000007.000038935.html
+ title: ãã±ãããµã€ãºã®æè²çšã³ã³ãã¥ãŒã¿ãŒãmicro:bitããCoderDojo ã« 1500 å°å¯èŽ
+ published_at: '2022-05-16T17:00:03+09:00'
+- id: 81
+ url: https://news.coderdojo.jp/2022/05/10/dojoletter-vol-48-2022%e5%b9%b43%e6%9c%88%e5%8f%b7/
+ title: DojoLetter Vol.48 2022幎3æå·
+ published_at: '2022-05-10T13:00:51+09:00'
+- id: 80
+ url: https://news.coderdojo.jp/2022/05/04/people-powered/
+ title: "ãé ããžè¡ããããã°ãã¿ããªã§è¡ãããå¯èŽãããŸãã"
+ published_at: '2022-05-04T12:20:07+09:00'
+- id: 79
+ url: https://news.coderdojo.jp/2022/04/10/dojoletter-vol-47-2022%e5%b9%b42%e6%9c%88%e5%8f%b7/
+ title: DojoLetter Vol.47 2022幎2æå·
+ published_at: '2022-04-10T13:00:57+09:00'
+- id: 78
+ url: https://prtimes.jp/main/html/rd/p/000000005.000038935.html
+ title: çºå£²3åšå¹Žã®ãããããã€ãtoioããCoderDojo åãã¬ã³ã¿ã«ããã°ã©ã éå§
+ published_at: '2022-03-18T10:00:20+09:00'
+- id: 77
+ url: https://news.coderdojo.jp/2022/03/17/toio-sony-interactive-entertainment/
+ title: çºå£²3åšå¹Žããããããããããã€ãtoioãã® CoderDojo åãã¬ã³ã¿ã«ããã°ã©ã éå§
+ published_at: '2022-03-17T18:10:01+09:00'
+- id: 76
+ url: https://news.coderdojo.jp/2022/03/10/dojoletter-vol-46-2022%e5%b9%b41%e6%9c%88%e5%8f%b7/
+ title: DojoLetter Vol.46 2022幎1æå·
+ published_at: '2022-03-10T12:00:04+09:00'
+- id: 75
+ url: https://news.coderdojo.jp/2022/02/10/dojoletter-vol-45/
+ title: DojoLetter Vol.45 2021幎12æå·
+ published_at: '2022-02-10T12:30:19+09:00'
+- id: 74
+ url: https://news.coderdojo.jp/2022/01/11/dojoletter-vol-44/
+ title: DojoLetter Vol.44 2021幎11æå·
+ published_at: '2022-01-11T12:30:12+09:00'
+- id: 73
+ url: https://news.coderdojo.jp/2021/12/27/diver-learnings-for-coderdojo/
+ title: RubyãPythonãæ©æ¢°åŠç¿ãªã©ãåŠã¹ããDIVER Learningsããå
šåœã® CoderDojo ã§å©çšå¯èœã«
+ published_at: '2021-12-27T11:00:01+09:00'
+- id: 72
+ url: https://news.coderdojo.jp/2021/12/10/dojoletter-vol-43/
+ title: DojoLetter Vol.43 2021幎10æå·
+ published_at: '2021-12-10T12:30:37+09:00'
+- id: 71
+ url: https://news.coderdojo.jp/2021/11/10/dojoletter-vol-42/
+ title: DojoLetter Vol.42 2021幎09æå·
+ published_at: '2021-11-10T12:30:45+09:00'
+- id: 70
+ url: https://news.coderdojo.jp/2021/10/11/dojoletter-vol-41/
+ title: DojoLetter Vol.41 2021幎08æå·
+ published_at: '2021-10-11T12:45:39+09:00'
+- id: 69
+ url: https://news.coderdojo.jp/2021/09/10/dojoletter-vol-40/
+ title: DojoLetter Vol.40 2021幎07æå·
+ published_at: '2021-09-10T12:45:52+09:00'
+- id: 68
+ url: https://news.coderdojo.jp/2021/08/25/art-and-science-with-scratch/
+ title: Scratchã§æ¥œããåŠã¶ã¢ãŒã&ãµã€ãšã³ã¹ãå¯èŽãããŸãã
+ published_at: '2021-08-25T21:10:59+09:00'
+- id: 67
+ url: https://news.coderdojo.jp/2021/08/10/dojoletter-vol-39/
+ title: DojoLetter Vol.39 2021幎06æå·
+ published_at: '2021-08-10T12:30:52+09:00'
+- id: 66
+ url: https://news.coderdojo.jp/2021/08/01/pokemon-workshop-at-school/
+ title: åºåŒµãã±ã¢ã³ã¯ãŒã¯ã·ã§ããäºäŸã®å
¬é @ 倧接ã¶äžç¬¬äžå°åŠæ ¡
+ published_at: '2021-08-01T00:00:31+09:00'
+- id: 65
+ url: https://news.coderdojo.jp/2021/07/29/robot-programming-kits-from-jci/
+ title: æ¥æ¬é幎äŒè°æãã CoderDojo ãžã20å°ã®ããããããã°ã©ãã³ã°ãããå¯èŽ
+ published_at: '2021-07-29T15:49:16+09:00'
+- id: 64
+ url: https://news.coderdojo.jp/2021/07/12/dojoletter-vol-38-2021%e5%b9%b405%e6%9c%88%e5%8f%b7/
+ title: DojoLetter Vol.38 2021幎05æå·
+ published_at: '2021-07-12T12:30:34+09:00'
+- id: 63
+ url: https://news.coderdojo.jp/2021/06/30/1080-presents-from-google-to-coderdojo/
+ title: å
šåœã® CoderDojo ãžãGoogle ãã Scratch æžç±ãš AI ããã°ã©ãã³ã°ååã 1080 éšå¯èŽ
+ published_at: '2021-06-30T17:34:10+09:00'
+- id: 62
+ url: https://news.coderdojo.jp/2021/06/10/dojoletter-vol-37/
+ title: DojoLetter Vol.37 2021幎4æå·
+ published_at: '2021-06-10T12:30:33+09:00'
+- id: 61
+ url: https://news.coderdojo.jp/2021/06/10/girls-initiative-for-coderdojo-in-2021/
+ title: Google ã®æ¯æŽãåããGirls Initiative for CoderDojo ã2021幎ãéå¬
+ published_at: '2021-06-10T08:30:03+09:00'
+- id: 60
+ url: https://news.coderdojo.jp/2021/05/10/dojoletter-vol-36/
+ title: DojoLetter Vol.36 2021幎3æå·
+ published_at: '2021-05-10T12:30:31+09:00'
+- id: 59
+ url: https://news.coderdojo.jp/2021/04/28/dobot-rental-program/
+ title: GRIPSãããã°ã©ãã³ã°åŠç¿ã«æé©ãªæè²çšããããã¢ãŒã ã»Dobot Magician LiteãCoderDojoåãã«æäŸ
+ published_at: '2021-04-28T15:00:24+09:00'
+- id: 58
+ url: https://news.coderdojo.jp/2021/04/23/programming-with-pokemon/
+ title: ããã°ã©ãã³ã°ã§ãã±ã¢ã³ãåããã¯ãŒã¯ã·ã§ããããå
šåœã®CoderDojoã§å®æœå¯èœã«ã
+ published_at: '2021-04-23T14:00:28+09:00'
+- id: 57
+ url: https://prtimes.jp/main/html/rd/p/000000003.000038935.html
+ title: ããã°ã©ãã³ã°ã§ãã±ã¢ã³ãåããã¯ãŒã¯ã·ã§ããããå
šåœã®CoderDojoã§å®æœå¯èœã«ã
+ published_at: '2021-04-23T14:00:05+09:00'
+- id: 56
+ url: https://news.coderdojo.jp/2021/04/12/dojoletter-vol-35/
+ title: DojoLetter Vol.35 2021幎2æå·
+ published_at: '2021-04-12T12:00:13+09:00'
+- id: 55
+ url: https://news.coderdojo.jp/2021/03/10/dojoletter-vol-34/
+ title: DojoLetter Vol.34 2021幎1æå·
+ published_at: '2021-03-10T12:00:21+09:00'
+- id: 54
+ url: https://news.coderdojo.jp/2021/02/10/dojoletter-vol-33/
+ title: DojoLetter Vol.33 2020幎12æå·
+ published_at: '2021-02-10T12:00:28+09:00'
+- id: 53
+ url: https://news.coderdojo.jp/2021/01/10/dojoletter-vol-32/
+ title: DojoLetter Vol.32 2020幎11æå·
+ published_at: '2021-01-10T12:00:07+09:00'
+- id: 52
+ url: https://news.coderdojo.jp/2020/12/10/dojoletter-vol-31/
+ title: DojoLetter Vol.31 2020幎10æå·
+ published_at: '2020-12-10T00:00:36+09:00'
+- id: 51
+ url: https://news.coderdojo.jp/2020/11/26/tfabworks-microbit-rental-program/
+ title: TFabWorksãmicro:bit ãšåšèŸºæ©åšã®ç¡åã¬ã³ã¿ã«ããã°ã©ã ãå
šåœã® CoderDojo åãã«æäŸ
+ published_at: '2020-11-26T14:00:29+09:00'
+- id: 50
+ url: https://prtimes.jp/main/html/rd/p/000000002.000038935.html
+ title: TFabWorksãšé£æºããmicro:bitãªã©ã®ç¡åã¬ã³ã¿ã«ããã°ã©ã ãå
šåœã®CoderDojoåãã«æäŸ
+ published_at: '2020-11-26T14:00:06+09:00'
+- id: 49
+ url: https://news.coderdojo.jp/2020/11/10/dojoletter-vol-30/
+ title: DojoLetter Vol.30 2020幎9æå·
+ published_at: '2020-11-10T13:00:30+09:00'
+- id: 48
+ url: https://news.coderdojo.jp/2020/10/10/dojoletter-vol-29/
+ title: DojoLetter Vol.29 2020幎8æå·
+ published_at: '2020-10-10T13:00:14+09:00'
+- id: 47
+ url: https://news.coderdojo.jp/2020/09/10/dojoletter-vol-28/
+ title: DojoLetter Vol.28 2020幎7æå·
+ published_at: '2020-09-10T13:00:33+09:00'
+- id: 46
+ url: https://news.coderdojo.jp/2020/08/10/dojoletter-vol-27/
+ title: DojoLetter Vol.27 2020幎6æå·
+ published_at: '2020-08-10T00:00:51+09:00'
+- id: 45
+ url: https://news.coderdojo.jp/2020/08/07/additional-sessions-for-coderdojo/
+ title: 远å åéïŒGirls Initiative for CoderDojo ãã£ã³ããŒã³ã® Mind the Gap ã»ãã·ã§ã³è¿œå 宿œ
+ published_at: '2020-08-07T14:57:57+09:00'
+- id: 44
+ url: https://news.coderdojo.jp/2020/07/31/tokyo-volunteer-portal-with-coderdojo/
+ title: æ±äº¬éœãéå¶ãããã©ã³ãã£ã¢ããŒã¿ã«ã§ CoderDojo ã®äºäŸãéžåº
+ published_at: '2020-07-31T14:30:49+09:00'
+- id: 43
+ url: https://news.coderdojo.jp/2020/07/19/scratch-books-for-coderdojo/
+ title: ã²ãŒã ãæ©æ¢°åŠç¿ã® Scratch æžç±ãå
šåœã® CoderDojo åãã«å¯èŽ
+ published_at: '2020-07-19T16:10:07+09:00'
+- id: 42
+ url: https://news.coderdojo.jp/2020/07/13/girls-initiative-for-coderdojo/
+ title: Google ã®æ¯æŽãåããã¹ã€ãããšãã¥ã±ãŒã·ã§ã³ãšå
±åã§ Girls Initiative for CoderDojo ãã£ã³ããŒã³ãéå§
+ published_at: '2020-07-13T14:00:56+09:00'
+- id: 41
+ url: https://news.coderdojo.jp/2020/07/10/dojoletter-vol-26/
+ title: DojoLetter Vol.26 2020幎5æå·
+ published_at: '2020-07-10T13:00:06+09:00'
+- id: 40
+ url: https://news.coderdojo.jp/2020/07/03/from-yukai-engineering-to-young-people/
+ title: ãŠã«ã€å·¥åŠãã CoderDojo ãžããããããããïŒïŒå°å¯èŽ
+ published_at: '2020-07-03T15:18:01+09:00'
+- id: 39
+ url: https://news.coderdojo.jp/2020/06/10/dojoletter-vol-25/
+ title: DojoLetter Vol.25 2020幎4æå·
+ published_at: '2020-06-10T12:00:37+09:00'
+- id: 38
+ url: https://news.coderdojo.jp/2020/05/18/support-online-sessions/
+ title: CoderDojo ãªã³ã©ã€ã³éå¬ã®æ¯æŽã«ã€ããŠ
+ published_at: '2020-05-18T12:05:49+09:00'
+- id: 37
+ url: https://news.coderdojo.jp/2020/05/11/dojoletter-vol-24/
+ title: DojoLetter Vol.24 2020幎3æå·
+ published_at: '2020-05-11T12:00:50+09:00'
+- id: 36
+ url: https://news.coderdojo.jp/2020/04/10/dojoletter-vol-23/
+ title: DojoLetter Vol.23 2020幎2æå·
+ published_at: '2020-04-10T13:00:41+09:00'
+- id: 35
+ url: https://news.coderdojo.jp/2020/04/06/hackforplay-for-team/
+ title: HackforPlay ã®æ³äººåãæ°ãµãŒãã¹ãå
šåœã® CoderDojo åãã«ç¡åæäŸ
+ published_at: '2020-04-06T12:00:38+09:00'
+- id: 34
+ url: https://news.coderdojo.jp/2020/03/25/200-servers-provided-by-sakura-internet/
+ title: ãããã€ã³ã¿ãŒããããåã©ãåãããã°ã©ãã³ã°éå ŽãCoderDojoãã«ãµãŒããŒ100å°ãè¿œå æ¯æŽ ïœãããã®ã¯ã©ãŠãèš200å°ãç¡ææäŸïœ
+ published_at: '2020-03-25T11:00:07+09:00'
+- id: 33
+ url: https://news.coderdojo.jp/2020/03/10/dojoletter-vol-21/
+ title: DojoLetter Vol.21 2020幎1æå·
+ published_at: '2020-03-10T13:00:51+09:00'
+- id: 32
+ url: https://news.coderdojo.jp/2020/02/10/dojoletter-vol-20-2019%e5%b9%b412%e6%9c%88%e5%8f%b7/
+ title: DojoLetter Vol.20 2019幎12æå·
+ published_at: '2020-02-10T00:00:30+09:00'
+- id: 31
+ url: https://news.coderdojo.jp/2020/01/10/dojoletter-vol-20/
+ title: DojoLetter Vol.20 2019幎11æå·
+ published_at: '2020-01-10T13:00:55+09:00'
+- id: 30
+ url: https://news.coderdojo.jp/2019/12/21/wro-japan-and-coderdojo-japan/
+ title: ããã³ã³ã® WRO Japan ãšææºããå
šåœã® CoderDojo ãžããããããããæäŸ
+ published_at: '2019-12-21T08:21:42+09:00'
+- id: 29
+ url: https://news.coderdojo.jp/2019/12/10/dojoletter-vol-19/
+ title: DojoLetter Vol.19 2019幎10æå·
+ published_at: '2019-12-10T13:00:24+09:00'
+- id: 28
+ url: https://news.coderdojo.jp/2019/11/13/google-and-coderdojo-join-forces-in-japan/
+ title: Google ã CoderDojo Japan ã®ããŒãããŒæ³äººã«
+ published_at: '2019-11-13T19:50:02+09:00'
+- id: 27
+ url: https://news.coderdojo.jp/2019/11/10/dojoletter-vol-18/
+ title: DojoLetter Vol.18 2019幎09æå·
+ published_at: '2019-11-10T00:00:39+09:00'
+- id: 26
+ url: https://news.coderdojo.jp/2019/10/10/dojoletter-vol-17-2019%e5%b9%b408%e6%9c%88%e5%8f%b7/
+ title: DojoLetter Vol.17 2019幎08æå·
+ published_at: '2019-10-10T12:00:38+09:00'
+- id: 25
+ url: https://news.coderdojo.jp/2019/09/10/dojoletter-vol-16/
+ title: DojoLetter Vol.16 2019幎07æå·
+ published_at: '2019-09-10T12:00:37+09:00'
+- id: 24
+ url: https://news.coderdojo.jp/2019/08/29/github-for-nonprofit/
+ title: GitHub for Nonprofit ããã°ã©ã ã®å¯Ÿè±¡ã«ãªããŸãã
+ published_at: '2019-08-29T14:07:33+09:00'
+- id: 23
+ url: https://news.coderdojo.jp/2019/08/05/dojoletter-vol-15-2019%e5%b9%b46%e6%9c%88%e5%8f%b7/
+ title: DojoLetter Vol.15 2019幎6æå·
+ published_at: '2019-08-05T22:59:10+09:00'
+- id: 22
+ url: https://news.coderdojo.jp/2019/07/30/play-and-learn-with-programming-contest/
+ title: ããã°ã©ãã³ã°åé¡ãè§£ããŠåŠã¶ TOPSICãå
šåœã® CoderDojo ãžç¡åæäŸ
+ published_at: '2019-07-30T15:30:06+09:00'
+- id: 21
+ url: https://news.coderdojo.jp/2019/07/10/dojoletter-vol-14/
+ title: DojoLetter Vol.14 2019幎5æå·
+ published_at: '2019-07-10T12:00:16+09:00'
+- id: 20
+ url: https://news.coderdojo.jp/2019/06/10/dojoletter-vol-13/
+ title: DojoLetter Vol.13 2019幎4æå·
+ published_at: '2019-06-10T13:00:41+09:00'
+- id: 19
+ url: https://news.coderdojo.jp/2019/05/15/dojoletter-vol-12/
+ title: DojoLetter Vol.12 2019幎3æå·
+ published_at: '2019-05-15T12:00:27+09:00'
+- id: 18
+ url: https://news.coderdojo.jp/2019/05/10/makeblock-halocode-and-coderdojo-japan/
+ title: MakeblockããCoderDojoãžãæ°è£œåã®Wi-Fiä»ãã·ã³ã°ã«ããŒãã200å°æäŸ
+ published_at: '2019-05-10T10:00:43+09:00'
+- id: 17
+ url: https://news.coderdojo.jp/2019/04/10/dojoletter-vol-11-2019%e5%b9%b42%e6%9c%88%e5%8f%b7/
+ title: DojoLetter Vol.11 2019幎2æå·
+ published_at: '2019-04-10T12:00:19+09:00'
+- id: 16
+ url: https://news.coderdojo.jp/2019/03/11/dojoletter-vol-10/
+ title: DojoLetter Vol.10 2019幎1æå·
+ published_at: '2019-03-11T12:30:44+09:00'
+- id: 15
+ url: https://news.coderdojo.jp/2019/03/03/google-for-nonprofits-via-techsoup-japan/
+ title: TechSoup Japan ã®ååã«ãããGoogle for Nonprofits ã«æ¡æãããŸãã
+ published_at: '2019-03-03T12:07:34+09:00'
+- id: 14
+ url: https://news.coderdojo.jp/2019/02/10/dojoletter-vol-9/
+ title: DojoLetter Vol.9 2018幎12æå·
+ published_at: '2019-02-10T10:00:16+09:00'
+- id: 13
+ url: https://news.coderdojo.jp/2019/02/04/from-minnnanocode-to-coderdojo-japan/
+ title: CoderDojo Japanãšã¿ããªã®ã³ãŒãã ããã°ã©ãã³ã°æè²ã«é¢ããããŒãããŒã·ãããç· çµãå
šåœ165ã¶æã®ãCoderDojoãã察象ãšãããªã³ã©ã€ã³ã³ãã¥ããã£ã®å
±åéå¶ãåçš®ããŒãã¢ãããå
±åã§éå¬ã
+ published_at: '2019-02-04T13:00:36+09:00'
+- id: 12
+ url: https://news.coderdojo.jp/2019/01/10/dojoletter-vol-8/
+ title: DojoLetter Vol.8 2018幎11æå·
+ published_at: '2019-01-10T13:00:19+09:00'
+- id: 11
+ url: https://news.coderdojo.jp/2019/01/07/dojoletter-vol-7/
+ title: DojoLetter Vol.7 2018幎10æå·
+ published_at: '2019-01-07T22:04:32+09:00'
+- id: 10
+ url: https://news.coderdojo.jp/2018/11/28/from-cygames-to-all-dojos-in-japan/
+ title: æ ªåŒäŒç€ŸCygamesãšããŒãããŒã·ãããç· çµãå
šåœ160ã¶æã®éå Žã察象ã«PCãå¯èŽ
+ published_at: '2018-11-28T13:00:39+09:00'
+- id: 9
+ url: https://news.coderdojo.jp/2018/11/12/dojoletter-vol-6/
+ title: DojoLetter Vol.6 2018幎9æå·
+ published_at: '2018-11-12T13:00:55+09:00'
+- id: 8
+ url: https://news.coderdojo.jp/2018/10/29/%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9f%e3%83%b3%e3%82%b0%e5%ad%a6%e7%bf%92%e3%81%aeprogate%e3%80%81%e5%85%a8%e5%9b%bd%e3%81%aecoderdojo%e3%81%b8%e6%b3%95%e4%ba%ba%e3%83%97%e3%83%a9%e3%83%b3/
+ title: ããã°ã©ãã³ã°åŠç¿ã®Progateãå
šåœã®CoderDojoãžæ³äººãã©ã³ã®ç¡ææäŸéå§
+ published_at: '2018-10-29T11:00:41+09:00'
+- id: 7
+ url: https://news.coderdojo.jp/2018/10/12/press-support-facebook-coupon/
+ title: ãã§ã€ã¹ããã¯ãžã£ãã³ãCoderDojoã®ã³ãã¥ããã£éå¶ããµããŒã
+ published_at: '2018-10-12T12:00:21+09:00'
+- id: 6
+ url: https://news.coderdojo.jp/2018/10/10/dojoletter-vol-5/
+ title: DojoLetter Vol.5 2018幎8æå·
+ published_at: '2018-10-10T12:00:25+09:00'
+- id: 5
+ url: https://news.coderdojo.jp/2018/09/20/dojoletter-vol-4/
+ title: DojoLetter Vol.4 2018幎7æå·
+ published_at: '2018-09-20T17:00:37+09:00'
+- id: 4
+ url: https://news.coderdojo.jp/2018/08/11/dojoletter-vol-3/
+ title: DojoLetter Vol.3 2018幎6æå·
+ published_at: '2018-08-11T15:18:50+09:00'
+- id: 3
+ url: https://news.coderdojo.jp/2018/07/10/dojoletter-vol-2/
+ title: DojoLetter Vol.2 2018幎5æå·
+ published_at: '2018-07-10T20:17:27+09:00'
+- id: 2
+ url: https://news.coderdojo.jp/2018/06/05/dojoletter-vol-1/
+ title: DojoLetter Vol.1 2018幎4æå·
+ published_at: '2018-06-05T16:07:18+09:00'
+- id: 1
+ url: https://news.coderdojo.jp/2018/03/06/start-newsletter/
+ title: CoderDojo Japan ãã¥ãŒã¹ã¬ã¿ãŒïŒDojoLetterïŒå§ããŸãïŒ
+ published_at: '2018-03-06T17:00:36+09:00'
diff --git a/lib/tasks/fetch_news.rake b/lib/tasks/fetch_news.rake
deleted file mode 100644
index 8e6b444c6..000000000
--- a/lib/tasks/fetch_news.rake
+++ /dev/null
@@ -1,129 +0,0 @@
-require 'rss'
-require 'net/http'
-require 'uri'
-require 'yaml'
-require 'time'
-require 'active_support/broadcast_logger'
-
-def safe_open(url)
- uri = URI.parse(url)
- raise "äžæ£ãªURLã§ã: #{url}" unless uri.is_a?(URI::HTTP) || uri.is_a?(URI::HTTPS)
-
- Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http|
- request = Net::HTTP::Get.new(uri)
- response = http.request(request)
- response.body
- end
-end
-
-def fetch_rss_items(url, logger)
- logger.info("Fetching RSS â #{url}")
- begin
- rss = safe_open(url)
- feed = RSS::Parser.parse(rss, false)
- feed.items.map { |item| item_to_hash(item) }
- rescue => e
- logger.warn("â ïž Failed to fetch #{url}: #{e.message}")
- []
- end
-end
-
-def item_to_hash(item)
- {
- 'url' => item.link,
- 'title' => item.title,
- 'published_at' => item.pubDate.to_s
- }
-end
-
-namespace :news do
- desc 'RSS ãã£ãŒãããææ°ãã¥ãŒã¹ãååŸããdb/news.yml ã«æžãåºã'
- task fetch: :environment do
- # ãã¬ãŒèšå®ïŒãã¡ã€ã«ïŒã³ã³ãœãŒã«åºåïŒ
- file_logger = ActiveSupport::Logger.new('log/news.log')
- console = ActiveSupport::Logger.new(STDOUT)
- logger = ActiveSupport::BroadcastLogger.new(file_logger, console)
-
- logger.info('==== START news:fetch ====')
-
- # æ¢åã® news.yml ãèªã¿èŸŒã¿
- yaml_path = Rails.root.join('db', 'news.yml')
- existing_news = if File.exist?(yaml_path)
- YAML.safe_load(File.read(yaml_path), permitted_classes: [Time], aliases: true)['news'] || []
- else
- []
- end
-
- # ãã¹ãïŒã¹ããŒãžã³ã°ç°å¢ã§ã¯ãµã³ãã«ãã¡ã€ã«ãæ¬çªã¯å®ãµã€ãã®ãã£ãŒã
- feed_urls = if Rails.env.test? || Rails.env.staging?
- [Rails.root.join('spec', 'fixtures', 'sample_news.rss').to_s]
- else
- [
- 'https://news.coderdojo.jp/feed/'
- # å¿
èŠã«å¿ããŠä» Dojo ã® RSS ãããã«è¿œå å¯èœ
- # 'https://coderdojotokyo.org/feed',
- ]
- end
-
- new_items = feed_urls.flat_map { |url| fetch_rss_items(url, logger) }
-
- # æ¢åããŒã¿ãããã·ã¥ã«å€æïŒURL ãããŒã«ïŒ
- existing_items_hash = existing_news.index_by { |item| item['url'] }
-
- # æ°ããã¢ã€ãã ãšæ¢åã¢ã€ãã ãåé¢
- truly_new_items = []
- updated_items = []
-
- new_items.each do |new_item|
- if existing_items_hash.key?(new_item['url'])
- existing_item = existing_items_hash[new_item['url']]
- # ã¿ã€ãã«ãŸãã¯å
¬éæ¥ãå€ãã£ãå Žåã®ã¿æŽæ°
- if existing_item['title'] != new_item['title'] || existing_item['published_at'] != new_item['published_at']
- updated_items << existing_item.merge(new_item)
- end
- else
- truly_new_items << new_item
- end
- end
-
- # æ¢åã®æå€§IDãååŸ
- max_existing_id = existing_news.map { |item| item['id'].to_i }.max || 0
-
- # æ°ããã¢ã€ãã ã®ã¿ã« ID ãå²ãåœãŠïŒå€ãé ïŒ
- truly_new_items_sorted = truly_new_items.sort_by { |item|
- Time.parse(item['published_at'])
- }
-
- truly_new_items_sorted.each_with_index do |item, index|
- item['id'] = max_existing_id + index + 1
- end
-
- # æŽæ°ãããªãã£ãæ¢åã¢ã€ãã ãååŸ
- updated_urls = updated_items.map { |item| item['url'] }
- unchanged_items = existing_news.reject { |item| updated_urls.include?(item['url']) }
-
- # å
šã¢ã€ãã ãããŒãž
- all_items = unchanged_items + updated_items + truly_new_items_sorted
-
- # æ¥ä»éé ãœãŒã
- sorted_items = all_items.sort_by { |item|
- Time.parse(item['published_at'])
- }.reverse
-
- File.open('db/news.yml', 'w') do |f|
- formatted_items = sorted_items.map do |item|
- {
- 'id' => item['id'],
- 'url' => item['url'],
- 'title' => item['title'],
- 'published_at' => item['published_at']
- }
- end
-
- f.write({ 'news' => formatted_items }.to_yaml)
- end
-
- logger.info("â
Wrote #{sorted_items.size} items to db/news.yml (#{truly_new_items_sorted.size} new, #{updated_items.size} updated)")
- logger.info('==== END news:fetch ====')
- end
-end
diff --git a/lib/tasks/import_news.rake b/lib/tasks/import_news.rake
deleted file mode 100644
index 45c77ee05..000000000
--- a/lib/tasks/import_news.rake
+++ /dev/null
@@ -1,42 +0,0 @@
-require 'yaml'
-
-namespace :news do
- desc 'db/news.yml ãèªã¿èŸŒãã§ News ããŒãã«ã upsert ãã'
- task import_from_yaml: :environment do
- file_logger = ActiveSupport::Logger.new('log/news.log')
- console = ActiveSupport::Logger.new(STDOUT)
- logger = ActiveSupport::BroadcastLogger.new(file_logger, console)
-
- logger.info "==== START news:import_from_yaml ===="
-
- yaml_path = Rails.root.join('db', 'news.yml')
- raw = YAML.safe_load(File.read(yaml_path), permitted_classes: [Time], aliases: true)
-
- # entries ãèšç®
- entries = raw['news'] || []
- new_count = 0
- updated_count = 0
-
- entries.each do |attrs|
- news = News.find_or_initialize_by(url: attrs['url'])
- is_new = news.new_record?
-
- news.assign_attributes(
- title: attrs['title'],
- published_at: attrs['published_at']
- )
-
- if is_new || news.changed?
- news.save!
- status = is_new ? 'new' : 'updated'
- new_count += 1 if is_new
- updated_count += 1 unless is_new
-
- logger.info "[News] #{news.published_at.to_date} #{news.title} (#{status})"
- end
- end
-
- logger.info "Imported #{new_count + updated_count} items (#{new_count} new, #{updated_count} updated)."
- logger.info "==== END news:import_from_yaml ===="
- end
-end
diff --git a/lib/tasks/news.rake b/lib/tasks/news.rake
new file mode 100644
index 000000000..360819e52
--- /dev/null
+++ b/lib/tasks/news.rake
@@ -0,0 +1,152 @@
+require 'rss'
+require 'net/http'
+require 'json'
+
+TEST_NEWS_FEED = Rails.root.join('spec', 'fixtures', 'sample_news.rss').freeze
+DOJO_NEWS_FEED = 'https://news.coderdojo.jp/feed/'.freeze
+DOJO_NEWS_JSON = 'https://news.coderdojo.jp/wp-json/wp/v2/posts'.freeze
+PR_TIMES_FEED = 'https://prtimes.jp/companyrdf.php?company_id=38935'.freeze
+
+NEWS_YAML_PATH = 'db/news.yml'.freeze
+NEWS_LOGS_PATH = 'log/news.log'.freeze
+TASK_LOGGER = ActiveSupport::BroadcastLogger.new(
+ ActiveSupport::Logger.new(NEWS_LOGS_PATH),
+ ActiveSupport::Logger.new(STDOUT)
+ )
+
+# DojoNews (WordPress) REST API ããå
šæçš¿ãååŸããã¡ãœãã
+# https://news.coderdojo.jp/wp-json/wp/v2/posts (JSON)
+def fetch_dojo_news_posts(api_endpoint)
+ items = []
+
+ loop.with_index(1) do |_, page|
+ uri = URI(api_endpoint)
+ uri.query = URI.encode_www_form(page: page, per_page: 100, status: 'publish')
+
+ response = Net::HTTP.get_response(uri)
+ break unless response.is_a?(Net::HTTPSuccess)
+
+ posts = JSON.parse(response.body)
+ break if posts.empty?
+
+ posts.each do |post|
+ items << {
+ 'url' => post['link'],
+ 'title' => post['title']['rendered'],
+ 'published_at' => Time.parse(post['date_gmt'] + ' UTC').in_time_zone('Asia/Tokyo').iso8601
+ }
+ end
+
+ TASK_LOGGER.info("ð WordPress API: ããŒãž #{page} ãã #{posts.size} ä»¶ååŸ")
+ end
+
+ items
+end
+
+# PR TIMES RSS ãã£ãŒããããã¹ãŠã®ãã¬ã¹ãªãªãŒã¹ãååŸããã¡ãœãã
+def fetch_prtimes_posts(rss_feed_url)
+ feed = RSS::Parser.parse(rss_feed_url, false)
+ feed.items.map do |item|
+ published_at = if item.respond_to?(:dc_date) && item.dc_date
+ item.dc_date.in_time_zone('Asia/Tokyo').iso8601
+ else
+ raise "PR TIMES feed: dc:date not found for item: #{item.link}"
+ end
+
+ {
+ 'url' => item.link,
+ 'title' => item.title,
+ 'published_at' => published_at
+ }
+ end
+end
+
+namespace :news do
+ desc "ãã¥ãŒã¹ãã£ãŒããååŸãã#{NEWS_YAML_PATH} ãåæ§ç¯ïŒåªçïŒ"
+ task fetch: :environment do
+ # ãã¬ãŒèšå®ïŒãã¡ã€ã«ïŒã³ã³ãœãŒã«åºåïŒ
+ TASK_LOGGER.info('==== START news:fetch ====')
+
+ # 1. news.yml ã空ã«ãã
+ File.write(NEWS_YAML_PATH, [].to_yaml)
+ TASK_LOGGER.info("ð news.yml ããªã»ããããŸãã")
+
+ # 2. ç°å¢ã«å¿ããããŒã¿ãœãŒã¹ããååŸ
+ if Rails.env.test? || Rails.env.staging?
+ # ãã¹ãç°å¢: ãµã³ãã«RSSïŒRSS 2.0ãpubDateã®ã¿ïŒ
+ TASK_LOGGER.info("𧪠ãã¹ãç°å¢: ãµã³ãã«RSSããååŸ")
+ items = RSS::Parser.parse(TEST_NEWS_FEED, false).items.map { |item|
+ {
+ 'url' => item.link,
+ 'title' => item.title,
+ 'published_at' => item.pubDate.in_time_zone('Asia/Tokyo').iso8601
+ }
+ }
+ else
+ # æ¬çªç°å¢: WordPress REST API + PR TIMES RSS
+ dojo_news_items = fetch_dojo_news_posts(DOJO_NEWS_JSON)
+ TASK_LOGGER.info("ð° news.coderdojo.jp ãã #{dojo_news_items.size} ä»¶ãååŸ")
+
+ prtimes_items = fetch_prtimes_posts(PR_TIMES_FEED)
+ TASK_LOGGER.info("ð¢ PR TIMES ãã #{prtimes_items.size} ä»¶ãååŸ")
+
+ items = dojo_news_items + prtimes_items
+ end
+
+ # 3. å€ãé ã«ãœãŒãã㊠ID ãä»äžïŒISO 8601 ãªãæååã®ãŸãŸãœãŒãå¯èœïŒ
+ items_by_oldest = items.sort_by { |item| item['published_at'] }
+ items_by_oldest.each.with_index(1) { |item, index| item['id'] = index }
+
+ # 4. ææ°é ã«ãœãŒãã㊠YAML ãã¡ã€ã«ã«æžãåºãïŒããŒé åº: id, url, title, published_atïŒ
+ File.open(NEWS_YAML_PATH, 'w') do |file|
+ file.write(items_by_oldest.reverse.map do |item|
+ {
+ 'id' => item['id'],
+ 'url' => item['url'],
+ 'title' => item['title'],
+ 'published_at' => item['published_at']
+ }
+ end.to_yaml)
+ end
+
+ TASK_LOGGER.info("â
åèš #{items_by_oldest.size} ä»¶ã news.yml ã«ä¿åããŸãã")
+ TASK_LOGGER.info("ð æ¬¡ã¯ 'bundle exec rails news:upsert' ã§ããŒã¿ããŒã¹ã«åæ ããŠãã ãã")
+ TASK_LOGGER.info("==== END news:fetch ====")
+ TASK_LOGGER.info("")
+ end
+
+
+ desc "#{NEWS_YAML_PATH} ããããŒã¿ããŒã¹ã« upsert"
+ task upsert: :environment do
+ TASK_LOGGER.info "==== START news:upsert ===="
+
+ news_items = YAML.safe_load File.read(NEWS_YAML_PATH)
+ created_count = 0
+ updated_count = 0
+
+ News.transaction do
+ news_items.each do |item|
+ news = News.find_or_initialize_by(url: item['url'])
+ news.assign_attributes(
+ title: item['title'],
+ published_at: item['published_at']
+ )
+
+ is_new_record = news.new_record?
+ if is_new_record || news.changed?
+ news.save!
+
+ status = is_new_record ? 'new' : 'updated'
+ created_count += 1 if is_new_record
+ updated_count += 1 unless is_new_record
+
+ TASK_LOGGER.info "[News] #{news.published_at.to_date} #{news.title} (#{status})"
+ end
+ end
+ end
+
+ TASK_LOGGER.info "Upserted #{created_count + updated_count} items (#{created_count} new, #{updated_count} updated)."
+ TASK_LOGGER.info "==== END news:upsert ===="
+ TASK_LOGGER.info ""
+ end
+end
diff --git a/lib/tasks/podcasts.rake b/lib/tasks/podcasts.rake
index 20f1b3128..15ddd2374 100644
--- a/lib/tasks/podcasts.rake
+++ b/lib/tasks/podcasts.rake
@@ -4,9 +4,9 @@ namespace :podcasts do
desc 'Anchor.fm ãã Podcast ããŒã¿æ
å ±ãååŸããŠç»é²'
task upsert: :environment do
user_id = '626746926'
- logger = ActiveSupport::Logger.new('log/podcasts.log')
- console = ActiveSupport::Logger.new(STDOUT)
- logger = ActiveSupport::BroadcastLogger.new(logger, console)
+ console = ActiveSupport::Logger.new(STDOUT)
+ logger_file = ActiveSupport::Logger.new('log/podcasts.log')
+ logger = ActiveSupport::BroadcastLogger.new(logger_file, console)
logger.info('==== START podcasts:upsert ====')
diff --git a/public/docs/_about-coderdojo-japan-2017.md b/public/docs/_about-coderdojo-japan-2017.md
index db75da2c4..1fec1c52e 100644
--- a/public/docs/_about-coderdojo-japan-2017.md
+++ b/public/docs/_about-coderdojo-japan-2017.md
@@ -1,6 +1,6 @@
# â¯ïž äžè¬ç€Ÿå£æ³äºº CoderDojo Japan ã«ã€ã㊠(2017幎ç)
-
äžè¬ç€Ÿå£æ³äºº CoderDojo Japan ã§ã¯æ¬¡ã®äºæ¥ãè¡ãªã£ãŠãããŸãããCoderDojo ã®æŽ»åã®èŒªãåºããããäžå±€æ¥œãããã®ã«ããŠããããã«ã以äžã®äºæ¥ãè¡ã£ãŠãããŸãã
@@ -57,8 +57,7 @@ CoderDojo Japan ã§ã¯ã宿¬Ÿã«å®ããããäºæ¥å
容ã«ãããã£ãŠ
CoderDojo Japan ãžã®å¿åã»åå ã«ã€ããŠããããªã¡ãã»ãŒãžãåé²ããŠã¿ãŸããããã¡ãããããã°èŠèŽããŠããã ãããšå¬ããã§ã ;)
+
+
+## ð¢ Office
+
+In-person meeting is also welcome! If you are around Tokyo, feel free to drop by our office. ð¢ððš
+
+Office: [CASE Shinjuku](http://case-shinjuku.com/english/), Sankei Bldg 4F, Takadanobaba 1-28-10, Shinjuku-ku, Tokyo, 169-0075
+
+
+
+
+
+## [ïž](#about) CoderDojo one-minute video {#about}
+
+
+
+If your company is interested in supporting dojos in Japan, feel free to contact us at `info@coderdojo.jp` with any ideas for the community. Thanks for reading! ðâš
+
+
+
+
+
+https://coderdojo.jp/english
+
+
äžè¬ç€Ÿå£æ³äºº CoderDojo Japan ã§ã¯ãå
šåœ{{ NUM_OF_JAPAN_DOJOS }}ã¶æä»¥äžããéå¶å©ã®ããã°ã©ãã³ã°éå ŽãCoderDojoãã®æŽ»åã®èŒªãåºããããäžå±€æ¥œãããã®ã«ããŠããããã«ã以äžã®äºæ¥ãè¡ã£ãŠãããŸãã
@@ -18,19 +20,57 @@
æ¬ããŒãžã§ã¯ãäžè¬ç€Ÿå£æ³äºº CoderDojo Japan ãéå¶ããäžèšäºæ¥ã®æŽ»åå
容ããèšç«çµç·¯ãªã©ã«ã€ããŠãŸãšããŠããŸãã
+
+## [â¯ïž](#coderdojo) CoderDojo ãšã¯ {#coderdojo}
+
+CoderDojo ã¯ãäž»ã«7ã17æ³ã察象ãšããåã©ãã®ããã®ããã°ã©ãã³ã°éå Žã§ãã2011幎ã«ã¢ã€ã«ã©ã³ãããå§ãŸã£ãåœéçãªéå¶å©æŽ»åã§ã**æ¥æ¬ã«ã¯{{ NUM_OF_JAPAN_DOJOS }}ã¶æä»¥äžã®éå Ž**ãåå°åã§æŽ»åããŠããŸãã
+
+
+
+
+
+
+ã³ããçŠã§å€§ããªåœ±é¿ãåããŸããããæ¥æ¬ã§ã¯åã³[æ¯å¹Ž{{ NUM_OF_ANNUAL_EVENTS }}å以äžã®ã€ãã³ã](/events)ãéå¬ãããããã«ãªãã环èšã§{{ NUM_OF_TOTAL_EVENTS }}å以äžã®ããã°ã©ãã³ã°æ©äŒãåäŸéã«æäŸããŠããŸããåã€ãã³ãã®éå¶ã¯ããã°ã©ããŒããã¶ã€ããŒãåŠçãæå¡ãªã©ã倿§ãªæ¹ã
ã®ååã«ãã£ãŠæ¯ããããŠããŸãã
+
+䞻㫠[Scratch ã micro:bitãWebãµã€ãå¶äœãªã©ã人æ°](/stats#tag)ã§ãããç¹å®ã®ãã¯ãããžãŒãããã¹ãã«ãã ããããåå è
èªèº«ã«äœããããã®ãèããŠæ¥ãŠãããããã®å®çŸãåŸæŒãããããšã CoderDojo ã®ç¹åŸŽã®ïŒã€ã§ãã
-
+
- **(4) åœå
å€ã®ãCoderDojoãã«é¢ããæ®åããã³ãåºå ±ã«é¢ããæŽ»å**
- å
容: News ãµã€ãã SNSãPodcast ãªã©ã§ CoderDojo 掻åã®åšç¥ãæ¯æŽããŸã
- - å®çžŸ: [DojoLetter](https://news.coderdojo.jp/category/dojoletter%e3%83%90%e3%83%83%e3%82%af%e3%83%8a%e3%83%b3%e3%83%90%e3%83%bc/)ã[Facebook](https://www.facebook.com/coderdojo.jp) ã [Twitter](https://twitter.com/CoderDojoJapan) ã¢ã«ãŠã³ãã[DojoCast](/podcasts) ããåç
§ãã ãã
+ - å®çžŸ: [DojoLetter](https://news.coderdojo.jp/category/dojoletter%e3%83%90%e3%83%83%e3%82%af%e3%83%8a%e3%83%b3%e3%83%90%e3%83%bc/)ã[Facebook](https://www.facebook.com/coderdojo.jp) ã [X](https://x.com/CoderDojoJapan) (æ§: Twitter) ã¢ã«ãŠã³ãã[DojoCast](/podcasts) ããåç
§ãã ãã
- **(5) åœå
å€ã®ãCoderDojoãã®æŽ»åãéãããŠåŸãããç¥èŠã®å
±æ**
- å
容: CoderDojo ã³ãã¥ããã£ã§åŸãããç¥èŠããªãŒãã³ã«å
±æããŸã
- - å®çžŸ: ã©ãºãã€è²¡å£ CEOãšã®ããŒãã¢ãããCoderDojo å
±åèšç«è
(James, Bill) ãšã®ããŒãã¢ãããªã©ã詳现㯠[YouTube ã®ååã»ãã·ã§ã³ã»ã€ãã³ããŸãšã](https://www.youtube.com/channel/UCal5GuoCDCMDQe07w69TuJA/playlists?view=50&sort=dd&shelf_id=6)ããåç
§ãã ãã
+ - å®çžŸ: ã©ãºããªãŒãã€è²¡å£ CEO ãšã®å¯Ÿè«ãCoderDojo å
±åèšç«è
(James, Bill) ãšã®å¯Ÿè«ã[ãã±ã¢ã³ã¯ãŒã¯ã·ã§ãã](http://localhost:3000/pokemon/workshop)ãªã©ã詳现ã¯[å
¬åŒ YouTube ãã£ã³ãã«](https://www.youtube.com/@CoderDojoJapan/playlists)ããåç
§ãã ãã
- **(6) ååå·ã«é垯é¢é£ããäžåã®äºæ¥**
- å
容: æ³äººãšããŠå¿
èŠãªäºåäœæ¥ããä»åŸã®ããã«ãã£ãŠããã¹ãããšã宿œããŸã
- å®çžŸ: [æ±ºç®æžã®äœæ](/finances)ã[çäºã®åé](#next)ã[åãåãã察å¿](/#inquiry)ã[CoderDojo Foundation](https://coderdojo.com/foundation/) ã [Raspberry Pi Foundation](https://www.raspberrypi.org/about/) ãšã®ããŒãã£ã³ã° (è±èª) ãªã©
@@ -63,11 +103,11 @@ CoderDojo Japan ã宿œããŠããäžèšæŽ»åããªãã³ã« [CoderDojo Foun
-äžæ¹ãããŒãããŒæ³äººãš[é£åã§ãã¬ã¹ãªãªãŒã¹ãåºã](https://www.sakura.ad.jp/information/pressreleases/2020/03/25/1968203191/)å Žåãªã©ãåãçµã¿ã®å®çŸã«åããŠç§å¯æ
å ±ãä¿æããªããåãããšããããŸããCoderDojo ã³ãã¥ããã£ãè£åŽãããµããŒãããäºæ¥ã«ãèå³ãããå Žåã¯ãäžèšã[çäºåéã®ãç¥ãã](#next)ããã確èªãã ããã
+äžæ¹ãããŒãããŒæ³äººãšè¶³äžŠã¿ãæããŠ[ãã¬ã¹ãªãªãŒã¹ãåºã](https://prtimes.jp/main/html/searchrlp/company_id/38935)å Žåãªã©ãåãçµã¿ã®å®çŸã«åããŠç§å¯æ
å ±ãä¿æããªããåãããšããããŸããCoderDojo ã³ãã¥ããã£ãè£åŽãããµããŒãããäºæ¥ã«ãèå³ãããå Žåã¯ãäžèšã[çäºåéã®ãç¥ãã](#board)ããã確èªãã ããã
-代衚çäº å®å·èŠå¹³
+代衚çäº å®å·èŠå¹³
info@coderdojo.jp
@@ -137,8 +175,7 @@ info@coderdojo.jp
- **A.** ã¯ããéé±ã®å®äŸããŒãã£ã³ã° (å®äŸäŒ) ããããŸããååãªã³ã©ã€ã³ã§è¡ããããããŸã§ã®ãšãããå¹³æ¥ã®æ¥äžã«æéãåãããŠå®æœããããšãå€ãã§ããå
·äœçãªé°å²æ°ã¯äžèšã® YouTube åç»ãå
¬éå®äŸäŒãããåç
§ãã ãã ð¥
â»
diff --git a/public/docs/english.md b/public/docs/english.md
index 3c392fa57..bc0f9ad56 100644
--- a/public/docs/english.md
+++ b/public/docs/english.md
@@ -17,9 +17,8 @@ This page briefly explains about [the CoderDojo community](#about), [its growth
### [ïž](#video) English 1-minute video with Japanese subtitles {#video}
@@ -135,51 +134,44 @@ For more detailed information, please refer to the following reports, articles,
We occasionally host guests from overseas at our co-working and shared-office space, [CASE Shinjuku](https://case-shinjuku.com/english), in Tokyo. You can look back on our past meetups on [YouTube](https://www.youtube.com/coderdojojapan).
â»
- [CoderDojo Japan ã®æŽ»åå®çžŸãèŠã](/about-coderdojo-japan)
+ [CoderDojo Japan ã®æŽ»åå®çžŸãèŠã](/about)
diff --git a/public/docs/how-to-suspend-your-dojo.md b/public/docs/how-to-suspend-your-dojo.md
index 1587a6a27..b59f79899 100644
--- a/public/docs/how-to-suspend-your-dojo.md
+++ b/public/docs/how-to-suspend-your-dojo.md
@@ -21,7 +21,7 @@ CoderDojo ã§ã¯ãDojo ãç¶ç¶çã«ç¶ããããªããªã£ããšããã
æç¶ããå®äºããããDojo ã®æŽ»åãäŒæ¢ããããšãWebãµã€ããŸãã¯SNSã¢ã«ãŠã³ããªã©ã§åšç¥ãããšããã§ããããããããšãåœè©² Dojo ã®æŽ»åãç¶ç¶ããŠãããæ¹ãšç¹ããããããããŸããã
-## 2. 代衚è
ã亀代ãã
+## 2. 代衚è
ã亀代ããïŒåŒãç¶ãããªããŒãããïŒ
CoderDojo ãšããŠã®æŽ»åã¯ç¶ç¶ããã€ã€ãå¥ã®ä»£è¡šè
ãšäº€ä»£ããããå
±å代衚è
ã远å ããããšãã§ããŸãã詳现ã¯ä»¥äžã®ããŒãžããã確èªããã ããŸãã
diff --git a/public/docs/post-backend-update-history.md b/public/docs/post-backend-update-history.md
index 9641a05c8..c8c64cce7 100644
--- a/public/docs/post-backend-update-history.md
+++ b/public/docs/post-backend-update-history.md
@@ -9,7 +9,7 @@
## ð£ åç»ç
@@ -64,7 +64,7 @@
次ã®ãã¢åç»ãèŠãŠããããšåãããããã®ã§ãããRuby/Rails ã Cloud-Based CMS ãšããŠæŽ»çšã§ããããã«ããããåãã®ææãµãŒãã¹ã§ãã
## 第1ç« ç·å
diff --git a/public/podcasts/12.md b/public/podcasts/12.md
index 88fed2efa..71d3f9eb2 100644
--- a/public/podcasts/12.md
+++ b/public/podcasts/12.md
@@ -17,7 +17,7 @@ Guest: [Bill Liao](https://twitter.com/liaonet), co-founder of [CoderDojo](https
## ð¥ Watch on YouTube
diff --git a/public/podcasts/19.md b/public/podcasts/19.md
index 23efa1271..fe543ea5d 100644
--- a/public/podcasts/19.md
+++ b/public/podcasts/19.md
@@ -1,7 +1,7 @@
äžè¬ç€Ÿå£æ³äºº CoderDojo Japan ã§æ®æ®µè¡ãããŠããæ¥åå
容ïŒéé±ã®å®äŸäŒãæ³äººé£æºã®é²ãæ¹ãæµ·å€ãšã®è±èªããŒãã£ã³ã°ãªã©ïŒã«ã€ããŠã話ãããŸããïŒæ¬ãšããœãŒãã§ã¯ã2016幎ã®èšç«èæ¯ãçäºåéã§å®®å³¶ãããå¿åããã¹ããŒãªãŒãé
ä¿¡äžã«ããã ãã質åãžã®ã³ã¡ã³ããªã©ãå«ãŸããŠããŸãã
åè: çäºåéã®ãç¥ãã - CoderDojo Japan
-[https://coderdojo.jp/about-coderdojo-japan](https://coderdojo.jp/about-coderdojo-japan)
+[https://coderdojo.jp/about](https://coderdojo.jp/about)