私は自分の怠惰な性質を認識しており、時々いくつかの基本的な暗算を行うように自分をプッシュする必要があります。したがって、私は定期的に短い暗算演習(プラス、マイナス、乗算、除算)を行うように要求するソフトウェアを探しています。
基準:
- インターバル時間をカスタマイズできるようにする必要があります
- Ubuntuデスクトップに統合する必要があります。つまり、バックグラウンドで非表示にし、エクササイズ時にのみ表示(ポップアップ)します。
私は自分の怠惰な性質を認識しており、時々いくつかの基本的な暗算を行うように自分をプッシュする必要があります。したがって、私は定期的に短い暗算演習(プラス、マイナス、乗算、除算)を行うように要求するソフトウェアを探しています。
基準:
回答:
以下のスクリプトは、ランダムに割り当てを生成、します+、- 、×と÷。スクリプトが使用できる最大数と、割り当て間の時間間隔を設定できます(設定する必要があります)。
割り当てはZenityの入力ウィンドウに表示されます。
答えが間違っている場合:
答えが正しい場合:
#!/usr/bin/env python3
from random import randint
import sys
import subprocess
import time
# maximum number & interval
max_n = int(sys.argv[1]); pause = int(sys.argv[2])
def fix_float(n):
"""
if the assignment is a division, the script divides the random number by a
number (integer) it can be divided by. it looks up those numbers, and picks
one of them (at random). if the number is a prime number the assignment is
changed into another type
"""
try:
divs = [i for i in range(2, n) if n%i == 0]
pick = randint(1, len(divs))
div_by = divs[pick-1]
return [str(n)+" : "+str(div_by), int(n/div_by)]
except (ValueError, IndexError):
pass
def get_assignment():
"""
get a random number within the user defined range, make the assignment and
the textual presentation
"""
n1 = randint(2, max_n); n2 = randint(2, max_n)
assignments = [
[str(n1)+" + "+str(n2), n1+n2],
[str(n1)+" - "+str(n2), n1-n2],
[str(n1)+" x "+str(n2), n1*n2],
fix_float(n1),
]
# pick an assignment (type) at random
assignment = assignments[randint(0, 3)]
# if the random number is a prime number and the assignment a division...
assignment = assignment if assignment != None else assignments[1]
# run the interface job
try:
answer = int(subprocess.check_output(["/bin/bash", "-c",
'zenity --entry --title="Think hard:" --text='+'"'+assignment[0]+'"'
]).decode("utf-8"))
if answer == assignment[1]:
subprocess.Popen(["notify-send", "Coolcool"])
else:
subprocess.Popen([
"notify-send", "Oooops, "+assignment[0]+\
" = "+str(assignment[1])])
except (subprocess.CalledProcessError, ValueError):
pass
while True:
time.sleep(pause)
get_assignment()
mindpractice.py
最大許容数と割り当て間の間隔時間(秒単位)を引数として実行します。
python3 /path/to/mindpractice.py <max_number> <interval>
例えば
python3 /path/to/mindpractice.py 1000 300
1000
割り当ての間に5分の休憩を入れて、の数値まで計算します。
すべて正常に動作する場合は、通常の方法で起動アプリケーションに追加するか、トグルするランチャーを作成できます。後で追加する場合があります。
計算を開始すると、100までの数値を掛けるよりも、100の数値まで(たとえば、100に)割り算するほうがはるかに簡単であることがわかります。
以下のスクリプトを使用すると、エクササイズタイプごとの最大数を設定できます(設定する必要があります)(スクリプトの下の手順を参照)。
#!/usr/bin/env python3
from random import randint
import sys
import subprocess
import time
levels = sys.argv[1:]
pause = [int(arg.replace("p:", "")) for arg in levels if "p:" in arg][0]
def fix_float(n):
"""
if the assignment is a division, the script divides the random number by a
number (integer) it can be divided by. it looks up those numbers, and picks
one of them (at random). if the number is a prime number the assignment is
changed into another type
"""
try:
divs = [i for i in range(2, n) if n%i == 0]
pick = randint(1, len(divs))
div_by = divs[pick-1]
return [str(n)+" : "+str(div_by), int(n/div_by)]
except (ValueError, IndexError):
pass
def get_assignment():
"""
get a random number within the user defined range, make the assignment and
the textual presentation
"""
# pick an assignment (type) at random
track = randint(0, 3)
arg = ["a:", "s:", "m:", "d:"][track]
max_n = [int(item.replace(arg, "")) for item in levels if arg in item][0]
n1 = randint(2, max_n); n2 = randint(2, max_n)
assignments = [
[str(n1)+" + "+str(n2), n1+n2],
[str(n1)+" - "+str(n2), n1-n2],
[str(n1)+" x "+str(n2), n1*n2],
fix_float(n1),
]
assignment = assignments[track]
# if the random number is a prime number and the assignment a division...
assignment = assignment if assignment != None else assignments[1]
# run the interface job
try:
answer = int(subprocess.check_output(["/bin/bash", "-c",
'zenity --entry --title="Think hard:" --text='+'"'+assignment[0]+'"'
]).decode("utf-8"))
if answer == assignment[1]:
subprocess.Popen(["notify-send", "Coolcool"])
else:
subprocess.Popen([
"notify-send", "Oooops, "+assignment[0]+\
" = "+str(assignment[1])])
except (subprocess.CalledProcessError, ValueError):
pass
while True:
time.sleep(pause)
get_assignment()
最初のスクリプトとまったく同じようにスクリプトを設定しますが、引数を指定して実行します(任意の順序で、スクリプトは適切な引数を適切なアイテムにリンクします)。
p:
一時停止(割り当ての間を秒単位で中断))s:
減算(計算する最大数)a:
追加(最大数)m:
乗算(最大数)d:
除算(最大数)例えば:
python3 '/home/jacob/Desktop/num.py' a:10 d:100 s:10 m:10 p:300
5分ごとにエクササイズを表示するには、最大100までの除算を除いて、最大10までの数字を入力します。
以下のバージョンは、10回の練習ごとの統計を示しています。
さらに(子供に使用すると役立つ場合があります)、過去100回の不正解演習で問題が発生したことがわかります。隠しファイルには、課題とその(誤った)回答の両方が書き込まれます。
このログファイルは次の場所にあります:
~/.calculog
#!/usr/bin/env python3
from random import randint
import sys
import subprocess
import time
import os
log = os.environ["HOME"]+"/.calculog"
levels = sys.argv[1:]
pause = [int(arg.replace("p:", "")) for arg in levels if "p:" in arg][0]
def fix_float(n):
"""
if the assignment is a division, the script divides the random number by a
number (integer) it can be divided by. it looks up those numbers, and picks
one of them (at random). if the number is a prime number the assignment is
changed into another type
"""
try:
divs = [i for i in range(2, n) if n%i == 0]
pick = randint(1, len(divs))
div_by = divs[pick-1]
return [str(n)+" : "+str(div_by), int(n/div_by)]
except (ValueError, IndexError):
pass
def get_assignment():
"""
get a random number within the user defined range, make the assignment and
the textual presentation
"""
# pick an assignment (type) at random
track = randint(0, 3)
arg = ["a:", "s:", "m:", "d:"][track]
max_n = [int(item.replace(arg, "")) for item in levels if arg in item][0]
n1 = randint(2, max_n); n2 = randint(2, max_n)
assignments = [
[str(n1)+" + "+str(n2), n1+n2],
[str(n1)+" - "+str(n2), n1-n2],
[str(n1)+" x "+str(n2), n1*n2],
fix_float(n1),
]
assignment = assignments[track]
# if the random number is a prime number and the assignment a division...
assignment = assignment if assignment != None else assignments[1]
# run the interface job
try:
answer = int(subprocess.check_output(["/bin/bash", "-c",
'zenity --entry --title="Think hard:" --text='+'"'+assignment[0]+'"'
]).decode("utf-8"))
if answer == assignment[1]:
subprocess.Popen(["notify-send", "Coolcool"])
return "ok"
else:
subprocess.Popen([
"notify-send", "Oooops, "+assignment[0]+\
" = "+str(assignment[1])])
open(log, "+a").write(assignment[0]+"\t\t"+str(answer)+"\n")
try:
history = open(log).read().splitlines()
open(log, "wt").write(("\n").join(history[-100:])+"\n")
except FileNotFoundError:
pass
return "mistake"
except (subprocess.CalledProcessError, ValueError):
return None
results = []
while True:
time.sleep(pause)
results.append(get_assignment())
if len(results) >= 10:
score = results.count("ok")
subprocess.call([
"zenity", "--info",
'--title=Latest scores',
'--text='+str(score)+' out of 10',
'--width=160',
])
results = []
使用法はオプション2とほぼ同じですが、10個の割り当てごとに、ログファイルとスコアが利用可能になります。
以下のバージョンはオプション3(ログファイルとレポートを含む)に似ていますが、いくつかの追加機能があります。
平方根の計算を追加します
単に最大値を設定するのではなく、数値の範囲を使用して追加します
引数なしで実行された場合、前回実行された引数を記憶します(初回のみ、引数を設定する必要があります)。初回実行時に引数が設定されていない場合、スクリプトはメッセージを送信します。
#!/usr/bin/env python3
from random import randint
import sys
import subprocess
import time
import os
"""
Use this script to practice head count. Some explanation might be needed:
The script can be used for the following types of calculating:
Type argument example explanation
-------------------------------------------------------------------------------
add a:30-100 to add in numbers from 30-100
subtract s:10-100 to subtract in numbers from 10-100
multiply m:10-20 to multiply in numbers from 10-20
divide d:200-400 to divide in numbers from 200-400
square root r:1-1000 to find square root in numbers from 1-1000
N.B.
-------------------------------------------------------------------------------
- The argument p: (pause in seconds; break between the assignments) *must* be
set, for example: p:300 to launch an assignment every 5 minutes
- A calculation type will only run *if* the argument is set for the
corresponding type. An example: python3 /path/to/script p:60 s:30-60
will run a subtract- assignment every minute.
Miscellaneous information:
-------------------------------------------------------------------------------
- On first run, arguments *must* be set. After first run, when no arguments
are used the last set arguments will run, until the script is run with a new
set of arguments.
- A log file of the last 100 incorrectly answered questions is kept in
~/.calculog
- After 10 assignments, the score of the last 10 pops up.
"""
log = os.environ["HOME"]+"/.calculog"
prefs = os.environ["HOME"]+"/.calcuprefs"
levels = sys.argv[1:]
if levels:
open(prefs, "wt").write(str(levels))
else:
try:
levels = eval(open(prefs).read())
except FileNotFoundError:
subprocess.call([
"zenity", "--info",
'--title=Missing arguments',
'--text=On first run, the script needs to be run with arguments\n'
])
def fix_float(n):
"""
if the assignment is a division, the script divides the random number by a
number (integer) it can be divided by. it looks up those numbers, and picks
one of them (at random). if the number is a prime number the assignment is
changed into another type
"""
try:
divs = [i for i in range(2, n) if n%i == 0]
pick = randint(1, len(divs))
div_by = divs[pick-1]
return [str(n)+" : "+str(div_by), int(n/div_by)]
except (ValueError, IndexError):
pass
def fix_sqr(f1, f2):
"""
If the assignment is calculating a square root, this function finds the sets
of numbers (integers) that make a couple, within the given range.
"""
q = f1; r = q**(.5); sets = []
while q < f2:
r = q**(.5)
if r == int(r):
sets.append([int(r), int(q)])
q = q+1
if sets:
pick = sets[randint(0, len(sets)-1)]
return ["√"+str(pick[1]), pick[0]]
def get_assignment():
"""
get a random number within the user defined range, make the assignment and
the textual presentation
"""
args = ["a:", "s:", "m:", "d:", "r:"]
indc = []
for i, item in enumerate(args):
if item in str(levels):
indc.append(i)
index = indc[randint(0, len(indc)-1)]
name = args[index]
minmax = [
[int(n) for n in item.replace(name, "").split("-")] \
for item in levels if name in item][0]
assignment = None
# if the random number is a prime number *and* the assignment a division
# or a square root...
while assignment == None:
n1 = randint(minmax[0], minmax[1]); n2 = randint(minmax[0], minmax[1])
assignment = [
[str(n1)+" + "+str(n2), n1+n2],
[str(n1)+" - "+str(n2), n1-n2],
[str(n1)+" x "+str(n2), n1*n2],
fix_float(n1),
fix_sqr(minmax[0], minmax[1]),
][index]
# run the interface job
try:
answer = int(subprocess.check_output(["/bin/bash", "-c",
'zenity --entry --title="Think hard:" --text='+'"'+assignment[0]+'"'
]).decode("utf-8"))
if answer == assignment[1]:
subprocess.Popen(["notify-send", "Coolcool"])
return "ok"
else:
subprocess.Popen([
"notify-send", "Oooops, "+assignment[0]+\
" = "+str(assignment[1])])
open(log, "+a").write(assignment[0]+"\t\t"+str(answer)+"\n")
try:
history = open(log).read().splitlines()
open(log, "wt").write(("\n").join(history[-100:])+"\n")
except FileNotFoundError:
pass
return "mistake"
except (subprocess.CalledProcessError, ValueError):
return None
if levels:
pause = [int(arg.replace("p:", "")) for arg in levels if "p:" in arg][0]
[levels.remove(item) for item in levels if "p:" in item]
results = []
while True:
time.sleep(pause)
results.append(get_assignment())
if len(results) >= 10:
score = results.count("ok")
subprocess.call([
"zenity", "--info",
'--title=Latest scores',
'--text='+str(score)+' out of 10',
'--width=160',
])
results = []
スクリプトを空のファイルにコピーし、(再び)として保存しますmindpractice.py
。次のオプションを指定して実行します(例として)
設定する必要があります:
p:300 to set the interval between assignments to 5 minutes
オプション(選択を行います):
a:30-100 to add in numbers from 30-100 (optional)
s:10-100 to subtract in numbers from 10-100
m:10-20 to multiply in numbers from 10-20
d:200-400 to divide in numbers from 200-400
r:1-1000 to find square root in numbers from 1-1000
コマンドの例:
python3 '/path/to/mindpractice.py' p:300 d:10-100 s:10-30 r:300-600
設定するには:
p:300 to set the interval between assignments to 5 minutes
d:10-100 to divide in numbers from 10-100
s:10-30 to subtract in numbers from 10-30
r:300-600 to calculate square roots from 300-600
ながら加えると乗算が使用されていません。
次に、スクリプトが次のように実行された場合:
python3 '/path/to/mindpractice.py'
最後に使用された引数を記憶します
ニーズに最適なバージョンを使用してください...
Think Hard
前に仕事を完了するためのウィンドウを無視することがあります(たとえば、文章を書き終えるなど)。その後、ウィンドウのことを忘れます。5分後にThink Hard
ウィンドウが自動的にフォーカスを回復する可能性はありますか?
前書き:
次のアプリケーションは、ユーザーが評価するランダムな整数式を生成します。ランダムに生成される式の範囲は、メインポップアップウィンドウでのユーザーの設定によって異なります。Lets Beginボタンをクリックすると、ユーザーが[キャンセル]ボタンを押すまで、セッションが無期限に開始されます。
ソースコード:
#!/usr/bin/env python
# Author: Serg Kolo
# Date: Jan 30,2016
# Purpose: A graphical utility for practicing
# random arithmetic operations
# Written for: http://askubuntu.com/q/725287/295286
# Copyright: Serg Kolo , 2016
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import sys
import time
import random
from PyQt4 import QtGui
class mathApp(QtGui.QWidget):
def __init__(self):
super(mathApp,self).__init__()
self.mainMenu()
def mainMenu(self):
self.setGeometry(300, 300, 400, 200)
self.btn = QtGui.QPushButton("Let's begin",self)
self.btn.move(20,150)
self.btn.clicked.connect(self.askQuestions)
self.lbl1 = QtGui.QLabel(self)
self.lbl1.move(20,25)
self.lbl1.setText("Numbers From")
self.lbl2 = QtGui.QLabel(self)
self.lbl2.move(20,55)
self.lbl2.setText("Numbers To")
self.lbl2 = QtGui.QLabel(self)
self.lbl2.move(20,85)
self.lbl2.setText("Repeat (seconds)")
self.le1 = QtGui.QLineEdit(self)
self.le1.move(150,20)
self.le2 = QtGui.QLineEdit(self)
self.le2.move(150,50)
self.le3 = QtGui.QLineEdit(self)
self.le3.move(150,80)
self.lbl3 = QtGui.QLabel(self)
self.lbl3.move(20,105)
self.setWindowTitle('Random Integer Arithmetic')
self.show()
def askQuestions(self):
rangeStart = int(self.le1.text())
rangeEnd = int(self.le2.text())
sleepTime = int(self.le3.text())
done=False
while not done:
self.show()
expression = self.generateOperation(rangeStart,rangeEnd)
correctAnswer = eval(expression)
prompt = QtGui.QInputDialog()
text,ok = prompt.getText(self,"Don't think too hard",expression)
if ok:
if int(text) == correctAnswer:
self.showAnswer("CORRECT,YOU ROCK !")
else :
self.showAnswer("Nope");
else:
done=True
if done==True:
self.close()
time.sleep(sleepTime)
def generateOperation(self,start,end):
a = random.randint(start,end)
b = random.randint(start,end)
oplist = ['+','-','/','*']
op = oplist[random.randint(0,3)]
expr = str(a) + op + str(b) + ''
return expr
def showAnswer(self,result):
popup = QtGui.QMessageBox()
popup.setText(result)
popup.exec_()
def main():
root = QtGui.QApplication(sys.argv)
app = mathApp()
sys.exit(root.exec_())
if __name__ == '__main__':
main()
15/14 = 1
。このような演習がどれほど役立つかはわかりません。どう思いますか?
integer arithmetic
。つまり、結果は全体であり、残りではありません。よろしければ、decimal
算術演算も実装してみてください。また、他にどのようなオプションを実装して追加してほしいか教えてください。現在、私はagile development
方法を練習しようとしています、そして、クライアントとのコミュニケーションはそのような方法の鍵です。私にお知らせください。