alps-jbnu / litmus-site Goto Github PK
View Code? Open in Web Editor NEWLitmus Online Judge (Site)
Home Page: http://litmus2.jbnu.ac.kr
License: GNU Affero General Public License v3.0
Litmus Online Judge (Site)
Home Page: http://litmus2.jbnu.ac.kr
License: GNU Affero General Public License v3.0
댓글 금지로 만들어진 대회에서, 질의 요청을 하면 Ticket이 생성되는데 학생 입장에서는 제출된 Ticket을 다시 확인할 방법이 없다.
[Manage ticket] 링크를 일반 유저에게도 보여주거나, 자신의 것만 볼 수 있도록 개선이 필요해보임.
가능하다면, 질문과 공지 시스템을 새로 만드는 것이 좋아보인다.
대회 코드라는 비슷한 이름의 입력 텍스트가 있고 접근 코드 입력 테스트는 너무 아래있으며 자동으로 입력되어 있어서 불편함이 따름
서버를 실행하여 localhost:8000에 접속하면 콘솔에
"GET /%3Cfunction%20%3Clambda%3E%20at%200x103fe3d50%3E HTTP/1.1" 404 12332
"GET /%3Cfunction%20%3Clambda%3E%20at%200x104008dd0%3E HTTP/1.1" 404 12332
"GET /%3Cfunction%20%3Clambda%3E%20at%200x103fea250%3E HTTP/1.1" 404 12332
"GET /%3Cfunction%20%3Clambda%3E%20at%200x103fdf8d0%3E HTTP/1.1" 404 12332
"GET /%3Cfunction%20%3Clambda%3E%20at%200x103fee6d0%3E HTTP/1.1" 404 12332
가 출력됩니다.
회원가입 시 계정 활성화를 위해 가입된 계정의 이메일 주소로 메일이 전송되는 데,
... 활성화를 위한 인증 코드는 다음과 같습니다.
a8b384b816297a4a055da5a55b4d996294aba7fa
처럼 안내하지만, 인증 대기중인 계정으로 로그인이 되지 않아 인증 코드를 기입할 방법이 없다.
SIGSEGV: invalid_state
corrupt page /problem/darksoul-3-goinmul/clone
site: fatal signal: Segmentation fault
site died (signal 500, exit -11)
panic: go back
Traceback (most recent call last):
File "/home/litmus/env/litmus/local/lib/python2.7/site-packages/django/core/handlers/exception.py", line 41, in inner
response = get_response(request)
File "/home/litmus/env/litmus/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 187, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/home/litmus/env/litmus/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 185, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/litmus/env/litmus/local/lib/python2.7/site-packages/django/views/decorators/http.py", line 40, in inner
return func(request, *args, **kwargs)
File "/home/litmus/env/litmus/local/lib/python2.7/site-packages/django/contrib/auth/decorators.py", line 23, in _wrapped_view
return view_func(request, *args, **kwargs)
File "/home/litmus/env/litmus/local/lib/python2.7/site-packages/django/contrib/auth/decorators.py", line 23, in _wrapped_view
return view_func(request, *args, **kwargs)
File "/home/litmus/site/judge/views/problem.py", line 627, in clone_problem
problem.save()
File "/home/litmus/site/judge/models/problem.py", line 286, in save
super(Problem, self).save(*args, **kwargs)
File "/home/litmus/env/litmus/local/lib/python2.7/site-packages/django/db/models/base.py", line 808, in save
force_update=force_update, update_fields=update_fields)
File "/home/litmus/env/litmus/local/lib/python2.7/site-packages/django/db/models/base.py", line 838, in save_base
updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
File "/home/litmus/env/litmus/local/lib/python2.7/site-packages/django/db/models/base.py", line 924, in _save_table
result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
File "/home/litmus/env/litmus/local/lib/python2.7/site-packages/django/db/models/base.py", line 963, in _do_insert
using=using, raw=raw)
File "/home/litmus/env/litmus/local/lib/python2.7/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/home/litmus/env/litmus/local/lib/python2.7/site-packages/django/db/models/query.py", line 1076, in _insert
return query.get_compiler(using=using).execute_sql(return_id)
File "/home/litmus/env/litmus/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 1112, in execute_sql
cursor.execute(sql, params)
File "/home/litmus/env/litmus/local/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
File "/home/litmus/env/litmus/local/lib/python2.7/site-packages/django/db/utils.py", line 94, in __exit__
six.reraise(dj_exc_type, dj_exc_value, traceback)
File "/home/litmus/env/litmus/local/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
File "/home/litmus/env/litmus/local/lib/python2.7/site-packages/django/db/backends/mysql/base.py", line 101, in execute
return self.cursor.execute(query, args)
File "/home/litmus/env/litmus/local/lib/python2.7/site-packages/MySQLdb/cursors.py", line 250, in execute
self.errorhandler(self, exc, value)
File "/home/litmus/env/litmus/local/lib/python2.7/site-packages/MySQLdb/connections.py", line 50, in defaulterrorhandler
raise errorvalue
DataError: (1406, "Data too long for column 'code' at row 1")
태그 이름이 소문자랑 하이픈(-) 밖에 안되는데, 그대로 밖에 노출됩니다.
한글도 가능하면 좋겠네요.
ValueError at /admin/judge/contest/
Database returned an invalid datetime value. Are time zone definitions for your database installed?
Exception Location:
/home/litmus/env/litmus/local/lib/python2.7/site-packages/django/db/models/functions/datetime.py in convert_value, line 198
아직 원인을 모르겠음.
DB에서 등록된 Contest를 삭제했더니 안 나오는데, 대회를 추가할 때 어떤 형식이 안 맞는 것 같음
judge에서 오류가 나면 아래와 같이 표시됨
채점에 문제가 생겼습니다.
자세한 오류 정보
Traceback (most recent call last):
File "/home/litmus/judge/dmoj/judge.py", line 163, in _begin_grading
problem = Problem(problem_id, time_limit, memory_limit, load_pretests_only=pretests_only)
File "/home/litmus/judge/dmoj/problem.py", line 51, in __init__
self.cases = self._resolve_testcases(self.config['pretest_test_cases' if self.is_pretested else 'test_cases'])
File "/home/litmus/judge/dmoj/problem.py", line 73, in _resolve_testcases
for case_config in cfg:
TypeError: 'NoneType' object is not iterable
제출한 소스코드가 아닌 내부 오류 메시지를 출력하기 때문에 혼란이 올 뿐 아니라 보안 이슈도 있어보임
에러 메시지:
ImportError at /accounts/register/
No module named sgbackend
Request Method: POST
Request URL: <domain>/accounts/register/
Django Version: 1.11.8
Exception Type: ImportError
Exception Value:
No module named sgbackend
Exception Location: /usr/lib/python2.7/importlib/__in..
이유는 모르겠으나 sendgrid-django, django-sendgrid, sendgrid 중 무엇을 설치해도 sgbackend 모듈을 여전히 찾을 수 없다.
채점 중일 때 새로고침을 눌러야만 채점 결과가 나오는 현상이 있음.
주기적으로 새로고침을 자동으로 해주는 식으로 해결해야 될 듯함.
지금 댓글이 문제에도 있고, 대회 소개(info) 에도 있는데 이에 대한 의논이 필요하다.
각 댓글을 어떻게 사용하고 관리할 지
공개한 접근 코드를 이용하여 참가하는 대회에서 대회를 만든 교수가 대회를 삭제할 수 없음.
사이트 관리자에서 Contest > Add (추가) 페이지를 요청할 때 해당 에러가 나옴
http://litmus.ga/problem/aplusb2 에서 aplusb2
자리에 오는 것이 문제 코드입니다.
지금은 [a-z0-9]+
(영어 소문자와 숫자)만 허용하고 있습니다.
각 방법에 장단점이 분명히 있으니 의견을 수렴할 겸 투표를 진행하려 합니다.
마음에 드는 댓글(방법)에 👍 또는 👎 를 표시를 해주세요!
투표 방법:
👍 또는 👎는 댓글의 오른쪽 위+😃
표시를 클릭하면 됩니다.
Litmus(링크)에 있는 problemset을 현재 프로젝트로 이전하는 작업.
Litmus 상에서의 problemset 디렉토리는 /home/litmus/public_html/problem
이며
contests
에는 문제가 존재하며 하나의 문제에 해당하는 input
, output
파일이 함께 존재함.
이를 같이 현재 프로젝트로 이전해야 함
한글이 포함된 파이썬3 코드를 제출시 채점 중 유니코드에러 가 발생합니다.
사용자들의 추가권한이 필요한 경우 프로젝트 내부적으로 권한 상승을 요청할 수 있는 폼이 필요합니다.
사용자가 필요한 권한을 선택해 폼을 작성해 제출하면, 관리자인 Admin 계정으로 승인하거나 반려할 수 있는 시스템이 필요합니다.
문제를 풀면 빨간색 (-) 모양에서 초록색 (v)이 되어야 하는데 갱신이 되지 않음
이름이 길어서 -clone-clone-... 이 생략된 상황이면 키 중복 때문에 500 에러가 발생함.
예를 들어, 1234-1234-1234
라는 문제를 복제하면 1234-1234-1234-clone
이여야하지만, 코드가 1234-1234-1234-clo
가 되며,
이걸 다시 복제해도 1234-1234-1234-clo-clone
이 되지 못하고 1234-1234-1234-clo
라서 중복 에러. (길이 제한때문에)
관련 이슈: #38
만든 사람 자신은 기본적으로 포함되어야하는데 그런 것이 없어서 만들고 나서 '아차' 할 수 있음.
관리자 UI에서 문제의 PROBLEM CLARIFICATIONS을 작성 후 저장을 눌러도 저장이 안됨.
#42 과 함께 공지 시스템을 고민해볼 필요가 있다.
다른 모든 소속의 가입신청이 보임 (관리자 페이지 [교수] 입장에서)
문제를 수정하는 화면에서 과제/대회에 해당 문제를 추가하는 기능이 필요합니다.
소속의 view members 에서 [숫자] 명으로 표기되어야 하는데 [숫자]가 나오지 않음
메인 화면에서 보이는 News(뉴스)를 작성하기 위한 UI가 필요합니다.
해당 글들은 Blog Post와 연결되어 있습니다.
git submodule init 명령어를 수행하면
fatal: No url found for submodule path 'static/libs' in .gitmodules
라는 에러가 뜹니다.
그래서 직접 url을 clone하여 다운받았는데 라이브러리가 최신 버전으로 업데이트되면서 버전 충돌이 발생합니다. 예로 우리는 jQuery 1.11.2 버전이 필요하지만 3.4.1 버전이 다운됩니다.
권한 그룹 중 [교수] 에 "이름과 학번 표시" 권한을 추가하여
소속 멤버 표시, 랭킹, 대회 리더보드 등에서 username
이 아닌 username(display name / student id)
로 보일 수 있도록 UI를 개선하면 좋겠습니다.
특정 언어만 제출 가능하도록 설정
해당 프로젝트의 실제 사용자인(교수님, 학생들)을 위한 사용방법 매뉴얼이 필요합니다.
교수님들의 경우 문제 추가, 데이터 추가, 과제(또는 시험) 생성 및 관리를 위주로
학생들의 경우 가입, 코드 제출 및 채점 방법, FAQ 기타 등등
리트머스2의 첫 사용자가 헤메지 않도록 유저 Friendly한 매뉴얼 작성
문제를 푼 사용자 수와 정답률도 그대로 복제되네요.
clone 할 때는 user_count
와 ac_rate
를 0으로 초기화하도록 수정이 필요해보입니다.
버그인지 의도된 것인지 모르겠으나, 권한의 충돌이 생기는 것 같습니다.
상황은 다음과 같습니다.
Registrant
이고 Administrators
참가 상태에서 대회 > 참가자 목록에서 오른쪽 상단의 버튼이
[대회 나가기]로 보여야 하는 데, [대회 입장하기] 로 보인다.
2020년부터 지원 중단되는 python 2 문제도 있고,
Django 2.x 에서 더 이상 python 2.x 를 지원하지 않습니다.
이 레퍼지토리의 베이스인 DMOJ에서는 이미 업데이트를 한 듯 한데, 어떻게 적용할 지는 고민이 필요합니다.
로그아웃 안하고 브라우저를 종료하면 여러 사람이 돌아가면서 쓰는 컴퓨터실 특성 상 개인정보가 노출될 가능성이 높으므로 수정 요망
문제를 복제하면 복제되는 문제의 문제코드는 기존 문제코드에 _clone이 붙는데,
문제코드에는 언더바가 허용되지 않기 때문에 복제까지는 되는데 수정시 오류가 발생합니다.
지금은 markdown 에디터로 작성되고 있는 데, WYSIWYG 에디터인 summernote로 바꾸는 건 어떨까 싶네요.
django의 위젯으로도 있는 것 같고, (https://github.com/summernote/django-summernote) 무료이지만 기존에 작성된 글들을 전부 WYSIWYG에 맞게 수정해야 하는 큰 산이 생기겠군요.
수식(MathJax) 작성 지원도 되기는 합니다. (https://github.com/thisroot/summernote-equation-plugin)
참고로 트게더에서 이 에디터를 사용하고 있습니다.
OperationalError at /problems/
(1191, "Can't find FULLTEXT index matching the column list")
Full text search 옵션을 체크하면 위와 같은 에러
site 디렉토리에서 locale/ko/LC_MESSAGES/django.po
파일을 수정하면 됩니다.
변경 사항을 사이트에 적용하는 방법
(venv) $ python manage.py compilemessages
(venv) $ python manage.py compilejsi18n
NoReverseMatch at /admin/auth/user/8/change/
Reverse for 'judge_profile_change' with arguments '('',)' not found. 1 pattern(s) tried: [u'admin/judge/profile/(.+)/change/$']
사용자 아이디랑 비밀번호 입력 후 [저장] 을 누르면 위와 같은 에러가 나네요.
하지만 사용자는 정상적으로 추가된 상황입니다.
저장 후 편집 페이지로 넘어가는 url을 못 찾는 거 같네요.
django에서는 정적 파일을 특정 디렉토리에 따로 저장하여 제공합니다.
debug 모드에서는 django 앱이 연결해주지만, production 모드에서는 그렇지 않기 때문에 웹 서버(nginx, Apache 등)에서 그 디렉토리를 지정해주어야 합니다.
static 디렉토리(settings.py에서 STATIC_ROOT로 적힌 이름)는 resources 디렉토리를 아래 커맨드로 컴파일하여 생성합니다:
$ python manage.py collectstatic
이에 대한 자세한 내용은 아래를 참고하세요.
https://docs.djangoproject.com/ko/1.11/howto/static-files/
https://docs.djangoproject.com/ko/1.11/ref/contrib/staticfiles/#django-admin-collectstatic
문제는 resource를 통해서만 만들어야 하는 static 디렉토리를 직접 수정하였고, 이를 push 했습니다.
https://github.com/alps-jbnu/litmus-site/commits/a2c857dae416c4dea85233fc542a5da26f99fc56/static
위 커밋을 토대로 resources의 파일들을 수정하고, static 디렉토리를 지우고 새롭게 생성(하거나 무시)해야합니다.
공개 대회에서 접근 코드를 이용하여 대회를 만들었을 때 만든 사람 본인도 접근 코드를 넣어야해서 불편함
현재 문제 데이터 압축 파일을 업로드할 때 제출 버튼을 눌러줘야 적용이 되는데, 처음 사용하는 사람들은 당황할 것 같습니다. 적용 버튼을 따로 만드는 게 좋아 보입니다.
연단위 운영진의 변경과 함께 간편한 프로젝트 실무자의 인수인계를 위해서
#3 와 함께 Github Wiki에 프로젝트를 운영, 유지보수, 오류 해결을 위한 추가적인 Documentation이 필요.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.