<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[HKNOIT]]></title><description><![CDATA[A beginner in programming journey.]]></description><link>https://hknoit.com/</link><image><url>https://hknoit.com/favicon.png</url><title>HKNOIT</title><link>https://hknoit.com/</link></image><generator>Ghost 5.49</generator><lastBuildDate>Mon, 30 Mar 2026 16:24:20 GMT</lastBuildDate><atom:link href="https://hknoit.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[React Native 常用指令記錄及Bugs解決方案]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x555F;&#x52D5;React Native debug&#x4F3A;&#x670D;&#x5668;: <code>react-native start</code><br>
&#x5EFA;&#x69CB;&#x6E2C;&#x8A66;&#x7528;Android APK: <code>npx react-native run-android</code><br>
&#x5EFA;&#x69CB;&#x751F;&#x7522;&#x7528;Android APK&#x4E26;&#x5B89;&#x88DD;&#x5728;&#x6307;&#x5B9A;&#x88DD;&#x7F6E;: <code>cd android; ./gradlew clean; cd ..; npx react-native run-android --variant=release --deviceId=XXXXXXXXXXX</code><br>
&#x5EFA;&#x69CB;aab</p>]]></description><link>https://hknoit.com/react-native-commands/</link><guid isPermaLink="false">647c479bb7ec24000134c3d9</guid><category><![CDATA[React Native]]></category><category><![CDATA[Programming]]></category><dc:creator><![CDATA[Ken]]></dc:creator><pubDate>Mon, 26 Dec 2022 07:00:00 GMT</pubDate><media:content url="https://hknoit.com/content/images/2022/03/react-native-1024x631.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://hknoit.com/content/images/2022/03/react-native-1024x631.png" alt="React Native &#x5E38;&#x7528;&#x6307;&#x4EE4;&#x8A18;&#x9304;&#x53CA;Bugs&#x89E3;&#x6C7A;&#x65B9;&#x6848;"><p>&#x555F;&#x52D5;React Native debug&#x4F3A;&#x670D;&#x5668;: <code>react-native start</code><br>
&#x5EFA;&#x69CB;&#x6E2C;&#x8A66;&#x7528;Android APK: <code>npx react-native run-android</code><br>
&#x5EFA;&#x69CB;&#x751F;&#x7522;&#x7528;Android APK&#x4E26;&#x5B89;&#x88DD;&#x5728;&#x6307;&#x5B9A;&#x88DD;&#x7F6E;: <code>cd android; ./gradlew clean; cd ..; npx react-native run-android --variant=release --deviceId=XXXXXXXXXXX</code><br>
&#x5EFA;&#x69CB;aab bundle: <code>./gradlew bundleRelease</code></p>
<p>&#x6253;&#x958B;debug menu: <code>adb shell input keyevent 82</code><br>
&#x67E5;&#x770B;&#x5DF2;&#x9023;&#x63A5;&#x88DD;&#x7F6E;&#x6216;&#x6A21;&#x64EC;&#x5668;: <code>adb devices</code></p>
<p>&#x67E5;&#x770B;adb device ID: <code>adb devices</code><br>
&#x5B89;&#x88DD;APK: <code>adb -s &lt;device-id&gt; install ./android/app/build/outputs/apk/debug/app-debug.apk</code></p>
<p>&#x5B89;&#x88DD;POD&#xFF1A;<code>pod install</code><br>
&#x89E3;&#x9664;POD&#xFF1A;<code>pod deintegrate</code><br>
&#x5EFA;&#x69CB;&#x65B0;&#x7684;main.jsbundle&#xFF1A;<code>npx react-native bundle --platform ios --entry-file index.js --bundle-output ./ios/main.jsbundle --assets-dest  ./ios/assets</code><br>
&#x5EFA;&#x69CB;release&#x7248;&#x672C;&#x7684;main.jsbundle&#xFF1A;<code>react-native bundle --entry-file index.js --dev false --reset-cache --bundle-output main.jsbundle</code><br>
(<code>--dev false</code>&#x4F86;&#x907F;&#x514D;<a href="https://github.com/facebook/react-native/issues/26987?ref=hknoit.com">&apos;DevSettings&apos; could not be found&#x554F;&#x984C;</a>)</p>
<p><strong>React native &#x521D;&#x6B21;&#x5EFA;&#x69CB;&#x6E2C;&#x8A66; bug:</strong><br>
<code>Android Studio Could not initialize classorg.codehaus.groovy.runtime.InvokerHelper</code><br>
&#x4EE3;&#x8868;gradle&#x8207;java&#x7248;&#x672C;&#x4E0D;&#x5408;&#xFF0C;&#x53C3;&#x8003;<a href="https://docs.gradle.org/current/userguide/compatibility.html?ref=hknoit.com">Gradle&#x7DB2;&#x9801;</a> &#xFF0C;&#x53EF;&#x4F7F;&#x7528;sdkman&#x8F49;&#x7528;&#x4E0D;&#x540C;java&#x7248;&#x672C;&#xFF08;&#x5982;java 11)&#xFF0C;&#x6216;&#x5230;<code>&lt;project-path&gt;/android/gradle/wrapper/gradle-wrapper.properties</code>&#x5167;&#x6539;&#x8B8A;gradle version&#x7684;&#x4E0B;&#x8F09;&#x5730;&#x5740;<br>
&#x8A3B;: react native&#x76EE;&#x524D;&#x4E0D;&#x652F;&#x63F4;gradle 7&#x6216;&#x4EE5;&#x4E0A;&#x7248;&#x672C;</p>
<p>mac&#x7248;&#x672C;&#x9700;&#x8981;&#x7528;<code>sudo npx react-native run-android</code>&#x4F86;&#x9632;&#x6B62;&#x5EFA;&#x69CB;&#x7A0B;&#x5E8F;&#x6709;&#x6B0A;&#x9650;&#x554F;&#x984C;</p>
<h2 id="reactnativebugs">React native Bugs</h2>
<p>&#x5716;&#x7247;&#x7121;&#x6CD5;&#x986F;&#x793A;&#xFF1A;<a href="https://stackoverflow.com/questions/63949851/react-native-ios-not-showing-images-pods-issue?ref=hknoit.com">https://stackoverflow.com/questions/63949851/react-native-ios-not-showing-images-pods-issue</a></p>
<hr>
<p>No matching function for call to &apos;RCTBridgeModuleNameForClass&apos;&#xFF1A;<a href="https://stackoverflow.com/questions/67287092/react-native-ios-sdk-no-matching-function-for-call-to-rctbridgemodulenamefor?ref=hknoit.com">https://stackoverflow.com/questions/67287092/react-native-ios-sdk-no-matching-function-for-call-to-rctbridgemodulenamefor</a></p>
<hr>
<p>CFBundleIdentifier does not exist on react-native&#xFF1A;<a href="https://stackoverflow.com/questions/65580385/cfbundleidentifier-does-not-exist-on-react-native?ref=hknoit.com">https://stackoverflow.com/questions/65580385/cfbundleidentifier-does-not-exist-on-react-native</a></p>
<hr>
<p>Unable to prepare XYZ&apos;s iPhone for development:<br>
&#x66F4;&#x65B0;Xcode&#x4F86;&#x652F;&#x63F4;&#x65B0;iOS&#x7248;&#x672C;&#xFF0C;<a href="https://stackoverflow.com/a/71274820?ref=hknoit.com">https://stackoverflow.com/a/71274820</a></p>
<hr>
<p>&#x7121;&#x6CD5;&#x4F7F;&#x7528;<code>react-native run-ios</code>&#x4F86;&#x5EFA;&#x69CB;iOS&#x61C9;&#x7528;,&#x5EFA;&#x69CB;&#x6642;&#x51FA;&#x73FE;&#x932F;&#x8AA4;&#xFF1A;<br>
<code>phasescriptexecution [cp-user]\ generate\ specs (in target &apos;fbreactnativespec&apos; from project &apos;pods&apos;)</code></p>
<p>&#x89E3;&#x6C7A;&#x65B9;&#x6CD5;&#xFF1A;<br>
&#x9700;&#x8981;&#x5728;<code>node_modules/react-native/scripts/find-node.sh</code>&#x4E2D;&#x52A0;&#x5165;&#xFF1A;</p>
<pre><code class="language-javascript">unset npm_config_prefix #add this line
unset PREFIX
</code></pre>
<hr>
<p>&#x5728;&#x65B0;&#x589E;&#x81EA;&#x8A02;&#x5B57;&#x9AD4;&#x6642;&#x7121;&#x6CD5;&#x5EFA;&#x69CB;Android app&#xFF0C;&#x5728;&#x5EFA;&#x69CB;&#x6642;&#x51FA;&#x73FE;<code>Duplicate resources android build error</code><br>
&#x89E3;&#x6C7A;&#x65B9;&#x6CD5;&#xFF1A;<a href="https://github.com/oblador/react-native-vector-icons/issues/1416?ref=hknoit.com#issuecomment-1042519618">https://github.com/oblador/react-native-vector-icons/issues/1416#issuecomment-1042519618</a><br>
&#x82E5;Android&#x4ECD;&#x7121;&#x6CD5;&#x986F;&#x793A;&#x5B57;&#x9AD4;&#xFF0C;&#x53EF;&#x4EE5;&#x5C07;&#x5B57;&#x9AD4;&#x8907;&#x88FD;&#x5230;<code>android/app/src/main/assets/fonts</code>&#x5167;<br>
&#x9806;&#x5E36;&#x8A18;&#x9304;&#x65B0;&#x589E;&#x5B57;&#x9AD4;&#x65B9;&#x6CD5;&#xFF1A;<a href="https://mehrankhandev.medium.com/ultimate-guide-to-use-custom-fonts-in-react-native-77fcdf859cf4?ref=hknoit.com">https://mehrankhandev.medium.com/ultimate-guide-to-use-custom-fonts-in-react-native-77fcdf859cf4</a></p>
<hr>
<p>In-app review not shown in iOS device (dev mode):<br>
<a href="https://stackoverflow.com/questions/45057452/why-the-skstorereviewcontroller-does-not-let-me-submit-a-review?ref=hknoit.com">https://stackoverflow.com/questions/45057452/why-the-skstorereviewcontroller-does-not-let-me-submit-a-review</a></p>
<hr>
<p>Error: plugin with id &apos;maven&apos; not found.<br>
Solution: comment <code>apply plugin: &apos;maven&apos;</code> in <code>build.gradle</code><br>
add maven in <code>buildscript &gt; repositories</code> and <code>repositories</code></p>
<pre><code class="language-javascript">buildscript {
    ...
    repositories {
        ...
        maven {url &apos;maven url&apos;}
    }
}

repositories {
    ...
    maven {url &apos;maven url&apos;}
}
</code></pre>
<hr>
<p>Xcode Error:</p>
<pre><code>&quot;Communication with Apple failed. You are not allowed to perform this operation. Please check with one of your Team Admins, or, if you need further assistance, please contact Apple Developer Program Support, https://developer.apple.com/support&quot;

&quot;No profiles for &apos;&lt;bundle_id&gt;&apos; were found. Xcode couldn&apos;t find any iOS App Store provisioning profiles matching &apos;&lt;bundle_id&apos;&gt;.&quot;
</code></pre>
<p>&#x82E5;&#x7F3A;&#x5931;&#x7684;profile&#x662F;M1 Mac&#x7684;&#x8A71;&#xFF0C;&#x7531;&#x65BC;&#x4F7F;&#x7528;Rosetta&#x6703;&#x6539;&#x8B8A;Device ID&#xFF0C;&#x5728;Application/Xcode&#x4E2D;&#x52FE;&#x9078;<code>&#x4F7F;&#x7528;Rosetta&#x6253;&#x958B;</code>&#x4F86;&#x555F;&#x7528;&#x6216;&#x505C;&#x7528;rosetta&#x5373;&#x53EF;&#x89E3;&#x6C7A;&#x3002;</p>
<hr>
<p>React Native Keyevent &#x7121;&#x6CD5;&#x53D6;&#x5F97;&#x5982;Enter&#x7B49;&#x90E8;&#x4EFD;&#x975E;&#x6578;&#x5B57;/&#x5B57;&#x6BCD;&#x7684;Keyevent<br>
Android&#x9700;&#x8981;&#x5728;<code>MainApplication.java</code>&#x52A0;&#x5165;</p>
<pre><code class="language-java">@Override
  public boolean dispatchKeyEvent(KeyEvent event) {
    if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER {
       if (event.getAction() == KeyEvent.ACTION_UP){
         KeyEventModule.getInstance().onKeyUpEvent(event.getKeyCode(), event);
         return true;
       }
    }
    return super.dispatchKeyEvent(event);
  }
</code></pre>
<p>&#x53C3;&#x8003;&#x4F86;&#x6E90;&#xFF1A;<a href="https://stackoverflow.com/questions/43361599/react-native-catch-volume-buttons-press-not-for-volume-adjusting?ref=hknoit.com">https://stackoverflow.com/questions/43361599/react-native-catch-volume-buttons-press-not-for-volume-adjusting</a></p>
<p>iOS&#x9700;&#x8981;&#x5728;<code>RNKeyEvent.m</code>&#x4E2D;&#x4FEE;&#x6539;<code>getKeys</code></p>
<pre><code>- (NSString *)getKeys {
    return  [NSString stringWithFormat:@&quot;!,1,2,3,4,5,6,7,8,9,0,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,~,-,\r,%@,%@,%@,%@, &quot;,UIKeyInputLeftArrow, UIKeyInputRightArrow, UIKeyInputUpArrow, UIKeyInputDownArrow]; // insert &quot; &quot;(space) after &quot;%@,&quot;
}
</code></pre>
<p>&#x53E6;&#x5916;&#x5728;KeyEvent.onKeyUpListener&#x4E2D;&#x7684;keyEventiOS&#x53EA;&#x6709;pressedKey&#x503C;&#x8FD4;&#x56DE;&#xFF0C;&#x6240;&#x4EE5;&#x9700;&#x8981;&#x7528;<code>String.fromCharCode(13)</code>&#x6838;&#x5C0D;&#x8F38;&#x5165;&#x9375;&#xFF0C;&#x5982;:</p>
<pre><code class="language-javascript">useEffect(() =&gt; {
    KeyEvent.onKeyUpListener(keyEvent =&gt; {
        if (keyEvent.pressedKey === String.fromCharCode(13)){
            ...
        }
        ...
    }
    ...
}, [])
</code></pre>
<hr>
<p>Android: Changes are not tracked, unable determine incremental changes.</p>
<p>Solution1:<br>
Clean Project by <code>cd android; ./gradlew clean; cd ..;</code></p>
<p>Solution2:<br>
Check if there is any invisible or redundant asset in <code>android/app/src/main/assets</code></p>
<hr>
<p>Error: resource android:attr/lStar not found</p>
<p>&#x932F;&#x8AA4;&#x4FE1;&#x606F;&#xFF1A;</p>
<pre><code>Execution failed for task &apos;:&lt;npm_package_name&gt;:verifyReleaseResources&apos;.
&gt; A failure occurred while executing com.android.build.gradle.tasks.VerifyLibraryResourcesTask$Action
   &gt; Android resource linking failed
     ERROR:&lt;path_to_gradle&gt;/.gradle/caches/transforms-3/8ac0773c96f54a55e0dcd22123615930/transformed/core-1.7.0/res/values/values.xml:105:5-114:25: AAPT: error: resource android:attr/lStar not found.
</code></pre>
<p>&#x5C07;&#x5F15;&#x8D77;&#x554F;&#x984C;&#x7684;node_module&#x4E2D;&#x7684;compileSdkVersion,targetSdkVersion&#x8A2D;&#x6210;31<br>
&#x5982;<code>node_modules/&lt;npm_package_name&gt;/android/build.gradle</code>&#xFF1A;</p>
<pre><code>android {
    compileSdkVersion 31
    ...
    defaultConfig {
        ...
        targetSdkVersion 31
    }
}
</code></pre>
<hr>
<p>Error: The `pod&apos; command exists in these Ruby versions: 2.7.5<br>
Note: &#x7121;&#x8AD6;&#x66F4;&#x65B0;ruby&#x5230;&#x751A;&#x9EBC;&#x7248;&#x672C;&#x90FD;&#x6703;&#x986F;&#x793A;&#x6B64;&#x932F;&#x8AA4;<br>
&#x89E3;&#x6C7A;&#x65B9;&#x6CD5;&#x53C3;&#x8003;&#xFF1A;<a href="https://qiita.com/TakaKun/items/80043d1fb437c625c81b?ref=hknoit.com">https://qiita.com/TakaKun/items/80043d1fb437c625c81b</a></p>
<pre><code>brew upgrade rbenv
brew upgrade ruby-build
rbenv install 2.4.1
rbenv global 2.4.1
gem install cocoapods
rbenv rehash
pod setup
pod install
</code></pre>
<hr>
<p>&#x66F4;&#x65B0;xcode 15&#x5F8C; firebase&#x51FA;&#x73FE;An attribute list cannot appear here<br>
&#x89E3;&#x6C7A;&#x65B9;&#x6CD5;&#x53C3;&#x8003;&#xFF1A;<a href="https://github.com/firebase/firebase-ios-sdk/issues/11840?ref=hknoit.com#issuecomment-1738875602">https://github.com/firebase/firebase-ios-sdk/issues/11840#issuecomment-1738875602</a></p>
<p>in Xcode, go to FIRFirestoreSettings.mm file, look for(go to pods, and you will see FIRbaseFirestore folder, open it);-</p>
<pre><code>ABSL_CONST_INIT extern &quot;C&quot; const int64_t kFIRFirestoreCacheSizeUnlimited =
    Settings::CacheSizeUnlimited;
</code></pre>
<p>&#x8F49;&#x70BA;</p>
<pre><code>extern &quot;C&quot; const int64_t kFIRFirestoreCacheSizeUnlimited =
Settings::CacheSizeUnlimited;
</code></pre>
<p>Command PhaseScriptExecution failed with a nonzero exit code<br>
&#x89E3;&#x6C7A;&#x65B9;&#x6CD5;&#x53C3;&#x8003;&#xFF1A;<a href="https://github.com/facebook/react-native/issues/36762?ref=hknoit.com#issuecomment-1535910492">https://github.com/facebook/react-native/issues/36762#issuecomment-1535910492</a><br>
&#x4FEE;&#x6539;<code>node_modules/react-native/scripts/find-node.sh</code></p>
<pre><code>set +e
</code></pre>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[React Native IAP 設定記錄]]></title><description><![CDATA[上次使用的react-native-iap版本5.x，現在已經更新到10.0.1，documentation都有點改動，套用原來的代碼就會有點問題，所以記錄一下React Native IAP的設定記錄。]]></description><link>https://hknoit.com/react-native-iap/</link><guid isPermaLink="false">647c479bb7ec24000134c3e2</guid><category><![CDATA[React Native]]></category><category><![CDATA[In App Purchase]]></category><dc:creator><![CDATA[Ken]]></dc:creator><pubDate>Sun, 28 Aug 2022 17:19:46 GMT</pubDate><content:encoded><![CDATA[<p>&#x6700;&#x8FD1;&#x5728;&#x7FFB;&#x65B0;&#x904E;&#x53BB;&#x5BEB;&#x7684;React Native&#x61C9;&#x7528;&#x7A0B;&#x5F0F;&#xFF0C;&#x56E0;&#x70BA;&#x820A;&#x6709;&#x4EE3;&#x78BC;&#x96E3;&#x4EE5;&#x7DAD;&#x8B22;&#xFF08;&#x7528;&#x4E86;expo&#x3001;&#x5BEB;&#x592A;&#x721B;&#x3001;&#x6240;&#x7528;&#x7684;NPM Package&#x5DF2;&#x68C4;&#x7528;&#x7B49;&#x7B49;&#xFF09;&#xFF0C;&#x9700;&#x8981;&#x6574;&#x500B;App&#x91CD;&#x65B0;&#x7DE8;&#x5BEB;&#x904E;&#xFF0C;&#x7576;&#x4E2D;&#x9700;&#x8981;&#x7528;&#x5230;In App Purchase&#x529F;&#x80FD;&#x4F86;&#x6536;&#x6B3E;&#xFF0C;&#x5728;React Native&#x4E2D;&#xFF0C;&#x6BD4;&#x8F03;&#x53D7;&#x89C0;&#x8FCE;&#x7684;&#x6709;expo-in-app-purchases&#x548C;react-native-iap&#xFF0C;&#x7531;&#x65BC;&#x4E0A;&#x6B21;&#x4EA6;&#x662F;&#x7528;&#x4E86;react-native-iap&#xFF0C;&#x80FD;&#x5920;&#x91CD;&#x7528;&#x820A;&#x6709;&#x7684;&#x4EE3;&#x78BC;&#xFF0C;&#x52A0;&#x4E0A;&#x9019;&#x6B21;&#x8981;&#x812B;&#x96E2;expo&#xFF0C;&#x6240;&#x4EE5;&#x4ECD;&#x7136;&#x662F;&#x63A1;&#x7528;react-native-iap&#x3002;</p><p>&#x4E0D;&#x904E;&#x4E0A;&#x6B21;&#x4F7F;&#x7528;&#x7684;react-native-iap&#x7248;&#x672C;5.x&#xFF0C;&#x73FE;&#x5728;&#x5DF2;&#x7D93;&#x66F4;&#x65B0;&#x5230;10.0.1&#xFF0C;documentation&#x90FD;&#x6709;&#x9EDE;&#x6539;&#x52D5;&#xFF0C;&#x5957;&#x7528;&#x539F;&#x4F86;&#x7684;&#x4EE3;&#x78BC;&#x5C31;&#x6703;&#x6709;&#x9EDE;&#x554F;&#x984C;&#xFF0C;&#x6240;&#x4EE5;&#x8A18;&#x9304;&#x4E00;&#x4E0B;React Native IAP&#x7684;&#x8A2D;&#x5B9A;&#x8A18;&#x9304;&#xFF1A;</p><!--kg-card-begin: markdown--><ol>
<li><code>npm i react-native-iap</code> &#x5148;&#x5B89;&#x88DD;React Native IAP<br>
&#x6309;&#x7167;docs&#x8A2D;&#x5B9A;IAP: <a href="https://react-native-iap.dooboolab.com/docs/installing?ref=hknoit.com">https://react-native-iap.dooboolab.com/docs/installing</a></li>
<li>&#x5728;&#x8F09;&#x5165;&#x61C9;&#x7528;&#x6642;&#x521D;&#x59CB;&#x5316;&#x6642;&#x52A0;&#x5165;</li>
</ol>
<pre><code class="language-javascript">const itemSkus = Platform.select({
    ios: [&apos;product_name&apos;],
    android: [&apos;product_name&apos;],
});

await initConnection();
await getProducts({skus: itemSkus});
</code></pre>
<p><strong>&#x6309;&#x7167;docs&#xFF0C;<code>itemSkus</code>&#x662F;&#x76F4;&#x63A5;pass&#x5230;<code>getProducts()</code>&#x88CF;&#x9762;&#xFF0C;&#x4F46;&#x5BE6;&#x969B;&#x662F;&#x8981;pass&#x4E00;&#x500B;object&#xFF0C;&#x7576;&#x4E2D;&#x7684;<code>skus</code>&#x624D;&#x662F;&#x8981;pass<code>itemSkus</code>&#xFF0C;&#x5426;&#x5247;&#x6703;&#x7121;&#x6CD5;&#x53D6;&#x5F97;&#x76F8;&#x61C9;&#x7684;&#x7522;&#x54C1;</strong><br>
3. &#x5728;&#x521D;&#x59CB;&#x5316;&#x6642;(getProducts&#x5F8C;)&#x8A2D;&#x5B9A;&#x4ED8;&#x6B3E;listener&#xFF08;&#x53EA;&#x6709;Android&#x5B8C;&#x6210;&#x4ED8;&#x6B3E;&#x5F8C;&#x624D;&#x6703;&#x89F8;&#x767C;listener&#x88CF;&#x9762;&#x7684;&#x52D5;&#x4F5C;&#xFF09;&#xFF0C;iOS&#x53EF;&#x4EE5;&#x5728;<code>await requestPurchase()</code>&#x5F8C;&#x8A2D;&#x5B9A;&#x4ED8;&#x6B3E;&#x5F8C;&#x7684;&#x52D5;&#x4F5C;<br>
&#x53C3;&#x8003;docs: <a href="https://react-native-iap.dooboolab.com/docs/usage_instructions/purchase?ref=hknoit.com">https://react-native-iap.dooboolab.com/docs/usage_instructions/purchase</a></p>
<pre><code class="language-javascript">await flushFailedPurchasesCachedAsPendingAndroid();
purchaseUpdateSubscription = purchaseUpdatedListener(
    async purchase =&gt; {
        const receipt = purchase?.transactionReceipt;
        if (receipt) {
            await finishTransaction({purchase}, false);
            await iapHook.getAvailablePurchases();
            // ... show success message
        }
    },
);
purchaseErrorSubscription = purchaseErrorListener(error =&gt; {
    if (error.responseCode === 7) {
      // ... show already purchased error message
    }
// ... show error messages
});
</code></pre>
<p><strong>&#x6309;&#x7167;docs&#xFF0C;<code>purchase</code>&#x662F;&#x76F4;&#x63A5;pass&#x5230;<code>finishTransaction()</code>&#x88CF;&#x9762;&#xFF0C;&#x4F46;&#x5BE6;&#x969B;&#x662F;&#x8981;pass&#x4E00;&#x500B;object&#xFF0C;&#x7576;&#x4E2D;&#x7684;<code>purchase</code>&#x624D;&#x662F;&#x8981;pass<code>purchase</code>&#xFF0C;&#x5426;&#x5247;&#x7121;&#x6CD5;&#x5B8C;&#x6210;&#x6574;&#x904E;&#x4ED8;&#x6B3E;&#x9A57;&#x8B49;&#x904E;&#x7A0B;&#xFF0C;&#x7D50;&#x679C;Google Play&#x6703;&#x4E0D;&#x65B7;&#x9000;&#x6B3E;</strong><br>
&#x540C;&#x6642;&#x5728;&#x9EDE;&#x64CA;&#x8CFC;&#x8CB7;&#x7684;&#x4F4D;&#x7F6E;&#x52A0;&#x5165;&#x8ACB;&#x6C42;&#x4ED8;&#x6B3E;&#x7684;function:</p>
<pre><code class="language-javascript">const rp = async (sku) =&gt; {
    try {
      await requestPurchase({
        sku,
        andDangerouslyFinishTransactionAutomaticallyIOS: false,
      });
    } catch (err) {
      console.warn(err.code, err.message);
    }
  };
</code></pre>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[DirectAdmin "Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)"]]></title><description><![CDATA[<p>&#x539F;&#x56E0;&#x70BA;&#x672A;&#x555F;&#x7528;mysql&#xFF0C;&#x8F38;&#x5165;</p><pre><code class="language-bash">service mysqld start</code></pre><p>&#x5373;&#x53EF;&#x3002;</p><p></p><p>Reference</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://docs.directadmin.com/other-hosting-services/mariadb-mysql/troubleshooting.html?ref=hknoit.com#can-t-connect-to-local-mysql-server-through-socket-var-lib-mysql-mysql-sock-2"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Troubleshooting | Directadmin Docs</div><div class="kg-bookmark-description"></div><div class="kg-bookmark-metadata"><span class="kg-bookmark-author">Directadmin Docs</span></div></div></a></figure>]]></description><link>https://hknoit.com/directadmin/</link><guid isPermaLink="false">647c479bb7ec24000134c3e1</guid><category><![CDATA[DirectAdmin]]></category><dc:creator><![CDATA[Ken]]></dc:creator><pubDate>Thu, 20 Jan 2022 08:39:16 GMT</pubDate><content:encoded><![CDATA[<p>&#x539F;&#x56E0;&#x70BA;&#x672A;&#x555F;&#x7528;mysql&#xFF0C;&#x8F38;&#x5165;</p><pre><code class="language-bash">service mysqld start</code></pre><p>&#x5373;&#x53EF;&#x3002;</p><p></p><p>Reference</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://docs.directadmin.com/other-hosting-services/mariadb-mysql/troubleshooting.html?ref=hknoit.com#can-t-connect-to-local-mysql-server-through-socket-var-lib-mysql-mysql-sock-2"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Troubleshooting | Directadmin Docs</div><div class="kg-bookmark-description"></div><div class="kg-bookmark-metadata"><span class="kg-bookmark-author">Directadmin Docs</span></div></div></a></figure>]]></content:encoded></item><item><title><![CDATA[Android notes]]></title><description><![CDATA[My android problem collections]]></description><link>https://hknoit.com/android-notes/</link><guid isPermaLink="false">647c479bb7ec24000134c3e0</guid><category><![CDATA[Android]]></category><category><![CDATA[JAVA]]></category><dc:creator><![CDATA[Ken]]></dc:creator><pubDate>Sun, 31 Oct 2021 10:36:30 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>ActionBar is scrolled up when using adjustpan<br>
Use case: chat<br>
Solution: <a href="https://stackoverflow.com/a/61058679?ref=hknoit.com">https://stackoverflow.com/a/61058679</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[在Linux使用puppeteer前的準備]]></title><description><![CDATA[在linux上安裝nodejs及pm2來使用puppeteer]]></description><link>https://hknoit.com/preparation-for-puppeteer-on-linux/</link><guid isPermaLink="false">647c479bb7ec24000134c3df</guid><category><![CDATA[Linux]]></category><category><![CDATA[Nodejs]]></category><dc:creator><![CDATA[Ken]]></dc:creator><pubDate>Mon, 02 Aug 2021 13:34:46 GMT</pubDate><content:encoded><![CDATA[<p>&#x5B89;&#x88DD;nodejs</p><p><code>sudo apt install nodejs npm</code></p><p>&#x7528;apt&#x5B89;&#x88DD;&#x7684;Package&#x901A;&#x5E38;&#x662F;&#x820A;&#x7248;&#xFF0C;&#x9700;&#x8981;&#x66F4;&#x65B0;&#x4E00;&#x4E0B;nodejs&#xFF1A;</p><p><code>sudo npm install -g n</code></p><p><code>sudo n stable</code></p><p>&#x5B89;&#x88DD;pm2</p><p><code>npm install pm2 -g</code></p><p>&#x70BA;&#x514D;&#x5728;&#x4F7F;&#x7528;puppeteer&#x524D;&#x6709;&#x4EFB;&#x4F55;&#x554F;&#x984C;&#xFF0C;&#x9700;&#x8981;&#x5B89;&#x88DD;&#x4EE5;&#x4E0B;Packages&#xFF1A;</p><pre><code class="language-bash">sudo apt-get update &amp;&amp; apt-get install -y gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget</code></pre><p>&#x4F7F;&#x7528;pm2</p><p>&#x9700;&#x8981;&#x5148;&#x65B0;&#x589E;non-root user&#xFF1A;</p><p><code>adduser ken</code></p><p><code>su - ken</code></p><p>&#x518D;&#x555F;&#x52D5;pm2</p><p><code>pm2 start app.js --name myapp</code></p>]]></content:encoded></item><item><title><![CDATA[記錄在Linux/Docker裏編輯中文文件]]></title><description><![CDATA[最近要在docker裏編輯一個含有中文的文件，但由於系統沒有設置成UTF8環境，需要額外調較。]]></description><link>https://hknoit.com/enable-utf8-in-docker-and-linux/</link><guid isPermaLink="false">647c479bb7ec24000134c3de</guid><category><![CDATA[Linux]]></category><dc:creator><![CDATA[Ken]]></dc:creator><pubDate>Sat, 17 Jul 2021 05:50:48 GMT</pubDate><content:encoded><![CDATA[<p>&#x6700;&#x8FD1;&#x8981;&#x5728;docker&#x88CF;&#x7DE8;&#x8F2F;&#x4E00;&#x500B;&#x542B;&#x6709;&#x4E2D;&#x6587;&#x7684;&#x6587;&#x4EF6;&#xFF0C;&#x4F46;&#x7531;&#x65BC;&#x7CFB;&#x7D71;&#x6C92;&#x6709;&#x8A2D;&#x7F6E;&#x6210;UTF8&#x74B0;&#x5883;&#xFF0C;&#x9700;&#x8981;&#x984D;&#x5916;&#x8ABF;&#x8F03;&#x3002;</p><p>&#x53C3;&#x7167;&#xFF1A;<a href="https://unix.stackexchange.com/questions/303712/how-can-i-enable-utf-8-support-in-the-linux-console?ref=hknoit.com">https://unix.stackexchange.com/questions/303712/how-can-i-enable-utf-8-support-in-the-linux-console</a></p><!--kg-card-begin: markdown--><p>&#x5B89;&#x88DD;locales<br>
<code>apt-get install locales</code><br>
&#x8A2D;&#x7F6E;locale<br>
<code>dpkg-reconfigure locales</code><br>
&#x9078;&#x597D;&#x81EA;&#x5DF1;&#x60F3;&#x8981;&#x7684;&#x8A9E;&#x7CFB;&#xFF0C;&#x8F38;&#x5165;&#x5C0D;&#x61C9;&#x865F;&#x78BC;&#xFF08;&#x5982;464&#x7684;zh_HK.UTF-8&#xFF09;<br>
&#x6DFB;&#x52A0;&#x5230;<code>~/.bashrc</code>&#x6A94;&#x4E2D;&#x6DFB;&#x52A0;&#x4EE5;&#x4E0B;&#x8CC7;&#x6599;<br>
<code>nano ~/.bashrc</code></p>
<pre><code>export LC_ALL=zh_HK.UTF-8
export LANG=zh_HK.UTF-8
export LANGUAGE=zh_HK.UTF-8
</code></pre>
<p>&#x91CD;&#x65B0;&#x555F;&#x52D5;docker container&#x5373;&#x53EF;<br>
<code>docker restart CONTAINER_ID</code></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[透過Caddy2 Reverse Proxy來為Docker Container連接域名]]></title><description><![CDATA[最近在嘗試為多個Docker container連接域名，不用常常輸入IP:Port來連接網站。在比較Nginx和Caddy2的設置難度後，選擇了Caddy2。]]></description><link>https://hknoit.com/caddy2-reverse-proxy/</link><guid isPermaLink="false">647c479bb7ec24000134c3dd</guid><category><![CDATA[Linux]]></category><category><![CDATA[Caddy]]></category><category><![CDATA[Caddy2]]></category><category><![CDATA[Docker]]></category><dc:creator><![CDATA[Ken]]></dc:creator><pubDate>Sun, 27 Jun 2021 06:14:26 GMT</pubDate><media:content url="https://hknoit.com/content/images/2021/06/v2-landing.png" medium="image"/><content:encoded><![CDATA[<img src="https://hknoit.com/content/images/2021/06/v2-landing.png" alt="&#x900F;&#x904E;Caddy2 Reverse Proxy&#x4F86;&#x70BA;Docker Container&#x9023;&#x63A5;&#x57DF;&#x540D;"><p>&#x6700;&#x8FD1;&#x5728;&#x5617;&#x8A66;&#x70BA;&#x591A;&#x500B;Docker container&#x9023;&#x63A5;&#x57DF;&#x540D;&#xFF0C;&#x4E0D;&#x7528;&#x5E38;&#x5E38;&#x8F38;&#x5165;IP:Port&#x4F86;&#x9023;&#x63A5;&#x7DB2;&#x7AD9;&#x3002;&#x5728;&#x6BD4;&#x8F03;Nginx&#x548C;Caddy2&#x7684;&#x8A2D;&#x7F6E;&#x96E3;&#x5EA6;&#x5F8C;&#xFF0C;&#x9078;&#x64C7;&#x4E86;Caddy2&#x3002;&#x4E00;&#x4F86;&#x662F;&#x56E0;&#x70BA;Caddy&#x8A2D;&#x7F6E;&#x6C92;&#x6709;Nginx&#x9019;&#x9EBC;&#x7E41;&#x7463;&#xFF08;&#x53EF;&#x80FD;&#x662F;&#x56E0;&#x70BA;&#x6211;&#x5C0D;Nginx&#x4E86;&#x89E3;&#x5F88;&#x5C11;&#xFF0C;&#x8ACB;&#x898B;&#x8AD2;&#xFF09;&#xFF0C;&#x4E8C;&#x4F86;&#x662F;Caddy&#x6703;&#x81EA;&#x52D5;&#x8A2D;&#x7F6E;https&#xFF0C;&#x4E0D;&#x7528;&#x5B89;&#x88DD;cerbot&#x4F86;&#x7372;&#x53D6;https&#x8B49;&#x66F8;&#x3002;</p><p><strong>&#x5B89;&#x88DD;Caddy2</strong></p><p><a href="https://caddyserver.com/docs/install?ref=hknoit.com">&#x6309;&#x7167;&#x5B98;&#x65B9;&#x8AAA;&#x660E;&#xFF0C;&#x76F4;&#x63A5;copy&amp;paste&#x6307;&#x4EE4;&#x5373;&#x53EF;</a>&#x3002;&#x7531;&#x65BC;&#x6211;&#x662F;&#x7528;Ubuntu&#xFF0C;&#x9019;&#x908A;&#x7684;&#x6307;&#x4EE4;&#x6703;&#x662F;Ubuntu&#x3001;Debian&#x3001;Raspbian&#x5C08;&#x7528;&#x3002;</p><!--kg-card-begin: markdown--><pre><code class="language-shell">sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf &apos;https://dl.cloudsmith.io/public/caddy/stable/gpg.key&apos; | sudo apt-key add -
curl -1sLf &apos;https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt&apos; | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy
</code></pre>
<!--kg-card-end: markdown--><p><strong>&#x4F7F;&#x7528;Caddy2</strong></p><p>&#x5230;&#x76EE;&#x9304;&#x4E0B;&#x5EFA;&#x7ACB;&#x4E00;&#x500B;&#x540D;&#x53EB;Caddyfile&#x7684;&#x6587;&#x4EF6;&#xFF0C;&#x6309;&#x9700;&#x8981;&#x52A0;&#x5165;reverse_proxy&#x4EE3;&#x78BC;&#x3002;</p><!--kg-card-begin: markdown--><p><code>sudo nano Caddyfile</code></p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><pre><code>example1.com {
  reverse_proxy 127.0.0.1:3000
}

example2.com {
  reverse_proxy 127.0.0.1:3001
}
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><p>&#x8A2D;&#x7F6E;&#x597D;DNS&#x7684;A&#x8A18;&#x9304;(&#x6307;&#x5411;&#x4F3A;&#x670D;&#x5668;IP)&#xFF0C;&#x518D;&#x8F38;&#x5165;<code>caddy start</code>&#x5373;&#x53EF;&#xFF0C;&#x540C;&#x6642;Caddy&#x6703;&#x81EA;&#x52D5;&#x53D6;&#x5F97;SSL&#x8B49;&#x66F8;&#xFF0C;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x4F7F;&#x7528;https&#x9023;&#x63A5;&#x7DB2;&#x7AD9;&#x3002;</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[為IPv6-only VPS 添加IPv4連接 (Ubuntu 20.04)]]></title><description><![CDATA[<p>&#x53C3;&#x8003;&#xFF1A;<a href="https://askubuntu.com/questions/1237685/changing-the-dns-servers-ubuntu-server-20-04-arm64-raspi?ref=hknoit.com">Changing the DNS servers Ubuntu Server 20.04 - Arm64 (Raspi) - Ask Ubuntu</a></p><!--kg-card-begin: markdown--><ol>
<li><code>cd /etc/netplan</code></li>
<li><code>nano 50-cloud-init.yaml</code></li>
<li>
<pre><code class="language-network:">ethernets:
    [network-device]:
        ...
        nameservers:
            addresses: [&apos;2a01:4f9:c010:3f02::1&apos;,&apos;2a00:1098:2c::1&apos;,&apos;2a00:1098:2b::1&apos;]
</code></pre>
</li>
<li><code>netplan apply</code></li>
<li><code>systemd-resolve --status</code></li></ol>]]></description><link>https://hknoit.com/add-ipv4-access-for-ipv6-only-vps/</link><guid isPermaLink="false">647c479bb7ec24000134c3dc</guid><category><![CDATA[Linux]]></category><dc:creator><![CDATA[Ken]]></dc:creator><pubDate>Wed, 21 Apr 2021 09:21:37 GMT</pubDate><content:encoded><![CDATA[<p>&#x53C3;&#x8003;&#xFF1A;<a href="https://askubuntu.com/questions/1237685/changing-the-dns-servers-ubuntu-server-20-04-arm64-raspi?ref=hknoit.com">Changing the DNS servers Ubuntu Server 20.04 - Arm64 (Raspi) - Ask Ubuntu</a></p><!--kg-card-begin: markdown--><ol>
<li><code>cd /etc/netplan</code></li>
<li><code>nano 50-cloud-init.yaml</code></li>
<li>
<pre><code class="language-network:">ethernets:
    [network-device]:
        ...
        nameservers:
            addresses: [&apos;2a01:4f9:c010:3f02::1&apos;,&apos;2a00:1098:2c::1&apos;,&apos;2a00:1098:2b::1&apos;]
</code></pre>
</li>
<li><code>netplan apply</code></li>
<li><code>systemd-resolve --status</code></li>
</ol>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><p><code>2a01:4f9:c010:3f02::1,2a00:1098:2c::1,2a00:1098:2b::1</code>&#x70BA;<a href="https://nat64.xyz/?ref=hknoit.com">NAT64</a>&#x7684;Nameservers</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[解決xrdp連接後立即閃退問題]]></title><description><![CDATA[解決在Linux VPS安裝xrdp後，使用Remote Desktop Connection時連接時會閃退的問題。]]></description><link>https://hknoit.com/xrdp-disconnects-immediately/</link><guid isPermaLink="false">647c479bb7ec24000134c3db</guid><category><![CDATA[Linux]]></category><category><![CDATA[xrdp]]></category><category><![CDATA[學習筆記]]></category><dc:creator><![CDATA[Ken]]></dc:creator><pubDate>Thu, 04 Mar 2021 04:29:48 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x5728;Linux VPS&#x5B89;&#x88DD;xrdp&#x5F8C;&#xFF0C;&#x4F7F;&#x7528;Remote Desktop Connection&#x6642;&#x9023;&#x63A5;&#x6642;&#x6703;&#x9583;&#x9000;&#x3002;<br>
&#x5F9E;<a href="https://unix.stackexchange.com/questions/523152/xrdp-disconnects-immediately-after-connection-from-windows10-centos-to-centos7?ref=hknoit.com">StackExchange</a>&#x7684;&#x56DE;&#x7B54;&#x627E;&#x5230;&#x7B54;&#x6848;&#xFF0C;&#x4EE5;&#x9632;&#x65E5;&#x5F8C;&#x518D;&#x9700;&#x8981;&#x89E3;&#x6C7A;&#x6B64;&#x554F;&#x984C;&#xFF0C;&#x7279;&#x6B64;&#x8A18;&#x9304;&#x3002;</p>
<blockquote>
<p>Try this:</p>
<p>Stop xrdp with sudo service xrdp stop</p>
<p>Edit the xrdp start script: sudo nano /etc/xrdp/startwm.sh</p>
<p>In this file, replace the lines</p>
<p>test -x /etc/X11/Xsession &amp;&amp; exec /etc/X11/Xsession<br>
exec /bin/sh /etc/X11/Xsession</p>
<p>with startxfce4</p>
<p>(You can comment out lines by adding # at the start)</p>
<p>Restart xrdp with sudo service xrdp start</p>
<p>Select Xrdp as the session, and log in.</p>
</blockquote>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[ffmpeg - 合併多條影片]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x6700;&#x65B0;&#x9700;&#x8981;&#x5408;&#x4F75;&#x591A;&#x689D;&#x5F71;&#x7247;&#xFF0C;&#x7528;&#x4E0A;&#x4E86;ffmpeg&#xFF0C;&#x5728;&#x9019;&#x88E1;&#x4F5C;&#x4E00;&#x500B;&#x8A18;&#x9304;&#x3002;</p>
<p>&#x5148;&#x65B0;&#x589E;&#x4E00;&#x500B;&#x6A94;&#x6848; videos.txt&#xFF0C;&#x5167;&#x5BB9;&#x70BA;&#xFF1A;</p>
<pre><code>file video1.mp4
file video2.mp4
file video3.mp4
</code></pre>
<p>&#x5728;&#x8A72;</p>]]></description><link>https://hknoit.com/ffmpeg-concat-mp4/</link><guid isPermaLink="false">647c479bb7ec24000134c3da</guid><category><![CDATA[ffmpeg]]></category><dc:creator><![CDATA[Ken]]></dc:creator><pubDate>Sat, 16 Jan 2021 01:12:32 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x6700;&#x65B0;&#x9700;&#x8981;&#x5408;&#x4F75;&#x591A;&#x689D;&#x5F71;&#x7247;&#xFF0C;&#x7528;&#x4E0A;&#x4E86;ffmpeg&#xFF0C;&#x5728;&#x9019;&#x88E1;&#x4F5C;&#x4E00;&#x500B;&#x8A18;&#x9304;&#x3002;</p>
<p>&#x5148;&#x65B0;&#x589E;&#x4E00;&#x500B;&#x6A94;&#x6848; videos.txt&#xFF0C;&#x5167;&#x5BB9;&#x70BA;&#xFF1A;</p>
<pre><code>file video1.mp4
file video2.mp4
file video3.mp4
</code></pre>
<p>&#x5728;&#x8A72;&#x76EE;&#x9304;&#x4E0B;&#x904B;&#x884C; <code>ffmpeg -safe 0 -f concat -i videos.txt -c copy output.mp4</code></p>
<p>&#x53C3;&#x8003;&#x4F86;&#x6E90;&#xFF1A;<a href="https://stackoverflow.com/questions/7333232/how-to-concatenate-two-mp4-files-using-ffmpeg?ref=hknoit.com">https://stackoverflow.com/questions/7333232/how-to-concatenate-two-mp4-files-using-ffmpeg</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[在NAT VPS架設Nginx + PHP]]></title><description><![CDATA[<p>&#x6700;&#x8FD1;&#x8CB7;&#x4E86;&#x4E00;&#x500B;128MB ram&#x7684;nat vps&#x4F86;&#x8A66;&#x8A66;&#xFF0C;&#x4E4B;&#x524D;&#x7528;&#x7684;VPS&#x90FD;&#x6709;&#x7368;&#x7ACB;IP&#xFF0C;&#x5C31;&#x8A18;&#x9304;&#x4E00;&#x4E0B;&#x5728;&#x9019;&#x53F0;VPS&#x4E0A;&#x67B6;&#x8A2D;Nginx + PHP&#x3002; </p><h2 id="-">&#x57DF;&#x540D;</h2><h3 id="-dns">&#x66F4;&#x65B0;DNS</h3><ol><li>&#x5728;solusvm&#x63A7;&#x5236;</li></ol>]]></description><link>https://hknoit.com/nat-vps-nginx-php/</link><guid isPermaLink="false">647c479bb7ec24000134c3d8</guid><category><![CDATA[nginx]]></category><category><![CDATA[php]]></category><category><![CDATA[vps]]></category><dc:creator><![CDATA[Ken]]></dc:creator><pubDate>Wed, 15 Apr 2020 07:47:43 GMT</pubDate><media:content url="https://hknoit.com/content/images/2020/04/natvps.png" medium="image"/><content:encoded><![CDATA[<img src="https://hknoit.com/content/images/2020/04/natvps.png" alt="&#x5728;NAT VPS&#x67B6;&#x8A2D;Nginx + PHP"><p>&#x6700;&#x8FD1;&#x8CB7;&#x4E86;&#x4E00;&#x500B;128MB ram&#x7684;nat vps&#x4F86;&#x8A66;&#x8A66;&#xFF0C;&#x4E4B;&#x524D;&#x7528;&#x7684;VPS&#x90FD;&#x6709;&#x7368;&#x7ACB;IP&#xFF0C;&#x5C31;&#x8A18;&#x9304;&#x4E00;&#x4E0B;&#x5728;&#x9019;&#x53F0;VPS&#x4E0A;&#x67B6;&#x8A2D;Nginx + PHP&#x3002; </p><h2 id="-">&#x57DF;&#x540D;</h2><h3 id="-dns">&#x66F4;&#x65B0;DNS</h3><ol><li>&#x5728;solusvm&#x63A7;&#x5236;&#x53F0;&#x627E;&#x5230;IPv6&#x5730;&#x5740;</li></ol><figure class="kg-card kg-image-card"><img src="https://hknoit.com/content/images/2020/04/image-1.png" class="kg-image" alt="&#x5728;NAT VPS&#x67B6;&#x8A2D;Nginx + PHP" loading="lazy"></figure><figure class="kg-card kg-image-card"><img src="https://hknoit.com/content/images/2020/04/image-2.png" class="kg-image" alt="&#x5728;NAT VPS&#x67B6;&#x8A2D;Nginx + PHP" loading="lazy"></figure><p>2.&#x5728;Cloudflare&#x8A2D;&#x7F6E;AAAA&#x8A18;&#x9304;</p><figure class="kg-card kg-image-card"><img src="https://hknoit.com/content/images/2020/04/image-3.png" class="kg-image" alt="&#x5728;NAT VPS&#x67B6;&#x8A2D;Nginx + PHP" loading="lazy"></figure><h2 id="vps">VPS </h2><h3 id> </h3><h3 id="-apt">&#x66F4;&#x65B0;apt</h3><p><code>apt-get update<br>apt-get upgrade </code></p><h3 id="-nginx">&#x5B89;&#x88DD;nginx</h3><p><code>apt-get install nginx</code></p><h3 id="-php-php-fpm">&#x5B89;&#x88DD;php&#x548C;php-fpm</h3><p><code>apt install php7.3 php7.3-fpm</code></p><h3 id="-nginx-1">&#x8A2D;&#x7F6E;Nginx</h3><p>&#x65B0;&#x589E;nginx server block <br><code>nano /etc/nginx/sites-available/example.com</code></p><p><code>ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/</code><br></p><!--kg-card-begin: markdown--><pre><code>server {
        #https settings
		listen 443;
		listen [::]:443;
		ssl on;
		ssl_certificate /etc/nginx/ssl/ssl.pem;
		ssl_certificate_key /etc/nginx/ssl/ssl.key;
		ssl_session_timeout  5m;
		#ssl_protocols  SSLv2 SSLv3 TLSv1;
		ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        
        #basic web settings
        root /var/www/example.com/html;
        index index.php index.html index.htm index.nginx-debian.html;

        server_name example.com www.example.com;
		
		location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
			
			fastcgi_split_path_info ^(.+\.php)(/.+)$;
			include fastcgi_params;
			fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
        }
        
		#grav settings
		location / {
			try_files $uri $uri/ /index.php?_url=$uri&amp;$query_string;
		}

		location ~* ^/(\.git|cache|bin|logs|backup|tests)/.*$ {
			return 403;
		}

		location ~* ^/(\.git|cache|bin|logs|backup|tests)/.*$ {
			return 403;
		}

		location ~* ^/(system|vendor)/.*\.(txt|xml|md|html|yaml|yml|php|pl|py|cgi|twig|sh|bat)$ {
			return 403;
		}

		location ~* ^/user/.*\.(txt|md|yaml|yml|php|pl|py|cgi|twig|sh|bat)$ {
			return 403;
		}

		location ~ ^/(LICENSE\.txt|composer\.lock|composer\.json|nginx\.conf|web\.config|htaccess\.txt|\.htaccess) {
			return 403;
		}
}

server {
    #http redirects
    listen 80;
	listen [::]:80;
    server_name server_name example.com www.example.com;
    return 301 https://example.com$request_uri;
}
</code></pre>
<!--kg-card-end: markdown--><p>HTTPS</p><p>&#x5230;Cloudflare - SSL/TLS - Origin Server - Create Certificate &#x53D6;&#x5F97; certificate&#x548C; private key&#xFF0C;&#x5132;&#x5B58;&#x70BA;ssl.key&#x548C;ssl.pem&#xFF0C;&#x518D;&#x4E0A;&#x50B3;&#x5230;<code>/etc/nginx/ssl/</code>&#x4E2D;&#xFF08;&#x9700;&#x8207;nginx server block &#x8A2D;&#x7F6E;&#x5339;&#x914D;&#xFF09;&#x3002;</p><figure class="kg-card kg-image-card"><img src="https://hknoit.com/content/images/2020/04/image-5.png" class="kg-image" alt="&#x5728;NAT VPS&#x67B6;&#x8A2D;Nginx + PHP" loading="lazy"></figure><p>&#x8A2D;&#x7F6E;nginx&#x914D;&#x7F6E; <br><code>nano /etc/nginx/nginx.conf</code></p><p><code>worker_connection = 128</code></p><p>&#x8B8A;&#x66F4;html directory&#x64C1;&#x6709;&#x8005;<br><code>chown -R www-data: /var/www/example.com/html</code></p><h2 id="grav-cms">Grav CMS</h2><p>&#x5B89;&#x88DD;Grav&#x6240;&#x9700;php extension<br><code>sudo apt install php-fpm php-gd php-curl php-zip php-mbstring php-xml</code></p>]]></content:encoded></item><item><title><![CDATA[[已解決]試圖解決網站掉網問題]]></title><description><![CDATA[最近架在VPS的wordpress經常Offline，所以記錄一下試圖解決網站掉網問題。]]></description><link>https://hknoit.com/php-memory-limit/</link><guid isPermaLink="false">647c479bb7ec24000134c3d7</guid><category><![CDATA[console]]></category><category><![CDATA[php]]></category><category><![CDATA[wordpress]]></category><dc:creator><![CDATA[Ken]]></dc:creator><pubDate>Mon, 06 Apr 2020 05:31:35 GMT</pubDate><media:content url="https://hknoit.com/content/images/2020/04/undraw_wordpress_utxt.png" medium="image"/><content:encoded><![CDATA[<h2 id="-php-memory_limit-">&#x589E;&#x52A0;PHP memory_limit:</h2><img src="https://hknoit.com/content/images/2020/04/undraw_wordpress_utxt.png" alt="[&#x5DF2;&#x89E3;&#x6C7A;]&#x8A66;&#x5716;&#x89E3;&#x6C7A;&#x7DB2;&#x7AD9;&#x6389;&#x7DB2;&#x554F;&#x984C;"><p>&#x6700;&#x8FD1;&#x67B6;&#x5728;VPS&#x7684;wordpress&#x7D93;&#x5E38;Offline&#xFF0C;&#x53EF;&#x80FD;&#x8DDF;&#x904E;&#x4F4E;&#x7684;php <code>memory_limit</code>&#x6709;&#x95DC;&#xFF0C;&#x6240;&#x4EE5;&#x8A18;&#x9304;&#x4E00;&#x4E0B;&#x5728;centos8&#x589E;&#x52A0;<code>memory_limit</code>&#x7684;&#x65B9;&#x6CD5; &#xFF1A;</p><!--kg-card-begin: markdown--><ol>
<li>&#x4FEE;&#x6539;<code>wp-config.php</code>&#xFF0C;&#x6DFB;&#x52A0;<code>define( &apos;WP_MAX_MEMORY_LIMIT&apos;, &apos;256M&apos; );</code></li>
<li>&#x4FEE;&#x6539;<code>php.ini</code>&#x4E2D;&#x7684;<code>memory_limit=128M</code>&#x70BA;<code>memory_limit=256M</code>(&#x6309;&#x9700;&#x6C42;)</li>
<li>&#x91CD;&#x555F;php-fpm&#x548C;nginx:<pre><code class="language-console">sudo service nginx reload
sudo systemctl reload php-fpm
</code></pre>
</li>
</ol>
<!--kg-card-end: markdown--><p>&#x5F8C;&#x8A18;(8/4/2020)&#xFF1A;</p><p><strong>&#x7121;&#x6548;&#xFF0C;&#x7DB2;&#x7AD9;&#x4ECD;&#x6703;&#x6709;&#x6642;Offline </strong></p><h2 id="-nginx-worker_connections-">&#x8ABF;&#x6574;Nginx&#x7684;worker_connections&#x4F86;&#x89E3;&#x6C7A;&#x7DB2;&#x7AD9;&#x6389;&#x7DB2;&#x554F;&#x984C;</h2><p>&#x7D93;&#x904E;&#x4E0A;&#x6B21;&#x589E;&#x52A0;<a href="https://hknoit.com/php-memory-limit/">PHP memory_limit</a>&#x5F8C;&#xFF0C;&#x7DB2;&#x7AD9;&#x4ECD;&#x7136;&#x4E0D;&#x6642;Offline&#xFF0C;&#x70BA;&#x4E86;&#x627E;&#x51FA;&#x554F;&#x984C;&#xFF0C;&#x5B89;&#x88DD;&#x4E86;<a href="https://docs.hetrixtools.com/install-the-hetrixtools-server-monitor-agent/?ref=hknoit.com">Hetrixtools&#x7684;Monitoring Agent</a>&#x4F86;&#x76E3;&#x5BDF;VPS&#x7684;&#x8CC7;&#x6E90;&#x4F7F;&#x7528;&#xFF0C;&#x767C;&#x73FE;&#x6BCF;&#x7576;&#x6389;&#x7DB2;&#x6642;&#xFF0C;CPU&#x4F7F;&#x7528;&#x7387;&#x90FD;&#x98C6;&#x5347;&#x81F3;100%&#xFF0C;&#x904E;&#x4E00;&#x9663;&#x53C8;&#x56DE;&#x5FA9;&#x6B63;&#x5E38;&#x3002;</p><figure class="kg-card kg-image-card"><img src="https://hknoit.com/content/images/2020/04/hetrix_stats.png" class="kg-image" alt="[&#x5DF2;&#x89E3;&#x6C7A;]&#x8A66;&#x5716;&#x89E3;&#x6C7A;&#x7DB2;&#x7AD9;&#x6389;&#x7DB2;&#x554F;&#x984C;" loading="lazy"></figure><p>&#x56E0;&#x6B64;google&#x4E86;&#x8A31;&#x4E45;&#xFF0C;&#x767C;&#x73FE;&#x53EF;&#x80FD;&#x662F;Nginx&#x7684;&#x8A2D;&#x5B9A;&#x554F;&#x984C;&#xFF0C;Nginx&#x4E2D;&#x7684;<code>nginx.conf</code>&#x4E00;&#x6B04;<code>worker_connections</code>&#x8A2D;&#x5F97;&#x592A;&#x9AD8;&#xFF0C;&#x6240;&#x4EE5;&#x6709;&#x6A5F;&#x6703;&#x5728;&#x904B;&#x884C;&#x6642;&#x4F54;&#x7528;&#x4E86;&#x5168;&#x90E8;&#x7684;CPU&#x3002;&#x539F;&#x672C;&#x7684;<code>worker_connections</code>&#x88AB;&#x8A2D;&#x70BA;50000&#xFF0C;&#x76EE;&#x524D;&#x4E0B;&#x8ABF;&#x5230;1024&#xFF0C;&#x770B;&#x770B;&#x80FD;&#x5426;&#x89E3;&#x6C7A;&#x554F;&#x984C;&#x3002;</p><p>Reference: <a href="https://support.plesk.com/hc/en-us/articles/360002222493-High-CPU-usage-by-nginx-is-shown-in-Health-Monitor?ref=hknoit.com">https://support.plesk.com/hc/en-us/articles/360002222493-High-CPU-usage-by-nginx-is-shown-in-Health-Monitor</a> </p><p>&#x5F8C;&#x8A18;(9/4/2020)&#xFF1A;</p><p><strong>&#x7121;&#x6548;&#xFF0C;&#x7DB2;&#x7AD9;&#x4ECD;&#x6703;&#x6709;&#x6642;Offline </strong></p><h2 id="-php-fpm-config-">&#x4FEE;&#x6539;php-fpm&#x7684;config&#x6A94;&#x6848;</h2><ol><li><code>sudo nano php-fpm.conf</code></li><li><code>pm.max_children = 10<br>pm.start_servers = 5<br>pm.min_spare_servers = 5<br>pm.max_spare_servers = 8</code></li><li><code>sudo systemctl &#xA0;restart php-fpm.service</code> &#x91CD;&#x555F;php-fpm</li></ol><p>Reference: <a href="https://blog.gtwang.org/linux/nginx-php-fpm-configuration-optimization/?ref=hknoit.com">https://blog.gtwang.org/linux/nginx-php-fpm-configuration-optimization/</a></p><p>&#x5F8C;&#x8A18;(15/4/2020)&#xFF1A;</p><p><strong>&#x8A2D;&#x7F6E;&#x5F8C;&#x6578;&#x5929;&#xFF0C;&#x7DB2;&#x7AD9;&#x4ECD;&#x6B63;&#x5E38;&#x904B;&#x4F5C; </strong></p>]]></content:encoded></item><item><title><![CDATA[在DirectAdmin Shared hosting中查看網頁在用的真實IP Address]]></title><description><![CDATA[<p>&#x6700;&#x8FD1;&#x5728;&#x7528;Directadmin&#x677F;&#x9762;&#x7684;Shared hosting&#x67B6;&#x8A2D;&#x7DB2;&#x7AD9;&#xFF0C; &#x7531;&#x65BC;&#x53EA;&#x60F3;&#x628A;subdomain&#x639B;&#x5230;&#x8A72;&#x4F3A;&#x670D;&#x5668;&#xFF0C;&#x4E0D;&#x60F3;&#x642C;&#x9077;&#x6574;&#x500B;&#x57DF;&#x540D;&#xFF0C;&#x6240;&#x4EE5;&#x8981;&#x7528;A record&#x6307;&#x5411;&#x8A72;&#x7DB2;&#x9801;&#x4F3A;&#x670D;</p>]]></description><link>https://hknoit.com/directadmin-service-ip/</link><guid isPermaLink="false">647c479bb7ec24000134c3d6</guid><dc:creator><![CDATA[Ken]]></dc:creator><pubDate>Tue, 25 Feb 2020 11:21:12 GMT</pubDate><media:content url="https://hknoit.com/content/images/2020/02/image-2.png" medium="image"/><content:encoded><![CDATA[<img src="https://hknoit.com/content/images/2020/02/image-2.png" alt="&#x5728;DirectAdmin Shared hosting&#x4E2D;&#x67E5;&#x770B;&#x7DB2;&#x9801;&#x5728;&#x7528;&#x7684;&#x771F;&#x5BE6;IP Address"><p>&#x6700;&#x8FD1;&#x5728;&#x7528;Directadmin&#x677F;&#x9762;&#x7684;Shared hosting&#x67B6;&#x8A2D;&#x7DB2;&#x7AD9;&#xFF0C; &#x7531;&#x65BC;&#x53EA;&#x60F3;&#x628A;subdomain&#x639B;&#x5230;&#x8A72;&#x4F3A;&#x670D;&#x5668;&#xFF0C;&#x4E0D;&#x60F3;&#x642C;&#x9077;&#x6574;&#x500B;&#x57DF;&#x540D;&#xFF0C;&#x6240;&#x4EE5;&#x8981;&#x7528;A record&#x6307;&#x5411;&#x8A72;&#x7DB2;&#x9801;&#x4F3A;&#x670D;&#x5668;&#x3002;</p><p>&#x4F46;&#x662F;&#x56E0;&#x70BA;&#x670D;&#x52D9;&#x5546;&#x53EA;&#x63D0;&#x4F9B;Nameservers&#xFF0C;&#x800C;Nameservers&#x7684;IP&#x4EA6;&#x548C;&#x7DB2;&#x7AD9;&#x5728;&#x7528;&#x7684;IP&#x6709;&#x5225;&#xFF0C; &#x6240;&#x4EE5;&#x4E26;&#x4E0D;&#x80FD;&#x76F4;&#x7528;&#x63A5;<code>Ping</code>&#x6307;&#x4EE4;&#x4F86;&#x53D6;&#x5F97;IP&#x3002;</p><p>&#x60F3;&#x5728;DirectAdmin&#x4E2D;&#x53D6;&#x5F97;IP&#xFF0C;&#x53EA;&#x9700;&#x8981;&#x5230;Account Manager&#x4E2D;&#x7684;DNS Management&#x67E5;&#x770B;&#x5373;&#x53EF;&#x3002;</p><figure class="kg-card kg-image-card"><img src="https://hknoit.com/content/images/2020/02/image.png" class="kg-image" alt="&#x5728;DirectAdmin Shared hosting&#x4E2D;&#x67E5;&#x770B;&#x7DB2;&#x9801;&#x5728;&#x7528;&#x7684;&#x771F;&#x5BE6;IP Address" loading="lazy"></figure><p> &#x5728;DNS&#x5217;&#x8868;&#x4E2D;&#x57DF;&#x540D;&#x5C0D;&#x61C9;&#x7684;&#x4E00;&#x6B04;&#x4E2D;&#x7684;Value&#x5C31;&#x662F;&#x670D;&#x52D9;&#x5728;&#x7528;&#x7684;&#x771F;&#x5BE6;IP&#x3002;</p><figure class="kg-card kg-image-card"><img src="https://hknoit.com/content/images/2020/02/image-1.png" class="kg-image" alt="&#x5728;DirectAdmin Shared hosting&#x4E2D;&#x67E5;&#x770B;&#x7DB2;&#x9801;&#x5728;&#x7528;&#x7684;&#x771F;&#x5BE6;IP Address" loading="lazy"></figure>]]></content:encoded></item><item><title><![CDATA[CSS排板header及content填滿筆記]]></title><description><![CDATA[最近在設計網頁，遇到一個問題，就是如何將header以下的地方填滿，記錄解決方法。]]></description><link>https://hknoit.com/css-content-fill-parent/</link><guid isPermaLink="false">647c479bb7ec24000134c3d3</guid><dc:creator><![CDATA[Ken]]></dc:creator><pubDate>Thu, 19 Dec 2019 13:38:09 GMT</pubDate><media:content url="https://hknoit.com/content/images/2019/12/header_with_fill_parent_scroll_half_height_at_mobile-1.svg" medium="image"/><content:encoded><![CDATA[<img src="https://hknoit.com/content/images/2019/12/header_with_fill_parent_scroll_half_height_at_mobile-1.svg" alt="CSS&#x6392;&#x677F;header&#x53CA;content&#x586B;&#x6EFF;&#x7B46;&#x8A18;"><p>&#x6700;&#x8FD1;&#x5728;&#x8A2D;&#x8A08;&#x7DB2;&#x9801;&#xFF0C;&#x5728;html/css/js&#x65B9;&#x9762;&#x4ECD;&#x662F;&#x8D77;&#x6B65;&#x968E;&#x6BB5;&#xFF0C;&#x9047;&#x5230;&#x4E00;&#x500B;&#x554F;&#x984C;&#xFF0C;&#x5C31;&#x662F;&#x5982;&#x4F55;&#x5C07;header&#x4EE5;&#x4E0B;&#x7684;&#x5730;&#x65B9;&#x586B;&#x6EFF;&#x3002;</p><p>&#x9996;&#x5148;&#x8981;&#x4E00;&#x500B;&#x4E0D;&#x56FA;&#x5B9A;&#x9AD8;&#x5EA6;&#x7684;header &#xFF0C;&#x4E0B;&#x9762;&#x653E;&#x5169;&#x6B04;&#xFF0C;&#x5169;&#x6B04;&#x90FD;&#x8981;&#x586B;&#x6EFF;&#x9AD8;&#x5EA6;&#xFF0C;&#x800C;&#x4ED6;&#x5011;&#x7684;&#x5167;&#x5BB9;&#x90FD;&#x53EF;&#x80FD;&#x6703;&#x6EA2;&#x51FA;(overflow)&#xFF0C;&#x6240;&#x4EE5;&#x8981;&#x5728;&#x8A72;&#x6B04;overflow&#x6642;&#x4F7F;&#x7528;&#x6EFE;&#x52D5;(scroll)</p><p>&#x6700;&#x5F8C;&#x7D93;&#x904E;&#x4E00;&#x8F2A;google&#x3001;stack overflow&#x5F8C;&#xFF0C;&#x767C;&#x73FE;&#x8981;&#x5148;&#x8A2D;html,body,&#x5169;&#x5217;&#x7684;&#x9AD8;&#x5EA6;&#x5230;100%&#xFF0C;(header&#x9AD8;&#x5EA6;&#x4E0D;&#x7528;&#x8ABF;)&#xFF0C;&#x5C07;&#x5169;&#x6B04;&#x5957;&#x5165;&#x4E00;&#x500B;<code>div</code>&#x4E2D;&#xFF0C;&#x518D;&#x5C07;header&#x548C;&#x5167;&#x5BB9;&#x5957;&#x5165;&#x4E00;&#x500B;<code>div</code>&#x4E2D;&#xFF0C;&#x7528;<code>flex-grow</code>&#x5C07;&#x5167;&#x5BB9;&#x7684;&#x9AD8;&#x5EA6;&#x586B;&#x6EFF;&#xFF0C;&#x540C;&#x6642;<code>overflow</code>&#x8A2D;&#x70BA;<code>hidden</code>&#xFF0C;&#x5169;&#x6B04;<code>overflow</code>&#x8A2D;&#x70BA;<code>auto</code>&#xFF0C;&#x6EFF;&#x6642;&#x5C31;&#x6703;&#x81EA;&#x52D5;&#x6EA2;&#x51FA;&#x3002;</p><p>&#x793A;&#x610F;&#x5716;&#xFF1A; </p><figure class="kg-card kg-image-card"><img src="https://hknoit.com/content/images/2019/12/header_with_fill_parent_scroll_half_height_at_mobile.svg" class="kg-image" alt="CSS&#x6392;&#x677F;header&#x53CA;content&#x586B;&#x6EFF;&#x7B46;&#x8A18;" loading="lazy"></figure><p>&#x793A;&#x7BC4;code&#xFF1A;</p><figure class="kg-card kg-embed-card"><iframe id="cp_embed_WNbpvMa" src="https://codepen.io/kenhk/embed/preview/WNbpvMa?height=300&amp;slug-hash=WNbpvMa&amp;default-tabs=html,result&amp;host=https://codepen.io" title="CSS&#x6392;&#x677F;header&#x53CA;content&#x586B;&#x6EFF;&#x7B46;&#x8A18;" scrolling="no" frameborder="0" height="300" allowtransparency="true" class="cp_embed_iframe" style="width: 100%; overflow: hidden;"></iframe></figure>]]></content:encoded></item><item><title><![CDATA[Javascript的addEventListener如何傳遞參數?]]></title><description><![CDATA[關於Javascript的addEventListener傳遞參數方法。]]></description><link>https://hknoit.com/javascript-addeventlistener-passing-parameter/</link><guid isPermaLink="false">647c479bb7ec24000134c3d2</guid><category><![CDATA[Javascript]]></category><category><![CDATA[Programming]]></category><dc:creator><![CDATA[Ken]]></dc:creator><pubDate>Sun, 15 Dec 2019 06:04:55 GMT</pubDate><content:encoded><![CDATA[<p>&#x5728;&#x7DF4;&#x7FD2;javascript&#x7684;dynamic object&#x6642;&#xFF0C;&#x60F3;&#x70BA;div&#x52A0;&#x4E00;&#x500B;click event&#xFF0C;call&#x4E00;&#x500B;function&#xFF0C;&#x4F8B;&#x5982;</p><!--kg-card-begin: markdown--><pre><code class="language-javascript">var x = document.createElement(&quot;div&quot;);
x.addEventListener(&quot;click&quot;, some_function(some_parameter) );
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><pre><code class="language-javascript">some_function(y){
    alert(y);
}</code></pre>
<!--kg-card-end: markdown--><p>&#x767C;&#x73FE;&#x6703;&#x5728;&#x8F09;&#x5165;&#x6642;&#x89F8;&#x767C;&#x800C;&#x975E;&#x9EDE;&#x64CA;&#x6642;&#x89F8;&#x767C;&#xFF0C;google&#x5F8C;&#x627E;&#x5230;<a href="https://stackoverflow.com/questions/256754/how-to-pass-arguments-to-addeventlistener-listener-function?ref=hknoit.com">How to pass arguments to addEventListener listener function?</a></p><p>&#x982D;&#x5E7E;&#x500B;&#x7B54;&#x6848;&#x4E5F;&#x7528;&#x4E0D;&#x4E0A;&#xFF0C;&#x88AB;&#x63A1;&#x7D0D;&#x7684;&#x56DE;&#x7B54;&#x4E5F;&#x6709;&#x554F;&#x984C;&#x2014;&#x53EA;&#x6703;&#x5C07;loop&#x5F8C;&#x7684;&#x503C;&#x50B3;&#x5230;function&#x5167;&#xFF0C;&#x800C;&#x4E26;&#x975E;&#x5728;loop&#x904B;&#x884C;&#x6642;&#xFF0C;&#x76F4;&#x5230;&#x9019;&#x500B;&#x7B54;&#x6848;&#xFF1A;</p><blockquote> You can just bind all necessary arguments with &apos;bind&apos;:<br><code>root.addEventListener(&apos;click&apos;, myPrettyHandler.bind(null, event, arg1, ... ));</code><br>In this way you&apos;ll always get the <code>event</code>, <code>arg1</code>, and other stuff passed to <code>myPrettyHandler</code>.<br><a href="http://passy.svbtle.com/partial-application-in-javascript-using-bind?ref=hknoit.com" rel="noreferrer">http://passy.svbtle.com/partial-application-in-javascript-using-bind</a></blockquote><p>&#x539F;&#x4F86;&#x662F;&#x8981;&#x7528;Function.prototype.bind() &#xFF0C;&#x7528;&#x6CD5;&#x70BA;&#xFF1A;</p><pre><code class="language-js">function.bind(thisArg[, arg1[, arg2[, ...]]])</code></pre><blockquote><code><strong>bind()</strong></code> &#x65B9;&#x6CD5;&#xFF0C;&#x6703;&#x5EFA;&#x7ACB;&#x4E00;&#x500B;&#x65B0;&#x51FD;&#x5F0F;&#x3002;&#x8A72;&#x51FD;&#x5F0F;&#x88AB;&#x547C;&#x53EB;&#x6642;&#xFF0C;&#x6703;&#x5C07; <code>this</code> &#x95DC;&#x9375;&#x5B57;&#x8A2D;&#x70BA;&#x7D66;&#x5B9A;&#x7684;&#x53C3;&#x6578;&#xFF0C;&#x4E26;&#x5728;&#x547C;&#x53EB;&#x6642;&#xFF0C;&#x5E36;&#x6709;&#x63D0;&#x4F9B;&#x4E4B;&#x524D;&#xFF0C;&#x7D66;&#x5B9A;&#x9806;&#x5E8F;&#x7684;&#x53C3;&#x6578;&#x3002;<br>ref:<a href="https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Function/bind?ref=hknoit.com">https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Function/bind</a> </blockquote><p>&#x6700;&#x5F8C;&#x5BEB;&#x6210;&#xFF1A;</p><pre><code class="language-javascript">var x = document.createElement(&quot;div&quot;);
x.addEventListener(&quot;click&quot;, some_function.bind(null,some_parameter) );
</code></pre>]]></content:encoded></item></channel></rss>