skishore / inkstone Goto Github PK
View Code? Open in Web Editor NEWLearn Chinese on the go - no Internet connection required!
Home Page: https://www.skishore.me/inkstone/
License: GNU General Public License v3.0
Learn Chinese on the go - no Internet connection required!
Home Page: https://www.skishore.me/inkstone/
License: GNU General Public License v3.0
I added 5 words and after I reviewed them it said that I'm done for today.
It gave me two options:
There was no way to revisit all words one more time. It would be cool to revisit all the learned words and let the often wrong written ones pop up more frequently.
The Electron-based desktop binaries are quite slow and finicky to build. As a result, they're a few (currently, two) versions behind the Android app. This issue is a reminder to rebuild those sometime.
Do you mind adding an example on how to introduce a new character that is not foundd in the dictionary? For example 齣.
In v0.1.4, inkstone decides that「夾」's stroke order should be the middle「大」first and then two「人」s on the side.
This follows the general stroke order rule of writing the middle stroke first and then write the side strokes.
However, writing「夾」this way may accidentally leave too little room for the two「人」s on the side. Making the character look squashed. That's why many stroke order references decide to write「一」,「从」first, then the middle「人」
Quote from Wikipedia:
例如「夾」、「爽」兩字,若先寫中間(「大」部件),再寫左右(「从」部件、「㸚」部件),字體容易變得寬扁。因此正常的筆順,皆先寫「一」,再寫「从」或「㸚」部件,最後才寫「人」。
References that write「一」,「从」first, then the middle「人」:
筆順字典
萌典
漢字書き順辞典
香港小學學習字詞表
The 鬼 radical's traditional form has the bottom 丿 separate from the top 丨. However, the traditional form is not applied universally. In traditional-only characters like 醜, 鬼 has the traditional form. In shared characters like 愧, it still uses the simplified form.
Im still use an older version (0.0.8) and I'm half into learning the HSK 6 vocab. I got a new phone recently and wonder if there is a way to transfer my current status of already learned words to my new phone so I don't have to 'relearn' them. I didn't found any feature for that. Is there a way to manually do this?
Thanks in advance.
[17:03:02] git:(master) d33tah@d33tah-pc:/home/d33tah/workspace/src/inkstone/.build/android/project/cordova(0) > ./build --release
ANDROID_HOME=/home/d33tah/Android/Sdk
JAVA_HOME=/usr/lib/jvm/java-8-oracle
null
embedded
org.xwalk:xwalk_core_library:17+
:cdvCreateAssetManifest
:preBuild
:preArmv7ReleaseBuild
:checkArmv7ReleaseManifest
:preArmv7DebugBuild
:preX86DebugBuild
:preX86ReleaseBuild
:CordovaLib:preBuild UP-TO-DATE
:CordovaLib:preDebugBuild UP-TO-DATE
:CordovaLib:compileDebugNdk UP-TO-DATE
:CordovaLib:compileLint
:CordovaLib:copyDebugLint UP-TO-DATE
:CordovaLib:mergeDebugProguardFiles UP-TO-DATE
:CordovaLib:packageDebugRenderscript UP-TO-DATE
:CordovaLib:checkDebugManifest
:CordovaLib:prepareDebugDependencies
:CordovaLib:compileDebugRenderscript UP-TO-DATE
:CordovaLib:generateDebugResValues UP-TO-DATE
:CordovaLib:generateDebugResources UP-TO-DATE
:CordovaLib:packageDebugResources UP-TO-DATE
:CordovaLib:compileDebugAidl UP-TO-DATE
:CordovaLib:generateDebugBuildConfig UP-TO-DATE
:CordovaLib:generateDebugAssets UP-TO-DATE
:CordovaLib:mergeDebugAssets UP-TO-DATE
:CordovaLib:processDebugManifest UP-TO-DATE
:CordovaLib:processDebugResources UP-TO-DATE
:CordovaLib:generateDebugSources UP-TO-DATE
:CordovaLib:compileDebugJavaWithJavac UP-TO-DATE
:CordovaLib:processDebugJavaRes UP-TO-DATE
:CordovaLib:transformResourcesWithMergeJavaResForDebug UP-TO-DATE
:CordovaLib:transformClassesAndResourcesWithSyncLibJarsForDebug UP-TO-DATE
:CordovaLib:mergeDebugJniLibFolders UP-TO-DATE
:CordovaLib:transformNative_libsWithMergeJniLibsForDebug UP-TO-DATE
:CordovaLib:transformNative_libsWithSyncJniLibsForDebug UP-TO-DATE
:CordovaLib:bundleDebug UP-TO-DATE
:CordovaLib:preReleaseBuild UP-TO-DATE
:CordovaLib:compileReleaseNdk UP-TO-DATE
:CordovaLib:copyReleaseLint UP-TO-DATE
:CordovaLib:mergeReleaseProguardFiles UP-TO-DATE
:CordovaLib:packageReleaseRenderscript UP-TO-DATE
:CordovaLib:checkReleaseManifest
:CordovaLib:prepareReleaseDependencies
:CordovaLib:compileReleaseRenderscript UP-TO-DATE
:CordovaLib:generateReleaseResValues UP-TO-DATE
:CordovaLib:generateReleaseResources UP-TO-DATE
:CordovaLib:packageReleaseResources UP-TO-DATE
:CordovaLib:compileReleaseAidl UP-TO-DATE
:CordovaLib:generateReleaseBuildConfig UP-TO-DATE
:CordovaLib:generateReleaseAssets UP-TO-DATE
:CordovaLib:mergeReleaseAssets UP-TO-DATE
:CordovaLib:processReleaseManifest UP-TO-DATE
:CordovaLib:processReleaseResources UP-TO-DATE
:CordovaLib:generateReleaseSources UP-TO-DATE
:CordovaLib:compileReleaseJavaWithJavac UP-TO-DATE
:CordovaLib:processReleaseJavaRes UP-TO-DATE
:CordovaLib:transformResourcesWithMergeJavaResForRelease UP-TO-DATE
:CordovaLib:transformClassesAndResourcesWithSyncLibJarsForRelease UP-TO-DATE
:CordovaLib:mergeReleaseJniLibFolders UP-TO-DATE
:CordovaLib:transformNative_libsWithMergeJniLibsForRelease UP-TO-DATE
:CordovaLib:transformNative_libsWithSyncJniLibsForRelease UP-TO-DATE
:CordovaLib:bundleRelease UP-TO-DATE
:prepareComAndroidSupportSupportCompat2600Alpha1Library UP-TO-DATE
:prepareComAndroidSupportSupportCoreUi2600Alpha1Library UP-TO-DATE
:prepareComAndroidSupportSupportCoreUtils2600Alpha1Library UP-TO-DATE
:prepareComAndroidSupportSupportFragment2600Alpha1Library UP-TO-DATE
:prepareComAndroidSupportSupportMediaCompat2600Alpha1Library UP-TO-DATE
:prepareComAndroidSupportSupportV42600Alpha1Library UP-TO-DATE
:prepareOrgXwalkXwalk_core_library174644810Library UP-TO-DATE
:prepareProjectCordovaLibUnspecifiedReleaseLibrary UP-TO-DATE
:prepareArmv7ReleaseDependencies
:compileArmv7ReleaseAidl UP-TO-DATE
:compileArmv7ReleaseRenderscript UP-TO-DATE
:generateArmv7ReleaseBuildConfig UP-TO-DATE
:generateArmv7ReleaseAssets UP-TO-DATE
:mergeArmv7ReleaseAssets
:createXwalkCommandLineFileArmv7Release
:generateArmv7ReleaseResValues UP-TO-DATE
:generateArmv7ReleaseResources UP-TO-DATE
:mergeArmv7ReleaseResources UP-TO-DATE
:processArmv7ReleaseManifest UP-TO-DATE
:processArmv7ReleaseResources
:generateArmv7ReleaseSources
:compileArmv7ReleaseJavaWithJavac UP-TO-DATE
:compileArmv7ReleaseNdk UP-TO-DATE
:compileArmv7ReleaseSources UP-TO-DATE
:lintVitalArmv7Release[Fatal Error] :3:214: The value of attribute "name" associated with an element type "item" must not contain the '<' character.
Could not read /home/d33tah/Android/Sdk/platform-tools/api/annotations.zip
java.io.IOException: Could not parse XML from android/accounts/annotations.xml
at com.android.tools.lint.ExternalAnnotationRepository$AnnotationsDatabase.initializePackage(ExternalAnnotationRepository.java:658)
at com.android.tools.lint.ExternalAnnotationRepository$AnnotationsDatabase.initializeFromJar(ExternalAnnotationRepository.java:601)
at com.android.tools.lint.ExternalAnnotationRepository$AnnotationsDatabase.<init>(ExternalAnnotationRepository.java:402)
at com.android.tools.lint.ExternalAnnotationRepository.getDatabase(ExternalAnnotationRepository.java:214)
at com.android.tools.lint.ExternalAnnotationRepository.create(ExternalAnnotationRepository.java:153)
at com.android.tools.lint.ExternalAnnotationRepository.get(ExternalAnnotationRepository.java:134)
at com.android.tools.lint.EcjParser$EcjResolvedMethod.getAnnotations(EcjParser.java:1167)
at com.android.tools.lint.checks.SupportAnnotationDetector$CallVisitor.checkCall(SupportAnnotationDetector.java:1603)
at com.android.tools.lint.checks.SupportAnnotationDetector$CallVisitor.visitMethodInvocation(SupportAnnotationDetector.java:1574)
at com.android.tools.lint.client.api.JavaVisitor$DispatchVisitor.visitMethodInvocation(JavaVisitor.java:997)
at com.android.tools.lint.client.api.JavaVisitor$DelegatingJavaVisitor.visitMethodInvocation(JavaVisitor.java:1365)
at lombok.ast.MethodInvocation.accept(MethodInvocation.java:114)
at lombok.ast.BinaryExpression.accept(BinaryExpression.java:130)
at lombok.ast.VariableDefinitionEntry.accept(VariableDefinitionEntry.java:105)
at lombok.ast.VariableDefinition.accept(VariableDefinition.java:155)
at lombok.ast.VariableDeclaration.accept(VariableDeclaration.java:103)
at lombok.ast.NormalTypeBody.accept(NormalTypeBody.java:57)
at lombok.ast.ClassDeclaration.accept(ClassDeclaration.java:239)
at lombok.ast.CompilationUnit.accept(CompilationUnit.java:83)
at com.android.tools.lint.client.api.JavaVisitor.visitFile(JavaVisitor.java:272)
at com.android.tools.lint.client.api.LintDriver.checkJava(LintDriver.java:1527)
at com.android.tools.lint.client.api.LintDriver.runFileDetectors(LintDriver.java:1061)
at com.android.tools.lint.client.api.LintDriver.checkProject(LintDriver.java:906)
at com.android.tools.lint.client.api.LintDriver.analyze(LintDriver.java:435)
at com.android.tools.lint.client.api.LintDriver.analyze(LintDriver.java:376)
at com.android.tools.lint.LintCliClient.run(LintCliClient.java:128)
at com.android.build.gradle.internal.LintGradleClient.run(LintGradleClient.java:116)
at com.android.build.gradle.internal.LintGradleClient$run.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
at com.android.build.gradle.tasks.Lint.runLint(Lint.groovy:196)
at com.android.build.gradle.tasks.Lint.this$6$runLint(Lint.groovy)
at com.android.build.gradle.tasks.Lint$this$6$runLint$4.callCurrent(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:49)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:133)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:149)
at com.android.build.gradle.tasks.Lint.lintSingleVariant(Lint.groovy:171)
at com.android.build.gradle.tasks.Lint$lintSingleVariant$3.callCurrent(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:49)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:133)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:145)
at com.android.build.gradle.tasks.Lint.lint(Lint.groovy:73)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:63)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.doExecute(AnnotationProcessingTaskFactory.java:218)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:211)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:200)
at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:579)
at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:562)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46)
at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35)
at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:64)
at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:42)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53)
at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
at org.gradle.api.internal.AbstractTask.executeWithoutThrowingTaskFailure(AbstractTask.java:305)
at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.executeTask(AbstractTaskPlanExecutor.java:79)
at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:63)
at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:51)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:23)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:88)
at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:29)
at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:62)
at org.gradle.execution.DefaultBuildExecuter.access$200(DefaultBuildExecuter.java:23)
at org.gradle.execution.DefaultBuildExecuter$2.proceed(DefaultBuildExecuter.java:68)
at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32)
at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:62)
at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:55)
at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:149)
at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:106)
at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:86)
at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.run(InProcessBuildActionExecuter.java:80)
at org.gradle.launcher.cli.ExecuteBuildAction.run(ExecuteBuildAction.java:33)
at org.gradle.launcher.cli.ExecuteBuildAction.run(ExecuteBuildAction.java:24)
at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:36)
at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:26)
at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:47)
at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:34)
at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:119)
at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:35)
at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:119)
at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:24)
at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:119)
at org.gradle.launcher.daemon.server.exec.StartStopIfBuildAndStop.execute(StartStopIfBuildAndStop.java:33)
at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:119)
at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:71)
at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:69)
at org.gradle.util.Swapper.swap(Swapper.java:38)
at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:69)
at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:119)
at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:60)
at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:34)
at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:119)
at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:70)
at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:34)
at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:119)
at org.gradle.launcher.daemon.server.exec.DaemonHygieneAction.execute(DaemonHygieneAction.java:39)
at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:119)
at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:46)
at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:246)
at org.gradle.internal.concurrent.DefaultExecutorFactory$StoppableExecutorImpl$1.run(DefaultExecutorFactory.java:64)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
:transformClassesWithDexForArmv7Release UP-TO-DATE
:mergeArmv7ReleaseJniLibFolders UP-TO-DATE
:transformNative_libsWithMergeJniLibsForArmv7Release UP-TO-DATE
:processArmv7ReleaseJavaRes UP-TO-DATE
:transformResourcesWithMergeJavaResForArmv7Release UP-TO-DATE
:packageArmv7Release
:assembleArmv7Release
:checkX86ReleaseManifest
:prepareX86ReleaseDependencies
:compileX86ReleaseAidl UP-TO-DATE
:compileX86ReleaseRenderscript UP-TO-DATE
:generateX86ReleaseBuildConfig UP-TO-DATE
:generateX86ReleaseAssets UP-TO-DATE
:mergeX86ReleaseAssets
:createXwalkCommandLineFileX86Release
:generateX86ReleaseResValues UP-TO-DATE
:generateX86ReleaseResources UP-TO-DATE
:mergeX86ReleaseResources UP-TO-DATE
:processX86ReleaseManifest UP-TO-DATE
:processX86ReleaseResources
:generateX86ReleaseSources
:compileX86ReleaseJavaWithJavac UP-TO-DATE
:compileX86ReleaseNdk UP-TO-DATE
:compileX86ReleaseSources UP-TO-DATE
:lintVitalX86Release
:transformClassesWithDexForX86Release UP-TO-DATE
:mergeX86ReleaseJniLibFolders UP-TO-DATE
:transformNative_libsWithMergeJniLibsForX86Release UP-TO-DATE
:processX86ReleaseJavaRes UP-TO-DATE
:transformResourcesWithMergeJavaResForX86Release UP-TO-DATE
:packageX86Release
:assembleX86Release
:assembleRelease
:cdvBuildRelease
BUILD SUCCESSFUL
Total time: 26.08 secs
Built the following apk(s):
[17:03:33] git:(master) d33tah@d33tah-pc:/home/d33tah/workspace/src/inkstone/.build/android/project/cordova(0) >
Under traditional mode, direction of first stroke of「匕」under「老」appears inconsistent. Sometimes it is from left to right「一」, other times it is from right to left「丿」. I would recommend picking one of the stroke direction and stay consistent. It will be nice if it is also consistent with the direction in the standalone character「匕」.
I would love even a short paragraph on how the app works in the readme. Usually handwriting recognition takes a lot of machine learning/statistical techniques, which is why they would usually require an internet connection. How did you manage to make a handwriting app that runs without an internet connection?
「內」(入+冂) and「内」(人+冂) are different characters and should be differentiated just like other traditional vs simplified forms.
I have never seen such a great app for practicing the writing of multi character words.
If you can show me what to put in the Front, Styling, and Template fields I can play around with it and make it work well in anki. I am good at working with the anki templates, I can send you an example of my chinese deck if you want to see. As long as you can give me the coding and scripting for the templates as well as the .js file to save in the anki media folder, I can work this and I bet the results would reverberate through the entire Chinese studying anki community. Most folks just assume this is impossible I think, but would be incredibly excited to experience it.
I've tried to adapt the Matthias deck to work with multiple characters but the java just wasn't built for it and I'm no programmer. I did however manage to integrate it and make it look quite pretty on my cards. I just don't use it because so many of my cards use multiple characters.
A feature I really like in Anki is automatic leech suspension. When I fail a card a certain number of times that card is automatically taken out of circulation and I can use my time to study other cards that will likely be much easier to learn. Inkstone already has a blacklist feature, and it would be nice if it also had the ability to automatically blacklist leeches.
In your animation on adding handwriting shortcuts, you should the horizontal stroke on the 女 part of 好 comes last. Afaik, even in a shortcut, it should not be accepted usage to first write the horizontal stroke. But correct me if I'm wrong.
PS Will the shortcut also allow writing a squiggle for the 'fire'/'water' dots? I noticed Hanping Chinese which uses a handwriting recognition library is very good at recognizing such and other 'cursive' script.
「解」is composed of 「角」,「刀」and「牛」. In traditional chinese, the middle vertical stroke of「角」should not go past the second horizontal stroke. I think we should use the traditional form of 「解」when the user is in traditional mode. The same appliedms to the standalone 「角」character.
/
Hi, I just bought Inkstone on the AppStore and to my dismay it runs only in iPhone mode on the iPad meaning it takes about a 3rd of the screen rather than all of it.
In v0.1.4, yi3nei4 is rendered incorrectly as yǐn èi
「真」in traditional mode should not the same as the simplified. Please add the 「真」component found in「鎮」to remain consistent.
System:
Mac OS 10.12.5
Xcode 8.3.2
Swift 3.1
Meteor 1.5
It worked fine to compile the code with meteor
meteor add-platform ios
meteor build .build --server localhost:3785
When I opened the Xcode project in .build/ios it said the Swift code need to be converted to the latest version. I confirmed and the code was converted automatically. After that I tried to compile it with Xcode and got a lot of compile errors:
inkstone/.build/ios/project/Inkstone/Plugins/cordova-plugin-meteor-webapp/AssetBundleManager.swift:69:13: Initializer for conditional binding must have Optional type, not 'String'
inkstone/.build/ios/project/Inkstone/Plugins/cordova-plugin-meteor-webapp/AssetBundleManager.swift:212:10: Initializer for conditional binding must have Optional type, not '() -> URL'
inkstone/.build/ios/project/Inkstone/Plugins/cordova-plugin-meteor-webapp/AssetBundleManager.swift:267:65: Cannot force unwrap value of non-optional type 'String'
inkstone/.build/ios/project/Inkstone/Plugins/cordova-plugin-meteor-webapp/AssetBundleManager.swift:303:97: Expression resolves to an unused function
inkstone/.build/ios/project/Inkstone/Plugins/cordova-plugin-meteor-webapp/WebAppLocalServer.swift:93:25: Value of type 'Int' has no member 'uintValue'
inkstone/.build/ios/project/Inkstone/Plugins/cordova-plugin-meteor-webapp/WebAppLocalServer.swift:381:67: Value of optional type 'String?' not unwrapped; did you mean to use '!' or '?'?
inkstone/.build/ios/project/Inkstone/Plugins/cordova-plugin-meteor-webapp/WebAppLocalServer.swift:457:38: Cannot force unwrap value of non-optional type 'String'
inkstone/.build/ios/project/Inkstone/Plugins/cordova-plugin-meteor-webapp/WebAppLocalServer.swift:490:50: Cannot force unwrap value of non-optional type 'String'
inkstone/.build/ios/project/Inkstone/Plugins/cordova-plugin-meteor-webapp/Asset.swift:6:26: Cannot force unwrap value of non-optional type 'URL'
inkstone/.build/ios/project/Inkstone/Plugins/cordova-plugin-meteor-webapp/AssetBundleDownloader.swift:162:34: Cannot assign to property: 'URLComponents' is a 'let' constant
inkstone/.build/ios/project/Inkstone/Plugins/cordova-plugin-meteor-webapp/AssetBundleDownloader.swift:164:34: Cannot assign to property: 'URLComponents' is a 'let' constant
inkstone/.build/ios/project/Inkstone/Plugins/cordova-plugin-meteor-webapp/AssetBundleDownloader.swift:244:31: Value of type 'Error' has no member 'userInfo'
inkstone/.build/ios/project/Swift.Error:102:16: Did you mean '_userInfo'?
inkstone/.build/ios/project/Inkstone/Plugins/cordova-plugin-meteor-webapp/Utility.swift:80:11: 'getResourceValue(_:forKey:)' is unavailable: Use struct URLResourceValues and URL.setResourceValues(_:) instead
inkstone/.build/ios/project/Foundation.URL:251:17: 'getResourceValue(_:forKey:)' has been explicitly marked unavailable here
It seems to be a common issue with meteor. I'm just testing some suggested solutions.
I've previously used Heisig's "Remember the Hanzi" mnemonic system to study Chinese characters, and I found it to be a useful tool for remembering stubborn-to-learn characters. Inkstone already has a "Character Details" page (see screenshot below) that displays metadata for the characters you are currently studying. It would be nice if this metadata had another field for notes or mnemonics that could be edited by the user during a study session.
From skishore/makemeahanzi#19 (comment):
飛: Doesn't recognize strokes correctly in the upper part (mixes the stroke when drawing 飞)
盤: Doesn't recognize strokes for top right part (very hard to draw the second stroke of 几)
See title.
Very nice app! I like how it evaluates how good was the writing and helps you to memorize the correct order of each stroke.
I would suggest a character lookup as one additional feature. The field "For" really helps to visualize and remember each word. It would be great if we could review a word by searching it, as part of the process.
Would it be possible to add support for using Inkstone on the desktop? I tried running/building it for the browser, and it 95% worked already - there were mostly interface-rendering issues (and I had to enable "simulate touch events" mode).
When I completed a word and got it wrong I'd like to navigate back to write it one more time. Currently there is no back button that brings me back.
Keep up the good work!
Both appear in various references, but the 2nd tone is supposed to be more polite.
When writing multi-character words, the clear button clears all characters and there should be an option to only clear the current character.
For example, if I am writing a three character word and I make a mistake on the third character and I want to write it again. My only option is to clear the whole word.
current outputs 「興高採烈」
While having custom word lists are great, users may ocassionaly encounter new characters/phrases not on their lists. Having a custom search for characters/phrases built into Inkstone can help users practice them. As a bonus, users can optionally add them to one of their lists to do more spaced practices.
Hello, I am a beginner in learning Android app development, would like to ask which IDE is more suitable to edit and build the app using the source code?
hello all,
is there is an easy way to add character lists.
thanks in advance
Michael
Hi,
I've buy this app and thank you for develope it! I have some ideas after using it 1 day ago.
Custom words list:
Using offline it and allow upload custom words file is a good idea, but thinking I have a list of 100 words as example.
The first time I want learn 100 words, but after many times, some words I learned, some is not. I only want to learn some words of them, so it is helpful if I can create custom words (choose some words from the file I upload).
First, the app load the custom file I uploaded (can choose some files), list all words and have a checkbox to help me choose custom list from it.
Favorite words list:
This as type of custom words list above but I can mark the words when learning. It is useful!
Translate "Rad":
I want to translate "rad" when see word detail into my own language, this help me so much!
Add new words anywhere:
Imagining anytime you see a new word, you want to know it is and the way it writing. Although you can using another app to solve this. But it is wonderful if Inkstone can do this.
First I have a square to draw and the app suggestion the true one (for the words I don't know it), or have a text input for type pinyin (if I know its pinyin). The words after that added to a list for learning.
Add search function:
I can search the words by character or pinyin, its fuction as a dictionary.
Small improve:
I think blacklist button is not necessary, replace it with "skip" (or next) button. Because If I can choose my list, so nothing is blacklist, I only want to skip this words to write the next one. Skip button saving time.
Change icon "search" to "info", the detail information of the word is truely a info icon.
Thank you so much!
Hello !
It's seems that the app is no longer available in the Appstore, at least in France's Appstore and it appears in Brazilian Appstore as mentioned below.
Thank you very much !
It would be nice to have a stats page similar to what Anki has.
It would show you a pie chart of for example the following properties:
Total
, Unseen
, Correct
, Wrong
I've been trying to add this myself but I'm completely new to Meteor and I'm having a difficult time figuring out how it works.
In the /client/model/vocabulary.js
I figured out how to get the total number of words:
new Cursor(() => {}).count();
I tried to get all the failures like this:
new Cursor((entry) => entry[kIndices.failed]).count()
But this only returns the failures of the current 20 cards but not the previous ones
If you have any pointers for me on how I can achieve this, I would be very thankful!
Hello, I changed my phone and I'd like to transfer the files to another phone, but I can't seem to find the directory where data is saved in to copy it.
Where should it normally be? In data/com.skishore... ?
Is there a better way to do that?
I just discovered your project and it seems to envolve to a serious and free Skritter alternative. That's so awesome! I'd love to see an iOS or web version of Inkstone. I read that you're lacking of an iPhone. So why not add some common donation options to your README (for example PayPal or some crypto currencies). I'm pretty sure I'm not the only one who likes to see this open source project flourish.
Hi!
As we talked outside of Github, I'm trying to take over development of Inkstone and you approve it. Just so I have credibility and a proof there's no legal dispute, could you publicly confirm that I'm authorized to use the name Inkstone and continue the development of Inkstone under a separate repository, providing it free of charge under the same license, with no advertisements attached?
There should be an option to enforce correct Stoke order. Right now, sometimes I put in an incorrect stroke that comes later.
I can rarely get the second stroke to be recognized, unless it is almost pixel perfect.
We should have notifications for people who want them, probably with a choice of frequency (daily, every two days, weekly). See https://www.npmjs.com/package/cordova-plugin-push-notification.
There are days I'm only capable of learning 5 new words and there are days I'd like to learn more. There are also days I reach my word limit in the morning but still want to exercise some new words at night. To be more flexible I'd love to see the "write" view with a "+" button that adds a new word to my stack.
Currently the traditional character「潢」is mapped to it's simplified counterpart「潢」. Please consider adding the traditional form.
Hi! I love your app? Any chance you could put it in the F-Droid repository?
I've been using this app every day to study, and it seems like I always accidentally incorrectly score a few words each day (usually scoring the words I actually know as failures). It would be nice if the erase button (circled in red below) turned into an undo button when the app initially shows you the next word so you could go back and rescore the previous word if you made a scoring mistake.
The first dot under the right「馬」radical is currently immediately after the left「虫」radical. It should be after the top half of the right「馬」radical.
I'm not able to download Inkstone on Brazil’s App Store
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.